Макарчукова А.А., гр. ВР 2-2
Лабораторная работа №4
Обработка одномерных массивов. Простые циклы
Теоретическая часть
Оператор цикла с параметром
Практически во всех задачах, связанных с обработкой массивов, используется оператор цикла с параметром. Этот оператор предусматривает повторное выполнение одного или нескольких операторов с одновременным изменением по правилу арифметической прогрессии значения параметра этого цикла. Общий вид записи этого оператора:
For i:=m1 To m2 Do S
или
For i:=m1 Downto m2 Do S
где For (для), To (до), Downto (вниз до), Do (выполнить) – служебные слова; i – параметр цикла (переменная любого скалярного типа, кроме вещественного); m1 и m2 – начальное и конечное значения параметра цикла, записываются константами или выражениями того же типа, что и тип переменной цикла; S – тело цикл (простой или составной оператор).
Тело цикла выполняется для каждого значения параметра цикла, начиная со значения m1 и до значения m2 включительно. При использовании в цикле служебного слова To значение параметра цикла увеличивается автоматически с помощью функции Succ, при Downto – уменьшается с помощью функций Pred. Шаг изменения параметра цикла зависит от типа этой переменной. Наиболее часто используется переменная целого типа, что определяет шаг, равный +1 при To, и -1 при Downto.
Правила организации цикла:
запрещено изменять в теле цикла значения параметра цикла, переменных m1и m2.;
запрещено входить в тело цикла с помощью оператора Goto, минуя заголовок оператора For, так как значение параметра цикла будет не определено;
цикл не выполнится вообще, если начальное значение параметра цикла больше (при Downto – меньше), чем конечное;
по окончании выполнения цикла значение параметра цикла не определено и не может быть непосредственно использовано в дальнейших вычислениях;
из составного оператора, входящего в тело цикла, можно выйти до окончания цикла с помощью оператора Goto, тогда последнее значение параметра цикла сохраняется.
в операторах цикла можно использовать стандартные процедуры Break и Continue. Процедура Break позволяет досрочной выйти из цикла, не дожидаясь выполнения условия выхода. Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена.
2. Массивы
Массив (регулярный тип данных) представляет собой фиксированное количество упорядоченных компонент, снабженных индексами. Все компоненты должны быть одного и того же базового типа. В качестве базового типа можно использовать любой из допустимых в Паскале типов. В зависимости от числа индексов массивы бывают одномерные, двумерные, трехмерные и т.д. Число индексов у массива не более 7, суммарная длина внутреннего представления любого массива не должна превышать 2 Гайта.
Для определения регулярного типа необходимо задать следующие характеристики: тип компонент массива, а также количество и «способ нумерации его компонент. Последние характеристики задаются посредством указания типа индекса. Определение регулярного типа имеет следующий общий вид:
Type A = Array [tl] of t2;
где Type (тип), Array (массив), of (из) – служебные слова; tl – тип индекса; t2 – тип компонент (записывается аналогично типу простых переменных), A – идентификатор нового типа, он может быть использован в описании переменных.
В качестве типа индекса может выступать любой порядковый тип, кроме LongInt, обычно используется ограниченный тип, в котором задаются границы изменения индексов. Границы изменения индексов должны быть константами, причем нижняя граница не должна превышать верхнюю.
Примеры описания массивов:
Const n=4;
Type M1 = Array [1…100] of Real;
M2 = Array [Char] of Boolean;
M3 = Array [0…n] of Integer;
Var x,y: M1;
C: M2;
A: M3;
Регулярный тип можно задавать непосредственно при описании переменных;
Const m=5;
Var B,D: Array [1…50] of Char;
Z: Array [1…m] of Real;
Количество компонент массива всегда должно быть фиксировано, т.е. определяться при трансляции программы. Это считается определенным недостатком языка, так как не во всех программах можно заранее предсказать необходимый размер массива, который может определяется в зависимости от тех или иных условий, возникающих в процессе исполнения.
Доступ к компонентам (элементам) массива строится традиционно: после идентификатора массива в квадратных скобках указывается индекс нужного элемента или список индексов, определяющий элемент многомерного массива. В качестве индексов могут выступать произвольные выражения, тип которых должен соответствовать типу индексов в описании массива, например: x[3], s[k+1]. Значение индекса не должно выходить за допустимые пределы. В простейших вариантах такие ошибки обнаруживаются при компиляции программы: например, для массива:
Var M: Array[0…10] of Real;
Обращение вида M[11]:=0.5 является некорректным, так как индекс 11 не принадлежит ограниченному типу 0…10, и вызывает прекращение трансляции с выдачей соответствующего диагностического сообщения, однако оператор присваивания
M[i]:=M[i-1]+i
компилятор не может квалифицировать как ошибочный, так как его корректность зависит от текущих значений индексов i и i-1. Если в процессе выполнения программы значение i лежит в диапазоне от 1 до 10, то этот оператор выполнится правильно; в противном случае будет зафиксирована ошибка выполнения.
Компонента массива считается переменной; она может получать значения (например, в операторе присваивания), а также участвовать в выражениях, где она представляет значение, помещенное в соответствующий элемент данного массива. Операции над компонентами массива полностью определяются их типом (базовым типом массива). Например:
V[i]:=V[i-1]/n
В операторах присваивания можно использовать и массивы, например:
Vect1:=Vect2
причем типы обоих массивов в данном случае должны быть эквиваленты.
Операции отношения над массивами не определены. Нельзя, например, записать If Vect1=Vect2 then… даже, если массивы Vect1 и Vect2 одного типа. Сравнение двух массивов надо проводить по элементам