Задача такая: **На основе матрицы A(4 строки, 5 столбцов) сформировать одномерный массив B из 5 элэментов. Каждий элемент Bk этого массива получает значение, равное полусумме ззначений наибольшего и наименьшего элементов в k-м столбце матрицы A. Для вычисления полусуммы значений наибольшего и наименьшего элементов в произвольном столбцематрицы использовать процедуру.** Никак не могу ее решить, а препод. что-либо объяснять отказывается. Помогите, если сможете.
APAL
27.11.2005 18:26
А что уже пытался сделать? выкладывай...
Batia
27.11.2005 21:06
:
program Project2;
{$APPTYPE CONSOLE} type m=array[1..100,1..100] of integer; mas=array[1..100] of integer; var A:m;
uses SysUtils; procedure vvod(m,n:integer;var x:m);{ввел} var i,j: integer; begin writeln('введите матрицу'); for i:=1 to m do for j:=1 to n do read(x[i,j]); end; procedure MasOut(n:integer,var p:mas,c:char);{вывел} var i:integer; begin writeln('results for',c); for i:=1 to n do write(p[i];''); writeln; end;
А вот по поводу процедуры почти никаких идей!
APAL
28.11.2005 0:16
Цитата
type m=array[1..100,1..100] of integer; mas=array[1..100] of integer; var A:m;
Что то я не понял: по условию матрица 4x5, а в приведенном примере массив 100x100
Цитата
uses SysUtils;
А что используется из этого модуля?
Цитата
procedure vvod(m,n:integer;var x:m);{ввел} var i,j: integer; begin writeln('введите матрицу');
Здесь главное чтобы сам не напутал с именем переменной и именем типа...
Цитата
А вот по поводу процедуры почти никаких идей!
Даю идею: читаем условие - "Для вычисления полусуммы значений наибольшего и наименьшего элементов в произвольном столбцематрицы использовать процедуру". Отсюда следует, что можно создать процедуру в которую будет передаваться массив и индекс столбца (можно и без передачи массива, а работать только с индексом, обращаясь к самому исходному массиву, но на этом теряется универсальность процедуры, т.е. ее так просто не перенесешь в другую программу), а возвращать будет уже результат полусуммы. Заголовок может например выглядить так:
Type tM = array [1..4,1..5] of Real; Procedure PolSum(m : tM;ii : Byte;Var mOut : Real);
Batia
28.11.2005 19:29
За идею конечно спасибо, но вопросов, к сожалению, меньше не стало. Например: ii -это индекс? mout - это массив? Да и вообще, в это этой истории много всего непонятного: что такое полусумма, еще можно понять, наибольший и наиаменьший элементы должны находиться как-то так: min:=A[1,1]; max:=A[1,1]; for i=1 to n do for j=1 to m do if A[i,j]<min then min:=A[i,j]; {о необходимости begin-ов и end-ов, с сожалению, ничего не знаю} if A[i,j]>max then max:=A[i,j];
Но больше всего меня смущает фраза: " Каждый Bk-ый элемент... получает значение..... k-м столбце матрицы A" Что это означает в переводе на русский? И еще один вопрос, за чем находить и передовать индекс, если полусумма это простое число. Надеюсь, что в моих рассуднениях можно проследить логику, и они не очень далеки от правды.
APAL
28.11.2005 20:23
Цитата
ii -это индекс? mout - это массив?
Да, ii - это индекс столбца mOut - смотри "Real", т.е. вещественное число, т.е. это и будет возвращаться процедурой как полусумма.
Цитата
что такое полусумма, еще можно понять, наибольший и наиаменьший элементы должны находиться как-то так: min:=A[1,1]; max:=A[1,1]; for i=1 to n do for j=1 to m do if A[i,j]<min then min:=A[i,j]; {о необходимости begin-ов и end-ов, с сожалению, ничего не знаю} if A[i,j]>max then max:=A[i,j];
Не совсем так, полусумму нужно найти среди мин. и макс. элементов в определенной столбце (ii - индекс, который и передает в процедуру этот самый номер столбца), а у тебя ищется по всему массиву.
min:=a[1,ii]; max:=a[1,ii]; For i:=2 to 4 do If a[i,ii]<min then min:=a[i,ii] else If a[i,ii]>max then max:=a[i,ii]; mOut:=(min+max)/2;
Цитата
Но больше всего меня смущает фраза: " Каждый Bk-ый элемент... получает значение..... k-м столбце матрицы A" Что это означает в переводе на русский?
см. выше приведенный код, может станет понятнее.
Цитата
И еще один вопрос, за чем находить и передовать индекс, если полусумма это простое число.
Мы передаем индекс (номер столбца) в процедуру, для того, чтобы она знала с каким именно столбцом ей работать.
Batia
29.11.2005 23:19
Теперь нужно сформировать массив, процедура возвращает нам число {полусумму}, зачит надо вызвать ее 5 раз и записать значения в B: PolSum(A;??;mOut); B[1]:=mOut; PolSum(A;??;mOut); B[2]:=mOut;... Проделав эту операцию 5 раз, массив должен сформироваться, и его надо вывести процедурой, которую я уже приводил. Так ли это, можно ли сделать это проще, и какой индекс столбца нужно писать при обращении, в данном случае.
volvo
29.11.2005 23:22
Цитата
можно ли сделать это проще
For i := 1 to 5 do begin PolSum(A, i, mOut); B[i] := mOut end;
P.S. Если использовать функцию PolSum вместо процедуры, будет еще проще...
APAL
30.11.2005 2:25
To: volvo У него в условии написано "процедуру", а с функцией конечно покрасивше было бы.
Batia
1.12.2005 20:44
Попытался собрать все воедино, но возникает много ошибок, не знаю как их исправить, помогите пожалуйста.
program Project2;
{$APPTYPE CONSOLE} type tm=array[1..4,1..5] of integer; mas=array[1..5] of integer; var A:tm;
procedure vvod(m,n:integer;var x:tm);{ââåë} var i,j: integer; begin writeln('ââåäèòå ìàòðèöó'); for i:=1 to m do for j:=1 to n do read(x[i,j]); end; Procedure PolSum(m : tM;ii : Byte;Var mOut : Real); begin min:=a[1,ii]; max:=a[1,ii]; For i:=2 to 4 do If a[i,ii]<min then min:=a[i,ii] else If a[i,ii]>max then max:=a[i,ii]; mOut:=(min+max)/2; end; procedure MasOut(n:integer;var p:mas;c:char);{âûâåë} var i:integer; begin writeln('results for',c); for i:=1 to n do write(p[i],''); writeln; end; begin vvod(4,5,'x',x); PolSum(x,ii,mOut); MasOut(5,'B',B); For i := 1 to 5 do begin PolSum(A, i, mOut); B[i] := mOut end; end.
volvo
1.12.2005 20:57
Batia, все (ну, почти все) нормально сделано... Есть 2 основные ошибки:
1) не описываешь переменные, которые используются
Procedure PolSum(m : tM;ii : Byte;Var mOut : Real); var min, max, i: integer; { <--- Это надо добавить !!! }
и эти переменные - глобально:
type tm=array[1..4,1..5] of integer; mas=array[1..5] of real; { <--- Именно Real а не Integer }
var A: tm; B: mas; i: integer; mOut: real;
2) Количество и порядок следования параметров в описании процедуры и при ее вызове НЕ должны меняться... А у тебя - меняются... Основная часть должна быть такой:
... vvod(4,5,x); For i := 1 to 5 do begin PolSum(A, i, mOut); B[i] := mOut end; MasOut(5,B,'B'); ...
Batia
1.12.2005 21:42
Все исправил, ошибок нет, но после токо как введешь матрицу, происходит выход из программы:
program Project4;
{$APPTYPE CONSOLE} type tm=array[1..4,1..5] of integer; mas=array[1..5] of real; var A: tm; B: mas; i: integer; mOut: real; procedure vvod(m,n:integer;var x:tm);{ввел} var i,j: integer; begin writeln('Input Matr'); for i:=1 to m do for j:=1 to n do read(x[i,j]); end; Procedure PolSum(m : tM;ii : Byte;Var mOut : Real); var min,max,i: integer; begin min:=a[1,ii]; max:=a[1,ii]; For i:=2 to 4 do If a[i,ii]<min then min:=a[i,ii] else If a[i,ii]>max then max:=a[i,ii]; mOut:=(min+max)/2; end; procedure MasOut(n:integer;var p:mas;c:char);{вывел} var i:integer; begin writeln('results for',c); for i:=1 to n do write(p[i],''); writeln; end; begin vvod(4,5,a); For i := 1 to 5 do begin PolSum(a, i, mOut); B[i] := mOut end; MasOut(5,B,'B'); readln; end.
М
Я не понял, для тебя что, правил НЕ существует? [ CODE] за тебя должны ставить?
volvo
1.12.2005 21:55
Ну, телепатов тут нет, какие значения ты вводил нам неизвестно. На моих - нормально отработало (только вот Read в процедуре ввода мешает... Замени его на ReadLn и вводи число за числом, после каждого - Enter, иначе ты просто не увидишь результата...)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.