C语言测验项目:用while/for统计用户答对题数并展示
问题解决:测验程序的答对次数统计修复
你的代码存在几处关键问题导致统计功能异常,以下是修复方案及说明:
核心问题分析
- 计数器未初始化:变量
i未赋值就直接使用,导致输出垃圾值(如32767)。 - 错误的循环用法:用
while循环递增计数器完全多余,且写法错误(如while(i=1)是赋值操作,会触发无限循环)。 - 条件判断语法错误:
if (answer == 1, 3, 4)不符合C语言规则,逗号运算符只会保留最后一个值,导致条件永远为真。 - 冗余的switch结构:原代码靠switch的fall-through特性执行所有题目,但switch并非实现该逻辑的合适方式,可直接顺序执行题目。
修复后的完整代码
#include <stdio.h> int main() { int x, answer, i = 0; // 初始化计数器i为0,移除未使用的冗余变量 printf("Καλώς ήρθατε στο quiz/εργασία:)\n"); printf("Αυτό το κουίζ περιέχει ερωτήσεις για χώρες επειδή δεν ήθελα να βάλω μαθηματικά\n"); // 用do-while替代goto,更符合结构化编程规范 do { printf("Πάτα *1* για έναρξη\n"); scanf("%d", &x); } while (x != 1); printf("Πρεπει να απαντησεις συνολικα 8 ερωτησεις\n"); // 题目1 printf("ποια ειναι η πρωτεύουσα της Ρουμανίας;:\n"); printf("1=Κραϊοβα, 2=Βουκουρέστη, 3=Βουδαπέστη, 4=Οραντέα\n"); scanf("%d", &answer); if (answer == 2) { i++; // 答对时计数器加1 printf("Σωστό!Ειναι η 'Βουκουρέστη.'\n"); // 修正原错误的城市名称 } else if (answer == 1 || answer == 3 || answer == 4) { printf("Λαθος.\n"); } // 题目2 printf("ποια χώρα κατανάλλωσε το περισσότερο τσάι το 2022;:\n"); printf("1=Ιρλανδία, 2=Ηνωμένο Βασίλειο, 3=Τουρκία, 4=Ινδονησία\n"); scanf("%d", &answer); if (answer == 3) { i++; printf("Σωστό!Με τον μέσο Τούρκο να καταναλλωνει 3.16kg ετησίως.\n"); } else if (answer == 1 || answer == 2 || answer == 4) { printf("Λαθος.\n"); } // 题目3 printf("Ποια από τις παρακάτω χώρες έχουν 3 πρωτεύουσες;:\n"); printf("1=Ελβετία, 2=Νότια Αφρική, 3=Κίνα, 4=Αυστραλία\n"); scanf("%d", &answer); if (answer == 2) { i++; printf("Σωστό!Ειναι η Νότια Αφρική(1:Κέιπ τάουν, 2:Πρετόρια, 3:Μπλουμφοντέιν.\n"); } else if (answer == 1 || answer == 3 || answer == 4) { printf("Λαθος.\n"); } // 题目4 printf("Ποιανής χώρας ο εθνικός ύμνος δεν έχει στίχους;:\n"); printf("1=Μάλτα, 2=Νορβηγία, 3=Ισλανδία, 4=Ισπανία\n"); scanf("%d", &answer); if (answer == 4) { i++; printf("Σωστό!Ειναι η Ισπανία.\n"); } else if (answer == 1 || answer == 2 || answer == 3) { printf("Λαθος.\n"); } // 题目5 printf("ποια ειναι η πρωτεύουσα της Εσθονίας;:\n"); printf("1=Ταλίν, 2=Τάρτου, 3=Νάρβα, 4=Ρακβερέ\n"); scanf("%d", &answer); if (answer == 1) { i++; printf("Σωστό!Ειναι το Ταλίν.\n"); } else if (answer == 2 || answer == 3 || answer == 4) { printf("Λαθος.\n"); } // 题目6 printf("Ποια είναι η μικρότερη χώρα της κεντρικής Αμερικής;:\n"); printf("1=Ελ Σαλβαδόρ, 2=Ονδούρα, 3=Νικαράγουα, 4=Γουατεμάλα\n"); scanf("%d", &answer); if (answer == 1) { i++; printf("Σωστό!Είναι το Ελ Σαλβαδόρ με έδαφος μόλις 21,041km²\n"); } else if (answer == 2 || answer == 3 || answer == 4) { printf("Λαθος.\n"); } // 题目7 printf("Ποια χώρα έχει τις περισσότερες ζώνες ώρας;:\n"); printf("1=Ρωσία, 2=ΗΠΑ, 3=Γαλλία, 4=Ηνωμένο Βασίλειο\n"); scanf("%d", &answer); if (answer == 3) { i++; printf("Σωστό!Ειναι η Γαλλία με 12 ζώνες ώρας(+παραθαλάσσια εδάφη).\n"); } else if (answer == 1 || answer == 2 || answer == 4) { printf("Λαθος.\n"); } // 题目8 printf("Ποια ήπειρος φιλοξενεί τις περισσότερες χώρες;:\n"); printf("1=Ευρώπη, 2=Νότια Αμερική, 3=Αφρική, 4=Ασία\n"); scanf("%d", &answer); if (answer == 3) { i++; printf("Σωστό!Ειναι η Αφρική με 54 χώρες.\n"); } else if (answer == 1 || answer == 2 || answer == 4) { printf("Λαθος.\n"); } printf("απαντησες σωστα %d\n", i); return 0; }
关键修复说明
- 计数器初始化:
int i = 0;确保从0开始统计答对次数,避免垃圾值。 - 替换错误循环:用
i++替代冗余且错误的while循环,每次答对仅递增一次。 - 修正条件判断:使用
||逻辑或运算符判断多个错误选项,符合C语言语法规则。 - 优化代码结构:用do-while循环替代goto,移除冗余的switch结构,让代码更易读。
- 修正内容错误:第一题的正确答案提示文字写错了城市名称,已修正为正确的Βουκουρέστη(布加勒斯特)。
内容的提问来源于stack exchange,提问作者George Christou
相关产品推荐
相关产品推荐

