РефератРеферат Курсовая Базы данных на pascal
Работа добавлена на сайт bukvasha.net: 2015-10-28
Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
от 25%
Подписываем
договор
Содержание
Введение. 3
1 Содержательная постановка и описание задачи. 4
2 Атрибуты объекта и предоставление данных в программе. 5
2.1 Описание базы данных. 5
2.2 Типы данных. 6
3 Описание программы создания набора данных. 7
4 Описание программы формирование выходного документа. 9
4.1 Вывод информации на экран. 9
4.2 Вывод информации в файл. 9
5 Описание программы формирование списковой структуры.. 10
5.1 Область применения списковой структуры.. 10
5.2 Принцип работы.. 10
5.3 Процедуры, используемые при работе со списком. 11
6 Описание программы формирования списковой структуры.. 12
6.1 Динамические структуры данных. 12
6.2 Чтение элемента из списка. 13
6.3 Добавление элемента в список. 13
6.4 Поиск элемента в списке. 14
6.5 Удаление элемента из списка. 14
7 Технология обработки данных. 15
Заключение. 19
Список используемой литературы.. 20
Приложение 1. 21
Приложение 2. 22
Приложение 3. 23
Приложение 4. 24
Приложение 5. 26
Приложение 6. 30
Введение
Цель выполнения курсового проекта состоит в том, чтобы научится описывать предметную область реального мира – объект и его атрибуты, закрепить навыки использования основных структур данных, способов их описания и основных операций над ними. Освоить разработку удобного пользовательского интерфейса.
Действительно при помощи Turbo Pascal достаточно не просто создать программу, которая бы демонстрировала работу с базами данных (далее БД). Для этого в настоящий момент существует огромное количество специализированных программ. Но все-таки основу и саму сущность формирования БД при помощи Turbo Pascal, реализовать, возможно.
Современные БД дают возможность включать в них не только текстовую и графическую информацию, но и звуковые фрагменты и даже видеоклипы.
Простота использования различных систем позволяет создавать новые базы данных.
Для более полноценной работы базы данных должна выполнятся следующие функции:
· хранение большого объема информации;
· быстрый поиск требуемой информации;
· добавление, удаление и изменение хранимой информации;
· вывод ее в удобном для человека виде.
1 Содержательная постановка и описание задачи
Библиотека музыкальной школы – это библиотека с конкретно ориентированными книгами и музыкальными композициями, предназначенными для обучения и получения дополнительной информации по различным предметам именно в музыкальной школе.
Программа должна обладать следующими функциями:
– Удобная справочная система и система подсказок;
– Возможность добавление в БД новой книги или музыкальной композиции;
– Возможность поиска по выбранным критериям;
– Возможность удобной сортировки книг;
– Возможность создания отчетности;
– Возможность удаления ненужной книги.
При этом в реализованной базе данных должен быть интуитивно понятный и доступный любым пользователем. Удобная сортировка, а также удобное управление в режиме работы непосредственно с книгами.
Сортировки книг в любой БД необходимо уделять особое внимание. Связано это в первую очередь с необходимостью оперативного доступа к требуемой информации из БД.
2 Атрибуты объекта и предоставление данных в программе
2.1 Описание базы данных
Построить систему управления базой данных (в дальнейшем-СУБД), отражающую учет книг и музыкальных композиций в библиотеке музыкальной школы. При этом надо предусмотреть, что данные могут вноситься разными людьми. Построить базу данных, которая была бы максимально гибкой. В базе данных должны содержаться данные о книгах, издательствах, читателях, возврат и выдач книг.
База данных нормализована и состоит из четырех таблиц. Она разбита на четыре таблицы, дабы быть максимально гибкой.
Таблица 1 - Структура таблиц
Название столбца | Описание |
Таблица книги (tt1) |
T1 | Номер книги |
T2 | Автор |
T3 | Наименование |
T4 | Год издания |
T5 | Код издательства |
Таблица читатели(tt2) |
T1 | Номер читательского билета |
T2 | Фамилия |
T3 | Адрес |
T4 | Дата рождения |
T5 | Телефон |
Таблица издательства(tt3) |
T1 | Код издательства |
T2 | Наименование |
T3 | Адрес |
T4 | e-mail |
T5 | Телефон |
Таблица выдача и возврат книг (tt4) |
T1 | № читательского билета |
T2 | Дата выдачи |
T3 | Дата возврата |
T4 | Дата фактического возврата |
T5 | Номер книги |
Все атрибуты имеют строковый тип данных. Причем столбец T1 у каждой из таблиц является первичным ключом, то есть данные в нем уникальны.
Изобразим связь между таблицами:
Рисунок 1 - Связь между таблицами
Связь эта осуществляется через уникальные поля каждой из таблиц. Из схемы видно, что связь между выдачей и возвратом книг и например, издательствами, осуществляется только через читатели предметов. Такая организация базы данных позволяет избежать дублирования данных.
2.2 Типы данных
Основным объектом в данной программе является книга, все остальные объекты в программе так или иначе связаны с книгой.
Для реализации базы данных и их объектов были использованы следующие типы данных: m: byte.
Переменная хранит, данные о всех атрибутах, представленных выше таблиц.
3 Описание программы создания набора данных
В данной программе записью будет являться книга, а полями записи будет информация о книге.
Процедуры следующего типа осуществляют загрузку и выгрузку данных из файла. Полный текст процедур представлен в приложении . Чтение осуществляется с помощью readetip, а запись – writetip. В этих процедурах используются глобальные переменные. Загрузка идет посредством таблиц tt1, tt2, tt3, tt4. При работе пользователь работает как бы с одним файлом, хотя реально каждая из таблиц сохраняется в свой файл. При запросе пользователь вводит название файла, а потом к этому названию добавляется слева цифра – 1, 2, 3 или 4. Например если при сохранении в типизированный файл имени сохраняемого файла присвоить значение pasha, то таблица tt1 будет сохранена в файле 1pasha, tt2 – 2pasha, tt3 – 3pasha, tt4 – 4pasha. При выгрузке из файла присвоение имен идет таким же образом. Для сохранения в текстовой файл используется процедура tabl11(t:integer;rab:cc), где rab – сохраняемая таблица, а t – помогает найти заголовки столбцов текущей таблицы. Результат выполнения данной процедуры можно посмотреть выше, где показаны таблицы первоначальных данных. Для вывода содержимого таблицы на экран используется процедура tabl1(t:integer;rab:cc;yd:boolean), действие которой аналогично предыдущей, только добавляется параметр yd, от которого зависит, нужно ли затирать таблицу сразу или она должна повисеть на экране, пока пользователь не ввел какие либо данные.
names,namer:string[10] – строковые переменные, которые вынесены в глобальные, чтобы сделать программу более компактной. Иначе бы в разных процедурах надо было вводить аналогичные типы данных, а так можно обойтись лишь парой глобальных переменных.
key,kr:char – символьные переменные. В переменной key хранится код нажатой клавиши. А в переменной kr находится текущее положение звездочки. Звездочка будет рассмотрена ниже.
tek,i,j,izm:integer – целочисленные переменные. Из них i и j –циклические, временные переменные. Tek и izm показывают, какое меню активно в текущий момент. Они помогают понять программе от какого меню к какому перешли, тоесть помогает восстановить последовательность действий.
exist,vfile,issor:boolean – Логические переменные. Exist – служит для выхода из программы. Vfile – позволяет пускать одну процедуру по двум путям – либо выводить данные на экран, либо в файл. Issor – показывает меню выбора таблиц, что следующим шагом должна быть сортировка данной таблицы.
nast:pered – Типизированная переменная, в которой хранятся строки текущего меню. Описание типа pered имеется в модуле:
pered=record
st:array[1..12] of string;
m:byte; {количество строк в меню}
end;
temr,tt1,tt2,tt3,tt4:cc – Таблицы базы данных. Тут tt1 – таблица с данными о студентах, tt2 – предметы, tt3 – преподаватели, tt4 – оценки (успеваемость). Temr – временная таблица. Все эти переменные являются динамическими списками.
4 Описание программы формирование выходного документа
К выходным документам относятся:
- Вывод информации на экран;
- Вывод информации в файл.
4.1 Вывод информации на экран
Пример формирования выходного документа на экран представлены в приложении 4.
Экран в данной программе состоит из меню:
– Заголовок. Заголовок находится в верхней части экрана и выводит название программы «База данных».
– Меню. Меню находится в левой части экрана и отображает пользователю существующие разделы меню, по которым можно осуществить выбор различных операций с данными.
4.2 Вывод информации в файл
Информация в файл выводится при создании файла отчета, при сохранении в типизированный или текстовый файл. Отчет создается по таблицам с данными.
Файл будет иметь расширение txt или pas и находится в корневой папке с программой. Данные в файле будут отформатированы и неплохо оформлены.
Пример формирования выходного документа в файл представлены в приложении 4.
5 Описание программы формирование списковой структуры
5.1 Область применения списковой структуры
Списковая структура применяется для передвижения по элементам внутри таблиц. Когда пользователь загружает определенную таблицу, формируется запрос, результатом которого будут элементы, найденные в БД, каждый из которых, будет соответствовать выбранным пользователем критериям. Причиной необходимости использования динамической структуры явилось то, что при программировании не известно какое количество элементов будет в выбранном разделе. По этому, когда находится очередной элемент, удовлетворяющий выбранному пользователем разделом и подразделом, код этого элемента просто добавляется в список. А на экран выводится элемент, код которого последний в списке.
5.2 Принцип работы
В данной программе работу с динамическим списком можно охарактеризовать в виде стека. Общий принцип работы следующий:
– Когда пользователь выбирает нужный ему подраздел, программа ищет в файле БД первый элемент, если таковой вообще существует, который удовлетворяет выбранному пользователем разделу и подразделу и код этого товара добавляется в динамический список – стек.
– Далее программа выводит на экран информацию о элементе базы данных, код которого находится в вершине стека.
– При нажатии пользователем клавиши Enter, вновь осуществляется поиск элемента в БД, который соответствует выбранному пользователем разделу и подразделу, но уже программа проверяет, не находится ли код этого элемента уже в стеке. Если нет, то код элемента добавляется в стек и на экран выводится элемент, код которого находится в вершине стека, т.е. зашедший в стек последний. При повторном нажатии на Enter, проделывается все то же самое.
Подводя итог можно сказать, что фактически перемещение происходит в стеке, а на экран выводится лишь товар с кодом товара из вершины стека.
5.3 Процедуры, используемые при работе со списком
Полностью описывать весь алгоритм данных процедур в данном разделе не будем, затронем только те их части, которые взаимодействуют непосредственно со списком.
При работе со списком используются следующие функции:
– Чтение элемента из списка;
– Добавление элемента в список;
– Поиск элемента в списке;
– Удаление элемент из списка.
6 Описание программы формирования списковой структуры
6.1 Динамические структуры данных
Объект данных обладает динамической структурой, если его размер изменяется в процессе выполнения программы или он потенциально бесконечен.
Статические и динамические переменные в Паскале
В Паскале одной из задач описания типов является то, чтобы зафиксировать на время выполнения программы размер значений, а, следовательно, и размер выделяемой области памяти для них. Описанные таким образом переменные называются статическими.
Все переменные, объявленные в программе, размещаются в одной непрерывной области оперативной памяти – сегмент данных. Длина сегмента данных определяется архитектурой микропроцессора и составляет обычно 65536 байт.
Однако порой заранее не известны не только размеры значений, но и сам факт существования значения той или иной переменной. Для результата переменной приходится отводить память в расчете на самое большое значение, что приводит к нерациональному использованию памяти. Особенно это затруднительно при обработке больших массивов данных.
Выходом из положения может служить использование так называемой динамической памяти.
Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кб), стека (16 Кб) и собственно тела программы. Размер динамической памяти можно варьировать. По умолчанию ДП – вся доступная память ПК.
ДП – это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования ДП. Например, при разработке САПР статическое распределение памяти невозможно, т.к. размерность математических моделей в разных проектах может значительно различаться.
И статические и динамические переменные вызываются по их адресам. Без адреса не получить доступа к нужной ячейке памяти, но при использовании статических переменных, адрес непосредственно не указывается. Обращение осуществляется по имени. Компилятор размещает переменные в памяти и подставляет нужные адреса в коды команд.
Адресация динамических переменных осуществляется через указатели. Их значения определяют адрес объекта.
Для работы с динамическими переменными в программе должны быть выполнены следующие действия:
- Выделение памяти под динамическую переменную;
- Инициализация указателя;
- Освобождение памяти после использования динамической переменной.
Программист должен сам резервировать место, определять значение указателей, освобождать ДП.
Вместо любой статической переменной можно использовать динамическую, но без реальной необходимости этого делать не стоит.
6.2 Чтение элемента из списка
В данном разделе указатель перемещается на последний элемент и считывается хранящийся там код элемента. Далее, с этим кодом элемента происходит либо, какое то сравнение, условие, либо присваивается некоторой переменной, либо удаляется код из списка.
6.3 Добавление элемента в список
Добавление кода элемента в список происходит по следующему алгоритму:
– Создается новый элемент;
– Записывается код товара из файла в список;
– Устанавливается указатель для поддержания целостности списка;
6.4 Поиск элемента в списке
Поиск осуществляется по следующему алгоритму:
– Переход на последний элемент списка – вершину стека;
– До тех пор пока не конец стека делать;
– Если текущий код товара из файла БД равен коду элемента из списка, то условие выполнено, если нет, то считывается следующий элемент из списка и т.д.
6.5 Удаление элемента из списка
Удаления кода элемента из списка выполняется по следующему алгоритму:
– Переход на последний элемент списка – вершина стека;
– Создание связи, со следующим элементом;
– Удаление элемента;
– Присваивание нового последнего элемента.
7 Технология обработки данных
Последовательность операций с данными заключается в следующем (приложение 5 схема 1):
– Вывод меню;
– Создания и управление разделами и подразделами меню;
– Выбор режима работы;
– Вывод на экран элементов соответствующих разделу и подразделу;
– Операции над элементами БД.
Для реализации выше перечисленных функций использовались следующие процедуры.
Программа отвечает на то, какую клавишу нажал пользователь и передает управление процедуре main. Процедура readkey используется в основном блоке программы. Для работы с управляющими клавишами используются их коды в таблице ISCII. Тут:
80 – курсор вверх
72 – курсор вниз
27 – ESC
13 – Enter
При нажатии на клавишу «Ввод» управление передается продцедуре main. При этом используются глобальные переменные.
В процедуре main управление переходит к подпрограмме, согласно текущему меню, но порой надо знать откуда был осуществлен вход. Как я уже говорил, зайти в меню выбора таблиц можно по разному. Все меню имеют разные заголовки, которые и используются для их идентификации. При нажатии на кнопку «Выход», текущем становится первоначальное меню.
Интерфейсная часть программы состоит из трех процедур:
procedure menus(m:pered;max:byte); {
Вывод
меню
}
begin
clrscr;
For i:=1 to max do begin
if i=1 then begin
textcolor(1); gotoxy(9,2); write(m.st[i]);
end
else begin
if i=2 then textcolor(9)
else textcolor(3);
gotoxy(8,i+3);write(m.st[i]);
end
;
end
;
end
;
С помощью этой процедуры на экране меняются меню. Нужно учесть, что мы первоначально знаем, из сколки строк состоит каждое меню, что упрощает задачу. Заголовок и содержание меню пишутся разными цветами. Изменение цвета выводимых символов идет с помощью команды textcolor, параметром котором является предопределенная константа.
Следующая процедура:
procedure krutis; {Звездочка рядом с активным элементом}
begin
textcolor(14);
if kr='/' then kr:='-'
else if kr='-' then kr:='\'
else if kr='\' then kr:='|'
else kr:='/';
gotoxy(6,tek+3);write(kr);
textcolor
(3);
end
;
Эта процедура работает таким образом – обращение к ней идет из основного блока программы, в котором стоит бесконечный цикл. На экране отображается что то похожее на бенгальский огонь. Это достигается путем последовательного вывода на одном и том же месте символов: \, |, /, —. В переменной tek у нас содержится номер активной строки, а относительно нее мы и должны поставить звездочку.
Следующая процедура:
procedure ramka(ch:char); {перемещение указателя}
begin
gotoxy(6,tek+3);Writeln(' ');
textcolor(3);gotoxy(8,tek+3);write(nast.st[tek]);
if ch='+' then tek:=tek+1
else tek:=tek-1;
if tek=1 then tek:=nast.m
else if tek=nast.m+1 then tek:=2;
key:=#0;
textcolor(9);gotoxy(8,tek+3);write(nast.st[tek]);
krutis;
end;
Данная процедура имеет параметр символьного типа. По содержанию ch определяется – вверх или вниз сдвинулась активная строка. Обращение к этой процедуре идет из основного блока программы. Больше процедур такого рода нет (ко всем другим процедурам обращение идет из процедуры main).
Эта процедура затирает элемент, который был активен перед этим цветом по умолчанию (голубым) и стирает предыдущее положение звездочки. После этого исходя из значения ch изменяется значение tek и выделяется элемент, на который был осуществлен переход. В подпрограмме вставлены два условия:
if
tek
=1
then
tek
:=
nast
.
m
else if tek=nast.m+1 then tek:=2;
Они срабатывают когда активным является верхний элемент меню и пользователь нажал кнопку вверх, тогда текущей становится последняя строка, и наоборот – текущая строка является последней, а пользователь нажал кнопку вниз, тогда активной станет первая строка активного меню.
Следующая процедура - obrabotka(iz,t:integer; var rab:cc). Эта процедура вызывается при корректировке записей. Через параметр iz процедура выбирает путь дальнейшего хода. То есть надо ли добавить запись, изменить или удалить. Параметр rab – это таблица, которая передается в процедуру, и параметр var показывает, что данную таблицу можно изменять непосредственно из процедуры.
В ней используются локальные переменные –
dlud:string;
bis:boolean;
tems,temr,tem:cc;
Здесь все переменные типа cc – временные, dlud служит для ввода данных, а bis показывает, выполнимо ли выбранное действие или нет.
Продцедура sort(iz,t:integer; var rab:cc) осуществляет сортировку записей в выбранной таблице по выбранному полю. Ее работа и параметры с переменными аналогичны предыдущей процедуре.
При запросах выполняется процедура zapros(num:integer), где через параметр num передается, какой именно запрос должен выполняться. Потом через условие case идет обработка запросов. Связь между таблицами осуществляется по уникальным полям.
Заключение
Подведем итог того, что все-таки удалось в данном курсовом проекте:
– Удалось создать неплохую сортировку, что облегчает работу с элементами, на мой взгляд, эта основа любой БД;
– Удалось создать достаточно простой и интуитивно понятный интерфейс, без каких либо излишеств;
– В программе реализованы основные функции работы с БД – удаление, добавление, отчетность, поиск;
– Показано когда, какая функция доступна;
– Отражено, в каком разделе осуществляется работа;
– Достаточно простое управление элементами БД.
Подводя итог можно сказать, что основная цель, на мой взгляд, все-таки выполнена, эти функции показаны и реализованы.
Ко всему прочему можно с уверенностью сказать, что данную программу можно приспособить под большинство справочников. Для этого достаточно открыть файл разделов и создать другие.
В итоге конечная цель все-таки достигнута. Была создана универсальная БД со всем набором необходимых функций. Конечно же, в Turbo Pascal достаточно сложно создавать БД и БД получаются достаточно примитивные, но принцип создания БД, описан очень хорошо.
Список используемой литературы
1) Учебное пособие. «Структуры и алгоритмы обработки данных в ЭВМ», А. Н. Горитов, г. Томск
2) Самоучитель. «Программирование в Turbo Pascal», Н. Культин.
3) Открытие Интернет источники.
Приложение 1
Графическое описание данных Разделы Подразделы у каждого раздела
Элемент у каждого подраздела Схема 1 – Общая схема описания хранения данных
Приложение 2
Представление данных в памяти ЭВМ
names:string[10]; - 2 байта;
namer:string[10]; - 2 байта;
key:char; - 1 байт;
kr:char; - 1 байт;
tek,i,j,izm:integer; - 2 байта;
exist,vfile,issor:boolean; - 1 байт;
st:array[1..12] of string;
Приложение 3
Рисунок списковой структуры
Приложение 4
Формат выходного документаРисунок 1 – Разметка экранаРисунок 2 – Просмотр элементов
Рисунок 4 – Добавление товара
Приложение 5
Схема последовательности обработки данных. Схема 1 – Общая схема Схема 2 – Вывод меню
Схема 3 – вывод разделов и подразделов
Вверх Вниз Схема 4 – Перемещение по меню
Приложение 6
Листинг программыТекст программы Kurs.pasprogram Delphins; uses crt,tips; var names,namer:string[10]; key,kr:char; tek,i,j,izm:integer; exist,vfile,issor:boolean; nast:pered; temr,tt1,tt2,tt3,tt4:cc; outf:file of tabl2;procedure menus(m:pered;max:byte); {Вывод
меню
} begin clrscr; For i:=1 to max do begin if i=1 then begin textcolor(1); gotoxy(9,2); write(m.st[i]); end else begin if i=2 then textcolor(9) else textcolor(3); gotoxy(8,i+3);write(m.st[i]); end; end; end;procedure krutis; {Звездочка
рядом
с
активным
элементом
} begin textcolor(14); if kr='/' then kr:='-' else if kr='-' then kr:='\' else if kr='\' then kr:='|' else kr:='/'; gotoxy(6,tek+3);write(kr); textcolor(3); end;procedure ramka(ch:char); {перемещение
указателя
} begin gotoxy(6,tek+3);Writeln(' '); textcolor(3);gotoxy(8,tek+3);write(nast.st[tek]); if ch='+' then tek:=tek+1 else tek:=tek-1; if tek=1 then tek:=nast.m else if tek=nast.m+1 then tek:=2; key:=#0; textcolor(9);gotoxy(8,tek+3);write(nast.st[tek]); krutis; end;procedure tabl11(t:integer;rab:cc); {Вывод
таблицы
в
файл
} var ooutf:text; tem:cc; begin clrscr; writeln('Введите
имя
файла
'); readln(names); assign(ooutf,names); rewrite(ooutf); writeln(ooutf,menu2.st[t]); writeln(ooutf,'+--------------------------------------------------------------------------+'); writeln(ooutf,'¦',mm[t-1,1]:14,'¦',mm[t-1,2]:14,'¦',mm[t-1,3]:14,'¦',mm[t-1,4]:14,'¦',mm[t-1,5]:14,'¦'); writeln(ooutf,'+--------------+--------------+--------------+--------------+--------------¦'); tem:=rab; while tem<>nil do begin writeln(ooutf,'¦',tem^.tabl.t1:14,'¦',tem^.tabl.t2:14,'¦',tem^.tabl.t3:14,'¦',tem^.tabl.t4:14, '¦',tem^.tabl.t5:14,'¦'); tem:=tem^.sled; end; writeln(ooutf,'+--------------------------------------------------------------------------+'); close(ooutf); nast:=menu1; menus(nast,nast.m); tek:=2; end;procedure tabl1(t:integer;rab:cc;yd:boolean); {Вывод
таблицы
на
экран
} var tem:cc; begin clrscr; writeln(menu2.st[t]); writeln('+--------------------------------------------------------------------------+'); writeln('¦',mm[t-1,1]:14,'¦',mm[t-1,2]:14,'¦',mm[t-1,3]:14,'¦',mm[t-1,4]:14,'¦',mm[t-1,5]:14,'¦'); writeln('+--------------+--------------+--------------+--------------+--------------¦'); tem:=rab; while tem<>nil do begin writeln('¦',tem^.tabl.t1:14,'¦',tem^.tabl.t2:14,'¦',tem^.tabl.t3:14,'¦',tem^.tabl.t4:14, '¦',tem^.tabl.t5:14,'¦'); tem:=tem^.sled; end; writeln('+--------------------------------------------------------------------------+'); if not yd then begin readln; nast:=menu1; menus(nast,nast.m); tek:=2; end; yd:=false; end;procedure sort(iz,t:integer; var rab:cc); {Сортировка
по
полю
} var po:integer; te1,te2,tem:cc; str1,str2:string; ttrtt:tabl2; begin tabl1(tek,rab,true); writeln('Введите номер столбца по которому надо отсортировать данные');
readln(po); te1:=rab; while te1<>nil do begin te2:=te1^.sled; while te2<>nil do begin case po of 1:begin str1:=te1^.tabl.t1; str2:=te2^.tabl.t1; end; 2:begin str1:=te1^.tabl.t2; str2:=te2^.tabl.t2; end; 3:begin str1:=te1^.tabl.t3; str2:=te2^.tabl.t3; end; 4:begin str1:=te1^.tabl.t4; str2:=te2^.tabl.t4; end; 5:begin str1:=te1^.tabl.t5; str2:=te2^.tabl.t5; end; end; if str1>str2 then begin ttrtt:=te1^.tabl; te1^.tabl:=te2^.tabl; te2^.tabl:=ttrtt; end; te2:=te2^.sled; end; te1:=te1^.sled; end; tabl1(tek,rab,false); end;procedure obrabotka(iz,t:integer; var rab:cc); {Обработка
записей
} var dlud:string; bis:boolean; tems,temr,tem:cc; begin clrscr; if iz=1 then begin {добавление
записи
} if rab<>nil then begin tem:=rab; while tem^.sled<>nil do tem:=tem^.sled; new(tem^.sled); tem:=tem^.sled; end else begin new(rab); tem:=rab; end; writeln(mm[t,1]);readln(tem^.tabl.t1); writeln(mm[t,2]);readln(tem^.tabl.t2); writeln(mm[t,3]);readln(tem^.tabl.t3); writeln(mm[t,4]);readln(tem^.tabl.t4); writeln(mm[t,5]);readln(tem^.tabl.t5); tem^.sled:=nil; tem:=rab; izm:=0; nast:=menu1; menus(nast,nast.m); tek:=2; iz:=0; end else if iz=2 then begin {Удаление
записи
} tems:=rab; tabl1(tek,rab,true); writeln('Введите уникальный номер'); readln(dlud);
bis:=true; if rab^.tabl.t1 = dlud then begin rab:=rab^.sled; bis:=false; end else begin while tems<>nil do begin if tems^.sled^.tabl.t1=dlud then begin tem:=tems^.sled; tems^.sled:=tems^.sled^.sled; dispose(tem); bis:=false; break; end; tems:=tems^.sled; end; end;
if bis then writeln('Данной записи не обнаруженно');
nast:=menu1; menus(nast,nast.m); tabl1(tek,rab,false); izm:=0; tek:=2; end else if iz=3 then begin {изменение
данных
} tems:=rab; tabl1(tek,rab,true); writeln('Введите уникальный номер'); readln(dlud);
bis:=true; while tems<>nil do begin if tems^.tabl.t1=dlud then begin writeln(mm[t,1]);readln(tems^.tabl.t1); writeln(mm[t,2]);readln(tems^.tabl.t2); writeln(mm[t,3]);readln(tems^.tabl.t3); writeln(mm[t,4]);readln(tems^.tabl.t4); writeln(mm[t,5]);readln(tems^.tabl.t5); break; end; tems:=tems^.sled; end;
if bis then writeln('Данной записи не обнаруженно');
nast:=menu1; menus(nast,nast.m); tabl1(tek,rab,false); izm:=0; tek:=2; end; end;procedure zapros(num:integer); {Запросы
} var str1,str2,str3:string; tem1,tem2:cc; nay:boolean; zz:tabl2; begin clrscr; nay:=false; case num of 2:begin tem1:=tt1; writeln('Введите фамилию автора книги');
readln(
str1);
writeln('Регистрационный номер книги');readln(str2);
while tem1<>nil do begin if tem1^.tabl.t2=str1 then begin str1:=tem1^.tabl.t1; break; end; tem1:=tem1^.sled; end; tem1:=tt2; while tem1<>nil do begin if tem1^.tabl.t2=str2 then begin str2:=tem1^.tabl.t1; break; end; tem1:=tem1^.sled; end; tem1:=tt4; while tem1<>nil do begin if ((tem1^.tabl.t5=str2) and (tem1^.tabl.t4=str1)) then begin textcolor(red); writeln('Номере читательского билета, у кого книга на руках-',
tem1^.
tabl.
t1);
nay:=true; break; end; tem1:=tem1^.sled; end;
end;
3:
begin writeln('Введите фамилию читателя');
readln(str1); tem1:=tt2; while tem1<>nil do begin if tem1^.tabl.t2=str1 then begin str1:=tem1^.tabl.t3; break; end; tem1:=tem1^.sled; end; tem1:=tt3; while tem1<>nil do begin if tem1^.tabl.t1=str1 then begin textcolor(red); writeln('Издательство
-'); with tem1^.tabl do write(' ',t2,', ',t3,', ',t4); nay:=true; break; end; tem1:=tem1^.sled; end; end; 4:
begin writeln('Введите автора книги');
readln(str1); tem1:=tt1; while tem1<>nil do begin if tem1^.tabl.t2=str1 then begin textcolor(red); writeln('Код издательства, в котором издана книга-',
tem1^.
tabl.
t5);
nay:=true; break; end; tem1:=tem1^.sled; end;
end;
5:begin
writeln('Введите дату выдачи книги');
readln(str1); tem1:=tt4; tem2:=tt1; textcolor(red); while tem1<>nil do begin if tem1^.tabl.t2=str1 then begin str2:=tem1^.tabl.t4; while tem2<>nil do begin if tem2^.tabl.t1=str2 then begin with tem2^.tabl do writeln('Данные о книге-',
t3,' ',
t4,' ',
t2);
nay:=true; end; tem2:=tem2^.sled; end; end; tem2:=tt1; tem1:=tem1^.sled;
end;
end;
6:begin
writeln('Введите фамилию читателя');
readln(str1);
tem1:=tt2;
while tem1<>nil do begin
if tem1^.tabl.t2=str1 then begin str1:=tem1^.tabl.t1; break; end;
tem1:=tem1^.sled;
end;
tem1:=tt4;
while tem1<>nil do begin
if tem1^.tabl.t5=str1 then begin
textcolor(red);
writeln('Дата возврата книги-',tem1^.tabl.t3);
nay:=true;
end;
tem1:=tem1^.sled;
end;
end;
end;
textcolor(red);
if not nay then writeln('Запрос невыполним');
textcolor(3); readln;
nast:=menu1; menus(nast,nast.m);
tek:=2;
end;
procedure writetip(temr:cc);
begin
clrscr;
write('Введите имя файла');
writeln('в котором хотите сохранить данные');
readln(names);
for i:=1 to 4 do begin
if temr<>nil then begin temr:=nil; end;
case i of
1:begin temr:=tt1; namer:='1'+names; end;
2:begin temr:=tt2; namer:='2'+names; end;
3:begin temr:=tt3; namer:='3'+names; end;
4:begin temr:=tt4; namer:='4'+names; end;
end;
assign(outf,namer); rewrite(outf);
while temr<>nil do begin
write(outf, temr^.tabl);
temr:=temr^.sled;
end;
CLOSE(outf);
end;
nast:=menu1; menus(nast,nast.m); tek:=2;
end;
procedure readtip(temr:cc);
var tems:cc;
begin
clrscr;
write('Введите имя файла');
writeln('из которого надо взять данные'); readln(names);
for i:=1 to 4 do begin
if temr<>nil then begin temr:=nil; end;
if tems<>nil then begin tems:=nil; end;
case i of
1:begin new(tt1); temr:=tt1; namer:='1'+names; end;
2:begin new(tt2); temr:=tt2; namer:='2'+names; end;
3:begin new(tt3); temr:=tt3; namer:='3'+names; end;
4:begin new(tt4); temr:=tt4; namer:='4'+names; end;
end;
assign(outf,namer); reset(outf);
if eof(outf) then begin
case i of
1:begin dispose(tt1);tt1:=nil;end;
2:begin dispose(tt2);tt2:=nil;end;
3:begin dispose(tt3);tt3:=nil;end;
4:begin dispose(tt4);tt4:=nil;end;
end;
end
else begin
tems:=temr;
while temr<>nil do begin
if eof(outf) then break;
read(outf,temr^.tabl);
if eof(outf) then break;
new(temr^.sled);
temr:=temr^.sled;
end;
temr^.sled:=nil;
case i of
1:tt1:=tems;
2:tt2:=tems;
3:tt3:=tems;
4:tt4:=tems;
end;
end;
CLOSE(outf);
end;
nast:=menu1; menus(nast,nast.m); tek:=2;
end;
procedure main;
begin
key:=#0;
if nast.st[1]=menu1.st[1] then begin {Если меню - основное}
case tek of
2:readtip(temr);
3:writetip(temr);
4,5,7:begin
nast:=menu2; menus(nast,nast.m);
if tek=7 then issor:=true;
if tek=4 then vfile:=true
else if tek=5 then vfile:=false;
tek:=2;
end;
6:begin
nast:=menu3; menus(nast,nast.m); tek:=2;
end;
8:begin
nast:=menu4; menus(nast,nast.m); tek:=2;
end;
9: begin
exist:=true;
end;
end;
end
else if nast.st[1]=menu3.st[1] then begin {Если текущее меню-menu3}
case tek of
2,3,4:begin
izm:=tek-1;
nast:=menu2; menus(nast,nast.m); tek:=2;
end;
5:begin
nast:=menu1;
menus(nast,nast.m); tek:=2;
end;
end;
end
else if nast.st[1]=menu4.st[1] then begin {Если текущее меню-menu4}
case tek of
2,3,4,5,6:zapros(tek);
7:begin
nast:=menu1;
menus(nast,nast.m); tek:=2;
end;
end;
end
else if nast.st[1]=menu2.st[1] then begin {Если текущее меню-menu2}
if izm>0 then begin
case tek of
2:obrabotka(izm, tek-1,tt1);
3:obrabotka(izm, tek-1,tt2);
4:obrabotka(izm, tek-1,tt3);
5:obrabotka(izm, tek-1,tt4);
6:begin
nast:=menu1; menus(nast,nast.m); izm:=0; tek:=2;
end;
end;
end
else if issor=true then begin
issor:=false;
case tek of
2:sort(izm, tek-1,tt1);
3:sort(izm, tek-1,tt2);
4:sort(izm, tek-1,tt3);
5:sort(izm, tek-1,tt4);
6:begin
nast:=menu1; menus(nast,nast.m); izm:=0; tek:=2;
end;
end;
end
else begin
case tek of
2:if vfile then tabl11(tek,tt1)
else tabl1(tek,tt1,false);
3:if vfile then tabl11(tek,tt2)
else tabl1(tek,tt2,false);
4:if vfile then tabl11(tek,tt3)
else tabl1(tek,tt3,false);
5:if vfile then tabl11(tek,tt4)
else tabl1(tek,tt4,false);
6:begin
nast:=menu1; menus(nast,nast.m); izm:=0; tek:=2;
end;
end;
end;
end;
end;
begin
clrscr;
textBackground(black);
tek:=2; kr:='-';
exist:=false;
nast:=menu1; menus(nast,nast.m);
while 1>0 do begin
if keypressed then key:=readkey;
case key of
#80:ramka('+');
#72:ramka('-');
#27:exist:=true;
#13:main;
end;
if exist then exit;
krutis;
end;
end.
Текст модуля Tips.pas
Unit tips;
interface
type
pered=record
st:array[1..12] of string;
m:byte;
end;
tabl2=record
t1,t2,t3,t4,t5:string[12];
end;
cc=^tab;
tab=record
tabl:tabl2;
sled:cc;
end;
var
menu1,menu2,menu3,menu4:pered;
mm:array[1..5,1..5] of string[50];
implementation
begin
with menu1 do begin
st[1]:='БАЗА ДАННЫХ';
st[2]:='Загрузка';
st[3]:='Сохр. в тип. файл';
st[4]:='Сохр. в текст. файл';
st[5]:='Просмотр';
st[6]:='Корректировка';
st[7]:='Сортировка';
st[8]:='Запросы';
st[9]:='Выход';
m:=9;
end;
mm[1,1]:='Номер книги';
mm[1,2]:='Автор';
mm[1,3]:='Наименование';
mm[1,4]:='Год издания';
mm[1,5]:='Код издател.';
mm[2,1]:='№ читат.билета';
mm[2,2]:='Фамилия';
mm[2,3]:='Адрес';
mm[2,4]:='Дата рождения';
mm[2,5]:='Телефон';
mm[3,1]:='Код издател.';
mm[3,2]:='Наименование';
mm[3,3]:='Адрес';
mm[3,4]:='e-mail';
mm[3,5]:='Телефон';
mm[4,1]:='№ читат.билета';
mm[4,2]:='Дата выдачи';
mm[4,3]:='Дата возврата';
mm[4,4]:='Дата факт.возврата';
mm[4,5]:='Номер книги';
with menu2 do begin
st[1]:='ПРОСМОТР';
st[2]:='Книги';
st[3]:='Читатели ';
st[4]:=' Издательства';
st[5]:='Выдача и возврат книг';
st[6]:='Выход';
m:=6;
end;
with menu3 do begin
st[1]:='КОРРЕКТИРОВКА';
st[2]:='Добавление';
st[3]:='Удаление';
st[4]:='Изменение';
st[5]:='Выход';
m:=5;
end;
with menu4 do begin
st[1]:='ЗАПРОСЫ';
st[2]:='Выдача и возврат книг';
st[3]:='Книга, какого издательства у читателя на руках';
st[4]:='Издательство, в котором издана книга';
st[5]:='Данные о книге';
st[6]:='Дата сдачи книги';
st[7]:='Выход';
m:=7;
end;
end.
1. Реферат Основные направления усовершенствования организации труда на предприятии
2. Реферат на тему Основы семейного права в Республики Узбекистан
3. Реферат на тему Why Did Modern Communism Fall Essay Research
4. Реферат на тему The Tempest Essay Research Paper Caliban
5. Реферат на тему Банковский кредит
6. Реферат на тему Воспоминания Ветеранов 2
7. Реферат Финансов предприятий железнодорожного транспорта
8. Реферат на тему Оценка как метод стоимостного измерения объектов учета
9. Реферат Ингельгеринги
10. Реферат Основы бизнеса 2