Описание файлов с данными

В данной работе предлагается использовать два типа файлов с исходными данными. Оба файла содержат одну и ту же информацию, но хранят ее в разной форме. Файл с именем Dan.dat представляет собой типизированный файл, каждая запись которого представляет структуру фиксированного типа и размера. Структура каждой записи представлена ниже:

1-ое поле - string[15]; { поле для Фамилии И.О.}

2-ое поле - integer; {поле балла за 1 семестр}

2-ое поле - integer; {поле балла за 2 семестр}

2-ое поле - real; {поле для среднего балла }

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

Петров П.П. 5 3 4.0

Работа с типизированным файлом достаточно проста. Описывается структура записи, содержащая указанные выше поля, Описывается типизированный файл, с записями такого типа (например с именем F), заводится переменная того же типа (например, с именем STUD). После открытия файла для чтения, оператором Read(F,STUD) в структуру STUD считывается информация об очередном студенте.

Работа с текстовым файлом осложнена тем, что в одной записи файла содержится как строка с именем и инициалами студента, так и числовая информация. Кроме того, длина фамилий в разных записях различна (но не больше 15 символов с инициалами). Организовать процедуру чтения одной записи можно по-разному. Например, можно прочесть всю запись в рабочую строку, затем найти в ней, где начинается первое число (символ из диапазона '0'..'9'), все до этого символа скопировать в строку – фамилию. Из остатка взять один символ и превратить в число стандартной процедурой Val(…), пропустить символ (пробел) и также получить вторую целочисленную оценку. Наконец, еще раз пропустив пробел, вырезать изображение среднего балла и процедурой Val(…)получить вещественное значение среднего балла. Все вырезаемые данные присваивать полям структуры данных, описывающих информацию о студенте.

В приведенном разборе контрольного варианта рассмотрен другой алгоритм чтения. Его суть заключается в следующем. Подготавливается рабочая строка длиной не менее 15 символов, для чего она заполняется каким-нибудь символом, в количестве 15 штук. Таким образом, в нулевом байте этой строки будет число 15 – текущая длина строки. Затем из записи файла читается по одному символу и заносится на соответствующее место в рабочую строку. Цикл прекращается, когда будет прочитан второй пробел (отделяющий инициалы от первой оценки). Так как при чтении ведется подсчет количества символов, в конце цикла известна длина фамилии. Из рабочей строки вырезается подстрока найденной длинны, начиная от первого символа, и копируется стандартной строковой функцией Copy(…) в поле структуры для фамилии студента.

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

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

i:=0; { счетчик символов }

P:=0; { счетчик пробелов }

Stud.Name:='---------------'; {поле фамилии заполняем строкой из прочерков на всю длину }

while P<2 do {пока не прочтем второй пробел }

begin

inc(i); { стандартная процедура увеличения на 1 }

read(F,Stud.Name[i]); {читаем из файла по символу в поле имени }

if Stud.Name[i]=' ' then P:=P+1; { подсчет пробелов}

end;

Stud.Name:=Copy(Stud.Name,1,i); { Из полной строки поля фамилии вырезаем подстроку по второй пробел (включительно) и заносим обратно в поле фамилии }

readln(F,Stud.Bal1,Stud.Bal2,Stud.SrBal); { остаток записи файла читаем в поля оценок }

 

Разбор контрольного варианта

Задание

Таблица 31. Данные к заданию 31 варианта

№ вар. Требования к записям, выбираемым из файла и помещаемым в список Тип списка Файл данных
В начало – только с пятерками, в конец – только с тройками S0D dan.txt

 

На основе общего задания и данных таблицы вариантов конкретное задание формулируется следующим образом:

Заполнить нульсвязный список дек данными из файла DAN.TXT,занося в начало дека записи о студентах, у которых все оценки – 5 баллов, а в конец дека – сведения о студентах, имеющих все оценки – 3 балла. Добавить в начало дека запись, в которой вместо фамилии указан тип списка, а вместо первой оценки – число записей с информацией в деке. Вывести в выводной текстовый файл таблицу записей из дека. Созданный дек удалить из памяти.

Содержание программы

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

  • Формирование пустого дека;
  • Открытие входного и выходного файлов;
  • Чтение данных из файла с занесением нужных записей в дек с подсчетом их количества;
  • Добавление информационной записи в начало дека;
  • Вывод в выходной файл информационной записи из дека с удалением этой записи;
  • Вывод "шапки" таблицы в выходной файл;
  • Удаление из дека записей с выводом информации в табличном виде в выходной файл;
  • Закрытие выходного файла.

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

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