C语言 解决后5个数据显示不出来的问题,并优化程序代码。

#试编写一个程序,建立一个学生成绩文件(30名学生),每名同学的信息包括学号、姓名和英语、数学、计算机三门课程的成绩。分别将所有同学的信息存放到顺序文件中,学生的数据信息通过键盘盘录入。
试编写另一个程序,打开上题所建立的顺序文件,从中读即同学的信息,并利用冒泡排序法按总成绩从大到小的顺序显示所有同学的学号、姓名和英语、数学、计算机和总分这6个内容。


/*程序1:输入数据并建立学生成绩文件*/
#include <stdio.h>
struct student{               /*声明结构体类型struct student*/
    int number;               /*学号*/
    char name[30];            /*姓名*/
    float math;               /*数学成绩*/
    float English;            /*英语成绩*/
    float computer;           /*计算机成绩*/
    float score;              /*总成绩*/
}stu[30];                     /*定义一个结构体变量stu[30],用于存放学生信息*/
int main()
{
int i;
float x,y,z;
FILE *fp;                     /*定义一个指向文件的指针变量fp*/
for(i=0;i<30;i++)
  {
  printf("number,English,math,computer,name:");  /*提示输入信息*/
  scanf("%d,%f,%f,%f,%s",&stu[i].number,&x,&y,&z,stu[i].name);  /*输入学生信息*/
  if(x>100|x<0|y>100|y<0|z>100|z<0)  /*对输入的错误成绩进行提示*/
     printf("score input error\n");  /*对错误输入成绩提示“成绩输入错误”*/
  stu[i].English=x;    /*把x的值赋给stu[i].English*/
  stu[i].math=y;       /*把y的值赋给stu[i].math*/
  stu[i].computer=z;  /*把z的值赋给stu[i].computer*/
  }
if((fp=fopen("stud","w"))==NULL)   /*判断打开文件是否成功*/
    printf("cannot open file\n");   /*如果打开出错就输出“打不开文件”*/
for(i=0;i<30;i++)
  if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)/*判断数据写入到目标文件fp是否成功*/
    printf("file write error\n");  /*若写入失败,输出“文件写入错误”*/
fclose(fp);        /*关闭文件*/
}
/*程序2:对学生总成绩进行冒泡法降序排列*/
#include <stdio.h>
 struct student{         /*声明结构体类型struct student*/
     int number;          /*学号*/
    char name[30];       /*姓名*/
    float math;          /*数学成绩*/
    float English;       /*英语成绩*/
    float computer;      /*计算机成绩*/
    float score;         /*总成绩*/
}stu[30],t;              /*定义两个结构体变量stu[30],t,t做中间变量*/
int main()
{
int i,j;
FILE *fp;                             /*定义一个指向文件的指针变量fp*/
if((fp=fopen("stud","r"))==NULL)     /*判断打开文件是否成功*/
  printf("cannot open file\n");      /*如果打开出错就输出“打不开文件”*/
for(i=0;i<30;i++)
   {fread(&stu[i],sizeof(struct student),1,fp);               /*从fp读数据存入stu[i]*/
    stu[i].score=stu[i].math+stu[i].English+stu[i].computer;   /*计算总成绩*/
   }
fclose(fp);          /*关闭文件*/
/*冒泡法进行降序排列*/
for(i=0;i<30;i++)         /*外层循环,每一轮都把最大的数放在最前面 */
    for(j=0;j<30-i;j++)  /*内层循环,每经过一轮就减少一次比较*/
        if(stu[j].score<stu[j+1].score)  /*如果前一个数比后一个数小*/
           {t=stu[j];stu[j]=stu[j+1];stu[j+1]=t;} /*把大的数赋值给前面,小的数赋值给后面*/
printf("name,number,English,math,computer,score\n");/*输出表头*/
fp=fopen("stud","w");      /*打开文件stud并写数据*/
for(i=0;i<30;i++)
   {fwrite(&stu[i],sizeof(struct student),1,fp);/*将&stu[i]这个指针所指向的内容输出到fp这个文件中*/
    printf("%s,%d,%.2f,%.2f,%.2f,%.2f\n",stu[i].name,stu[i].number,stu[i].English ,stu[i].math ,stu[i].computer,stu[i].score);
   }      /*输出学生总成绩降序排列后的结果*/
fclose(fp);      /*关闭文件*/
}

img

成绩输入错误,只是进行了提示,没有重新输入啊,还是把错误的数据赋值给了成员变量。