Воробьева А.П., Соппа М.С. - Система программирования Турбо Паскаль 7.0 (1092189), страница 13
Текст из файла (страница 13)
Строковая переменная объявляется в разделе описания перемнных следующим образом:
Var
st: string [5];
В квадратных скобках указывается максимальное число символов в строке st.
Под значение строковой переменной в памяти компьютера отводится (МАХ+1) байт, где МАХ – максимальный размер строки. Еще один байт (с номером 0) выделяется для указания текущей длины строки. Это позволяет вводить строки перменной длины (в данном случае от 1 до 5 символов).
В Турбо Паскале разрешается объявлять переменную без указания максимального размера. Например:
Var
fam: string;
В этом случае устанавливается предельно допустимая длина строки, равная 255 символов.
Ввод-вывод строковых данных
При вводе строк, также как и символов, используется оператор READLN. Однако нажатие клавиши <Enter> не является значимым символом. Клавиша <Enter> формирует символ конца строки.
Пример. Организовать ввод фамилии студента.
Var
fam: string;
Begin
writeln(‘Введите фамилию и инициалы студента’);
readln(fam);
……………….
На клавиатуре строка набирается без апострофов, например:
Андреева_С.В. <Enter>
Одновременно с вводом строки в нулевом байте ячейки fam устанавливается длина строки, равная 13 символам.
Вывод строк осуществляется с помощью операторов writeln и write. например, оператор
writeln(‘|’, fam:15, ‘|’);
Выведет на экран строку:
| Андреева С.В.|
Обработка строковых данных
К строковым данным применима операция отношения, напрмер:
‘Паскаль’ > ‘ПАскаль’,
так как код символа ‘а’ больше кода символа ‘А’.
К строкам можно применять операцию сцепления (обозначается символом ‘+’) – объединение нескольких строк в одну.
Пример 1
Program PS_1;
Var
fam, c, fam1: string;
Begin
writeln(‘Введите фамилию студента’);
readln(fam);
c := ‘ ‘;
fam1 := fam + c;
writeln(‘|’, fam1, ‘|’);
End.
На экран будет выведено:
|Андреева С.В. |
Большинство действий над строками реализуется с помощью стандартных процедур и функций. Рассмотрим две стандартные функции.
LENGTH(st) – возвращает длину строки st из нулевого байта, напрмер: Length(fam) = 13 символов.
COPY(st, i, n) – копирует из заданной строки st, начиная с ой позиции, n символов в подстроку.
Пример 2
Шапка экзаменационной ведомости имеет вид:
Напишем программу вывода третьей строки.
Program PS_2;
Const
pr = ‘ ‘; {15 пробелов}
Begin
writeln(‘|п/п|’, pr, copy(pr, 1, 12), ‘|’,
copy(pr,1, 13), ‘|’, copy (pr, 1,7), ‘|’);
End.
На экран будет выведено:
В данной программе введен раздел определения констант CONST, в котором объявлена строковая константа pr, состоящая из 15 пробелов. При выводе из этой константы копируется нужное число пробелов.
Пример 3
Выравнять графу с фамилиями студентов по левому краю.
Program PS_2;
Const
pr = ‘ ‘; {15 пробелов}
Var
fam, fam1: string;
d: integer;
Begin
writeln(‘Введите фамилию студента’);
readln(fam);
d := 15 - Length(fam);
fam1 := fam + copy(pr,1,d);
writeln(‘|’, fam1, ‘|’);
End.
На экран будет выведено:
|Андреева С.В. |
Переменная d в программе определяет количество пробелов, которые надо присоединить к строковой переменной fam, чтобы получить длину строки fam1, равную 15 символам.
ГЛАВА 10. Записи и файлы входных данных
10.1. Понятие записи
Данные типа запись, как и массивы, относятся к сложным структурам. Запись состоит из фиксированного числа элементов, называемых полями. Однако, в отличие от массива, поля могут быть различного типа. Например, записью можно считать строку экзаменационной ведомости:
Андреева С.В. 4 5 5
Данная запись состоит из четырех полей: первое поле - строкового типа (фамилия студента) и три числовых поля (оценки студента).
Описанию переменной типа запись предшествует определение с помощью раздела TYPE. Например, объявление записи строки экзаменационной ведомости выглядит следующим образом.
Type
Zap = record
fam: string;
m, inf, h: integer;
end;
Var
str: Zap;
Здесь zap – имя типа записи; fam, m, inf, h – поля записи;
str – переменная типа запись.
Служебные слова RECORD…END играют роль операторных скобок, внутри которых записываются поля с указанием их типов.
Для обращения к отдельным полям записи используется селектор записи.
Общий вид селектора записи:
< имя записи >.< имя поля >
Например, селекторы записи str записываются следующим образом: str.fam, str.m, str.inf, str.h.
10.2. Файлы входных данных
При большом объеме входных данных ввод с клавиатуры становится неэффективным, так как любые ошибки связаны с повторным вводом всех данных. Целесообразно для входных данных создать отдельный файл и хранить его на диске. В программе в этом случае с помощью специальных процедур организуется чтение входных данных из файла. Имя файла задается по тем же правилам, которые определены в MS DOS, только указывается стандартное расширение .DAT. Для создания файла данных можно воспользоваться любым текстовым редактором. Если файл небольшого объема, то удобно использовать редактор NC. Для вызова редактора NC надо нажать клавиши [<Shift>+ <F4>].
Файловая переменная
В программе файлу соответствует переменная файлового типа. В зависимости от способа объявления файловой переменной можно выделить три вида файлов.
- Типизированные файлы, которые задаются описанием:
<файловая переменная>: FILE OF <тип компонент файла>;
Например, если компоненты файла имеют тип записи, то в разделе описания переменных можно объявить файл следующим образом:
Var
f: file of Zap;
f – файловая переменная.
- Нетипизированные файлы задаются типом FILE, например:
Var
f: file;
Для нетипизированных файлов тип компонент не указывается.
- Текстовые файлы задаются типом TEXT, например:
Var
f: text;
Текстовый файл представляет собой совокупность строк переменной длины. В конце каждой строки после нажатия клавиши <Enter> формируется специальный признак EOLN (End Of Line). Число строк в текстовом файле может быть произвольным. В конце файла автоматически формируется признак EOF (End Of File).
Для проверки окончания чтения файла используется стандартная логическая функция EOF(f).
В дальнейшем ограничимся рассмотрением только текстовых файлов.
Доступ к файлам данных
Файл данных становится доступным программе после выполнения стандартной процедуры открытия файла:
ASSIGN (<файловая переменная>, <имя файла>);
При вызове данной процедуры файловая переменная, объявленная в программе, связывается с именем файла, хранящимся на диске.
<имя файла> - либо строка, либо переменная строкового типа.
Например, если файл входных данных экзаменационной ведомости хранится на диске с именем Wed.dat, то процедуру открытия файла можно записать в виде:
ASSIGN(f, ‘Wed.dat’);
Инициация файла
Инициировать файл означает указать направление передачи данных. В Турбо Паскале можно открыть файл для чтения данных из файла или для записи информации в файл. Если файл является входным, то он инициируется для чтения стандартной процедурой:
RESET(<файловая переменная>);
При выполнении данной процедуры специальный указатель строк устанавливается на начало файла, то есть подготавливается к чтению первой строки.
Чтение данных из файла
Чтение файла осуществляется построчно с помощью оператора READLN, в котором указываются файловая переменная и список переменных ввода.
Пример. Пусть файл данных экзаменационной ведомости состоит из строк вида:
4 5 5 Андреева С.В.
Оператор: Readln(f, str.m, str.inf, str.h, str.fam);
читает из файла строку и присваивает данные полям str.
Заметим, что поле fam записывается в конце строки. Это связано с тем, что при описании типа поля fam (string) не указан его максимальный размер, и, следовательно, конец поля должен быть зафиксирован клавишей <Enter>.
10.3. Пример решения задачи создания документа
Пусть требуется получить результаты обработки экзаменационной ведомости в виде следующего документа.
РЕЗУЛЬТАТЫ ОСЕННЕЙ СЕССИИ ГР.151
№ п/п | Ф.И.О. | Математика | Информатика | Химия | Средний балл |
1 | Андреева С.В. | 4 | 5 | 5 | x |
… | … | … | … | … | … |
20 | Яковлев А.Н. | 5 | 5 | 4 | x |
Ср.оценка по дисциплине | x | x | x | - |
x - расчетные данные.
Решение
Решение задачи можно разбить на два этапа.
I. Создание файла входных данных вида:
4 5 5 Андреева С.В.
…………………………………..
5 5 4 Яковлев А.Н.