C语言:有5个学生,每个学生有3门课的成绩,从键盘输入学生数据,计算平均成绩

淡淡的烟草味﹌ 2022-05-26 00:37 320阅读 0赞

有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号、姓名、三门课成绩),计算平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中

对于平均成绩的思路就是:把平均成绩当做结构体的一项

在输入3门课成绩以获得平均成绩时,要注意在c语言中,三门成绩要单独输入,不能和学号、姓名一起输入。如果这样输入,程序不会报错,但始终运行不出来。

  1. struct student//定义结构体
  2. {
  3. int num;
  4. char name[10];
  5. int score[3];
  6. float ave;
  7. }stu[5];
  8. int main(int argc, char *argv[]) {
  9. int i,j,sum,t;
  10. FILE *fp;
  11. struct student p,temp,re[6];
  12. for(i=0;i<5;i++)//结构体赋值
  13. {
  14. printf("输入第%d条记录\n",i+1);
  15. scanf("%d,%s",&stu[i].num,stu[i].name);
  16. printf("请输入三门课成绩\n");
  17. scanf("%d,%d,%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
  18. sum=0;
  19. sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
  20. stu[i].ave=sum/3.0;
  21. }
  22. if((fp=fopen("stud.txt","w"))==NULL)//写入文件
  23. {
  24. printf("cannot open stud.txt\n");
  25. exit(0);
  26. }
  27. for(i=0;i<5;i++)
  28. fwrite(&stu[i],sizeof(struct student),1,fp);
  29. fclose(fp);
  30. if((fp=fopen("stud.txt","r"))==NULL)//读取文件
  31. {
  32. printf("cannot open stud.txt\n");
  33. exit(0);
  34. }
  35. for(i=0;i<5;i++)
  36. {
  37. fread(&stu[i],sizeof(struct student),1,fp);
  38. printf("%d,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
  39. }
  40. fclose(fp);
  41. printf("\n");}

按照平均分进行排序

  1. for(i=0;i<4;i++)//文件排序
  2. for(j=i+1;j<5;j++)
  3. if(stu[i].ave>stu[j].ave)
  4. {
  5. temp=stu[i];
  6. stu[i]=stu[j];
  7. stu[j]=temp;
  8. }
  9. if((fp=fopen("stu_sort.txt","w"))==NULL)
  10. {
  11. printf("cannot open stud.txt\n");
  12. exit(0);
  13. }
  14. for(i=0;i<5;i++)
  15. fwrite(&stu[i],sizeof(struct student),1,fp);
  16. fclose(fp);
  17. if((fp=fopen("stu_sort.txt","r"))==NULL)
  18. {
  19. printf("cannot open stud.txt\n");
  20. exit(0);
  21. }
  22. for(i=0;i<5;i++)
  23. {
  24. fread(&stu[i],sizeof(struct student),1,fp);
  25. printf("%d,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
  26. }
  27. fclose(fp);

插入新的学生数据

  1. printf("请输入插入学生数据:\n");
  2. scanf("%d,%s",&p.num,p.name);
  3. printf("请输入三门课成绩\n");
  4. scanf("%d,%d,%d",&p.score[0],&p.score[1],&p.score[2]);
  5. sum=0;
  6. sum=p.score[0]+p.score[1]+p.score[2];
  7. p.ave=sum/3.0;
  8. if((fp=fopen("stu_sort.txt","r"))==NULL)
  9. {
  10. printf("cannot open stud.txt\n");
  11. exit(0);
  12. }
  13. for(i=0;i<5;i++)
  14. {
  15. fread(&stu[i],sizeof(struct student),1,fp);
  16. if(stu[i].ave>p.ave)
  17. {
  18. t=i;break;
  19. }
  20. else
  21. t=5;
  22. }
  23. fclose(fp);
  24. fp=fopen("sdent.txt","a");
  25. if(t==5)
  26. {
  27. for(i=0;i<5;i++)
  28. fwrite(&stu[i],sizeof(struct student),1,fp);
  29. fwrite(&p,sizeof(struct student),1,fp);
  30. }
  31. else if(t==0)
  32. {
  33. fwrite(&p,sizeof(struct student),1,fp);
  34. fwrite(&stu[i],sizeof(struct student),1,fp);
  35. }
  36. else
  37. {
  38. for(i=0;i<t;i++)
  39. fwrite(&stu[i],sizeof(struct student),1,fp);
  40. fwrite(&p,sizeof(struct student),1,fp);
  41. for(i=t;i<5;i++)
  42. fwrite(&stu[i],sizeof(struct student),1,fp);
  43. }
  44. fclose(fp);

读取插入后新的学生数据

  1. //读取插入后文件
  2. if((fp=fopen("sdent.txt","r"))==NULL)
  3. {
  4. printf("cannot open stud.txt\n");
  5. exit(0);
  6. }
  7. for(i=0;i<6;i++)
  8. {
  9. fread(&re[i],sizeof(struct student),1,fp);
  10. printf("%d,%s,%d,%d,%d,%6.2f\n",re[i].num,re[i].name,re[i].score[0],re[i].score[1],re[i].score[2],re[i].ave);
  11. }
  12. fclose(fp);

发表评论

表情:
评论列表 (有 0 条评论,320人围观)

还没有评论,来说两句吧...

相关阅读