Advertisement
Infiniti_Inter

a rolling stone gathers no moss

Nov 5th, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.16 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include <fstream>
  5. #include <exception>
  6. using namespace std;
  7.  
  8.  
  9.  
  10.  
  11. class Error
  12. {
  13. protected:
  14.     string intToString(int d)
  15.     {
  16.         string res = "";
  17.         while (d)
  18.         {
  19.             res += d % 10 + '0';
  20.             d /= 10;
  21.         }
  22.         reverse(res.begin(), res.end());
  23.         return res;
  24.     }
  25. private:
  26.     string msg;
  27. public:
  28.     Error(string msg) : msg(msg) {};
  29.  
  30.     string what()
  31.     {
  32.  
  33.         return "Возникла ошибка класса Error: " + msg + "\n";
  34.  
  35.     }
  36.  
  37. };
  38.  
  39. class MemoryError : public Error
  40. {
  41.  
  42. public:
  43.     MemoryError() : Error("ошибка памяти"), errorCode(0) {};
  44.     MemoryError(string errorCode) : Error("ошибка памяти с кодом " + errorCode), errorCode(errorCode) {};
  45.     MemoryError(int errorCode) : Error("ошибка памяти с кодом " + intToString(errorCode)) { this->errorCode = intToString(errorCode); };
  46. private:
  47.     string errorCode;
  48.     //0 - стандартное исключение
  49.     //1 - превышение максимального рамера листа(параметр capacity в классе List)
  50. };
  51.  
  52. class FileError : public Error
  53. {
  54. public:
  55.  
  56.     FileError() : Error("ошибка открытия файла"), errorCode(0) {};
  57.     FileError(string errorCode) : Error("ошибка открытия файла с кодом " + errorCode), errorCode(errorCode) {};
  58.     FileError(int errorCode) : Error("ошибка открытия файла с кодом " + intToString(errorCode)) { this->errorCode = intToString(errorCode); };
  59.     string getErrorCode() { return "Код ошибки: " + errorCode + "\n"; }
  60. private:
  61.     string errorCode;
  62. };
  63.  
  64.  
  65.  
  66. class Country {
  67. private:
  68.     string Name; // Название города
  69.     int chisln; // Численность населения
  70.     int size; //Размер
  71.     int year; //Год основания
  72.     string CCountry; //страна
  73. public:
  74.  
  75.     void SetCity() {
  76.         system("cls");
  77.         cout << "Введите название города: ";
  78.         cin >> Name;
  79.         cout << "\nВведите численность населения города: ";
  80.         cin >> chisln;
  81.         cout << "\nВведите размер города: ";
  82.     y:
  83.         cin >> size;
  84.         if (size < 1)
  85.             throw "\nРазмер города должен быть больше нуля\n";
  86.         cout << "\nВведите год основания города : ";
  87.         cin >> year;
  88.         cout << "\nВведите страну в которой находится город: ";
  89.         cin >> CCountry;
  90.         cout << endl;
  91.     }
  92.  
  93.     void SetCityAuto(string N, int ch, int s, int ye, string CC) {
  94.  
  95.         try {
  96.             Name = N;
  97.             chisln = ch;
  98.             size = s;
  99.             year = ye;
  100.             CCountry = CC;
  101.  
  102.             if (chisln < 1)
  103.                 throw "\nЧисленность населения должна быть положительной величиной\n";
  104.             if (size < 1)
  105.                 throw "\nРазмер страны должен быть больше нуля\n";
  106.             if (CCountry == "" || Name == "")
  107.                 throw Error("Название страны и/или города должны сожержать хотя бы 1 символ");
  108.         }
  109.         catch (Error &ex)
  110.         {
  111.             cerr << ex.what();
  112.             exit(0);
  113.         }
  114.         catch (const char * s)
  115.         {
  116.             cerr << s;
  117.             exit(0);
  118.         }
  119.  
  120.     }
  121.  
  122.     void GetCity() {
  123.         cout << endl;
  124.         cout << "Информация о городе " << Name << endl;
  125.         cout << "===================" << endl;
  126.         cout << "Название города: " << Name << "\nЧисленность населения: " << chisln << "\nРазмер города: " << size << "\nГод основания города: " << year << "\nCтрана в которой находится город: " << CCountry << endl;
  127.         cout << "===================" << endl;
  128.     }
  129.     int peoplenakm() { // подсчет количества людей на 1 km^2
  130.         int c = chisln / size;
  131.         size = c;
  132.         return size;
  133.     }
  134.     string GetName() {
  135.         return Name;
  136.     }
  137.  
  138.     void EditCity() {
  139.         system("cls");
  140.         cout << "Введите название города: ";
  141.         cin >> Name;
  142.         cout << "\nВведите численность населения города: ";
  143.         cin >> chisln;
  144.         cout << "\nВведите размер города: ";
  145.         cin >> size;
  146.         cout << "\nВведите год основания города : ";
  147.         cin >> year;
  148.         cout << "\nВведите страну в которой находится город: ";
  149.         cin >> CCountry;
  150.         cout << endl;
  151.     }
  152. };
  153.  
  154. struct node {
  155.     Country inf;
  156.     node* next;
  157.     node* prev;
  158. };
  159.  
  160. class List {
  161. private:
  162.     node* tail = NULL;
  163.     node* head = NULL;
  164.     int size = 0;
  165.     int capacity = 6;
  166. public:
  167.     void setCapacity(int maxSize) { capacity = maxSize; };
  168.  
  169.     void push(Country x) { // Вставка элемента в конец списка
  170.  
  171.         try
  172.         {
  173.             size++;
  174.             if (size == capacity)
  175.                 throw MemoryError("1");
  176.         }
  177.         catch (MemoryError & ex)
  178.         {
  179.             cerr << ex.what();
  180.             exit(0);
  181.         }
  182.  
  183.         node* r = new node;
  184.         bool fl = false;
  185.         r->inf = x;
  186.         r->next = NULL;
  187.         if (!head && !tail) {
  188.             r->prev = NULL;
  189.             head = r;
  190.         }
  191.         else {
  192.             node* j = head;
  193.             while (j != NULL) {
  194.                 if (j->inf.GetName() == x.GetName()) {
  195.                     cout << "\nУ вас уже есть город с названием " << x.GetName() << endl;
  196.                     cout << endl;
  197.                     fl = true;
  198.                     break;
  199.                 }
  200.                 j = j->next;
  201.             }
  202.             tail->next = r;
  203.             r->prev = tail;
  204.         }
  205.         tail = r;
  206.         if (fl == true)
  207.             autodel(x.GetName());
  208.     }
  209.     void print() { // Вывод всех элементов
  210.         node* r = head;
  211.         while (r != NULL) {
  212.             r->inf.GetCity();
  213.             r = r->next;
  214.         }
  215.         cout << endl;
  216.     }
  217.  
  218.     void del(string N) {
  219.         size--;
  220.         node* r = head;
  221.         bool fl = false;
  222.         while (r != NULL) {
  223.             if (N == r->inf.GetName()) {
  224.                 fl = true;
  225.                 if (r == head) { // Удаление головы списка
  226.                     head = head->next;
  227.                     head->prev = NULL;
  228.                 }
  229.                 else {
  230.                     if (r == tail) { // Удаление хвоства списка
  231.                         tail = tail->prev;
  232.                         tail->next = NULL;
  233.                     }
  234.                     else {
  235.                         r->next->prev = r->prev;
  236.                         r->prev->next = r->next;
  237.                     }
  238.                 }
  239.                 delete r;
  240.                 cout << "\nГород с названием " << N << "  удален\n" << endl;
  241.                 break;
  242.             }
  243.             r = r->next;
  244.         }
  245.         if (fl = false) {
  246.             cout << "\nВ списке отсутствует город с названием " << N << endl;
  247.             cout << endl;
  248.         }
  249.     }
  250.  
  251.     void autodel(string N) {
  252.         node* r = head;
  253.         int c = 0;
  254.         while (r != NULL) {
  255.             if (N == r->inf.GetName()) {
  256.                 c++;
  257.                 if (c == 2)
  258.                 {
  259.                     if (r == head)
  260.                     { // Удаление головы списка
  261.                         head = head->next;
  262.                         head->prev = NULL;
  263.                     }
  264.                     else
  265.                     {
  266.                         if (r == tail)
  267.                         { // Удаление хвоста списка
  268.                             tail = tail->prev;
  269.                             tail->next = NULL;
  270.                         }
  271.                         else
  272.                         {
  273.                             r->next->prev = r->prev;
  274.                             r->prev->next = r->next;
  275.                         }
  276.                     }
  277.                     delete r;
  278.                     break;
  279.                 }
  280.             }
  281.             r = r->next;
  282.         }
  283.     }
  284.  
  285.     node *  find(string N) {
  286.         node* r = head;
  287.         bool fl = false;
  288.         while (r != NULL) {
  289.             if (r->inf.GetName() == N) {
  290.                 fl = true;
  291.                 return r;
  292.                 break;
  293.             }
  294.             r = r->next;
  295.         }
  296.         if (fl != true)
  297.             cout << "\nГород с названием " << N << " не найден в списке.\n" << endl;
  298.         return NULL;
  299.     }
  300. };
  301.  
  302. int main() {
  303.  
  304.     setlocale(LC_ALL, "RUS");
  305.     Country city;
  306.     List ls;
  307.  
  308.     city.SetCityAuto("Saratov", 780000, 310, 1511, "Russia");
  309.     ls.push(city);
  310.     city.SetCityAuto("Moscow", 89999, 1300, 1147, "Russia");
  311.     ls.push(city);
  312.     city.SetCityAuto("Paris", 83834582, 14000, 53, "France");
  313.     ls.push(city);
  314.     city.SetCityAuto("London", 838345, 2700, 43, "England");
  315.     ls.push(city);
  316.  
  317.  
  318.     bool menu = false;
  319.     cout << "Изначально в данном  списке присутствует  4 города\n" << endl;
  320.     do {
  321.  
  322.         //этот блок обрабатывается через string потому что считается, что пользовательно может ввести
  323.         //абсолютно любые данные, например, там где нужно ввести число от 1 до 6, он может ввести "Hello World!"
  324.         string key;
  325.         cout << "Меню для работы с городами" << endl;
  326.     retry:
  327.         try {
  328.             cout << "1 - Добавить город\n2 - Получить список городов\n3 - Удалить определенный город\n4 - Изменить данные про город\n5 - Посчитать людей на km^2\n6 - Выйти из программы" << endl;
  329.             cout << "Ответ: ";
  330.             getline(cin, key);
  331.             if (key < "1" || key > "6" || key.length() > 1)
  332.                 throw key;
  333.         }
  334.         catch (string error)
  335.         {
  336.             cerr << "\n!!!Вводимое число должно быть от 1 до 6!!!\n\n";
  337.             goto retry;
  338.         }
  339.  
  340.         node * r = NULL;
  341.         int c = key[0] - '0';
  342.         string N;
  343.         string trash;
  344.  
  345.         switch (c) {
  346.         case 1:
  347.             city.SetCity();
  348.             ls.push(city);
  349.             getline(cin, trash);//необходим т.к. в буффере поятвится лишний Enter
  350.             break;
  351.         case 2:
  352.             ls.print();
  353.             break;
  354.         case 3:
  355.             system("cls");
  356.             cout << "Введите название города, который нужно удалить: ";
  357.             cin >> N;
  358.             ls.del(N);
  359.             getline(cin, trash);//необходим т.к. в буффере поятвится лишний Enter
  360.             break;
  361.         case 4:
  362.             system("cls");
  363.             cout << "Введите название города, который нужно отредактировать: ";
  364.             cin >> N;
  365.             r = ls.find(N);
  366.             if (r != NULL)
  367.                 r->inf.EditCity();
  368.             getline(cin, trash);//необходим т.к. в буффере поятвится лишний Enter
  369.             break;
  370.         case 5:
  371.             system("cls");
  372.             cout << "Введите название города: ";
  373.             cin >> N;
  374.             r = ls.find(N);
  375.             if (r != NULL)
  376.                 cout << "Количества людей на 1 km^2=" << r->inf.peoplenakm() << endl;
  377.             break;
  378.         case 6:
  379.             menu = true;
  380.             break;
  381.         }
  382.  
  383.  
  384.  
  385.     } while (menu == false);
  386.  
  387.  
  388.  
  389.     //вызов исключительний типа char * (Задание номер 2)
  390.     //city.SetCityAuto("Saratov", 780000, 0, 1511, "Russia");
  391.     //или
  392.     //city.SetCityAuto("Saratov", 0, 1200, 1511, "Russia");
  393.  
  394.  
  395.     //вызов исключиний класса Error (Задание номер 3)
  396.     //city.SetCityAuto("Saratov", 780000, 1200, 1511, "");
  397.     //или
  398.     //city.SetCityAuto("", 780000, 1200, 1511, "Russia");
  399.  
  400.  
  401.     //задание 4
  402.  
  403.     //попытка открыть несуществующий файл приведет к вызову ошибки класса FileError, унаследованную от Error
  404.     /*try
  405.     {
  406.         string path = "inputt.txt";
  407.         ifstream fin;
  408.         fin.open(path);
  409.         if (!fin.is_open())
  410.             throw FileError(1);
  411.     }
  412.     catch (FileError & ex)
  413.     {
  414.         cerr << ex.what();
  415.         cerr << ex.getErrorCode();
  416.     }*/
  417.  
  418.     //попытка добавить в лист больше capacity(=6), возникнет ошибка памяти, capacity можно настроить setCapacity(int)
  419.     /*city.SetCityAuto("Paris2", 83834582, 14000, 53, "France");
  420.     ls.push(city);
  421.     city.SetCityAuto("London2", 838345, 2700, 43, "England");
  422.     ls.push(city);*/
  423.  
  424.  
  425.     return 0;
  426. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement