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

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

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

Автор: футбик 17.10.2008 19:30

помогите разобраться пожалуйста
необходимо разделить элементы каждой строки матрицы на максимальный элемент этой строки
Оформить как подпрограммы:
1. ввод двумерного массива
2. алгоритм обработки массива
3. Вывод двумерного массива на экран
Все процедуры должны иметь параметры.

type matrix=array[1..7,1..7] of real;
var
i,j,n,m:integer;

Procedure input( var a:matrix); //ввод массива
begin
writeln('введите число строк и столбцов массива:');
read(n,m);
writeln('введите элементы массива: ');
for i:=1 to n do
for j:=1 to m do
begin
read(a[i,j]);
end;
end;

Procedure go ( a:matrix); //обработка
var
i,j,n,m:integer;
amax:array[1..7] of real;
c:real;
begin
for i:=1 to n do
begin //обработка массива не идет
c:=a[i,1];
for j:=1 to m do
if amax[i]>c then amax[i]:=c;
if amax[i]<>0 then a[i,j]:=a[i,j]/amax[i];
end;
end;

Procedure output ( var a:matrix); //вывод
begin
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]);
writeln;
end;
end;
var a:matrix;

begin
input(a);
go; // пишет неверное количество фактических параметров (
output(a);
end.





Автор: volvo 17.10.2008 19:46

Цитата
//обработка массива не идет
Идет, только из вызывающей программы этого не видно: содержимое массива передается в Go по значению, и меняется его локальная копия, а надо передавать по ссылке (var-параметр)... И вызывать надо
Go(a);
Ты же это сделал в процедуре output, значит, знаешь об этом... (кстати, в output можно var заменить на const, тебе же не надо менять значения массива при выводе?)

Автор: футбик 17.10.2008 21:22

при выводе массив менять не надо, а

Procedure go
всеровно работает не правильно, точнее вообще ни как, массив на входе и на выходе одинаковый. Это правильно?:
Procedure go ( var a:matrix);
var
i,j,n,m:integer;
amax:array[1..7] of real;
c:real;
begin
for i:=1 to n do
begin
c:=a[i,1];
for j:=1 to m do
if amax[i]>c then amax[i]:=c;
if amax[i]<>0 then a[i,j]:=a[i,j]/amax[i];
end;
end;

эта процедура должна разделять элементы каждой строки матрицы на максимальный элемент этой строки.
спасибо

Автор: volvo 17.10.2008 21:43

Хм... Скажи спасибо, что программа не вылетает вообще. Смотри, что ты делаешь:

Procedure go (var a:matrix);
var
i,j,n,m:integer;
amax:array[1..7] of real;
c:real;
begin
for i:=1 to n do { <--- идешь по всем строкам... Допустим... }
begin
{
Запомнил первый элемент, наверное для того, чтобы с ним сравнивать
остальные...
}
c:=a[i,1];

for j:=1 to m do
{
Но что с чем сравниваешь? Массив amax вообще неинициализирован.
Что там хранится сейчас? Мусор...
}
if amax[i]>c then amax[i]:=c;

if amax[i]<>0 then a[i,j]:=a[i,j]/amax[i];
end;
end;


А теперь - что надо делать:
Procedure Go(var a: matrix);
{ тут переменные }
begin
for i := 1 to n do begin { Пока все то же - идем по строкам... }

{ В каждой строке делаем: }
max := a[i, 1];
for j := 2 to m do begin
{ Здесь сравниваешь A[i, j] с max и ... Ну, дальше ты знаешь, что делать... }
end;

{
Когда пришли сюда, в Max уже хранится макс. элемент текущей строки...
Запускаешь еще один цикл по J, в котором делишь все элементы строки на Max
(не забудь предотвращать деление на 0)
}
end;
end;


Как результат - избавляешься от лишнего массива в процедуре.

Автор: футбик 18.10.2008 17:55

я прошу прощения, но получается не совсем как хочется smile.gif :

Procedure go (var a:matrix);
var
i,j,n,m:integer;
amax:real;
begin
for i:=1 to n do //перебираю строки
begin
amax := a[i, 1]; //1й элемент в каждой строке максимальный
for j:=2 to m do //перебираю столбцы, с 2го
begin
if a[i,j]>amax then amax:=a[i,j];//сравниваю 1й элемент строки с остальными и присваиваю значение amax = максимальное
end;
for j:=1 to m do
begin
if amax<>0 then a[i,j]:=(a[i,j]/amax); //делю каждый элемент строки на макс. значение этой строки
end;
end;
end; //не работает))



выводит входной массив, подскажите пожалуйста

Автор: volvo 18.10.2008 18:16

Цитата
получается не совсем как хочется
Вот... А теперь - начинается самое интересное smile.gif

Ты знаешь, что выведет вот эта программа:

var n: integer;

procedure print_n;
var n: integer;
begin
writeln(n);
end;

begin
n := 10;
end.

?
Даже не думай, что 10... Локальная переменная (N, описанная в процедуре) "заслоняет" собой глобальную, и все обращения к N внутри процедуры однозначно трактуются компилятором, как работа с ЛОКАЛЬНОЙ переменной... А содержимое ее совсем не равно содержимому глобальной N, описанной в первой строке программы...

У тебя то же самое... Убери из списка переменных, описанных в процедуре Go, эти самые N и M, и все заработает...

И (на будущее) отлаживай программы в режиме "контроля границ" (Options -> Compiler -> установить галку на Range Checking), тогда ты бы сразу увидел, что у тебя происходит вылет за границу массива, и стало бы понятно, куда копать...

Автор: футбик 18.10.2008 22:37

заработала rolleyes.gif , volvo огромное спасибо за поддержку в моих начинаниях