有5个学生,每个学生有3们课程的成绩,从键盘输入学生数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均成绩存放在磁盘文件“student.txt”中,并将一个新的数据插入到已经排过序的纪录中。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Student
{
long num;
char name[10];
int score[3];
float ave;
}stu[N];
void input(int);
void save(int,char *);
void read(int,char *);
void stu_sort(int);
void insert(int);
int main()
{
input(N);/*输入数据*/
save(N,"student.txt");/*将数据保存到文件*/
read(N,"student.txt");/*从文件中读取数据*/
stu_sort(N);/*对文件中的数据进行排序*/
insert(N);/*插入一个新的数据*/
printf("After insert:\n");
read(N+1,"student_sort.txt");/*查看插入后的全部数据*/
return 0;
}
void input(int n)
{
int i,j,sum;
for(i=0;i<n;i++)
{
printf("enter information of student %d\n",i+1);
printf("Num :");scanf("%ld",&stu[i].num);
printf("Name :");scanf("%s",stu[i].name);
sum=0;
for(j=0;j<3;j++)
{
printf("Score %d:",j+1);scanf("%d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].ave=sum/3.0;
}
}
void save(int n,char *filename)
{
FILE *fp;
int i;
if((fp=fopen(filename,"w"))==NULL)
{
printf("cannot creat file.\n");
exit(0);
}
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1)
printf("\n write error!\n");
fclose(fp);
}
void read(int n,char *filename)
{
FILE *fp;
int i;
if((fp=fopen(filename,"r"))==NULL)
{
printf("cannot open file!\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&stu[i],sizeof(struct Student),1,fp);
printf("%ld,%s,%d,%d,%d,%5.1f\n",\
stu[i].num,stu[i].name,stu[i].score[0],\
stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
}
void stu_sort(int n)
{
printf("\nbefore sort:\n");
read(n,"student.txt");
int i,j,k;
struct Student stu_temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(stu[k].ave<stu[j].ave)
k=j;
if(k!=i)
{
stu_temp=stu[i];
stu[i]=stu[k];
stu[k]=stu_temp;
}
}
save(N,"student_sort.txt");
printf("\nafter sort:\n");
read(N,"student_sort.txt");
}
void insert(int n)
{
struct Student stu_add;
printf("input the infomation of new student:\n");
scanf("%ld %s %d %d %d",&stu_add.num,stu_add.name,\
&stu_add.score[0],&stu_add.score[1],&stu_add.score[2]);
stu_add.ave=(stu_add.score[0]+stu_add.score[1]+stu_add.score[2])/3.0;
printf("Before insert:\n");
read(N,"student_sort.txt");
int i,p;
for(i=0;stu_add.ave<stu[i].ave&&i<n;i++);
p=i;
FILE *fp;
if((fp=fopen("student_sort.txt","w"))==NULL)
{
printf("cannot open file.\n");
exit(0);
}
for(i=0;i<p;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1)
printf("write error!\n");
if(fwrite(&stu_add,sizeof(struct Student),1,fp)!=1)
printf("write error!\n");
for(i=p;i<n;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1)
printf("write error!\n");
fclose(fp);
}