Помощь - Поиск - Пользователи - Календарь
Полная версия: модули элементов в двумерном массиве
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
дан двумерный массив, вывести ту строку, сумма модулей элементов в которой максимальна.
использовать процедуры.


я не соображу, как собственно вывести строку

и еще... при компиляции появляется ошибка 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
blink.gif У тебя не только 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
Цитата(volvo @ 13.11.2006 16:47) *

blink.gif У тебя не только Begin пропущен... Внимательно смотри на исправления (программа только проходит компиляцию, о правильности работы сказать ничего пока не могу)...
Цитата - из-за оформления цветом...


компиляция проходит успешно, но после того, как я ввожу первую строку массива, сразу прога выдает
значения суммы...


klem4
Компиляция чего проходит успешно ? Приведенный тобой код НЕ компилируется. С исправлениями volvo - компилируется, ты используешь его ? Гадалка заболела !
18192123
Цитата(klem4 @ 13.11.2006 20:46) *

Компиляция чего проходит успешно ? Приведенный тобой код НЕ компилируется. С исправлениями volvo - компилируется, ты используешь его ? Гадалка заболела !

да, я использую вариант volvo
Гость
Ты вводишь матрицу n*n =4
а надо m*n =10
klem4
Гость, ты о чем ?

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;

end;

var

Mx: TMx;
maxN, value: Integer;
begin
clrscr;
Input(Mx);
Print(Mx);
Main(Mx, maxN, value);
writeln('Row = ', maxN, ' value = ', value);
readln;
end.

Гость
Цитата
if (maxN = 0) or (maxN > 0) and (s > value) then begin

klem4
Гость, онаже Pola А если подумать ?
Гость
Цитата
if s >= value then begin


и саму строку вывести в конце проги можно
Цитата
дан двумерный массив, вывести ту строку, ...
klem4
Более чем уверен, что имлось в виду вывести номер строки, что я сделал.
18192123
Цитата(klem4 @ 13.11.2006 22:19) *

Более чем уверен, что имлось в виду вывести номер строки, что я сделал.

в условии сказано: вывести строку[size=2]


Я надеюсь хотябы это ты сама сможешь сделать ?
klem4
18192123
Цитата(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;

end;

var

Mx: TMx;
maxN, value: Integer;
begin
clrscr;
Input(Mx);
Print(Mx);
Main(Mx, maxN, value);
writeln('Row = ', maxN, ' value = ', value);
readln;
end.



что-то твоя программа не компилируется, появляется сообщение, что в процедуре сумма пропущена скобка

????????????????
Гость
У тебя какая версия Паскаля?
может это на const в списке формальных параметров такая реакция? тогда поставь var
klem4
Цитата

может это на const в списке формальных параметров такая реакция? тогда поставь var


Const как раз ставится для того, чтобы исключить возможность изменения данных, но при этом передавать их не по значению, а по сссылке. Ну а если var поставить, то все наоброт будет, мы еще и увеличим эту возможность.

Так что рпосто попрбуй убрать const (в заголовках подпрограмм) и все.
volvo
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;

Теперь понятнее? wink.gif

Цитата
Const как раз ставится для того, чтобы исключить возможность изменения данных
Ты уверен, что данные, переданные со спецификатором Const нельзя изменить? Я бы сказал, Const ставится как защита от СЛУЧАЙНОГО изменения данных smile.gif ...
klem4
Sum исправил. По поводу const это и имел в виду
Цитата
Const ставится как защита от СЛУЧАЙНОГО изменения данных
неправильно выразился.
18192123
Цитата(klem4 @ 13.11.2006 21:56) *
18192123, вот смотри, разбирайся

объясни пожалуйста, что такое Row
klem4
 function Sum(const mx: TMx; row: Integer): Integer;


Функция возвращает значение суммы модулей элементов строки ROW матрицы MX.
18192123
Цитата(klem4 @ 14.11.2006 18:34) *

 function Sum(const mx: TMx; row: Integer): Integer;


Функция возвращает значение суммы модулей элементов строки ROW матрицы MX.

а откуда мы берем этот параметр (ROW), мы ведь его не где не задаем
мисс_граффити
это формальный параметр.
вместо него при вызоые подставляется фактический - i.
18192123
Цитата(мисс_граффити @ 14.11.2006 22:41) *

это формальный параметр.
вместо него при вызоые подставляется фактический - i.

большое спасибо!
18192123
Цитата(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
Цитата(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
Цитата(18192123 @ 15.11.2006 22:46) *

ну почему мне никто не хочет помочь!
неужели трудно объяснить, что я делаю не так! пожалуйста, объясните, в чем я ошибаюсь!!!

кто-нибудь меня слышит? wacko.gif !help.gif
мисс_граффити
послушай:
1. никто не обязан круглосуточно следить за твоими темами. когда будет время - все всё увидят. крики вроде "кто-нибудь меня слышит?" ничего, кроме раздражения, не вызывают. тем более с огромными скопированными кусками кода.
2. тебе дали рабочую программу? она тебе не нравится? тогда переделывай САМА. отлаживай. сравнивай с тем, что дали.

procedure modyl(var a:matr; s:vect);

ты хочешь тут изменять только a, оставляя s неизменным? нет? вот и пиши, что это var.
18192123
Цитата(мисс_граффити @ 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
Первое замечание: соблюдай отступы! после каждого 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.. smile.gif
18192123
Цитата(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.. smile.gif


кажется, я в очередной раз запуталась в процедурах 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;



wink.gif ох! wacko.gif
18192123
Цитата(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;



wink.gif ох! wacko.gif

теперь поняла в чем ошибка: вместо
for    j:=1  to m  do writeln  (s[l]);

нужно
for j:=1 to m  do write(a[L,j],' ');


Lapp
Цитата(18192123 @ 16.11.2006 22:27) *

теперь поняла в чем ошибка

Уррррааа!
smile.gif smile.gif smile.gif
Ты делаешь громадные успехи, кроме шуток. Продолжай в том же духе!

PS
При ответе, пожалуйста, оставляй из цитаты сообщения, на которое отвечаешь, только то, что нужно, а остальное удаляй - вот как я сейчас сделал, видишь?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.