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

C语言实现考试答题正确率统计输出全为1问题排查

C语言学生答题判分程序问题修复

实现需求

  • 录入5道题的标准答案
  • 依次录入3名学生的姓名及每道题的作答答案
  • 对比标准答案统计每名学生的答对题目数量
  • 按格式输出所有学生的姓名和对应答对题数

测试输入

  • 标准答案:a、b、c、d、a
  • 学生作答数据:
    • matheus:a、b、c、d、a,预期答对5题
    • maria:a、a、a、a、a,预期答对2题
    • marcos:c、c、c、c、c,预期答对1题

问题现象

原始代码运行后输出所有学生的答对题数均为1,与预期结果不符。

原始错误代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){

  int i, j, aux;
  char name[3][20], g[5], r[5];

  printf("\t======= TEST TEMPLATE =======\n\n");
  for(i = 0; i < 5; i++){
    printf("\nTemplate question. %d: ", i+1);
    scanf("%s", &g[i]);
  }
 printf("\n\n\t======= TEST =======\n\n");
  for(j = 0; j < 3; j++){
    printf("\nStudent name: ");
    scanf("%s", name[j]);
    for(i = 0; i< 5; i++){
      printf("\nQ.%d: ", i+1);
      scanf("%s", &r[i]);
    }
  }
  for(j = 0; j < 3; j++){
    aux = 0;
    for(i = 0; i < 5; i++){
          if(g[i] == r[i]){
            aux++;
          }
        }
    }
    printf("\n\n\t======= ANSWARES =======\n\n");
    for(j = 0; j < 3; j++){
     printf("%s: %d\n", name[j], aux);
    }
return 0;
}

错误原因

  1. 存储结构设计错误:原始代码用一维数组r[5]存储学生答案,每录入一名新学生的作答就会覆盖上一名学生的答案,最终r数组里只保留了最后一名学生marcos的答案
  2. 得分统计逻辑错误:原始代码统计得分时循环遍历3名学生,每次都会重置aux计数变量,循环结束后aux只保留了最后一名学生的得分1
  3. 输出逻辑错误:原始代码单独循环输出所有学生得分时,统一使用了最后一次统计得到的aux值,导致所有学生得分都显示为1

修复后可运行代码(变量采用葡萄牙语命名)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){

  char name[3][20], g[5], r[3][5];

  printf("\t======= GABARITO DA PROVA =======\n\n");
  for(int i = 0; i < 5; i++){
    printf("\nGabarito da questão %d: ", i+1);
    scanf("%s", &g[i]);
    // printf("%c\n", g[i]);
  }
 printf("\n\n\t======= PROVA =======\n\n");
  for(int j = 0; j < 3; j++){
    printf("\nNome do Aluno: ");
    scanf("%s", name[j]);
    for(int i = 0; i< 5; i++){
      printf("\nQ.%d: ", i+1);
      scanf("%s", &r[j][i]);
      //printf("%c \n", r[j][i]);
    }
  }

  printf("\n\n\t======= RESPOSTAS =======\n\n");
  
  for(int j = 0; j < 3; j++){
    int aux = 0;
    
    for(int i = 0; i < 5; i++){
      //printf("%c - %c\n", g[i], r[j][i]);
      if(g[i] == r[j][i]){
        aux+=1;
        }
      }
    printf("%s: %d\n", name[j], aux);  

    }
    

    return 0;
}

修复点说明

  • 将学生答案存储数组修改为二维数组r[3][5],可以分别存储3名学生各5道题的答案,不会出现覆盖问题
  • 将得分统计和输出逻辑合并到同一个循环内,每统计完一名学生的得分就直接输出,避免计数变量被覆盖
  • 统计得分时用r[j][i]读取第j名学生第i题的答案,和标准答案g[i]对比,统计结果准确

内容的提问来源于stack exchange,提问作者Matheus Ferreira Leandro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:48:04