【问题标题】:Random Number (addition game) issue随机数(加法游戏)问题
【发布时间】:2015-09-18 23:25:45
【问题描述】:

我正在为我的 C 类入门制作一个加法/乘法游戏。该程序的目标是询问用户,您想要使用的最大数字是多少,它将在该最大范围内播种随机数以及您想要做多少不同的问题。当我运行程序并进行数学运算时,它告诉我总和不正确,并为我提供了一个不正确的答案,通常是一个很大的数字,例如“1254323”。你能指出我做错了什么的正确方向吗?

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() {

    int maxNumber, num1, num2, sum, answer, problems, i;

    srand(time(NULL));

    //printf("Would you like 1)Addition or 2)Multiplication?\n")
    printf("Enter your Max Number:");
    scanf("%d", &maxNumber);

    printf("How many problems do you want?\n");
    scanf("%d", &problems);

    sum = num1 + num2;

    while(i != problems) {
        num1 = rand()%maxNumber;
        num2 = rand()%maxNumber;
        i++;

        printf("What is %d + %d\n",num1, num2);
        scanf("%d", &answer);

        if(answer != sum){
            printf("Sorry, that's incorrect, the answer is %d\n", sum);
        }

        else{
            printf("Correct!\n");
        }
    }

    return 0;
}

【问题讨论】:

  • 请注意(即使您将sum = num1 + num2 行放入循环中,您也会产生未定义的行为。阅读here

标签: c random codeblocks random-seed


【解决方案1】:

您在设置num1num2 之前分配sum

sum = num1 + num2; 行移动到num2 = rand()%maxNumber; 行之后的循环中,它应该可以正常工作。

还有一些其他错误(例如将i 初始化为0)。

顺便说一句,使用for 循环而不是while 循环通常被认为是更好的做法。

这里有一些更易读的代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(){
  int maxNumber, num1, num2, sum, answer, problems, i;
  srand(time(NULL));

  printf("Enter your Max Number:");
  scanf("%d", &maxNumber);

  printf("How many problems do you want?\n");
  scanf("%d", &problems);

  for (i = 0; i < problems; i++) {
    num1 = rand()%maxNumber;
    num2 = rand()%maxNumber;
    sum = num1 + num2;

    printf("What is %d + %d\n",num1, num2);
    scanf("%d", &answer);

    if(answer != sum){
      printf("Sorry, that's incorrect, the answer is %d\n", sum);
    } else {
      printf("Correct!\n");
    }
  }

  return 0;
}

【讨论】:

  • maxNumber 永远不会被这个 mod num1 = rand()%(maxNumber+1); 获得
【解决方案2】:

您正在使用您的变量而不初始化它们。变化:

int maxNumber, num1, num2, sum, answer, problems, i;

收件人:

int maxNumber = 0, num1 = 0, num2 = 0, sum = 0, answer = 0, problems = 0, i = 0;

另外,将sum = num1 + num2; 行移到您创建num1num2 的位置之后。

【讨论】:

  • 不需要这些初始化(i 除外),因为它们要么是计算出来的,要么是作为输入的
  • 在没有初始化的情况下似乎可以正常工作,但我会更改它。
  • 最好将变量初始化为已知值。 @Leopold_Stotch:i 肯定需要初始化。
【解决方案3】:

您的程序存在多个问题,包括格式设置。以下是更正:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(){
    int maxNumber, num1, num2, sum, answer, problems, i;

    srand(time(NULL));

    //printf("Would you like 1)Addition or 2)Multiplication?\n")
    printf("Enter your Max Number:");
    scanf("%d", &maxNumber);

    printf("How many problems do you want?\n");
    scanf("%d", &problems);

    // issue: i was not initialized
    i = 0;
    while(i != problems){
        i++;
        num1 = rand()%maxNumber;
        num2 = rand()%maxNumber;

        printf("What is %d + %d\n", num1, num2);
        // issue: sum was not calculated here
        sum = num1 + num2;
        scanf("%d", &answer);

        if(answer != sum){
            printf("Sorry, that's incorrect, the answer is %d\n", sum);
        }
        else{
            printf("Correct!\n");
        }
    }
    return 0;
}

【讨论】:

  • 谢谢你,Serge,以及其他所有人。非常感谢!
【解决方案4】:

您定义 sum = num1 + num2,其中 num1 和 num2 根本没有赋值。默认情况下,C 不会将数字初始化为零。这就是为什么你有这么大的数字。

只需在num2 = rand()%maxNumber; 之后添加sum = num1 + num2 即可,一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多