Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <iomanip>
- using namespace std;
- struct Node
- {
- int step; //вложенность
- Node* left; //левый потомок
- Node* right; //правый потомок
- string tel; //телефон, ключ
- string name; //имя
- int balance; //баланс на телефоне
- };
- class BinaryTree
- {
- public:
- Node* root; //корень дерева
- BinaryTree() { root = NULL; }; //конструктор
- //заполняет дерево из файла filename
- void readFromFile()
- {
- ifstream f;
- f.open("Картотека.txt");
- while (!f.eof())
- {
- string tempTel, tempName;
- int tempBalance;
- f >> tempTel >> tempName >> tempBalance;
- root = add(tempTel, tempName, tempBalance, root);
- }
- f.close();
- }
- //добавление вершины
- static Node* add(string tel, string name, int balance, Node* tree, int step = 0)
- {
- if (tree == NULL) //если вершина пуста
- {
- tree = new Node;
- tree->tel = tel;
- tree->name = name;
- tree->balance = balance;
- tree->left = NULL;
- tree->right = NULL;
- tree->step = step;
- }
- else if (tel < tree->tel) //в левый потомок
- {
- step ++;
- tree->left = add(tel, name, balance, tree->left, step);
- }
- else //в правый потомок
- {
- step ++;
- tree->right = add(tel, name, balance, tree->right, step);
- }
- return tree;
- }
- //префиксный вывод дерева
- static void print(Node* tree)
- {
- if (tree == NULL) return;
- cout << "Вложенность в дереве: " << tree->step << "; ";
- cout << "Телефон: " << tree->tel << "; ";
- cout << "Имя: " << tree->name << endl;
- print(tree->left);
- print(tree->right);
- }
- //поиск по дереву чтобы узнать баланс
- static Node* findByTel(string number, Node* tree)
- {
- if (tree == NULL) return NULL; //пусто
- if (tree->tel == number)
- {
- return tree;
- }
- else if (number <= tree->tel)
- {
- if (tree->left != NULL)
- return findByTel(number, tree->left);
- }
- else
- {
- if (tree->right != NULL)
- return findByTel(number, tree->right);
- }
- }
- };
- struct Receipt {
- const int pricePerMinute = 7; //цена за минуту разговора в рублях
- string number; //номер на который выставляется чек
- int balance; //баланс до операции
- int minutes; //минуты разговора
- int totalCost; //итоговая стоимость
- Receipt(int seconds, string num, Node* tree) {
- minutes = (seconds > 60) ? seconds / 60 : 1; //если время разговора меньше 60 секунд, то считаем как 1 минуту
- number = num;
- totalCost = minutes * pricePerMinute;
- sendReceipt(tree);
- }
- //выставить счёт на баланс
- void sendReceipt(Node* tree)
- {
- Node* abonent = BinaryTree::findByTel(number, tree);
- cout << endl << "Баланс до операции: " << abonent->balance << endl;
- abonent->balance -= totalCost;
- balance = abonent->balance;
- print();
- }
- //распечатать чек
- void print()
- {
- cout << "+----------------------+" << endl << "| ЧЕК АБОНЕНТУ |" << endl << "| " << number << " |" << endl;
- cout << "| НА СУММУ: " << setw(7) << totalCost <<" |" << endl << "| ТЕКУЩИЙ БАЛАНС: "<< setw(5) << balance <<"|" << endl;
- cout << "+----------------------+" << endl << endl;
- }
- };
- int main()
- {
- setlocale(0, "rus");
- BinaryTree* tree = new BinaryTree;
- //Считываем картотеку с файла
- tree->readFromFile();
- //Распечатываем картотеку
- BinaryTree::print(tree->root);
- string number;
- int seconds;
- cout << endl << "Введите номер телефона и количество секунд через пробел: 89999999999 278" << endl;
- cin >> number >> seconds;
- //Выставляем чек 1
- Receipt* receipt1 = new Receipt(seconds, number, tree->root);
- //Выставляем чек 2
- Receipt* receipt2 = new Receipt(seconds, number, tree->root);
- system("pause");
- return 0;
- }
Add Comment
Please, Sign In to add comment