有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号、姓名、三门课成绩),计算平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中
对于平均成绩的思路就是:把平均成绩当做结构体的一项
在输入3门课成绩以获得平均成绩时,要注意在c语言中,三门成绩要单独输入,不能和学号、姓名一起输入。如果这样输入,程序不会报错,但始终运行不出来。
struct student//定义结构体 { int num; char name[10]; int score[3]; float ave; }stu[5]; int main(int argc, char *argv[]) { int i,j,sum,t; FILE *fp; struct student p,temp,re[6]; for(i=0;i<5;i++)//结构体赋值 { printf("输入第%d条记录\n",i+1); scanf("%d,%s",&stu[i].num,stu[i].name); printf("请输入三门课成绩\n"); scanf("%d,%d,%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); sum=0; sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]; stu[i].ave=sum/3.0; } if((fp=fopen("stud.txt","w"))==NULL)//写入文件 { printf("cannot open stud.txt\n"); exit(0); } for(i=0;i<5;i++) fwrite(&stu[i],sizeof(struct student),1,fp); fclose(fp); if((fp=fopen("stud.txt","r"))==NULL)//读取文件 { printf("cannot open stud.txt\n"); exit(0); } for(i=0;i<5;i++) { fread(&stu[i],sizeof(struct student),1,fp); 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); } fclose(fp); printf("\n");}
按照平均分进行排序
for(i=0;i<4;i++)//文件排序 for(j=i+1;j<5;j++) if(stu[i].ave>stu[j].ave) { temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } if((fp=fopen("stu_sort.txt","w"))==NULL) { printf("cannot open stud.txt\n"); exit(0); } for(i=0;i<5;i++) fwrite(&stu[i],sizeof(struct student),1,fp); fclose(fp); if((fp=fopen("stu_sort.txt","r"))==NULL) { printf("cannot open stud.txt\n"); exit(0); } for(i=0;i<5;i++) { fread(&stu[i],sizeof(struct student),1,fp); 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); } fclose(fp);
插入新的学生数据
printf("请输入插入学生数据:\n"); scanf("%d,%s",&p.num,p.name); printf("请输入三门课成绩\n"); scanf("%d,%d,%d",&p.score[0],&p.score[1],&p.score[2]); sum=0; sum=p.score[0]+p.score[1]+p.score[2]; p.ave=sum/3.0; if((fp=fopen("stu_sort.txt","r"))==NULL) { printf("cannot open stud.txt\n"); exit(0); } for(i=0;i<5;i++) { fread(&stu[i],sizeof(struct student),1,fp); if(stu[i].ave>p.ave) { t=i;break; } else t=5; } fclose(fp); fp=fopen("sdent.txt","a"); if(t==5) { for(i=0;i<5;i++) fwrite(&stu[i],sizeof(struct student),1,fp); fwrite(&p,sizeof(struct student),1,fp); } else if(t==0) { fwrite(&p,sizeof(struct student),1,fp); fwrite(&stu[i],sizeof(struct student),1,fp); } else { for(i=0;i<t;i++) fwrite(&stu[i],sizeof(struct student),1,fp); fwrite(&p,sizeof(struct student),1,fp); for(i=t;i<5;i++) fwrite(&stu[i],sizeof(struct student),1,fp); } fclose(fp);
读取插入后新的学生数据
//读取插入后文件 if((fp=fopen("sdent.txt","r"))==NULL) { printf("cannot open stud.txt\n"); exit(0); } for(i=0;i<6;i++) { fread(&re[i],sizeof(struct student),1,fp); 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); } fclose(fp);