Бумер Posted November 8, 2006 Report Share Posted November 8, 2006 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 по возрастанию (сверху самая большая (по сумме элементов) строка.) Link to comment Share on other sites More sharing options...
Тролль Posted November 8, 2006 Report Share Posted November 8, 2006 Бумер: Я застрял уже на заголовке первой твоей процедуры. Видимо, и компилятор Паскаля тоже. На 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. При желании любой оператор программы можно оформить как процедуру ;) Link to comment Share on other sites More sharing options...
Бумер Posted November 9, 2006 Author Report Share Posted November 9, 2006 Нет, нет нужно обязательно использовать процедуры. после того как написал это сообщение, прочитал лекцию о процедурах и понял что я - долбо**. Думал что я крутой и все понял. Теперь когда будет время перепишу... если конечно можете, то напишите свой код оформления одной из процедур(для проверки). Link to comment Share on other sites More sharing options...
Тролль Posted November 9, 2006 Report Share Posted November 9, 2006 Бумер: Лекции нужны в основном для того, чтобы понять, что проходили и что об этом думает преподаватель. Учить надо по книгам. Книги надо подбирать самому - что нравится одному, то не нравится другому, но лучше справочного характера и не "для чайников". Вот для примера я набил пример процедурами: для ввода и вывода данных, для подсчета суммы элементов строки матрицы и для сортировки 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. Разбивать на процедуры и решать, что им передавать в списке параметров, а что оставить внешними переменными, можно, конечно, по-разному, так что твой вариант может сильно отличаться от моего. Link to comment Share on other sites More sharing options...
Бумер Posted November 12, 2006 Author Report Share Posted November 12, 2006 Тролль, я вот не врублюсь Procedure Sort; procedure Input procedure Output; - как эти процедуры будут передавать результат своей работы в основную программу? Они же должны использовать параметры-переменнные, верно? Link to comment Share on other sites More sharing options...
Тролль Posted November 12, 2006 Report Share Posted November 12, 2006 Бумер: Они же должны использовать параметры-переменнные, верно?Нет. Процедура может без каких-либо проблем использовать константы, переменные и типы данных, определенные вне процедуры. В том числе и менять значения внешних переменных. Важно только, чтобы они были описаны до определения процедуры, потому что компилятор просматривает текст программы последовательно. А вот внутренние (объявленные внутри процедуры) переменные процедуры вне ее не видны. В примере у меня процедуры Input и т.п. не использовали за ненадобностью аппарат формальных-фактических параметров, потому что работали всегда с одними и теми же внешними переменными (тем более что "всегда" в данном случае означает один раз :( ), а вот в процедуре SumStr был смысл его использовать, потому что она вызывается пять раз для работы с разными строками и элементами массива сумм строк. Но и там константа n и тип P - внешние. Link to comment Share on other sites More sharing options...
Delphi Posted November 14, 2006 Report Share Posted November 14, 2006 Может я конешно что-то с ответов не понял но всетаки у меня возник вопрос к автору вы пишете 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 это глобальный масив зачем его заново в каждой процедуре обявлять Link to comment Share on other sites More sharing options...
Recommended Posts