c语言数据库文件读取3

数据库文件aaa.dic、bbb.dic、ccc.dic中都存有若干(不超过100个)学生的数据,已知三个文件中都有name、、math三个字段 。
请编程序,从键盘输入1或2或3以打开aaa.dic或bbb.dic或ccc.dic,读出所有学生的name和、math成绩并按总分由高到低的顺序输出每个学生的数据 。若总分相同,分数高的排前 。
注意:有些记录已被删除,被删记录属于无效记录
输出格式:每行一个学生的数据,姓名占10格(左对齐) , 两科成绩各占4格,总分占5格(除姓名外,其他数据都保留一位小数,右对齐,后面三个数据之间用一个空格隔开)
如:
90.5 87.0 177.5

c语言数据库文件读取3

文章插图
lisi88.0 89.0 177.0
Input
输入1或2或3
按总分从高到低输出所有学生的数据
如:
90.5 87.0 177.5
lisi88.0 89.0 177.0
Input
90.5 87.0 177.5
lisi88.0 89.0 177.0
Code 1 here:
#include#include#includetypedef struct{char file_type;//文件特征标志char date[3];//建表或最后修改时间int rec_num;//记录总数short head_size;//文件头的总长度short rec_size;//每条记录的长度char empty[20];//空字节}HEAD;typedef struct{char name[10];//字段名char empty_c;//一个空字节char type;//字段类型int begin;//本字段在记录中的起始位置char width;//字段宽度char digit;//小数位数char empty[14]; //空字节}FIELD;typedef struct{char name[11];float english;float math; float sum;}STUDENT;int main(){FILE *fp;int i,a,b,j,k,m;char name[11]="0",s[11]="0",name1[11]="0",c;HEAD head;FIELD field[4];STUDENT student[101];scanf("%d",&b);if(b==1){if((fp=fopen("aaa.dic","rb"))==NULL)exit(1);}if(b==2){if((fp=fopen("bbb.dic","rb"))==NULL)exit(1);}if(b==3){if((fp=fopen("ccc.dic","rb"))==NULL)exit(1);}fread(&head,32,1,fp);a=(head.head_size-32-1)/32;//字段长度m=head.rec_num;//m先等于记录的总数for(i=1;i<=a;i++)//找三个字段的位置{fread(&field[0],32,1,fp);if(strcmp(field[0].name,"name")==0){field[1]=field[0];}if(strcmp(field[0].name,"english")==0){field[2]=field[0];}if(strcmp(field[0].name,"math")==0){field[3]=field[0];}}for(j=0;j=0;i--)//是空格时添0,注意数组是要-1的{if(name[i]==32||name[i]=='\0')name[i]='\0';else break;}strcpy(student[j].name,name);//name的复制fseek(fp,head.head_size,0);//跳文件头fseek(fp,head.rec_size*j,1);//跳记录fseek(fp,field[2].begin,1);//跳到english的位置fread(&s,field[2].width,1,fp);//读student[j].english=(float)atof(s);fseek(fp,head.head_size,0);//跳文件头fseek(fp,head.rec_size*j,1);//跳记录fseek(fp,field[3].begin,1);//跳到math的位置fread(&s,field[3].width,1,fp);//读student[j].math=(float)atof(s);student[j].sum=student[j].english+student[j].math;}for(j=0;jstudent[k].sum)//两两交换{student[100]=student[k];student[k]=student[k+1];student[k+1]=student[100];}if(student[k+1].sum==student[k].sum){if(student[k+1].english>student[k].english){student[100]=student[k];student[k]=student[k+1];student[k+1]=student[100];}}}}for(i=0;i
可以在此题基础上增加一些简单的变化,比如增加一门计算机的成绩,计算成绩的平均值even,下面是完整代码:
#include#include#includetypedef struct{char biaozhi;char shijian[3];int zongshu;short long1;short long2;//每条记录的长度char empty[20];}HEAD;typedef struct{char name[10];char empty_c;char leixing;int weizhi;char long3;char weishu;char empty[14]; }FIELD;typedef struct{char name[11];float english;float math;float computer;float sum;//总分float even;//平均分}STUDENT;int main(){FILE *fp;int i,a,b,j,k,m;float score;char name[11]="0",s[11]="0",name1[11]="0",c;HEAD head;FIELD field[5];STUDENT student[101];scanf("%d",&b);if(b==1){if((fp=fopen("aaa.dic","rb"))==NULL)exit(1);}if(b==2){if((fp=fopen("bbb.dic","rb"))==NULL)exit(1);}if(b==3){if((fp=fopen("ccc.dic","rb"))==NULL)exit(1);}fread(&head,32,1,fp);a=(head.long1-32-1)/32;//字段长度m=head.zongshu;for(i=1;i<=a;i++)//找name的位置{fread(&field[0],32,1,fp);if(strcmp(field[0].name,"姓名")==0){field[1]=field[0];}if(strcmp(field[0].name,"英语")==0){field[2]=field[0];}if(strcmp(field[0].name,"数学")==0){field[3]=field[0];}if(strcmp(field[0].name,"计算机")==0){field[4]=field[0];}}for(j=0;j=0;i--)//是空格时添0,注意数组是要-1的{if(name[i]==32||name[i]=='\0')name[i]='\0';else break;}strcpy(student[j].name,name);fseek(fp,head.long1,0);//跳文件头fseek(fp,head.long2*j,1);//跳记录fseek(fp,field[2].weizhi,1);//跳到english的位置fread(&s,field[2].long3,1,fp);//读student[j].english=(float)atof(s);fseek(fp,head.long1,0);//跳文件头fseek(fp,head.long2*j,1);//跳记录fseek(fp,field[3].weizhi,1);//跳到math的位置fread(&s,field[3].long3,1,fp);//读student[j].math=(float)atof(s);fseek(fp,head.long1,0);//跳文件头fseek(fp,head.long2*j,1);//跳记录fseek(fp,field[4].weizhi,1);//跳到computer的位置fread(&s,field[4].long3,1,fp);//读student[j].computer=(float)atof(s);student[j].sum=student[j].english+student[j].math+student[j].computer;student[j].even=student[j].sum/3;}for(j=0;jstudent[k].sum){student[100]=student[k];student[k]=student[k+1];student[k+1]=student[100];}if(student[k+1].sum==student[k].sum){if(student[k+1].english>student[k].english){student[100]=student[k];student[k]=student[k+1];student[k+1]=student[100];}}}}for(i=0;i
【c语言数据库文件读取3】只进行了一下小改动,在以前的代码的基础上改的,有些变量没写成英文(懒得改,都一样)~