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

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

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

 
 Ответить  Открыть новую тему 
> Массивы, передача параметров в процедуры и функции
Eduard
сообщение 26.05.2011 19:21
Сообщение #1


Новичок
*

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

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


uses crt;
const
Max= 100;

type
tStroka= array [1..Max] of integer;

var
a: array [1..100] of tStroka;
N, M, i, j :integer;
s:real;
e: tStroka;

begin
write('N, M -> ');
readln(N, M);
write('Input matrix -> ');
for i:=1 to N do
for j:=1 to M do
begin
write('A[',i,',',j,'] -> ');
readln(a[i, j]);
end;
for i:=1 to n do
for j:=i-1 downto 1 do
begin
if a[j,1]<a[j+1,1] then
begin
e:=a[j];
a[j]:=a[j+1];
a[j+1]:=e;
end;

writeln (a[i,j]);
end;
for i:= 1 to n do
begin
s:=0;
for j:= 1 to m do
s:=s+a[i,1];
end;
s:=s/N;
write (s);
end.

Как сделать сортировку в виде процедуры, а вычисление в виде функции? Препод говорил что-то о разных способах задания переменых в процедурах и функциях, и я запутался, когда, какой способ использовать. Помогите, пожалуйста,.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 27.05.2011 0:33
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Eduard @ 26.05.2011 20:21) *
Как сделать сортировку в виде процедуры, а вычисление в виде функции? Препод говорил что-то о разных способах задания переменых в процедурах и функциях, и я запутался, когда, какой способ использовать.
Думаю, твой препод имел в виду параметры-значения и параметры-переменные. Сортировку нужно применять непосредственно к самой матрице, и результат должен отразиться на ней - следовательно, надо применять var-параметр. Вычисление чего-то там (я так и не понял, чего именно; если среднее по столбцам - то оно делается неправильно) дает некий отдельный результат, никак не отражающийся на самой матрице. Следовательно, жеательно применить параметр-значение (хотя var-параметр тоже будет работать, и даже быстрее, нужно только следить за тем, чтоб случайно не испортить матрицу). А все вспомогательные переменнные (параметры цикла, промежуточные суммы..) надо делать локальными, то есть определять их внутри процедуры/функции.
Короче, примерно вот так:
const
Max= 100;

type
tStroka= array [1..Max] of integer;
tMnogoStrok= array [1..100] of tStroka;

var
a: tMnogoStrok;
N, M, i, j:integer;
e: tStroka;


procedure Sort(var a: tMnogoStrok);
var
i,j: integer;
begin
for i:=1 to n do
for j:=i-1 downto 1 do begin
if a[j,1]<a[j+1,1] then begin
e:=a[j];
a[j]:=a[j+1];
a[j+1]:=e;
end;
writeln (a[i,j]);
end
end;

function Calculation(a: tMnogoStrok): double;
var
i,j: integer;
s: double;
begin
for i:= 1 to n do begin
s:=0;
for j:= 1 to m do s:=s+a[i,1];
end;
Calculation:= s/N
end;

begin
write('N, M -> ');
readln(N, M);
write('Input matrix -> ');
for i:=1 to N do
for j:=1 to M do
begin
write('A[',i,',',j,'] -> ');
{readln(a[i, j]);}
a[i,j]:= Random(n*m);
end;
Sort(a);
writeln (Calculation(a));
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Eduard
сообщение 27.05.2011 6:19
Сообщение #3


Новичок
*

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

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


Цитата(Lapp @ 27.05.2011 1:33) *



function Calculation(a: tMnogoStrok): double;
var
i,j: integer;
s: double;
begin
for i:= 1 to n do begin
s:=0;
for j:= 1 to m do s:=s+a[i,1];
end;
Calculation:= s/N
end;



В этом месте вылазит ошибка Stack overflow error.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 27.05.2011 7:55
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Eduard @ 27.05.2011 7:19) *
В этом месте вылазит ошибка Stack overflow error.
Увеличь стек или уменьши размер массивов.
Какой у тебя компилятор?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Eduard
сообщение 27.05.2011 7:56
Сообщение #5


Новичок
*

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

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


Цитата(Lapp @ 27.05.2011 8:55) *

Какой у тебя компилятор?

TP7
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 27.05.2011 8:03
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Eduard @ 27.05.2011 8:56) *
TP7

А ездишь ты на телеге?..

По умолчанию, в TP7 стек был, кажется.. 16 К. Твой массив 100х100х2=20К. Увеличь стек до максимума (64К). Это в опциях.

Скачай FP (freepascal.org) и займись делом, а не бирюльками.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Eduard
сообщение 27.05.2011 8:08
Сообщение #7


Новичок
*

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

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


Спасибо. Я не мог понять что такое стек.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 27.05.2011 8:25
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Eduard @ 27.05.2011 9:08) *
Спасибо. Я не мог понять что такое стек.
Стек - это область памяти, где размещаются переменные вызываемых процедур. Динамически аллоцируемая память размещается в "куче" (heap). Она в TP может достигать аж ~600 килобайт!! Дикое количество, особенно если учесть, что размер памяти сейчас измеряется даже не мегабайтами, а гигабайтами.. Иначе говоря, ТР тебе позволяет использовать одну-две сотых доли процента установленной памяти..
Зачем пользоваться краденным старьем, если есть бесплатный новый компилятор со всеми современными возможностями?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 27.05.2011 9:39
Сообщение #9


Злостный любитель
*****

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

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


> Иначе говоря, ТР тебе позволяет использовать одну-две сотых доли процента установленной памяти..

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 28.05.2011 6:15
Сообщение #10


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(TarasBer @ 27.05.2011 10:39) *
Можно перейти в защищённый режим и использовать всю память.
А сделать один большой массив?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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