Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Informatika_2-y_semestr

.pdf
Скачиваний:
18
Добавлен:
11.04.2015
Размер:
1.98 Mб
Скачать

Информатика 2012г.

31

var I, J:M..N; X:array[M..N] of real;

begin

for I:=M to N do read(X[I]); J:=M;

for I:=M+1 to N do

if X[I] > X[J] then J:=I; writeln(‘Максимальный элемент - ’, X[J]); end.

В качестве типа индекса можно использовать перечисляемый тип, а также диапазон литерного типа:

var Sekond:array [‘A’..’Q’] of char;

Если одномерный массив описать как array [1..N] of char;

то это будет строка символов. Над строками можно выполнять те же действия, что и над обычными массивами. К элементам строки можно обращаться с помощью переменных с индексами. Над строками определены все шесть операций отношения, при ограничении, что можно сравнивать строки одинаковой длины.

Записи

Запись (тип record) – это структура данных, состоящая из фиксированного числа компонентов, называемых полями. При этом поля могут быть различных типов. При определении типа record указывается ее тип и идентификатор (идентификатор поля). Область действия каждого идентификатора поля – это наименьшая запись, в которой он определен.

Записи, как и массивы, используются для описания упорядоченной последовательности величин. Но у них различный механизм выбора компонентов. В случае массива используется вычисляемый выбор компонентов. В записях каждому компоненту дается имя, которое и используется для выбора поля.

Пример определения записи для даты рождения: type Date = record

Day:1..31;

Month:( January, February, March, April, May, June, July, August, September, October, November, December);

Year:integer;

End;

Доступ к элементам (полям) записей производится с помощью конструкции, называемой селектор записи и имеющей общий вид

R.F

где: R-переменная комбинированного типа, F – идентификатор поля.

Информатика 2012г.

32

Опишем переменную типа запись Date var Son:Date;

тогда обращение к полям записей выглядит следующим образом

Son.Day:=15; Son.Month:= November; Son.Year:=1998;

Разрешается использовать тип record при описании других структурированных типов данных, например, создать массив записей. Пример массива записей - для членов семьи нужно записать даты рождения

type Family=(Father, Mother, Son1, Son2); List=array[Family] of Date;

var Z:List;

тогда доступ к полям

Z[Mother].Day:=22; Z[Mother]. Month:= February; Z[Mother]. Year:=1961; Z[Son1].Day:=30;

Z[Son1]. Month:= October; Z[Son1]. Year:=1987;

Синтаксическая диаграмма:

Комбинированный тип

Список полей

Фиксированная часть

Вариантная часть

Информатика 2012г.

33

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Дискриминант

Альтернатива

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

type Alfa=array[1..10] of char; Variety=(Book, Journal, Newspaper);

var V: Variety; Name=record First, Last: Alfa; end; Edition=record Nane1:Name;

Title, Publishers: Alfa; case V of Book:(Year:integer); Journal:(Number:1..12;

Volume:integer; YearJ:1990..2020;);

Newspaper:(Day:1..31; Month:1..12; YearN:integer;);

end;

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

Информатика 2012г.

34

вложена другая вариантная часть. При записи варианта обязательно присутствие круглых скобок.

Оператор над записями With

Этот оператор предназначен для более наглядной и эффективной организации работы с записями, т.к. он используется для сокращения записи составных имен.

Синтаксис:

Пример использования:

if Date.Month=12 then begin Date.Month:=1;

Date.Year:= Date.Year+1; end

else

Date.Month:= Date.Month+1;

Используя оператор with, получим более короткую запись:

with Date do

if Month=12 then begin Month:=1;

Year:= Date.Year+1; end

else Month:=Month+1;

Если задан оператор with R do , то R не должна содержать никакой переменной , изменяемой в операторе with. Например, такой оператор не верен

with Map[I] do begin

………….

I:=I+1;

Информатика 2012г.

35

………….

end;

Оператор with R1, R2, ….Rn do эквивалентен последовательности операторов

with R1 do with R2 do

………….

with Rn do

Множество

Это структурированный тип языка Паскаль как и массив. Множество в математике – это произвольный набор объектов природы, понимаемый как одно целое.

Значение множества как и значения массива, строятся из нескольких значений одного (базового) типа, со следующими ограничениями:

1.вещественный тип использовать нельзя;

2.для целого типа можно использовать только диапазоны.

Вотличие от диапазонов и записей, множество может содержать любое количество различных элементов базового типа от ноля (пустое множество) до всех возможных значений базового типа.

Синтаксическая диаграмма для множественных типов и для изображения множеств:

Множественный тип

Изображение множества

Пример:

Type Primcolor=(RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET); Color= set of Primcolor;

Var Colorset, Colorset1, Colorset2: Color; OneColor: Primcolor;

B:Boolean;

Отметим:

Информатика 2012г.

36

1. Все значения базового типа, образующие конкретные значения множественного типа, должны быть различны;

2. Порядок расположения элементов в множестве никак не фиксируется.

Пример оператора присваивания: Colorset1:=[RED, VIOLET]; Colorset2:=[];

Colorset1:=[BLUE, RED, GREEN];

Однако нельзя записать: Colorset1:=[ BLACK ]; Colorset2:=[WHITE];

Операции над множествами

Пусть S1 и S2 однотипные множества

1. Объединение множеств: S1 + S2 содержит элементы, которые принадлежат либо S1, либо S2, либо тому и другому, например

COL1:=[RED, GREEN];

COL2:=[GREEN, BLUE];

COL:= COL1+ COL2;

Получим COL:[ RED, GREEN, BLUE]

2.Пересечение множеств: S1 * S2 содержит элементы, которые принадлежат как S1 так и S2, например:

COL1:= [ RED, GREEN, BLUE]; COL2:=[ORANGE, RED, VIOLET];

COL:= COL1* COL2; Получим COL:[ RED]

3.Разность множеств (или относительное дополнение): S1 - S2 содержит элементы из S1, которые не принадлежат S2, например:

COL1:= [ RED, GREEN, BLUE]; COL2:=[ RED, GREEN, ORANGE];

COL:= COL1COL2; Получим COL: [ BLUE];

4.Проверка на равенство, неравенство и включение множеств. Бинарные операции обозначаются следующими знаками:

= равенство (совпадение) двух множеств;

<> неравенство множеств; <= проверка на вхождение множества из левого операнда в

множество из правого операнда; >= проверка на вхождение множества из правого операнда в

множество из левого операнда;

Результат операций значение логического типа true или false. [1, 2, 3]=[1, 2] false

 

 

Информатика 2012г.

37

[1, 2, 3] >=[1, 2] true

 

 

[1, 2, 3] <>[1, 3, 4] true

 

5.

Проверка принадлежности множеству. Операция обозначается

 

служебным словом in. Первый операнд должен множество, левый значением

 

базового типа множества

 

 

 

2 in [1..10, 12]

true

 

 

5 in [1, 2, 7, 10]

false

 

В языке Паскаль рекомендуется использовать значения или диапазон целого типа

Type SET1=set of 1..10;

Использование множеств позволяет сокращать громоздкие записи

If (ch=’a’) OR (ch=’b’) OR (ch=’x’) OR (ch=’y’) then S:=ch;

получим при использовании множественного типа if ch in [‘a’, ‘b’, ‘x’, ‘y’] then S:=ch;

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

program parset; var ch:char; Error:boolean; begin read(ch); write(ch); repeat

if NOT(ch in[‘A’..’Z’]) then Error:=true; read(ch);

write(ch); while ch<> ‘ ‘ do begin

if NOT(ch in [‘A’..’Z’, ‘0’..’9’]) then Error:=true;

read(ch);

write(ch);

end;

WRITELN;

If Error then WriteLN(‘ERROR’); read(ch);

write(ch); until ch=’;’; end.

Информатика 2012г.

38

Файлы в языке Pascal

Последовательность это из фундаментальных структур данных. В языке Паскаль используется термин “файл” для обозначения последовательности компонент, причем все компоненты должны быть одного и того же типа. Порядок расположения компонент определяется самой последовательностью. В любой момент времени доступна только одна компонента файла. Другие компоненты доступны путем последовательного продвижения по файлу. Число компонент не фиксируется и называется длиной файла. Файл, не содержащий ни одной компоненты, называется пустым.

Основные действия над файлами:

1.Просмотр файла. Выполняется в результате последовательного продвижения по файлу, начиная с его начала. Доступен только один компонент файла. Менять значения компонентов на новые запрещается.

2.Создание файла. Выполняется в результате добавления новых компонент в конец первоначально пустого файла.

Все остальные действия над файлом являются композицией его просмотра и решения.

Синтаксис:

Вкачестве типа компонент файла разрешается использовать любой простой или структурированный тип за исключением: не допускается тип

имеющий тип-файл.

Для организации работы по вводу-выводу в файл в программе определяются специальные переменные, называемые файловыми переменными. Например:

var f:file of T;

где Т – определяет тип компонент файла.

С каждой файловой переменной также связано понятие текущего указателя файла. Текущий указатель – это скрытая переменная (то есть не явно описанная) которая указывает на некоторый конкретный элемент файла.

Вдействии участвует тот элемент файла, который обозначен текущим указателем. Указатель может перемещаться по файлу.

Пример описания файловых типов и переменных: type Sqwer=file of char;

var F1, F2: Sqwer; table: file of real;

Информатика 2012г.

39

zasd: file of Date;

Операции над файлами

Реализованы в виде стандартных процедур и функций и делятся на четыре основные группы:

1.установочные и завершающие операции;

2.операции ввода/вывода;

3.перемещение по файлу;

4.специальные операции.

Рассмотрим установочные и завершающие операции:

Далее под f-понимаем заранее описанную файловую переменную.

Тогда

Assign(f, str); - присвоение имени файлу, где str – строковое выражение для имени файла. Например: Assign(f, ‘frees.txt’);

Rewrite(f); - создание нового файла. Указатель нового файла устанавливается на начало (компонент под номером 0). Если файл уже существовал, то он стирается.

Reset(f); - установка файла в исходное состояние. Файл должен быть уже создан, указатель устанавливается на начало файла (компонент под номером 0).

Close(f); - закрытие файла. Прекращается доступ к файлу и сбрасываются все его буфера.

Операции ввода/вывода.

Read(f, V1, V2, …, Vn); - считывание из файла. V1, V2, …, Vn – имена переменных того же типа, что и компоненты переменной f. После считывания каждого значения указатель автоматически перемещается на следующую компоненту.

Write(f, V1, V2, …, Vn); - запись в файл. V1, V2, …, Vn – имена переменных того же типа, что и компоненты переменной f.

Перемещение по файлу.

Seek(f, N); - поиск N-й компоненты. N- целочисленное выражение, указатель перемещается на N-ю компоненту файла.

Truncate(f);- отсечение от файла его хвостовой части, начинающейся от текущей позиции указателя включительно.

Дополнительные функции.

EOF(f) – логическая функция возвращает значение true, если указатель файла находится в конце файла, в противном случае false.

FilePos(f) – функция определяет номер текущей компоненты, на которую установлен указатель файла.

FileSize(f) – функция определяет количество компонент файла f.

Общие схемы работы над файлами

Информатика 2012г.

40

Пусть f – описанная файловая переменная. Тогда можно записать следующие стандартные схемы работы над файлами.

1. Просмотр файла ghj.txt Используя цикл предусловием

Assign(f, ‘ghj.txt’); Reset(f);

while NOT EoF(f) do begin

Read(f, компонента); Обработка компоненты; end;

Close(f);

Используя цикл постусловием

Assign(f, ‘ghj.txt’); Reset(f);

repeat

Read(f, компонента); Обработка компоненты; Until EoF(f);

Close(f);

2. Запись фала prd.doc Используя цикл предусловием

Assign(‘prd.doc’);

Rewrite(f);

while признак создания файла do begin

Создание компоненты; Write(f, компонента); end;

Close(f);

Используя цикл постусловием

Assign(‘prd.doc’);

Rewrite(f); repeat

Создание компоненты; Write(f, компонента); Until NoT создание файла; Close(f);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]