Информатика_Гуда
.pdfГлава 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