Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <ctime>
  6.  
  7.  
  8. using namespace std;
  9.  
  10.  
  11. // Функция, которая переводит число из 10чной системы
  12. // счисления в двоичную
  13. string from_decimal_to_binary(int num) {
  14.     // вектор в которую будем записывать результат перевода
  15.     vector<int> result;
  16.  
  17.  
  18.     // Пусть дано число в двоичной системе:
  19.     // 21 = 10101 = 1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0
  20.     // Преобразуем выражение из правой части(будем просто выносить
  21.     // двойки за скобки, пока можем)
  22.  
  23.     // = (1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0) * 2 + 1
  24.     // = (1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0) * 2 + 1
  25.     // = ((1 * 2^2 + 0 * 2^1 + 1) * 2 + 0) * 2 + 1=
  26.     // = (((1 * 2 + 0) * 2 + 1) * 2 + 0) * 2 + 1
  27.  
  28.     // Рассмотрим последнюю строку. Если наше число поделить на 2, то остатком как раз будет
  29.     // последняя цифра, а результатом все, что левеее. То есть
  30.     // 10101 // 2 = 1010 (остаток 1) - это и будет первой цифрой. Если продолжить делить дальше
  31.     // то мы сможем получить наше искомое число.
  32.     //
  33.     // Разберем пример для числа 20
  34.     // 20 // 2 = 10 (остаток 0)
  35.     // 10 // 2 = 5 (остаток 0)
  36.     // 5 // 2 = 2 (остаток 1)
  37.     // 2 // 2 = 1 (остаток 0)
  38.     // 1 // 2 = 0 (остаток 1)
  39.     // Теперь запишем наши остатки  СНИЗУ ВВЕРХ 10100 - число которое нам и нужно
  40.     // будем делить число на 2, и остаток добавлять в result
  41.     while (num > 0) {
  42.         // остаток
  43.         int modulo = num % 2;
  44.         // теперь нужно поделить число
  45.         num = num / 2; // запишется целая часть при делениии
  46.         // теперь добавим в строку result наш остаток
  47.         result.push_back(modulo);
  48.     }
  49.     // в примере после деления мы записали наши остатки снизу вверх, но мы сделали наобарот
  50.     // нужно развернуть result
  51.  
  52.     // строка, в которую запишем двоичное число
  53.     string ans;
  54.  
  55.     // пройдемся по вектору с конца в начало и если очередная цифра 1, то
  56.     // добавим в конец строки ans символ '1', иначе '0'
  57.  
  58.     for (int i = result.size() - 1; i >= 0; --i) {
  59.         if (result[i] == 1) {
  60.             ans += '1';
  61.         } else {
  62.             ans += '0';
  63.         }
  64.     }
  65.  
  66.     return ans;
  67.  
  68. }
  69.  
  70.  
  71. int main() {
  72.     setlocale(LC_ALL, "rus");
  73.     // Выведем приветсвие
  74.     cout << "Добро пожаловать в программу для обучения переводу чисел ";
  75.     cout << "из десятичной системы счисления в двоичную и обратно." << endl;
  76.  
  77.     // зациклим игру до тех пор, пока пользователь не захочит остановить игру
  78.     bool end_game = false;
  79.  
  80.     while (!end_game) {
  81.  
  82.         //Режим игры
  83.         cout << "Выберите режим:" << endl;
  84.         cout << "1: Из десятичной системы счисления в двоичную;" << endl;
  85.         cout << "2: Из двоичной системы счисления в десятичную;" << endl;
  86.         cout << "Введите число (1 или 2): ";
  87.         int game_mode;
  88.         cin >> game_mode;
  89.  
  90.         // Теперь нам нужно ждать от пользователя корректных значений
  91.         // Если он введет, например, 3, то программа должна потребовать, чтобы
  92.         // пользователь ввел корректное число
  93.         // Для этого воспользуемся циклом while. Пока переменная game_mode не равна либо 1 либо 2
  94.         // мы будем говорить пользователю, что он ввел неверное число, и считываеть заново
  95.         while (game_mode != 1 && game_mode != 2) {
  96.             cout << "Введено не корректное значение." << endl;
  97.             cout << "Повторите ввод: ";
  98.             cin >> game_mode;
  99.         }
  100.  
  101.         // Теперь, независимо от режима игры, сгенерируем рандомное 10чное число
  102.         // В С++ для этого есть специальные фyнкции rand() и srand()
  103.         // Они находятся в библиoтечном файле cstdlib, поэтому чтобы их применять в программе,
  104.         // необходимо подключить этот библиотечный файл: #include <cstdlib> (вначале файла)
  105.         // Если воспользоваться только функцией rand()  – будем получать одинаковые
  106.         // “случайные числа” от запyска к запуску.
  107.         // Чтобы добиться “настоящей” случайности чисел при повторных запускаx программы,
  108.         // необходимо применить функцию srand() до функции rand(). При этом надо передать ей
  109.         // в виде параметра функцию time() с параметром NULL:   srand(time(NULL));
  110.  
  111.         srand(time(NULL));
  112.  
  113.         // rand() возвращает число из очень большого диапазона  –  от 0 дo 32767
  114.         // ограничим его до 1000, взяв остаток от деления полученног означения на 1000
  115.         int decimal_number = rand() % 1000;
  116.         string binary_number = from_decimal_to_binary(decimal_number);
  117.  
  118.         // Теперь, если у нас  game_mode равен единице,
  119.         // то выведем десятичное число и будем ждать ввода пользователя
  120.  
  121.         if (game_mode == 1) {
  122.             cout << "Десятичное число: " << decimal_number << endl;
  123.             cout << "Введите двоичное представление числа: ";
  124.  
  125.             bool stop_ansering = false;
  126.  
  127.             // Будем считывать ответ пользователя до тех пор пока он не
  128.             // даст верный или не попросит вывести правильный ответ
  129.  
  130.             // переменная stop_ansering будет сигнализировать о верном ответе или о том
  131.             // что пользователь сдался
  132.  
  133.             while (!stop_ansering) {
  134.                 // считаем пользовательский ввод
  135.                 string user_answer;
  136.                 cin >> user_answer;
  137.  
  138.                 // если ответ верный присвоим stop_ansering значение true чтобы выйти из цикла
  139.                 // иначе спросим у пользователя не хочет ли он получить правильный ответ
  140.                 // если он хочет получить правильный ответ выводим его и присваиваем stop_ansering значение
  141.                 // true чтобы выйти из цикла
  142.                 if (user_answer == binary_number) {
  143.                     cout << "Правильно!" << endl;
  144.                     stop_ansering = true;
  145.                 } else {
  146.                     cout << "Неверно!" << endl;
  147.                     cout << "1. Показать ответ" << endl << "2. Повторить ввод" << endl;
  148.                     cout << "Введите число (1 или 2): ";
  149.  
  150.                     int show_answer_or_not = 2;
  151.                     // так же как и game_mode
  152.                     cin >> show_answer_or_not;
  153.                     while (show_answer_or_not != 1 && show_answer_or_not != 2) {
  154.                         cout << "Введено не корректное значение." << endl;
  155.                         cout << "Повторите ввод: ";
  156.                         cin >> show_answer_or_not;
  157.                     }
  158.  
  159.                     // Если пользователь решил получить ответ, то выводим его
  160.                     if (show_answer_or_not == 1) {
  161.                         stop_ansering = true;
  162.                         cout << "Правильный ответ: " << binary_number << endl;
  163.                     } else {
  164.                         cout << "Введите двоичное представление числа: ";
  165.                     }
  166.                 }
  167.             }
  168.         } else {
  169.             // Теперь, если у нас  game_mode не равен единице,
  170.             // то выведем двоичное число и будем ждать ввода пользователя
  171.  
  172.             cout << "Двоичное число: " << binary_number << endl;
  173.             cout << "Введите десятичное представление числа: ";
  174.  
  175.             // проделаем тоже самое, что и выше
  176.             bool stop_ansering = false;
  177.  
  178.             while (!stop_ansering) {
  179.                 int user_answer;
  180.                 cin >> user_answer;
  181.                 if (user_answer == decimal_number) {
  182.                     cout << "Правильно!" << endl;
  183.                     stop_ansering = true;
  184.                 } else {
  185.                     cout << "Неверно!" << endl;
  186.                     cout << "1. Показать ответ" << endl << "2. Повторить ввод" << endl;
  187.                     cout << "Введите число (1 или 2): ";
  188.  
  189.                     int show_answer_or_not = 2;
  190.                     // так же как и game_mode
  191.                     cin >> show_answer_or_not;
  192.                     while (show_answer_or_not != 1 && show_answer_or_not != 2) {
  193.                         cout << "Введено не корректное значение." << endl;
  194.                         cout << "Повторите ввод: ";
  195.                         cin >> show_answer_or_not;
  196.                     }
  197.                     if (show_answer_or_not == 1) {
  198.                         stop_ansering = true;
  199.                         cout << "Правильный ответ: " << decimal_number << endl;
  200.                     } else {
  201.                         cout << "Введите десятичное представление числа: ";
  202.                     }
  203.                 }
  204.             }
  205.         }
  206.  
  207.         cout << "Хотите продолжить игру?" << endl;
  208.         cout << "1. Да" << endl << "2. Нет" << endl;
  209.         cout << "Введите число (1 или 2): ";
  210.         int stop_game_or_not;
  211.         // так же как и game_mode
  212.         cin >> stop_game_or_not;
  213.         while (stop_game_or_not != 1 && stop_game_or_not != 2) {
  214.             cout << "Введено не корректное значение." << endl;
  215.             cout << "Повторите ввод: ";
  216.             cin >> stop_game_or_not;
  217.         }
  218.  
  219.         // если пользователь захотел выйти, поменяем значение
  220.         // переменной end_game, чтобы выйти из игрового цикла
  221.         if (stop_game_or_not == 2) {
  222.             end_game = true;
  223.         }
  224.     }
  225.     return 0;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement