c语言程序无法正常运行

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct SUBJECT{

char clas[20];
float num;
struct SUBJECT *next;

}Sub;

typedef struct student{

long id;
char name[20];
Sub *clas;
float Snum;

}stu;

void input(int n,int N,stu student[]);//录入成绩、学号和姓名
float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]);//计算每个学生的总分和平均分
float Sadd(stu p[],int n,int N,float Saver[6]);//计算每门课程的总分和平均分

int main(){
int n,f,N;
stu student[n];
float Eaver[30],Saver[6],Esum[30];
printf("请输入学生人数:");
scanf("%d",&n);
printf("请输入科目的数量:");
scanf("%d",&N);
printf(" 1.input recorf\n 2.caculate total and Eaverage score of every course\n 3.caculate total and Eaverage score of every student\n ");

do{
printf("请选择操作:");
scanf("%d",&f);
switch(f){
case 1:input(n,N,student);break;
case 2:Eadd(student,Esum,n,N,Eaver);break;
case 3:Sadd(student,n,N,Saver);break;

    default:break;
    }        

}while(f!=0);
return 0;
}

void input(int n,int N,stu p[]){
char a;
Sub *c;
for(int i=0;i<n;i++){

    printf("第%d个同学的学号:",i+1); 
    scanf("%ld",&p[i].id);
    printf("姓名:");
    scanf(" %s",p[i].name);

    for(int j=0;j<N;j++){
        
        c=(Sub *) malloc (N * sizeof(Sub));
        printf("当前所录入的科目:"); 
        scanf("%s",c->clas);
        printf("请输入%s同学的%s的成绩:",p[i].name,c->clas);
        scanf("%f",&c->num);
        a=getchar();
        
        if(p[i].clas==NULL){
            p[i].clas=c;
        } 
        
        else{
            c->next=p[i].clas;
            p[i].clas=c;    
        }
                    }
}
free(c);

}

float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]){
stu *q=p;
for(int i=0;i<N;i++){
for(int j=0;j<n;j++){

        Esum[i]=q[i].clas->num;
        q[i].clas=q[i].clas->next;
    }        
}

for(int i=0;i<n;i++){
    
    Eaver[i]=Esum[i]/(float)N;
}
printf("计算完成\n");

}

float Sadd(stu p[],int n,int N,float Saver[6]){
stu *q=p;
for(int i=0;i<n;i++){
for(int j=0;j<N;j++){

        p[i].Snum += q[i].clas->num;
        q[i].clas = q[i].clas->next;
    }
}

for(int i=0;i<N;i++){
    
    Saver[i]=p[i].Snum/(float)n;
}

printf("计算完成\n");

}

img

这个程序单独执行选项2和选项3时可以执行,但是2和3没法都执行

我跑了一遍,只发现了int n,f,N;其中n没有初始化

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct SUBJECT{
    char clas[20];
    float num;
    struct SUBJECT *next;
}Sub;

typedef struct student{
    long id;
    char name[20];
    Sub *clas;
    float Snum;
}stu;

void input(int n,int N,stu student[]);//录入成绩、学号和姓名
float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]);//计算每个学生的总分和平均分
float Sadd(stu p[],int n,int N,float Saver[6]);//计算每门课程的总分和平均分

int main(){
    int n = 10,f,N;
    stu student[n];
    float Eaver[30],Saver[6],Esum[30];
    printf("请输入学生人数:");
    scanf("%d",&n);
    printf("请输入科目的数量:");
    scanf("%d",&N);
    printf(" 1.input recorf\n 2.caculate total and Eaverage score of every course\n 3.caculate total and Eaverage score of every student\n ");
    
    do{
        printf("请选择操作:");
        scanf("%d",&f);
        switch(f){
            case 1:
                input(n,N,student);
                break;
            case 2:
                Eadd(student,Esum,n,N,Eaver);
                break;
            case 3:
                Sadd(student,n,N,Saver);
                break;
            default:
                break;
        }        
    }while(f!=0);
    return 0;
}

void input(int n,int N,stu p[]){
    char a;
    Sub *c;
    for(int i=0;i<n;i++){
        printf("第%d个同学的学号:",i+1); 
        scanf("%ld",&p[i].id);
        printf("姓名:");
        scanf(" %s",p[i].name);
        for(int j=0;j<N;j++){
            c=(Sub *) malloc (N * sizeof(Sub));
            printf("当前所录入的科目:"); 
            scanf("%s",c->clas);
            printf("请输入%s同学的%s的成绩:",p[i].name,c->clas);
            scanf("%f",&c->num);
            a=getchar();
            
            if(p[i].clas==NULL){
                p[i].clas=c;
            } 
            else{
                c->next=p[i].clas;
                p[i].clas=c;    
            }
        }
    }
    free(c);
}

float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]){
    stu *q=p;
    for(int i=0;i<N;i++){
        for(int j=0;j<n;j++){
            Esum[i]=q[i].clas->num;
            q[i].clas=q[i].clas->next;
        }        
    }
    for(int i=0;i<n;i++){
        
        Eaver[i]=Esum[i]/(float)N;
    }
    printf("计算完成\n");
}

float Sadd(stu p[],int n,int N,float Saver[6]){
    stu *q=p;
    for(int i=0;i<n;i++){
        for(int j=0;j<N;j++){
            p[i].Snum += q[i].clas->num;
            q[i].clas = q[i].clas->next;
        }
    }
    for(int i=0;i<N;i++){
        Saver[i]=p[i].Snum/(float)n;
    }
    printf("计算完成\n");
}

img

修改如下,供参考:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct SUBJECT {
    char   cla[20];
    float  num;
    struct SUBJECT* next;
}Sub;

typedef struct student {
    long  id;
    char  name[20];
    Sub*  clas;
    float Snum;
}stu;

void  input(int n, int N, stu* student, float Esum[]); // 录入成绩、学号和姓名
void  Eadd(float Esum[], int n, int N, float Eaver[]); //计算每门课程的总分和平均分
void  Sadd(stu p[], int n, int N, float Saver[]); //计算每个学生的总分和平均分
void  print_Stuadd(stu p[], int n, int N, float Saver[], float Esum[], float Eaver[]);

int main() {
    int n, f, N;
    stu student[50]; //stu student[n];
    float Eaver[30] = { 0 }, Saver[30] = { 0 }, Esum[30] = {0};
    printf("请输入学生人数:");
    scanf("%d", &n);
    printf("请输入科目的数量:");
    scanf("%d", &N);
    printf(" 1.input recorf\n" 
            " 2.caculate total and Eaverage score of every course\n "
            "3.caculate total and Eaverage score of every student\n "
            "4.printf\n");

    do {
        printf("请选择操作:");
        scanf("%d", &f);
        switch (f) {
        case 1:input(n, N, student,Esum);  break;
        case 2:Eadd(Esum, n, N, Eaver);    break;
        case 3:Sadd(student, n, N, Saver); break;
        case 4:print_Stuadd(student, n, N, Saver, Esum, Eaver);
               break;
        default:break;
        }
    } while (f != 0);
    return 0;
}

void input(int n, int N, stu* p, float Esum[]) {
    //char a;
    Sub* c;
    for (int i = 0; i < n; i++) {

        printf("第%d个同学的学号:", i + 1);
        scanf("%ld", &p[i].id);
        printf("姓名:");
        scanf(" %s", p[i].name);
        p[i].Snum = 0;      //修改
        p[i].clas = NULL;   //修改
        for (int j = 0; j < N; j++) {

            c = (Sub*)malloc(sizeof(Sub));//修改
            //c = (Sub*)malloc(N * sizeof(Sub));
            c->next = NULL;           //修改
            printf("当前所录入的科目:");
            scanf("%s", c->cla);
            printf("请输入%s同学的%s的成绩:", p[i].name, c->cla);
            scanf("%f", &c->num);
            Esum[j] += c->num;        //修改 
            //getchar();  //a = getchar();

            //if (p[i].clas == NULL) {
            //    p[i].clas = c;
            //}

            //else {
            c->next = p[i].clas;
            p[i].clas = c;
            //}
        }
    }
    //free(c);
}

void  Eadd(float Esum[], int n, int N, float Eaver[]) {
//float Eadd(stu p[], float Esum[30], int n, int N, float Eaver[30]) {
    //Sub* q;//stu* q = p;
    //for (int i = 0; i < N; i++){
    //    for (int j = 0; j < n; j++)
    //        q = p[j].clas;
    //        Esum[i] += q->num; //Esum[i] = q[i].clas->num;
                               //q[i].clas = q[i].clas->next;
    //}
    for (int i = 0; i < N; i++) {

        Eaver[i] = Esum[i] / (float)n;
    }
    printf("计算完成\n");
    //return 1;
}

void  Sadd(stu p[], int n, int N, float Saver[]) {
    Sub* q;   //stu* q = p;
    for (int i = 0; i < n; i++) {
        for (q = p[i].clas; q != NULL; q = q->next) { //for (int j = 0; j < N; j++)

            p[i].Snum += q->num; 
            //q[i].clas = q[i].clas->next;
        }
    }

    for (int i = 0; i < n; i++) {

        Saver[i] = p[i].Snum / (float)N;
    }
    printf("计算完成\n");
    //return 1;
}

void print_Stuadd(stu p[], int n, int N, float Saver[], float Esum[], float Eaver[])
{
    Sub* q; 
    for (int i = 0; i < n; i++) {
        printf("id:%ld name:%s ", p[i].id, p[i].name);
        for (q = p[i].clas; q != NULL; q = q->next) { 

            printf("%s:%.2f  ", q->cla, q->num);
        }
        printf("sum:%.2f avg:%.2f\n", p[i].Snum, Saver[i]);
    }
    for (int i = N-1; i >= 0; i--)
        printf("Esum:%.2f Eavg:%.2f  ", Esum[i], Eaver[i]);
    printf("\n");
}

img