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
相关产品推荐
相关产品推荐

