bogdan_obukhovskii

Untitled

May 16th, 2020
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. using namespace std;
  5.  
  6. // звонки
  7. struct Call
  8. {
  9. const double OneMinutePrice = 9.4;
  10.  
  11. int duration; // время разговора
  12. double price; // цена разговора
  13.  
  14. Call* next;
  15.  
  16. Call(int d)
  17. {
  18. duration = d;
  19. if (duration < 60) price = OneMinutePrice;
  20. else price = (duration / 60) * OneMinutePrice;
  21. next = nullptr;
  22. }
  23. };
  24.  
  25. // абонент
  26. struct Node
  27. {
  28. string num; // номер
  29. string data; // ФИО
  30. Call* calls; // звонки абонента
  31.  
  32. Node* left; // левый потомок
  33. Node* right; // правый
  34.  
  35. Node(string n, string d)
  36. {
  37. num = n;
  38. data = d;
  39. calls = nullptr;
  40. left = nullptr;
  41. right = nullptr;
  42. }
  43.  
  44. void addCall(int duration)
  45. {
  46. if (!calls)
  47. {
  48. calls = new Call(duration);
  49. return;
  50. }
  51. auto t = calls;
  52. while (t->next) t = t->next;
  53. t->next = new Call(duration);
  54. }
  55.  
  56. void printCalls()
  57. {
  58. if (!calls)
  59. {
  60. cout << " нет звонков." << endl;
  61. return;
  62. }
  63. cout << endl;
  64. auto t = calls;
  65. while (t)
  66. {
  67. cout << " \\_ " << " Время: " << t->duration << " секунд | Стоимость: ";
  68. cout << t->price << " рублей. " << endl;
  69.  
  70. t = t->next;
  71. }
  72. delete t;
  73. }
  74. };
  75.  
  76. // производит вывод всей картотеки
  77. void print(Node* root)
  78. {
  79. if (!root) return;
  80.  
  81. cout << "Номер: " << root->num << " | ФИО: " << root->data << " | Звонки: ";
  82. root->printCalls();
  83.  
  84. print(root->left);
  85. print(root->right);
  86. }
  87.  
  88. // добавление в дерево
  89. Node* add(Node* root, string num, string data)
  90. {
  91. if (!root)
  92. {
  93. root = new Node(num, data);
  94. root->num = num;
  95. }
  96. else if (num < root->num)
  97. {
  98. root->left = add(root->left, num, data);
  99. }
  100. else
  101. {
  102. root->right = add(root->right, num, data);
  103. }
  104. return root;
  105. }
  106.  
  107. // поиск номера
  108. Node* findNum(Node* root, string num)
  109. {
  110. if (root)
  111. {
  112. if (root->num == num) return root;
  113. if (findNum(root->left, num)) return findNum(root->left, num);
  114. if (findNum(root->right, num)) return findNum(root->right, num);
  115. }
  116. return nullptr;
  117. }
  118.  
  119. // обеспечивает начальное формирование картотеки в виде двоичного дерева
  120. void makeCatalog(Node*& root)
  121. {
  122. root = add(root, "89290102455", "Киморов К.П.");
  123. root = add(root, "89764123323", "Кукуев О.А.");
  124. root = add(root, "89623131235", "Лука В.П.");
  125. root = add(root, "89778234124", "Гейтс Б.Б.");
  126. root = add(root, "89343594651", "Гейб Г.Г.");
  127. root = add(root, "89421649817", "Пушкин А.С.");
  128. }
  129.  
  130. // вводит номер телефона и время разговора;
  131. void makeCall(Node*& root)
  132. {
  133. cout << "Введите номер телефона: ";
  134. string n; cin >> n;
  135.  
  136. auto temp = findNum(root, n);
  137.  
  138. if (!temp)
  139. {
  140. cout << "Нет такого номера в картотеке!" << endl;
  141. }
  142. else
  143. {
  144. cout << "Введите время разговора: ";
  145. int t;
  146. cin >> t;
  147.  
  148. temp->addCall(t);
  149. cout << "Успешно добавлено!" << endl;
  150. }
  151. }
  152.  
  153. // формирование чека
  154. void makeChek(Node* root)
  155. {
  156. cout << "Введите номер телефона: ";
  157. string n; cin >> n;
  158.  
  159. auto temp = findNum(root, n);
  160.  
  161. if (!temp)
  162. {
  163. cout << "Неправильный номер" << endl;
  164. return;
  165. }
  166.  
  167. double sum = 0;
  168. int count = 1;
  169.  
  170. auto t = temp->calls;
  171.  
  172. cout << endl;
  173. cout << "+-------------+" << endl;
  174. cout << "| Чек |" << endl;
  175.  
  176. while (t)
  177. {
  178. cout << "+-------------+" << endl;
  179. cout << "|Разговор " << setw(3) << count << "|" << endl;
  180. cout << "|Время: " << setw(5) << t->duration << "с|" << endl;
  181. cout << "|Цена: " << setw(5) << t->price << "р|" << endl;
  182.  
  183. sum += t->price;
  184. count++;
  185.  
  186. t = t->next;
  187. }
  188.  
  189. cout << "+-------------+" << endl;
  190. cout << "|Итого: " << setw(5) << sum << "р|" << endl;
  191. cout << "+-------------+" << endl;
  192.  
  193. delete t;
  194. }
  195.  
  196. // диалог с помощью меню и контроль ошибок при вводе
  197. void menu(Node*& root)
  198. {
  199. cout << "Введите команду: (1 - распечатать, 2 - чек, 3 - добавить звонок)" << endl;
  200.  
  201. int input;
  202. cin >> input;
  203.  
  204. switch (input)
  205. {
  206. case 1:
  207. print(root);
  208. break;
  209. case 2:
  210. makeChek(root);
  211. break;
  212. case 3:
  213. makeCall(root);
  214. break;
  215. default:
  216. cout << "Нет такой команды!";
  217. break;
  218. }
  219. }
  220.  
  221. int main()
  222. {
  223. setlocale(0, "rus");
  224.  
  225. Node* root = nullptr;
  226.  
  227. makeCatalog(root);
  228.  
  229. while (true)
  230. {
  231. cout << endl << endl;
  232. menu(root);
  233. }
  234.  
  235. system("pause");
  236. return 0;
  237. }
Advertisement
Add Comment
Please, Sign In to add comment