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

C语言修改随机题型代码后变量未定义问题排查与修复

C语言变量未定义错误的成因与修复

问题描述

修改C语言四则运算代码,将原本循环切换题型的逻辑改为随机生成加减乘除题目后,原正常工作的变量question、wrongAnswers、totalQuestions、correctAnswers被编译器提示未定义,需排查成因并修复。

修改后的代码

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

int addition(void){
    int number1, number2, addAnswer, response;
    srand(time(NULL));
    
    number1 = rand() % 12;
    number2 = rand() % 12;
    
    addAnswer = (number1 + number2);
    printf("%d + %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    if (response == addAnswer){
        return 1;
    } else {
        return 0;
    }
}

int subtraction(void){
    int number1, number2, subAnswer, response;
    srand(time(NULL));
    
    number1 = rand() % 12;
    number2 = rand() % 12;
    
    subAnswer = (number1 - number2);
    printf("%d - %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    if (response == subAnswer){
        return 1;
    } else {
        return 0;
    }
}

int multiplication(void){
    int number1, number2, multAnswer, response;
    srand(time(NULL));
    
    number1 = rand() % 12;
    number2 = rand() % 12;
    
    multAnswer = (number1 * number2);
    printf("%d * %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    if (response == multAnswer){
        return 1;
    } else {
        return 0;
    }
}

int division(void){
    int number1, number2, divAnswer, response;
    srand(time(NULL));
    
    number1 = rand() % 12 + 1;
    number2 = rand() % 12 + 1;
    
    divAnswer = (number1 / number2);
    printf("%d / %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    if (response == divAnswer){
        return 1;
    } else {
        return 0;
    }
}

int main(void) {
    int response, int question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;
    response = 0;
    srand(time(NULL));
    while (response != -1111) {
        if (question == 0){
            response = addition();
        } else if (question == 1){
            response = subtraction();
        }else if (question == 2){
            response = multiplication();
        }else {
            response = division();
        }
        
        if (response == 0){
            wrongAnswers++;
            totalQuestions++;
        }
        
        if (response == 1){
            correctAnswers++;
            totalQuestions++;
        }
    }
    wrongAnswers = (totalQuestions - correctAnswers);
    printf("Out of %d questions, you got %d right and %d wrong.\n", totalQuestions, correctAnswers, wrongAnswers);
    
    return 0;
}

错误成因

  1. 变量声明语法错误:main函数中变量声明行int response, int question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;重复使用了int关键字。C语言中同一行声明多个同类型变量时,仅需在第一个变量前指定类型,后续变量直接书写即可。重复的int会导致编译器无法正确识别question及后续变量,触发未定义错误。
  2. 额外问题(非变量未定义直接原因):
    • 每个运算函数内重复调用srand(time(NULL))会导致随机数生成异常(短时间内多次调用会重置随机种子,生成重复随机数)。
    • 当前代码仍使用question变量循环切换题型,未实现随机生成题型的需求。

修复方案

1. 修正变量声明语法

将main函数中的变量声明行修改为:

int response, question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;

2. 实现随机题型逻辑

在while循环的每次迭代开始时,生成0-3的随机数赋值给question,替换原有的循环切换逻辑:

while (response != -1111) {
    // 生成0-3的随机数,对应加减乘除四种题型
    question = rand() % 4;
    // 后续题型判断逻辑保持不变
    if (question == 0){
        response = addition();
    } else if (question == 1){
        response = subtraction();
    }else if (question == 2){
        response = multiplication();
    }else {
        response = division();
    }
    // ... 其余代码不变
}

3. 优化随机种子调用

删除所有运算函数内的srand(time(NULL)),仅在main函数开头调用一次即可,确保随机数序列正常生成。

4. 优化除法逻辑(可选)

当前除法使用整数除法,可能出现非整除情况导致题目不合理,可调整为生成能整除的数值:

int division(void){
    int number1, number2, divAnswer, response;
    // 生成能整除的数值,避免非整数结果
    number2 = rand() % 12 + 1;
    divAnswer = rand() % 12 + 1;
    number1 = number2 * divAnswer;
    
    printf("%d / %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    if (response == divAnswer){
        return 1;
    } else {
        return 0;
    }
}

修复后的完整代码

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

int addition(void){
    int number1, number2, addAnswer, response;
    
    number1 = rand() % 12;
    number2 = rand() % 12;
    
    addAnswer = (number1 + number2);
    printf("%d + %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    return (response == addAnswer) ? 1 : 0;
}

int subtraction(void){
    int number1, number2, subAnswer, response;
    
    number1 = rand() % 12;
    number2 = rand() % 12;
    // 确保被减数大于等于减数,避免负数结果(可选)
    if (number2 > number1) {
        int temp = number1;
        number1 = number2;
        number2 = temp;
    }
    subAnswer = (number1 - number2);
    printf("%d - %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    return (response == subAnswer) ? 1 : 0;
}

int multiplication(void){
    int number1, number2, multAnswer, response;
    
    number1 = rand() % 12;
    number2 = rand() % 12;
    
    multAnswer = (number1 * number2);
    printf("%d * %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    return (response == multAnswer) ? 1 : 0;
}

int division(void){
    int number1, number2, divAnswer, response;
    
    number2 = rand() % 12 + 1;
    divAnswer = rand() % 12 + 1;
    number1 = number2 * divAnswer;
    
    printf("%d / %d = ?\n", number1, number2);
    scanf("%d", &response);
    
    return (response == divAnswer) ? 1 : 0;
}

int main(void) {
    int response, question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;
    response = 0;
    srand(time(NULL));
    
    while (response != -1111) {
        question = rand() % 4;
        
        if (question == 0){
            response = addition();
        } else if (question == 1){
            response = subtraction();
        }else if (question == 2){
            response = multiplication();
        }else {
            response = division();
        }
        
        if (response == 0){
            wrongAnswers++;
            totalQuestions++;
        }
        
        if (response == 1){
            correctAnswers++;
            totalQuestions++;
        }
    }
    
    wrongAnswers = totalQuestions - correctAnswers;
    printf("共完成%d道题,答对%d道,答错%d道。\n", totalQuestions, correctAnswers, wrongAnswers);
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:27:02