дан двумерный массив, вывести ту строку, сумма модулей элементов в которой максимальна. использовать процедуры.
я не соображу, как собственно вывести строку
и еще... при компиляции появляется ошибка 36 ( отсутствие begin), не знаю, где его пропустила
uses crt; const n=2; m=5; type vect=array[1..n] of real; matr=array[1..m] of vect; procedure input(var a:matr); var i,j:byte; begin writeln ('vvedite elementi dvymernogo massiva'); for i:=1 to n do for j:=1 to n do read (a[i,j]); end; procedure stroka(a:matr; var:s,s1); i,j:byte; max:real; begin for i:=1 to n do for j:=1 to m do begin s:=0; s:=s+abs(a[1,j]; max:=s; s1:=s1+abs(a[2,j]); if max<s1 then writeln ('nyshai stroka:2'); else writeln ('nysnai stroka :1'); writeln ('s=',s:4:1); writeln ('s1=',s1:4:1); end; end; var a:matr; begin input(a); storka(a,s,s1); readkey; end.
volvo
13.11.2006 20:47
У тебя не только Begin пропущен... Внимательно смотри на исправления (программа только проходит компиляцию, о правильности работы сказать ничего пока не могу)...
Цитата
uses crt; const n=2; m=5; type vect=array[1..n] of real; matr=array[1..m] of vect; procedure input(var a:matr); var i,j:byte; begin writeln ('vvedite elementi dvymernogo massiva'); for i:=1 to n do for j:=1 to n do read (a[i,j]); end; procedure stroka(a:matr; var s,s1: real); var i,j:byte; max:real; begin for i:=1 to n do for j:=1 to m do begin s:=0; s:=s+abs(a[1,j]); max:=s; s1:=s1+abs(a[2,j]); if max<s1 then writeln ('nyshai stroka:2'){;} else writeln ('nysnai stroka :1'); writeln ('s=',s:4:1); writeln ('s1=',s1:4:1); end; end;
var a:matr; s, s1: real; begin input(a); stroka(a,s,s1); readkey; end.
Цитата - из-за оформления цветом...
18192123
14.11.2006 0:41
Цитата(volvo @ 13.11.2006 16:47)
У тебя не только Begin пропущен... Внимательно смотри на исправления (программа только проходит компиляцию, о правильности работы сказать ничего пока не могу)... Цитата - из-за оформления цветом...
компиляция проходит успешно, но после того, как я ввожу первую строку массива, сразу прога выдает значения суммы...
klem4
14.11.2006 0:46
Компиляция чего проходит успешно ? Приведенный тобой код НЕ компилируется. С исправлениями volvo - компилируется, ты используешь его ? Гадалка заболела !
18192123
14.11.2006 1:35
Цитата(klem4 @ 13.11.2006 20:46)
Компиляция чего проходит успешно ? Приведенный тобой код НЕ компилируется. С исправлениями volvo - компилируется, ты используешь его ? Гадалка заболела !
да, я использую вариант volvo
Гость
14.11.2006 1:53
Ты вводишь матрицу n*n =4 а надо m*n =10
klem4
14.11.2006 1:56
Гость, ты о чем ?
18192123, вот смотри, разбирайся
uses crt;
const n = 2; m = 3;
type Tmx = array [1..n, 1..m] of Integer;
procedure Input(var mx: TMx); var i, j: Integer; begin for i := 1 to n do for j := 1 to m do begin write('mx[', i, ',', j, ']='); readln(mx[i, j]); end; end;
procedure Print(const mx: TMx); var i, j: Integer; begin for i := 1 to n do begin writeln; for j := 1 to m do write(mx[i, j] : 3); end; writeln; end;
function Sum(const mx: TMx; row: Integer): Integer; var i, S: Integer; begin S := 0; for i := 1 to m do S := S + abs(mx[row, i]); Sum := S; end;
procedure Main(const mx: TMx; var maxN, value: Integer); var i, s: Integer; begin
maxN := 0;
for i := 1 to n do begin s := Sum(mx, i); if (maxN = 0) or (s > value) then begin maxN := i; value := s; end; end;
if (maxN = 0) or (maxN > 0) and (s > value) then begin
klem4
14.11.2006 2:07
Гость, онаже Pola А если подумать ?
Гость
14.11.2006 2:17
Цитата
if s >= value then begin
и саму строку вывести в конце проги можно
Цитата
дан двумерный массив, вывести ту строку, ...
klem4
14.11.2006 2:19
Более чем уверен, что имлось в виду вывести номер строки, что я сделал.
18192123
14.11.2006 3:14
Цитата(klem4 @ 13.11.2006 22:19)
Более чем уверен, что имлось в виду вывести номер строки, что я сделал.
в условии сказано: вывести строку[size=2]
Я надеюсь хотябы это ты сама сможешь сделать ? klem4
18192123
14.11.2006 3:29
Цитата(klem4 @ 13.11.2006 21:56)
Гость, ты о чем ?
18192123, вот смотри, разбирайся
uses crt;
const n = 2; m = 3;
type Tmx = array [1..n, 1..m] of Integer;
procedure Input(var mx: TMx); var i, j: Integer; begin for i := 1 to n do for j := 1 to m do begin write('mx[', i, ',', j, ']='); readln(mx[i, j]); end; end;
procedure Print(const mx: TMx); var i, j: Integer; begin for i := 1 to n do begin writeln; for j := 1 to m do write(mx[i, j] : 3); end; writeln; end;
function Sum(const mx: TMx; row: Integer): Integer; var i: Integer; begin Sum := 0; for i := 1 to m do Sum := Sum + abs(mx[row, i]); end;
procedure Main(const mx: TMx; var maxN, value: Integer); var i, s: Integer; begin
maxN := 0;
for i := 1 to n do begin s := Sum(mx, i); if (maxN = 0) or (s > value) then begin maxN := i; value := s; end; end;
что-то твоя программа не компилируется, появляется сообщение, что в процедуре сумма пропущена скобка
????????????????
Гость
14.11.2006 13:24
У тебя какая версия Паскаля? может это на const в списке формальных параметров такая реакция? тогда поставь var
klem4
14.11.2006 14:06
Цитата
может это на const в списке формальных параметров такая реакция? тогда поставь var
Const как раз ставится для того, чтобы исключить возможность изменения данных, но при этом передавать их не по значению, а по сссылке. Ну а если var поставить, то все наоброт будет, мы еще и увеличим эту возможность.
Так что рпосто попрбуй убрать const (в заголовках подпрограмм) и все.
volvo
14.11.2006 15:29
klem4:
function Sum(const mx: TMx; row: Integer): Integer; var i: Integer; begin Sum := 0; for i := 1 to m do Sum {Это - обращение к результату функции, здесь проблем нет } := Sum {А Это? С точки зрения компилятора - рекурсия, только тогда не хватает скобки, ибо ожидаются параметры} + abs(mx[row, i]); end;
Теперь понятнее?
Цитата
Const как раз ставится для того, чтобы исключить возможность изменения данных
Ты уверен, что данные, переданные со спецификатором Const нельзя изменить? Я бы сказал, Const ставится как защита от СЛУЧАЙНОГО изменения данных ...
klem4
14.11.2006 15:38
Sum исправил. По поводу const это и имел в виду
Цитата
Const ставится как защита от СЛУЧАЙНОГО изменения данных
неправильно выразился.
18192123
14.11.2006 19:52
Цитата(klem4 @ 13.11.2006 21:56)
18192123, вот смотри, разбирайся
объясни пожалуйста, что такое Row
klem4
14.11.2006 22:34
function Sum(const mx: TMx; row: Integer): Integer;
Функция возвращает значение суммы модулей элементов строки ROW матрицы MX.
18192123
15.11.2006 2:34
Цитата(klem4 @ 14.11.2006 18:34)
function Sum(const mx: TMx; row: Integer): Integer;
Функция возвращает значение суммы модулей элементов строки ROW матрицы MX.
а откуда мы берем этот параметр (ROW), мы ведь его не где не задаем
мисс_граффити
15.11.2006 2:41
это формальный параметр. вместо него при вызоые подставляется фактический - i.
18192123
15.11.2006 2:55
Цитата(мисс_граффити @ 14.11.2006 22:41)
это формальный параметр. вместо него при вызоые подставляется фактический - i.
большое спасибо!
18192123
15.11.2006 22:08
Цитата(18192123 @ 14.11.2006 22:55)
большое спасибо!
а у меня тут еще один вариант "родился", только, по-моему, где-то напутала с формальными и фактическими параметрами, т.к. программа не идет дальше вывода исходной матрицы...
program zach_6; uses crt;
const n = 2; m = 3;
type matr= array [1..n, 1..m] of real; vect=array[1..n] of real; procedure Input(var a:matr); var i, j: Integer; begin for i := 1 to n do for j := 1 to m do begin write('a[', i, ',', j, ']='); readln(a[i, j]); end; end;
procedure Print(const a:matr); var i, j: Integer; begin for i := 1 to n do begin writeln; for j := 1 to m do write(a[i, j] : 3); end; writeln; end; procedure modyl(var a:matr; s:vect); var k,i:1..n; j:1..m; t:real; begin for i:=1 to n do s[k]:=0; t:=0; for k:=1 to n do for i:=1 to n do begin for j:=1 to m do begin s[k]:=abs(a[i,j]); t:=t+s[k]; end; s[k]:=t; end; end; procedure poisk (var s:vect;a:matr); var k,j:integer; max:real; begin max:=s[1]; for k:=1 to n do if max<s[k] then for j:=1 to n do writeln (a[k,j]) end; Var a:matr; k:integer; t:real; s:vect; Begin clrscr; input(a); print(a); modyl(a,s); poisk(s,a); readkey; end.
18192123
16.11.2006 2:46
Цитата(18192123 @ 15.11.2006 18:08)
а у меня тут еще один вариант "родился", только, по-моему, где-то напутала с формальными и фактическими параметрами, т.к. программа не идет дальше вывода исходной матрицы...
program zach_6; uses crt;
const n = 2; m = 3;
type matr= array [1..n, 1..m] of real; vect=array[1..n] of real; procedure Input(var a:matr); var i, j: Integer; begin for i := 1 to n do for j := 1 to m do begin write('a[', i, ',', j, ']='); readln(a[i, j]); end; end;
procedure Print(const a:matr); var i, j: Integer; begin for i := 1 to n do begin writeln; for j := 1 to m do write(a[i, j] : 3); end; writeln; end; procedure modyl(var a:matr; s:vect); var k,i:1..n; j:1..m; t:real; begin for i:=1 to n do s[k]:=0; t:=0; for k:=1 to n do for i:=1 to n do begin for j:=1 to m do begin s[k]:=abs(a[i,j]); t:=t+s[k]; end; s[k]:=t; end; end; procedure poisk (var s:vect;a:matr); var k,j:integer; max:real; begin max:=s[1]; for k:=1 to n do if max<s[k] then for j:=1 to n do writeln (a[k,j]) end; Var a:matr; k:integer; t:real; s:vect; Begin clrscr; input(a); print(a); modyl(a,s); poisk(s,a); readkey; end.
ну почему мне никто не хочет помочь! неужели трудно объяснить, что я делаю не так! пожалуйста, объясните, в чем я ошибаюсь!!!
18192123
16.11.2006 3:34
Цитата(18192123 @ 15.11.2006 22:46)
ну почему мне никто не хочет помочь! неужели трудно объяснить, что я делаю не так! пожалуйста, объясните, в чем я ошибаюсь!!!
кто-нибудь меня слышит?
мисс_граффити
16.11.2006 3:53
послушай: 1. никто не обязан круглосуточно следить за твоими темами. когда будет время - все всё увидят. крики вроде "кто-нибудь меня слышит?" ничего, кроме раздражения, не вызывают. тем более с огромными скопированными кусками кода. 2. тебе дали рабочую программу? она тебе не нравится? тогда переделывай САМА. отлаживай. сравнивай с тем, что дали.
procedure modyl(var a:matr; s:vect);
ты хочешь тут изменять только a, оставляя s неизменным? нет? вот и пиши, что это var.
18192123
16.11.2006 4:15
Цитата(мисс_граффити @ 15.11.2006 23:53)
послушай: 1. никто не обязан круглосуточно следить за твоими темами. когда будет время - все всё увидят. крики вроде "кто-нибудь меня слышит?" ничего, кроме раздражения, не вызывают. тем более с огромными скопированными кусками кода. 2. тебе дали рабочую программу? она тебе не нравится? тогда переделывай САМА. отлаживай. сравнивай с тем, что дали.
procedure modyl(var a:matr; s:vect);
ты хочешь тут изменять только a, оставляя s неизменным? нет? вот и пиши, что это var.
вот я и переделываю!
Цитата(18192123 @ 16.11.2006 0:09)
согласна, это я погорячилась. понимаю, что мне здесь никто ничего не должен
теперь о задаче: я делаю, как ты говоришь, но теперь прога выдает элементы 2-й строки, причем всегда и только первые два ????????????
Lapp
16.11.2006 9:28
Первое замечание: соблюдай отступы! после каждого begin текст идет на 2 позиции правее, после end - левее. Посмотри на мой код внизу - сразу видно, где задаются переменные, где тело процедуры, а где тело цикла, правда?
В процедуре Модыл (modyl) понаворочено.. 1. В тройном цикле самый внешний (по k) - лишний. 2. Соответственно, сам параметр k - лишний. Все k заменить на i. 3. Тело цикла упростить так: s[i]:=s[i]+abs(a[i,j]) 4. Тогда переменная t больше не нужна - убрать (она все равно неправильно использовалась) 5. Для краткости, убери цикл с занулением s[i] и сделай зануление во внешнем цикле двойного перед внутренним.
Должно получиться что-то вроде этого:
procedure modyl(var a:matr; var s:vect); var i:1..n; j:1..m; begin for i:=1 to n do begin s[k]:=0; for j:=1 to m do t:=t+abs(a[i,j]) end end;
В процедуре Поиск что-то совсем странное.. Ты печатаешь ВСЕ строчки, у которых s[k] больше чем s[1]. При этом первую строчка не напечатается, даже если s[1] больше всех остальных значений. Кроме того, ты перепутала n и m, поэтому выводятся не 3, а 2 элемента.. Как нужно делать: 1. Запоминаешь s[1] в max (это у тебя есть). 2. Заводишь еще один параметр (скажем, L) для номера искомой строки. 3. Кладешь в L единицу (номер первой строки). 4. Устраиваешь цикл по строчкам со 2-й (потому что первый элемент сравнивать с самим собой бессмысленно) до m. 5. В этом цикле, если s[k] больше чем max, то запоминаешь параметр цикла в L. 6. Выходишь из цикла и печатаешь строку с номером L.
Последнее замечание: почему ты в процедуре Модыл параметры цикла определяла диапазоном, а в процедуре Поиск аналогичные параметры у тебя integer? Типа при поиске проверка диапазона тебе не важна? Вот потому-то у тебя и получаются ошибки от путаницы m и n. Уж если делаешь диапазоном, делай везде. Когда перестанешь делать очевидные ошибки (или хотя бы научишься их искать) - тогда делай intrger..
18192123
16.11.2006 23:31
Цитата(lapp @ 16.11.2006 5:28)
Первое замечание: соблюдай отступы! после каждого begin текст идет на 2 позиции правее, после end - левее. Посмотри на мой код внизу - сразу видно, где задаются переменные, где тело процедуры, а где тело цикла, правда?
В процедуре Модыл (modyl) понаворочено.. 1. В тройном цикле самый внешний (по k) - лишний. 2. Соответственно, сам параметр k - лишний. Все k заменить на i. 3. Тело цикла упростить так: s[i]:=s[i]+abs(a[i,j]) 4. Тогда переменная t больше не нужна - убрать (она все равно неправильно использовалась) 5. Для краткости, убери цикл с занулением s[i] и сделай зануление во внешнем цикле двойного перед внутренним.
Должно получиться что-то вроде этого:
procedure modyl(var a:matr; var s:vect); var i:1..n; j:1..m; begin for i:=1 to n do begin s[k]:=0; for j:=1 to m do t:=t+abs(a[i,j]) end end;
В процедуре Поиск что-то совсем странное.. Ты печатаешь ВСЕ строчки, у которых s[k] больше чем s[1]. При этом первую строчка не напечатается, даже если s[1] больше всех остальных значений. Кроме того, ты перепутала n и m, поэтому выводятся не 3, а 2 элемента.. Как нужно делать: 1. Запоминаешь s[1] в max (это у тебя есть). 2. Заводишь еще один параметр (скажем, L) для номера искомой строки. 3. Кладешь в L единицу (номер первой строки). 4. Устраиваешь цикл по строчкам со 2-й (потому что первый элемент сравнивать с самим собой бессмысленно) до m. 5. В этом цикле, если s[k] больше чем max, то запоминаешь параметр цикла в L. 6. Выходишь из цикла и печатаешь строку с номером L.
Последнее замечание: почему ты в процедуре Модыл параметры цикла определяла диапазоном, а в процедуре Поиск аналогичные параметры у тебя integer? Типа при поиске проверка диапазона тебе не важна? Вот потому-то у тебя и получаются ошибки от путаницы m и n. Уж если делаешь диапазоном, делай везде. Когда перестанешь делать очевидные ошибки (или хотя бы научишься их искать) - тогда делай intrger..
кажется, я в очередной раз запуталась в процедурах modyl и poisk , программа мне выводит три строчки по 2 элемента, я наверное снова путаю m и n? вот кусок для этих процедур:
procedure modyl(var a:matr; var s:vect); var i:1..n; j:1..m; begin for i:=1 to n do begin s[i]:=0; for j:=1 to m do begin s[i]:=s[i]+abs(a[i,j]); end; end; end; procedure poisk (var s:vect;a:matr); var j:1..m;l,i:1..n; max:integer; begin max:=s[1]; l:=1; for i:=2 to n do begin if max<s[i] then l:=i; end; for j:=1 to m do writeln (s[l]); end;
ох!
18192123
17.11.2006 1:27
Цитата(18192123 @ 16.11.2006 19:31)
кажется, я в очередной раз запуталась в процедурах modyl и poisk , программа мне выводит три строчки по 2 элемента, я наверное снова путаю m и n? вот кусок для этих процедур:
procedure modyl(var a:matr; var s:vect); var i:1..n; j:1..m; begin for i:=1 to n do begin s[i]:=0; for j:=1 to m do begin s[i]:=s[i]+abs(a[i,j]); end; end; end; procedure poisk (var s:vect;a:matr); var j:1..m;l,i:1..n; max:integer; begin max:=s[1]; l:=1; for i:=2 to n do begin if max<s[i] then l:=i; end; for j:=1 to m do writeln (s[l]); end;
ох!
теперь поняла в чем ошибка: вместо
for j:=1 to m do writeln (s[l]);
нужно
for j:=1 to m do write(a[L,j],' ');
Lapp
17.11.2006 11:26
Цитата(18192123 @ 16.11.2006 22:27)
теперь поняла в чем ошибка
Уррррааа!
Ты делаешь громадные успехи, кроме шуток. Продолжай в том же духе!
PS При ответе, пожалуйста, оставляй из цитаты сообщения, на которое отвечаешь, только то, что нужно, а остальное удаляй - вот как я сейчас сделал, видишь?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.