bogdan_obukhovskii

Бинарное дерево все подзадачи

Apr 24th, 2020
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. struct Node
  8. {
  9.     int step;    //вложенность
  10.     Node* left;  //левый потомок
  11.     Node* right; //правый потомок
  12.  
  13.     string tel;  //телефон, ключ
  14.     string name; //имя
  15.     int balance; //баланс на телефоне
  16. };
  17.  
  18. class BinaryTree
  19. {
  20. public:
  21.     Node* root; //корень дерева
  22.  
  23.     BinaryTree() { root = NULL; }; //конструктор
  24.  
  25.     //заполняет дерево из файла filename
  26.     void readFromFile()
  27.     {
  28.         ifstream f;
  29.         f.open("Картотека.txt");
  30.  
  31.         while (!f.eof())
  32.         {
  33.             string tempTel, tempName;
  34.             int tempBalance;
  35.  
  36.             f >> tempTel >> tempName >> tempBalance;
  37.  
  38.             root = add(tempTel, tempName, tempBalance, root);
  39.         }
  40.  
  41.         f.close();
  42.     }
  43.  
  44.     //добавление вершины
  45.     static Node* add(string tel, string name, int balance, Node* tree, int step = 0)
  46.     {
  47.         if (tree == NULL) //если вершина пуста
  48.         {
  49.             tree = new Node;
  50.             tree->tel = tel;
  51.             tree->name = name;
  52.             tree->balance = balance;
  53.  
  54.             tree->left = NULL;
  55.             tree->right = NULL;
  56.  
  57.             tree->step = step;
  58.         }
  59.         else if (tel < tree->tel) //в левый потомок
  60.         {
  61.             step ++;
  62.             tree->left = add(tel, name, balance, tree->left, step);
  63.         }
  64.         else //в правый потомок
  65.         {
  66.             step ++;
  67.             tree->right = add(tel, name, balance, tree->right, step);
  68.         }
  69.  
  70.         return tree;
  71.     }
  72.  
  73.     //префиксный вывод дерева
  74.     static void print(Node* tree)
  75.     {
  76.         if (tree == NULL) return;
  77.        
  78.         cout << "Вложенность в дереве: " << tree->step << "; ";
  79.         cout << "Телефон: " << tree->tel << "; ";
  80.         cout << "Имя: " << tree->name << endl;
  81.  
  82.         print(tree->left);
  83.         print(tree->right);
  84.        
  85.     }
  86.  
  87.     //поиск по дереву чтобы узнать баланс
  88.     static Node* findByTel(string number, Node* tree)
  89.     {
  90.         if (tree == NULL) return NULL; //пусто
  91.  
  92.         if (tree->tel == number)
  93.         {
  94.             return tree;
  95.         }
  96.         else if (number <= tree->tel)
  97.         {
  98.             if (tree->left != NULL)
  99.                 return findByTel(number, tree->left);
  100.         }
  101.         else
  102.         {
  103.             if (tree->right != NULL)
  104.                 return findByTel(number, tree->right);
  105.         }
  106.     }
  107. };
  108.  
  109. struct Receipt {
  110.     const int pricePerMinute = 7; //цена за минуту разговора в рублях
  111.  
  112.     string number;    //номер на который выставляется чек
  113.     int balance;      //баланс до операции
  114.  
  115.     int minutes;      //минуты разговора
  116.     int totalCost; //итоговая стоимость
  117.  
  118.     Receipt(int seconds, string num, Node* tree) {
  119.         minutes = (seconds > 60) ? seconds / 60 : 1; //если время разговора меньше 60 секунд, то считаем как 1 минуту
  120.         number = num;
  121.         totalCost = minutes * pricePerMinute;
  122.  
  123.         sendReceipt(tree);
  124.     }
  125.    
  126.     //выставить счёт на баланс
  127.     void sendReceipt(Node* tree)
  128.     {
  129.         Node* abonent = BinaryTree::findByTel(number, tree);
  130.  
  131.         cout << endl << "Баланс до операции: " << abonent->balance << endl;
  132.        
  133.         abonent->balance -= totalCost;
  134.         balance = abonent->balance;
  135.  
  136.         print();
  137.     }
  138.    
  139.     //распечатать чек
  140.     void print()
  141.     {
  142.         cout << "+----------------------+" << endl << "|     ЧЕК АБОНЕНТУ     |" << endl << "|      " << number << "     |" << endl;
  143.         cout << "|   НА СУММУ: " << setw(7) << totalCost <<"  |" << endl << "| ТЕКУЩИЙ БАЛАНС: "<< setw(5) << balance <<"|" << endl;
  144.         cout << "+----------------------+" << endl << endl;
  145.     }
  146. };
  147.  
  148. int main()
  149. {
  150.     setlocale(0, "rus");
  151.  
  152.     BinaryTree* tree = new BinaryTree;
  153.  
  154.     //Считываем картотеку с файла
  155.     tree->readFromFile();
  156.  
  157.     //Распечатываем картотеку
  158.     BinaryTree::print(tree->root);
  159.  
  160.     string number;
  161.     int seconds;
  162.  
  163.     cout << endl << "Введите номер телефона и количество секунд через пробел: 89999999999 278" << endl;
  164.     cin >> number >> seconds;
  165.  
  166.     //Выставляем чек 1
  167.     Receipt* receipt1 = new Receipt(seconds, number, tree->root);
  168.  
  169.     //Выставляем чек 2
  170.     Receipt* receipt2 = new Receipt(seconds, number, tree->root);
  171.  
  172.     system("pause");
  173.     return 0;
  174. }
Add Comment
Please, Sign In to add comment