Текст программы (с комментариями)

program BD_Book;

uses Crt, Graph; {подключаем модули для работы с текстом и графикой}

type

Book = record {структура для представления записи БД}

Name: string; {название книги}

Author: string; {автор книги}

Page: integer; {количество страниц в книге}

Price: real; {стоимость книги}

end;

List = ^Rec; {структура "Список" для хранения записей}

Rec = record

Data: Book; {информация}

Next: List; {ссылка на следующий элемент}

end;

var menu: integer; {выбранный пункт меню}

YesBD: boolean; {имеется ли БД для работы}

BD: List; {список - база данных}

procedure DelBD; {уничтожение базы данных}

begin

Dispose(BD); {уничтожаем ссылку на начало списка}

YesBD:=false; {БД для работы нет}

GotoXY(4,7); TextColor(10);

Write('БД удалена!');

end;

procedure NewBD; {создание новой базы данных}

begin

if YesBD then DelBD; {если есть база, то ее надо уничтожить}

BD:=nil; {БД пустая}

end;

procedure NewEl(t: Book); {добавление нового элемента в список}

var x: List;

S: List;

begin

if BD=nil then {если добавляется первый элемент в список}

begin

new(x); {выделить память под элемент}

x^.Data:=t; {скопировать содержимое}

x^.Next:=nil; {следующего элемента пока нет}

BD:=x; {перенос указателя на БД}

end

else {добавление не первого элемента в список}

begin {добавление элемента в конец списка}

S:=BD; {вспомогательная ссылка}

while S^.Next<>nil do {перемещение в конец списка}

S:=S^.Next;

new(x); {создание нового элемента}

x^.Data:=t;

НЕ нашли? Не то? Что вы ищете?

x^.Next:=nil;

S^.Next:=x; {добавление его в конец списка}

end;

end;

procedure GraphInit; {инициализация графики}

var

ErrorCode: Integer;

GrDriver, GrMode: Integer;

begin

GrDriver := Detect;

InitGraph(GrDriver, GrMode, '');

ErrorCode := GraphResult; {ошибка при инициализации графики}

if ErrorCode <> grOk then {в случае возникновения ошибки}

begin

Writeln('Ошибка графики:');

Writeln(GraphErrorMsg(ErrorCode));

Writeln('Невозможно показать красивую заставку :-(');

ReadKey;

end;

end;

procedure Zastavka; {заставка в графическом режиме}

var i: integer;

begin

GraphInit; {инициализация графики}

SetBkColor(1); {синий цвет экрана}

ClearDevice; {очистить экран}

for i:=0 to 15 do {рамка из прямоугольников}

begin

SetColor(i);

Rectangle(0+i*2, 0+i*2, GetMaxX-i*2, GetMaxY-i*2);

end;

SetColor(4); {Вывод информации}

SetTextStyle(DefaultFont, HorizDir, 3);

OutTextXY(200, 130, 'БД КНИГИ');

SetColor(14);

OutTextXY(110, 230, 'Выполнил ПУПКИН');

SetColor(13);

SetTextStyle(DefaultFont, HorizDir, 2);

OutTextXY(80, 330, 'студент группы №07');

SetColor(2);

SetTextStyle(DefaultFont, HorizDir, 1);

OutTextXY(250, GetMaxY-50, 'Нажмите любую клавишу');

ReadKey;

CloseGraph; {закрыть графический режим}

end;

procedure LoadBD; {Чтение БД из файла}

var FileName: string; {имя файла}

F: file of Book; {файл из структур}

tmp: Book;

begin

ClrScr;

NewBD; {создать новый список для хранения БД}

TextColor(14); GotoXY(4,2);

Write('Задайте имя файла: '); ReadLn(FileName);

Assign(F, FileName); {связать с файлом на диске}

{$I-} {отключить проверку ошибок}

Reset(F); {попытка открыть файл}

{$I+} {включить проверку ошибок}

if IOResult <> 0 then {если была ошибка при открытии файла}

begin

TextColor(12);

WriteLn('Указанный Вами файл не найден!!!');

WriteLn('Создан новый файл и создана пустая БД');

Rewrite(F); {перезаписать файл}

end

else {если файл был найден}

begin

while not eof(F) do {пока не конец файла}

begin

Read(F, tmp); {читать из файла запись}

NewEl(tmp); {добавить ее в список}

end;

TextColor(10);

GotoXY(4,7);

WriteLn('БД успешно прочитана');

end;

YesBD:=true; {БД имеется}

Close(F); {закрыть файл}

end;

procedure ViewBD; {просмотр БД}

var S: List;

i: integer;

begin

TextBackground(7);

ClrScr;

Window(4,3,78,21);

TextBackGround(0);

ClrScr;

Window(3,2,77,20);

TextBackground(1);

ClrScr; {вывод шапки таблицы}

WriteLn(' +----+---+-+------++');

WriteLn(' |№п\п| Название | Автор | Стр. | Цена |');

WriteLn(' +----+---+-+------++');

S:=BD; i:=1; {в начало БД}

while S<>nil do {пока не дошли до конца БД}

begin {вывод каждой записи из списка БД}

WriteLn(' |',i:3,' | ',S^.Data. Name:23,' | ',S^.Data. Author:21,' | ',S^.Data. Page:4,' | ',S^.Data. Price:7:2,' |');

S:=S^.Next; {переход на следующую запись}

inc(i); {увеличить количество записей}

end;

WriteLn(' +----+---+-+------++');

TextColor(10);

Write(' Нажмите любую клавишу'); ReadKey;

TextBackground(7);

ClrScr;

Window(32,3,78,21);

TextBackground(0);

ClrScr;

Window(31,2,77,20);

TextBackground(1);

ClrScr;

end;

procedure AddRec; {добавление новой записи в БД}

var tmp: Book;

begin

TextColor(12); GotoXY(4,4);

WriteLn('Введите данные о книге:'); WriteLn;

TextColor(14);

Write(' Название: '); ReadLn(tmp. Name);

Write(' Автор: '); ReadLn(tmp. Author);

Write(' Страниц: '); ReadLn(tmp. Page);

Write(' Стоимость: '); ReadLn(tmp. Price);

NewEl(tmp); {добавление нового элемента в список}

TextColor(10);

WriteLn;

WriteLn(' Новая запись добавлена!');

end;

procedure FindRec; {поиск записи}

var tmp: Book;

S: List; {вспомогательный указатель}

b1,b2,b3,b4: boolean; {для определения успеха поиска по частям}

begin

TextColor(12); GotoXY(4,2);

WriteLn('Введите данные для поиска:');

WriteLn('(если поле не участвует в поиске,');

WriteLn('(введите в него "0")');

WriteLn;

TextColor(14);

Write(' Название: '); ReadLn(tmp. Name);

Write(' Автор: '); ReadLn(tmp. Author);

Write(' Страниц: '); ReadLn(tmp. Page);

Write(' Стоимость: '); ReadLn(tmp. Price);

S:=BD;

while S<>nil do

begin

if tmp. Name='0' then b1:=true else b1:=(tmp. Name=S^.Data. Name);

if tmp. Author='0' then b2:=true else b2:=(tmp. Author=S^.Data. Author);

if tmp. Page=0 then b3:=true else b3:=(tmp. Page=S^.Data. Page);

if tmp. Price=0 then b4:=true else b4:=(tmp. Price=S^.Data. Price);

if b1 and b2 and b3 and b4 then break;

S:=S^.Next;

end;

TextColor(10);

WriteLn;

if S<>nil then

begin

WriteLn(' Найденная запись:');

WriteLn(' Название: ',S^.Data. Name);

WriteLn(' Автор: ',S^.Data. Author);

WriteLn(' Страниц: ',S^.Data. Page);

WriteLn(' Стоимость: ',S^.Data. Price);

end

else

WriteLn(' Запись на найдена!!!');

end;

procedure BDInFile; {сохранение БД в файле}

var FileName: string; {имя файла}

F: file of Book; {файл из структур}

Y: char;

S: List; {вспомогательный указатель}

begin

ClrScr;

TextColor(14); GotoXY(4,2);

Write('Задайте имя файла: '); ReadLn(FileName);

Assign(F, FileName); {связать с файлом на диске}

{$I-} {отключить проверку ошибок}

Reset(F); {попытка открыть файл}

{$I+} {включить проверку ошибок}

if IOResult <> 0 then {если была ошибка при открытии файла}

begin

TextColor(12);

WriteLn(' Создан новый файл');

Rewrite(F); {перезаписать файл}

end

else {если файл был найден}

begin

Close(F);

WriteLn(' Файл уже существует!');

Write(' Перезаписать его (Y/N)?'); Y:=ReadKey;

if (Y='Y') or (Y='y') then

begin

WriteLn(' Файл был перезаписан!');

Rewrite(F);

end

else

begin

WriteLn(' Сохранение отменено!!!');

exit;

end;

end;

S:=BD;

while S<>nil do {пока не конец списка}

begin

Write(F, S^.Data); {записать в файл запись}

S:=S^.Next; {перейти на следующую запись}

end;

TextColor(10); GotoXY(4,7);

WriteLn('БД успешно сохранена!!!');

Close(F); {закрыть файл}

end;

begin {главная программа}

Zastavka; {графическая заставка}

YesBD:=false; {БД пока нет}

TextBackground(7);

ClrScr;

Repeat {цикл для меню}

Window(4,3,30,21);

TextBackground(0);

ClrScr;

Window(3,2,29,20);

TextBackground(1);

ClrScr;

TextColor(12); GotoXY(6,2); WriteLn('МЕНЮ:'); WriteLn;

if YesBD then TextColor(7) else TextColor(14);

WriteLn(' 1. Загрузка БД из файла');

if YesBD then TextColor(14) else TextColor(7);

WriteLn(' 2. Просмотр БД');

WriteLn(' 3. Добавить запись');

WriteLn(' 4. Поиск записи');

WriteLn(' 5. Сохранение БД в файл');

WriteLn(' 6. Удаление БД');

TextColor(14);

WriteLn(' 7. Выход');

WriteLn; TextColor(12);

Write(' Ваш выбор: '); ReadLn(menu);

Window(32,3,78,21);

TextBackground(0);

ClrScr;

Window(31,2,77,20);

TextBackground(1);

ClrScr;

case menu of {организация работы меню}

1: if YesBD then WriteLn('BD uje est!') else LoadBD;

2: if YesBD then ViewBD else WriteLn('Нет БД для работы!');

3: if YesBD then AddRec else WriteLn('Нет БД для работы!');

4: if YesBD then FindRec else WriteLn('Нет БД для работы!');

5: if YesBD then BDInFile else WriteLn('Нет БД для работы!');

6: if YesBD then DelBD else WriteLn('Нет БД для работы!');

7: WriteLn(' Спасибо за работу!');

else WriteLn('Неверный ввод!!! Повторите выбор!!!');

end;

until menu=7;

end.