答案一直错误
已知后台所给的数据库文件中都存有若干记录数(不超过100)学生数据,肯定有“name”,“math”,"english"和"computer"这四个字段,有无其他字段未知,另外,字段顺序也未知。请编程序,读出所有学生的math,english和computer成绩,求三科成绩的总分,并按照总分由高到低的顺序输出每个学生的数据。若总分相同,english分数高的排前(分数均保留一位小数)。
注意:有些记录已被删除,被删除记录输入无效记录。
文件头结构的内容是二进制方式存储的,从键盘输入一个数组,打开相应的数据库文件。
键盘输入数字与数据库文件的对应关系
每行一个学生的数据,姓名占10格(左对齐),三科成绩各占4格,总分占5格(除姓名外,其他数据都保留一位小数,右对齐,数据之间用逗号隔开)
Sample Input
Sample Output
zhouyi ,87.0,96.0,92.0,275.0
wangwu ,96.0,90.0,88.0 ,274.0
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char k;
char time[3];
int jlzs;
short zchangdu;
short jlchangdu;
char empty[20];
}
E;
typedef struct{
char name[10];
char k1;
char lx;
int begin;
char kuandu;
char weishu;
char empty1[14];
}
F;
typedef struct{
char sname[15];
float math;
float english;
float computer;
float zongfen;
}
STU;
int main(){
FILE *p;
E e;
F f[5];
STU s[100],t;
int i,j,n,zds;
char flag,fen[10];
scanf("%d",&n);
if(n==1) {
p=fopen("aaa.dic","r");
}
if(n==2) {
p=fopen("bbb.dic","r");
}
if(n==3) {
p=fopen("ccc.dic","r");
}
if(p==NULL) {
exit(1);
}
fread(&e,32,1,p);
fseek(p,e.zchangdu,1);
zds=(e.zchangdu-33)/32;
for(i=0;i<zds;i++) {
fread(f,32,1,p);
if(strcmp(f[0].name,"name")==0) {
f[1]=f[0];
}
if(strcmp(f[0].name,"math")==0) {
f[2]=f[0];
}
if(strcmp(f[0].name,"english")==0) {
f[3]=f[0];
}
if(strcmp(f[0].name,"computer")==0) {
f[4]=f[0];
}
}
int m=0;
for(i=0;i<e.jlzs;i++) {
fread(&flag,1,1,p);
if(flag=='*') {
fseek(p,e.jlchangdu-1,1);
continue;
}
fseek(p,f[1].begin-1,1);
fread(s[m].sname,f[1].kuandu,1,p);
s[m].sname[f[1].kuandu]=0;
for(j=f[1].kuandu-1;j>-1;j--) {
if(s[m].sname[i]==' ') s[m].sname[i]==' ';
else break;
}
fseek(p,f[2].begin-f[1].begin-f[1].kuandu,1);
fread(fen,f[2].kuandu,1,p);
s[m].math=atof(fen);
fseek(p,f[3].begin-f[2].begin-f[2].kuandu,1);
fread(fen,f[3].kuandu,1,p);
s[m].english=atof(fen);
fseek(p,f[4].begin-f[3].begin-f[3].kuandu,1);
fread(fen,f[4].kuandu,1,p);
s[m].computer=atof(fen);
s[m].zongfen=s[m].math+s[m].english+s[m].computer;
m++;
fseek(p,e.jlchangdu-f[4].begin-f[4].kuandu,1);
}
for(j=0;j<m-1;j++) for(i=0;
i<m-1-j;
i++) {
if(s[i].zongfen<s[i+1].zongfen) {
s[i]=t;
s[i]=s[i+1];
s[i+1]=t;
}
if(s[i].zongfen==s[i+1].zongfen) {
if(s[i].english<s[i+1].english) {
s[i]=t;
s[i]=s[i+1];
s[i+1]=t;
}
}
}
for(i=0;i<m;i++) {
printf("%-10s,%4.1f,%4.1f,%4.1f,%5.1f",s[i].sname,s[i].math,s[i].english,s[i].computer,s[i].zongfen);
}
fclose(p);
return 0;
}