Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2012, 23:00   #1
GaJIbI4
Пользователь
 
Регистрация: 03.10.2008
Сообщений: 77
Сообщение Проблема с сортировкой массива

Есть задача Заданы три вектора A={a1, a2, a3,}, B={b1, b2, b3}, C={c1, c2, c3}.
Вычислить и вывести на печать длины этих векторов, предварительно расставив их в порядке возрастания.
Вычисление длины вектора оформить в виде подпрограммы-функции.
Исходные данные:
A={-2.1; 3.4; 2.48; -1}; B={-0.8; 1.25; 3.1; -1.5; 0.25};
C={0.55; -1; 1.1; 2.05}.

Вот код программы, в сортировке есть ошибка не пойму что не так.

Код:
uses crt;
type vector=array [1..5] of real;
var k: byte;
x: vector;

function dlvec(y:vector):real;
var i:byte;
s:real;
begin
for i:=1 to k do
s:= s+sqr(y[i]);
dlvec:= sqrt(s);
end;

var
i:integer;
vA, vB, vC: vector;
dlA, dlB, dlC, max, Me:real;
M: array[1..3] of real;
begin
clrscr;

writeln('Введите количество координат вектора А: ');
readln(k);
writeln('Введите координаты вектора A: ');
for i:=1 to k do
readln(vA[i]);

writeln('Введите количество координат вектора B: ');
readln(k);
writeln('Введите координаты вектора B: ');
for i:=1 to k do
readln(vB[i]);

writeln('Введите количество координат вектора C: ');
readln(k);
writeln('Введите координаты вектора C: ');
for i:=1 to k do
readln(vC[i]);


dlA:=dlvec(vA);
dlB:=dlvec(vB);
dlC:=dlvec(vC);

M[1]:=dlA;
M[2]:=dlB;
M[3]:=dlC;

for i:=1 to 3 do
if M[i] > M[i+1] then
begin
Me:=M[i];
M[i]:=M[i+1];
M[i+1]:=Me;
end;

for i:=1 to 3 do
writeln(' ', M[i]:2:3);
end.
GaJIbI4 вне форума Ответить с цитированием
Старый 01.01.2012, 23:24   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
for i:=1 to 3 do
if M[i] > M[i+1] then
И как будет выполнен IF для i=3 с учетом того, что M: array[1..3]?
Код:
for i:=1 to 2 do
  for j:=i+1 to 3 do
    if M[j]<M[i] then begin
      Me:=M[i];
      M[i]:=M[j];
      M[j]:=Me;
    end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.01.2012 в 23:26.
Аватар вне форума Ответить с цитированием
Старый 01.01.2012, 23:47   #3
GaJIbI4
Пользователь
 
Регистрация: 03.10.2008
Сообщений: 77
По умолчанию

Переправил, но всёравно где то ошибка
вот что получается:
Код:
Введите количество координат вектора А: 4
Введите координаты вектора A: -2.1 3.4 2.48 -1
Введите количество координат вектора B: 5
Введите координаты вектора B: -0.8 1.25 3.1 -1.5 0.25
Введите количество координат вектора C: 4
Введите координаты вектора C: 0.55 -1 1.1 2.05
 2305843009300000000.000
 2305843009300000000.000
 2305843009300000000.000
GaJIbI4 вне форума Ответить с цитированием
Старый 02.01.2012, 00:36   #4
GaJIbI4
Пользователь
 
Регистрация: 03.10.2008
Сообщений: 77
По умолчанию

Значения вычисленных длин векторов где то теряются. Если вывести их сразу после заполнения то нормально считать начинает, однако мне нужно вывести в порядке возрастания.
GaJIbI4 вне форума Ответить с цитированием
Старый 02.01.2012, 09:14   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

для начала исправьте ошибку в функции вычисления длины вектора
Код:
function dlvec(y:vector):real;
var i:byte;
s:real;
begin
  s := 0;
  for i:=1 to k do
      s:= s+sqr(y[i]);
  dlvec:= sqrt(s);
end;
во-вторых, когда Вы вводите количество элементов в векторе - вы его сохраняете в переменной k (она используется в функции как глобальная переменная. Это очень некрасиво и неопрятно, но допустимо). И момент вычисления длины вектора переменная k она уже затёрта. И берётся количество элементов, которое было в ПОСЛЕДНЕМ векторе!

тогда уж так попробуйте:
Код:
var
  i:integer;
  vA, vB, vC: vector;
  max, Me:real;
  M: array[1..3] of real;
begin
  clrscr;
  writeln('Введите количество координат вектора А: ');
  readln(k);
  writeln('Введите координаты вектора A: ');
  for i:=1 to k do
     readln(vA[i]);
  M[1] := dlvec(vA);

  writeln('Введите количество координат вектора B: ');
  readln(k);
  writeln('Введите координаты вектора B: ');
  for i:=1 to k do
     readln(vB[i]);
  M[2] := dlvec(vB);

  writeln('Введите количество координат вектора C: ');
  readln(k);
  writeln('Введите координаты вектора C: ');
  for i:=1 to k do
      readln(vC[i]);
  M[3]:=dlvec(vB);

....

хотя бы я лучше 1) завёл отдельные переменные для хранения количества элементов в каждом векторе
2) изменил функцию вычисления длины - добавил в неё ещё один параметер - количество элементов в векторе и передавал туда переменную (которую завёл в п.1) )
3) при вводе k проверял его на корректность (в вашем случае K должно быть больше/равно 1 и меньше/равно 5 )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.01.2012, 13:34   #6
GaJIbI4
Пользователь
 
Регистрация: 03.10.2008
Сообщений: 77
По умолчанию

Спасибо, вроде работает, только вот я сомневаюсь что длины векторов правильно считает(проверял считал на калькуляторе небольшое расхождение), я думаю это из за глобальной переменной k.
Попробовал сделать как Вы советовали, завёл для каждого вектора отдельную переменную. Вот переделанный код, если я правильно вас понял:
Код:
uses crt;
type vector=array[1..5] of real;



function dlvec(y:vector;k:integer):real;
var i:integer;
s:real;
begin
s:=0;
for i:=1 to k do
s:=s+sqr(y[i]);
dlvec:=sqrt(s);
end;


var
i,j,k,k1,k2,k3:integer;
vA, vB, vC: vector;
max, Me:real;
M:array[1..3] of real;

begin
clrscr;

write('Введите количество координат вектора А: ');
read(k1);
write('Введите координаты вектора A: ');
for i:=1 to k1 do
read(vA[i]);
M[1]:=dlvec(vA,k1);

write('Введите количество координат вектора B: ');
read(k2);
write('Введите координаты вектора B: ');
for i:=1 to k2 do
read(vB[i]);
M[2]:=dlvec(vB,k2);

write('Введите количество координат вектора C: ');
read(k3);
write('Введите координаты вектора C: ');
for i:=1 to k3 do
read(vC[i]);
M[3]:=dlvec(vC,k3);

for i:=1 to 2 do
for j:=i+1 to 3 do
if M[j]<M[i] then
begin
Me:=M[i];
M[i]:=M[j];
M[j]:=Me;
end;

write('Длины векторов: ');
for i:=1 to 3 do
write(' ',M[i]:2:4);
end.
и вот результат:

Введите количество координат вектора А: 4
Введите координаты вектора A: -2.1 3.4 2.48 -1
Введите количество координат вектора B: 5
Введите координаты вектора B: -0.8 1.25 3.1 -1.5 0.25
Введите количество координат вектора C: 4
Введите координаты вектора C: 0.55 -1 1.1 2.05
Длины векторов: 2.5913 3.7583 4.8084
если считать на калькуляторе получается: 2.5956, 3.8324, 4.786
Возможно что такая разница получилась из за разной погрешности в подсчёте паскаля и калькулятора?

Последний раз редактировалось GaJIbI4; 02.01.2012 в 13:42.
GaJIbI4 вне форума Ответить с цитированием
Старый 03.01.2012, 01:53   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
если считать на калькуляторе получается: 2.5956, 3.8324, 4.786
дружеский совет - выкиньте калькулятор

для вектора A:
-2.1 3.4 2.48 -1
считаем:
(-2.1)^2 + 3.4^2 + 2.48^2 + (-1)^2 =
4.41 + 11.56 + 6.1504 + 1 = 23.1204
берём корень, получаем 4.80836770640515803
как видим, полученный в паскаль результат 4.8084 весьма близок (ближе, чем тот, что выдал Вам ваш калькулятор...)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.01.2012, 02:05   #8
GaJIbI4
Пользователь
 
Регистрация: 03.10.2008
Сообщений: 77
По умолчанию

ясно, спасибо=)
GaJIbI4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача с сортировкой массива, java dungle Помощь студентам 0 17.12.2011 16:40
Проблема с сортировкой matbe14 Помощь студентам 0 29.09.2011 11:16
Проблема с сортировкой Anubys Помощь студентам 0 19.04.2011 17:10
Просьба помочь с сортировкой массива по убыванию Ветас Помощь студентам 6 11.11.2009 16:30
сортировка массива Методом Хоара (быстрой сортировкой) wild-weight Паскаль, Turbo Pascal, PascalABC.NET 3 26.09.2009 16:46