Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- using namespace std;
- // звонки
- struct Call
- {
- const double OneMinutePrice = 9.4;
- int duration; // время разговора
- double price; // цена разговора
- Call* next;
- Call(int d)
- {
- duration = d;
- if (duration < 60) price = OneMinutePrice;
- else price = (duration / 60) * OneMinutePrice;
- next = nullptr;
- }
- };
- // абонент
- struct Node
- {
- string num; // номер
- string data; // ФИО
- Call* calls; // звонки абонента
- Node* left; // левый потомок
- Node* right; // правый
- Node(string n, string d)
- {
- num = n;
- data = d;
- calls = nullptr;
- left = nullptr;
- right = nullptr;
- }
- void addCall(int duration)
- {
- if (!calls)
- {
- calls = new Call(duration);
- return;
- }
- auto t = calls;
- while (t->next) t = t->next;
- t->next = new Call(duration);
- }
- void printCalls()
- {
- if (!calls)
- {
- cout << " нет звонков." << endl;
- return;
- }
- cout << endl;
- auto t = calls;
- while (t)
- {
- cout << " \\_ " << " Время: " << t->duration << " секунд | Стоимость: ";
- cout << t->price << " рублей. " << endl;
- t = t->next;
- }
- delete t;
- }
- };
- // производит вывод всей картотеки
- void print(Node* root)
- {
- if (!root) return;
- cout << "Номер: " << root->num << " | ФИО: " << root->data << " | Звонки: ";
- root->printCalls();
- print(root->left);
- print(root->right);
- }
- // добавление в дерево
- Node* add(Node* root, string num, string data)
- {
- if (!root)
- {
- root = new Node(num, data);
- root->num = num;
- }
- else if (num < root->num)
- {
- root->left = add(root->left, num, data);
- }
- else
- {
- root->right = add(root->right, num, data);
- }
- return root;
- }
- // поиск номера
- Node* findNum(Node* root, string num)
- {
- if (root)
- {
- if (root->num == num) return root;
- if (findNum(root->left, num)) return findNum(root->left, num);
- if (findNum(root->right, num)) return findNum(root->right, num);
- }
- return nullptr;
- }
- // обеспечивает начальное формирование картотеки в виде двоичного дерева
- void makeCatalog(Node*& root)
- {
- root = add(root, "89290102455", "Киморов К.П.");
- root = add(root, "89764123323", "Кукуев О.А.");
- root = add(root, "89623131235", "Лука В.П.");
- root = add(root, "89778234124", "Гейтс Б.Б.");
- root = add(root, "89343594651", "Гейб Г.Г.");
- root = add(root, "89421649817", "Пушкин А.С.");
- }
- // вводит номер телефона и время разговора;
- void makeCall(Node*& root)
- {
- cout << "Введите номер телефона: ";
- string n; cin >> n;
- auto temp = findNum(root, n);
- if (!temp)
- {
- cout << "Нет такого номера в картотеке!" << endl;
- }
- else
- {
- cout << "Введите время разговора: ";
- int t;
- cin >> t;
- temp->addCall(t);
- cout << "Успешно добавлено!" << endl;
- }
- }
- // формирование чека
- void makeChek(Node* root)
- {
- cout << "Введите номер телефона: ";
- string n; cin >> n;
- auto temp = findNum(root, n);
- if (!temp)
- {
- cout << "Неправильный номер" << endl;
- return;
- }
- double sum = 0;
- int count = 1;
- auto t = temp->calls;
- cout << endl;
- cout << "+-------------+" << endl;
- cout << "| Чек |" << endl;
- while (t)
- {
- cout << "+-------------+" << endl;
- cout << "|Разговор " << setw(3) << count << "|" << endl;
- cout << "|Время: " << setw(5) << t->duration << "с|" << endl;
- cout << "|Цена: " << setw(5) << t->price << "р|" << endl;
- sum += t->price;
- count++;
- t = t->next;
- }
- cout << "+-------------+" << endl;
- cout << "|Итого: " << setw(5) << sum << "р|" << endl;
- cout << "+-------------+" << endl;
- delete t;
- }
- // диалог с помощью меню и контроль ошибок при вводе
- void menu(Node*& root)
- {
- cout << "Введите команду: (1 - распечатать, 2 - чек, 3 - добавить звонок)" << endl;
- int input;
- cin >> input;
- switch (input)
- {
- case 1:
- print(root);
- break;
- case 2:
- makeChek(root);
- break;
- case 3:
- makeCall(root);
- break;
- default:
- cout << "Нет такой команды!";
- break;
- }
- }
- int main()
- {
- setlocale(0, "rus");
- Node* root = nullptr;
- makeCatalog(root);
- while (true)
- {
- cout << endl << endl;
- menu(root);
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment