Регулярные типы ::= Описание регулярных типов type M = array [ТИ] of ТЭ; Здесь: array (массив) и of (из) - служебные слова Паскаля; ТИ – тип индексов; это любой простой тип, кроме real; ТЭ – тип элементов массива; это любой тип Паскаля. Примеры: type vector=array[1..10] of real; log=array['A'..'Z'] of boolean; Y=array[(вчера,сегодня,завтра)] of integer; code=array[char] of 0..9;
Описание переменных регулярного типа Переменные регулярного типа называются переменными-массивами или попросту массивами. Их значения - массивы (целиком, как единые объекты) соответствующего типа. Как и другие переменные нестандартных типов, массивы описываются двояко: 1) описывается регулярный тип и ему дается имя, после чего при описании переменной- массива указывается это имя: type M=array[ТИ] of ТЭ; var x: M; 2) при описании переменной-массива явно выписывается регулярный тип: var x: array[ТИ] of ТЭ; Конкретные примеры: type vector=array[1..50] of real; var x, y, z: vector; w: array [1..50] of real;
Операции над массивами В Паскале над массивами, как едиными объектами, допускается лишь одна операция – это присваивание: v1:=v2, где v1 и v2 - переменные-массивы обязательно одного и того же типа. Многомерные массивы Паскаль рассматривает такую матрицу A как массив из 2 элементов (из 2 строк), каждый из которых – это массив из 3 чисел. Условно это можно изобразить так: Матрица A описывается так: var A: array[1..2] of array[1..3] of integer; Допускается сокращение этой записи до такой: var A: array[1..2, 1..3] of integer; Здесь слово array выписывается только раз, а все типы индексов указываются в одних квадратных скобках через запятую А
var B: array[1..n1] of array[1..n2] of array[1..n3] of integer; или в сокращенном виде: var B: array[1..n1, 1..n2, 1..n3] of integer; Обращение же к элементам этой кубической таблицы выглядит так: B[i1][i2][i3] или сокращенно B[i1,i2,i3] Точный синтаксис регулярный тип array [ тип ], of тип переменная с индексом [ выражение ], переменная- массив
Пример 1. Даны два вещественных 20-элементных вектора x и y. Требуется вычислить их скалярное произведение S=(x,y)=x 1 *y 1 +x 2 *y x 20 *y 20. Прежде всего договоримся о том, как будут задаваться числа для ввода. По смыслу задачи сначала должны быть заданы все 20 чисел вектора x, а затем – все 20 чисел вектора y: x 1, x 2,..., x 20, y 1, y 2,..., y 20 Но для программы было бы удобнее, если бы числа задавались иначе: x 1, y 1, x 2, y 2,..., x 20, y 20 program scalar(input,output); const N=20; {размер массивов} var x, y: array[1..N] of real; S: real; i: integer; begin {ввод массивов} write('1-й массив: '); for i:=1 to N do read(x[i]); write('2-й массив: '); for i:=1 to N do read(y[i]); {S=(x,y)} S:=0; for i:=1 to N do S:=S+x[i]*y[i]; {вывод S} writeln(S:15:5) end.
Пример 2. Дан текст из малых латинских букв, содержащий не менее 2 букв и оканчивающийся точкой. Подсчитать, сколько различных пар букв входит в этот текст. Пояснения: в текст abaabz входят пары ab (2 раза), ba, aa, bz - всего 4 различных пары. Интересной особенностью этой задачи является то, что в ее постановке никак не фигурирует массив. Однако для решения массив нужен, точнее - нужна матрица, причем в качестве индексов ее строк и столбцов удобно использовать символы - малые латинские буквы. Идея решения. Заведем логическую таблицу T ab…z a b … z и вначале запишем false во все ее клетки. Затем будем вводить символы текста и заносить true в ту клетку, индекс строки которой – это первая буква очередной пары, а индекс столбца - вторая буква пары; например, для пары bz значение true надо присвоить элементу T['b', 'z']. В конце же надо будет подсчитать, в скольких клетках стоит true.
program pairs(input,output); var T: array['a'..'z','a'..'z'] of boolean;; c1,c2: char; {с 1 - первая буква пары, с 2 – вторая} k: integer; begin {начальное заполнение Т} for c1:='a' to 'z' do for c1:='a' to 'z' do T[с 1,c2]:=false; {посимвольный ввод текста и запись true в Т} write('>'); {приглашение к вводу} read(c1); read(c2); {1-я пара} repeat T[c1,c2]:=true; c1:=c2; {к следующей паре} read(c2) until c2='.'; {подсчет числа пар с true} k:=0; for c1:='a' to 'z' do for c2:='a' to 'z' do if T[c1,c2] then k:=k+1; writeln(Ответ:, k) end.