Пример выполнения контрольной работы

advertisement
Министерство образования и науки Российской Федерации
Волжский политехнический институт (филиал) федерального государственного
бюджетного образовательного учреждения высшего образования «Волгоградский
государственный технический университет»
(ВПИ (филиал) ВолгГТУ)
Вечерний факультет
Факультет «_________________________________________________________»
Информатика и технология программирования
Кафедра «___________________________________________________________»
КОНТРОЛЬНАЯ РАБОТА
Основы программирования
по дисциплине «_____________________________________________________»
Разработка СУБД средствами языка Си
на тему______________________________________________________________
вариант №
____________________________________________________________________
Сергей Петрович Иванов
Студент_____________________________________________________________
ВИЗ-175
Группа________________________
Оценка
(имя, отчество, фамилия)
________________________
(зачтено/незачтено)
Проверил
________________________
доц. Лясин Д.Н._________
(подпись и дата подписания)
(долж., инициалы и фамилия)
Нормоконтролер ______________________________
(подпись, дата подписания)
_______________________
(инициалы и фамилия)
Волжский, 2015 г.
Задание на контрольную работу.
Разработать программу, которая позволяет вести базу данных по учету книг в
библиотеке. Для каждой книги необходимо хранить информацию о ее названии,
имени автора, годе издания, количестве страниц и стоимости. Информацию о книгах
хранить в виде односвязного списка. Предусмотреть в программе возможности:
- добавления новой книги в конец списка;
- просмотра списка;
- сохранения списка книг в файле и загрузки ранее сохраненного списка из файла;
- сортировки книг в списке по названию или году изданию;
- поиска книг по названию и фамилии автора;
- удаление книги из списка по названию.
Описание форматов хранения данных в программе.
Информация о книгах хранится в файл на диске с предопределенным именем
c:\lib.dat. В файл информация записывается в двоичной форме в следующем формате:
сначала 4 байта – целое число, определяющее количество книг в списке, записанном
в файле. Затем записываются непосредственно данные о книгах блоками по
sizeof(book) байт.
Данные о введенных книгах при сортировке сохраняются в программе в виде
одномерного списка. Элемент списка (информация об одной книге) определен в виде
структуры:
struct book{
char title[30], author[30];
int pages, year;
double price;
book *next;};
Адрес начала списка хранится в глобальной переменной head. Адрес
последнего введенного элемента списка хранится в переменной current. Количество
элементов в списке хранится в переменной nCount.
Описание структуры программы.
Программа
реализована
в
соответстивии
с
принципами
структурного
программирования. Функция main() реализует меню программы в текстовом режиме,
остальнык функции реализуют основные действия по обработке данных в списке
книг согласно варинту задания. Схема иерархии функций программы представлен на
рис.1.
main
initLib
showMenu
addBook
showLib
findBook
delBook
sortLib
loadLib
saveLib
Рис.1 Иерархия функций программы
Описание функций программы.
Функция main.
Функция main является центральной функцией программы, она реализует
выбор пользователем пунктов меню и обращение к функциям, реализующим
соответствующее действие.
Входные параметры – нет.
Возвращаемое значение – 0 при успешном завершении.
Схема алгоритма работы фунции main приведена на рис.2.
начало
initLib
ShowMenu
Выбор пункт меню
Выбран пункт «Выйти»
нет
Выбран пункт меню
1
addBook
2
showLib
3
sortLib(1)
4
sortLib(2)
5
delBook
6
findBook(1)
7
findBook(2)
showMenu
Выбор пункт меню
конец
Рис.2. Схема алгоритма работы функции main
Функция addBook
Функция addBook добаляет в конец файла информацию об очередной книге.
Входные параметры – нет.
Возвращаемое значение – нет.
Схема алгоритма работы фунции addBook приведена на рис.3.
начало addbook
вход: нет
выход: нет
Открытие потока fp, связанного с
файломfilename на чтение и запись,
нет
Поток fp создан?
да
Ввод информации о книге b:
b. title, b.author, b.year, b.pages, bprice
Увеличиваем количество книг nCount++
Переместить указатель потока в
конец потока
Записать информацию
о книге в поток fp
Вывести сообщение об ошибке
Переместить указатель потока на
4 байта от его начала
Записать значение
nCount в поток fp
Ввод символа ch
да
Ch=’д’ || ch==’Д’
нет
конец
Рис.3. Блок-схема алгоритма работы функции addBook
Далее дается описание всех остальных функций программы.
Листинг программы.
#include <iostream>
using namespace std;
#include <conio.h>
#include <string.h>
#include <windows.h>
void loadLib();
void saveLib();
char *filename="c:/lib.dat";
struct book{
//структура книга
char title[30], author[30];
int pages, year;
double price;
book *next;};
//можно объединять в односвязный список
book * head, *tmp, *current; //указателя для организации односвязного
//списка книг
int nCount; //переменная для хранения количества книг в библиотеке
//функция отображения меню
void showMenu()
{
cout<<"Выберете действие:"<<endl;
cout<<"1. Ввести элементы списка\n2. Вывести список на экран\n3. Отстортировать список по названию книг\n"
"4. Отстортировать список по году издания\n5. Удалить книгу\n6. Найти
книги по названию\n7. Найти книги по автору\n8. Выйти"<<endl;
}
//начальная инициализация файла библиотеки
void initLib()
{
FILE *fp;
fp=fopen(filename,"r");
if (fp==NULL) //если файл не существует
{
nCount=0;
fp=fopen(filename,"w"); //создаем его
if(fp==NULL)
{cout<<"Ошибка создания файла библиотеки. Программа будет закрыта!";
_getch();
exit(1);
}
fwrite(&nCount, sizeof(int), 1, fp);
//заносим в начало нового
//файла количество книг в нем - 0
}
else
fread(&nCount, sizeof(nCount), 1, fp); //из существующего файла счи//тываем количество книг
fclose(fp);
}
//функция, отображающая книги из файла библиотеки
void showLib()
{ int i;
book b;
FILE *fp;
cout<<"\nСписок книг в библиотеке\n";
if(nCount==0) cout<<"В списке нет книг";
else
{
fp=fopen(filename,"r");
if(fp==NULL)
cout<<"Ошибка чтения данных из файла";
else
{
fseek(fp, sizeof(int), SEEK_SET); //пропускаем целое число
//- количество книг в начале файла
for(i=0;i<nCount;i++) //переьираем все книги ищ файоа
{
fread(&b, sizeof(book), 1, fp);
cout<<i+1<<") \'"<<b.title<<"\', "<<b.author<<",
"<<b.year<<" г., "<<b.pages<<"стр. Цена: "<<b.price<<" руб."<<endl;
}
fclose(fp);
}
}
cout<<endl;
}
//функция добавления новой книги в конец файла
void addBook()
{
FILE *fp;
book b;
char ch;
fp=fopen(filename,"r+");
if(fp==NULL)
cout<<"Ошибка чтения данных из файла";
else
{
do
{ //вводим информацию об очередной книге
system("cls");
cin.sync();
cout<<"Введите данные о книге."<<endl;
cout<<"Название: \t" ; cin.getline(b.title, 29);
cout<<"Автор: \t"; cin.getline(b.author, 29);
cout<<"Год издания: \t"; cin>>b.year;
cout<<"Кол. страниц: \t"; cin>>b.pages;
cout<<"Цена книги: \t"; cin>>b.price;
nCount++;
//заносим информацию об очередной книге в конец файла
fseek(fp,0,SEEK_END);
fwrite(&b, sizeof(book), 1, fp);
//заносим информацию о количестве книг в начало файла
fseek(fp,0,SEEK_SET);
fwrite(&nCount, sizeof(int), 1, fp);
cout<<"\nВвести данные о еще одной книге (д/н)?";
ch=_getche();
}
while(ch=='Д' || ch=='д'); //можно ввести данные о нескольких книгах
fclose(fp);
}
cout<<endl;
}
//функция сортировки книг в файле
//если sortField=1, то сортируем по названию
//если sortField=2, то сортируем по году издания
//перед сортировкой данные о книгах заносятся в односвязный список
void sortLib(int sortField)
{
book * start, *tek;
loadLib();
//считываем данные о книгах из файла в односвязный список
start=head;
//метод вставки
while(start->next) //цикл по отсортированной части
{tek=start->next; //следующий за отсортированной частью элемент
book *k=head,*predk=k;
if (sortField==1) //сортровка по названию
while(k!=tek && strcmp(k->title,tek->title)<0)//ищем место (сверху
// вниз до текущего)
{predk=k; // запоминаем место вставки после predk
k=k->next;
// перед k
}
else
//сортировка по году издания
while(k!=tek && k->year<tek->year)//ищем место (сверху вниз
//до текущего)
{predk=k; // запоминаем место вставки после predk
k=k->next;
// перед k
}
if(k!=tek)
//вставка нужна (если не дошли до текущего)
{ start->next=tek->next;//изъяли текущий
tek->next=k;//втавляем перед k-тым
if(k==head) head=tek; //вставляем в начало очереди
else predk->next=tek;
//вставляем после predk перед k
}
start=tek;
}//конец сортировки списка
saveLib(); //сохраняем содержимое списка в файле
}
//функция удаления информации о книге из файла
void delBook()
{
bool bFind=false;
int i, nNewCount=0;
book b;
FILE *fp, *tmp;
char strTitle[30];
cout<<"Введите название удаляемой книги"<<endl;
cin.sync();
cin.getline(strTitle, 29); //вводим название удаляемой книги
fp=fopen(filename,"r+");
tmp=fopen("tmp.dat","w+");
fwrite(&nNewCount, sizeof(int), 1, tmp);
if(fp==NULL)
cout<<"Ошибка чтения данных из файла";
else
{
fseek(fp,sizeof(int),SEEK_SET);
for(i=0;i<nCount;i++)
{
fread(&b, sizeof(book), 1, fp);
if(strcmp(b.title, strTitle)!=0)//если название книги не совпадает
//с заданным - копируем во временный файл
{
fwrite(&b, sizeof(book), 1, tmp);
nNewCount++;
}
}
if (nNewCount<nCount) //если скопировано книг меньше, чем было в исходном
//файле - значит какие-то книги в новый файл не по
//пали, т.е. они удалены
{
cout<<"Книга(и) удалена\n"<<endl;
nCount=nNewCount;
}
else cout<<"Книги с таким названием нет в списке\n"<<endl;
fseek(tmp,0,SEEK_SET);
fwrite(&nCount, sizeof(int), 1, tmp);
fclose(fp);
fclose(tmp);
remove(filename);
//удаляем исходный файл
rename("tmp.dat", filename); //перемещаем временный файл на место исходного
}
}
//функция очищения односвязного списка книг
void clearLib()
{
current=head;
while(current)
{ tmp=current->next;
delete current;
current=tmp;
}
head=NULL;
nCount=0;
}
//функция сохранения данных о книгах из односвязного списка в файле
void saveLib()
{
FILE *fp;
fp=fopen(filename,"w+");
if(fp!=NULL)
{
tmp=head;
fwrite(&nCount, sizeof(int), 1, fp);
while(tmp)
{
fwrite(tmp, sizeof(book),1,fp);
tmp=tmp->next;
}
fclose(fp);
}
else
cout<<"Ошибка открытия файла"<<endl;
}
//функция загрузки данных о книгах из файла в односвязный список
void loadLib()
{
FILE *fp;
int i;
fp=fopen(filename,"r");
if(fp!=NULL)
{
clearLib();
fread(&nCount, sizeof(int),1,fp);
i=nCount;
while(i!=0)
{
if(head!=NULL)
{
current->next=new book;
current=current->next;
}
else
{
head=new book;
current=head;
}
if (current)
{
fread(current, sizeof(book), 1, fp);
current->next=NULL;
}
i--;
}
}
else
cout<<"Ошибка открытия файла с данными"<<endl;
}
//функция поиска данных о книгах в файле
//если findField=1, то ищем по названию
//если findField=2, то ищем по автору
void findBook(int findField)
{
book b;
FILE *fp;
bool bFind=false;
int i;
char strTitle[30], strAuthor[30];
cout<<"\nСписок книг в библиотеке\n";
if(nCount==0) cout<<"В списке нет книг";
else
{
cin.sync();
if(findField==1)
{
cout<<"Введите название книги для поиска"<<endl;
cin.getline(strTitle, 29); //вводим название книги для поиска
}
if(findField==2)
{
cout<<"Введите имя автора книги для поиска"<<endl;
cin.getline(strAuthor, 29); //вводим имя автора книги для поиска
}
fp=fopen(filename,"r");
if(fp==NULL)
cout<<"Ошибка чтения данных из файла";
else
{
fseek(fp, sizeof(int), SEEK_SET); //пропускаем целое число –
//количество книг в начале файла
for(i=0;i<nCount;i++) //перебираем все книги ищ файоа
{
fread(&b, sizeof(book), 1, fp);
//проверяем считанную из файла книгу на соответствие заданной характеристике поиска
if (findField==1 && !strcmp(b.title, strTitle) ||
findField==2 && !strcmp(b.author, strAuthor))
{
if(!bFind)
{
bFind=true;
cout<<"\nСписок найденных книг\n";
}
cout<<i+1<<") \'"<<b.title<<"\', "<<b.author<<",
"<<b.year<<" г., "<<b.pages<<"стр. Цена: "<<b.price<<" руб."<<endl;
}
}
fclose(fp);
if (!bFind)
cout<<"Не найдено книг с заданными
характеристиками"<<endl;
}
}
cout<<endl;
}
int main(){
SetConsoleCP(1251); //Устанавливаем кодировку для ввода
SetConsoleOutputCP (1251); //Устанавливаем кодировку для вывода
setlocale(LC_ALL, "Russian");
char ch='0';
initLib();
showMenu();
//выводим меню
ch=_getch();
while(ch!='8')
{
switch(ch)
{
//в зависимости от выбора пользователя вызываем функцию
case '1': addBook();break;
case '2': showLib();break;
case '3': sortLib(1);break;
case '4': sortLib(2);break;
case '5': delBook();break;
case '6': findBook(1); break;
case '7': findBook(2); break;
default: cout<<"Неверный ввод!!!"<<endl;
}
cout<<"Нажмите любую клавишу...";
_getch();
system("cls");
showMenu();
//выводим меню
ch=_getch();
}
return 0;
}
Download