You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在选择题程序中为数组存储多值并实现元素求和?

问题描述

我正在开发一款可自选答题顺序的多题选择题游戏,规则为答对对应题目获得相应分数,答错则扣除对应分数。我需要将每道题的得分(正确为正,错误为负)存储到数组中,同时需要实现对数组内所有元素求和的功能。目前尝试常规数组构建方式时,出现了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:42:30