/*
необходимо создать программу ведения базы данных, реализованной в виде двоичного файла.
Записи базы должны быть представлены в виде структур (struct).
Для каждой базы должна быть реализована возможность добавления новой записи или удаления существующей.
Также программа должна обеспечивать вывод результатов запросов, указанных в задании.
Создать программу ведения базы данных личной библиотеки. Программа должна обеспечивать:
ввод и корректировку информации о новых книгах;
поиск информации о книгах определенного автора;
поиск информации о книгах определенного жанра.
*/
#include "stdafx. h"
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <fstream>
using namespace std;
const int SIZE=100;
struct inv_type
{
char name[15]; // Название книги
char author[15]; // Автор
char genre[15]; // Жанр
char description[45]; //Описание
}invtry[SIZE] ;
void enter();
void init_list();
void display();
void update();
void remove();
void author();
void genre();
void input(int i);
int menu();
void title();
void dis(int i);
void saveToFile();
void loadFromFile();
int main()
{
setlocale(LC_ALL,"Russian");
char choice;
init_list();
for(;;)
{
choice = menu();
switch(choice)
{
case '1': author();
break;
case '2': genre();
break;
case 'e': enter();
break;
case 'd': display();
break;
case 'u': update();
break;
case 'r': remove();
break;
case 's':saveToFile();
break;
case 'l':loadFromFile();
break;
case 'q': return 0;
}
}
}
//вывод названия столбцов
void title()
{
int width=15;
cout<< left // выравнивание по левому краю
<< setw(width)<<"Название"
<< setw(width)<<"Автор"
<< setw(width)<<"Жанр"
<< setw(width*3)<<"Описание"<< endl;
}
//Вывод на экран строк
void dis(int i)
{
int width=15;
cout<< left // выравнивание по левому краю
<< setw(width)<<invtry[i].name
<< setw(width)<<invtry[i].author
<< setw(width)<<invtry[i].genre
<< setw(width*3)<<invtry[i].description<<endl;
}
// Инициализация массива структур.
void init_list()
{
int t;
// Имя нулевой длины означает пустое имя.
for(t=0;t<SIZE;t++)
{
*invtry[t].name='\0';
*invtry[t].author='\0';
*invtry[t].genre='\0';
*invtry[t].description='\0';
}
}
// Получение команды меню, выбранной пользователем.
int menu()
{
char ch;
cout<<'\n';
do
{
cout<<"(E)nter\n"; // Ввести новый элемент,
cout<<"(D)isplay\n"; // Отобразить всю ведомость,
cout<<"(U)pdate\n"; // Изменить элемент,
cout<<"(R)emove\n"; // Удалить элемент
cout<<"(1)Search by author\n"; // Поиск информации о книгах определенного автора;
cout<<"(2)Search by genre\n"; // Поиск информации о книгах определенного жанра.
cout<<"(S)ave\n";
cout<<"(L)oad\n";
cout<<"(Q)uit\n\n"; // Выйти из программы,
cout<<"Выберите команду: ";
cin>>ch;
} while(!strchr("eduqr12sl", tolower(ch)));
return tolower(ch);
}
// проверка для ввода информации(input).
void enter()
{
int i;
// Находим первую свободную структуру.
for(i=0; i<SIZE; i++)
if(!*invtry[i].name) break;
// Если массив полон, значение i будет равно SIZE.
if(i==SIZE)
{
cout << "Список полон.\n";
return;
}
input (i);
}
// Ввод информации,
void input(int i)
{
cout<<"Название: ";
cin>>invtry[i].name;
cout<< "Автор: ";
cin>>invtry[i].author;
cout<<"Жанр: ";
cin>>invtry[i].genre;
cout<<"Описание: ";
cin>>invtry[i].description;
}
//Изменение элемента.
void update()
{
int i;
char name [15];
cout<<"Введите название книги: ";
cin>>name;
for(i=0; i<SIZE; i++)
if (!strcmp(name, invtry[i].name)) break;
if(i==SIZE)
{
cout << "Книга не найдена.\n";
return;
}
cout << "Введите новую информацию.\n";
input(i);
}
//Удаление элемента.
void remove()
{
int i;
char name [15];
cout<<"Введите название книги: ";
cin>>name;
for(i=0; i<SIZE; i++)
if (!strcmp(name, invtry[i].name)) break;
if(i==SIZE)
{
cout << "Книга не найдена.\n";
return;
}
*invtry[i].name='\0';
*invtry[i].author='\0';
*invtry[i].genre='\0';
*invtry[i].description='\0';
}
//Поиск информации о книгах определенного автора;
void author()
{
int i, n=0;
char author [15];
cout<<"Введите автора книги: ";
cin>>author;
for(i=0; i<SIZE; i++)
if (!strcmp(author, invtry[i].author))
{
if(n==0)
{
title();
n++;
}
dis(i);
}
if((i==SIZE)&(n==0))
{
cout << "Книга такого автора не найдена.\n";
return;
}
}
//Поиск информации о книгах определенного жанра.
void genre()
{
int i, n=0;
char genre [15];
cout<<"Введите жанр книги: ";
cin>>genre;
for(i=0; i<SIZE; i++)
if (!strcmp(genre, invtry[i].genre))
{
if(n==0)
{
title();
n++;
}
dis(i);
}
if((i==SIZE)&(n==0))
{
cout << "Книга такого автора не найдена.\n";
return;
}
}
// Отображение всех эелементов на экран.
void display()
{
title();
int t;
for(t=0; t<SIZE; t++)
{
if (*invtry[t].name)
dis(t);
}
}
// Чтение базы из файла
void loadFromFile()
{
//очищаем БД
init_list();
// открываем файл для чтения
ifstream instrm ("test. bin", std::ios::binary);
if(instrm. is_open()) //если открылся
{
int i = 0;
while (!instrm. eof() && i<SIZE) //пока не конец файла и массив не переполнен
{
instrm. read((char *)&invtry[i], sizeof(inv_type));
i++;
}
cout<<"База загружена.\n";
instrm. close();
}
else
cout<<"Ошибка при открытии файла.\n";
}
// Сохранение базы в файл
void saveToFile()
{
//открываем файл
ofstream outstrm ("test. bin", std::ios::binary);
if(outstrm. is_open()) //если открылся
{
outstrm. write((char*)invtry, sizeof(inv_type)*SIZE); // выводим массив в файл
outstrm. close(); //закрываем файл
cout<<"База сохранена.";
}
else
cout<<"Ошибка открытия файла.\n";
}


