Учебная работа. Курсовая работа: Разработка базы данных, отражающей учет успеваемости студентов

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (5 оценок, среднее: 4,80 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Разработка базы данных, отражающей учет успеваемости студентов

Министерство образования

Русской Федерации

Хабаровский Муниципальный технический Институт

Кафедра: «Программное обеспечение»

КУРСОВАЯ РАБОТА

По теме «Разработка базы данных,

отражающей учет успеваемости студентов»

Выполнил студент

гр. ПО -02 Самойленко П. Р.

Проверил педагог

Белоусова Людмила

Васильевна

Хабаровск 2001

Содержание:

1. Задание на разработку, постановка задачки.

2. Описание базы данных.

3. Описание средств, применяемых при разработке программки.

4. Начальные данные.

5. интерфейс программки.

6. Описание применяемых переменных и процедур.

7. способности приобретенного программного продукта.

Постановка задачки.

Выстроить систему управления базой данных (в дальнейшем-СУБД), отражающую учет успеваемости студентов университета. При всем этом нужно предугадать, что данные могут вноситься различными людьми. Выстроить базу данных, которая была бы очень гибкой. В базе данных должны содержаться данные о студентах, оценках, педагогах и предметах.

Описание базы данных.

база данных нормализована и состоит из 4 таблиц. Она разбита на четыре таблицы, чтобы быть очень гибкой. При всем этом различные таблицы могут заполняться различными людьми, а позже объединяться в одну общую базу данных. к примеру, таблицу о студентах заполняют на кафедре, на которой обучаться студент, таблицу о педагоге и предметах – на кафедре этих педагогов, а оценки ставит педагог.

структура таблиц

Все атрибуты имеют строковый тип данных. При этом столбец T1 у каждой из таблиц является первичным ключом, другими словами данные в нем неповторимы.

Изобразим связь меж таблицами:

Связь эта осуществляется через неповторимые поля каждой из таблиц. Из схемы видно, что связь меж педагогами и к примеру, студентами, осуществляется лишь через таблицу предметов. Таковая организация базы данных дозволяет избежать дублирования данных. к примеру, если б у нас таблица предметов была объединена с таблицей педагогов, то мог выползти таковой вариант – один педагог ведет два предмета, как следует его фамилия, имя и отчество будут повторятся в таблице два раза. А это уже именуется избыточностью данных.

Описание средств, применяемых при разработке программки

Данный программный продукт работает в текстовом режиме, временами меняя цвет выводимых знаков при помощи процедуры textcolor(). Эта процедура принадлежит модулю crt. Кроме нее из этого модуля употребляется еще две процедуры: clrscr – для отчистки экрана, да gotoxy – для перехода на данные координаты экрана.

В программке употребляются списки, записи, собственные модули. Какие же достоинства дают использованные средства?

Списки разрешают правильно употреблять память компа и выделять ее динамически, не занимая ее попусту. правда при использовании списков я увидел существенное повышение кода программки по сопоставлению со случаем, если б мы употребляли массивы и записи. Но работать с записями намного эффективнее, в особенности при разработке баз данных. При работе над данной СУБД я употреблял обычные процедуры для работы с указателями:

New() – выделение памяти для переменной

Dispose() — Возвращение памяти в кучу.

Указатель в моем случае показывает на последующий кортеж в данной таблице.

Четыре таблицы хранятся в динамическом перечне. Перечень завершается, как последующий элемент воспринимает

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

Модуль я использую для предопределения в нем типов и наполнения записей, значения которых будут позже применены в главный программке. В этих записях я храню массивы строк – строк меню. Таковым образом, этот код не «захламляет» код главный программки. И добавлять новейшие элементы в меню намного проще – не нужно переделывать всю программку.

Начальные данные

Для примера я ввел некие данные и сохранил в файле
. Вот эти данные, выведенные при помощи команды – «Сохр. в текст. файл
»:

Студенты

+—————————————————————————+

¦ Студенческий¦ Фамилия¦ Имя¦ Отчество¦ Стипендия¦

+—————+—————+—————+—————+—————¦

¦ 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 представлено основное меню программки, которое возникает при ее запуске. здесь:

«загрузка
» — ввод базы данных из типизированного файла.

«Сохр. в тип. файл
» — сохранение базы данных в типизированном файле.

«Сохр. в текст. файл
» — сохранение избранной таблицы в текстовой файл.

«Просмотр
» — просмотр данных таблиц.

«Корректировка
» — изменение записей таблиц.

«Сортировка
» — сортировка записей по определенному полю.

«Запросы
» — поиск данных в 4 таблицах, надлежащие данному условию.

«Выход
» — выход из программки.

основное меню содержит вложенные. К примеру на 2 рисунке показано меню, служащее для выбора таблицы (одной из 4). Вход в него быть может осуществлен по различному. Другими словами это меню вы будете проходить во время просмотра данных, при корректировке и при сохранении в текстовой файл. Это меню в комментах не нуждается.

При выбирании «Корректировка» вы перейдете к меню, показанному на рисунке 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 имеется в модуле:

temr,tt1,tt2,tt3,tt4:cc – Таблицы базы данных. здесь tt1 – таблица с данными о студентах, tt2 – предметы, tt3 – педагоги, tt4 – оценки (успеваемость). Temr – временная таблица. Все эти переменные являются динамическими перечнями. Они описаны в файле tips.pas:









программка отвечает на то, какую кнопку надавил юзер и передает управление процедуре main. Процедура readkey употребляется в главном блоке программки. Для работы с управляющими кнопками употребляются их коды в таблице ISCII. здесь:

80 – курсор ввысь

72 – курсор вниз

27 – ESC

13 – Enter

При нажатии на кнопку «Ввод» управление передается продцедуре main. При всем этом употребляются глобальные переменные.

В процедуре main управление перебегает к подпрограмме, согласно текущему меню, но иногда нужно знать откуда был осуществлен вход. Как я уже гласил, зайти в меню выбора таблиц можно по различному. Все меню имеют различные заглавия, которые и употребляются для их идентификации. При нажатии на клавишу «Выход
», текущем становится первоначальное меню.

Интерфейсная часть программки состоит из 3-х процедур:



For i:=1 to max do begin

При помощи данной нам процедуры на дисплее изменяются меню. необходимо учитывать, что мы сначало знаем, из сколки строк состоит каждое меню, что упрощает задачку. Заголовок и содержание меню пишутся различными цветами. Изменение цвета выводимых знаков идет при помощи команды textcolor, параметром котором является предопределенная константа.

Последующая процедура:

Эта процедура работает таковым образом – воззвание к ней идет из основного блока программки, в каком стоит нескончаемый цикл. На дисплее отображается что то схожее на бенгальский огнь. Это достигается методом поочередного вывода на одном и том же месте знаков: , |, /, —. В переменной tek у нас содержится номер активной строчки, а относительно нее мы и должны поставить звездочку.

Последующая процедура:

Данная процедура имеет параметр символьного типа. По содержанию ch определяется – ввысь либо вниз двинулась активная строчка. Воззвание к данной нам процедуре идет из основного блока программки. Больше процедур такового рода нет (ко всем остальным процедурам воззвание идет из процедуры main).

Эта процедура затирает элемент, который был активен перед сиим цветом по дефлоту (голубым) и стирает предшествующее положение звездочки. Опосля этого исходя из значения ch меняется значение tek и выделяется элемент, на который был осуществлен переход. В подпрограмме вставлены два условия:

Они срабатывают когда активным является верхний элемент меню и юзер надавил клавишу ввысь, тогда текущей становится крайняя строчка, и напротив – текущая строчка является крайней, а юзер надавил клавишу вниз, тогда активной станет 1-ая строчка активного меню.

Процедуры последующего типа производят загрузку и выгрузку данных из файла. Я не буду тут приводить полный текст процедур, потому что его можно поглядеть в приложении. Чтение осуществляется при помощи readetip, а запись – writetip. В этих процедурах употребляются глобальные переменные. загрузка идет средством таблиц tt1, tt2, tt3, tt4. При работе юзер работает вроде бы с одним файлом, хотя реально любая из таблиц сохраняется в собственный файл. При запросе юзер вводит заглавие файла, а позже к этому наименованию добавляется слева цифра – 1, 2, 3 либо 4. к примеру если при сохранении в типизированный файл имени сохраняемого файла присвоить значение
, то таблица tt1 будет сохранена в файле

, tt2 –

, tt3 –

, tt4 –

. При выгрузке из файла присвоение имен идет таковым же образом. Для сохранения в текстовой файл употребляется процедура 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 указывает, что данную таблицу можно изменять конкретно из процедуры.

В ней употребляются локальные переменные –

тут все переменные типа 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 kractiveXthen 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 chactiveXthen 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.t2);

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]:=’Отчество’;

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.

]]>