#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#include<iterator>
#include<iomanip>
#include<sstream>
using namespace std;
struct Book
{
string name;
int year = 0;
int circulation = 0;
};
istream& operator>>(istream& is, Book& book)
{
string line;
getline(is, line);
istringstream head(line);
getline(head, book.name, ':');
head >> book.year >> book.circulation;
return is;
}
vector<Book> getBooksList(istream& source)
{
return{ istream_iterator<Book>{source}, {} };
}
// Пришел в библиотеку - дайте мне немного книг, любых.
// А тебе говорят - сам возьми, вон там две полки - нижняя и верхняя.
// А да, забыли предупридить - ВЫХОД платный!
enum class input_type : int {Console, File, None};
input_type get_input()
{
if(!cin)
{
system(" ");
cout << "\n\x1b[1;31mА вот и не угадал! Играй по правилам!\x1b[0m\n\n"
"Правило первое - никаких правил ;)\n\n";
cin.clear();
}
cout << "Жми откуда брать: \n [0] -- (консоль)\n [1] -- (файл)\n\n"
"[Ctrl + Z] -- (Извините ошибся дверью)\n\n$: ";
int inp = 0;
if(cin >> inp && inp == 0)
{
system(" ");
cout << "Вводи \x1b[1;31m [ Название : Год Тираж ]\n\n"
<< "Пример:"
<< "\t\x1b[0;40;36mЗолотой ключик, или Приключения Буратино : 1936 50000\n\n"
<< "\x1b[0mНе забудь \x1b[1;33mCtrl + Z\x1b[0m означает конец ввода.\n\n";
}
return static_cast<input_type>(inp);
}
// Не Аквафор
vector<Book> filter(vector<Book> const& books, int from, int to)
{
vector<Book> filtered;
copy_if(books.cbegin(), books.cend(), back_inserter(filtered), [=](auto const& b){
return b.year >= from && b.year <= to;
});
return filtered;
}
// Что я прочитал за это лето
void print_table(vector<Book> const& books)
{
auto max_width_elm = max_element(books.cbegin(), books.cend(), [](auto const& a, auto const& b){
return a.name.size() < b.name.size();
});
if(max_width_elm == books.cend())
{
cout << "Ничего, бывает...\n";
return;
}
size_t max_width = max_width_elm->name.size();
// А какая у вас машина? - Зеленая O_o
system(" ");
cout << "\x1b[1;32m"
<< setw(8 + max_width)
<< left << "Название"
<< setw(12) << "Год"
<< setw(12) << "Тираж" << "\n"
<< "\x1b[0m";
for(auto[name, year, circul] : books)
{
cout << setw(8 + max_width)
<< left << name
<< setw(12) << year
<< setw(12) << circul << "\n";
}
}
enum class sort_field { Name, Year, Circul };
auto sort_by = [](sort_field field, auto& container){
sort(container.begin(), container.end(), [=](const auto& a, const auto& b){
bool result = false;
switch(field)
{
case sort_field::Year:
result = a.year < b.year;
break;
case sort_field::Circul:
result = a.circulation < b.circulation;
break;
default:
result = a.name < b.name;
break;
}
return result;
});
};
int main()
{
setlocale(LC_ALL, "");
//типа файл
const string test_data = "book10 : 2010 10000\n"
"book09 : 2009 9000\n"
"book19 : 2019 19000\n"
"book03 : 2003 3000\n"
"book84 : 1984 84000\n"
"book42 : 2042 42000";
istringstream is(test_data);
vector<Book> books;
input_type input = input_type::None;
while(input == input_type::None)
{
input = get_input();
switch(input)
{
case input_type::Console:
books = getBooksList(cin);
break;
case input_type::File:
books = getBooksList(is);
break;
default:
system(" ");
cout << "\n\x1b[1;33mВыбери 0 или 1 ЧеГо НеПоНяТнОгО?\x1b[0m \n";
input = input_type::None;
break;
}
}
sort_by(sort_field::Year, books);
print_table(filter(books, 2000, 2010));
system("pause");
}