首页 >> 大全

c语言数据库文件读取3

2023-12-23 大全 25 作者:考证青年

数据库文件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++读取数据库_c语言读取当前目录下文件_

lisi 88.0 89.0 177.0

Input

输入1或2或3

按总分从高到低输出所有学生的数据

如:

90.5 87.0 177.5

lisi 88.0 89.0 177.0

Input

90.5 87.0 177.5

lisi 88.0 89.0 177.0

Code 1 here:

#include
#include
#include
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=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
#include
typedef 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

只进行了一下小改动,在以前的代码的基础上改的,有些变量没写成英文(懒得改,都一样)~

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了