Смекни!
smekni.com

НН Трушин Информатика (стр. 21 из 37)

В теле оператора For могут находиться другие операторы цикла. При этом внутренние циклы называются вложенными.

Таблица 6.9 Количество повторов тела цикла в операторе For

Оператор S1 < S2 S1 = S2 S1 > S2

For...to

For...downto

S2–S1+1 Не выполняется

1

1

Не выполняется S1–S2+1

Пример. Обнуление элементов матрицы.

For I:=1 to 10

For J:=1 to -5

A[I,J]:=0;

Оператор цикла Repeat имеет следующий формат:

Repeat <оператор>; . . .

<оператор>

Until <условие>;

Условие является выражением логического типа. Операторы, заключенные между словами Repeat и Until, являются телом цикла. Этот оператор цикла имеет три характерные особенности:

• выполняется, по крайней мере, один раз;

• тело цикла выполняется, пока условие равно "ложь";

• в теле цикла может находиться произвольное число операторных скобок Begin...End.

Цикл, организуемый с помощью операторов Repeat...Until, называется циклом с постусловием, так как условие окончания повторов проверяется после выполнения тела цикла. Внутри тела цикла должен находиться оператор, влияющий на значение условия, иначе цикл будет выполняться бесконечно.

Пример. Вычисление суммы четных чисел в интервале от 0 до 10.

Program DemoRepeat;

Var I, Sum: Integer;

Begin

I:=0;

Sum:=0;

Repeat

Sum:=Sum+I;

I:=I+2

Until (I > 10);

Writeln('Сумма четных чисел в интервале 0..10 равна ',Sum) End.

Оператор While аналогичен оператору Repeat, но проверка условия выполнения тела цикла производится в самом начале оператора. Поэтому цикл, организуемый с помощью оператора While, называется циклом с предусловием. Формат оператора While:

While <условие> do <оператор>;

Условие – выражение логического типа, тело цикла – простой или составной оператор. Перед каждым повтором тела цикла вычисляется значение условия. Если результат равен "истина", тело цикла выполняется и снова вычисляется значение условия. Если результат равен "ложь", происходит выход из цикла и переход к следующему оператору. Если перед первым выполнением цикла значение условия было "ложь", тело цикла вообще не выполняется. Как и в операторе Repeat, внутри тела цикла должен быть оператор, определяющий условие выхода. Операторы цикла Repeat и While могут быть вложенными. Пример. Вычисление суммы нечетных чисел в интервале от 0 до 10.

Program DemoWhile;

Var I, Sum: Integer;

Begin

I:=1;

Sum:=0;

While (I < 11) do

Begin

Sum:=Sum+I;

I:=I+2

End;

Writeln('Сумма нечетных чисел в интервале 0..10 равна ', Sum) End.

Во всех операторах цикла можно осуществить преждевременный выход из цикла, используя оператор безусловного перехода Goto. В версии 7.0 языка Turbo Pascal в циклах можно использовать две новые стандартные процедуры – Break и Continue. Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условия выхода. Процедура Continue позволяет начать новый повтор тела цикла, даже если предыдущий не завершен.

6.7. Структурированные типы данных

Структурированные типы данных определяют наборы однотипных или разнотипных компонент. Типы компонент образуются из других типов данных. В языке Turbo Pascal существуют следующие структурированные типы данных:

• массив;

• строка (разновидность массива);

• запись;

• множество;

• файл.

6.7.1. Массивы

Массив состоит из фиксированного числа элементов одного типа. Число элементов устанавливается при описании и в процессе выполнения программы не меняется. Каждый элемент массива имеет индекс, с помощью которого осуществляется доступ к отдельному элементу. Индекс представляет собой выражение простого типа, кроме LongInt и вещественного. Тип индекса определяет границы изменения значений индекса. Существуют две формы объявления массива:

1) Type

<имя типа>=array[тип индекса] of<тип компонент>;

Var

<идентификатор>:<имя типа>;

2) Var

<идентификатор>:array[тип индекса] of <тип компонент>;

Пример. Описания одномерных и двумерных массивов соответственно.

Var

Vector: array [1..4] of Real;

Matrix: array [1..4,1..4] of Word;

Если при описании массива задан один индекс, массив называется одномерным или вектором, если два индекса – двумерным или матрицей, если n индексов – n-мерным. Размерность массива ограничена только объемом оперативной памяти конкретной ЭВМ. Для описания размерностей массива можно использовать предварительно описанные константы:

Const

G1=4;

G2=6;

Var

Mas: array[1..G1,1..G2] of Real;

Элементы массива располагаются в памяти ЭВМ последовательно. Элементы с меньшими значениями индекса хранятся в более низких адресах памяти. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым. Объем памяти, занимаемый массивом, равен произведению количества элементов на объем памяти, занимаемый одним элементом.

После объявления массива каждый его элемент можно обработать, указав идентификатор массива и индекс элемента в квадратных скобках, например, Vector[2], Matrix[2,3]. Поэтому элементы массива называются также индексированными переменными, которые используются в программе так же, как и простые переменные. При работе с массивами возникает несколько типичных ситуаций, рассматриваемых в следующих примерах.

Пример. Инициализация массива. For I:=1 to 4 do Vector[I]:=0.0;

Пример. Ввод элементов массива.

For I:=1 to 4 do Readln(Vector[I]);

Пример. Вывод элементов массива.

For I:=1 to 4 do Writeln(Vector[I]);

Пример. Копирование массива.

For I:=1 to 4 do Vector[I]):=Matrix[I,2];

Пример. Поиск наименьшего и наибольшего элемента массива.

Min:=1E20; {Инициализация выходных переменных}

Max:=-1E-20;

For I:=1 to 4 do

Begin

If (Vector[I] < Min) Then Min:=Vector[I];

If (Vector[I] > Max) Then Max:=Vector[I] End;

При задании значений массиву-константе компоненты указываются в круглых скобках и разделяются запятыми, например

Const

Vector: array[1..4] of Real=(1.0,2.0,3.0,4.0);

Для работы с массивом как с единым целым используется идентификатор массива без указания индекса. При этом возможны только три типа операций: присваивание, отношения "равно" и "не равно", а массивы должны быть идентичных типов и описаны таким образом:

Var A,B: array[1..20] of Real;

A = B;

Результат сравнения будет равен "истина", если значение каждого элемента массива A равно соответствующему значению массива B.

A <> B;

Результат сравнения будет равен "истина", если хотя бы одно значение элемента массива A не равно значению соответствующего элемента массива B. A:=B;

Все значения элементов массива B присваиваются соответствующим элементам массива A. Значения элементов массива B не изменяются.

6.7.2. Строки

Строка – это последовательность символов произвольной длины, но не более 255 символов. При использовании в выражениях строка заключается в апострофы. Строковые данные являются необходимым элементом программ, обрабатывающих текстовую информацию. Форматы описания строки:

1) Type

<имя типа>=string[максимальная длина строки];

Var

<идентификатор>:<имя типа>; 2) Var

<идентификатор>:string[максимальная длина строки];

Если максимальная длина строки отсутствует, то она предполагается равной 255.

Пример. Объявления данных строкового типа.

Const

Common_Disk: string[2]='C:';

Var

File_Name: string[63]; Strk: string;

Для строк применимы операции конкатенации (сцепления) и сравнения.

Операция конкатенации (+) добавляет к первой строке вторую. Пример. Сцепление двух строк.

Var

Str1,Str2,Str3: string;

. . .

Str1:='Turbo';

Str2:='Pascal';

Str3:=Str1+Str2; {В переменной Str3 – 'TurboPascal'} . . .

Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII-кодами соответствующих символов. Считается, что отсутствующие символы в более короткой строке имеют код меньше кода любого действительного символа. Например, 'XS' больше, чем 'X'.

Фактически строка из n символов представляет собой массив из (n+1) символов. К отдельным символам строки можно обратиться по индексу данного символа в строке, который является целочисленным выражением и записывается в квадратных скобках, например, Strk[3]. Нулевой элемент строки (например, Strk[0]) содержит ее текущую длину. Каждый символ строки занимает в памяти ЭВМ 1 байт.