Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ПАЯ (1-й семестр).doc
Скачиваний:
10
Добавлен:
20.11.2019
Размер:
1.23 Mб
Скачать

Расширенный синтаксис. Массивы размерности n.

Пусть Т – произвольный тип (кроме файлового).

Для записи типа array[I1] of array [I2] of T и соответствующей перации выборки a [x][y] допустим более компактный синтаксис array[I1 ,I2] of T и a[i,j]

Аналогично вводятся обозначения вида array[I1,…,In] of T и a[i1,…,in];

Обычно такой случай связывается с матрицами размерности n.

Задача: подсчитать частоту вхождений каждой малой буквы в заданный текст.

Вычисляется функция: область определения – символы [‘a’, …, ‘s’], область значения – N (натуральные числа).

{ki – количество вхождений i-ой буквы алфавита}

assign(f,’…’);

reset(f);

for c:=’a’ to ‘z’ do k[c]:=0;

while not eof(f) do

begin

read(f,c);

k[c]:=k[c]+1;

end;

close(f);

Статические массивы выглядят не очень естественным представлением данных в случае последовательностей произвольной длины или функций с расширяемой областью определения. В таких случаях более естественно рассматривать последовательности не более, чем заданной длины (функции, области определения которых содержаться в фиксированном множестве). Назовем такие массивы «псевдодинамическими».

Строки. Динамические массивы.

array of T.

Множество значений: все функции с множеством значений Т и областью определения nN.

Основная операция – операция выборки.

Описание переменной вида a: array of T в реальности определяет функцию с пустой областью определения. Потому, например, присваивание вида a[1]:=1; будет ошибкой.

Реальная область значений определяется динамически, т.е. в ходе выполнения программы с помощью оператора setlength(a,b); a – имя динамического массива; b – выражение, принимающее значения, натурального типа. Текущую длину можно определить с помощью функции length(а). Контроль за выходом за границы массивов в этом случае не осуществляется автоматически.

Обычная операция выборки имеет ту же семантику, что и для статических массивов. Другие (например присваивание) – нет. Смотри далее – ссылочный тип.

Упражнение: запрограммировать операции над последовательностями, представляя их псевдодинамическими и динамическими массивами.

  1. Включение и удаление компоненты с заданным номером или заданным значением.

  2. Объединение, разность, пересечение, множества компонент.

Динамические массивы появляются только в Object Pascal или Delphi, но задолго до этого появляется их частный случай – динамические символьные массивы или строки.

String имеет максимальную длину 255 символов. Кроме очевидных операций выборки, установки длины и функции длины, на типе определены следующие операции:

  1. Конкатенация (сцепление)

S:=S1+S2, где S1=c1,…,cn, S2= c1…cm, S=c1,…,cn,c1…cm

  1. Предикат сравнения строк. Словарный (лексикографический) порядок: S1<S2, S1=c1…cn, S2=c1…cm. Пусть i – наименьшее число, такое что ci<ci. Если такого i не найдено, то строки равны. S1<S2, если ci<ci в смысле установленного ранее порядка на типе char.

‘шабаш’<‘шалаш’

‘шабаш’<‘шабашка’

В случае неодинаковой длины считаем что меньшее слово дополнено нужным количеством пустых символов, которые меньше любого символа алфавита.

В Паскале тип string не считается порядковым, но соответственные функции succ и pred не трудно определить.

Упражнение: сделай это 