问题一:有5个学生每个学生有3门课程的成绩,从键盘输入学生数据(包括学号,姓名,3门成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件"stud"中。
代码如下:
#include <stdio.h>
#include <stdlib.h>
struct student_type
{
int num;
char name[5];
float score[3];
float aver;
}stud[5];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stud.dat","wb"))==NULL)
{
printf("无法打开stud文件!");
return;
}
for(i=0;i<5;i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("文件写入有误!");
fclose(fp);
}
int main()
{
int i;
printf("输入学生信息:");
printf("\n");
for(i=0;i<5;i++)
{
scanf("%d%s%f%f%f",&stud[i].num,stud[i].name,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);
stud[i].aver=(stud[i].score[0]+stud[i].score[1]+stud[i].score[2])/3.0;
}
save();
return 0;
}
编写另一程序,进行验证:
#include <stdio.h>
struct student_type
{
int num;
char name[5];
float score[3];
float aver;
}stud[5];
int main2()
{
int i;
FILE *fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("无法打开此文件!");
return;
}
for(i=0;i<5;i++)
{
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%d %s %f %f %f %f\n",stud[i].num,stud[i].name,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].aver);
}
fclose(fp);
return 0;
}
代码运行结果:
由上述结果得知,输出信息与输入的信息一致,可得输入信息成功。
问题二:将"stud"文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件"stu-sort"中。
代码如下:
#include <stdio.h>
struct student_type
{
int num;
char name[5];
float score[3];
float aver;
}stud[5];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu-sort.dat","wb"))==NULL)
{
printf("无法打开stud文件!");
return;
}
for(i=0;i<5;i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("文件写入有误!");
fclose(fp);
}
int main()
{
int i,j;
struct student_type t;
FILE *fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("无法打开此文件!");
return;
}
for(i=0;i<5;i++)
fread(&stud[i],sizeof(struct student_type),1,fp);
for(j=0;j<4;j++)
for(i=0;i<4-j;i++)
if(stud[i].aver>stud[i+1].aver)
{
t=stud[i];
stud[i]=stud[i+1];
stud[i+1]=t;
}
save();
return 0;
}
同样,采用程序验证,此处程序与上述的一致,故不在详述。
代码运行结果为:
由上述的运行结构观察可知,学生信息已按照平均成绩的高低进行相应的排序。
问题三:将已排序的学生成绩文件进行插入处理。插入一个学生的三门课程成绩,程序先计算新插入学生的平均成绩,然后将它按照成绩高低顺序插入,插入后建立一个新文件。
代码如下:
#include <stdio.h>
struct student_type
{
int num;
char name[5];
float score[3];
float aver;
}stud[6];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu-sort1.dat","wb"))==NULL)
{
printf("无法打开stu-sort1文件!");
return;
}
for(i=0;i<6;i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("文件写入有误!");
fclose(fp);
}
int main()
{
int i,j;
struct student_type t;
FILE *fp;
if((fp=fopen("stu-sort.dat","rb"))==NULL)
{
printf("无法打开此文件!");
return;
}
for(i=0;i<5;i++)
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("请输入新插入学生的信息:");
printf("\n");
scanf("%d%s%f%f%f",&stud[5].num,stud[5].name,&stud[5].score[0],&stud[5].score[1],&stud[5].score[2]);
stud[5].aver=(stud[5].score[0]+stud[5].score[1]+stud[5].score[2])/3.0;
for(j=0;j<5;j++)
for(i=0;i<5-j;i++)
if(stud[i].aver>stud[i+1].aver)
{
t=stud[i];
stud[i]=stud[i+1];
stud[i+1]=t;
}
save();
return 0;
}
同样利用上述程序进行验证:
问题四:将结构存入原有的"stu_sort"文件而不另外建立新文件。
代码如下:
#include <stdio.h>
struct student_type
{
int num;
char name[5];
float score[3];
float aver;
}stud[6];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu-sort.dat","wb"))==NULL)
{
printf("无法打开stu-sort文件!");
return;
}
for(i=0;i<6;i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("文件写入有误!");
fclose(fp);
}
int main()
{
int i,j;
struct student_type t;
FILE *fp;
if((fp=fopen("stu-sort.dat","rb"))==NULL)
{
printf("无法打开此文件!");
return;
}
for(i=0;i<5;i++)
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("请输入新插入学生的信息:");
printf("\n");
scanf("%d%s%f%f%f",&stud[5].num,stud[5].name,&stud[5].score[0],&stud[5].score[1],&stud[5].score[2]);
stud[5].aver=(stud[5].score[0]+stud[5].score[1]+stud[5].score[2])/3.0;
for(j=0;j<5;j++)
for(i=0;i<5-j;i++)
if(stud[i].aver>stud[i+1].aver)
{
t=stud[i];
stud[i]=stud[i+1];
stud[i+1]=t;
}
save();
return 0;
}
输入新插入的学生信息:
同样,经过程序验证:
结果无误!