ГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ВЫСШЕМУ ОБРАЗОВАНИЮ
ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЛГОРИТМИЧЕ...
17 downloads
208 Views
370KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ВЫСШЕМУ ОБРАЗОВАНИЮ
ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЛГОРИТМИЧЕСКИЕ ЯЗЫКИ И ПРОГРАММИРОВАНИЕ Методические указания к лабораторным и индивидуальным работам
ПЕНЗА 2000
УДК 681.3 Содержаться сведения, необходимые для выполнения лабораторных и индивидуальных работ по основам программирования на алгоритмическом языке Турбо Паскаль с использованием файлов и динамических структур данных; приводятся примеры создания программ, варианты заданий для выполнения лабораторных работ. Методические указания разработаны на кафедре “Системы автоматизации проектирования” и предназначены для студентов специальности 220300. Ил. 7, табл. 2, библиогр. 5 назв. Составители : Л. И. Аксенова, Л. В. Игошина Рецензент: к.т.н., доцент кафедры ВМ и С ПТИ Бершадская Е.Г.
2
1. Работа с файлами 1.1. Файлы и их виды в Турбо Паскале В процессе отладки программ часто приходится вводить с клавиатуры одни и те же данные, возможно, большого объема, что занимает много времени. Для того чтобы не повторять этот ввод при каждом запуске программы на выполнение, обычно записывают и хранят данные во внешней памяти - в файлах. Кроме того, файлы используют для хранения промежуточных данных, с целью экономии оперативной памяти, и для записи результатов работы программ с целью их последующего использования в других программах в качестве входной информации или для просмотра этих результатов после завершения работы программы. Под файлом понимается либо именованная область внешней памяти компьютера (жесткого или гибкого диска, электронного виртуального диска и т. п.), либо логическое устройство - потенциальный источник или приемник информации [1]. Любой файл имеет имя, состоит из компонент заданного типа, число этих компонент заранее не задается и ограничивается только объемом внешней памяти. Для использования файлов в программе должна быть объявлена переменная файлового типа. В зависимости от способа объявления переменной файлового типа различают три вида файлов [2]: - текстовые файлы (задаются с помощью типа TEXT); - типизированные файлы (задаются описанием FILE OF...); - не типизированные или безтиповые файлы (задаются типом FILE); Переменная файлового типа или просто файловая переменная должна быть объявлена в разделе VAR одним из следующих трех способов: <ИМЯ> : TEXT; <ИМЯ> : FILE OF <ТИП>; <ИМЯ> : FILE; <ИМЯ> - имя файловой переменной (правильный идентификатор); <ТИП> - любой тип ТР кроме файлов. Например: Type Spisok = Record { Описание типа структуры} Nom: byte; FIO: string[30];
3
Adres: string; End; Var F1: File; { Описание безтипового файла} F2: Text; { Описание текстового файла} F: File of Spisok; { Описание типизированного файла} F_sim: File of char;{Описание файла, содержащего только символы} 1.2. Доступ к файлам Любой программе доступны два предварительно объявленных файла со стандартными файловыми переменными: INPUT - для чтения данных с клавиатуры; OUTPUT - для вывода на экран дисплея; Любые другие файлы, а также логические устройства становятся доступны программе только после выполнения процедуры связывания файловой переменной с именем существующего или создаваемого файла и открытия его для чтения или записи. Связывание производится с помощью стандартной процедуры: ASSIGN(<файловая переменная>,<имя файла или логическое устр-во>); Файловую переменную называют также логическим именем файла. Имя файла - это любое выражение строкового типа, которое строится по правилам определения имен в операционной системе MS-DOS [3]. Имя файла может содержать до 8 разрешенных символов (прописных и строчных букв латинского алфавита, арабских цифр или специальных символов: ! @ # $ % ^ & ( ) ~ ′ _ ). За именем может следовать расширение, содержащее до трех разрешенных символов, которое отделяется от имени точкой. Если файл располагается не в одном каталоге с использующей его программой, то перед именем должен указываться путь к файлу. Различают полный путь к файлу, состоящий из имени диска и имен каталогов вышестоящих уровней, и относительный путь, состоящий из имен каталогов и символов “..”, обозначающих родительский каталог. Имена каталогов отделяются друг от друга символом “ \ ”. Имя диска - это один из символов A ... Z после которого ставится двоеточие. Путь к файлу вместе с именем и расширением называют полным именем файла. Например:
4
C:\MYDIR\K1\file.dan - полное имя файла, расположенного на диске С:, MYDIR\K1\ - имена каталога и подкаталога, составляющих путь к файлу, а file.dan - имя файла и расширение. Максимальная длина полного имени файла - 79 символов. В ТР можно открыть файл для чтения, для записи информации, а также, в случае использования типизированных файлов, для чтения и записи одновременно. Для чтения файл открывается с помощью стандартной процедуры: RESET ( <файловая переменная>); При выполнении этой процедуры дисковый файл подготавливается к чтению информации: в результате специальная переменная - указатель, связанная с этим файлом, будет указывать на начало файла, т.е. на компонент с порядковым номером 0. Если в процессе выполнения программы делается попытка открыть для чтения не существующий файл, то возникает ошибка, которая может быть проанализирована с помощью встроенной функции IOREZULT типа Word. В случае отсутствия файла, открываемого для чтения значение этой функции не равно 0. Для записи файл открывается с помощью стандартной процедуры: REWRITE ( <файловая переменная>); Эта процедура подготавливает новый файл к приему информации, устанавливая указатель на компонент файла с номером 0. Если файл уже существовал, то его содержимое будет уничтожено. Добавление информации в уже существующий файл для различных видов файлов производится различными способами и они будут рассмотрены позже. По завершении работы с файлом его необходимо закрыть с помощью стандартной процедуры: CLOSE ( <файловая переменная>); При создании нового или изменении имеющегося файла эта процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры CLOSE выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Для определения конца файла используется стандартная функция: EOF ( <файловая переменная>) Эта функция возвращает значение типа BOOLEAN. Значение этой функции равно TRUE, если файловый указатель стоит в конце файла, т.е. встретился
5
признак конца файла, и FALSE - в противном случае. При записи это означает, что очередной компонент будет добавлен в конец файла, а при чтении - что файл исчерпан. Физический файл может быть переименован в процессе работы программы с помощью процедуры: RENAME ( <файловая переменная>, <новое имя файла на диске>); Новое имя - строковое выражение (см. процедуру ASSIGN). Перед использованием этой процедуры файл должен быть закрыт. Физический файл может быть удален с помощью процедуры: ERASE ( <файловая переменная>); Перед использованием процедуры удаляемый файл должен быть закрыт. 1.3. Лабораторная работа № 1 Текстовые файлы Цель работы: Ознакомиться с процедурами ввода-вывода для текстовых файлов и особенностями работы с ними. Приобрести навыки разработки программ с использованием текстовых файлов. Теоретическая часть Текстовые файлы предназначены для хранения текстовой информации и представляют собой совокупность строк переменной длины. Они связываются с файловыми переменными, имеющими тип TEXT. Доступ к каждой строке текстового файла возможен лишь последовательно, начиная с первой. Текстовый файл может быть создан с помощью редактора ТР. При создании текстового файла в конце каждой записи (строки) ставится специальный символ EOLN (End Of LiNe - конец строки), а в конце всего файла - признак EOF (End Of File- конец файла). EOLN - последовательность двух кодов из ASCII #13 (CR) и #10 (LF). EOF - код #26 из ASCII (American Standard Code for Information Interchange американский стандартный код для обмена информацией). Доступ к записям текстового файла реализуются с помощью процедур: READ и READLN - для чтения данных из файла; WRITE и WRITELN - для записи данных в файл.
6
Процедура READ обеспечивает ввод символов, строк и чисел: READ (<файловая переменная>,<список ввода>); Если файловая переменная отсутствует, то обращение происходит к стандартному файлу INPUT и данные вводятся с клавиатуры. Список ввода - последовательность из одной или более переменных типа CHAR, STRING, а также любого целого или вещественного типа. При вводе переменных типа CHAR выполняется чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ CR (#13), а если достигнут конец файла, то символ - EOF (#26). При вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR или EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, лишние символы до конца строки отбрасываются. При вводе числовых переменных процедура READ вначале выделяет подстроку во входном потоке: разделителем подстрок являются пробелы, EOLN и EOF. Выделенная подстрока символы табуляции, символы рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление, а полученное значение присваивается переменной из списка ввода. Если в подстроке был нарушен формат представления числовой константы, возникает ошибка ввода-вывода. Следует отметить, что сама процедура READ читает только одну строку. Для ввода последовательности строк необходимо использовать процедуру: READLN (<файловая переменная>,<список ввода>); Процедура READLN также обеспечивает ввод символов, строк и чисел, но после считывания последней переменной она осуществляет переход к следующей строке (записи). Эта процедура может быть использована для пропуска строк: для этого параметр “список ввода” не указывается. Процедура WRITE обеспечивает вывод информации в файл: WRITE (<файловая переменная>,<список вывода>); Если файловая переменная отсутствует, то обращение происходит к стандартному файлу OUTPUT и данные обычно выводятся на экран дисплея.
7
Список вывода - последовательность из одной или более переменных типа CHAR, STRING, BOOLEAN, а также любого целого или вещественного типа. Любой элемент списка вывода может указываться с форматом для вывода. Формат отделяется от переменной символом двоеточие и указывает число позиций (ширину поля вывода), отводимых под символьное представление этой переменной. Для вещественных чисел может указываться также число позиций, отводимых под дробную часть числа. Если символьное представление имеет меньшую длину, чем отведенное число позиций, то оно дополняется слева пробелами, а если - большую длину, то заданный формат игнорируется. Если формат для вывода не указан, соответствующий параметр выводится вслед за предыдущим без какого-либо разделения. При выводе логических выражений в зависимости от их значения выводятся строки FALSE или TRUE. Если при выводе вещественных чисел формат вывода не указан, то они выводятся в экспоненциальной форме (указывается мантисса и порядок). Процедура WRITELN идентична процедуре WRITE, но выводимая строка завершается кодами CR и LF и осуществляется переход к новой строке файла. WRITELN (<файловая переменная>,<список вывода>); Процедура WRITELN может использоваться без параметра “Список вывода”. В этом случае в файл передается маркер EOLN. Если вам необходимо добавить записи в уже существующий текстовый файл, необходимо воспользоваться стандартной процедурой APPEND, которая позволяет открыть текстовый файл для добавления записей в него: APPEND (<файловая переменная>; Любое обращение к файлу в ТР осуществляется через буфер, что необходимо для согласования внутреннего представления файлового компонента (записи) с принятым в ДОС форматом хранения данных на диске и уменьшения числа обращений к диску при выполнении процедур вводавывода. При заполнении буфера файла, данные переписываются на диск, в физический файл. Можно вывести содержимое буфера, не дожидаясь его заполнения. Для этого используется стандартная процедура: FLUSH ( <файловая переменная>); Эта процедура имеет смысл только в случае записи данных в файл; Размер буфера для текстового файла по умолчанию равен 127 байт.
8
Для ускорения обмена информацией, в случае большого объема, можно изменить размер буфера. Для этого используется стандартная процедура: SETTEXTBUF( <файловая переменная>,<переменная, задающая размер буфера>); Обращение к процедуре SETTEXTBUF производится после процедуры ASSIGN до открытия файла. Переменная, задающая размер буфера, должна быть предварительно описана в разделе VAR как массив данных типа Byte или Char, например: VAR Buf: Array[1..1024] of Byte; {Для буфера отводится память до 1Кб.} F:TEXT; ... ASSIN(F,’file.dan’); SETTEXTBUF(F,Buf); ... Кроме того, при работе с текстовыми файлами могут оказаться полезными еще три стандартные логические функции: EOLN( <файловая переменная>) - возвращает значение TRUE, если во входном текстовом файле достигнут маркер конца строки. SEEKEOLN( <файловая переменная>) - пропускает все пробелы и знаки табуляции до маркера конца строки EOLN или до первого значащего символа и возвращает значение TRUE, если маркер EOLN обнаружен. SEEKEOF( <файловая переменная>) - пропускает все пробелы, знаки табуляции и маркеры конца строки до маркера конца файла EOF или до значащего символа и возвращает значение TRUE, если маркер обнаружен. Примеры работы с текстовыми файлами Пример 1 Дан текстовый файл с именем Matr.dan, содержащий прямоугольную матрицу целых чисел, и расположенный в текущем каталоге. Каждая строка файла содержит одну строку матрицы. Необходимо ввести матрицу в двумерный массив, определив при этом число строк и столбцов в заданной матрице. Определить сумму элементов в каждой строке матрицы, записать результат в файл с именем Sum.dan и вывести на экран.
9
Пусть файл Matr.dan с заданной матрицей имеет вид: 5 2 4 6 2 8 7 4 6 3 0 9 6 2 5 3 1 8 4 3 6 ОПИСАНИЕ ПРОГРАММЫ USES CRT; { Подключение стандартного модуля ТР} Var F_in, F_out : Text; { Файловые переменные для связи с входным и выходным файлами} Matr : Array[1..50,1..40] of Integer; {Описание двумерного массива} Sum : Integer; { Переменная для хранения суммы элементов каждой строки матрицы} Str, Stl : Byte; { Число строк и столбцов матрицы} i, j : byte; { Рабочие переменные} Begin Assign(F_in, ′Matr.dan′); { Связывание файловой переменной с именем файла на диске} Reset(F_in); { Открытие файла для чтения} Str := 0; Stl := 0; i := 0; { Ввод матрицы из файла в массив} While Not Eof (F_in) Do {Цикл до конца файла } begin inc(i); j := 0; While Not Eoln(F_in) Do {Цикл до конца строки} begin inc(j); Read (F_in, Matr[i,j]); {Чтение очередного элемента из файла, преобразование его и заполнение массива} end; Readln (F_in); {Переход к следующей строке файла} Stl:=j; { Число столбцов} end; Str:=i; { Число строк} 10
Writeln (′ Число строк = ′ , Str, ′Число столбцов = ′ , Stl); {Определение и вывод в файл значений сумм элементов в каждой строке матрицы} Assign (F_out, ′Sum.dan′); Rewrite (F_out); {Открытие файла для записи} For i := 1 To Str Do {Цикл по строкам массива } begin Sum := 0; For j := 1 To Stl Do {Цикл по столбцам} Sum := Sum + Matr[i,j]; {Суммирование элементов строк } Write (F_out, Sum:6); {Запись значения суммы в файл } Writeln (′В строке ′,i,′ сумма = ′ , Sum); {Вывод значения суммы на экран} end; Close (F_in); Close (F_out); {Закрытие файлов } End. Пример 2 Дан текстовый файл с именем Spis.dan, содержащий несколько записей заданной структуры (табл. 1), и расположенный в текущем каталоге. Каждая строка файла содержит одну запись. Необходимо ввести записи из файла в массив записей, определив при этом число введенных записей. Упорядочить записи в массиве по убыванию значений поля “Год рождения”, используя для этого алгоритм обменной сортировки. Записать упорядоченный массив в файл с именем Sort.dan. Таблица 1 Номер п/п число
Фамилия Имя Отчество строка из 30 символов
Год рождения 1900..2000
ОПИСАНИЕ ПРОГРАММЫ { Подключение стандартного модуля ТР}
USES CRT; Type Type_Rec = Record { Описания типа для структуры } Nom : Word; { Поле номер} FIO : String[30]; { Поле ФИО} YEAR : 1900..2000; { Поле год рождения} End; 11
Var F_input, F_out : Text; { Файловые переменные для связи с входным и выходным файлами} Spisok :Array [1..1000] of Type_Rec; { Описание массива записей} Kol_Zap, i : Word; { Число и счетчик записей} Zap : Type_Rec; { Описание одной записи} Key : Boolean; { Ключ сортировки} Begin Assign (F_input, ′Spis.dan′); Reset (F_input); { Открытие файла для чтения} i := 0; { Счетчик считанных записей} { Ввод данных из текстового файла в массив } While not Eof (F_input) Do begin inc (i); With Spisok[i] Do { Оператор присоединения} Readln (F_input, Nom, FIO, YEAR); { Ввод строки: для текстового файла необходимо указывать каждое вводимое поле записи} end; Kol_Zap := i; { Число записей в файле} Repeat { Обменная сортировка массива Spisok по полю “Год рождения”} Key := False; For i := 1 To Kol_Zap - 1 Do If Spisok[i].YEAR > Spisok[i+1].YEAR then begin Key := True; { Обмен записей} Zap := Spisok[i]; Spisok[i]:= Spisok[i+1]; Spisok[i+1]:= Zap; end; Until Key = False; { Конец сортировки} { Вывод результатов в файл} Assign (F_out, ′Sort.dan′); Rewrite (F_out); { Открытие файла для записи} { Вывод заголовка для списка} Writeln(F_out, ′ Упорядоченный список записей′); 12
Writeln(F_out, ′ Номер Фамилия Имя Отчество Год рождения′); For i := 1 To Kol_Zap Do With Spisok[i] do Writeln (F_out, Nom:6, FIO, Year:6); { Вывод записи: для текстового файла необходимо указывать каждое выводимое поле записи} Close (F_input); Close(F_out); { Закрытие файлов} End. Порядок выполнения работы 1. Получить вариант задания у преподавателя. 2. Определить состав и структуру входной и выходной информации. 3. Написать и отладить программу, продемонстрировать её преподавателю. 4. Оформить и сдать отчет.
работу
Типовое задание Создать текстовый файл, состоящий из записей, имеющих заданную структуру (см. ваш вариант). Написать программу, решающую следующие задачи: 1) Занесение записей из текстового файла в массив записей с одновременным определение числа записей во входном файле. 2) Вывод на экран полученного массива. 3) Поиск в массиве и вывод на экран записей по заданному полю. 4) Удаление из массива записей в соответствии с заданием. 5) Вывод на экран оставшегося массива. 6) Упорядочение массива по заданному полю. 7) Вывод упорядоченного массива на экран и в новый текстовый файл. Все выводимые на экран и в файл результаты должны быть снабжены заголовками, поясняющими этот результат и оформлены в виде таблиц.
Варианты заданий
13
Вариант 1 Фамилия имя отчество автора строка символов
Название книги строка символов
Год издания число
Поиск и вывод на экран записей о всех книгах, изданных до 1950 года. Удаление записей о книгах, изданных с 1960 по 1970 годы. Упорядочение массива по возрастанию года издания. Вариант 2 Номер Личный шифр Фамилия Дата рождения п/п студента имя, отчество число месяц год число 6 символов 20 символов Поиск и вывод на экран записей о всех студентах, родившихся в 1982 г. Удаление записей о студентах, имеющих шифры “ВС001 - ВС200”. Упорядочение массива по возрастанию значений поля “Личный шифр”. Вариант 3 Номер Фамилия Табельный Размер п/п имя отчество номер оклада число 20 символов 10 символов вещественное число Поиск и вывод на экран записей о всех работниках, имеющих оклад, превышающий величину 600.0. Удаление записей о работниках с табельным номером, начинающимся с символа “А”. Упорядочение массива по возрастанию размера оклада.
Вариант 4
14
Номер п/п число
Фамилия, инициалы
Шифр специальности 6 символов
15 символов
Год рождения 1950..2000
Поиск и вывод на экран записей о всех студентах, имеющих шифр, начинающийся с символов “ВС”. Удаление записей о студентах 1980 года рождения. Упорядочение массива по возрастанию года рождения. Вариант 5 Номер п/п число
Фамилия имя отчество 20 символов
Факультет 5 символов
Номер специальности целое от 1 до 500000
Поиск и вывод на экран записей о всех студентах факультета “ФВТ”. Удаление записей о студентах с номером специальности меньше 102030. Упорядочение массива по возрастанию номера специальности. Вариант 6 Номер п/п число
Фамилия, инициалы
Факультет
строка символов
6 символов
Шифр группы 8 символов
Поиск и вывод на экран записей о всех студентах факультета “ФАИТ”. Удаление записей о студентах факультета “ФВТ”. Упорядочение массива по убыванию шифра специальности.
Вариант 7 Номер п/п
Фамилия имя отчество
Дата рождения Пол число месяц год “жен”/ “муж”
15
число
строка символов
3 символа
Поиск и вывод на экран записей о всех студентках. Удаление записей о студентах мужского пола. Упорядочение массива по возрастанию года рождения. Вариант 8 Фамилия и инициалы автора строка символов
Название книги строка символов
Год издания число
Поиск и вывод на экран записей о всех книгах, изданных после 1975 года. Удаление записей о книгах, название которых, начинаются на букву “А”. Упорядочение массива по возрастанию года издания. Вариант 9 Фамилия и инициалы автора 15 символов
Название книги 20 символов
Год издания число
Поиск и вывод на экран записей о всех книгах, изданных до 1985 года. Удаление записей о книгах, с фамилией автора “Иванов”. Упорядочение массива по убыванию года издания. Вариант 10 Номер Фамилия имя отчество Шифр группы Размер п/п стипендии число 20 символов 6 символов целое число Поиск и вывод на экран записей о всех студентах группы 96ВС1. Удаление записей о студентах, имеющих шифр “97ВС2”. Упорядочение массива по убыванию размера стипендии.
16
Вариант 11 код товара число
наименование товара 30 символов
цена количество число число
Поиск и вывод на экран записей о товарах, количество которых равно нулю. Удаление записей с ценой, превышающей 1000. Упорядочение массива по возрастанию кодов товаров. Вариант 12 код предприятия название предприятия число 15 символов
кол-во электроэнергии число
месяц оплаты число
Поиск и вывод на экран записей о всех предприятиях, месяц оплаты которых меньше текущего. Удаление записей о предприятиях, месяц оплаты которых равен текущему. Упорядочение массива по убыванию кодов предприятий. Вариант 13 код пациента число
номер страхового полиса 8 символов
организация 20 символов
Поиск и вывод на экран записей о всех пациентах данной организации. Удаление записи с данным номером страхового полиса. Упорядочение массива по возрастанию кодов пациентов. Вариант 14 Ф.И.О. больного 30 символов
адрес больного номер участка 20 символов число
дата выписки число-месяц
Поиск и вывод на экран записей о всех больных на данном участке.
17
Удаление записей о больных, выписанных в прошлом месяце. Упорядочение массива по алфавиту (по полю ФИО). Вариант 15 код линии метро название число символы
кол-во станций число
протяжённость линии действ. число
Поиск и вывод на экран записей о Кольцевой линии метро. Удаление записей о линии, имеющей наименьшее количество станций. Упорядочение массива по убыванию кода линии метро. Вариант 16 номер дома номер квартиры квартплата число число действ. число
Ф.И.О. квартиросъёмщ. 30 символов
Поиск и вывод на экран записей о всех квартирах дома №5. Удаление записей о кварторосъёмщике с фамилией “Иванов”. Упорядочение массива по возрастанию номеров домов. Вариант 17 Ф.И.О. квартиросъёмщ. 30 символов
жилая площадь действ. число
кол-во жильцов число
Поиск и вывод на экран записей о жильцах, жилая площадь которых>100м2. Удаление записей о квартиросъёмщиках с фамилией “Иванов”. Упорядочение массива по убыванию количества жильцов. Вариант 18 табельн. номер число
Ф.И.О. разряд 30 символов число
зарплата действ. Число
18
Поиск и вывод на экран записей о всех сотрудниках, имеющих 10 разряд. Удаление записей о сотрудниках, имеющих зарплату меньше 1000. Упорядочение массива по возрастанию табельных номеров. Вариант 19 номер цеха число
табельный номер число
Ф.И.О. 30 символов
отраб.время число
Поиск и вывод на экран записей о всех сотрудниках 11 цеха. Удаление записей о сотрудниках, чьё отработанное время равно нулю. Упорядочение массива по убыванию номера подразделения. Вариант 20 номер чит.билета число
Ф.И.О. дата выдачи книги 30 символов число - месяц - год
дата возврата
Поиск и вывод на экран записей о всех читателях, которые не возвратили взятые в библиотеке книги на текущую дату. Удаление записей о читателях фамилии которых начинаются с буквы “И”. Упорядочение массива по возрастанию номеров читательских билетов.
1.4. Лабораторная работа № 2 Типизированные файлы Цель работы: Ознакомиться со стандартными процедурами работы с типизированными файлами. Приобрести навыки разработки программ с использованием типизированных файлов.
19
Теоретическая часть Для работы с типизированным файлом необходимо с помощью процедуры ASSIGN связать файловую переменную с физическим именем файла, а затем открыть его для чтения или записи. Для типизированных и безтиповых файлов обе процедуры открытия RESET и REWRITE устанавливают режим чтение/запись в соответствии с предопределенным значением системной переменной FileMode (по умолчании оно равно 2). В этом случае независимо от используемой процедуры открытия, файл открывается как для чтения, так и для записи. Но необходимо помнить, что если файл не существует, то его нельзя открыть процедурой RESET, а если вы открываете файл для чтения процедурой REWRITE, то его содержимое будет уничтожено. Поэтому имеет смысл открывать файл для записи процедурой RESET только в том случае, если файл уже существует и вам необходимо добавить в него записи. Если установить системную переменную FileMode в значение = 1, то при использовании процедуры RESET, файл открывается только для записи, а при FileMode = 0 - только для чтения. Для чтения данных из типизированного файла используется процедура: READ (<файловая переменная>,<список ввода>); Здесь список ввода содержит одну или более переменных такого же типа, что и компоненты файла. Если файл исчерпан, обращение к процедуре READ вызовет ошибку ввода-вывода с номером 100: “Disk read error” (“Ошибка чтения с диска”). Для записи данных в типизированный файл используется процедура: WRITE (<файловая переменная>,<список вывода>); Здесь список вывода содержит одно или более выражений такого же типа, что и компоненты файла. Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру). Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент файла с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Для поддержки прямого доступа к компонентам типизированного файла используются две стандартные функции: FILESIZE и FILEPOS, а также процедура SEEK. 20
Процедура SEEK (<файловая переменная>,<№ компонента>) смещает указатель файла к компоненту с заданным номером. Здесь № компонента - выражение типа LONGINT. Функция FILESIZE(<файловая переменная>) - возвращает значение типа LONGINT, которое содержит количество компонентов файла. Функция FILEPOS(<файловая переменная>) - возвращает значение типа LONGINT, которое содержит порядковый номер компонента файла, который будет обрабатываться последующей операцией ввода-вывода. Преимущество типизированных файлов: эффективный способ хранения информации и упрощение операций ввода-вывода. Так, например, при вводе структур данных не нужно указывать каждое поле, как это требовалось при работе с текстовыми файлами. К недостаткам можно отнести невозможность просмотра содержимого типизированного файла и его изменения каким-либо редактором, так как числовые данные записываются в двоичном коде. Создать типизированный файл можно программным способом. Пример работы с типизированными файлами Создание типизированного файла Пусть дан текстовый файл, содержащий несколько записей, структура которых представлена в табл. 1(см. лабораторную работу №1) Необходимо сформировать типизированный файл той же структуры. ОПИСАНИЕ ПРОГРАММЫ Uses crt; Type tzap=record { Описания типа для структуры } nom : word; fio : string[30]; godr : 1900..2000; end; Var f_out : file of tzap; { Файловая переменная для типизированного файла}
21
zap : tzap; f_in : text; { Файловая переменная для текстового файла} name_file_input, name_f_out : string[12]; {Имена файлов} Begin writeln(' Введите имя текстового файла'); readln(name_file_input); assign(f_in,name_file_input); writeln(' Введите имя типизированного файла'); readln(name_f_out); assign(f_out,name_f_out); reset(f_in); { Открытие текстового файла для чтения} rewrite(f_out); { Открытие типизированного файла для записи} while not eof(f_in) do begin with zap do readln(f_in,nom,fio,godr); { Чтение из текстового файла} write(f_out,zap); {Запись в типизированный файл } end; close(f_in); close(f_out); { Закрытие файлов } End. Порядок выполнения работы 1. Получить вариант задания у преподавателя. 2. Определить состав и структуру входной и выходной информации. 3. Выделить глобальные переменные и описать их. 4. Разработать структуру программы. 5. Каждую функционально-законченную часть оформить в виде отдельной процедуры. 6. Отладить программу и продемонстрировать её работу преподавателю. 7. Оформить и сдать отчет. Типовое задание
22
Создать два текстовых файла, состоящих из записей, имеющих заданную структуру и содержащих заданное количество записей(см. ваш вариант). Написать программу, решающую следующие задачи: 1) Ввод данных из текстовых файлов и запись в типизированные файлы. 2) Вывод на экран содержимого типизированных файлов. 3) Ввод каждого из сформированных типизированных файлов в массив записей и их сортировка по заданного полю. 4) Вывод упорядоченных массивов записей в новые типизированные файлы и на экран дисплея. 5) Сортировка слиянием содержимого двух упорядоченных типизированных файлов в новый типизированный файл. 6) Вывод на экран содержимого объединенного и упорядоченного типизированного файла. Все выводимые на экран результаты должны быть снабжены заголовками, поясняющими этот результат и оформлены в виде таблиц. При разработке программы использовать обращение к процедурам с параметрами. Процедуры необходимо оформлять так, чтобы их можно было использовать дважды, т.е. для каждого их файлов. Варианты заданий выбрать из лабораторной работы №1. Число записей в текстовых файлов задает преподаватель.
2. Разработка программ с использованием динамической памяти 2.1. Динамические переменные При выполнении любой программы, каждая используемая в ней переменная получает свой адрес в оперативной памяти (ОП). В Турбо Паскале имеются два способа распределения памяти для переменных: статический и динамический. При статическом распределении всем объявленным в разделе описаний программы переменным выделяются фиксированные участки памяти. В связи с этим использование заранее не объявленных переменных не допускается. Причем, под все объявленные в 23
главной программе переменные отводиться память размером не превышающим 64Кб. При динамическом распределении памяти имеется возможность создавать новые, не объявленные заранее переменные, и размещать их на свободные участки в динамической области ОП, называемой “кучей”[2]. Это достигается за счет использования указателей. Указатель - это элемент данных, представляющий собой ссылку (адрес) на определённую ячейку динамической области ОП, начиная с которой записывается значение переменной. Переменные, которые размещаются в динамической области ОП с помощью указателей, называются динамическими переменными. Указатель может принимать значения, равные всем тем адресам ОП, по которым возможна запись данных. Указатель может принимать также значение NIL (пусто), которое говорит о том, что соответствующая динамическая переменная в ОП отсутствует. Указатель(ссылочная переменная) объявляется с помощью специального символа, называемого “каре” (^), за которым записывается идентификатор типа динамической переменой: Type Имя ссылочного типа = ^ Имя базового типа; Var Имя ссылочной переменной = Имя ссылочного типа; В результате этого определения ссылочные переменные будут указывать на объекты базового типа, определяя тем самым динамические переменные заданного базового типа. В качестве базового типа могут использоваться простые типы ТР или типы, определяемые программистом. Например: Type {Описание базовых типов} typeMas = Array[1..10000] of Real; typeRec = Record ... ... End; {Ссылочные типы} ssMas = ^typeMas; { Указатель на массив данных} ssRec = ^typeRec; { Указатель на запись} ssint = ^Integer; { Указатель на переменную типа Integer} sr = ^Real; {Указатель на переменную типа Real}
24
Var A,B,C: ssint; ... В этом случае А, В, С являются указателями на переменные целого типа. Для обращения к значениям этих переменных служат идентификаторы: A^, B^, C^. Кроме того, в ТР определен специальный тип Pointer, с помощью которого указатель может быть объявлен следующим образом: Var Имя указателя : pointer; TP допускает описание типизированных констант типа Pointer (констант ссылочного типа). Начальным значением таких констант может быть только Nil. Например: Type Tmas = Array[1..10] of char; { Описание базового типа} sm = ^Tmas; { указатель на массив из 10 символов} Const s1 : sm = Nil; {Задание начального значения Nil для типизированной константы ссылочного типа: s1} Значения указателей можно сравнивать только с помощью проверок на равенство и неравенство. Допустимо использование оператора присваивания, например: A:=Nil; Для динамических переменных допустимы все те же операции, что и над обычными переменными данного типа. Все указатели (ссылочные переменные) имеют одинаковый размер, равный 4 байтам. Память под ссылочные переменные отводится на этапе трансляции, а распределение памяти (а затем и её освобождение) под сами динамические объекты осуществляется в процессе работы программы с помощью стандартных процедур и функций ТР. 2.2. Стандартные процедуры и функции для работы с динамическими переменными Любым действиям с динамической переменной должен предшествовать процесс её размещения в динамической памяти. Для этого может быть использована процедура: New(P);
25
Р - ссылочная переменная (указатель). Эта процедура создает новую динамическую переменную Р^, отводит место для её хранения в ОП и присваивает её адрес ссылочной переменной Р. При этом динамической переменной отводится блок памяти, соответствующий размеру типа, с которым объявлен указатель Р. Если в ходе вычислительного процесса динамическая переменная становится ненужной, её следует удалить. Это осуществляется с помощью процедуры: Dispose(P); Эта процедура уничтожает связь между ссылочной переменной Р и значением, на которое она ссылается, тем самым, освобождая память, занятую динамической переменной. Кроме этих двух процедур модуль TP - System поддерживает следующие стандартные процедуры и функции для работы с указателями и динамическими переменными: GetMem(P,Size); - используется как и New(P) для размещения динамических переменных. Эта процедура создаёт новую динамическую переменную, отводит для неё в динамической области ОП участок, размером в Size байт и присваивает адрес начала этого участка указателю Р. Значение Size не должно превышать 65521 байт, а переменная Size в программе должна иметь тип Word. FreeMem(P,Size);- процедура, которая уничтожает динамическую переменную, освобождая в ОП участок размером Size байт, начиная с адреса, записанного в Р. Р - становится не определённым. Mark(P); - процедура, которая запоминает состояние динамической области ОП в указателе Р, для того, чтобы в дальнейшем все динамические переменные, размещенные в ОП после выполнения Mark, могли быть уничтожены с помощью процедуры Release. Release(P); - уничтожает все динамические переменные, размещенные в ОП после указателя Р. Значение указателя Р формируется обычно с помощью процедуры Mark. Функция MaxAvail определяет размер в байтах наибольшего непрерывного блока в динамической области ОП, где может быть размещена (с помощью New или GetMem) динамическая переменная. Тип результата этой функции: Longint. Функция MemAvail определяет размер в байтах всей свободной памяти в динамической области ОП. Тип результата этой функции: Longint. Функция Addr(X) - определяет адрес (указатель) объекта Х. 26
Х - любая переменная, процедура или функция. 2.3. Динамические структуры данных и их описание в Турбо Паскале Указатели являются эффективным средством организации динамических структур данных в виде различных списков. Списком называется структура данных, каждый элемент которой содержит ссылку (указатель), связывающую его со следующим элементом этого списка. Для организации списков чаще всего используются записи, состоящие из двух полей: первое поле содержит подлежащую обработки информацию, второе - указатель на следующую запись. Примерами динамических структур данных являются: стек, очередь, линейный список, дерево [3,4]. Стек - это список, характеризующийся последовательной организацией и возможностью доступа только с одного края цепочки записей, называемой вершиной стека. Добавление элементов (записей) в стек возможно только в его начало, удаление элементов и их чтение также возможно только из начала стека. Принцип обработки записей стека называется принципом LIFO (Last Input - First Output) - “Последним пришёл - первым ушёл”. Очередь - это список, характеризующийся последовательной организацией и возможностью доступа с начала и с конца. Добавлять записи можно только в конец очереди, а читать или удалять - только из начала очереди. Принцип обработки записей в очереди называется принципом FIFO (First Input - First Output) - “Первым пришёл - первым ушёл”. Линейный список - наиболее универсальная структура данных спискового типа, в нем доступна для чтения и удаления любая запись, кроме того, новая запись может быть включена в любое место такого списка. Для задания структуры в виде любого списка (стека, очереди и т.п.) в программе необходимо определить объект комбинированного типа в состав которого входит указатель на объект данного типа, причем указатель на объект должен быть описан ранее самого объекта. Рассмотрим пример описания элементов линейного списка. Type TSpis = ^Element; {Указатель на элемент списка} Element = Record {Описание элемента списка в виде записи} PoleInfo: TypeDan; {Описание поля данных . Здесь TypeDan - любой тип для описания данных} Adres: TSpis; {Указатель на следующий элемент}
27
End; Var Sbegin, St: TSpis; {Ссылочные переменные - указатели} В этом примере TSpis - имя типа, которое определяет переменную указатель. Этот указатель будет содержать значения адресов ОП, по которым будут размещаться переменные типа Element (записи). Каждый элемент списка содержит два поля: информационное и адресное. Для работы со списком в программе (в разделе Var) необходимо определить несколько ссылочных переменных: Sbegin - указатель на начало списка, St - указатель на текущий элемент. Все идентификаторы (кроме служебных) программист задает произвольно, в соответствии с алфавитом языка Паскаль. Описанный выше линейный список может быть изображен в виде последовательности элементов (рис. 1). PoleInfo
PoleInfo
PoleInfo
Adres
Adres
Adres
PoleInfo
Sbegin NIL
Рис. 1 С помощью такого представления удобно демонстрировать все возможные действия с линейным списком: удаление элементов, их сортировку, а также добавление новых элементов. 2.4. Лабораторная работа №3 Линейный динамический список Цель работы: Ознакомиться с процедурами работы с динамическими переменными. Приобрести навыки разработки программ с использованием динамической памяти на примере работы с линейным списком. Рассмотрим различные действия над линейным динамическим списком на следующем примере: Дан текстовый файл, содержащий список учащихся группы, имеющий вид, представленный в таблице 2. Таблица 2
28
№п./п.
ФИО
Экзаменационные оценки 1 2 3 4 5
Сумма баллов
Разработать программу, которая выполняет следующие функции: 1) Вводит данные о каждом учащемся из текстового файла в линейный список. 2) Выводит сформированный линейный список на экран. 3) Определяет и удаляет из линейного списка сведения об учащихся, имеющих неудовлетворительные оценки. 4) Выводит измененный линейный список на экран. 5) Упорядочивает список учащихся по убыванию значений сумм баллов. 6) Выводит упорядоченный линейный список на экран. 7) Добавляет одну или несколько записей в упорядоченный линейный список в соответствии с вводимой суммой баллов. 8) Выводит полученный линейный список на экран. Для реализации каждой из вышеперечисленных функций будем использовать отдельные процедуры со следующими именами: INPUT_AND_FORM_SPIS - ввод и формирование линейного списка; OUTPUT_SPIS - вывод линейного списка на экран; DELETE_ELEM_SPIS - удаление элементов из линейного списка; SORT_ELEM_SPIS - упорядочение элементов линейного списка; ADD_ELEM_SPIS - добавление элементов в линейный список. Cтруктурная схема программы будет иметь вид ( рис. 2.)
НАЧАЛО
SORT_ELEM_ SPIS
INPUT_AND_ FОRM_SPIS
ОUTPUT_ SPIS
29
ОUTPUT_ SPIS
ADD_ELEM_ SPIS
DELETE_ SPIS
OUTPUT_ SPIS
OUTPUT_ SPIS
КОНЕЦ
Рис. 2
ОПИСАНИЕ ПРОГРАММЫ Описание глобальных переменных Uses CRT; { Подключение стандартного модуля ТР} Type { Описание типов } Type_Info = Record {Описания типа информационного поля} nom: byte; {Порядковый номер студента в списке } FIO: string[30]; { Фамилия, имя и отчество } Ball: Array[1..5] of byte; { Массив из пяти оценок } Sum_ball: byte; { Сумма баллов } End; Type_ukaz = ^Type_Elem; { Описание ссылочного типа 30
указатель на элемент динамического линейного списка } Type_Elem= Record { Описание элемента линейного списка } Info: Type_Info; { Информация о каждом студенте } Ukaz: Type_ukaz; { Указатель на следующий элемент } End; Var { Описание глобальных переменных } Beg_Spis, St, Sp: Type_Ukaz; { Указатель на начало линейного списка в динамической области оперативной памяти, Текущее и предыдущее значение указателя} Для иллюстрации действий с данным списком воспользуемся рис. 3.
Info
Info
Info
Info
Beg_Ukaz Ukaz
Ukaz
Ukaz
NIL
Рис. 3
Процедура ввода данных и формирования линейного списка Procedure INPUT_AND_FORM_SPIS; Var { Описание локальных переменных } F_Input: Text; {Текстовый файл с данными} Name_F_Input: String; {Имя файла на диске} i: byte; Begin Writeln(’ Введите имя файла с исходными данными’); Readln(Name_F_Input); Assign(F_Input,Name_F_Input); Reset(F_Input); New(St); { Определения начального адреса (указателя)
31
для размещения линейного списка в динамической области ОП } Beg_Spis := St; { Сохранение начального адреса} While Not Eof (F_Input) Do {Цикл до конца файла} begin With St^.Info do begin {Оператор присоединения} Read ( F_Input, nom, FIO); { чтение порядкового номера и фамилии из файла в линейный список} For i := 1 to 5 do Read ( F_Input, Ball[i] ); { То же для всех 5 оценок} Readln ( F_Input, Sum_ball ); { Чтение и запись суммы баллов и переход к новой строке файла} end; Sp:=St;{ Сохранение текущего указателя в предыдущем} New (St); { Определение указателя на новую ячейку памяти} Sp^.Ukaz := St; { Сохранение указателя на новую ячейку в поле адреса предыдущей} end; { Цикл по записям файла} Sp^.Ukaz := NIL; { Запись в поле указателя последней ячейки занятой списком памяти значения NIL } End; { Конец процедуры ввода и формирования списка} Процедура вывода линейного списка на экран Procedure OUTPUT_SPIS; Var i: byte; { Описание локальных переменных } Begin St := Beg_Spis; { Установка начального указателя линейного списка } While St <> NIL do { Цикл до конца линейного списка } begin With St^.Info do begin Write (Nom,’ ’, FIO,’ ’); For i := 1 to 5 do Write ( Ball[i]:3 ); 32
Writeln ( Sum_Ball:4 ); end; { Конец действия оператора присоединения } St := St^.Ukaz; { Переход к следующему элементу списка } end; { Конец цикла по линейному списку } End; { Конец процедуры вывода списка на экран} Процедура поиска и удаления из линейного списка сведений об учащихся, имеющих неудовлетворительные оценки Procedure DELETE_ELEM_SPIS; Var i: byte;{ Описание локальных переменных } Begin St := Beg_Spis; { Установка начала линейного списка } While St <> Nil do begin With St^.Info do For i := 1 to 5 do If Ball[i] = 2 then { Удаление элемента из списка} begin if St = Beg_Spis then { Удаление из начала см. рис. 4} Beg_Spis := St^.Ukaz Else begin { Удаление из любого места кроме начала линейного списка, см. рис. 5} Sp^.Ukaz := St^.Ukaz; St := Sp; Break; end; end; { Конец цикла по анализу оценок} Sp := St; St := St^.Ukaz; { Переход к следующему элементу линейного списка } end; { Конец цикла по линейному списку } End; { Конец процедуры удаления} St
33
Info
Info
Info
Info
Beg_Ukaz Ukaz
Ukaz
Ukaz
NIL
Beg_Ukaz := St^.Ukaz Рис. 4
Sp
St
Info
Info
Info
Ukaz
Ukaz
Ukaz
Info
Info
Beg_Ukaz Ukaz
NIL
Sp^.Ukaz := St^.Ukaz; Рис. 5
Процедура сортировки элементов линейного списка Procedure SORT_ELEM_SPIS; Var Ss, Sz : Type_ukaz; { Ss - указатель на следующий элемент списка, Sz- переменная для хранения ссылки при перестановке} Key : Boolean; { Признак перестановки} Begin Repeat Key := False; { Перестановок пока не было} St := Beg_Spis; Ss := St^.Ukaz; { Установка первого и второго элементов линейного списка} While Ss <> Nil do
34
begin If St^.Info.Sum_ball < Ss^.Info.Sum_ball then begin { Нужна перестановка} if St = Beg_Spis then begin { Перестановка в начале списка: см. рис. 6} Beg_Spis := Ss; St^.Ukaz := Ss^.Ukaz; Ss^.Ukaz := St; end else begin { Перестановке в произвольном месте списка, кроме начала : см. рис. 7} Sz := Sp^.Ukaz; Sp^.Ukaz := St^.Ukaz; St^.Ukaz := Ss^.Ukaz; Ss^.Ukaz := Sz; end; Key := True; { Перестановка произведена } end; Sp := St; St := St^.Ukaz; { Переход на следующий элемент списка} If St = Nil then Ss := Nil else Ss := St^.Ukaz; { Изменение значения следующего указателя} end; { Продолжение цикла по просмотру списка } Until Key = False; { Перестановок больше не будет} End; { Конец процедуры сортировки} Обмен St и Ss в начале списка
St Info
3. Ss^.Ukaz := St; Ss Info
Info 35
Info
Beg_Ukaz Ukaz
Ukaz
Ukaz
NIL
1. Beg_Ukaz := Ss; 2. St^.Ukaz := Ss^.Ukaz; Рис. 6
Обмен St и Ss в произвольном месте списка 1. Sz := Sp^.Ukaz; Sp
St
4. Ss^.Ukaz := Sz; Ss
Info
Info
Info
Ukaz
Ukaz
Ukaz
Info
Info
Beg_Ukaz
2. Sp^.Ukaz := St^.Ukaz;
Ukaz
NIL
3. St^.Ukaz := Ss^.Ukaz;
Рис. 7 Процедура добавления элементов в линейный список Procedure ADD_ELEM_SPIS; Var Key_Insert : Boolean; { Ключ - признак вставки} i, j, Kol_Insert_Zap : byte; { Число добавляемых записей} Ins_Zap : Type_Info; { Добавляемая запись } Begin Writeln( ‘ Введите число добавляемых записей‘ ); Readln( Kol_Insert_Zap ); For i := 1 to Kol_Insert_Zap do Begin With Ins_Zap do begin Writeln( ‘ Введите N n/n, ФИО, 5 оценок и их сумму‘ );
36
Readln(Nom, Fio ); for j := 1 to 5 do begin Read ( Ball[j]); Readln ( Sum_ball); end; St := Beg_Spis; { Установка на начало списка} Key_Insert := False; { Вставки не было} While ( St <> Nil ) and ( Key_Insert = False ) do begin If St^.Info.Sum_ball < Ins_Zap.Sum_ball then begin { Найдено место для вставки } Key_Insert := True; if St = Beg_Spis then begin { Вставка в начало списка} New(St); { Выделение новой ячейки динамической области памяти для добавляемой записи} St^.Ukaz := Beg_Spis; {Изменение ссылки в первом элементе списка} Beg_Spis := St; { Установка нового адреса начала линейного списка} St^.Info := Ins_Zap; { Заполнение информационного поле нового элемента списка} end else begin { Вставка в произвольное место} New( St ); St^.Ukaz := Sp^.Ukaz; Sp^.Ukaz := St; St^.Info := Ins_Zap; end; end; Sp := St; St := St^.Ukaz; {Переход к следующему элементу} end; { Цикл по элементам линейного списка} If Key_Insert = False then { Вставка в конец линейного списка} begin 37
New( St ); Sp^.Ukaz := St; St^.Ukaz := Nil; St^.Info := Ins_Zap; end; End; { Цикл по добавляемым записям} End; { Конец процедуры добавления } { Главная программа } BEGIN INPUT_AND_FORM_SPIS; OUTPUT_SPIS; DELETE_ELEM_SPIS; OUTPUT_SPIS; SORT_ELEM_SPIS; OUTPUT_SPIS; ADD_ELEM_SPIS; OUTPUT_SPIS; END. Порядок выполнения работы 1. Получить вариант задания у преподавателя. 2. Определить состав и структуру входной и выходной информации. 3. Выделить глобальные переменные и описать их. 4. Разработать структуру программы. 5. Каждую функционально-законченную часть оформить в виде отдельной подпрограммы. 6. Отладить программу и продемонстрировать её работу преподавателю. 7. Оформить и сдать отчет. Типовое задание Создать текстовый файл, состоящий из записей, имеющих заданную структуру (см. ваш вариант). Написать программу, решающую следующие задачи:
38
1) Занесение записей из текстового файла в линейный список. 2) Вывод на экран сформированного линейного списка. 3) Поиск в линейном списке и вывод на экран записей по заданному полю. 4) Удаление из списка записей в соответствии с заданием. 5) Вывод на экран оставшегося линейного списка. 6) Упорядочение линейного списка по заданному полю. 7) Вывод упорядоченного списка на экран. 8) Вставка записей в линейный список. 9) Вывод окончательного списка на экран и запись его в новый файл. Все выводимые на экран и в файл результаты должны быть снабжены заголовками, поясняющими этот результат и оформлены в виде таблиц. Варианты заданий Вариант 1 Номер Фамилия имя отчество целое строка - 20 символов
Дата рождения число месяц год
Поиск и вывод на экран записей о всех людях, родившихся в мае 1975 года. Удаление из списка записей о родившихся в январе 1973 года. Упорядочение линейного списка по возрастанию года рождения. Вставка записей в список без нарушения упорядочения по году рождения. Вариант 2 Номер Личный шифр п/п студента число 5 символов
Фамилия имя, отчество 25 символов
Дата рождения число месяц год
Поиск в линейном списке и вывод на экран записей о всех студентах, имеющих шифр “А001”. Удаление из списка записей о студентах, имеющих шифр “С001”. Упорядочение линейного списка по убыванию года рождения. Вставка записей в список без нарушения упорядочения по году рождения.
39
Вариант 3 Номер п/п число
Фамилия имя отчество строка символов
Табельный номер строка символов
Размер пособия вещественное число
Поиск в линейном списке и вывод на экран записей о всех клиентах, имеющих табельный номер, начинающийся с символа “С”. Удаление из списка записей о клиентах с табельным номером, начинающимся с символа “Р”. Упорядочение линейного списка по возрастанию размера пособия. Вставка записей в список без нарушения упорядочения. Вариант 4 Номер п/п число
Фамилия имя отчество строка символов
Шифр Год специальности рождения строка символов целое число
Поиск в линейном списке и вывод на экран записей о всех студентах, имеющих шифр, начинающийся с символа “В”. Удаление из списка записей о студентах с шифром, начинающимся с символа “С”. Упорядочение линейного списка по возрастанию года рождения. Вставка записей в список без нарушения упорядочения. Вариант 5 Номер п/п число
Фамилия имя отчество строка символов
Факультет
Номер специальности строка символов целое от 1 до 100000
Поиск в линейном списке и вывод на экран записей о всех студентах факультета “ФВТ”. 40
Удаление из списка записей о студентах факультета “ПСФ”. Упорядочение линейного списка по возрастанию номера специальности. Вставка записей в список без нарушения упорядочения. Вариант 6 Номер п/п число
Фамилия имя отчество строка символов
Факультет 6 символов
Шифр специальности 8 символов
Поиск в линейном списке и вывод на экран записей о всех студентах факультета “ФАИТ”. Удаление из списка записей о студентах факультета “ФВТ”. Упорядочение линейного списка по убыванию шифра специальности. Вставка записей в список без нарушения упорядочения.
Вариант 7 Номер п/п число
Фамилия имя отчество строка символов
Дата рождения Пол число месяц год “жен”/ “муж” 3 символа
Поиск в линейном списке и вывод на экран записей о всех студентках. Удаление из списка записей о студентах мужского пола. Упорядочение линейного списка по возрастанию года рождения. Вставка записей в список без нарушения упорядочения по году рождения. Вариант 8 Фамилия имя отчество автора строка символов
Название книги строка символов
41
Год издания число
Поиск в линейном списке и вывод на экран записей о всех книгах, изданных в 1975 году. Удаление из списка записей о книгах, фамилии авторов которых, начинаются на букву “А”. Упорядочение линейного списка по возрастанию года издания. Вставка записей в список без нарушения упорядочения по году издания. Вариант 9
Фамилия имя отчество автора строка символов
Название книги строка символов
Год издания число
Поиск в линейном списке и вывод на экран записей о всех книгах, изданных до 1985 года. Удаление из списка записей о книгах, с фамилией автора “Иванов”. Упорядочение линейного списка по убыванию года издания. Вставка записей в список без нарушения упорядочения по году издания. Вариант 10 Номер п/п число
Фамилия имя отчество 20 символов
Табельный Размер номер стипендии 6 символов целое число
Поиск в линейном списке и вывод на экран записей о всех студентах, имеющих табельный номер, начинающийся с символа “A”. Удаление из списка записей о студентах с табельным номером, начинающимся с символа “B”. Упорядочение линейного списка по убыванию размера стипендии. Вставка записей в список без нарушения упорядочения. Вариант 11 код товара
наименование товара
цена 42
количество
число
30 символов
число число
Поиск в линейном списке и вывод на экран записей о товарах, количество которых равно нулю. Удаление из списка этих записей. Упорядочение линейного списка по возрастанию кодов товаров. Вставка записей в список без нарушения упорядочения по коду товара. Вариант 12 код предприятия название предприятия число 15 символов
кол-во электроэнергии число
месяц оплаты число
Поиск в линейном списке и вывод на экран записей о всех предприятиях, месяц оплаты которых меньше текущего. Удаление из списка записей о предприятиях, месяц оплаты которых равен текущему. Упорядочение линейного списка по убыванию кодов предприятий. Вставка записей в список без нарушения упорядочения данных о новом предприятии. Вариант 13 код пациента число
номер страхового полиса 8 символов
организация 20 символов
Поиск в линейном списке и вывод на экран записей о всех пациентах данной организации. Удаление из списка записи с данным номером страхового полиса. Упорядочение линейного списка по возрастанию кодов пациентов. Вставка записей в список без нарушения упорядочения данных о новых пациентах. Вариант 14 Ф.И.О. больного
адрес больного номер участка
43
дата выписки
30 символов
20 символов
число
число-месяц
Поиск в линейном списке и вывод на экран записей о всех больных на данном участке. Удаление из списка записей о больных, выписанных в прошлом месяце. Упорядочение линейного списка по алфавиту (по полю ФИО). Вставка записей в список без нарушения упорядочения по фамилии больного. Вариант 15 код линии метро название число символы
кол-во станций число
протяжённость линии действ. число
Поиск в линейном списке и вывод на экран записей о Кольцевой линии метро. Удаление из списка записей о линии, имеющей наименьшее количество станций. Упорядочение линейного списка по убыванию кода линии метро. Вставка записей в список без нарушения упорядочения о новой линии метро. Вариант 16 номер дома номер квартиры квартплата число число действ. число
Ф.И.О. квартиросъёмщ. 30 символов
Поиск в линейном списке и вывод на экран записей о всех квартирах дома №5. Удаление из списка записей о кварторосъёмщике с фамилией “Иванов”. Упорядочение линейного списка по возрастанию номеров домов. Вставка записей в список без нарушения упорядочения номеру дома. Вариант 17 Ф.И.О. квартиросъёмщ. 30 символов
жилая площадь действ. число 44
кол-во жильцов число
Поиск в линейном списке и вывод на экран записей о всех жильцах, жилая площадь которых превышает 100 м2. Удаление из списка записей о квартиросъёмщиках с фамилией “Иванов”. Упорядочение линейного списка по убыванию количества жильцов. Вставка записей в список без нарушения упорядочения по числу жильцов. Вариант 18 табельн. номер число
Ф.И.О. разряд 30 символов число
зарплата действ. число
Поиск в линейном списке и вывод на экран записей о всех сотрудниках, имеющих 10 разряд. Удаление из списка записей о сотрудниках, фамилии которых начинаются с буквы “И”. Упорядочение линейного списка по возрастанию табельных номеров. Вставка записей в список без нарушения упорядочения. Вариант 19 номер цеха число
табельный номер число
Ф.И.О. 30 символов
отраб.время число
Поиск в линейном списке и вывод на экран записей о всех сотрудниках 11 цеха. Удаление из списка записей о сотрудниках, чьё отработанное время равно нулю. Упорядочение линейного списка по убыванию номера подразделения. Вставка записей в список без нарушения упорядочения о новых сотрудниках. Вариант 20 номер чит.билета число
Ф.И.О. 30 символов
дата выдачи книги
45
дата возврата
Поиск в линейном списке и вывод на экран записей о всех читателях, которые не возвратили взятые в библиотеке книги на текущую дату. Удаление из списка записей о читателях фамилии которых начинаются с буквы “И”. Упорядочение линейного списка по возрастанию номеров читательских билетов. Вставка записей в список без нарушения упорядочения новых абонентов.
Литература
1. В.Э. Фигурнов IBM для пользователя . М. : Финансы и статистика,1997 2. Д.В. Офицеров, В.А. Старых Программирование в интегрированной среде Турбо Паскаля. Справочное пособие. Минск: “Беларусь”, 1992 3. В.В. Фаронов Турбо Паскаль 7.0. Начальный курс. Учебное пособие. - М.: “Нолидж”, 1997 4. Вирт Н. Алгоритмы + структуры данных = программы.- М.: Мир, 1985 5. Вирт Н. Алгоритмы и структуры данных. М.: Мир, 1989
46
Содержание Стр. . 3 . 3 . 4 . 6 20 24 24
1. Работа с файлами . . . . . . . . . . . . . . . . 1.1. Файлы и их виды в Турбо Паскале . . . . . . . . . 1.2. Доступ к файлам . . . . . . . . . . . . . . . . 1.3. Лабораторная работа № 1 Текстовые файлы . . . . . . 1.4. Лабораторная работа № 2 Типизированные файлы . . . . 2. Разработка программ с использованием динамической памяти . 2.1. Динамические переменные . . . . . . . . . . . . 2.2.Cтандартные процедуры и функции для работы с динамическими переменными . . . . . . . . . . . . 26 2.3. Динамические структуры данных и их описание в Турбо Паскале 27 2.4. Лабораторная работа №3 Линейный динамический список . . 29 Литература . . . . . . . . . . . . . . . . . . . . 47
47