Реферат

Реферат Курсовая Базы данных на pascal

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 23.11.2024





Содержание

Введение. 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.pas
program 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