book.cpp
Код
// 6.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include<windows.h>
#include "BOOK.h"
#include <string.h>
#include <iostream>
#define RED FOREGROUND_RED|FOREGROUND_INTENSITY
#define GREEN FOREGROUND_GREEN|FOREGROUND_INTENSITY
using namespace std;
void PrintBook(BOOK* book)
{
printf("\tАвтор: %s.\n\tНазвание: %s.\n\tКатегория: %s.\n\tпроисхождение: %G.\n\tналичие книги в данный момент: %d.\n",
book->author,book->title, book->category,book->origin,book->presence);
}
void InitBook(BOOK* book)
{
setlocale( LC_ALL,"Russian" );
const char* presence[]={"Есть в данный момент","Нет в данный момент"};
const char* category[]={"специальная литература","хобби","домашнее хозяйство","беллетристика"};
const char* origin[]={"покупка","кража","подарок"};
cout << "Введите автора: " << endl;
cin>>book->author;
fflush(stdin);
cout <<"Введите название: " << endl;
cin>>book->title;
fflush(stdin);
cout <<"Введите категорию: \nспециальная литература(1),\nхобби(2),\nдомашнее хозяйство(3),\nбеллетристика(4)\n"<< endl;
int w;
cin >>w;
if(w>0&&w<5)
strcpy(book->category,category[w-1]);
else
{
cout <<"Вы ввели неверное значение. Категория не выбрана\n"<<endl;
strcpy(book->category,category[3]);
}
fflush(stdin);
cout << "Введите происхождение: \nпокупка(1),\nкража(2),\nподарок(3)\n" << endl;
int o;
cin >>o;
if(o>0&&o<5)
strcpy(book->origin,origin[o-1]);
else
{
cout <<"Вы ввели неверное значение. Категория не выбрана\n"<<endl;
strcpy(book->origin,origin[3]);
}
fflush(stdin);
cout << "Наличие: Есть в данный момент(1),Нет в данный момент(2)\n"<<endl;
int p;
cin >>p;
if(p>0&&p<3)
strcpy(book->presence,presence[p-1]);
else
{
cout <<"Вы ввели неверное число. продолжение невозможно.\n"<<endl;
strcpy(book->presence,presence[1]);
}
fflush(stdin);
}
void menu(int&enter)
{
HANDLE hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);//для изменения цвета
SetConsoleTextAttribute(hConsoleHandle, GREEN);
cout<<"\nВыберите действие:\n"
<<"(1)Распечатать содержимое картотеки.\n"
<<"(2)Добавить книгу в картотеку.\n"
<<"(3)Удалить книгу (книги) из картотеки.\n"
<<"(4)Записать текущее содержимое картотеки в файл.\n"
<<"(5)Считать из файла содержимое в картотеку.\n"
<<"(6)Упорядочить книги в картотеке.\n"
<<"(0)Выход из программы."
<<endl;
cin>>enter;
SetConsoleTextAttribute(hConsoleHandle, RED);
if(enter<0||enter>6)
cout<<"Вы ввели неправильное значение."<<endl;
cin.sync(); //для того,чтобы цикл
cin.clear(); //не бегал по кругу при ошибочном вводе
}
void ExitProg(records& r,bool &flag)
{
flag=0; //нет элементов
delete [] r.pBook;
r.pBook=0;
r.size=0;
}
void PrintRecord(records& r,bool& flag)
{
if(!flag) //если массив пуст
cout<<"Нет книг в картотеке."<<endl;
else
{
for(int i=0;i<r.size;i++)
{
cout<<i+1<<"ая книга:"<<endl;
PrintBook(&r.pBook[i]);
}
}
}
void AddBook(records& r,bool& flag)
{
if(!flag) //если это первое добавление
{
InitBook(r.pBook);
flag=1; //первое добавление уже было
}
else //если книги уже есть
{
BOOK * tmp=new BOOK[r.size+1]; //выделили нужное кол-во памяти
memcpy(tmp,r.pBook,r.size*sizeof(BOOK)); //переписали содержимое
delete[] r.pBook; //очистили уже ненужную память
r.pBook=tmp; //перенаправили указатель
tmp=0;
InitBook(&r.pBook[r.size]); //отправили адрес созданного кусочка на инициализацию
r.size++; //увеличили кол-во книг
}
}
void ReadFile(records& r,bool& flag)
{
FILE *f = fopen("record.txt", "r");
if(f)
{
int size=0;
fscanf(f,"size=%d ", &size);
records tmp = {new BOOK[size],size};
for (int i=0;i<size;i++)
{
fscanf(f,"Автор: %s Название: %s Категория: %s Происхождение: %G Наличие: %d\n"
, &tmp.pBook[i].author
, &tmp.pBook[i].title
, &tmp.pBook[i].category
, &tmp.pBook[i].origin
, &tmp.pBook[i].presence);
}
delete[] r.pBook;
r=tmp;
if(size)flag=1;
}
else
cout<<"Невозможно открыть файл."<<endl;
fclose(f);
}
void WriteFile(records& r,bool& flag)
{
if(!flag) //если не было первого добавления
cout<<"Нет книг в картотеке."<<endl;
else
{
FILE *f = fopen("record.txt","w");
if(f)
{
fprintf(f,"size=%d\n",r.size);
for (int i=0;i<r.size;i++)
{
BOOK* book = &r.pBook[i];
fprintf(f,
"Автор: %s Название: %s Категория: %s Происхождение: %G Наличие: %d\n",
book->author,book->title, book->category,book->origin,book->presence
);
}
cout<<"Картотека успешно переписана в файл record.txt"<<endl;
}
else
cout<<"Невозможно открыть файл"<<endl;
fclose(f);
}
}
void DelBook(records& r,bool& flag)
{
if(!flag) //если нет книг
cout<<"Нет книг в картотеке."<<endl;
else //если книги есть
{
if(r.size==1&&flag==1) //если в картотеке только 1 книга
{
flag=0;
cout<<"1ая книга успешно удалена."<<endl;
}
else //если книг больше 1
{
int enter=0;
while(enter<1||enter>r.size+1) //пока не введено правильного номера
{
cout<<"Введите номер книги , которую хотите удалить"<<endl;
cin>>enter;
if(enter<1||enter>r.size+1) //если введен неправильный номер
{
cout<<"Вы ввели неправильное значение."<<endl;
cin.sync(); //для того,чтобы цикл
cin.clear(); //не бегал по кругу при ошибочном вводе
}
else
{
BOOK * tmp=new BOOK[r.size-1]; //выделили нужное кол-во памяти
for(int i=0,j=0;j<r.size-1;i++,j++) //переписали содержимое
{
if(i+1==enter)i++;
tmp[j]=r.pBook[i];
}
delete[] r.pBook; //очистили уже ненужную память
r.pBook=tmp; //перенаправили указатель
tmp=0;
cout<<enter<<"ая книга успешно удалена."<<endl;
--r.size;
}
}
}
}
}
void SortBook(records& r,bool& flag)
{
if(!flag)
cout<<"Нет книг в картотеке."<<endl;
else if(r.size==1)
cout<<"В картотеке только 1 книга!"<<endl;
else
{
cout<<"По какому полю отортировать книги?"<<endl;
cout<<"(1)По автору.\n(2)По названию.\n(3)По происхождению.\n(4)По наличию."<<endl;
int enter=0;
while(enter<1||enter>4)
{
cin>>enter;
if(enter<1||enter>4)
{
cout<<"Вы ввели неправильное значение.\nПовторите ввод."<<endl;
cin.sync();
cin.clear();
}
}
switch(enter)
{
case 1:
Sort(r,SwapBook,CmpAuthor);break;
case 2:
Sort(r,SwapBook,CmpTitle);break;
case 3:
Sort(r,SwapBook,CmpPresence);break;
case 4:
Sort(r,SwapBook,CmpOrigin);break;
}
}
}
void Sort(records& r, void (*Swap)(BOOK*, BOOK*), int (*Compare)(BOOK*, BOOK*))
{
for(int i=0; i<r.size; i++)
for(int j=r.size-1; j>=i; j--)
{
BOOK* pCurrent = &r.pBook[i];
BOOK* pPrevious =&r.pBook[j];
if((*Compare)( pPrevious, pCurrent ) > 0)//требуется переставить
(*Swap)( pPrevious, pCurrent );
}
}
void SwapBook(BOOK* b1, BOOK* b2)
{
BOOK tmp=*b1;
*b1=*b2;
*b2=tmp;
}
int CmpAuthor(BOOK* b1, BOOK* b2)
{
return strcmp(b1->author,b2->author);
}
int CmpPresence(BOOK* b1, BOOK* b2)
{
return strcmp(b1->presence,b2->presence);
}
int CmpOrigin(BOOK* b1, BOOK* b2)
{
return strcmp(b1->origin,b2->origin);
}
int CmpTitle(BOOK* b1, BOOK* b2)
{
return strcmp(b1->title,b2->title);
}
main.cpp
Код
// stdafx.cpp: исходный файл, содержащий только стандартные включаемые модули
// 6.pch будет предкомпилированным заголовком
// stdafx.obj будет содержать предварительно откомпилированные сведения о типе
#include "stdafx.h"
#include <cstdio>
#include <iostream>
#include "BOOK.h"
#define stop __asm nop
using namespace std;
void main()
{
setlocale( LC_ALL,"Russian" );
int enter=-1;
bool flagExit=true;
bool flagFirst=false;//нет элементов
cout<<"Добро пожаловать в картотеку."<<endl;
records rec={new BOOK[1],1};
do
{
menu(enter);
switch(enter)
{
case 0:
ExitProg(rec,flagExit);break;
case 1:
PrintRecord(rec,flagFirst);break;
case 6:
SortBook(rec,flagFirst);break;
case 5:
ReadFile(rec,flagFirst);break;
case 4:
WriteFile(rec,flagFirst);break;
case 3:
DelBook(rec,flagFirst);break;
case 2:
AddBook(rec,flagFirst);break;
}
if(enter)enter=-1;
} while(flagExit);
}
// TODO. Установите ссылки на любые требующиеся дополнительные заголовки в файле STDAFX.H
// , а не в данном файле
// TODO. Установите ссылки на любые требующиеся дополнительные заголовки в файле STDAFX.H
// , а не в данном файле
// 6.pch будет предкомпилированным заголовком
// stdafx.obj будет содержать предварительно откомпилированные сведения о типе
#include "stdafx.h"
#include <cstdio>
#include <iostream>
#include "BOOK.h"
#define stop __asm nop
using namespace std;
void main()
{
setlocale( LC_ALL,"Russian" );
int enter=-1;
bool flagExit=true;
bool flagFirst=false;//нет элементов
cout<<"Добро пожаловать в картотеку."<<endl;
records rec={new BOOK[1],1};
do
{
menu(enter);
switch(enter)
{
case 0:
ExitProg(rec,flagExit);break;
case 1:
PrintRecord(rec,flagFirst);break;
case 6:
SortBook(rec,flagFirst);break;
case 5:
ReadFile(rec,flagFirst);break;
case 4:
WriteFile(rec,flagFirst);break;
case 3:
DelBook(rec,flagFirst);break;
case 2:
AddBook(rec,flagFirst);break;
}
if(enter)enter=-1;
} while(flagExit);
}
// TODO. Установите ссылки на любые требующиеся дополнительные заголовки в файле STDAFX.H
// , а не в данном файле
// TODO. Установите ссылки на любые требующиеся дополнительные заголовки в файле STDAFX.H
// , а не в данном файле
book.h
Код
#pragma once
#define SIZE 32
struct BOOK
{
char author[SIZE];
char title[SIZE];
char category[SIZE];
char presence[SIZE];
char origin[SIZE];
};
struct records
{
BOOK* pBook; //указатель на массив книг
int size; //количество книг
};
void PrintBook(BOOK* book);
void InitBook(BOOK* book);
void menu(int& enter);
void ExitProg(records& r,bool& flag);
void PrintRecord(records& r,bool& flag);
void ReadFile(records& r,bool& flag);
void WriteFile(records& r,bool& flag);
void DelBook(records& r,bool& flag);
void AddBook(records& r,bool& flag);
void SortBook(records& r,bool& flag);
void Sort(records& r, void (*Swap)(BOOK*,BOOK*), int (*Compare)(BOOK*, BOOK*));
void SwapBook(BOOK* b1, BOOK* b2);
int CmpOrigin(BOOK* b1, BOOK* b2);
int CmpPresence(BOOK* b1, BOOK* b2);
int CmpAuthor(BOOK* b1, BOOK* b2);
int CmpTitle(BOOK* b1, BOOK* b2);
заранее благодарен.