Помощь - Поиск - Пользователи - Календарь
Полная версия: подпрограммы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
футбик
помогите разобраться пожалуйста
необходимо разделить элементы каждой строки матрицы на максимальный элемент этой строки
Оформить как подпрограммы:
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
Цитата
//обработка массива не идет
Идет, только из вызывающей программы этого не видно: содержимое массива передается в Go по значению, и меняется его локальная копия, а надо передавать по ссылке (var-параметр)... И вызывать надо
Go(a);
Ты же это сделал в процедуре output, значит, знаешь об этом... (кстати, в output можно var заменить на const, тебе же не надо менять значения массива при выводе?)
футбик
при выводе массив менять не надо, а
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
Хм... Скажи спасибо, что программа не вылетает вообще. Смотри, что ты делаешь:

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;


Как результат - избавляешься от лишнего массива в процедуре.
футбик
я прошу прощения, но получается не совсем как хочется 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
Цитата
получается не совсем как хочется
Вот... А теперь - начинается самое интересное 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), тогда ты бы сразу увидел, что у тебя происходит вылет за границу массива, и стало бы понятно, куда копать...
футбик
заработала rolleyes.gif , volvo огромное спасибо за поддержку в моих начинаниях
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.