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

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

Форум «Всё о Паскале» _ Задачи _ Исправить процедуру

Автор: }0pa 7.10.2006 13:18

Дана вот такая процедура, вычисляющая сумму положительных элементов каждой строки. Но необходимо избавиться от write(...) в этой процедуре.

Код
procedure summa (mx:PDynMatrix;c1:integer;c2:integer);
  var i,j, s:integer;
  begin
    for i:=1 to c1 do begin
    s:=0;
     writeln;
     for j:=1 to c2 do begin
      if  mx^[I]^[J]>0 then
       s:=s+mx^[I]^[J]
     end;
     write('Matrica А :summa polozhitelnih elementov ',i,'-oy stroki = ',s);
  end;
  writeln;
end;

А вывести нужно в самой основной программе для любой дин.матрицы.
что-то вроде
Код
procedure summa (mx:PDynMatrix;c1:integer;c2:integer;s:integer);
begin
.....
.....
....
end;
  begin
  summa(A,n,m,s1);
  write(s1);
  end.

Но так как там сумма динамическая, у меня возникли некоторые проблемы

Автор: мисс_граффити 7.10.2006 14:09

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

Автор: }0pa 12.10.2006 14:03

Я не могу понять, как это организовать нужно. Сумма динамическая. Нужно делать два цикла и процедуре и в основной программе? Помогите плиз. очень надо

Автор: volvo 12.10.2006 17:02

Цитата
Сумма динамическая
Поясни... Что в твоем понимании динамическая сумма?

Вообще-то это извращение, делать подпрограмму, которая должна вернуть результат, процедурой. Функции в Паскале - не для красоты, кстати... Но если так нужно -

procedure summa (mx:PDynMatrix;c1:integer;c2:integer;VAR s:integer);
begin
...
end;

Автор: }0pa 12.10.2006 22:29

Я понимаю, что немного некорректно выразился...В общем, эта процедура вычисляет сумму элементов каждой строки матрицы. Т.е. понятно, что нужно будет вызывать ее в цикле. Неужели в этом случае нельзя обойтись без циклов в каком-то месте (в подпрограмме или в осн.программе)?

Цитата
Вообще-то это извращение, делать подпрограмму, которая должна вернуть результат, процедурой. Функции в Паскале - не для красоты, кстати... Но если так нужно -
Я с тобой полностью согласен, но задание требует это "извращение".
Хотя, если получится с функцией, то фиг с ним.

Автор: volvo 12.10.2006 22:43

Цитата
Т.е. понятно, что нужно будет вызывать ее в цикле
Это с чего ты решил?
Цитата
Неужели в этом случае нельзя обойтись без циклов в каком-то месте
Все можно...

procedure summa(mx: PDynMatrix; c1, c2: integer; var s: array of integer);
var i, j: integer;
begin
for i:=1 to c1 do begin
s[pred(i)] := 0;
for j := 1 to c2 do
if mx^[I]^[J]>0 then s[pred(i)]:=s[pred(i)]+mx^[I]^[J]
end;
end;

var
vec: array[1 .. 10] of integer;
begin
...
summa(a, n, m, vec);
{ Цикл - не для вычисления, а только чтобы распечатать результаты }
for i := 1 to n do
writeln('Сумма положительных элементов ', i, '-ой строки = ', vec[i]);
...
end.

Автор: }0pa 13.10.2006 3:36

Весьма благодарен... good.gif

Автор: Malice 13.10.2006 12:49

...
vec: array[1 .. 10] of integer;
for i:=1 to c1 do begin
s[pred(i)] := 0;
...
Неверное так не надо.

Автор: volvo 13.10.2006 13:24

Malice, ты с открытыми массивами встречался? Индексация ВСЕГДА с нуля, им по барабану, как описана сама переменная... Хоть так:

Var
vec: array[-100 .. 199] of Integer;

хоть так
Var
vec: array[100 .. 400] of Integer;

- обращаться в процедуре все равно надо от 0 до 299...

Автор: Malice 13.10.2006 14:23

Неа, не встречался, поэтому "наверное" и написал.