Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <thread>
- #include <chrono>
- #include <mutex>
- #include <array>
- #include <condition_variable>
- using namespace std;
- enum { BUFFSIZE = 5 };
- void getInput();
- void getSum();
- size_t getLine(array<char, BUFFSIZE>&);
- array<char, BUFFSIZE> buff;
- mutex buffMutex;
- condition_variable condVarBuff;
- bool var = false;
- size_t globalLength = 0;
- int main()
- {
- thread readThread(getInput);
- thread writeThread(getSum);
- readThread.join();
- writeThread.join();
- return 0;
- }
- void getInput()
- {
- while(true)
- {
- array<char, BUFFSIZE> inputString; // входная строка
- // вводим строку
- cout << "Ввод:" << '\n';
- cout << '\t';
- size_t length = getLine(inputString);
- if (!length)
- {
- cout << "\tСтрока пуста. Нажмите Enter..." << '\n';
- cin.get();
- return;
- }
- // проверяем, что строка состоит только из цифр
- if ( !all_of(inputString.begin(), inputString.begin() + length, [](char ch) { return isdigit(ch); }) )
- {
- cout << "\tСтрока должна содержать только цифры. Нажмите Enter..." << '\n';
- cin.get();
- continue;
- }
- // сортируем по убыванию
- sort(inputString.begin(), inputString.begin() + length, greater<char>());
- // заменяем чётные цифры на символы KB
- char letter = 'K';
- for_each_n(inputString.begin(), length, [&letter](char& ch) { int digit = ch - '0'; if (!(digit % 2)) {ch = letter; letter = (letter == 'K') ? 'B' : 'K';} });
- // копируем в буфер
- copy_n(inputString.begin(), length, buff.begin());
- globalLength = length;
- var = true;
- condVarBuff.notify_one();
- this_thread::sleep_for(chrono::milliseconds(500));
- }
- }
- size_t getLine(array<char, BUFFSIZE>& inputString)
- {
- size_t length = 0;
- char ch = '\0';
- // считываем данные с клавиатуры
- for(; length < BUFFSIZE && cin.get(ch) && ch != '\n'; ++length)
- {
- inputString[length] = ch;
- }
- // если последний символ не перевод новой строки, значит пользователь ввёл слишком много символов, отбрасываем их
- if (ch != '\n')
- {
- while(cin.get() != '\n')
- continue;
- cout << "\tВы ввели слишком много символов. Строка обрезана до " << BUFFSIZE << "Нажмите Enter..." << '\n';
- cin.get();
- }
- return length;
- }
- void getSum()
- {
- while(true)
- {
- // блокируем поток до тех пор пока другой поток не записал значения в буфер
- unique_lock<mutex> locker(buffMutex);
- condVarBuff.wait(locker, []() {return var;});
- // считываем данные из буфера в inputString и обнуляем буфер
- array<char, BUFFSIZE> inputString;
- copy_n(buff.begin(), globalLength, inputString.begin());
- fill_n(buff.begin(), globalLength, '\0');
- // суммируем числа
- size_t total = 0;
- for_each_n(inputString.begin(), globalLength, [&total](char ch) { if (isdigit(ch)) { total += (ch - '0'); } });
- // выводим числа и сумму
- cout << "Вывод:" << '\n';
- cout << '\t' << inputString.data() << endl;
- cout << '\t' << total << endl;
- var = false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement