Также пользователь может выдать книгу определённого автора на руки, вследствие чего количество книг в общей базе данных уменьшается на единицу. Это происходит при выборе пункта "8" главного меню. При выборе данной опции пользователю предлагается ввести фамилию и инициалы автора, а также название его книги. Если данная книга по картотеке не числится, то соответствующая строка упоминает об этом. При выборе пункта "5" на печать выводится список книг, которые были выписаны из картотеки. Книгу можно возвратить в библиотеку посредством пункта "9" главного меню. При выполнении данной операции пользователю предлагается ввести фамилию и инициалы автора, а также название книги. В случае неверного ввода программа извещает пользователя об этом.
Кроме того, пользователь может добавить новый элемент в список и записать полученные изменения в основную (файловую) базу данных. Достигается это посредством пунктов меню "6" и "10" соответственно. В первом случае будет предложено ввести фамилию и инициалы автора, наименование его книги, дату издания и количество доступных экземпляров, после чего выводится главное меню. Во втором случае появляется строка, уведомляющая о том, что запись в файл проведена успешно или нет в противном случае.
Помимо этого, пользователь может удалить все книги автора. Достигается это путём выбора пункта "7" главного меню. Предлагается ввести фамилию автора, а после ввода сообщается об удалении всех книг данного автора и приводится число таковых.
В заключение стоит отметить, что если ввести новые данные, а затем вызвать пункт 2 главного меню, то последние введённые данные будут безвозмездно потеряны.
При выборе пункта "11" графический интерфейс исчезает, процесс компиляции завершается.
5. Анализ результатов
В результате работы программы был сформирован список сведений о книгах картотеки, состоящий из фамилии автора, названия книги, года её выпуска и количества экземпляров в библиотеке. Полученный список был отсортирован методом простого выбора по фамилиям авторов.
Были добавлены новые элементы в основной список, при этом не был нарушен алфавитный порядок. Помимо основного списка был сформирован список с книгами, выданными на руки. При выдаче книги на руки количество книг в библиотеки сокращалось на 1. Оба эти списка были занесены в файлы. Кроме того, было реализовано решение задачи по возвращению взятой на руки книги.
Также была реализована возможность удаления всех книг автора из картотеки по его фамилии.
Блок-схемы алгоритмов программы и основных подпрограмм представлены в приложениях А, Б, В, Г. Листинг программы представлен в приложении Д, а результаты работы программы в приложении Е.
Заключение
В процессе выполнения индивидуального задания и отчета по курсовой работе я ознакомился со способами обработки динамических структур данных.
Анализируя полученное задание, я выбрал метод решения поставленной задачи, на основе которого получил алгоритмы в виде блок-схем (приложения А, Б, В, Г, Д). Преимущество блок-схем состоит в их наглядности. Кодирование алгоритмов осуществлено на языке программирования С. Листинг программы представлен в приложении Д.
Преимущество программы состоит в простой организации пользовательского интерфейса, в удобстве ввода сведений авторах и книгах. Программа сортирует список по имени автора в алфавитном порядке, позволяет выдать книгу на руки, вернуть её назад в библиотеку и удалить все книги выбранного автора из картотеки.Возможно, что применение данной программы на практике (в существенно более доработанной форме) может оптимизировать работу персонала библиотек или учреждений, в которых требуется работа с большими базами данных.
Недостатки программы:
- на разных ЭВМ работа с файлами осуществляется по-разному. То есть при работе на одном ЭВМ задача может идеально реализовываться, а на другом выполняться, но с ошибками. Скорее всего, это вызвано разницей в версиях ТС или недоработкой разработчиков.
- при вводе в командной строке меню некорректных данных, для которых не предусмотрены действия, программа работать не будет, а в некоторых случаях возможно зацикливание, что может привести как к выходу из процесса компиляции, так и к полному выходу из интегрированной среды программирования с потерей текущих данных, что нежелательно.
Список литературы
1. Н. Б. Культин, С/С++ в задачах и примерах, СПб: БХВ-Петербург, 2001.
2. А. Б. Крупник, Изучаем С++, Спб: Питер, 2003.
3. С. Р. Дэвис, С++ для "чайников", М.: "Вильямс", 2004.
4. Т.А. Павловская, С/С++. Программирование на языке высокого уровня, Спб: Питер, 2005.
Приложение А
Листинг программы
#include <stdio.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
typedefstructAsFalonour //создание нового типа запись для хранения информационных полей элемента списка
{
intkol; //количество книг в картотеке
charnazv[20]; //название книги
intgod; //год издания
charavt[20]; //фамилия автора книги
} book; //имя созданного типа
typedefstructspisok //создание нового типа запись для хранения информации элемента списка
{
bookinf; //информационные поля
structspisok* next; //указатель на следующий элемент списка
structspisok* pred; //указатель на предыдущий элемент списка
} el; //имя созданного нового типа
//-------------------------------------------------------------\
el* vvodSp(el **top2) //создание списка
{
chars[3]={'y','e','s'}; //переменная для хранения ответа на вопрос о продолжении ввода списка
el *cur,*pr,*top,*tail,*tail2,*cur2; //указатель
clrscr();
*top2=top=tail=tail2=NULL; //обнуление указателей на начало и хвост списков
printf("Введите первую запись\n");
while(strcmp(strlwr(s),"no")!=0) //пока ответ не равен no
{
cur=(el*)malloc(sizeof(el)); //выделяем память под новый элемент (далее текущий)
cur->next=NULL; //обнуление указателя на следующий элемент текущего элемента
cur->pred=tail; //указатель на предыдущий элемент текущего элемента присваивается хвосту списка
if(top==NULL) top=cur; //если указатель на начало списка пуст то указателем на начало списка становится текущий элемент
elsetail->next=cur; //если нет, то указателем на хвост списка становится текущий элемент
tail=cur; //указатель на хвост приравнивается текущему элементу
cur2=(el*)malloc(sizeof(el)); //выделяется память под новый элемент второго списка, выполняются те же действия
cur2->next=NULL;
cur2->pred=tail2;
if((*top2)==NULL) (*top2)=cur2; // *top2 это указатель на указатель
else tail2->next=cur2;
tail2=cur2;
printf("Введите фамилию и инициалы автора:\n"); //ввод информационных полей
scanf("%s",cur->inf.avt);
printf("Введите название книги:\n");
scanf("%s",cur->inf.nazv);
printf("Введите год издания книги:\n");
scanf("%d",&cur->inf.god);
while(cur->inf.god<0)
{
printf("Год издания не может быть отрицательным числом! Введите повторно!\n"); //проверяется, положителен ли год
scanf("%d",&cur->inf.god); //повторный ввод
}
printf("Введите количество экземпляров книги:\n"); //аналогичное с количеством
scanf("%d",&cur->inf.kol);
while(cur->inf.kol<0)
{
printf("Количество книг не может быть отрицательным числом! Введите повторно!\n");
scanf("%d",&cur->inf.kol);
}
cur2->inf=cur->inf; //копировние информационных полей элемента первого списка в элемент второго списка
cur2->inf.kol=0; //количество выданных книг в начале равно 0
printf("Введете еще одну запись?(для выхода напишите no; для продолжения-yes)\n");
scanf("%s",s);
while(strcmp(strlwr(s),"no")!=0&&strcmp(strlwr(s),"yes")!=0) //пока не введён правильный вариант
{
printf("Вы неверно ввели свой выбор, введите, пожалуйста, его еще раз\n");
scanf("%s",s); //повторный ввод
}
}
returntop; //возвращение указателя на начало первого списка
}
//-----------------------------------------------------\
voidvivodSp(el *cur) //вывод списка
{
clrscr();
printf("Текущий список:\n");
if(cur==NULL) printf("Перед тем, как выводить список, необходимо его создать!");
else
{
printf("Фамилия автора\tНазвание книги\tГод издания\tКоличество экземпляров\n");
while(cur!=NULL) //печать списка пока не достигнут конец списка, если количество книг больше нуля (нужно для второго списка)
{
if(cur->inf.kol>0) printf(" %s\t\t\t%s\t %d\t\t\t %d\n",cur->inf.avt,cur->inf.nazv,cur->inf.god,cur->inf.kol);
cur=cur->next; //переход к следующему элементу
}
}
getch();
}
//--------------------------------------------------------------\
void vidacha(el *cur,el *cur2)
{
chariskA[10],iskN[10];
intn=0; //результат поиска
clrscr();
if(cur==NULL) printf("Перед тем, как производить выдачу книг, необходимо создать список!");
else
{
printf("Введите интересующего Вас автора:\n"); //ввод искомого автора и книги
scanf("%s",iskA);
printf("Введите интересующую Вас книгу:\n");
scanf("%s",iskN);
while(cur!=NULL) //пока не конец списка
{
if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur->inf.kol>0) //если элемент содержит сведения о нужной книге и есть свободные в наличии
{
cur->inf.kol--; //уменьшаем количество в первом списке
cur2->inf.kol++; //и увеличиваем во втором
n++; //поиск успешен
printf("Книга выдана на руки!");
break; //конец поиска
}
elseif((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur->inf.kol==0) //если свободных нет
{
printf("Все книги находятся на руках!");
n++; //поиск успешен
break; //конец поиска
}
cur=cur->next; //переход к следующем элементу
}
if(n==0) printf("Такой книги вообще нет!");
}
getch();
}
//---------------------------------------------------------------------\
voiddobEl(el *cur, el *cur2) //добавление нового элемента
{el *x,*x2;
clrscr();
if(cur==NULL) printf("Перед тем, как добавлять элементы в список, необходимо его создать!");
else
{
while(cur->next!=NULL) cur=cur->next; //поиск конца списка
while(cur2->next!=NULL) cur2=cur2->next; //аналогично со вторым
x=(el*)malloc(sizeof(el)); //выделение памяти под новый элемент
x2=(el*)malloc(sizeof(el)); //аналогичный действия для второго списка
printf("Введите данные на новый элемент:\n"); //ввод информационных полей
printf("Введите фамилию и инициалы автора:\n");