You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言数学测验程序中随机选择加减运算符

问题描述

我有一项作业要求制作可生成随机数学题的测验程序,其他部分均已完成,但无法找到在C语言中随机选择数学运算符“+”和“-”的方法。以下是我的代码片段:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int choice = 0;
    int lives = 0;
    int question = 1;
    int a;
    int b;
    int answer = 0;
    int ans = 0;
    int correct = 0;
    printf("\n Welcome to Maths Tester Pro.");
    printf("\n Please Select a difficulty:");
    printf("\n 1) Easy");
    printf("\n 2) Medium");
    printf("\n 3) Hard \n");
    scanf("%d%*c",&choice);
    switch(choice)
    {
        case 1:
        printf("You have selected Easy mode!");
        lives = lives+3;
        while ((lives !=0)&&(question !=6)){
            if(question !=5){
                                    //Ask Question
                printf("\nQuestion %d of 5.  You have %d lives remaining", question, lives);
                srand(time(NULL));
                a = (rand() % (10 - 1 + 1)) + 1;    //make the sign random
                b = (rand() % (10 - 1 + 1)) + 1;
                printf("\n%d + %d = ",a ,b);
                scanf("%d", &answer);
                ans = a+b;
                                    //If answer is correct
                if((a+b) == answer){
                    printf("Correct!\n");
                    correct = correct + 1;
                }
                                    //If answer is incorrect
                else{
                    printf("Incorrect!  The correct answer was %d\n",ans);
                    lives=lives-1;
                }
                question = question + 1;
            }

目前我的代码中固定使用ans=a+b进行计算,希望能实现随机选择“+”或“-”运算符的功能。

解决方法

1. 修复随机数种子初始化问题

当前代码每次循环都调用srand(time(NULL)),由于循环执行速度远快于秒级时间变化,会导致生成的随机数重复。需要将srand移到main函数开头,仅初始化一次:

int main(){
    srand(time(NULL)); // 仅在程序启动时初始化一次随机数种子
    int choice = 0;
    // 后续代码保持不变
}

2. 实现随机运算符选择

通过rand() % 2生成0或1的随机值,分别对应“+”和“-”运算符,再根据选择的运算符输出题目并计算正确答案:

// 替换原循环内固定生成加法题的代码
printf("\nQuestion %d of 5.  You have %d lives remaining", question, lives);
a = (rand() % (10 - 1 + 1)) + 1;
b = (rand() % (10 - 1 + 1)) + 1;

// 生成随机运算符:0代表加法,1代表减法
int op_type = rand() % 2;
if (op_type == 0) {
    printf("\n%d + %d = ", a, b);
    ans = a + b;
} else {
    // 可选:确保减法结果非负,避免出现负数题目(根据需求可移除)
    if (a < b) {
        int temp = a;
        a = b;
        b = temp;
    }
    printf("\n%d - %d = ", a, b);
    ans = a - b;
}

scanf("%d", &answer);
// 判断答案是否正确
if (ans == answer) {
    printf("Correct!\n");
    correct++;
} else {
    printf("Incorrect!  The correct answer was %d\n", ans);
    lives--;
}
question++;

关键说明

  • rand() % 2的结果只有0和1,完美对应两种运算符的随机选择。
  • 减法部分的交换逻辑是为了避免出现负数答案,若作业允许负数结果,可直接删除该判断。
  • 随机数种子仅初始化一次是保证随机效果的核心,否则会出现连续相同的运算符或数值。

内容的提问来源于stack exchange,提问作者Alnort

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:25:39