Advertisement
PIBogdanov

Телефони

Jan 5th, 2024
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <algorithm>
  4. #include <locale>
  5.  
  6. const int MAX_PHONES = 100; // Максимален брой по условие
  7.  
  8. struct Phone
  9. {
  10.     int number;
  11.  
  12.     int pulses;
  13. };
  14.  
  15. // Глобални масиви за съхранение на данни
  16. Phone tel1[MAX_PHONES];
  17. Phone tel2[MAX_PHONES];
  18. Phone merged[MAX_PHONES * 2]; // Двойният размер за сигурност
  19.  
  20. // Текущ брой телефони във всеки от масивите
  21. int tel1Count = 0;
  22. int tel2Count = 0;
  23.  
  24. // Прототипи на функциите
  25. void readData();
  26. void writeData();
  27. void mergeArrays();
  28. void displayGroups();
  29.  
  30. int main()
  31. {
  32.     setlocale(LC_ALL, "Bulgarian"); // Чрез тази функция помагаме на компилатора да разпознава кирилица
  33.  
  34.     char choice;
  35.  
  36.     do
  37.     {
  38.         std::cout << "Меню:\n\n";
  39.  
  40.         std::cout << "1. Презаписване на данните\n";
  41.         std::cout << "2. Сливане и сортиране на данните\n";
  42.         std::cout << "3. Извеждане на данните\n";
  43.         std::cout << "4. Изход\n";
  44.  
  45.         std::cout << "Изберете опция: ";
  46.         std::cin >> choice;
  47.  
  48.         switch (choice)
  49.         {
  50.         case '1': readData(); break;
  51.        
  52.         case '2': mergeArrays(); break;
  53.        
  54.         case '3': displayGroups(); break;
  55.        
  56.         case '4': writeData(); std::cout << "Довиждане!\n"; break;
  57.        
  58.         default: std::cout << "Невалиден избор. Моля, опитайте отново.\n";
  59.         }
  60.     } while (choice != '4');
  61.  
  62.     return 0;
  63. }
  64.  
  65. void readData() // Симулиране на въвеждане на данни от файл
  66. {
  67.     std::ifstream tel1File("TEL1.DAT");
  68.  
  69.     if (!tel1File.is_open())
  70.     {
  71.         std::cout << "Грешка при отваряне на TEL1.DAT.\n";
  72.  
  73.         return;
  74.     }
  75.  
  76.     tel1Count = 0;
  77.  
  78.     while (tel1File >> tel1[tel1Count].number >> tel1[tel1Count].pulses)
  79.     {
  80.         ++tel1Count;
  81.  
  82.         if (tel1Count >= MAX_PHONES)
  83.         {
  84.             break;
  85.         }
  86.     }
  87.  
  88.     tel1File.close();
  89.  
  90.     std::ifstream tel2File("TEL2.DAT");
  91.  
  92.     if (!tel2File.is_open())
  93.     {
  94.         std::cout << "Грешка при отваряне на TEL2.DAT.\n";
  95.  
  96.         return;
  97.     }
  98.  
  99.     tel2Count = 0;
  100.  
  101.     while (tel2File >> tel2[tel2Count].number >> tel2[tel2Count].pulses)
  102.     {
  103.         ++tel2Count;
  104.  
  105.         if (tel2Count >= MAX_PHONES)
  106.         {
  107.             break;
  108.         }
  109.     }
  110.  
  111.     tel2File.close();
  112. }
  113.  
  114. void writeData() // Запис на данните във файлове
  115. {
  116.     std::ofstream tel1File("TEL1.DAT");
  117.    
  118.     if (!tel1File.is_open())
  119.     {
  120.         std::cout << "Грешка при отваряне на TEL1.DAT за запис.\n";
  121.        
  122.         return;
  123.     }
  124.  
  125.     for (size_t i = 0; i < tel1Count; i++)
  126.     {
  127.         tel1File << tel1[i].number << " " << tel1[i].pulses << "\n";
  128.     }
  129.  
  130.     tel1File.close();
  131.  
  132.     std::ofstream tel2File("TEL2.DAT");
  133.    
  134.     if (!tel2File.is_open())
  135.     {
  136.         std::cout << "Грешка при отваряне на TEL2.DAT за запис.\n";
  137.         return;
  138.     }
  139.  
  140.     for (size_t i = 0; i < tel2Count; i++)
  141.     {
  142.         tel2File << tel2[i].number << " " << tel2[i].pulses << "\n";
  143.     }
  144.  
  145.     tel2File.close();
  146. }
  147.  
  148. void mergeArrays() // Сортиране на двата масива в низходящ ред по текущия брой импулси
  149. {
  150.     std::sort(tel1, tel1 + tel1Count, [](const Phone& a, const Phone& b) { return (a.pulses) > (b.pulses); });
  151.  
  152.     std::sort(tel2, tel2 + tel2Count, [](const Phone& a, const Phone& b) { return (a.pulses) > (b.pulses); });
  153.  
  154.     // Сливане на двата сортирани масива в трети масив
  155.     int i = 0, j = 0, k = 0;
  156.  
  157.     while ( (i < tel1Count) && (j < tel2Count) )
  158.     {
  159.         if (tel1[i].pulses >= tel2[j].pulses)
  160.         {
  161.             merged[k++] = tel1[i++];
  162.         }
  163.  
  164.         else
  165.         {
  166.             merged[k++] = tel2[j++];
  167.         }
  168.     }
  169.  
  170.     // Копиране на останалите елементи от първия масив (ако има такива)
  171.     while (i < tel1Count)
  172.     {
  173.         merged[k++] = tel1[i++];
  174.     }
  175.  
  176.     // Копиране на останалите елементи от втория масив (ако има такива)
  177.     while (j < tel2Count)
  178.     {
  179.         merged[k++] = tel2[j++];
  180.     }
  181. }
  182.  
  183. void displayGroups() // Изобразяване
  184. {
  185.     std::cout << "Група 1:\n";
  186.  
  187.     for (size_t i = 0; i < tel1Count; i++)
  188.     {
  189.         std::cout << "Телефон " << i + 1 << ": Номер - " << tel1[i].number << ", Импулси - " << tel1[i].pulses << "\n";
  190.     }
  191.  
  192.     std::cout << "Група 2:\n";
  193.  
  194.     for (size_t i = 0; i < tel2Count; i++)
  195.     {
  196.         std::cout << "Телефон " << i + 1 << ": Номер - " << tel2[i].number << ", Импулси - " << tel2[i].pulses << "\n";
  197.     }
  198.  
  199.     std::cout << "Обединени групи:\n";
  200.  
  201.     for (size_t i = 0; i < (static_cast<unsigned long long>(tel1Count) + tel2Count); i++)
  202.     {
  203.         std::cout << "Телефон " << i + 1 << ": Номер - " << merged[i].number << ", Импулси - " << merged[i].pulses << "\n";
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement