Как исправить порядок печати в C++ [закрыто]

Вопрос или проблема

Я работаю над заданием, математической игрой «Обратный отсчет». Игра работает так, как предполагается, но не совсем так, как хочет автопроверка. Числа выводятся в другом порядке, чем требуется автопроверкой. Пожалуйста, помогите. Я пытался исправить это, но не могу найти решение.
Ввод:

27
1
5-1
100 * 4
7*10
400-70

Мой вывод:

Введите случайное число: 
Давайте играть в Обратный отсчет!
Сколько больших чисел вы бы хотели (0-4)? 
Ваши числа: 100 5 5 10 1 7 
Цель: 330
Введите расчет (или 0 для выхода): 
5 - 1 = 4
Ваши числа: 100 5 10 
4 7

Цель: 330
Введите расчет (или 0 для выхода): 
100 * 4 = 400
Ваши числа: 5 10 
400 7

Цель: 330
Введите расчет (или 0 для выхода): 
7 * 10 = 70
Ваши числа: 
5
 70 
400

Цель: 330
Введите расчет (или 0 для выхода): 
400 - 70 = 330
Вы выиграли!

Ожидаемый вывод:

Введите случайное число: 
Давайте играть в Обратный отсчет!
Сколько больших чисел вы бы хотели (0-4)? 
Ваши числа: 100 5 5 10 1 7 
Цель: 330
Введите расчет (или 0 для выхода): 
5 - 1 = 4
Ваши числа: 100
 4
 5 10 
7 
Цель: 330
Введите расчет (или 0 для выхода): 
100 * 4 = 400
Ваши числа:
 400
 5 10 
7 
Цель: 330
Введите расчет (или 0 для выхода): 
7 * 10 = 70
Ваши числа: 
400
 70 
5
 
Цель: 330
Введите расчет (или 0 для выхода): 
400 - 70 = 330
Вы выиграли!

Код:

 #include <iostream>
 #include <sstream>
 #include <string>
 #include <iomanip>
 #include "mersenne-twister.h"

 int chooseRandomNumber(int min, int max);
 using namespace std;
 int num1 , num2 , num3 , num4 , num5 , num6;

 int countRemainingNumbers(){
   int count = 0;
   if(num1 != 0) count ++;
   if(num2 != 0) count ++;
   if(num3 != 0) count ++;
   if(num4 != 0) count ++;
   if(num5 != 0) count ++;
   if(num6 != 0) count ++;
   return count;
 }

 void printRemainingValues(int t2){
   cout << "Ваши числа: ";
   if (num1 != 0) cout << num1 << " ";
   if (num2 != 0) cout << num2 << " ";
   if (num3 != 0) cout << num3 << " ";
   if (num4 != 0) cout << num4 << " ";
   if (num5 != 0) cout << num5 << " ";
   if (num6 != 0) cout << num6 << " " << endl;
   cout << "Цель: " << t2 << endl;
 }

 bool calculations(int t1){
   char op;
   int n1,n2;
   double result;

   std::cout << "Введите расчет (или 0 для выхода): " << std::endl;
   std::cin >> n1 ;
   std::cin >>  op;
   std::cin >> n2;

   if (n1 == 0){
     exit(0);
   }


   switch(op){
   case '+':
     result = n1 + n2;
     break;
   case '-':
     result = n1 - n2;
     break;
   case '*':
     result = n1 * n2;
     break;
   case "https://stackoverflow.com/":
     result = n1 / n2;
     break;
   }

   bool found_n1 = false, found_n2 = false;

   if (n1 == num1 && !found_n1) {num1 = 0; found_n1 = true;}
   else if (n1 == num2 && !found_n1) {num2 = 0; found_n1 = true;}
   else if (n1 == num3 && !found_n1) {num3 = 0; found_n1 = true;}
   else if (n1 == num4&& !found_n1) {num4 = 0;found_n1 = true;}
   else if (n1 == num5&& !found_n1) {num5 = 0;found_n1 = true;}
   else if (n1 == num6&& !found_n1) {num6 = 0;found_n1 = true;}

   if(n2 == num1 && !found_n2) {num1 = result; found_n2 = true;}
   else if (n2 == num2 && !found_n2) {num2 = result; found_n2 = true;}
   else if (n2 == num3&& !found_n2) {num3 = result; found_n2 = true;}
   else if (n2 == num4&& !found_n2) {num4 = result; found_n2 = true;}
   else if (n2 == num5&& !found_n2) {num5 = result; found_n2 = true;}
   else if (n2 == num6&& !found_n2) {num6 = result; found_n2 = true;}
   std::cout << n1<<" "<< op<< " " << n2 << " " << '=' << " " << result << std::endl;
   cout << "\n";
   if (result == t1){
     cout << "Вы выиграли!" << endl;
     return true;
   }
   printRemainingValues(t1);

   return false;
 }

int main() 
{
  int randSeed = 0;
  cout << "Введите случайное число: ";
  cin >>randSeed;
  seed(randSeed);
  cout <<endl;
  int bigN;

  cout << "Давайте играть в Обратный отсчет!" << endl;
  cout << "Сколько больших чисел вы бы хотели (0-4)? "<<endl;
  cout << "\n";
  cin >> bigN;
  cout << "Ваши числа: ";
  switch (bigN){
  case 1:
    num1 = chooseRandomNumber(1,4) * 25;
    num2 = chooseRandomNumber(1,10);
    num3 = chooseRandomNumber(1,10); 
    num4 = chooseRandomNumber(1,10); 
    num5 = chooseRandomNumber(1,10); 
    num6 = chooseRandomNumber(1,10); 
    break;
  case 2:
    num1 = chooseRandomNumber(1,4) * 25;
    num2 = chooseRandomNumber(1,4) * 25;
    num3 = chooseRandomNumber(1,10); 
    num4 = chooseRandomNumber(1,10); 
    num5 = chooseRandomNumber(1,10); 
    num6 = chooseRandomNumber(1,10); 
    break;
  case 3:
    num1 = chooseRandomNumber(1,4) * 25;
    num2 = chooseRandomNumber(1,4) * 25;
    num3 = chooseRandomNumber(1,4) * 25; 
    num4 = chooseRandomNumber(1,10); 
    num5 = chooseRandomNumber(1,10); 
    num6 = chooseRandomNumber(1,10); 
    break;
  case 4:
    num1 = chooseRandomNumber(1,4) * 25;
    num2 = chooseRandomNumber(1,4) * 25;
    num3 = chooseRandomNumber(1,4) * 25; 
    num4 = chooseRandomNumber(1,4) * 25;
    num5 = chooseRandomNumber(1,10); 
    num6 = chooseRandomNumber(1,10); 
    break;
  }
  cout << num1 << " " << num2 << " " << num3 << " " << num4 << " " << num5 << " " << num6 << " "      <<endl;
  int targetNumber = chooseRandomNumber(101,999);
  cout << "Цель: " << targetNumber<<endl;
  bool d1;
  do{
    if (countRemainingNumbers() == 1){
      cout << "Вы проиграли." << endl;
      break;  
    }

    d1 = calculations(targetNumber);
  }
  while (!d1);

  return 0;
}

int chooseRandomNumber(int min, int max) {
  return rand_u32() % (max + 1 - min) + min;
}

Я пытался изменить операторы if в функции calculations(), но это, похоже, не работает. Я не могу понять логику.

Ответ или решение

Для того чтобы исправить порядок печати результатов в вашей игре, вам необходимо внести изменения в функцию printRemainingValues. В текущей реализации вы просто печатаете оставшиеся числа по порядку, и они выводятся в том виде, в котором вы обрабатываете введенные пользователем числа. Чтобы добиться ожидаемого вывода, вам нужно добавить дополнительную логику для форматирования оставшихся чисел.

Вот как вы можете изменить вашу функцию printRemainingValues:

void printRemainingValues(int t2) {
    cout << "Your numbers are: ";

    bool printed = false; // Флаг для отслеживания, было ли напечатано хотя бы одно число

    // Печатаем оставшиеся числа, обрабатывая их в порядке, который ожидается
    if(num1 != 0) {
        cout << num1 << endl;
        printed = true;
    }
    if(num2 != 0) {
        if (printed) cout << " ";
        cout << num2 << endl;
        printed = true;
    }
    if(num3 != 0) {
        if (printed) cout << " ";
        cout << num3 << endl;
        printed = true;
    }
    if(num4 != 0) {
        if (printed) cout << " ";
        cout << num4 << endl;
        printed = true;
    }
    if(num5 != 0) {
        if (printed) cout << " ";
        cout << num5 << endl;
        printed = true;
    }
    if(num6 != 0) {
        if (printed) cout << " ";
        cout << num6 << endl;
    }

    cout << "The target is: " << t2 << endl;
}

Кроме этого, необходимо внести изменения в функцию calculations, чтобы гарантировать, что после обработки операции числа правильно обрабатываются и печатаются. Ваша текущая реализация перезаписывает числа на 0 и может не учитывать порядок печати остатков. Вот возможная модификация:

bool calculations(int t1) {
    char op;
    int n1, n2;
    double result;

    std::cout << "Enter a calculation (or 0 to quit): " << std::endl;
    std::cin >> n1;

    if (n1 == 0) {
        exit(0);
    }

    std::cin >> op >> n2;

    switch(op) {
        case '+':
            result = n1 + n2;
            break;
        case '-':
            result = n1 - n2;
            break;
        case '*':
            result = n1 * n2;
            break;
        case '/':
            if (n2 != 0) {
                result = static_cast<double>(n1) / n2;
            } else {
                std::cout << "Cannot divide by zero!" << std::endl;
                return false;
            }
            break;
        default:
            std::cout << "Invalid operator." << std::endl;
            return false;   
    }

    // Проверяем, где нужно обновить значения
    bool found_n1 = false, found_n2 = false;

    if (n1 == num1 && !found_n1) { num1 = 0; found_n1 = true; }
    else if (n1 == num2 && !found_n1) { num2 = 0; found_n1 = true; }
    else if (n1 == num3 && !found_n1) { num3 = 0; found_n1 = true; }
    else if (n1 == num4 && !found_n1) { num4 = 0; found_n1 = true; }
    else if (n1 == num5 && !found_n1) { num5 = 0; found_n1 = true; }
    else if (n1 == num6 && !found_n1) { num6 = 0; found_n1 = true; }

    if (n2 == num1 && !found_n2) { num1 = result; found_n2 = true; }
    else if (n2 == num2 && !found_n2) { num2 = result; found_n2 = true; }
    else if (n2 == num3 && !found_n2) { num3 = result; found_n2 = true; }
    else if (n2 == num4 && !found_n2) { num4 = result; found_n2 = true; }
    else if (n2 == num5 && !found_n2) { num5 = result; found_n2 = true; }
    else if (n2 == num6 && !found_n2) { num6 = result; found_n2 = true; }

    std::cout << n1 << " " << op << " " << n2 << " = " << result << std::endl;

    if (result == t1) {
        std::cout << "You win!" << std::endl;
        return true;
    }
    printRemainingValues(t1);

    return false;
}

С этими изменениями ваша программа должна печатать результаты в порядке, который ожидает автозагрузчик. Важно также убедиться, что вы правильно управляете состоянием оставшихся чисел для вывода. Это обеспечит правильность всех сохраненных значений.

Оцените материал
Добавить комментарий

Капча загружается...