Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример 3




Begin

Var

Пример 2.

Begin

Var

Uses

Пример 1.

Процедура Finalize

Процедура SetLength

Динамические массивы

Var

Открытые массивы

Const

Type

Инициализация записей

Const

Инициализация массивов

End.

Begin

Var

Type

Var

Begin

Begin

Else

Begin

Var

Else

Else

Else

Begin

if n < 1 then

Fib:= 0

if n = 1 then

Fib:= 1

if n = 2 then

Fib:= x

Fib:= x*Fib(n-1, x) + Fib(n-2, x);

end;

 

Пример рекурсивной процедуры. Ханойские башни.

 

n: integer;

 

procedure HanoiTowers(n, x, y, z: integer);

if n = 1 then

writeln(x,'->', y)

HanoiTowers(n-1, x, z, y);

writeln(x,’ –> ’, y);

HanoiTowers(n-1, z, y, x);

end;

end;

readln(n);

HanoiTowers(n,1,2,3);

end.

 


Тип «Перечисляемый»

 

<Перечисляемый тип> :: =

(<Список имён значений>)

Первому из элементов <Списка имён значений> придаётся внутренний (недоступный пользователю) номер 0, второму – номер 1, и т.д.


Переменные типа «Перечисляемый»

 

Примеры

v1: (LeftDyrecton, RightDyrecton, BackDyrecton);

MyType2=(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

MyType4=(MyTrue, MyFalse);

MyVar2: MyType2;

MyVar3: boolean;

MyVar4: MyType4;

for MyVar2:=Monday to Friday do writeln(MyVar2); // Ошибка

for MyVar4:=MyFalse to MyTrue do writeln(MyVar4); // Ошибка

for MyVar3:= False to True do writeln(MyVar3); // Выход: False True

Замечание. boolean ≠ (False, True). Вообще говоря.

Замечание. Тип «Перечисляемый – порядковый тип.

 

A: array[1..7] of double = (1, 3, 5, 7, 9, 11, 13);

B: array[1..2, 1..4] of integer =

(

(3, 4, 1, 0),

(5, 2, 7, 6)

);

C: array[1..2, 1..3] of char =

(

(‘a’, ‘b’, ‘c’),

(‘x’, ’y’, ‘z’)

);

 

 

 

MyRecord1 = record

i, j: integer;

x: double;

s: string[7];

end;

 

MyRecord2 = record

mA: array[1..3, 1..3] of char;

S: MyRecord1;

end;

 

R1: MyRecord1 = (i: 4; j: 9; x: 3.14159; s: 'ABCDE');

R2: MyRecord2 = (???);

 

B: array[3..7] of double;

 

procedure P(var A: array of double);

begin

WriteLN('High(A)=', High(A), ' A[High(A)[=', A[High(A)]:0:2);

WriteLN('Low(A)=', Low(A), ' A[Low(A)[=', A[Low(A)]:0:2);

ReadLN;

end;

begin

B[3]:= 3; B[4]:= 4; B[5]:= 5; B[6]:= 6; B[7]:= 7;

P(B);

end.

 

Динамические массивы не имеют фиксированного размера. Память под массив выделяется, когда ему придается значение (!) или по отношению к нему применяется процедура SetLength.

<Объявление динамического массива> ::=

<Имя массива>: array of <Тип>

 

Переменная <Имя массива> в действительности является указателем, однако, знаком ^, процедурами New, Dispose пользоваться по отношению к этой переменной нельзя.


 

procedure SetLength(var <Имя массива>;<Число элементов>: integer);

Под одномерный массив <Имя массива> выделяется место в памяти, объем которого задает <Число элементов>.

Диапазон индексов: 0.. <Число элементов> - 1.


procedure Finalize(var <Имя массива>);

Память из-под переменной <Имя массива> высвобождается.

Альтернатива:

<Имя массива> := Nil;

Процедуру FreeMem применять не следует.

 


program Project1;

{$APPTYPE CONSOLE}

SysUtils;

mA: array of char;

SetLength(mA, 3);

mA[2]:= 's';

writeln(mA[2]);

readln;

end.

 

mA, mB: array of integer;

mC, mD: array [0..10] of integer;

 

SetLength(mA, 11);

mA[0]:= 1;

mB:= mA; // Указатель mB стал указывать туда же, куда и указатель mA.

mB[0]:= 2;

 

mC[0]:= 1;

mD:= mC; // В массив mD скопировано всё содержимое массива mC.

end.

 

Переменная mB есть указатель на тот же динамический массив, что и переменная mA. Значение mA[0] есть 2.

Оператор mB[11]:= 2; не приводит к увеличению числа элементов массива до 12. Ответственность за выход за границы массива (и за всю тяжесть последствий) лежит на программисте.

 





Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 339; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.