//C程序设计第四版(谭浩强)
//章节:第十章 对文件的输入输出
//题号:10.5,10.6,10.7,10.8
//题目:第5题:有5个学生,每个学生有3门课程的成绩,从键盘输入学生数据(包括学号,姓名,3门课程成绩),
//计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件"stud"中。
//将第5题"stud"文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件"stud_sort"中。
//将第6题已排序的学生成绩文件进行插入处理。插入一个学生的3门课程成绩,程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。
//将第7题结果仍存入原有的"stud_sort"文件而不另建立新文件
10.5
#include <stdio.h>
#include <stdlib.h>
#define N 5
struct student
{
int num;
char name[20];
float score[3];
float aver;
}stu[N];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stud","wb"))==NULL)
{
printf("cannot open the file stud!\n");
exit(0);
}
for(i=0;i<N;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
int main()
{
int i;
printf("请输入学生学号,姓名,3门课程成绩(以空格隔开)\n");
for(i=0;i<N;i++)
{
scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
save();
FILE *fp;
if((fp=fopen("stud","rb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
printf("the data:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp);
return 0;
}
10.6
#include <stdio.h>
#include <stdlib.h>
#define N 5
struct student
{
int num;
char name[20];
float score[3];
float aver;
};
int main()
{
FILE *fp1,*fp2;
int i,j,k;
struct student stu[N],stu0;
if((fp1=fopen("stud","rb"))==NULL)
{
printf("cannot open stud!\n");
exit(0);
}
printf("the original date:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student),1,fp1); //先读取原来的数据,并将其显示在屏幕上
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp1); //关闭文件stud
for(i=0;i<N-1;i++) //选择排序法
{
k=i;
for(j=i+1;j<N;j++)
if(stu[j].aver<stu[k].aver)
k=j;
if(i!=k)
{
stu0=stu[i];
stu[i]=stu[k];
stu[k]=stu0;
}
}
if((fp2=fopen("stud_sort","wb"))==NULL)
{
printf("cannot open stud_sort!\n");
exit(0);
}
for(i=0;i<N;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp2)!=1) //将排序后的数据写到文件stud_sort中并关闭文件
printf("file write error!\n");
fclose(fp2);
if((fp2=fopen("stud_sort","rb"))==NULL) //重新打开文件stud_sort
{
printf("cannot open stud_sort!\n");
exit(0);
}
printf("\nthe sorted data:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student),1,fp2);
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp2); //关闭文件stud_sort
return 0;
}
10.7
#include <stdio.h>
#include <stdlib.h>
#define N 5
struct student
{
int num;
char name[20];
float score[3];
float aver;
}stu[N+1],stu0;
int main()
{
FILE *fp1,*fp2;
int i,j,k;
if((fp1=fopen("stud_sort","rb"))==NULL) //打开文件stud_sort
{
printf("cannot open stud_sort!\n");
exit(0);
}
printf("the original date:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student),1,fp1); //先读取原来的数据,并将其显示在屏幕上
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp1);
printf("请输入一个学生学号,姓名,3门课程成绩(以空格隔开)\n");
scanf("%d%s%f%f%f",&stu[N].num,stu[N].name,&stu[N].score[0],&stu[N].score[1],&stu[N].score[2]);
stu[N].aver=(stu[N].score[0]+stu[N].score[1]+stu[N].score[2])/3.0;
for(i=0;i<N;i++) //选择排序法
{
k=i;
for(j=i+1;j<N+1;j++)
if(stu[j].aver<stu[k].aver)
k=j;
if(i!=k)
{
stu0=stu[i];
stu[i]=stu[k];
stu[k]=stu0;
}
}
if((fp2=fopen("stud_sort_new","wb"))==NULL)
{
printf("cannot open the file stud_sort_new!\n");
exit(0);
}
for(i=0;i<N+1;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp2)!=1)
printf("file write error\n");
}
fclose(fp2);
if((fp2=fopen("stud_sort_new","rb"))==NULL) //重新打开文件stud_sort_new
{
printf("cannot open the file stud_sort_new!\n");
exit(0);
}
printf("\nthe new sorted data:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N+1;i++)
{
fread(&stu[i],sizeof(struct student),1,fp2);
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp2);
}
10.8
#include <stdio.h>
#include <stdlib.h>
#define N 5
struct student
{
int num;
char name[20];
float score[3];
float aver;
}stu[N+1],stu0;
int main()
{
FILE *fp1,*fp2;
int i,j,k;
if((fp1=fopen("stud_sort","rb"))==NULL) //打开文件stud_sort
{
printf("cannot open stud_sort!\n");
exit(0);
}
printf("the original date:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student),1,fp1); //先读取原来的数据,并将其显示在屏幕上
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
printf("请输入一个学生学号,姓名,3门课程成绩(以空格隔开)\n");
scanf("%d%s%f%f%f",&stu[N].num,stu[N].name,&stu[N].score[0],&stu[N].score[1],&stu[N].score[2]);
stu[N].aver=(stu[N].score[0]+stu[N].score[1]+stu[N].score[2])/3.0;
for(i=0;i<N;i++) //选择排序法
{
k=i;
for(j=i+1;j<N+1;j++)
if(stu[j].aver<stu[k].aver)
k=j;
if(i!=k)
{
stu0=stu[i];
stu[i]=stu[k];
stu[k]=stu0;
}
}
if((fp2=fopen("stud","wb"))==NULL)
{
printf("cannot open the file stud!\n");
exit(0);
}
for(i=0;i<N+1;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp2)!=1)
printf("file write error\n");
}
fclose(fp2);
if((fp2=fopen("stud","rb"))==NULL) //重新打开文件stud_sort_new
{
printf("cannot open the file stud_sort_new!\n");
exit(0);
}
printf("\nthe new sorted data:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N+1;i++)
{
fread(&stu[i],sizeof(struct student),1,fp2);
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp2);
}