快乐打码 2022-12-19 17:23 采纳率: 71.4%
浏览 48
已结题

写了代码,但是感觉运行还有问题,看了半天也不知道哪有问题,要怎么改才完美

成绩排名次。某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 30

struct students {//声明结构体students
    int index;
    int XH;//学生编号
    char name[N];
    float MT;//数学成绩
    float EN;//英语成绩
    float PH;//物理成绩
    float ave;//平均分
    float sum;//总分
    float score[3];
};
int i = 0;

void inputSt(struct students T[N]) { //录入学生信息
    for (int i = 0; i < N; i++) {
        T[N].index = i;
        printf("请输入学号:");
        scanf("%d\n", &T[i].XH);
        printf("请输入名字:");
        scanf("%s\n", &T[i].name);
        printf("请输入数学成绩:");
        scanf("%lf\n", &T[i].score[0]); //最多取3个字符
        printf("请输入英语成绩:");
        scanf("%lf\n", &T[i].score[1]); //最多取3个字符
        printf("请输入物理成绩:");
        scanf("%lf\n", &T[i].score[2]); //最多取3个字符
        if (T[i].score[i] < 0)
            break;
    }
}

void all(struct students T[N]) { //算出每个学生的平均分和总分,
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            T[i].sum += T[i].score[j];
            T[i].ave = T[i].sum / 3;
        }
    }
}

void sort(struct students T[N]) { //按总分成绩由高到低排出成绩的名次
    struct students t;
    for (i = 0; i < N; i++) {
        for (int j = i; j < N; j++) {
            if (T[i].ave < T[j].ave) {
                t = T[i];
                T[i] = T[j];
                T[j] = t;
            }
        }
    }
}

void printAll(struct students T[N]) { //打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
    for (int i = 0; i < N; i++) {
        printf("|%d", T[i].index);
        printf("|%d", T[i].XH);
        printf("|%d", T[i].name);
        for (int j = 0; j < 3; j++) {
            printf("|%.2f", T[i].score[j]);
        }
    }
    printf("|%0.2f", T[i].sum);
    printf("|%0.2f", T[i].ave);
    printf("|\n");
}

void searchp(struct students T[N]) { //任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
    int i = 0, j = 0;
    int x;
    printf("请输入学生的学号:");
    scanf("%d", &x);
    for (int i = 0; i < j - 1; i++) {
        if (T[i].XH == x) {
            printf("position= %d,score = %d\n", i, T[i].score[i]);
            break;
        }
    }
    printf("Not found!\n");
}

int main() {
    struct students T[N];
    inputSt(T);
    sort(T);
    all(T);
    printAll(T);

}

  • 写回答

2条回答 默认 最新

  • Huazie 全栈领域优质创作者 2022-12-19 17:29
    关注
    • 把这个= {0.0.0} 去掉

      img

    • 先input呀,再排序啊

    img

    • 结构体中,定义char数组,而不是 char

    img

    • scanf没有这个用法,第3个参数去掉

    img

    修改了一版,参考如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define N 2
    
    struct students {//声明结构体students
        int index;
        int XH;//学生编号
        char name[30];
        float MT;//数学成绩
        float EN;//英语成绩
        float PH;//物理成绩
        float ave;//平均分
        float sum;//总分
        float score[3] ;
    };
    int i = 0;
    
    void inputSt(struct students T[N]) { //录入学生信息
        for (int i = 0; i < N; i++) {
            T[i].index = i;
            printf("请输入学号:");
            scanf("%d", &(T[i].XH));
            getchar();
            printf("请输入名字:");
            scanf("%s", T[i].name); //最多取3个字符
            printf("请输入数学成绩:");
            scanf("%f", &(T[i].score[0])); //最多取3个字符
            printf("请输入英语成绩:");
            scanf("%f", &(T[i].score[1])); //最多取3个字符
            printf("请输入物理成绩:");
            scanf("%f", &(T[i].score[2])); //最多取3个字符
        }
    }
    
    void all(struct students T[N]) { //算出每个学生的平均分和总分,
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                T[i].sum += T[i].score[j];
            }
            T[i].ave = T[i].sum / 3;
        }
    }
    
    void sort(struct students T[N]) { //按总分成绩由高到低排出成绩的名次
        struct students t;
        for (int i = 0; i < N - 1; i++) {
            for (int j = 0; j < N - 1 - i; j++) {
                if (T[j + 1].sum < T[j].sum) {
                    t = T[j];
                    T[j] = T[j + 1];
                    T[j + 1] = t;
                }
            }
        }
    }
    
    void printAll(struct students T[N]) { //打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
        for (int i = 0; i < N; i++) {
            printf("|%d", T[i].index);
            printf("|%d", T[i].XH);
            printf("|%s", T[i].name);
            for (int j = 0; j < 3; j++) {
                printf("|%.2f", T[i].score[j]);
            }
            printf("|%0.2f", T[i].sum);
            printf("|%0.2f", T[i].ave);
            printf("|\n");
        }
    }
    
    void searchp(struct students T[N]) { //任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
        int i = 0, j;
        int x;
        printf("请输入学生的学号:");
        scanf("%d", &x);
        for (int i = 0; i < j - 1; i++) {
            if (T[i].XH == x) {
                printf("position= %d,score = %d\n", i, T[i].score[i]);
                break;
            }
        }
        printf("Not found!\n");
    }
    
    int main() {
        struct students T[N];
        inputSt(T);
        sort(T);
        all(T);
        printAll(T);
        
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 修改了问题 12月19日
  • 创建了问题 12月19日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。