#试编写一个程序,建立一个学生成绩文件(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); /*关闭文件*/
}
成绩输入错误,只是进行了提示,没有重新输入啊,还是把错误的数据赋值给了成员变量。