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; }
错误成因
- 变量声明语法错误:main函数中变量声明行
int response, int question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;重复使用了int关键字。C语言中同一行声明多个同类型变量时,仅需在第一个变量前指定类型,后续变量直接书写即可。重复的int会导致编译器无法正确识别question及后续变量,触发未定义错误。 - 额外问题(非变量未定义直接原因):
- 每个运算函数内重复调用
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
相关产品推荐
相关产品推荐

