Подалгоритм формирования файла записей

После объявления переменных следует объявление процедур (подалгоритмов), используемых в программе.

Процедура AddBook реализует подалгоритм добавления новых записей в файл. Она вставляет в конец массива Books новую запись о книге. Переменная BooksSize увеличивается на единицу.

procedure AddBook(const AUDK, AAuthor, AName: String; AYear, ACount: Integer);

Begin

BooksSize:= BooksSize + 1;

with Books[BooksSize] do

Begin

UDK:= AUDK;

Author:= AAuthor;

Name:= AName;

Year:= AYear;

Count:= ACount;

end;

end;

 

Подалгоритм удаления записей из файла

Данный подалгоритмреализуется впроцедуре DeleteBook, которая удаляет книгу, содержащуюся в массиве Books по индексу BookIndex. Для этого массив Books сдвигается на один индекс влево начиная с BookIndex. Переменная BooksSize уменьшается на единицу.

procedure DeleteBook(BookIndex: Integer);

Var

i: Integer;

Begin

for i:= BookIndex to BooksSize - 1 do

Books[i]:= Books[i + 1];

BooksSize:= BooksSize - 1;

end;

Подалгоритм сортировки записей в файле

Сортировка записей происходит с помощью процедуры SortBooksByYear, которая упорядочивает массив Books по возрастанию года издания книг. Используется сортировка выборкой. Ее суть состоит в следующем. Берется первый элемент массива и, начиная со второго, ищется минимальный элемент. Затем найденный минимальный элемент и первый элемент меняются местами. Таким способом обрабатывается весь массив.

procedure SortBooksByYear;

Var

i, j, MinYearI: Integer;

TmpBook: BookType;

Begin

for i:= 1 to BooksSize do

Begin

MinYearI:= i;

for j:= i + 1 to BooksSize do

if Books[j].Year < Books[MinYearI].Year then MinYearI:= j;

if MinYearI <> i then

Begin

TmpBook:= Books[MinYearI];

Books[MinYearI]:= Books[i];

Books[i]:= TmpBook;

end;

end;

end;

 

Подалгоритм вывода содержимого файла

Вывод содержимого файла реализует процедура PrintBooks. Для этого просматривается весь массив от первого элемента до последнего и каждая запись о книге выводится на экран.

procedure PrintBooks;

Var

i: Integer;

Begin

for i:= 1 to BooksSize do

with Books[i] do

Begin

WriteLn('Книга #', i);

WriteLn(' УДК: ', UDK);

WriteLn(' Автор: ', Author);

WriteLn(' Название: ', Name);

WriteLn(' Год издания: ', Year);

WriteLn(' Количество экземпляров: ', Count);

end;

WriteLn;

end;



Подалгоритм сохранения записей в файле

Процедура SaveBooks сохраняет массив Books в файл на диске. Имя файла выбирается произвольно. В нашем случае оно будет ‘C:\Books’. В начале файл связывается с файловой переменной при помощи процедуры Assign. Далее файл физически создается на диске вызовом процедуры Rewrite. После этого происходит контроль ошибок и, если не удалось создать файл, пользователю выводится сообщение на экран. После создания файла происходит запись в него массива Books. В конце работы процедуры файл закрывается.

procedure SaveBooks;

Var

i: Integer;

BooksFile: Text;

Begin

Assign(BooksFile, 'C:\Books.txt');

{$I-}

Rewrite(BooksFile);

{$I+}

if IOResult <> 0 then

Begin

WriteLn('Ошибка: Невозможно создать файл для записи');

WriteLn('Нажмите <ENTER> для продолжения');

ReadLn;

end;

for i:= 1 to BooksSize do

with Books[i] do

Begin

WriteLn(BooksFile, 'Книга #', i);

WriteLn(BooksFile, ' УДК: ', UDK);

WriteLn(BooksFile, ' Автор: ', Author);

WriteLn(BooksFile, ' Название: ', Name);

WriteLn(BooksFile, '  Год издания: ', Year);

WriteLn(BooksFile, ' Количество экземпляров: ', Count);

end;

Close(BooksFile);

end;

 

Наконец, после объявления всех констант, переменных и процедур следует основная программа. Вначале устанавливаются исходные значения переменных Done и BooksSize.

Begin

Done:= False;

BooksSize:= 0;

 

Далее идет начальное формирование записей о книгах. Произвольно добавляются четыре записи о книгах А.Дюма. После этого вызывается процедура SaveBooks и книги сохраняются в файл.

AddBook('122.245.55', 'A. Дюма', 'Три мушкетера', 1975, 5);

AddBook('122.245.56', 'A. Дюма', '20 лет спустя', 1977, 7);

AddBook('122.245.57', 'А. Дюма', ' Графиня де Монсоро', 1980, 4);

AddBook('145.823.98', 'А.Дюма', 'Граф Монте-Кристо', 1982, 1);

SaveBooks;

 

Затем начинается основная работа программы. В цикле выводится меню для пользователя и в переменную Choice считывается его выбор.

while not Done do

Begin

ClrScr;

WriteLn('Программа для учета книг в библиотеке');

WriteLn('Выберите пункт меню: ');

WriteLn(' 1 – Добавление книг в библиотеку');

WriteLn(' 2 – Удаление списанной книги');

WriteLn(' 3 – Вывод списка всех книг');

WriteLn(' 4 - Выход');

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

ReadLn(Choice);

ClrScr;

 

Далее при помощи оператора множественного выбора обрабатывается команда пользователя (организация выбора пунктов меню при помощи оператора выбора)

case Choice of

 

Если пользователь выбрал первую команду, происходит добавление книги в базу данных библиотеки. Для этого пользователь вводит с клавиатуры номер УДК, автора, название, год издания книги и количество экземпляров в библиотеке. Далее при помощи процедуры AddBook запись о книге добавляется в массив Books. Затем вызывается процедура SaveBooks и книги сохраняются в файл.

1:begin

   WriteLn('Добавление новой книги в библиотеку');

   WriteLn;

   Write('Введите УДК: ');

   ReadLn(UDK);

   Write('Введите имя автора: ');

   ReadLn(Author);

   Write('Введите название книги: ');

   ReadLn(Name);

   Write('Введите год издания: ');

   ReadLn(Year);

   Write('Введите количество экземпляров: ');

   ReadLn(Count);

   AddBook(UDK, Author, Name, Year, Count);

   SaveBooks;

end;

 

При выборе второго пункта, происходит удаление книги из библиотеки. Пользователю выводится список всех книг при помощи процедуры PrintBooks, среди которых он выбирает номер книги для удаления. Вызовом процедуры DeleteBook нужная книга удаляется из массива Books. Наконец, при помощи процедуры SaveBooks книги сохраняются в файл.

2: begin

   WriteLn('Удаление списанной книги');

   PrintBooks;

   Write('Введите номер книги для удаления: ');

   ReadLn(BookIndex);

   DeleteBook(BookIndex);

   SaveBooks;

end;

 

Если пользователь выбирает третий пункт меню, программа сортирует книги по возрастанию года издания книги. Для этого вызывает процедура SortBooksByYear. Результат сортировки выводится на экран при помощи процедуры PrintBooks.

3: begin

      WriteLn('Список книг в библиотеке по годам издания');

   SortBooksByYear;

   PrintBooks;

   WriteLn('Нажмите <ENTER> для продолжения');

   ReadLn;

end;

 

Если пользователь выбирает четвертый пункт меню, переменная Done становится равной значению истины и программа завершается.

4: Done:= True;

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

else

begin

   WriteLn('Ошибка: Выбран неверный пункт меню');

   WriteLn('Нажмите <ENTER> для продолжения');

   ReadLn;

end;

Листинг программы

program LibraryDB;

uses Crt;

const MaxBooks = 100;

Type

BookType = record

UDK: String[11];

Author: String[50];

Name: String[100];

Year: Integer;

Count: Integer;

end;

Var

Done: Boolean;

Choice: Integer;

BooksSize: Integer;

Books: array [1..MaxBooks] of BookType;

BookIndex: Integer;

UDK, Author, Name: String;

Year, Count: Integer;

procedure AddBook(const AUDK, AAuthor, AName: String; AYear, ACount: Integer);

Begin

BooksSize:= BooksSize + 1;

with Books[BooksSize] do

Begin

UDK:= AUDK;

Author:= AAuthor;

Name:= AName;

Year:= AYear;

Count:= ACount;

end;

end;

 

procedure DeleteBook(BookIndex: Integer);

Var

i: Integer;

Begin

for i:= BookIndex to BooksSize - 1 do

Books[i]:= Books[i + 1];

BooksSize:= BooksSize - 1;

end;

 


procedure SortBooksByYear;


Var

i, j, MinYearI: Integer;

TmpBook: BookType;

Begin

for i:= 1 to BooksSize do

begin

MinYearI:= i;

for j:= i + 1 to BooksSize do

if Books[j].Year < Books[MinYearI].Year then MinYearI:= j;

if MinYearI <> i then

begin

TmpBook:= Books[MinYearI];

Books[MinYearI]:= Books[i];

Books[i]:= TmpBook;

end;

end;

end;

 

procedure PrintBooks;

Var

i: Integer;

Begin

for i:= 1 to BooksSize do

with Books[i] do

begin

WriteLn('Книга #', i);

WriteLn(' УДК: ', UDK);

WriteLn(' Автор: ', Author);

WriteLn(' Название: ', Name);

WriteLn(' Год издания: ', Year);

WriteLn(' Количество экземпляров: ', Count);

end;

WriteLn;

end;

 

procedure SaveBooks;

Var

i: Integer;

BooksFile: Text;

Begin

Assign(BooksFile, 'C:\Books.txt');

{$I-}

Rewrite(BooksFile);

{$I+}

if IOResult <> 0 then

begin

WriteLn(Ошибка: Невозможно создать файл для записи);

WriteLn(Нажмите <ENTER> для продолжения');

ReadLn;

end;

for i:= 1 to BooksSize do

with Books[i] do

begin

WriteLn(BooksFile, 'Книга #', i);

WriteLn(BooksFile, ' УДК: ', UDK);

WriteLn(BooksFile, ' Автор: ', Author);

WriteLn(BooksFile, ' Название: ', Name);

WriteLn(BooksFile, ' Год издания: ', Year);

WriteLn(BooksFile, ' Количество экземпляров: ', Count);

end;

Close(BooksFile);

end;

Begin

Done:= False;

BooksSize:= 0;

AddBook('122.245.55', 'A. Дюма', 'Три мушкетера', 1975, 5);

AddBook('122.245.56', 'A. Дюма', '20 лет спустя', 1977, 7);

AddBook('122.245.57', 'А. Дюма', ' Графиня де Монсоро', 1980, 4);

AddBook('145.823.98', 'А.Дюма', 'Граф Монте-Кристо', 1982, 1);

SaveBooks;

while not Done do

begin

ClrScr;

WriteLn('Программа для учета книг в библиотеке');

WriteLn('Выберите пункт меню: ');

WriteLn(' 1 – Добавление книг в библиотеку');

WriteLn(' 2 – Удаление списанной книги');

WriteLn(' 3 – Вывод списка всех книг');

WriteLn(' 4 - Выход');

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

ReadLn(Choice);

ClrScr;

case Choice of

     1:begin

   WriteLn('Добавление новой книги в библиотеку');

   WriteLn;

   Write('Введите УДК: ');

   ReadLn(UDK);

   Write('Введите имя автора: ');

   ReadLn(Author);

   Write('Введите название книги: ');

   ReadLn(Name);

   Write('Введите год издания: ');

   ReadLn(Year);

   Write('Введите количество экземпляров: ');

   ReadLn(Count);

   AddBook(UDK, Author, Name, Year, Count);

   SaveBooks;

end;

2: begin

   WriteLn('Удаление списанной книги');

   PrintBooks;

   Write('Введите номер книги для удаления: ');

   ReadLn(BookIndex);

   DeleteBook(BookIndex);

   SaveBooks;

end;

3: begin

   WriteLn('Список книг в библиотеке по годам издания');

   SortBooksByYear;

   PrintBooks;

   WriteLn('Нажмите <ENTER> для продолжения');

   ReadLn;

end;

4: Done:= True;

else

begin

   WriteLn('Ошибка: Выбран неверный пункт меню');

   WriteLn('Нажмите <ENTER> для продолжения');

   ReadLn;

end;

end;

end;

end.




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: