Перейти к содержанию
СофтФорум - всё о компьютерах и не только

процедуры


Рекомендуемые сообщения

program lab_6;const n=5;var i,j:integer; a:array [1..n,1..n] of integer; s:array[1..n] of integer;procedure input (var i,j:integer; a[1..n,1..n]:array of integer; const n);beginwriteln ('wwedite massiv');for i:=1 to n do for j:=1 to n do  read (a[i,j]);writeln;writeln ('ishonii massiv:');for i:=1 to n do for j:=1 to n do begin write (' ',a[i,j]); if j=n then writeln;end;end;procedure summi_strok (var i,j:integer; a:array [1..n,1..n] of integer; s:array[1..n] of integer; const n=5);beginfor i:=1 to n do for j:=1 to n do s[i]:=s[i]+a[i,j];end;procedure sort_strok (var s:array[1..n] of integer; a:array[1..n,1..n] of integer; t,s,k,i,j:integer; const n=5);beginconst n=5;var a:array[1..n,1..n] of integer;s:array[1..n] of integer; i,j,c,k,t:integer;beginfor k:= 1 to n dofor c:=(k+1) to n doif s[k]<s[c] then	BEGIN	t:=s[k];s[k]:=s[c];s[c]:=t;	for j:=1 to n do begin	t:=a[k,j];a[k,j]:=a[c,j];a[c,j]:=t; end;	END;end;procedure output (a:array [1..n,1..n] of integer; i,j:integer; const n=5);begin writeln ('konechnii massiv:');for i:=1 to n do for j:=1 to n do begin write (' ',a[i,j]); if j=n then writeln;end; readln;end;begininput(i,j,a,n);summi_strok;sort_strok;output;end.

Вот собст-но прога. если убрать процедуры все пашет как надо. На процедуры паскаль ругается (конкретно в первой процедуре на переменную i цикла for! Не врубаюсь в чем дело. Может растолкуете, а за одно и ошибки в проге найдете.

Да, чуть не забыл: прога упорядочивает строки кв. матрицы порядка 5 по возрастанию (сверху самая большая (по сумме элементов) строка.)

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Я застрял уже на заголовке первой твоей процедуры. Видимо, и компилятор Паскаля тоже. На i компилятору Паскаля ругаться нечего, правда, она в заголовке процедуры вообще по недоразумению, ей как параметру цикла следует быть объявленной в разделе объявлений процедуры, но компилятор это переварит, хотя и с жутко неоптимальным кодом. Ругаться компилятор должен на массив a, который конструируется прямо в заголовке процедуры, чего не допускается. Да если бы и допускалось, толка с него не было бы, поскольку он погиб бы вместе со всеми своими элементами в момент выхода из процедуры. А тип n вообще не указан.

Такое впечатление, что ты о процедурах ничего не читал. Заголовки процедур и объявления переменных - разные вещи, частично похожие, правда, но только частично.

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

Так или иначе, привожу программу. При вводе числа каждой строки массива разделяются между собой пробелами, переход к вводу новой строки - по Enter.

const n=5;type P=array[1..n] of Integer;var a:array[1..n] of P; s,t:P; i,j,k:Integer;beginfor i:=1 to n do for j:=1 to n do Read(a[i,j]);for i:=1 to n do begin s[i]:=0; for j:=1 to n do s [i]:=s[i]+a[i,j] end;for i:=1 to n do for j:=1 to n-i do if s[j]>s[j+1] thenbegin t:=a[j];a[j]:=a[j+1];a[j+1]:=t; k:=s[j];s[j]:=s[j+1];s[j+1]:=k end;writeln;for i:=1 to n do begin for j:=1 to n do Write(a[i,j],' '); WriteLn end;end.

При желании любой оператор программы можно оформить как процедуру ;)

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Лекции нужны в основном для того, чтобы понять, что проходили и что об этом думает преподаватель. Учить надо по книгам. Книги надо подбирать самому - что нравится одному, то не нравится другому, но лучше справочного характера и не "для чайников".

Вот для примера я набил пример процедурами: для ввода и вывода данных, для подсчета суммы элементов строки матрицы и для сортировки

const n=5;type P=array[1..n] of Integer;var a:array[1..n] of P; s:P; i:Integer;procedure Input;var i,j:Integer; begin for i:=1 to n do for j:=1 to n do Read(a[i,j]) end;procedure Output;var i,j:Integer; begin WriteLn; for i:=1 to n do begin for j:=1 to n do Write(a[i,j],' '); WriteLn end end;procedure SumStr(var m:Integer; l:P); var j:Integer; begin m:=0; for j:=1 to n do m:=m+l[j] end;Procedure Sort; var i,j,k:Integer; t:P; begin for i:=1 to n do for j:=1 to n-i do if s[j]>s[j+1] thenbegin t:=a[j];a[j]:=a[j+1];a[j+1]:=t; k:=s[j];s[j]:=s[j+1];s[j+1]:=k end end;beginInput;for i:=1 to n do SumStr(s[i], a[i]);Sort;Output;end.

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

Ссылка на комментарий
Поделиться на другие сайты

Тролль, я вот не врублюсь Procedure Sort; procedure Input procedure Output; - как эти процедуры будут передавать результат своей работы в основную программу? Они же должны использовать параметры-переменнные, верно?

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Они же должны использовать параметры-переменнные, верно?
Нет. Процедура может без каких-либо проблем использовать константы, переменные и типы данных, определенные вне процедуры. В том числе и менять значения внешних переменных. Важно только, чтобы они были описаны до определения процедуры, потому что компилятор просматривает текст программы последовательно. А вот внутренние (объявленные внутри процедуры) переменные процедуры вне ее не видны.

В примере у меня процедуры Input и т.п. не использовали за ненадобностью аппарат формальных-фактических параметров, потому что работали всегда с одними и теми же внешними переменными (тем более что "всегда" в данном случае означает один раз :( ), а вот в процедуре SumStr был смысл его использовать, потому что она вызывается пять раз для работы с разными строками и элементами массива сумм строк. Но и там константа n и тип P - внешние.

Ссылка на комментарий
Поделиться на другие сайты

Может я конешно что-то с ответов не понял но всетаки у меня возник вопрос к автору

вы пишете

const n

var i,j:integer; a:array [1..n,1..n] of integer; s:array[1..n] of integer;

procedure input (var i,j:integer; a[1..n,1..n]:array of integer; const n);

не легче написать

const n

var i,j:integer; a:array [1..n,1..n] of integer; s:array[1..n] of integer;

procedure input ;

begin

действия

end;

как я понимаю у тебя всеравно a это глобальный масив зачем его заново в каждой процедуре обявлять :bye1:

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...