Advertisement
mamkad

Untitled

Sep 1st, 2022
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <thread>
  4. #include <chrono>
  5. #include <mutex>
  6. #include <array>
  7. #include <condition_variable>
  8.  
  9. using namespace std;
  10.  
  11. enum { BUFFSIZE = 5 };
  12.  
  13. void getInput();
  14. void getSum();
  15. size_t getLine(array<char, BUFFSIZE>&);
  16.  
  17. array<char, BUFFSIZE> buff;
  18. mutex buffMutex;
  19. condition_variable condVarBuff;
  20.  
  21. bool var = false;
  22. size_t globalLength = 0;
  23.  
  24. int main()
  25. {
  26.     thread readThread(getInput);
  27.     thread writeThread(getSum);
  28.  
  29.     readThread.join();
  30.     writeThread.join();
  31.     return 0;
  32. }
  33.  
  34. void getInput()
  35. {
  36.     while(true)
  37.     {
  38.         array<char, BUFFSIZE> inputString; // входная строка
  39.         // вводим строку
  40.         cout << "Ввод:" << '\n';
  41.         cout << '\t';
  42.  
  43.         size_t length = getLine(inputString);
  44.  
  45.         if (!length)
  46.         {
  47.             cout << "\tСтрока пуста. Нажмите Enter..." << '\n';
  48.             cin.get();
  49.             return;
  50.         }
  51.         // проверяем, что строка состоит только из цифр
  52.         if ( !all_of(inputString.begin(), inputString.begin() + length, [](char ch) { return isdigit(ch); }) )
  53.         {
  54.             cout << "\tСтрока должна содержать только цифры. Нажмите Enter..." << '\n';
  55.             cin.get();
  56.             continue;
  57.         }
  58.         // сортируем по убыванию
  59.         sort(inputString.begin(), inputString.begin() + length, greater<char>());
  60.         // заменяем чётные цифры на символы KB
  61.         char letter = 'K';
  62.         for_each_n(inputString.begin(), length, [&letter](char& ch) { int digit = ch - '0'; if (!(digit % 2)) {ch = letter; letter = (letter == 'K') ? 'B' : 'K';} });
  63.         // копируем в буфер
  64.         copy_n(inputString.begin(), length, buff.begin());
  65.         globalLength = length;
  66.  
  67.         var = true;
  68.         condVarBuff.notify_one();
  69.         this_thread::sleep_for(chrono::milliseconds(500));
  70.     }
  71. }
  72.  
  73. size_t getLine(array<char, BUFFSIZE>& inputString)
  74. {
  75.     size_t length = 0;
  76.     char ch = '\0';
  77.     // считываем данные с клавиатуры
  78.     for(; length < BUFFSIZE && cin.get(ch) && ch != '\n'; ++length)
  79.     {
  80.         inputString[length] = ch;
  81.     }
  82.     // если последний символ не перевод новой строки, значит пользователь ввёл слишком много символов, отбрасываем их
  83.     if (ch != '\n')
  84.     {
  85.         while(cin.get() != '\n')
  86.             continue;
  87.  
  88.         cout << "\tВы ввели слишком много символов. Строка обрезана до " << BUFFSIZE << "Нажмите Enter..." << '\n';
  89.         cin.get();
  90.     }
  91.  
  92.     return length;
  93. }
  94.  
  95. void getSum()
  96. {
  97.     while(true)
  98.     {
  99.         // блокируем поток до тех пор пока другой поток не записал значения в буфер
  100.         unique_lock<mutex> locker(buffMutex);
  101.         condVarBuff.wait(locker, []() {return var;});
  102.         // считываем данные из буфера в inputString и обнуляем буфер
  103.         array<char, BUFFSIZE> inputString;
  104.         copy_n(buff.begin(), globalLength, inputString.begin());
  105.         fill_n(buff.begin(), globalLength, '\0');
  106.         // суммируем числа
  107.         size_t total = 0;
  108.         for_each_n(inputString.begin(), globalLength, [&total](char ch) { if (isdigit(ch)) { total += (ch - '0'); } });
  109.         // выводим числа и сумму
  110.         cout << "Вывод:" << '\n';
  111.         cout << '\t' << inputString.data() << endl;
  112.         cout << '\t' << total << endl;
  113.  
  114.         var = false;
  115.     }
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement