ПО ТЕМЕ «ФАЙЛЫ»
Тема курсовой работы:
«Разработка в среде Turbo Pascal программы, осуществляющей начальное формирование файла и его корректировку».
ПОСТАНОВКА ЗАДАЧИ
Составить программу, которая, содержит информацию о книгах в библиотеке. Сведения о книгах содержат:
1. Номер УДК
2. Ф.И.О. автора
3. Название
4. Год издания
5. Количество экземпляров
Программа должна обеспечивать следующие функциональные возможности:
1. Начальное формирование данных и книгах в библиотеке
2. Добавление данных о книгах, поступающих в библиотеку
3. Удаление данных о списанных книгах
4. По запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.
Укрупненная схема алгоритма
РАЗРАБОТКА ПРОГРАММЫ
НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PASCAL
Программа начинается со стандартного заголовка.
program LibraryDB;
К программе подключается модуль Crt, который содержит множество подпрограмм для работы с экраном и клавиатурой.
uses Crt;
Затем объявляется константа MaxBooks, которая обозначает максимальное количество записей о книгах в библиотеке.
Const MaxBooks = 100;
После идет объявление записи BookType, которая содержит информацию о книге в библиотеке. В этой записи содержатся следующие поля:
1. UDK – номер УДК.
2. Author – автор книги
3. Name – название книги
4. Year – год издания
5. Count – количество экземпляров книги в библиотеке
Type
BookType = record
UDK: String[11];
Author: String[50];
Name: String[100];
Year: Integer;
Count: Integer;
end;
Далее производится объявление всех переменных, используемых в программе:
1. Done – переменная логического типа. Определяет, когда пользователь завершит работу с программой
2. Choice – содержит выбор пункта меню пользователя
3. BooksSize – содержит количество книг в базе данных
4. Books – массив записей о книгах
5. BookIndex – индекс книги, которую нужно удалить из массива записей
6. UDK, Author, Name, Year, Count – эти переменные содержат информацию о новой книге, которую пользователь программы хочет сохранить в базе данных
Var
Done: Boolean;
Choice: Integer;
BooksSize: Integer;
Books: array [1..MaxBooks] of BookType;
BookIndex: Integer;
UDK, Author, Name: String;
Year, Count: Integer;
Подалгоритм формирования файла записей
После объявления переменных следует объявление процедур (подалгоритмов), используемых в программе.
Процедура 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.
Тестирование программы
Приложение 5
ОБРАЗЕЦ РЕШЕНИЯ ЗАДАЧИ