m0_73902762 2023-04-19 15:03 采纳率: 100%
浏览 49
已结题

答案一直错误,可能是指针移动有问题,求指正

答案一直错误
已知后台所给的数据库文件中都存有若干记录数(不超过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;
}


  • 写回答

2条回答 默认 最新

  • 赵4老师 2023-04-19 18:03
    关注

    不要把
    fopen("...","...");fscanf,fprintf,fgets,fgetc,fputc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

    fopen("...","...b");fseek,ftell,fread,fwrite,fscanf,fprintf,fgets,fgetc,fputc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
    弄混了
    推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月19日

悬赏问题

  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?
  • ¥15 QTOF MSE数据分析
  • ¥15 平板录音机录音问题解决