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

成绩排名次。某班期末考试科目为数学(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);

}

  • 把这个= {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);
    
}

char name; 改成char name[20];
scanf("%s\n", &T[i].name, 3);中的3去掉,编译咋能通过的呢?