Российской Федерации
Хабаровский ГосударственныйТехнический Университет
Кафедра: «Программное обеспечение»
КУРСОВАЯ РАБОТА
По теме «Разработка базы данных,
отражающей учет успеваемости студентов»
Выполнил студент
гр. ПО-02 Самойленко П. Р.
Проверил преподаватель
Белоусова Людмила
Васильевна
Хабаровск 2001
Содержание:
1. Задание на разработку, постановка задачи.
2. Описание базы данных.
3. Описание средств, используемых при создании программы.
4. Первоначальные данные.
5. Интерфейс программы.
6. Описание используемых переменных и процедур.
7. Возможности полученного программного продукта.
Постановка задачи.
Построить систему управления базой данных (в дальнейшем-СУБД), отражающую учет
успеваемости студентов вуза. При этом надо предусмотреть, чтоданные могут
вноситься разными людьми. Построить базу данных, которая была бы максимально
гибкой. В базе данных должны содержаться данные о студентах,оценках,
преподавателях и предметах.
Описание базы данных.
База данных нормализована и состоит из четырех таблиц. Она разбита на четыре
таблицы, дабы быть максимально гибкой. При этом разныетаблицы могут заполняться
разными людьми, а потом объединяться в одну общую базу данных. Например, таблицу
о студентах заполняют на кафедре, на которойучиться студент, таблицу о
преподавателе и предметах – на кафедре этих преподавателей, а оценки ставит
преподаватель.
Структура таблиц
Название столбца Описание
Таблица студентов (tt1)
T1 Номер студенческого билета
T2 Фамилия студента
T3 Имя
T4 Отчество
T5 Стипендия
Таблица предметов(tt2)
T1 Номер предмета
T2 Название предмета
T3 Номер преподавателя
T4 Часы
T5 Курс
Таблица преподавателей(tt3)
T1 Номер учителя
T2 Фамилия учителя
T3 Его имя
T4 Отчество
T5 Дата принятия преподавателя на работу
Таблица успеваемости(tt4)
T1 Код факта сдачи учебной дисциплины
T2 Оценка
T3 Дата сдачи
T4 Номер студенческого билета
T5 Код учебного предмета
Все атрибуты имеют строковый тип данных. Причем столбец T1 у каждой из таблиц
является первичным ключом, то есть данные в нем уникальны.
Изобразимсвязь между таблицами:
Связь эта осуществляется через уникальные поля каждой из таблиц. Из схемы видно,
что связь между преподавателями инапример, студентами, осуществляется только
через таблицу предметов. Такая организация базы данных позволяет избежать
дублирования данных. Например, еслибы у нас таблица предметов была объединена с
таблицей преподавателей, то мог выползти такой случай – один преподаватель ведет
два предмета, следовательноего фамилия, имя и отчество будут повторятся в
таблице дважды. А это уже называется избыточностью данных.
Описаниесредств, используемых при создании программы
Данный программный продукт работает в текстовом режиме, периодически меняя цвет
выводимых символов с помощью процедуры textcolor(). Эта процедура принадлежит
модулю crt. Помимо нее из этого модуля используется еще двепроцедуры: clrscr –
для отчистки экрана, да gotoxy – для перехода на заданные координаты экрана.
В программе используются списки, записи, собственные модули. Какие же
преимущества дают использованные средства?
Списки позволяют рационально использовать память компьютера и выделять ее
динамически, не занимая ее попусту. Правда прииспользовании списков я заметил
значительное увеличение кода программы по сравнению со случаем, если бы мы
использовали массивы и записи. Но работать с записяминамного эффективнее,
особенно при создании баз данных. При работе над данной СУБД я использовал
стандартные процедуры для работы с указателями:
New() – выделение памяти для переменной
Dispose() - Возвращение памяти в кучу.
Указатель в моем случае указывает на следующий кортеж в данной таблице.
Четыре таблицы хранятся в динамическом списке. Список заканчивается, как только
следующий элемент принимает значение nil, то есть ни на что не указывает.
Записи помогают структурировать данные, избежать избыточности.
Модуль я использую для предопределения в нем типов и заполнения записей,
значения которых будут потом использованы в основнойпрограмме. В этих записях я
храню массивы строк – строк меню. Таким образом, этот код не «захламляет» код
основной программы. И добавлять новые элементы вменю намного проще – не надо
переделывать всю программу.
Первоначальные данные
Для примера я ввел некоторые данные и сохранил в файле pasha. Вот эти данные,
выведенные с помощью команды – «Сохр.в текст. файл»:
Студенты
+--------------------------------------------------------------------------+
¦ Студенческий¦ Фамилия¦ Имя¦ Отчество¦ Стипендия¦
+--------------+--------------+--------------+--------------+--------------¦
¦ 3412¦ Поляков¦ Анатолий¦ Алексеевич¦ 54.50¦
¦ 3413¦ Старова¦ Любовь¦ Михайловна¦ 17.00¦
¦ 3414¦ Гриценко¦ Владимир¦ Николаевич¦ 0.00¦
¦ 3415¦ Котенко¦ Анатолий¦ Николаевич¦ 0.00¦
¦ 3416¦ Нагорный¦ Евгений¦ Васильевич¦ 25.50¦
+--------------------------------------------------------------------------+
Предметы
+--------------------------------------------------------------------------+
¦ Код предмета¦ Название¦ Код преподав.¦ Время учебы¦ Курс¦
+--------------+--------------+--------------+--------------+--------------¦
¦ 2001¦ Физика¦ 4001¦ 34¦ 1¦
¦ 2002¦ Химия¦ 4002¦ 68¦ 1¦
¦ 2003¦ Математика¦ 4003¦ 68¦ 1¦
¦ 2004¦ Философия¦ 4005¦ 17¦ 2¦
¦ 2005¦ Экономика¦ 4004¦ 17¦ 3¦
+--------------------------------------------------------------------------+
Преподаватели
+--------------------------------------------------------------------------+
¦ Код преподав.¦ Фамилия¦ Имя¦ Отчество¦ Начало работы¦
+--------------+--------------+--------------+--------------+--------------¦
¦ 4001¦ Викулина¦ Валентина¦ Ивановна¦ 01/04/1984¦
¦ 4002¦ Костыркин¦ Олег¦ Владимирович¦ 01/09/1997¦
¦ 4003¦ Казанко¦ Виталий¦ Владимирович¦ 01/09/1988¦
¦ 4004¦ Позднякова¦ Любовь¦ Алексеевна¦ 01/09/1998¦
¦ 4005¦ Загарийчук¦ Игорь¦ Дмитриевич¦ 10/05/1989¦
+--------------------------------------------------------------------------+
Оценки
+--------------------------------------------------------------------------+
¦ Код сдачи¦ Оценка¦ Дата сдачи¦ Студенческий¦ Код предмета¦
+--------------+--------------+--------------+--------------+--------------¦
¦ 1001¦ 5¦ 10/06/1999¦ 3412¦ 2001¦
¦ 1002¦ 4¦ 10/06/1999¦ 3413¦ 2003¦
¦ 1003¦ 3¦ 11/06/1999¦ 3414¦ 2005¦
¦ 1004¦ 4¦ 12/06/1999¦ 3412¦ 2003¦
¦ 1005¦ 5¦ 12/06/1999¦ 3416¦ 2004¦
+--------------------------------------------------------------------------+
Эти данные будут использоваться в примерах.
Интерфейспрограммы
Для того, чтоб понять, что делает программа рассмотрим ее меню:
На рисунке 1 представлено главное меню программы, которое появляется при ее
запуске. Тут:
«Загрузка» - ввод базы данных из типизированного файла.
«Сохр. в тип. файл» - сохранение базы данных в типизированном файле.
«Сохр. в текст. файл» - сохранение выбранной таблицы в текстовой файл.
«Просмотр» - просмотр данных таблиц.
«Корректировка» - изменение записей таблиц.
«Сортировка» - сортировка записей по определенному полю.
«Запросы» - поиск данных в четырех таблицах, соответствующие заданному условию.
«Выход» - выход из программы.
Главное меню содержит вложенные. Например на 2 рисунке показано меню,служащеедля
выбора таблицы (одной из четырех). Вход в него может быть осуществлен по
разному. То есть это меню вы будете проходить при просмотре данных,
прикорректировке и при сохранении в текстовой файл. Это меню в комментариях не
нуждается.
При выборе «Корректировка» вы перейдете к меню, показанному на рисунке 3.
«Добавление» - добавление нового кортежа в заданную с помощью предыдущего меню
таблицу.
«Удаление» - удаление строки из таблицы, причем запись в таблице ищется по
первому столбцу.
«Изменение» - изменение свойств существующей в базе данных строки.
Последнее подменю – это подменю запросов, на котором надо остановиться
поподробнее. Рассмотрим рисунок:
«Найти оценку» - найти оценку студента по его фамилии и предмету, который он
сдавал.
«Кто принимал экзамен» - фамилия преподавателя, принимавшего данный предмет.
«Найти размер стипендии» - размер стипендии выбранного студента.
«Вывод по оценке» - показать всех студентов, получивших данную оценку.
«Дата сдачи экзамена» - найти даты, когда принимался данный предмет.
В запросах используются реальные названия предметов, фамилии студентов, а не их
номера (для студентов например номерсоответствует номеру студенческого билета).
Больше в программе меню такого типа нет, но есть много строчного ввода,например
выполним запрос с поиском оценок. После запроса экран будет выглядеть так
(искали четверочников):
Результат запроса отображается красным цветом.
Описание используемых процедур.
Вприложении используются как глобальные, так и локальные переменные. Кглобальным
переменным относятся:
1) names,namer:string[10] – строковые переменные, которые вынесены в глобальные,
чтобы сделать программу болеекомпактной. Иначе бы в разных процедурах надо было
вводить аналогичные типы данных, а так можно обойтись лишь парой глобальных
переменных.
2) key,kr:char – символьные переменные. В переменной key хранится код нажатой
клавиши. А впеременной kr находится текущее положение звездочки. Звездочка будет
рассмотрена ниже.
3) tek,i,j,izm:integer – целочисленные переменные. Из них i и j –циклические,
временныепеременные. Tek и izm показывают, какое меню активно в текущий момент.
Они помогают понять программе от какого меню к какомуперешли, тоесть помогает
восстановить последовательность действий.
4) exist,vfile,issor:boolean – Логические переменные. Exist – служит для
выхода изпрограммы. Vfile – позволяет пускать одну процедуру по двум путям –
либо выводить данные на экран,либо в файл. Issor – показывает меню выбора
таблиц, что следующим шагом должна быть сортировкаданной таблицы.
5) 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 – временная таблица. Все эти переменные являются динамическими списками.
Ониописаны в файле tips.pas:
tabl2=record {Сама таблица}
t1,t2,t3,t4,t5:string[12]; {Состоит из строк}
end;
cc=^tab;
tab=record {Создание динамического списка}
tabl:tabl2;
sled:cc;
end;
Программаотвечает на то, какую клавишу нажал пользователь и передает
управлениепроцедуре 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;
Они срабатывают когда активным является верхний элемент меню и пользователь
нажал кнопку вверх, тогда текущей становитсяпоследняя строка, и наоборот –
текущая строка является последней, а пользователь нажал кнопку вниз, тогда
активной станет первая строка активногоменю.
Процедуры следующего типа осуществляют загрузку и выгрузку данных из файла. Я не
буду здесь приводить полный текстпроцедур, так как его можно посмотреть в
приложении. Чтение осуществляется с помощью 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, от которого зависит, нужно ли затирать таблицу
сразу или онадолжна повисеть на экране, пока пользователь не ввел какие либо
данные. Например при удалении записей из таблицы, пользователю будет удобнее,
если он будет содержание таблицы перед глазами. Например покажем содержание
таблицы студентов, которые будут
выведены после нажатии на кнопку «Просмотр»:
Следующая процедура - 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 идет
обработка запросов. Как показано на схеме взаимодействия таблиц, чтобы перейтиот
студентам к преподавателям надо пройти через таблицу оценок. Связь между
таблицами осуществляется поуникальным полям. Например для нахождении оценки
студента надо сначала из таблицы студентов найти номер его студенческого, а
потом найти номер сдаваемогопредмета из таблицы, а уже после этого, используя
полученные номера, найти из таблицы успеваемости полученную студентом оценку. То
есть связь идет по тремтаблицам. В запросах я старался как можно больше показать
возможности моей базы данных. На последнем рисунке показан один из запросов и
результат еговыполнения. Возможность создания гибких запросов является важнейшей
задачей программирования баз данных.
Возможностиполученного
программного продукта
Таким образом мы построили гибкую модель базы данных, в которой легко создать
нужный запрос, данные представлены в удобном дляпользователя виде. Интерфейс
программы построен без излишков и настроен на максимальное удобство
пользователя. Программа позволяет заполнять базу данныходновременно несколькими
пользователями, каждый из которых будет заполнять свою таблицу. Так как
программа работает с динамическими списками, то она быстра ипозволяет избежать
избыточности данных в таблицах.
Текст программы 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+1then 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 temnil 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 temnil 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 te1nil do begin
te2:=te1^.sled;
while te2nil 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 rabnil then begin
tem:=rab;
while tem^.slednil 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 temsnil 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 temsnil 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 tem1nil do begin
if tem1^.tabl.t2=str1 then begin str1:=tem1^.tabl.t1; break; end;
tem1:=tem1^.sled;
end;
tem1:=tt2;
while tem1nil do begin
if tem1^.tabl.t2=str2 then begin str2:=tem1^.tabl.t1; break; end;
tem1:=tem1^.sled;
end;
tem1:=tt4;
while tem1nil do begin
if ((tem1^.tabl.t5=str2) and (tem1^.tabl.t4=str1)) then begin
textcolor(red);
writeln('Оценка этого студента-',tem1^.tabl.t2);
nay:=true; break;
end;
tem1:=tem1^.sled;
end;
end;
3:begin {Преподаватель}
writeln('Выедите название предмета');
readln(str1);
tem1:=tt2;
while tem1nil do begin
if tem1^.tabl.t2=str1 then begin str1:=tem1^.tabl.t3; break; end;
tem1:=tem1^.sled;
end;
tem1:=tt3;
while tem1nil 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 tem1nil 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 tem1nil do begin
if tem1^.tabl.t2=str1 then begin
str2:=tem1^.tabl.t4;
while tem2nil 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 tem1nil do begin
if tem1^.tabl.t2=str1 then begin str1:=tem1^.tabl.t1; break; end;
tem1:=tem1^.sled;
end;
tem1:=tt4;
while tem1nil 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 temrnil 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 temrnil 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 temrnil then begin temr:=nil; end;
if temsnil 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 temrnil 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]:='Отчество';
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.