Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ код даВинчи)

Автор: Elmo 18.03.2007 0:47

Пожалуйста, помогите выправить программу. Вроде бы должна нормально работать, но в конце выводит что-то несуразное.
Условие таково:
Задание: ввести два вектора A(n) и B(n), определить новый вектор Z как Z=A*+B*, где "*" означает, что все компоненты этого вектора получены из исходного путём деления на максимальную компоненту этого вектора (производится нормировка). При решении использоватьпроцедуры и функции.
А вот код:


program lab;
uses crt;
type mas=array[1..50] of real;
var
z,x,y:mas;
n:byte;

procedure input(var a:mas;m:byte;c:char);
var i:integer;
begin
for i:=1 to m do
begin
write(c,'[',i,']=');
read(a[i])
end
end;

function max(var a:mas;m:byte):real;
var j:integer;
d:real;
begin
a[1]:=d;
for j:=2 to m do
begin
if a[j]>d then a[j]:=d;
max:=d;
end;
end;

procedure norm(var a:mas;m:byte);
var j:integer;
begin
for j:=1 to m do
a[j]:=a[j]/max(a,m);
end;

procedure sum(var c:mas;a,b:mas;m:byte);
var j:integer;
begin
for j:=1 to m do
c[j]:=a[j]+b[j];
end;
procedure print(a:mas;m:byte;c:char);
var
j:integer;
begin
for j:=1 to m do
write(z[j]:6:2);
end;
begin
clrscr;
write('n=');
read(n);
input(x,n,'x');
input(y,n,'y');
norm(x,n);
norm(y,n);
sum(z,x,y,n);
print(z,n,'z');
end.




Автор: мисс_граффити 18.03.2007 0:52

function max(var a:mas;m:byte):real;
var j:integer;
d:real;
begin
a[1]:=d; //???
for j:=2 to m do
begin
if a[j]>d then a[j]:=d; //???
max:=d;
end;
end;

Что делают строчки, помеченные "???"?
Зачем менять элемент массива на неизвестно что?

procedure norm(var a:mas;m:byte);
var j:integer;
begin
for j:=1 to m do
a[j]:=a[j]/max(a,m); //делиться будет каждый раз на новое число... а надо - чтобы на одно и то же
end;

Автор: Elmo 18.03.2007 1:00

Цитата(мисс_граффити @ 17.03.2007 20:52) *

function max(var a:mas;m:byte):real;
var j:integer;
d:real;
begin
a[1]:=d; //???
for j:=2 to m do
begin
if a[j]>d then a[j]:=d; //???
max:=d;
end;
end;

Что делают строчки, помеченные "???"?
Зачем менять элемент массива на неизвестно что?

procedure norm(var a:mas;m:byte);
var j:integer;
begin
for j:=1 to m do
a[j]:=a[j]/max(a,m); //делиться будет каждый раз на новое число... а надо - чтобы на одно и то же
end;


В этой функции находится максимальный элемент матрицы.
Лабу взял у однокурсника)), поэтому не все строчки понятны мне самому

Автор: volvo 18.03.2007 1:05

function max(var a:mas;m:byte):real;
var
j:integer;
d:real;
begin
d := a[1]; { вместо a[1]:=d; }
for j:=2 to m do
begin
if a[j]>d then d := a[j]; { <--- вместо a[j] := d; }
end;
max:=d; { <--- на одну строку ниже, чем было }
end;

Должно работать нормально ...

Автор: Elmo 18.03.2007 1:13

Цитата(volvo @ 17.03.2007 21:05) *

function max(var a:mas;m:byte):real;
var
j:integer;
d:real;
begin
d := a[1]; { вместо a[1]:=d; }
for j:=2 to m do
begin
if a[j]>d then d := a[j]; { <--- вместо a[j] := d; }
end;
max:=d; { <--- на одну строку ниже, чем было }
end;

Должно работать нормально ...

В конце выводит матрицу, все элементы которой равны 2.00, не зависимо от того, что вводим вначале

Автор: мисс_граффити 18.03.2007 1:20

Цитата
В этой функции находится максимальный элемент матрицы.

в таком виде - не находится.
Цитата
Лабу взял у однокурсника)), поэтому не все строчки понятны мне самому

тогда и вопросы - к нему. места с ошибкой я тебе выделила. половину volvo исправил. тебе осталось исправить одну ошибку - вот и подумай, почему она возникает и как от нее избавиться.

Автор: Elmo 18.03.2007 1:22

Спасибо всем за помощь, теперь , думаю, и сам справлюсь