Непонятки с массивами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Непонятки с массивами

Сообщение @lex » 25.09.2006 19:48:30

Сегодня писал казалось бы простейшую лабу по информатике и наткнулся на такой вот прикол:

Условие лабы:
Даны натуральные числа k,l,m, действительные числа X1..Xk, Y1..Yl, Z1..Zm. Получить
t = (max(Y1..Yl)+Max(Z1..Zm))/2 при max(X1..Xk)>=0,
t = 1+(max(X1..Xk))^2 в противном случае.

Написал так:
Код: Выделить всё
program laba430;
uses crt;
const k=5; L=6; m=7;
var X: array [1..k] of integer;
Y: array [1..L] of integer;
Z: array [1..m] of integer;
n:integer;
t:single;

function max(M: array of integer; ml:integer): integer;
var q,w:integer;
begin
q:=M[1];
for w:=2 to ml do
if (M[w]>q) then q:=M[w];
max:=q;
end;

procedure zapoln(var M: array of integer; ml:integer);
var q: integer;
begin
for q:=1 to ml do begin
M[q]:=random(40)-20;
write(M[q]:4);
end;
writeln;
end;

begin
clrscr;
randomize;
zapoln(X,k);
zapoln(Y,L);
zapoln(Z,m);
n:=max(X,k);
write('Max X = ');
writeln(n);
if (n<0) then t:=1+max(X,k)*max(X,k) else t:=(max(Y,L) + max(Z,m)) / 2;
write('T = ');
writeln(t:5:1);
readkey;
end.


Выдаёт чушь, а если написать {$mode TP}, то числа приближаются к реальности но всё равно

неверные. Причины наверное в разности диапазонов значений.

Исправил (изменённые строки помечены "//!!!"):
Код: Выделить всё
program laba430;
uses crt;
const k=5; L=6; m=7;
var X: array [0..k-1] of integer;    //!!!
Y: array [0..L-1] of integer;        //!!!
Z: array [0..m-1] of integer;        //!!!
n:integer;
t:single;

function max(M: array of integer; ml:integer): integer;
var q,w:integer;
begin
q:=M[0];                             //!!!
for w:=1 to ml-1 do                  //!!!
if (M[w]>q) then q:=M[w];
max:=q;
end;

procedure zapoln(var M: array of integer; ml:integer);
var q: integer;
begin
for q:=0 to ml-1 do begin            //!!!
M[q]:=random(40)-20;
write(M[q]:4);
end;
writeln;
end;

begin
clrscr;
randomize;
zapoln(X,k);
zapoln(Y,L);
zapoln(Z,m);
n:=max(X,k);
write('Max X = ');
writeln(n);
if (n<0) then t:=1+max(X,k)*max(X,k) else t:=(max(Y,L) + max(Z,m)) / 2;
write('T = ');
writeln(t:5:1);
readkey;
end.

Заработало! Можете объяснить, в чём тут дело и почему в функцию нельзя передать определённый массив?

P.S.: версия пока 2.0.2
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Сообщение SAK » 25.09.2006 21:28:53

В функцию можно передавать массив, но при таком объявлении
Код: Выделить всё
function max(M: array of integer; ml:integer): integer;

внутри функции элементы массива нумеруются с нуля независимо от объявления исходного массива. Поэтому эту функцию лучше было бы написать так:
Код: Выделить всё
function max(M: array of integer): integer;
var q,w: integer;
begin
   q:=M[0];
   for w:=1 to High(M) do
     if (M[w]>q) then q:=M[w];
   max:=q;
end;

Размер массива передаётся в функцию скрытым параметром и считывается функцией High, поэтому передавать его явным образом излишне.
Однако если количество элементов будет задаваться не константой, а переменной то, возможно, понадобится передавать в функцию и их количество в явном виде.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Сообщение @lex » 26.09.2006 10:57:55

Так значит тут так всё и задумано. А я уж думал, что баг...

И извиняюсь за неформатированность кода, просто эту лабу писал не для себя, а у нас в группе кроме меня для всех слово форматировать ассоциируется только с "format C:" :D
Это всё для консперации :lol:
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 84

Рейтинг@Mail.ru