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

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

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

 
 Ответить  Открыть новую тему 
> Минимум среди максимумов матрицы, Использовать процедуры или функции
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


Привет!
В общем нужно было найти минумум среди максимумов каждой строки матрицы и вывести его вместе с его координатами.. Использовать процедуры, либо функции.. (делала через процедуры)
Задача конечно очень "сложная" и редкая)), аж самой противно unsure.gif , но не могли бы проверить, представляя себя очень строгим и дотошным преподом smile.gif

const n=5;
m=4;
type matr = array[1..n,1..m] of integer;
var arr: matr;
str,stl,min: integer;

procedure vvod(var a: matr);
var i,j: integer;
begin
for i:=1 to n do
for j:=1 to m do a[i,j]:=random(11);
end;

procedure vuvod(a: matr);
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to m do write(a[i,j]:4);
writeln;
end;
end;

procedure poisk_min(a: matr; var mn,st,sl: integer);
var i,w,mx: integer;

procedure poisk_max(b: matr; l: integer; var t,v: integer);
var j: integer;
begin
for j:=1 to m do
if b[l,j]>t then
begin
t:=b[l,j];
v:=j;
end;
end;

begin
for i:=1 to n do
begin
mx:=0;
poisk_max(a,i,mx,w);
if mx<mn then
begin
mn:=mx;
st:=i;
sl:=w;
end;
end;
end;

begin
randomize;
str:=0;
stl:=0;
min:=1000;
vvod(arr);
vuvod(arr);
poisk_min(arr,min,str,stl);
writeln('искомый элемент: ',min,' в ',str,'-й строке ',stl,'-го столбца');
end.


еще.. мне кажется, чет я намудрила там с переменными.. с их глобальностью и локальностью.. Мне это не кажется?

Заранее спасибо)))

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Вообще все хорошо. У меня было бы два таких небольших замечания.

Первое - матрицу как параметр лучше передавать всегда по ссылке, а не по значению (т.е. через var-параметр), т.к. иначе при каждом вызове создается дополнительная копия матрицы в стеке, и при больших размерах матрицы это существенно влияет на производительность.

И второе - лучше инициализацию выходных параметров инкапсулировать внутри процедур. Ты заполняешь min, str и stl, и передаешь их функции, которая при этом расчитывает на то, str и stl обнулены, а min - достаточно большое. Пусть лучше процедура внутря себя обеспечит эти условия, а снаружи ты ее только вызываешь, полагаясь, что параметры будут заполнены правильно. То же самое и для mx, передаваемой в poisk_max - пусть сам poisk_max ее и обнуляет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


Спасибо!))
Все поняла, исправила.
Только один вопрос.. "инкапсулировать" - значит "производить/проводить"? (буду пополнять свой словарный запас wink.gif)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Инкапсулировать - это значит собирать в капсулу, дословно smile.gif То есть вбирать в себя то, что другим знать необязательно.

Допустим, ты этой функцией хочешь поделиться со мной. Ты мне эту функцию даешь, и говоришь - параметр min нужно сделать очень большим, а параметры str и stl - обнулить, и тогда функция вычислит минимум максимумов и запишет в min.

А на самом деле гораздо удобнее для меня как для пользователя твоего кода, чтобы я знал только, что надо ее вызвать, и что при этом получится минимум максимумов. А обнуление пусть за меня выполнит сама функция.

Таким образом ты прячешь часть зависимостей внутрь функции, по возможности изолируешь детали реализации от внешнего мира. Это есть инкапсуляция.

Хотя чаще это слово используется в отношении классов (а не функций). Но это уже совсем другая история smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
"инкапсулировать" - значит "производить/проводить"?
Инкапсулировать - от слова "капсула" - скрывать, закрывать оболочкой...

Теперь о программе... Если быть
Цитата
очень строгим и дотошным преподом
- то я бы порекомендовал:

1. Все переменные, описанные в самом начале перенести так, чтоб они были описаны прямо перед началом основной программы (это к тому, что "меньше знаешь - лучше спишь", чем меньше процедур/функций "знают" о существовании глобальных переменных - есть меньше возможностей получить побочные эффекты)...

2. То же самое касается и вложенной процедуры - секция Var должна быть не ДО нее, а после...

3. Еще нечто, что у тебя во вложенной процедуре не совсем понятно:
procedure poisk_max(b: matr; l: integer; var t,v: integer);
Зачем ты еще раз передаешь матрицу? У тебя же сама матрица "А", переданная в процедуру poisk_min, доступна...

(передавай матрицу по константной ссылке, если не будешь запускать программу на TP ниже 7 версии:
procedure poisk_min(const a: matr; var mn,st,sl: integer);
- это даст тебе дополнительную гарантию безопасности данных)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


to Michael_Rybak Понятно. Еще раз спасибо за подробное объяснение! give_rose.gif


Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Цитата(volvo @ 8.12.2007 23:53) *

(передавай матрицу по константной ссылке, если не будешь запускать программу на TP ниже 7 версии:


Опа smile.gif А про константные ссылки-то я и не знал. Как их в паскале реализовать в смысле.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


может, я сейчас скажу не совсем правильные вещи...
это скорее на уровне не "правильно/неправильно", а "мне так удобнее".
если что - надеюсь, меня поправят smile.gif)

0) я бы минимизировала работу с глобальными константами.
размерность матрицы - передавала процедурам.
имхо, это несколько упрощает отладку.

1) названия переменных... l,v,w... хотелось бы побольше информативности

2) зачем хранить и значение элемента, и его индексы? по индексу всегда можно обратиться к элементу...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Цитата(Айра @ 8.12.2007 23:55) *

to Michael_Rybak Понятно. Еще раз спасибо за подробное объяснение! give_rose.gif

smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


to volvo: тоже разобралась, спасибо!
to мисс_граффити:

0) я тоже об этом думала.. (вспоминается одна из лекций по информатике) наверно так и сделаю..
1) тоже согласна, что запутанно, скорее всего и препод придерется.. придется выдумавать понятные обозначения..
2) получается можно было сделать процедуру поиска минимума без передачи туда переменной min? а просто потом по индексам выводить элемент массива.. но раз я там уже нахожу минимальное, так пусть оно потом и поработает smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


нумерация пунктов та же smile.gif
1) комментарии напиши...
добавлять их к программкам - вообще хорошая привычка. хотя обычно лень... особенно если что-то совсем простенькое пишешь.

2) ну, по сути, да.
то есть, грубо говоря, существует 2 банально-примитивно-классически-рассматривающихся везде способа поиска минимума:
а)
min:=очень_большое_число;
for i:=1 to n do
if ar[i]<min then
min:=ar[i];

б)
min:=ar[1];
for i:=2 to n do
if ar[i]<min then
min:=ar[i];

поскольку тебе все равно нужны индексы, я бы опиралась на второй вариант. то есть:
min_ind:=1;
for i:=2 to n do
if ar[i]<ar[min_ind] then
min_ind:=i;

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

это, кстати, позволит тебе переделать poisk_max из процедуры в функцию.
что, на мой взгляд, с учетом учебной, а не практической направленности данной задачи будет плюсом - ты покажешь преподу, что умеешь работать с обоими видами подпрограмм.

З.Ы. Если бы преподы ТАК принимали лабораторные shok.gif

Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


Т.е. получится что-то типа такого:
  
const n=5;
m=4;
type matr = array[1..n,1..m] of integer;

procedure vvod(var a: matr; const n,m: integer);
var i,j: integer;
begin
for i:=1 to n do
for j:=1 to m do a[i,j]:=random(11);
end;

procedure vuvod(var a: matr; const n,m: integer);
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to m do write(a[i,j]:4);
writeln;
end;
end;

procedure poisk_min(const a: matr; var mn,st,sl: integer; const n,m: integer);
function poisk_max(const a: matr; l,max_ind: integer; const m: integer): integer;
var j: integer;
begin
max_ind:=1;
for j:=1 to m do
if a[l,j]>a[l,max_ind] then
begin
max_ind:=j;
end;
poisk_max:=max_ind;
end;
var i,w,mx: integer;
begin
st:=0;
sl:=0;
mn:=1000;
for i:=1 to n do
begin
if a[i,poisk_max(a,i,mx,m)]<mn then
begin
mn:=a[i,poisk_max(a,i,mx,m)]; //комментарий smile.gif очень смущает этот кусок, точнее неоднократное вычисление одной и той же функции.. или я уже что-то не то делаю..
st:=i;
sl:=poisk_max(a,i,mx,m);
end;
end;
end;

var arr: matr;
str,stl,min: integer;

begin
randomize;
vvod(arr,n,m);
vuvod(arr,n,m);
poisk_min(arr,min,str,stl,n,m);
writeln('искомый элемент: ',min,' в ',str,'-й строке ',stl,'-го столбца');
end.


А реализовать поиск_мин через индекс чет у меня не получается.. поздно наверно уже..

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Оля, смотри, что можно сделать:

const
n = 5;
m = 4;
type
vector = array[1 .. m] of integer;
matrix = array[1 .. n] of vector;

procedure vvod(var a: matrix; const n,m: integer);
var i, j: integer;
begin
for i:=1 to n do
for j:=1 to m do a[i,j]:=random(11);
end;

procedure vuvod(var a: matrix; const n,m: integer);
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to m do write(a[i,j]:4);
writeln;
end;
end;

procedure get_min(const mx: matrix; var row, col: integer;
const n, m: integer);

function get_max_index(const v: vector; const m: integer): integer;
var max_index, i: integer;
begin
max_index := 1;
for i := 1 to m do
if v[i] > v[max_index] then max_index := i;
get_max_index := max_index;
end;

var i, max_col: integer;
begin
col := 0; row := 0;

for i := 1 to n do begin

max_col := get_max_index(mx[i], m);
if (i = 1) or (mx[i, col] < mx[row, col]) then begin
col := max_col; row := i
end;

end;
end;

var
arr: matrix;
min_row, min_col: integer;

begin
randomize;
vvod(arr, n, m);
vuvod(arr, n, m);
get_min(arr, min_row, min_col, n, m);

writeln('искомый элемент: ',arr[min_row, min_col],' в ',min_row,'-й строке ',min_col,'-го столбца');
end.

smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


volvo, спасибо! give_rose.gif
У меня были мысли про массив векторов, но реализовать не удалось(( Кстати, он ведь по идее считается одномерным, или как?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Вектор - одномерный, массив векторов - уже двумерный... У тебя же не возникает вопроса: массив
array[1 .. n, 1 .. n] of integer - двумерный или нет? А согласно синтаксису Паскаля это объявление аналогично
array[1 .. n] of array[1 .. n] of integer, ну а я ввел промежуточный тип (для удобства)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

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


Точно!
Еще раз пасибо))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 28.03.2024 19:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name