Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Вопросы по синтаксису Delphi (https://forum.antichat.xyz/showthread.php?t=30714)

mR_LiNK[deface_0nl 07.01.2007 01:08

Вопросы по синтаксису Delphi
 
Вопрос в следующем::
Как задется открытый массив??
Пример(расчет средней элементов массива):

Код:

...
function Average(a: array of integer): real;
var
  i: Integer;
begin
  for i := 0 to 5 do readln(a[i]);
  Result := 0;
  for I := Low(a) to High(a) do Result := Result + a[i];
  Result := Result / (High(a) - Low(a) + 1);
end;
begin
  writeln(Average(a));

  writeln('Press Enter to exit...');
  readln;
end.
...

Компилятор выдает следующее:
Undeclared identifier:'a'
Что вобщем-то понятно, т.к. переменная 'а' описана только в локальном блоке, т.е. в функции, а не в программе.

Объясните как ее описать в программе, или что нужно исправить, чтобы избаиться от ошибки? :confused:

Deem3n® 07.01.2007 01:22

Чтобы программа заработала добавь
Код:

var a: array [0..5] of integer;
перед
Код:

begin
  writeln(Average(a));
...


mR_LiNK[deface_0nl 07.01.2007 01:33

Это правильно, но не много не то.

должен быть открытый массив
(ограничение на ввод я поставил в качестве примера)

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

Deem3n® 07.01.2007 01:51

Ну тогда замени:
Код:

function Average(a: array of integer): real;
на
Код:

function Average(var a: array of integer): real;
и вообще убери
Код:

for i := 0 to 5 do readln(a[i]);
или замени на
Код:

for i := Low(a) to High(a) do readln(a[i]);
если тебе в этой ф-ции надо вводить данные (странно, почему в ф-ции расчета средней элементов массива нужно вводить данные?)

Потом можешь экспериментировать :
Код:

var p: array [1..10] of integer;

begin
  writeln(Average(p));

  writeln('Third element is ',p[3]);
  writeln('Press Enter to exit...');
  readln;
end.


mR_LiNK[deface_0nl 07.01.2007 01:59

Собрал
получилось следующее(по логике вроде правильно)::
Код:

function Average(var a: array of integer): real;
var
  i: Integer;
begin
  for i := Low(a) to High(a) do readln(a[i]);
  Result := 0;
  for I := Low(a) to High(a) do Result := Result + a[i];
  Result := Result / (High(a) - Low(a) + 1);
  writeln('Srednaya massiva = ', Result);
end;
var
  p: array [0..5] of integer;
begin
  writeln('vvedite el-ty massivy');
  writeln(Average(p));

  writeln('Press Enter to exit...');
  readln;
end.

Единственное есть недочет маленький
результат выводится 2-а раза, почему?
(1-ый раз: Srednaya massiva = .{численный результат}.
2-ый раз:.{численный результат}. )

Deem3n® 07.01.2007 11:01

Цитата:

результат выводится 2-а раза, почему?
1-ый раз это тут:
Код:

writeln('Srednaya massiva = ', Result);
2-й раз тут:
Код:

writeln(Average(p));

_Great_ 07.01.2007 12:25

writeln('Srednaya massiva = ', Result);
writeln(Average(p));

поэтому и два раза. Убери вывод внутри Average()

W!z@rD 10.01.2007 00:18

стоп... я конечно же извиняюсь, а разве не надо указывать длинну?
этоо? = array of integer.
SetLength(a,7)????

mR_LiNK[deface_0nl 10.01.2007 01:23

Цитата:

Сообщение от W!z@rD
стоп... я конечно же извиняюсь, а разве не надо указывать длинну?
этоо? = array of integer.
SetLength(a,7)????

в Delphi есть 2-а понятия массива..
стандартно, при объявлении длина задается принудительно.

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

зы.учишь Delphi говоришь, отметься здесь::
http://forum.antichat.ru/thread30523.html


Время: 06:16