Вопросы темы:
1. Массивы.
2. Строковый тип данных.
3. Множества.
4. Записи.
Массивы.
Массивом называют упорядоченный набор однотипных переменных (элементов). Каждый элемент имеет порядковый номер, называемый индексом. Тип индекса представляет собой интервальный тип и задается в виде a.. b, где a и b – константные выражения целого, символьного или перечисляемого типа. Число элементов в массиве называют его размером. Массивы используются там, где нужно обработать сразу несколько переменных одного типа.
Объявление переменной массива происходит в разделе var. При этом используется зарезервированное слово array, указывается размер массива перечислением значений индексов, а также объявляется тип данных элементов в массиве.
Опишем несколько массивов разного назначения.
var a: array [1..20] of integer;
здесь мы описали массив с именем A, состоящий из 20 целочисленных элементов;
var x,y: array [1..10] of real;
описаны 2 массива с именами x и y, содержащие по 10 вещественных элементов;
Массивы бывают одномерные и многомерные. Массив называется одномерным (линейным), если у каждого из его элементов имеется только один индекс. В двумерном массиве у каждого элемента имеются два индекса.
В математике такие массивы называют матрицами.
Пример.
Const
N=100;
M=5;
Var
X:Array[1..N] Of Real; {массив вещественных чисел}
A:Array[1..M,1..M] Of Integer; {мaтрица целых чисел}.
Для обращения к элементу массива в Pascal-программе указывается имя массива и в квадратных скобках индексы элемента.
Пример:
A [2,4]
а) ввести значение:
read (A[2,4]);
б) изменить значение:
A[2,4]:=5;
в) вывести значение:
write (A[2,4]);
Программа ввода элементов одномерного массива:
program vvod 1;
var A: array [1..10] of integer;
i:integer;
begin
for i:=1 to 10 do
read (A[i]);
end.
Программа ввода элементов двумерного массива:
program vvod 2;
const n=5; m=7;
var A: array [1..n,1..m] of real;
i,j: integer;
begin
for i:=1 to n do
for j:=1 to m do
read (A[i,j]);
end.
Программа для поиска минимального элемента в массиве:
program minim;
const n=10;
var i: byte;
a: array [1..n] of real;
min: real;
begin
for i:=1 to n do read (A[i]);
min:=A[1];
for i:=2 to n do
if min>A[i] then min:=A[i];
write (min);
end.
Строковый тип данных.
Переменная типа строка предназначена для обработки последовательностей символов. Каждый символ является элементом типа char. Строки могут вводиться с помощью стандартных операторов read/readln и выводиться стандартными операторами write/writeln.
Объявляются переменные типа строка в разделе var. При объявлении указываются идентификатор переменной, зарезервированное слово string и, в квадратных скобках, целое число - максимально возможная длина строки. Наибольшая длина строки составляет 255 символов. Если переменная имеет значение с максимальной длиной строки, то при объявлении переменной ограничиваются зарезервированным словом.
Пример:
var
identificator_1: string;
identificator_2: string[20];
identificator _3: string [155];
Значение строкового типа также как и значение типа char при записи внутри программы заключаются в апострофы.
Пример:
identificator _1:='это - компьютер';
identificator _1[1]:='э';
Простейшая операция, которую Pascal позволяет выполнить со строками - это операция конкатенации, или сцепления, или объединения строк в операторе присваивания. Операция записывается с помощью знака "+".
Пример:
identificator_1:='это' + '-' + 'компьютер';
Для обработки строковых данных используется ряд встроенных функций:
1) Length (L) - определяет длину строки, являющуюся значением переменной L. Значение, возвращаемое этой функцией, является целочисленным и отображает реальную длину строки, т.е. может не совпадать со значением длины строки, объявленным при декларации.
Пример 1:
var
L: string[15];
A: byte;
Begin
L:=' Урок ';
A:=length(L);
Write(A)
End.
Пример 2:
Begin
write(length(' Урок '));
End.
2) Copy (L, A, B) - позволяет копировать фрагмент строки являющейся значением переменной L, начиная с позиции A в количестве B, где A и B - целые числа.
3) Pos (L, M) - возвращает результат целочисленного типа, являющийся номером позиции, с которой строка L входит в строку M. Если строки L нет в строке M, то результат - 0.
4) Insert (L, M, A) - вставляет строку L в строку M, начиная с позиции с номером A. Фактически, вставка производится перед указанной позицией.
5) Delete (L, A, B) - удаляет из строки L B символов, начиная с позиции A.
Пример. Разобрать предложение на слова и вывести каждое слово на новой строке экрана.
Алгоритм работы этой программы очень прост - до тех пор, пока в исходной строке предложения s есть хотя бы один пробел, вся часть строки до пробела копируется в строковую переменную w (слово). Если пробелов уже нет (или не было изначально), то вся строка - это одно слово. После обработки очередного слова (в нашем случае - это вывод его на новую строку экрана оператором writeln) обработанная часть строки вместе с пробелом удаляются из s - чтобы следующий шаг цикла не нашел то же самое слово.
var s,w: string; {предложение и слово}
p: integer; {позиция пробела}
begin
writeln ('Введите текст');
readln (s);
repeat
p:=pos (' ',s);
if p>0 then w:=copy (s,1,p-1)
else w:=s;
writeln (w);
delete (s,1,p);
until p=0;
end.
Множества.
Множество - это совокупность элементов одного и того же перечисляемого типа. Оно задается перечислением элементов. Например, множество четных чисел от 0 до 10 в математике записывается так:
{ 0,2,4,6,8,10 }.
В Паскале оно представляется аналогично, только заключается в квадратные скобки:
[0,2,4,6,8,10].
Для объявления множеств используется зарезервированное слово set, за которым указывается тип элемента множества или сами элементы.
Пример:
type A: 5..9;
var
B: set of A;
C: set of char;
D: set of '1'..'5';
Внутри программы элементы множества записываются в квадратных скобках, при этом используется интервальный, перечисляемый типы или их комбинации.
Пример:
e:=['A'..'Q', 'T', 'x'..'z'].
Множества нельзя вводить с клавиатуры и выводить стандартными операторами.
Мощность множества - это максимальное количество элементов в нем. В Паскале оно ограничивается числом 256. Множество может не содержать ни одного элемента. Оно называется пустым и обозначается следующим образом: [ ]. По определению пустое множество является компонентой любого множества.
Над множествами можно выполнять следующие операции.
Объединение (+). Результатом будет множество, состоящее из всех элементов первого и второго множеств без повтора:
Пример:
[1..3, 6, 9..11] + [2..4, 7, 10..12] = [1, 2, 3, 4, 6, 7, 9, 10, 11, 12] = [1..4, 6, 7, 9..12].
Пересечение (*). Результатом будет множество, состоящее из тех элементов, которые присутствуют как в первом, так и во втором множествах.
Пример:
[1..3, 6, 9..11] * [2..4, 7, 10..12] = [2, 3, 10, 11].
Разность двух множеств (-). Результатом будет множество, состоящее из тех элементов первого множества, которых нет во втором.
Пример:
[1..3, 6, 9..11] - [2..4, 7, 10..12] = [1, 6, 9].
Операция in - проверяет принадлежность элемента множеству. Результатом операции будет логическое значение (true или false).
Пример:
2 in [1..4] (true);
8 in [1..7] (false).
Пример программы с использованием множеств.
Сформировать и вывести на экран множество из n символов латинского алфавита (n<20). Если вводимая буква уже есть в множестве, выдать соответствующее сообщение.
Program Mnog_Sim;
Const
N=20;
Var
S: Set Of Char;
B: Char;
I: Integer;
Begin
S:= [];
For I:=1 To N Do
Begin
Writeln (’Введите букву’);
Readln(B);
If B In S Then
Writeln(’Буква ’,B,’ уже есть’)
Else
S:=S+[B];
End;
Writeln(’Буквы, входящие в множество’);
For B:=’A’ To ’z’ Do
If B In S Then
Write(B:2);
End.
Записи.
Записи - это совокупности элементов разных типов, имеющих общее имя и назначение. Примеры записей - адрес человека, анкетные данные, сводка об успеваемости и т.д. Массив - тоже совокупность данных, но одного типа. Компонентами (полями) записи могут быть переменные скалярного типа, строки, а также массивы и другие записи. Сами записи могут образовать массив.
В общем случае в разделе Type запись описывается так:
Type
Имя _ записи = Record
Описания полей;
end; {конец описания записи}
Имена полей в пределах одной записи не должны повторяться.
Пример. Запись, характеризующая адрес человека, очевидно, должна содержать сведения о городе, улице, № дома, № квартиры. Структура соответствующей записи в разделе Type может быть описана следующим образом.
Type
Adres = Record
Gorod: String [20];
Ul: String [20];
Dom: Integer;
Kv: Integer
End;
Пример. Запись, описывающая студента, может иметь следующую структуру: ФИО, номер зачетки, оценки по 5 предметам.
Type
Stud = Record
Fam: String[15];
Im: String[10]
Ot: String[15];
Numz: Integer;
O:Array[1..5] Of Integer
End;
Используя этот тип, сведения о 25 студентах группы можно поместить в массив, описав его так:
Var
Grup: Array[1..25] Of Stud;
RabAnk: Stud; { Рабочая переменная }
При обращении к записи в программе указывается имя записи и через точку имя поля.
Пример.
RabAnk.NumZ:=2100756; {Поле номера зачетки в переменной RabAnk}
RabAnk.Fam:=’Иванов’; {Поле фамилии в переменной RabAnk}
Для массивов записей:
Grup[1].Fam:= ’Смирнова’; {Фамилия первого студента в группе}
Writeln(Grup[i].Numz); {Номер зачетки i–го студента в группе}
Write(Grup[10].O[1]);{оценка по первому предмету 10-го студента}.
Для упрощения обращения к записи может быть использован оператор работы со структурой with. Например, если задана переменная karta типа запись c тремя полями (family, name и age), то вместо присваивания
karta.family:=' Иванов ';
karta.name:=' Иван ';
karta.age:=20;
можно записать
with karta do
begin
family:=' Иванов ';
name:=' Иван ';
age:=20;
end;