【发布时间】:2019-12-16 20:56:36
【问题描述】:
我编写了以下代码,其中随机生成 2 个数字并添加到第三个变量中。然后它要求用户提供准确的答案。目前正确答案总是'A'。 a1 是实际答案,而a2,a3,a4 是随机生成的答案。
我已经设置条件来查看给出的答案是否在使用 ASCII 值的a,b,c,d 或A,B,C,D 的范围内。如果不合适,则给出的消息是invalid answer。
如果答案是'A' 或'a',它会给出消息"Answer is correct!\nDo you want to play again? (y/n)",否则它会显示"Answer is incorrect!\nDo you want to play again? (y/n)"。
任何回答后,它都会询问用户是否要继续。但是在"Do you want to play again?" 之后,即使scanf 函数存在,它也会退出编译器。
我想让它一直重复,直到用户回答除 'y' 或 'Y' 之外的任何其他内容。由于char 数据类型不起作用,我尝试使用整数变量“条件”,但仍然没有得到想要的答案。
#include <stdio.h>
#include <conio.h>
void main() {
int n1, n2, a1, a2, a3, a4, condition = 1;
char again = 0, answer;
srand(time(0));
while (condition == 1) {
n1 = rand() % 10;
n2 = rand() % 10;
printf("\n\n%d + %d=\n\n", n1, n2);
a1 = n1 + n2;
a2 = rand() % a1;
a3 = rand() % a1 + 10;
a4 = rand() % a1 + 2;
printf("Your options are:\n\nA) %d\nB) %d\nC) %d\nD) %d\n\n "
"What is your answer:\n", a1, a2, a3, a4);
scanf("%c", &answer);
if (answer > 64 && answer < 69) {
if (answer == 'a' || answer == 'A') {
printf("Answer is correct!\nDo you want to play again? (y/n)");
} else {
printf("Answer is incorrect!\nDo you want to play again? (y/n)");
}
} else if (answer > 96 && answer < 101) {
if (answer == 'a' || answer == 'A') {
printf("Answer is correct!\nDo you want to play again? (y/n)");
} else {
printf("Answer is incorrect!\nDo you want to play again? (y/n)");
}
} else {
printf("Invalid answer!\nDo you want to play again? (y/n)");
}
scanf("%c", &again);
if (again == 'y' || again == 'Y') {
condition = 1;
} else {
condition = 0;
}
}
getch();
}
【问题讨论】:
-
scanf("%c",&again);-->scanf(" %c",&again);和scanf("%c",&answer);-->scanf(" %c",&answer); -
将此视为learn how to debug your programs 的最佳时机。使用调试器逐句执行代码,同时监控变量及其值。
-
对你的代码的一些批评:首先不要像
64或101那样使用magic numbers。那么如果answer>64 && answer<69为真,那么您知道answer == 'a'将 为假,因此您无需检查它。并且所有这些代码检查字母都可以更改为单个switch(如果您使用更简单的情况,例如tolower)。 -
@Someprogrammerdude:我同意你的评论,OP应该使用
if (isalpha((unsigned char)answer))和if (tolower((unsigned char)answer) == 'a')
标签: c if-statement while-loop do-while