【问题标题】:C++ program crashes in the while loop when asked to use random number generator当要求使用随机数生成器时,C++ 程序在 while 循环中崩溃
【发布时间】:2012-07-13 11:32:24
【问题描述】:

所以我正在尝试制作一个程序,它会生成随机的基本数学问题,例如加法、减法等。

在尝试生成除法问题时,我创建了一个 do-while 循环,该循环一直运行到满足除法问题的先决条件为止。

但由于某种原因,当我要求它生成 20 个除法问题且没有余数时,它总是崩溃。

请帮忙

这是代码

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int correct,total,MAXVAL;
const char oper[4]={'/','/','/','/'};

typedef struct data{
    int first,second;
    char operation;
}data;

data datagenerator(){
    data newData;
    newData.first= (rand()%MAXVAL);
    newData.operation=oper[rand()%4];
    newData.second=(rand()%MAXVAL);
    return newData;
}

bool corrector(data newData){
    bool isture=false;
    switch(newData.operation){
        case '/':
            if((newData.first%newData.second)==0){
                isture=true;
            }
            break;
        case '*':
            isture=true;
            break;
        case '+':
            isture=true;
            break;
        case '-':
            isture=true;
            break;
    }
    return isture;
}

void quizer(){

    system("CLS");
    for(int counter=1;counter<=total;counter++){
        cout<<"Q"<<counter<<": ";
         data newData;
        do{
            newData=datagenerator();
        }while(!corrector(newData));
        cout<<newData.first<<newData.operation<<newData.second<<"\n";
    }
    cout<<"\nYou got "<<correct<<"/"<<total<<"correct\n";
}


int main(){
    //srand((unsigned)time(0));
    char x;
    cout<<"How many questions do you want?"<<endl;
    cin>>total;
    cout<<"Enter the maximum value\n";
    cin>>MAXVAL;
    cout<<"Are you ready?\n";
    cin>>x;
    quizer();

    system("PAUSE");
    return 0;
}

【问题讨论】:

  • 当您可以看到堆栈跟踪时,通常会发现问题。启动您最喜欢的调试器,捕获故障并在此处报告。
  • 你能发布其中一个测试用例吗?
  • 我注意到您在不使用 &lt;random&gt; 库的情况下进行随机数。 rand() 不用用就不行了。

标签: c++ do-while


【解决方案1】:

您需要检查除以 0。

bool corrector(data newData){
bool isture=false;
switch(newData.operation){
    case '/':
        if(newData.second == 0) {
            break;
        }
        if((newData.first%newData.second)==0){
            isture=true;
        }
...

【讨论】:

    【解决方案2】:

    您生成一个 0 作为第二个数字,然后尝试使用它除以一个数字。

    你可以这样检查

    if(newData.second == 0) {
                return false;
            }
    

    【讨论】:

    • rand() 不能返回 0 吗?在那种情况下,(0 % MAXVAL-1)+1 == (0-1)+1 == -1+1 == 0,不是吗?
    【解决方案3】:

    您的问题就在第 17 行和第 19 行。假设您在询问时将 MAXVAL 上的值设置为 0,您正在除以 0。使用模除法时,您需要小心。

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多