我对我的代码做了一些更改,因此它会随机给出加法、减法、乘法、除法(在循环遍历每个之前)。但由于某种原因,以前的工作变量(问题、错误答案、总问题、正确答案)现在显示为未定义。这是什么原因造成的?我该如何解决?
#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;
}
在测试您的代码时,由于整数列表中存在无关的“int”声明,我立即收到编译器错误。
int response, int question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;
第二个“int”需要省略。
int response, question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;
然后,我就可以编译程序了。
接下来,在测试程序时,我注意到两个问题。首先,测试了响应“-1111”的程序是否结束;然而,各种测试函数只会返回“0”或“1”值,这意味着即使输入“-1111”答案,程序也不会正常结束。因此,为了解决这个问题,在每个函数中添加了一个小测试块,以返回值“-1111”而不是“0”或“1”,以便正常的程序结束。
scanf("%d", &response);
if (response == -1111)
return response;
另一个问题是“question”变量被初始化为“0”值,因此只会进行加法测试。因此,为了允许进行其他操作测试,在每次迭代期间都会导出从“0”到“3”的随机值。
int main(void)
{
int response, question = 0, correctAnswers = 0, totalQuestions = 0, wrongAnswers = 0;
response = 0;
srand(time(NULL));
while (response != -1111)
{
question = rand() % 3; /* Otherwise, only addition questions appear */
通过这些重构,程序的测试运行就完成了。
craig@Vera:~/C_Programs/Console/RandomOperations/bin/Release$ ./RandomOperations
7 - 8 = ?
-1
6 + 1 = ?
7
10 + 9 = ?
19
6 * 9 = ?
54
1 * 10 = ?
22
6 * 0 = ?
0
11 - 6 = ?
5
2 + 0 = ?
-1111
Out of 7 questions, you got 6 right and 1 wrong.
这里最大的收获是检查编译器警告和/或错误以查明代码中的问题。在使用函数返回信息和循环条件时参考教程文献也是明智之举。