Description
数据库文件aaa.dic、bbb.dic、ccc.dic中都存有若干(不超过100个)学生的数据,已知三个文件中都有name、english、math三个字段。
请编程序,从键盘输入1或2或3以打开aaa.dic或bbb.dic或ccc.dic,读出所有学生的name和english、math成绩并按总分由高到低的顺序输出每个学生的数据。若总分相同,english分数高的排前。
注意:有些记录已被删除,被删记录属于无效记录
输出格式:每行一个学生的数据,姓名占10格(左对齐),两科成绩各占4格,总分占5格(除姓名外,其他数据都保留一位小数,右对齐,后面三个数据之间用一个空格隔开)
如:
zhangsan 90.5 87.0 177.5
lisi 88.0 89.0 177.0
Input
输入1或2或3
Output
按总分从高到低输出所有学生的数据
如:
zhangsan 90.5 87.0 177.5
lisi 88.0 89.0 177.0
Sample Input
1
Sample Output
zhangsan 90.5 87.0 177.5
lisi 88.0 89.0 177.0
Code 1 here:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef 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_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&_num;j++)//跳记录,怎么结束呢,上面有了{fseek(fp,head.head_size,0);//跳整个文件头fseek(_size*j,1);//跳记录fread(&c,1,1,fp);//看是否逻辑删除if(c==42){m=m-1;//删了几个字段,m减少几个continue;//注意跳过的结构体没有存值,里面的变量全为0}fseek(fp,-1,1);//再跳回去,便于继续找字段的位置fseek(fp,field[1].begin,1);//跳到name的位置fread(&name,field[1].width,1,fp);for(i=field[1].width-1;i>=0;i--)//是空格时添0,注意数组是要-1的{if(name[i]==32||name[i]=='