PhotoShaman

Laba18

Mar 23rd, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <clocale>
  4. #include <windows.h>
  5. #include <vector>
  6. #include <conio.h>
  7.  
  8. using namespace std;
  9.  
  10. template <typename Type>
  11. Type MagicInput(Type input) // Ввод с проверкой
  12. {
  13.     while (!(cin >> input) || (cin.peek() != '\n'))
  14.     {
  15.         cin.clear(); while (cin.get() != '\n');
  16.         cout << "Ошибка ввода. Попробуйте еще раз.\n";
  17.     }
  18.     return input;
  19. }
  20.  
  21. void SetLucidaFont()
  22. {
  23.     HANDLE hCon = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
  24.     if (hCon != INVALID_HANDLE_VALUE) {
  25.         CONSOLE_FONT_INFOEX cfi;
  26.         cfi.cbSize = sizeof(CONSOLE_FONT_INFOEX);
  27.         cfi.nFont = 0;
  28.         cfi.dwFontSize.X = 0;
  29.         cfi.dwFontSize.Y = 12;
  30.         cfi.FontFamily = FF_DONTCARE;
  31.         cfi.FontWeight = 400;
  32.         wcscpy_s(cfi.FaceName, L"Lucida Console");
  33.         SetCurrentConsoleFontEx(hCon, FALSE, &cfi);
  34.     }
  35. }
  36.  
  37. class Item
  38. {
  39. protected:
  40.     int invNumber;
  41.     bool taken;
  42. public:
  43.     Item(int invNumber, bool taken) : invNumber(invNumber), taken(taken) {};
  44.     virtual void Show() = 0;
  45.     bool isAvailable() { return !taken; }
  46.     int GetInvNumber() { return invNumber; }
  47.     void Take() { taken = true; }
  48.     void Return() { taken = false; }
  49. };
  50.  
  51. class Book : public Item
  52. {
  53. private:
  54.     string author;
  55.     string title;
  56.     string publisher;
  57.     int year;
  58. public:
  59.     Book(int invNumber, bool taken, string author, string title, string publisher, int year)
  60.         : Item(invNumber, taken), author(author), title(title), publisher(publisher), year(year) {};
  61.     string Author() { return author; }
  62.     string Title() { return title; }
  63.     string Publisher() { return publisher; }
  64.     int YearOfPublishing() { return year; }
  65.     void Show()
  66.     {
  67.         cout << endl << (taken ? "[Нет в наличии] " : "[Есть в наличии] ") << "Книга №" << invNumber
  68.             << " Название: " << title << "; Автор: " << author << "; Издатель: " << publisher << "; Год издания: " << year;
  69.     }
  70. };
  71.  
  72. void Clear()
  73. {
  74.     system("cls");
  75.     cin.clear();
  76.     cin.sync();
  77. }
  78.  
  79. void OutputAllBooks(vector <Book> &Books)
  80. {
  81.     Clear();
  82.     for (int i = 0; i < (int)Books.size(); i++)
  83.     {
  84.         Books[i].Show();
  85.     }
  86.     cout << endl;
  87.     system("pause");
  88. }
  89.  
  90. void OutputAvailableBooks(vector <Book> &Books, bool isAvaible)
  91. {
  92.     for (int i = 0; i < (int)Books.size(); i++)
  93.     {
  94.         if (isAvaible == (bool)Books[i].isAvailable())
  95.         {
  96.             Books[i].Show();
  97.         }
  98.     }
  99. }
  100. void AddBook(vector <Book> &Books)
  101. {
  102.     Clear();
  103.     int number;
  104.     bool error;
  105.     do
  106.     {
  107.         cout << "Введите номер книги: ";
  108.         number = MagicInput((int)0);
  109.         error = false;
  110.         for (int i = 0; i < (int)Books.size(); i++)
  111.         {
  112.             if (number == Books[i].GetInvNumber())
  113.             {
  114.                 cout << "Этот индект уже занят! Введите другой." << endl;
  115.                 error = true;
  116.                 break;
  117.             }
  118.         }
  119.     } while (error);
  120.     cin.get();
  121.     cout << "Введите название книги: ";
  122.     string title; getline(cin, title);
  123.     cout << "Введите автора книги: ";
  124.     string author; getline(cin, author);
  125.     cout << "Введите издателя книги: ";
  126.     string publisher; getline(cin, publisher);
  127.     cout << "Введите год издания: ";
  128.     int year = MagicInput((int)0);
  129.     Books.push_back(Book(number, false, author, title, publisher, year));
  130.     system("pause");
  131. }
  132.  
  133. void TakeBook(vector <Book> &Books)
  134. {
  135.     Clear();
  136.     cout << endl << "Книги, которые есть в библиотеке: ";
  137.     OutputAvailableBooks(Books, true);
  138.     cout << endl << "Введите номер книги, которую желаете взять: ";
  139.     int number = MagicInput((int)0);
  140.     for (int i = 0; i < (int)Books.size(); i++)
  141.     {
  142.         if (Books[i].isAvailable() && Books[i].GetInvNumber() == number)
  143.         {
  144.             Books[i].Take();
  145.             return;
  146.         }
  147.     }
  148.     cout << "Книги под номером " << number << " нет в списке." << endl;
  149.     system("pause");
  150. }
  151.  
  152. void ReturnBook(vector <Book> &Books)
  153. {
  154.     Clear();
  155.     cout << endl << "Книги, которые можно вернуть: ";
  156.     OutputAvailableBooks(Books, false);
  157.     cout << endl << "Введите номер книги, которую желаете вернуть: ";
  158.     int number = MagicInput((int)0);
  159.     for (int i = 0; i < (int)Books.size(); i++)
  160.     {
  161.         if (!Books[i].isAvailable() && Books[i].GetInvNumber() == number)
  162.         {
  163.             Books[i].Return();
  164.             return;
  165.         }
  166.     }
  167.     cout << "Книги под номером " << number << " нет в списке." << endl;
  168.     system("pause");
  169. }
  170.  
  171. void Menu()
  172. {
  173.     system("cls");
  174.     cout << "---Выберите опцию: ";
  175.     cout << endl << "1. Добавить книу ";
  176.     cout << endl << "2. Взять книгу";
  177.     cout << endl << "3. Вернуть книгу";
  178.     cout << endl << "4. Вывод всех книг";
  179.     cout << endl << "5. Вывод книг в библиотеке";
  180.     cout << endl << "6. Вывод книг у читаталей";
  181.     cout << endl << "ESC. Выход";
  182. }
  183.  
  184. int main()
  185. {
  186.     system("mode con cols=120 lines=40");
  187.     SetLucidaFont();
  188.     SetConsoleCP(1251);
  189.     SetConsoleOutputCP(1251);
  190.  
  191.     vector <Book> Books;
  192.     // Starter pack
  193.     Books.push_back(Book(1, false, "Бьерн Страуструп", "Язык программирования C++", "-", 2013));
  194.     Books.push_back(Book(2, false, "Герберт Шилдт", "C# 4.0. Полное руководство", "-", 2011));
  195.     Books.push_back(Book(3, true, "номер 3", "Книга #3", "Третьяков и Ко.", 2013));
  196.     Books.push_back(Book(4, true, "Джордж Оруэлл", "1984", "-", 1948));
  197.  
  198.     while (true)
  199.     {
  200.         Menu();
  201.         switch (_getch())
  202.         {
  203.         case 49: AddBook(Books);  // 1
  204.             break;
  205.         case 50: TakeBook(Books); // 2
  206.             break;
  207.         case 51: ReturnBook(Books); // 3
  208.             break;
  209.         case 52: OutputAllBooks(Books); // 4
  210.             break;
  211.         case 53: OutputAvailableBooks(Books, true);
  212.             cout << endl; system("pause");  // 5
  213.             break;
  214.         case 54: OutputAvailableBooks(Books, false);
  215.             cout << endl; system("pause"); // 6
  216.             break;
  217.         case 27:
  218.             return 0; //ESC
  219.         }
  220.     }
  221. }
Advertisement
Add Comment
Please, Sign In to add comment