Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- // Функция, которая переводит число из 10чной системы
- // счисления в двоичную
- string from_decimal_to_binary(int num) {
- // вектор в которую будем записывать результат перевода
- vector<int> result;
- // Пусть дано число в двоичной системе:
- // 21 = 10101 = 1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0
- // Преобразуем выражение из правой части(будем просто выносить
- // двойки за скобки, пока можем)
- // = (1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0) * 2 + 1
- // = (1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0) * 2 + 1
- // = ((1 * 2^2 + 0 * 2^1 + 1) * 2 + 0) * 2 + 1=
- // = (((1 * 2 + 0) * 2 + 1) * 2 + 0) * 2 + 1
- // Рассмотрим последнюю строку. Если наше число поделить на 2, то остатком как раз будет
- // последняя цифра, а результатом все, что левеее. То есть
- // 10101 // 2 = 1010 (остаток 1) - это и будет первой цифрой. Если продолжить делить дальше
- // то мы сможем получить наше искомое число.
- //
- // Разберем пример для числа 20
- // 20 // 2 = 10 (остаток 0)
- // 10 // 2 = 5 (остаток 0)
- // 5 // 2 = 2 (остаток 1)
- // 2 // 2 = 1 (остаток 0)
- // 1 // 2 = 0 (остаток 1)
- // Теперь запишем наши остатки СНИЗУ ВВЕРХ 10100 - число которое нам и нужно
- // будем делить число на 2, и остаток добавлять в result
- while (num > 0) {
- // остаток
- int modulo = num % 2;
- // теперь нужно поделить число
- num = num / 2; // запишется целая часть при делениии
- // теперь добавим в строку result наш остаток
- result.push_back(modulo);
- }
- // в примере после деления мы записали наши остатки снизу вверх, но мы сделали наобарот
- // нужно развернуть result
- // строка, в которую запишем двоичное число
- string ans;
- // пройдемся по вектору с конца в начало и если очередная цифра 1, то
- // добавим в конец строки ans символ '1', иначе '0'
- for (int i = result.size() - 1; i >= 0; --i) {
- if (result[i] == 1) {
- ans += '1';
- } else {
- ans += '0';
- }
- }
- return ans;
- }
- int main() {
- setlocale(LC_ALL, "rus");
- // Выведем приветсвие
- cout << "Добро пожаловать в программу для обучения переводу чисел ";
- cout << "из десятичной системы счисления в двоичную и обратно." << endl;
- // зациклим игру до тех пор, пока пользователь не захочит остановить игру
- bool end_game = false;
- while (!end_game) {
- //Режим игры
- cout << "Выберите режим:" << endl;
- cout << "1: Из десятичной системы счисления в двоичную;" << endl;
- cout << "2: Из двоичной системы счисления в десятичную;" << endl;
- cout << "Введите число (1 или 2): ";
- int game_mode;
- cin >> game_mode;
- // Теперь нам нужно ждать от пользователя корректных значений
- // Если он введет, например, 3, то программа должна потребовать, чтобы
- // пользователь ввел корректное число
- // Для этого воспользуемся циклом while. Пока переменная game_mode не равна либо 1 либо 2
- // мы будем говорить пользователю, что он ввел неверное число, и считываеть заново
- while (game_mode != 1 && game_mode != 2) {
- cout << "Введено не корректное значение." << endl;
- cout << "Повторите ввод: ";
- cin >> game_mode;
- }
- // Теперь, независимо от режима игры, сгенерируем рандомное 10чное число
- // В С++ для этого есть специальные фyнкции rand() и srand()
- // Они находятся в библиoтечном файле cstdlib, поэтому чтобы их применять в программе,
- // необходимо подключить этот библиотечный файл: #include <cstdlib> (вначале файла)
- // Если воспользоваться только функцией rand() – будем получать одинаковые
- // “случайные числа” от запyска к запуску.
- // Чтобы добиться “настоящей” случайности чисел при повторных запускаx программы,
- // необходимо применить функцию srand() до функции rand(). При этом надо передать ей
- // в виде параметра функцию time() с параметром NULL: srand(time(NULL));
- srand(time(NULL));
- // rand() возвращает число из очень большого диапазона – от 0 дo 32767
- // ограничим его до 1000, взяв остаток от деления полученног означения на 1000
- int decimal_number = rand() % 1000;
- string binary_number = from_decimal_to_binary(decimal_number);
- // Теперь, если у нас game_mode равен единице,
- // то выведем десятичное число и будем ждать ввода пользователя
- if (game_mode == 1) {
- cout << "Десятичное число: " << decimal_number << endl;
- cout << "Введите двоичное представление числа: ";
- bool stop_ansering = false;
- // Будем считывать ответ пользователя до тех пор пока он не
- // даст верный или не попросит вывести правильный ответ
- // переменная stop_ansering будет сигнализировать о верном ответе или о том
- // что пользователь сдался
- while (!stop_ansering) {
- // считаем пользовательский ввод
- string user_answer;
- cin >> user_answer;
- // если ответ верный присвоим stop_ansering значение true чтобы выйти из цикла
- // иначе спросим у пользователя не хочет ли он получить правильный ответ
- // если он хочет получить правильный ответ выводим его и присваиваем stop_ansering значение
- // true чтобы выйти из цикла
- if (user_answer == binary_number) {
- cout << "Правильно!" << endl;
- stop_ansering = true;
- } else {
- cout << "Неверно!" << endl;
- cout << "1. Показать ответ" << endl << "2. Повторить ввод" << endl;
- cout << "Введите число (1 или 2): ";
- int show_answer_or_not = 2;
- // так же как и game_mode
- cin >> show_answer_or_not;
- while (show_answer_or_not != 1 && show_answer_or_not != 2) {
- cout << "Введено не корректное значение." << endl;
- cout << "Повторите ввод: ";
- cin >> show_answer_or_not;
- }
- // Если пользователь решил получить ответ, то выводим его
- if (show_answer_or_not == 1) {
- stop_ansering = true;
- cout << "Правильный ответ: " << binary_number << endl;
- } else {
- cout << "Введите двоичное представление числа: ";
- }
- }
- }
- } else {
- // Теперь, если у нас game_mode не равен единице,
- // то выведем двоичное число и будем ждать ввода пользователя
- cout << "Двоичное число: " << binary_number << endl;
- cout << "Введите десятичное представление числа: ";
- // проделаем тоже самое, что и выше
- bool stop_ansering = false;
- while (!stop_ansering) {
- int user_answer;
- cin >> user_answer;
- if (user_answer == decimal_number) {
- cout << "Правильно!" << endl;
- stop_ansering = true;
- } else {
- cout << "Неверно!" << endl;
- cout << "1. Показать ответ" << endl << "2. Повторить ввод" << endl;
- cout << "Введите число (1 или 2): ";
- int show_answer_or_not = 2;
- // так же как и game_mode
- cin >> show_answer_or_not;
- while (show_answer_or_not != 1 && show_answer_or_not != 2) {
- cout << "Введено не корректное значение." << endl;
- cout << "Повторите ввод: ";
- cin >> show_answer_or_not;
- }
- if (show_answer_or_not == 1) {
- stop_ansering = true;
- cout << "Правильный ответ: " << decimal_number << endl;
- } else {
- cout << "Введите десятичное представление числа: ";
- }
- }
- }
- }
- cout << "Хотите продолжить игру?" << endl;
- cout << "1. Да" << endl << "2. Нет" << endl;
- cout << "Введите число (1 или 2): ";
- int stop_game_or_not;
- // так же как и game_mode
- cin >> stop_game_or_not;
- while (stop_game_or_not != 1 && stop_game_or_not != 2) {
- cout << "Введено не корректное значение." << endl;
- cout << "Повторите ввод: ";
- cin >> stop_game_or_not;
- }
- // если пользователь захотел выйти, поменяем значение
- // переменной end_game, чтобы выйти из игрового цикла
- if (stop_game_or_not == 2) {
- end_game = true;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement