如何在选择题程序中为数组存储多值并实现元素求和?
问题描述
我正在开发一款可自选答题顺序的多题选择题游戏,规则为答对对应题目获得相应分数,答错则扣除对应分数。我需要将每道题的得分(正确为正,错误为负)存储到数组中,同时需要实现对数组内所有元素求和的功能。目前尝试常规数组构建方式时,出现了segmentation fault(段错误)和垃圾值问题。以下是我正在编写的源代码:
#include <stdio.h> int main() { int num, points, Score[3], corr; char code, ans; do { printf("Enter code: \n"); scanf(" %c", &code); switch(code) { case 'A': case 'a': printf("Enter amount: "); scanf("%d", &num); switch(num) { case 1: printf("Which of the following is the capital of the USA \n"); printf("A. Washington, D.C.\n"); printf("B. California \n"); printf("C. Texas\n"); printf("D. New York\n"); printf("Enter answer: \n"); scanf(" %c", &ans); if(ans == 'a' || ans == 'A') { printf("Correct\n"); points = 100; corr++; } else { printf("Incorrect Answer!\n"); points = -100; } break; case 2: printf("3 + 3 = ?\n"); printf("A. 6\n"); printf("B. 9\n"); printf("C. 5\n"); printf("D. 3\n"); printf("Enter answer: \n"); printf(" %c", &ans); if(ans == 'a' || ans == 'A') { printf("Correct\n"); points = 200; corr++; } else { printf("Incorrect Answer!\n"); points = -200; } break; } break; case 'B': case 'b': printf("Enter amount: "); scanf("%d", &num); switch(num) { case 1: printf("3 + 5 = ?\n"); printf("A. 6\n"); printf("B. 8 \n"); printf("C. 5\n"); printf("D. 3\n"); printf("Enter answer: \n"); scanf(" %c", &ans); if(ans == 'b' || ans == 'B') { printf("Correct\n"); points = 200; corr++; } else { printf("Incorrect Answer!\n"); points = -200; } break; } break; } }while(corr < 4); return 0; }
问题分析与修复方案
1. 未初始化变量引发的异常
corr和Score数组未初始化,corr初始为随机垃圾值,会导致do-while循环逻辑混乱;Score数组元素默认是垃圾值,直接使用会引发不可预测的错误。- 修复:初始化
corr = 0,Score数组初始化为0或在存入得分时逐个赋值。
2. 数组越界触发段错误
- 定义的
Score[3]仅能存储3个元素,但循环条件是corr < 4,意味着要处理4道题,会触发数组越界,导致段错误。 - 修复:将数组大小改为
Score[4],匹配需要存储的4道题分数。
3. 输入语句错误
- 第二题(case 2)中错误使用
printf(" %c", &ans);,应该是scanf(" %c", &ans);,这会导致ans的值未被正确读取,后续判断逻辑失效。
4. 未实现分数存入数组的逻辑
- 代码中计算了
points,但未将其存入Score数组,无法实现分数存储和求和的需求。 - 修复:每次计算完
points后,将其存入Score数组对应索引位置。
5. 缺少分数求和功能
- 添加遍历数组求和的代码,在循环结束后计算总得分。
修复后的完整代码
#include <stdio.h> int main() { int num, points, Score[4] = {0}; // 初始化数组,大小改为4以容纳4道题分数 int corr = 0; // 初始化答对计数 int current_index = 0; // 记录当前存入数组的索引 char code, ans; do { printf("Enter code: \n"); scanf(" %c", &code); switch(code) { case 'A': case 'a': printf("Enter amount: "); scanf("%d", &num); switch(num) { case 1: printf("Which of the following is the capital of the USA \n"); printf("A. Washington, D.C.\n"); printf("B. California \n"); printf("C. Texas\n"); printf("D. New York\n"); printf("Enter answer: \n"); scanf(" %c", &ans); if(ans == 'a' || ans == 'A') { printf("Correct\n"); points = 100; corr++; } else { printf("Incorrect Answer!\n"); points = -100; } Score[current_index++] = points; // 将得分存入数组 break; case 2: printf("3 + 3 = ?\n"); printf("A. 6\n"); printf("B. 9\n"); printf("C. 5\n"); printf("D. 3\n"); printf("Enter answer: \n"); scanf(" %c", &ans); // 修复输入错误 if(ans == 'a' || ans == 'A') { printf("Correct\n"); points = 200; corr++; } else { printf("Incorrect Answer!\n"); points = -200; } Score[current_index++] = points; // 将得分存入数组 break; } break; case 'B': case 'b': printf("Enter amount: "); scanf("%d", &num); switch(num) { case 1: printf("3 + 5 = ?\n"); printf("A. 6\n"); printf("B. 8 \n"); printf("C. 5\n"); printf("D. 3\n"); printf("Enter answer: \n"); scanf(" %c", &ans); if(ans == 'b' || ans == 'B') { printf("Correct\n"); points = 200; corr++; } else { printf("Incorrect Answer!\n"); points = -200; } Score[current_index++] = points; // 将得分存入数组 break; } break; } }while(current_index < 4); // 按已答题数判断循环,避免答对计数的干扰 // 计算并输出总得分 int total = 0; for(int i = 0; i < 4; i++) { total += Score[i]; } printf("总得分: %d\n", total); printf("答对题目数: %d\n", corr); return 0; }
内容的提问来源于stack exchange,提问作者MazinoProg
相关产品推荐
相关产品推荐

