IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача про матрицу и одномерный массив.
Batia
сообщение 27.11.2005 14:24
Сообщение #1


Гость






Задача такая:
**На основе матрицы A(4 строки, 5 столбцов) сформировать одномерный массив B из 5 элэментов. Каждий элемент Bk этого массива получает значение, равное полусумме ззначений наибольшего и наименьшего элементов в k-м столбце матрицы A.
Для вычисления полусуммы значений наибольшего и наименьшего элементов в произвольном столбцематрицы использовать процедуру.**
Никак не могу ее решить, а препод. что-либо объяснять отказывается.
Помогите, если сможете.
 К началу страницы 
+ Ответить 
APAL
сообщение 27.11.2005 14:26
Сообщение #2


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


А что уже пытался сделать? выкладывай...


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Batia
сообщение 27.11.2005 17:06
Сообщение #3


Гость






:
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;

А вот по поводу процедуры почти никаких идей!

Сообщение отредактировано: Altair - 27.11.2005 17:32
 К началу страницы 
+ Ответить 
APAL
сообщение 27.11.2005 20:16
Сообщение #4


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


Цитата
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);



--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Batia
сообщение 28.11.2005 15:29
Сообщение #5


Гость






За идею конечно спасибо, но вопросов, к сожалению, меньше не стало.
Например:
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 16:23
Сообщение #6


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


Цитата
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"
Что это означает в переводе на русский?

см. выше приведенный код, может станет понятнее.

Цитата
И еще один вопрос, за чем находить и передовать индекс, если полусумма это простое число.

Мы передаем индекс (номер столбца) в процедуру, для того, чтобы она знала с каким именно столбцом ей работать.


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Batia
сообщение 29.11.2005 19:19
Сообщение #7


Гость






Теперь нужно сформировать массив, процедура возвращает нам число {полусумму}, зачит надо вызвать ее 5 раз и записать значения в B:
PolSum(A;??;mOut);
B[1]:=mOut;
PolSum(A;??;mOut);
B[2]:=mOut;...
Проделав эту операцию 5 раз, массив должен сформироваться, и его надо вывести процедурой, которую я уже приводил.
Так ли это, можно ли сделать это проще, и какой индекс столбца нужно писать при обращении, в данном случае.
 К началу страницы 
+ Ответить 
volvo
сообщение 29.11.2005 19:22
Сообщение #8


Гость






Цитата
можно ли сделать это проще

For i := 1 to 5 do begin
PolSum(A, i, mOut);
B[i] := mOut
end;


P.S. Если использовать функцию PolSum вместо процедуры, будет еще проще...
 К началу страницы 
+ Ответить 
APAL
сообщение 29.11.2005 22:25
Сообщение #9


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


To: volvo
У него в условии написано "процедуру", а с функцией конечно покрасивше было бы.


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Batia
сообщение 1.12.2005 16:44
Сообщение #10


Гость






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

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 16:47
 К началу страницы 
+ Ответить 
volvo
сообщение 1.12.2005 16:57
Сообщение #11


Гость






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 17:42
Сообщение #12


Гость






Все исправил, ошибок нет, но после токо как введешь матрицу, происходит выход из программы:
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 17:55
Сообщение #13


Гость






Ну, телепатов тут нет, какие значения ты вводил нам неизвестно. На моих - нормально отработало (только вот Read в процедуре ввода мешает... Замени его на ReadLn и вводи число за числом, после каждого - Enter, иначе ты просто не увидишь результата...)
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 8.08.2025 7:29
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"