不之茗 发表于 2021-12-29 21:45:23

求大佬调试一下

#include <stdio.h>
#include <stdlib.h>
void DisplayMainMenu();//菜单
void DataInput();//输入数据
void DataQuery();//数据查询
void DataDelete();//数据删除
void DataSort();//数据排序
void QueryById(int );//学号查询
void QueryByRoom(int );//宿舍查询
void QueryMark(int );//成绩查询
void sort1();//综合成绩排序
void sort2();//实际学分排序
void markput();//输出
typedef struct {
        int Id;      
        char name;
        char sex;   
        int room;   
        int tel;      
} StudentInfo;   
typedef struct {
        int Id;
        char courseNo;
        char courseName;
        float a;
        float b;
        float c;
        float d;
        float e;
        float f;
} MarkInfo;
StudentInfo si;   
MarkInfo mi;   //定义的两个结构体

源代码
#include<stdio.h>
#include<stdlib.h>
typedef struct {
        int Id;      
        char name;
        char sex;   
        int room;   
        int tel;      
} StudentInfo;   
typedef struct {
        int Id;
        char courseNo;
        char courseName;
        float a;
        float b;
        float c;
        float d;
        float e;
        float f;
} MarkInfo;
StudentInfo si;   
MarkInfo mi;   
intsp=0;         
intmp=0;         
void ReadFile();
void DisplayMainMenu();
void DataInput();
void DataQuery();
void DataDelete();
void DataSort();
void QueryById(int );
void QueryByRoom(int );
void QueryMark(int );
void sort1();
void sort2();
void markput();
void main()
{
        int x;
        ReadFile();
        while (1)
        {
                DisplayMainMenu();
                scanf("%d",&x);
                switch (x)
                {
                case 1 : DataInput(); break;
                case 2 : DataQuery(); break; //搜索
                case 3 : DataDelete(); break;
                case 4 : DataSort(); break;
                case 5 : exit(0);
                }
        }
}
void ReadFile( )
{
        FILE *fp;//声明fp是指针,用来指向FILE类型的对象
        if((fp = fopen("C:\\Users\\lenovo\\Desktop\\A.txt","r"))==NULL)printf("cant open the file\n");
        while (!feof(fp))//当条件为不是文件尾时均执行后续代码
        {
                fscanf(fp,"%d%s%s%d%d", &si.Id,si.name,&si.sex,&si.room,&si.tel);
                sp++;//fscanf功 能:从一个流中执行格式化输入
        }
        fclose (fp);
        fp = fopen("C:\\Users\\lenovo\\Desktop\\B.txt","r");//r 以可读写方式打开文件,该文件必须存在
        while (!feof(fp))
        {        fscanf(fp,"%d%s%s%f%f%f%f",&mi.Id,mi.courseNo,mi.courseName,&mi.a,&mi.b,&mi.c, &mi.d);
                if (mi.c == -1)
                        mi.e = 0.3*mi.b+0.7*mi.d;
                else
                        mi.e = 0.15*mi.b+0.15*mi.c+0.7*mi.d;
                if ( mi.e >= 90. ) mi.f = mi.a;//计算学分
                else if ( mi .e >= 80. )
                        mi.f = mi.a *0.8;
                else if ( mi.e >= 70. )
                        mi.f = mi.a *0.75;
                else if ( mi.e >= 60. )
                        mi.f = mi.a *0.6;
                else mi.f = 0;
                mp++;
        }
        fclose(fp);
}
void DisplayMainMenu()
{
        printf ("\n 1) 数据录入 \n 2) 数据查询 \n 3) 数据删除 \n 4) 数据排序 \n 5) 程序结束 \n ");
}
void DataInput()
{
        FILE *fp;
        int i;
        printf ("学生的学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩\n");
        while(1)
{scanf("%d%s%s%f%f%f%f",&mi.Id,mi.courseNo,mi.courseName,&mi.a,&mi.b,&mi.c, &mi.d);
        if(mi.Id==-1)break;
        if (mi.c == -1)
                mi.e = 0.3*mi.b+0.7*mi.d;
        else
                mi.e = 0.15*mi.b+0.15*mi.c+0.7*mi.d;
        if ( mi.e >= 90. ) mi.f = mi.a;
        else if ( mi .e >= 80. )
                mi.f = mi.a *0.8;
        else if ( mi.e >= 70. )
                mi.f = mi.a *0.75;
        else if ( mi.e >= 60. )
                mi.f = mi.a *0.6;
        else mi.f = 0;
        mp++;}
        fp = fopen("C:\\Users\\lenovo\\Desktop\\B.txt","r+");
        for(i=0;i<mp;i++)        fprintf(fp,"%d%s%s%f%f%f%f",&mi.Id,mi.courseNo,mi.courseName,&mi.a,&mi.b,&mi.c, &mi.d);
        fclose(fp);
}
void DataQuery()
{
        int x,y,z;
        printf( "\n 1) 学生基本情况查询\n 2) 成绩查询\n");
        scanf("%d",&x);
        if (x == 1) // 查询学生信息
        {
                printf ("1) 按学号查询 2) 按宿舍查询\n");
                scanf("%d",&y);
                if(y == 1 )
                {
                        printf ( " 输入学号\n");
                        scanf ("%d",&z);
                        QueryById(z);
                }
                if(y == 2)
                {
                        printf ( " 输入宿舍号\n");
                        scanf ("%d",&z);
                        QueryByRoom(z);
                }
        }
        if   ( x ==2)// 查询成绩信息
        {
                printf ( " 输入学号\n");
                scanf ("%d",&y);
                QueryMark(y);
        }
}
void DataDelete()
{
        FILE *fp;
        int x;
        int i=0;
        int k,d;
        printf( "输入学号\n");
        scanf( "%d",&x);
        while( si.Id != x) i++;
        if (i<sp-1)
        {
                for ( k=i; k<sp-1; k++)
                {
                        si = si;   
                }
        }
        if ( i<sp) sp--;
        d = 0;
        for (k=0;k<mp;k++)
        {
                if ( mi.Id == x ) d++;
                else mi = mi;
        }
        mp = mp - d;
        fp = fopen("C:\\Users\\lenovo\\Desktop\\B.txt","r+");//r+以读写方式打开文件
        for(i=0;i<mp;i++)        fprintf(fp,"%d%s%s%f%f%f%f",&mi.Id,mi.courseNo,mi.courseName,&mi.a,&mi.b,&mi.c, &mi.d);
}

void QueryById(int x)
{
        int i;
        for (i=0;i<sp;i++)
        {
                if ( si.Id == x )
                {
                        printf ("\n 学号 姓名 性别 宿舍号码 电话号码\n");
                        printf (" %d %s %s %d %d\n",si.Id,si.name,si.sex,si.room,si.tel);
                }
        }
       
}
void QueryByRoom(int x)
{
    int i;
        for (i=0;i<sp;i++)
        {
                if ( si.room == x )
                {
                        printf ("\n 学号 姓名 性别 宿舍号码 电话号码\n");
                        printf (" %d %s %s %d %d\n",si.Id,si.name,si.sex,si.room,si.tel);
                }
        }
}
void QueryMark(int x)
{
    int i=0;
    while(si.Id!=x)
    {
                i++;
    }
    printf("学号:%d姓名:%s\n",si.Id,si.name);
        for (i=0;i<sp;i++)
        {
                if ( si.Id == x )
                {
                        printf ("课程编号: %s课程名称: %s综合成绩: %f实得学分: %f\n",mi.courseNo,mi.courseName,mi.e,mi.f);
                }
        }
}
void DataSort()
{
        int x;
        printf (" 1) 综合成绩排序\n 2} 实际学分排序\n");
        scanf("%d",&x);
        if ( x == 1 ) sort1();
        if ( x == 2 ) sort2();
}
void sort1()
{
        int i,j;
        MarkInfo t;
        for (i=mp-1;i>=1;i--)
        {
                for (j=0;j<i;j++)
                {
                        if (mi.e>mi.e)   
                        {
                                t=mi;
                                mi = mi;
                                mi = t;
                        }
                }
        }
        markput();
}
void sort2()
{
    int i,j;
        MarkInfo t;
        for (i=mp-1;i>=1;i--)
        {
                for (j=0;j<i;j++)
                {
                        if (mi.f>mi.f)   
                        {
                                t=mi;
                                mi = mi;
                                mi = t;
                        }
                }
        }
        markput();
}
void markput()
{
        int i;
        for( i=0;i<mp;i++)
        {
                printf("\n 学号%d课程编号%s课程名称%s学分%f平时成绩%f实验成绩%f卷面成绩%f综合成绩%f实得学分%f\n",mi.Id,mi.courseNo,mi.courseName,mi.a,mi.b,mi.c,mi.d,mi.e,mi.f);
        }
}

大马强 发表于 2022-1-2 23:09:37

看了看应该是文件打开的问题,这个代码是要一个A.txt,文件和一个B.txt文件
你可以将这两文件和你的代码放到同一文件夹下,将打开文件的代码全改成
fopen("./A.txt","r"))
fopen("./B.txt","r"))
应该就没问题了
页: [1]
查看完整版本: 求大佬调试一下