Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <exception>
- using namespace std;
- class Error
- {
- protected:
- string intToString(int d)
- {
- string res = "";
- while (d)
- {
- res += d % 10 + '0';
- d /= 10;
- }
- reverse(res.begin(), res.end());
- return res;
- }
- private:
- string msg;
- public:
- Error(string msg) : msg(msg) {};
- string what()
- {
- return "Возникла ошибка класса Error: " + msg + "\n";
- }
- };
- class MemoryError : public Error
- {
- public:
- MemoryError() : Error("ошибка памяти"), errorCode(0) {};
- MemoryError(string errorCode) : Error("ошибка памяти с кодом " + errorCode), errorCode(errorCode) {};
- MemoryError(int errorCode) : Error("ошибка памяти с кодом " + intToString(errorCode)) { this->errorCode = intToString(errorCode); };
- private:
- string errorCode;
- //0 - стандартное исключение
- //1 - превышение максимального рамера листа(параметр capacity в классе List)
- };
- class FileError : public Error
- {
- public:
- FileError() : Error("ошибка открытия файла"), errorCode(0) {};
- FileError(string errorCode) : Error("ошибка открытия файла с кодом " + errorCode), errorCode(errorCode) {};
- FileError(int errorCode) : Error("ошибка открытия файла с кодом " + intToString(errorCode)) { this->errorCode = intToString(errorCode); };
- string getErrorCode() { return "Код ошибки: " + errorCode + "\n"; }
- private:
- string errorCode;
- };
- class Country {
- private:
- string Name; // Название города
- int chisln; // Численность населения
- int size; //Размер
- int year; //Год основания
- string CCountry; //страна
- public:
- void SetCity() {
- system("cls");
- cout << "Введите название города: ";
- cin >> Name;
- cout << "\nВведите численность населения города: ";
- cin >> chisln;
- cout << "\nВведите размер города: ";
- y:
- cin >> size;
- if (size < 1)
- throw "\nРазмер города должен быть больше нуля\n";
- cout << "\nВведите год основания города : ";
- cin >> year;
- cout << "\nВведите страну в которой находится город: ";
- cin >> CCountry;
- cout << endl;
- }
- void SetCityAuto(string N, int ch, int s, int ye, string CC) {
- try {
- Name = N;
- chisln = ch;
- size = s;
- year = ye;
- CCountry = CC;
- if (chisln < 1)
- throw "\nЧисленность населения должна быть положительной величиной\n";
- if (size < 1)
- throw "\nРазмер страны должен быть больше нуля\n";
- if (CCountry == "" || Name == "")
- throw Error("Название страны и/или города должны сожержать хотя бы 1 символ");
- }
- catch (Error &ex)
- {
- cerr << ex.what();
- exit(0);
- }
- catch (const char * s)
- {
- cerr << s;
- exit(0);
- }
- }
- void GetCity() {
- cout << endl;
- cout << "Информация о городе " << Name << endl;
- cout << "===================" << endl;
- cout << "Название города: " << Name << "\nЧисленность населения: " << chisln << "\nРазмер города: " << size << "\nГод основания города: " << year << "\nCтрана в которой находится город: " << CCountry << endl;
- cout << "===================" << endl;
- }
- int peoplenakm() { // подсчет количества людей на 1 km^2
- int c = chisln / size;
- size = c;
- return size;
- }
- string GetName() {
- return Name;
- }
- void EditCity() {
- system("cls");
- cout << "Введите название города: ";
- cin >> Name;
- cout << "\nВведите численность населения города: ";
- cin >> chisln;
- cout << "\nВведите размер города: ";
- cin >> size;
- cout << "\nВведите год основания города : ";
- cin >> year;
- cout << "\nВведите страну в которой находится город: ";
- cin >> CCountry;
- cout << endl;
- }
- };
- struct node {
- Country inf;
- node* next;
- node* prev;
- };
- class List {
- private:
- node* tail = NULL;
- node* head = NULL;
- int size = 0;
- int capacity = 6;
- public:
- void setCapacity(int maxSize) { capacity = maxSize; };
- void push(Country x) { // Вставка элемента в конец списка
- try
- {
- size++;
- if (size == capacity)
- throw MemoryError("1");
- }
- catch (MemoryError & ex)
- {
- cerr << ex.what();
- exit(0);
- }
- node* r = new node;
- bool fl = false;
- r->inf = x;
- r->next = NULL;
- if (!head && !tail) {
- r->prev = NULL;
- head = r;
- }
- else {
- node* j = head;
- while (j != NULL) {
- if (j->inf.GetName() == x.GetName()) {
- cout << "\nУ вас уже есть город с названием " << x.GetName() << endl;
- cout << endl;
- fl = true;
- break;
- }
- j = j->next;
- }
- tail->next = r;
- r->prev = tail;
- }
- tail = r;
- if (fl == true)
- autodel(x.GetName());
- }
- void print() { // Вывод всех элементов
- node* r = head;
- while (r != NULL) {
- r->inf.GetCity();
- r = r->next;
- }
- cout << endl;
- }
- void del(string N) {
- size--;
- node* r = head;
- bool fl = false;
- while (r != NULL) {
- if (N == r->inf.GetName()) {
- fl = true;
- if (r == head) { // Удаление головы списка
- head = head->next;
- head->prev = NULL;
- }
- else {
- if (r == tail) { // Удаление хвоства списка
- tail = tail->prev;
- tail->next = NULL;
- }
- else {
- r->next->prev = r->prev;
- r->prev->next = r->next;
- }
- }
- delete r;
- cout << "\nГород с названием " << N << " удален\n" << endl;
- break;
- }
- r = r->next;
- }
- if (fl = false) {
- cout << "\nВ списке отсутствует город с названием " << N << endl;
- cout << endl;
- }
- }
- void autodel(string N) {
- node* r = head;
- int c = 0;
- while (r != NULL) {
- if (N == r->inf.GetName()) {
- c++;
- if (c == 2)
- {
- if (r == head)
- { // Удаление головы списка
- head = head->next;
- head->prev = NULL;
- }
- else
- {
- if (r == tail)
- { // Удаление хвоста списка
- tail = tail->prev;
- tail->next = NULL;
- }
- else
- {
- r->next->prev = r->prev;
- r->prev->next = r->next;
- }
- }
- delete r;
- break;
- }
- }
- r = r->next;
- }
- }
- node * find(string N) {
- node* r = head;
- bool fl = false;
- while (r != NULL) {
- if (r->inf.GetName() == N) {
- fl = true;
- return r;
- break;
- }
- r = r->next;
- }
- if (fl != true)
- cout << "\nГород с названием " << N << " не найден в списке.\n" << endl;
- return NULL;
- }
- };
- int main() {
- setlocale(LC_ALL, "RUS");
- Country city;
- List ls;
- city.SetCityAuto("Saratov", 780000, 310, 1511, "Russia");
- ls.push(city);
- city.SetCityAuto("Moscow", 89999, 1300, 1147, "Russia");
- ls.push(city);
- city.SetCityAuto("Paris", 83834582, 14000, 53, "France");
- ls.push(city);
- city.SetCityAuto("London", 838345, 2700, 43, "England");
- ls.push(city);
- bool menu = false;
- cout << "Изначально в данном списке присутствует 4 города\n" << endl;
- do {
- //этот блок обрабатывается через string потому что считается, что пользовательно может ввести
- //абсолютно любые данные, например, там где нужно ввести число от 1 до 6, он может ввести "Hello World!"
- string key;
- cout << "Меню для работы с городами" << endl;
- retry:
- try {
- cout << "1 - Добавить город\n2 - Получить список городов\n3 - Удалить определенный город\n4 - Изменить данные про город\n5 - Посчитать людей на km^2\n6 - Выйти из программы" << endl;
- cout << "Ответ: ";
- getline(cin, key);
- if (key < "1" || key > "6" || key.length() > 1)
- throw key;
- }
- catch (string error)
- {
- cerr << "\n!!!Вводимое число должно быть от 1 до 6!!!\n\n";
- goto retry;
- }
- node * r = NULL;
- int c = key[0] - '0';
- string N;
- string trash;
- switch (c) {
- case 1:
- city.SetCity();
- ls.push(city);
- getline(cin, trash);//необходим т.к. в буффере поятвится лишний Enter
- break;
- case 2:
- ls.print();
- break;
- case 3:
- system("cls");
- cout << "Введите название города, который нужно удалить: ";
- cin >> N;
- ls.del(N);
- getline(cin, trash);//необходим т.к. в буффере поятвится лишний Enter
- break;
- case 4:
- system("cls");
- cout << "Введите название города, который нужно отредактировать: ";
- cin >> N;
- r = ls.find(N);
- if (r != NULL)
- r->inf.EditCity();
- getline(cin, trash);//необходим т.к. в буффере поятвится лишний Enter
- break;
- case 5:
- system("cls");
- cout << "Введите название города: ";
- cin >> N;
- r = ls.find(N);
- if (r != NULL)
- cout << "Количества людей на 1 km^2=" << r->inf.peoplenakm() << endl;
- break;
- case 6:
- menu = true;
- break;
- }
- } while (menu == false);
- //вызов исключительний типа char * (Задание номер 2)
- //city.SetCityAuto("Saratov", 780000, 0, 1511, "Russia");
- //или
- //city.SetCityAuto("Saratov", 0, 1200, 1511, "Russia");
- //вызов исключиний класса Error (Задание номер 3)
- //city.SetCityAuto("Saratov", 780000, 1200, 1511, "");
- //или
- //city.SetCityAuto("", 780000, 1200, 1511, "Russia");
- //задание 4
- //попытка открыть несуществующий файл приведет к вызову ошибки класса FileError, унаследованную от Error
- /*try
- {
- string path = "inputt.txt";
- ifstream fin;
- fin.open(path);
- if (!fin.is_open())
- throw FileError(1);
- }
- catch (FileError & ex)
- {
- cerr << ex.what();
- cerr << ex.getErrorCode();
- }*/
- //попытка добавить в лист больше capacity(=6), возникнет ошибка памяти, capacity можно настроить setCapacity(int)
- /*city.SetCityAuto("Paris2", 83834582, 14000, 53, "France");
- ls.push(city);
- city.SetCityAuto("London2", 838345, 2700, 43, "England");
- ls.push(city);*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement