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

C语言循环按组填充成绩数组避免旧数据干扰的实现咨询

C语言循环录入学生成绩问题解决方案

核心问题:避免旧数据干扰的实现方案

根据你的需求分两种场景处理:

场景1:无需保留历史学生成绩,仅计算当前学生平均分

每次循环直接对存储4个成绩的数组位置重新赋值即可,新输入的内容会直接覆盖旧数据,不会受到之前存储内容的干扰。

场景2:需要保留所有学生的历史成绩不被覆盖

新增一个偏移量变量标记当前成绩的存储起始位置,每存完一个学生的4个成绩就将偏移量后移4位,新成绩会存入数组后续空白位置,不会覆盖历史数据,参考逻辑如下:

// 新增偏移量变量定义,标记当前存储的起始下标
int offset = 0;

// 存成绩逻辑修改
for(j=0;j<4;j++)
{
    printf("Enter quiz grade %d\n", j+1);
    scanf("%d", &grade);
    grades[offset + j] = grade;
}
// 计算平均值时也按偏移量取值
avg = (grades[offset] + grades[offset+1] + grades[offset+2] + grades[offset+3]) / 4.0;
// 处理完当前学生后偏移量后移4位,给下一个学生留出存储位置
offset +=4;
// 额外增加判断:数组总长度为20,offset+4>20时说明数组存满,避免越界

原代码其他问题修复

  • 缺少必要头文件:你用到的printf、scanf、fgets、strcmp、strlen等函数分别属于stdio.h和string.h头文件,需要在代码开头引入
  • 平均值计算逻辑错误:C语言中除法优先级高于加法,原代码的计算逻辑等价于grades[1] + grades[2] + grades[3] + (grades[4]/4),结果完全不符合预期,需要把四个成绩求和后整体除以4,且要除以浮点数4.0避免整数除法丢失小数部分
  • 数组索引使用不规范:C语言数组默认从0开始索引,你当前使用1~4的索引虽然不会越界,但不符合通用编码习惯,也容易出现逻辑错误
  • goto语句可读性差:入门阶段建议用while(1)循环代替goto实现循环逻辑,代码可读性更高

完整修改后代码示例

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

int main()
{
    char name[32];
    int grades[20];
    int grade;
    int j;
    char unkstr[]= "Unknown";
    float avg;
    int c;
    // 如果不需要保留历史成绩,可以删掉offset相关的所有代码
    int offset = 0; 

    printf("Welcome to the student Quiz Calculator Program.\n");
    while(1) {
        printf("Enter student name: ");
        fgets(name, 32, stdin);
        name[strlen(name)-1]='\0';

        if(strcmp(name, unkstr)==0) {
            break;
        }
        // 判断数组是否存满,不需要保留历史可以删掉这段判断
        if(offset +4 > 20) {
            printf("成绩数组已满,无法继续存储\n");
            break;
        }
        for(j=0;j<4;j++)
        {
            printf("Enter quiz grade %d\n", j+1);
            scanf("%d", &grade);
            // 不需要保留历史的话,这里改为 grades[j] = grade;
            grades[offset + j] = grade;
        }
        // 不需要保留历史的话,这里改为(grades[0]+grades[1]+grades[2]+grades[3])/4.0
        avg = (grades[offset] + grades[offset+1] + grades[offset+2] + grades[offset+3]) / 4.0;
        
        printf("Average Quiz Calculations for %s grade1: %d grade2: %d grade3: %d grade4: %d is %f.\n", 
            name, grades[offset], grades[offset+1], grades[offset+2], grades[offset+3], avg);
        while ((c=getchar()) !='\n' && c !=EOF);
        // 不需要保留历史的话删掉下面这行
        offset +=4;
    }    
        
    printf("Have a nice day!");
    return 0;
}

内容的提问来源于stack exchange,提问作者Roger Bunting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:45:08