Комбинированные типы. записи
Цель работы. Получение навыков в организации ввода-вывода значений комбинированных типов данных и программирования задач с использованием записей.
Задание. Описание структуры записи. Работа с комбинированными типами данных.
Постановка задачи. По условия задания составить структуру записи. Написать программу для обработки данных сложной структуры.
Варианты заданий
1. Вывести фамилии, имена и отчества всех студентов мужского пола, старших 18 лет.
2. Вывести фамилии, имена и отчества студентов мужского пола, не сдавших более двух экзаменов.
3. .Вывести фамилии студентов женского пола, имеющих "5" по информатике.
4. Для студентов, имеющих все отличные оценки, заменить все отличные оценки, заменить величину стипендии на повышенную и вывести по ним всю информацию, за исключением пола.
5. Для студентов, имеющих хотя бы одну неудовлетворительную оценку, заменить величину стипендии на ноль. Вывести фамилии этих студентов и их отметки по всем предметам.
6. Для студентов, имеющих "5" по физике, вывести фамилию, имя, отчество, средний балл и стипендию.
7. Вывести фамилии, имена, отчества и отметки по физике студентов, имеющих средний балл, больше чем 4,5.
8. Подсчитать число студентов, которые моложе 16 лет, и вывести все данные о них.
9. Вывести фамилии и средние баллы студентов, имеющих "5" по информатике.
10. Вывести фамилии студентов, имеющих все удовлетворительные оценки и не получающих стипендии.
11. Вывести фамилии, имена, отчества и средние баллы студентов, не получающих стипендии.
12. Найти среднюю величину стипендии и вынести фамилии, имена и отчества студентов, чья стипендия меньше средней более чем на 20%.
13. Вывести фамилии студентов, пропустивших более двух экзаменов.
14. Вычислить средний балл всех студентов по всем предметам. Вывести фамилии студентов, средний балл которых больше, чем общий средний балл.
15. Для студентов, имеющих только положительные оценки, вывести фамилию, имя, отчество и стипендию.
16. Для группы Пт2-97 вывести фамилии студентов мужского пола старше 18 лет.
17. Для заданной группы вывести фамилии, имена и отчества студентов, не сдавших более двух экзаменов.
18. Для студентов группы ФЗ-97, имеющих "5" по физике, увеличить величину стипендии на заданную величину и вывести все данные о них, за исключением пола и группы.
19. Подсчитать число студентов, имеющих все отличные оценки, в группе С5-97. Вывести фамилии, имена, отчества и величину стипендий этих студентов.
20. Для студентов группы Ф5-96, имеющих хотя бы одну неудовлетворительную оценку, заменить величину стипендии на 0. Вывести фамилии этих студентов и их отметки по всем предметам.
21. Вывести фамилии студентов групп ЭТ9-97 и ЭТ10-97, имеющих хотя бы одну неудовлетворительную оценку.
22. Для студентов заданной группы, имеющих средний балл, больший 4.5, вывести фамилию, имя, отчество и средний балл.
23. Для заданных трех групп подсчитать число студентов, которым меньше 16 лет, и вывести все данные о них.
24. Для группы ЭЗ-97 вывести фамилии и средний балл студентов, имеющих "5" по информатике.
25. Для заданной группы вывести фамилии студентов, не получающих стипендии. Вычислить, сколько из них имеет все положительные оценки.
26. Для заданной группы вывести фамилии, имена и отчества студентов, имеющих “5” по информатике и не получающих стипендии.
27. Для групп С8-97 вычислить среднюю величину стипендии. Вывести фамилии студентов этой группы, чья стипендия меньше средней более чем на заданную величину.
28. Для заданных четырёх групп вывести фамилии студентов, пропустивших более двух экзаменов.
29. Для студентов групп Пт1-96 вычислить средний балл по информатике. Вывести фамилии студентов, чья оценка по информатике выше среднего балла.
30. Для группы Ф3-97 вывести фамилии студентов, имеющих только положительные оценки.
Файлы
Файл – это, с одной стороны, именованная область внешней памяти ПК (жёсткого диска, гибкой дискеты, электронного «виртуального» диска), содержащая какую-либо информацию.
С другой стороны, под файлом понимают логическое устройство – потенциальный источник или приёмник информации (один из многих структур данных).
Любой файл имеет три характерные особенности:
1. У файла есть имя, что даёт возможность программе работать с несколькими файлами. Но один и тот же файл не может быть одновременно открыт для чтения и для записи.
2. Файл представляет собой последовательность элементов одного типа. Типом компонентов может быть любой тип Турбо Паскаля, кроме файлов.
3. Длина файла, то есть количество элементов в нём, не задаётся при его объявлении и ограничивается только емкостью устройств внешней памяти. Место элемента не определяется индексом и каждый элемент становиться доступным только после перебора всех предыдущих элементов. Такие файлы называются последовательными файлами.
Если программа работает с внешними файлами, то их необходимо объявить.
Логическая структура файла очень похожа на структуру массива. Различия заключаются в следующем. У массива количество элементов фиксируется в момент распределения памяти и постоянно находится в ОЗУ, нумерация элементов массива начинается с единицы. У файлов количество элементов может изменяться, нумерация начинается с нуля (кроме текстовых файлов).
Файловый тип или переменную файлового типа можно задать одним из трёх способов:
Var <имя> : FILE OF <тип>;
<имя> : TEXT;
<имя> : FILE;
Здесь <имя> – имя файлового типа (идентификатор);
FILE, OF – зарезервированные слова (файл, из);
TEXT – имя стандартного типа текстовых файлов;
<тип> – любой тип Турбо Паскаля, кроме файлов.
Например, VAR F1 : FILE OF CHAR;
F2 : TEXT;
F3 : FILE;
Классификация файлов
В зависимости от способа объявления можно выделить три вида файлов:
· Типизированные файлы (задаются предложением FILE OF);
· Текстовые файлы (определяются типом TEXT);
· Нетипизированные файлы (определяются типом FILE);
Вид файла определяет способ хранения информации в файле.
В зависимости от метода доступа различают:
· Файлы последовательного доступа;
· Файлы прямого доступа.
Типизированные и нетипизированные файлы относятся к файлам прямого и последовательного доступа, а текстовые файлы – к файлам последовательного доступа.
В программе необходимо сообщить сведения о внешнем файле – его имя и местоположение при помощи оператора ASSIGN, который логически связывает имя файла в программе с именем файла на диске.
Формат оператора:
ASSIGN(intname, extname),
где intname – внутреннее имя файла или файловая переменная;
extname – внешнее имя файла (стринговая переменная, например, string[w], которая предназначена для хранения текста длинной w, составленного из значений типа char).
Например, ASSIGN(F,’D:\PROGRAM.DAT’);
Примечание. Не сможем связать некоторую файловую переменную с файлом посредством процедуры ASSIGN, в том случае, если данный файл уже открыт.
Чтение файла
Под чтением файла понимают ввод данных из внешнего файла, находящегося на диске, в оперативную память машины. Данные внешнего файла становятся доступны программе.
Для чтения файла необходимо выполнить следующие действия:
1. Открыть файл для чтения оператором RESET(имя файла);
2. Ввести данные файла в программу: READ(имя файла, параметры);
3. Закрыть файл для чтения CLOSE(имя файла);
Файл, из которого считываются данные, называется входным файлом.
Оператор RESET может встречаться неоднократно. После его выполнения указатель файла устанавливается на первый элемент и готов к чтению сначала, то есть данные внешнего файла можно считать более чем один раз.
Так как число элементов не задаётся, то для определения конца ввода используется стандартная функция EOF(имя файла). Если указатель файла находится за последним элементом, то функция принимает истинное значение, в противном случае – ложное.
Например,
{раздел описаний}
…
begin
{главная программа}
ASSIGN(F,’D:\PROGRAM.DAT’);
RESET(F);
…
{текст программы}
…
WHILE NOT EOF(F) DO
BEGIN
…
END;
CLOSE(F);
…
END.
Запись файла
Под записью файла понимается вывод результатов программы из оперативной памяти на диск, то есть создание нового файла на внешнем устройстве.
Для записи файла необходимо:
1. Открыть файл для записи оператором REWRITE(имя файла);
2. Вывести данные оператором WRITE(имя файла, параметры);
3. Закрыть файл для записи CLOSE(имя файла);
Внешний файл, в который записываются данные, называется выходным.
Например, VAR F : TEXT;
begin
ASSIGN(F,’D:\TEST.DAT’);
REWRITE(F);
WRITELN(F,’Привет!’);
CLOSE(F);
end.
Если после создания текстового файла необходимо ввести в него дополнительную информацию, то используют оператор APPEND (F).
Например, VAR F : TEXT;
begin
ASSIGN(F, ‘…’);
REWRITE(F); //
WRITELN(F, ‘Привет!’);
APPEND(F);
WRITELN(F, ‘Мир!!!’);
CLOSE(F);
end.
Если в операторе на месте имени внешнего файла указать стандартное устройство клавиатуры, то данные можно будет вводить с клавиатуры ‘con:’: ASSIGN(F,’CON:’);
Для вывода результатов на печать в качестве внешнего файла необходимо указать печатающее устройство: ASSIGN(F, ‘PRN:’); Необходимо подключить стандартный библиотечный модуль PRINTER.
При обращении к стандартным функциям и процедурам ввода/вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибок программа прекращает работу и выводит на экран сообщение. С помощью директив компилятора {$I-} и {$I+} автоматическую проверку ошибок ввода/вывода можно отключить или выключить. Если автоматическая проверка отключена, ошибки ввода/вывода, возникающие при работе программы, не приводят к её останову. Стандартная функция IORESULT возвращает код ошибки. Нулевое значение кода ошибки означает нормальное завершение операции ввода/вывода.
Задача 12.1. Сформировать файл, состоящий из 10 целых чисел. Считать данные из файла, посчитать их сумму и вывести их на экран.
Листинг программы
PROGRAM TASK1;
USES CRT;
CONST N = 10;
VAR F : FILE OF INTEGER;
X : ARRAY[1..N] OF INTEGER;
I : INTEGER;
S : LONGINT;
ROAD : STRING[30];
BEGIN
CLRSCR;
RANDOMIZE;
ROAD := 'E:\PASCAL\FILE\TASK1.DAT';
{$I-}
ASSIGN(F,ROAD);
IF IORESULT <> 0 THEN WRITELN ('ERROR ON CREATE FILE!')
ELSE
BEGIN
REWRITE(F);
IF IORESULT <> 0 THEN WRITELN ('ERROR ON OPEN/WRITE FILE!') {$I+}
ELSE
BEGIN
{$I+}
FOR I := 1 TO N DO
BEGIN
X[I] := RANDOM(21)-10;
WRITE(F,X[I]);
END;
CLOSE(F);
END;
{$I-}
S := 0;
I := 1;
RESET(F);
IF IORESULT <> 0 THEN WRITE ('ERROR ON OPEN FILE!') {$I+}
ELSE
BEGIN
{$I+}
WHILE NOT EOF (F) DO
BEGIN
READ(F,X[I]);
WRITELN(X[I]);
S := S + X[I];
INC(I);
END;
WRITELN('S=',S:4);
CLOSE(F);
END;
END;
READLN;
ERASE(F);
END.
Задача 12.2. Сформировать файл из 5 компонент строкового типа, считать их из файла. Если первые две компоненты – числа, то образовать их них число и определить является ли оно чётным или нет.
Листинг программы
ROGRAM TASK2;
USES CRT;
CONST N = 5;
ROAD = 'E:\PASCAL\FILE\TASK2.DAT';
VAR F : TEXT;
I : BYTE;
C : CHAR;
S : STRING;
SUM, CODE : INTEGER;
D : ARRAY[1..N] OF STRING;
BEGIN
REPEAT
CLRSCR;
{$I-}
ASSIGN(F,ROAD);
IF IORESULT <> 0 THEN BEGIN WRITELN ('ERROR ON CREATE FILE!');
HALT;
{$I+}
END
ELSE
BEGIN
REWRITE(F);
IF IORESULT <> 0 THEN BEGIN WRITELN ('ERROR ON OPEN/WRITE FILE!');
HALT;
{$I+}
END
ELSE
BEGIN
{$I+}
FOR I := 1 TO N DO
BEGIN
READLN(D[I]);
WRITELN(F,D[I]);
END;
END;
END;
CLOSE(F);
{$I-}
RESET(F);
IF IORESULT <> 0 THEN BEGIN WRITELN ('ERROR ON READ FILE!');
HALT;
{$I+}
END
ELSE
BEGIN
{$I+}
I := 1;
WRITELN('OUTPUT');
WHILE NOT SEEKEOF(F) DO
BEGIN
READLN(F,D[I]);
WRITELN(D[I]);
INC(I);
END;
CLOSE(F);
END;
WRITELN;
S := D[1] + D[2];
VAL(S,SUM,CODE);
IF CODE <> 0 THEN WRITELN ('ERROR IN STATEMENT')
ELSE
BEGIN
IF NOT ODD(SUM) THEN WRITELN ('YES')
ELSE WRITELN ('NO');
END;
WRITE('CONTINUE Y/N ?');
READLN(C);
UNTIL (C = 'N') OR (C = 'n');
ERASE(F);
END.
Вопросы для самопроверки
1. Дайте определение файла?
2. Каков формат объявления файловых переменных?
3. Какая существует классификация файлов по способу объявления?
4. Какая существует классификация файлов в зависимости от метода доступа?
5. Каков формат оператора assign?
6. Как организовать чтение файла?
7. Каков формат оператора reset?
8. Как осуществить запись файла?
9. Какие глобальные директивы компилятору позволяют отключить (включить) автоматическую проверку ошибок ввода/вывода?
Лабораторная работа №12