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

Информатика_Гуда

.pdf
Скачиваний:
76
Добавлен:
02.06.2015
Размер:
26.2 Mб
Скачать

Глава 6. Алгоритмизация и программирование

4. Что будет выведено на экран?

a)a := [1,2,4,6,7]; b := [1,2,4,7];

if a >= b then writeln('True');

b)x:=5;

if x in [0..3,10..15,20..25] {Проверить принадлежность одному из интервалов} then writeln(“True”);

5. Какие элементы будут входить в множество с в результате следующих операций:

a) a := [1,4,7]; b := [2,4,7,15]; c := a * b; b) a := [1,2,4,6,7]; b := [1,2,4,7]; c := a+b;

c) a := [1,2,4,6,7]; b := [1,2,4,7,10]; c := a - b; d) ñ := b - a;

6. Проверить, является ли введенное с клавиатуры слово правильной записью идентификатора.

Type letter= set of char; Var ident : letter;

wd : string[10]; I : byte;

fl : boolean;

Begin

Readln(wd); fl := false;

Ident := ['A'..'Z', 'a'..'z', '_']; If not (wd[1] in ident)

Then fl := true {ошибка} Else

Begin

Ident := ident + ['0'..'9']; For i := 2 to length(wd) do

If not (wd[i] in ident) then fl:=true

{ошибка}

End;

If fl then writeln('Не верный идентификатор!'); Readln

End.

261

Информатика

6.7.4. Комбинированный тип (записи)

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

Объявление типа записи выглядит следующим образом: TYPE <имя типа> = RECORD <Список полей> END;

Здесь <имя типа> —правильный идентификатор; <Список полей> — список полей; представляет собой последовательность разделов записи, разделяемых точкой с запятой. Каждый раздел записи представляет собой один или несколько идентификаторов полей, отделяемых друг от друга запятыми. За идентификаторами ставится двоеточие и описание типа поля.

Как было указано в п. 6.7.1, запись может быть элементом массива.

Пример:

Type rec = record

a:integer;

b:real;

c:string[10]

end;

Var elem : rec;

tabl : array[1..100] of rec;

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

Например, к полям записи, описанной выше, можно обратиться по именам:

elem.a, elem.b, elem.c, elem.c[5],

a к полям i-го компонента массива записей — по именам:

tabl[i].a, tabl[i].b, tabl[i].c, tabl[i].c[1].

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

262

Глава 6. Алгоритмизация и программирование

WITH <переменная запись> DO <оператор>;

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

WITH <переменная-запись_1>, …<переменная-запись_N> DO <оператор>;

Примеры:

1.With elem do Begin

a:=1998; b:=37.5, c:=’И.И. Петров’ End;

2.For i:=1 to 10 do

With tabl[i] do begin read(a,b); readln(c) end;

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

{Ввод элементов записи} Const Nmax=30;

Type Zap=Record nom : byte;

fio : string[20]; kurs, group : byte;

ocen : array[1..5] of real; end;

arr_zap = array[1..Nmax] of zap; Var list:arr_zap;

n:1..Nmax; i:integer;

Begin

Write('Задайте количество студентов в списке …'); Readln(n);

For i:=1 to n do With list[i] do

263

Информатика

Begin

Write('Задайте личный номер студента'); Readln(nom);

Write('Задайте фамилию'); Readln(fio);

Write('курс и группа'); Readln(kurs, group);

Write('средние оценки за каждый год'); For i:=1 to 5 do readln(ocen[i]); Readln

End

End.

6.8. Типизированные константы

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

CONST < Имя > := < Тип > = < Значение >;

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

Если типизированная константа была объявлена в некотором блоке, то при повторном входе в этот блок она сохраняет то значение, которое имела при выходе из блока.

Нельзя использовать типизированную константу в качестве значе- ния при объявлении других констант или границ типа-диапазона.

Типизированные константы скалярных типов

Примеры:

Type week = (mn, tu, we, th, fr, st, sn); Const day: week = mn;

x: real = 0.25; y: integer= 100;

min: byte= 0; max: byte= 99;

264

Глава 6. Алгоритмизация и программирование

Типизированные константы-массивы и строки

Строки задаются так же, как и скалярные типы:

Пример:

Const suname: string[20] = ’Баланс’;

Массивы. В качестве их значений используется список констант Сn соответствующего типа, отделенных друг от друга запятыми, заклю- ч¸нный в круглые скобки: (C1, C2,…,Cn).

Примеры:

a)Const

CN: array[1..5] of integer = (5, 15, -38, 40, 4); name: array[1..4] of string[12] =

('Алла','Борис','Сергей','Юрий');

symbols: array[1..4] of char = ('+', '-', '*', '/');

b)Const

N = 100; Tóðå

NS = Set of 0..255;

NB: array[1..N] of string[20] = ('Грипп','ОРЗ','Корь'…);

B: array[1..N] of NS=([17,19,95,96], [17,19,90], [3,6,25]…); {количество значений должно совпадать с количеством

элементов описываемого массива} math: array[1..3, 1..2] of byte

= ((3,5), (0,16), (14,9));

Типизированные константы-множества

Константы — элементы множеств задаются по правилам, описанным для множеств, то есть перечислением констант либо диапазоном, например:

a)Type NS = set of byte;

const B1 : NS = [17,19,95,96]; B2: NS = [1,8,10,26];

b)Type letter = set of char;

const L1 : letter = ['a'..'g','R','2','x'..'z'];

c)Type dig = set of 0..9;

const d1: dig = [1..3,6..9]; d2: dig = [0,3,6,9];

265

Информатика

d)

Program typ_con;

Type hvor = set of 1..100; const B:array [1..5] of hvor=

([1,4..7,10,45],[44,56..60,78],[1,2,7],[12,14,16,19..21], [8,9,11..14]);

rus: array [1..5] of string [22] = ('грипп','ангина','коклюш','краснуха','корь');

Var a: hvor; i,j,k,simp: byte;

Begin

a:= [ ]; Repeat

Write ('Очередной симптом'); readln (simp); If simp > 0 then a := a+[simp]

Until simp = 0; j:=1;

While (j<=5) and (a<>b[j]) do inc(j); If j <= 5

Then writeln ('Выявлен(а)', rus[j]) Else writeln ('Диагноз не установлен');

End.

Типизированные константы-записи

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

Пример:

const n = 24; type

person = record

fio : string [20]; age: 17.. 22; rost: byte

end;

gruppa = array [1..n] of person; const gr_1:gmuppa =

((fio: 'Иванов И.И.'; Age: 17; Rost:176), (fio: 'Петров П.П.'; Age: 18; Rost:164), (fio: 'Сидоров С.С.'; Age: 18;Rost: 175) … );

{как указывалось выше, количество перечисленных записей должно совпадать с объявленным числом компонентов массива}

266

Глава 6. Алгоритмизация и программирование

Можнотакжеописатьтипизированныеконстантыпроцедурноготипа, объектного и типизированные константы — указатели.

Для чего нужны типизированные константы? Они освобождают пользователя от ввода данных. Это особенно удобно на этапах отладки и модернизации программ. Типизированные константы позволяют сэкономить время и избежать ошибок.

6.9. Файлы

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

Преимущества использования файлов следующие:

1)данные, организованные в виде файла, могут использоваться в нескольких программах;

2)файл сохраняет свои значения по окончании работы программы;

3)файл — единственный способ размещения данных очень большого объема (если оперативная память не позволяет этого сделать).

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

описать переменную файлового типа одним из способов (в зависи-

мости от типа создаваемого файла):

f : FILE OF <òèï>;

{типизированный файл}

f : TEXT;

{текстовый файл}

f : FILE;

{безтиповый файл}

поместить имя файла в переменную символьного типа (например, name);

связать файловую переменную f с именем файла name:

ASSIGN (f, name);

открыть файл для чтения / записи операторами соответственно: RESET(f) или REWRITE(f);

открыть файл для дополнения (только для текстовых файлов): APPEND(f);

читать / писать запись из файла / в файл, используя переменную (например, zap):

READ(f, zap) èëè WRITE(f, zap);

закрыть файл по окончании работы с ним:

CLOSE(f).

Для обнаружения конца файла используется функция логического типа EOF(f).

267

Информатика

Одновременно могут быть открыты несколько файлов. В ходе выполнения программы один и тот же файл может быть открыт для записи, а затем использован для чтения. Открытый на запись файл изначально является пустым, он содержит лишь маркер конца файла. Каждый оператор write или writeln осуществляет добавление новой информации, после чего маркер сдвигается к новому концу файла. Оператор writeln (в отличие от write) добавляет в файл литеру конца строки. По смыслу, маркер конца файла — это следующая доступная компонента, в которую будет помещен следующий элемент (если он есть).

6.9.1. Типизированные файлы

Типизированными (двоичными) файлами называются дисковые файлы, состоящие из нумерованной последовательности записей (компонент) одинакового типа. Тип записей в файле задается при его объявлении. Длина каждой записи постоянна. Можно определить позицию каждой записи в файле и напрямую считать (или записать) эту запись.

Типизированные файлы полезны для временного хранения информации в процессе выполнения программы или для передачи большого объема промежуточных данных, полученных в одной программе, другой программе.

Примеры:

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

{Создание файла} Type rec = record

fio: string[20]; kurs, group: integer;

End;

Var

zap: rec;

f: file of rec; name: string;

Begin

Writeln( Задайте имя файла'); Readln(name);

Assign(f,name);

268

Глава 6. Алгоритмизация и программирование

{связывает файловую переменную с конкретным именем} Rewrite(f); {создает новый пустой файл}

Write ('Введите фамилию и.о.'); readln (zap.fio); While zap.fio <> '' do

Begin

Write ('курс и группа '); Readln (zap.kurs, zap.group); Write(f, zap);

{занесение содержимого записи zap в файл в двоичном коде}

Write ('фамилия и.о.'); Readln (zap.fio)

End;

Close (f); Writeln(‘Файл создан’)

End.

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

{Обработка файла} {фрагмент программы}

Reset (f); {открыть файл для работы с ним}

While not eof(f) do

{проверить, не достигнут ли конец файла}

Begin

Read(f,zap); {читать запись из файла в переменную zap} With zap do

begin n:=length(fio);

if fio[1]=fio[n] then writeln(fio:20, kurs:3, group:3)

End End;

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

SEEK (f,n)—установитьуказательфайланакомпонентусномеромn.

269

Информатика

Указатель перемещается к компоненте с номером n, начиная счет с нуля, т. е. первая компонента файла имеет номер 0, вторая — 1 и т. д.

FILESIZE(f) — определить количество компонент в файле.

{Добавление записей (в конец файла)} Reset (f);

Seek (f, filesize(f));

{установить указатель за последней компонентой файла} Writeln('задайте фамилию и. о. '); readln (zap.fio); While zap.fio < > ’’ do

Begin

Write('курс и группа'); readln(zap.kurs, zap.group);

Write (f,zap);

Write (‘фамилия и.о. ‘); readln (zap.fio) End;

Close(f);

6.9.2. Текстовые файлы

Текстовые файлы состоят из символов, объединенных в строки. Длина строки текстового файла переменная (от 0 до 255 символов). В конце каждой строки файла размещается признак конца строки: это последовательность кодов ASCII — 13 (CR) и 10 (LF). В конце всего файла — признак конца файла: код ASСII — 26 (CTRL — Z).

Текстовый файл, в отличие от типизированного, является последовательным. Он может быть открыт для записи, чтения или дополнения.

Для доступа к записям текстового файла используются процедуры read, readln, write, writeln. В них можно указывать переменное число параметров. Параметры могут иметь тип: integer (или другой целочисленный), real, char, string, boolean (последний — в процедурах вывода).

Формат определения операторов ввода-вывода: READ[LN] ([f,] <список ввода>);

WRITE[LN] ([f,] <список вывода>); здесь — f — имя файловой переменной.

Элементы, заключенные в квадратные скобки, не являются обязательными в операторах ввода-вывода. Если файловая переменная указана, осуществляется обращение к дисковому файлу или к логическому устройству. П р и м е р ы логических устройств: CON —клавиатура или экран дисплея; PRN — принтер.

270