为什么程序没有运行完就直接结束了啊

这个程序在“请输入课程”后就直接结束了程序

运行结果:

img

哪位同学看到后解答一下
万分感谢!!

#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#define NULL 0
#define len sizeof(struct student)
#define LEN sizeof(struct student)
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf%-12.1f\n"
#define DATA stu[i].no,stu[i].name,stu[i].grade[j].name,stu[i].grade[j].score
struct course
{
    char name[30];
    double score;
}*cou; 
struct student
{
    int no;//学号
    char name[20];//姓名 
    struct course *grade;
}*stu;

int n, m;
char courseName[30],studentName[30];


void enter(){//登录界面
        system("color F5");
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**             学生成绩管理系统             **\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**********************************************\n"); 
        printf("\t\t\t\t**************制作者******学号**************\n);
        printf("\t\t\t\t**********************************************\n");                                 
}

void welcome(){
        
        printf("\t\t\t\t**********************************************\n"); 
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**               欢迎进入!                 **\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**---------------功能菜单-------------------**\n");
        printf("\t\t\t\t**             增加学生信息 ------------1   **\n");
        printf("\t\t\t\t**             删除学生信息 ------------2   **\n");
        printf("\t\t\t\t**             修改学生信息 ------------3   **\n");
        printf("\t\t\t\t**             查询学生信息 ------------4   **\n");
        printf("\t\t\t\t**             输出成绩排名 ------------5   **\n");
        printf("\t\t\t\t**             退出管理系统 ------------0   **\n");
        printf("\t\t\t\t**********************************************\n");
        printf("请输入你想要进行的操作(数字): ");
} 

void newput(struct student *st)   
{
    int i,j;
    printf("请输入学生数及课程数:");
    scanf("%d %d",&n,&m);
    printf("请输入课程名称:");
    for(j=0;j<m;j++);
    {
        gets(cou[j].name);
        scanf("\n");
    }
    printf("\t姓名\t学号\t");
    for(j=0;j<m;j++)
    {
        puts(cou[j].name);
        printf("\t");
     } 
   for(i=0;i<n;i++)
   {
    scanf("%s%d",stu[i].name,&stu[i].no);
    for(j=0;j<m;j++)
    {
        scanf("%f",&stu[i].grade[j].score);
    }
   }
}
void find(struct student *stu)
{
    int op;
    int i=0,j,k,h,g=0,l=0;
     int result=1;
    int  search_no;
    char search_name[20] = { 0 };
while(1)    {
printf("_________________________________________________________________\n");
    printf("\n\t\t\t1、按学号查找\n");
    printf("\t\t\t2、按姓名查找\n");
printf("\t\t\t退出当前菜单请输入-1\n");
    printf("______________________________________________________________\n");
    printf("\n\t\t\t请选择相应的选项:");
    scanf("%d",&op);
    system("cls");
 if(op==-1)
     return welcome() ;
if (op==1)
    {
        printf("\n\t\t请输入要查找的学号:");
        scanf("%d",&search_no);
        if(search_no<0)
            {printf("输入的学号有误,请重新输入");
        scanf("%d",&search_no);}
        else{
        for (i=0;i<n;i++)
        {
            if(stu[i].no==search_no)
            break;
        }

        if (i >= n)
        {   system("cls");
        printf("\n\t\t未查询到相关信息!");
        
    }

    else{
    system("cls");
    printf("_____________________________________________________________________\n");
    printf("\n\t\t学号");
    printf("\t\t姓名");
for(j=0;j<m;j++)
    {printf("\t\t%s", stu[i].grade[j].name);
}
    printf("_______________________________________________________________________\n");

printf("\n\t\t%ld", stu[i].no);
    printf("\t\t%s", stu[i].name);
for(k=0;k<m;k++)
{printf("\t\t%d",stu[i].grade[k].score);}
    printf("________________________________________________________________________\n");
}
    }
}
    if (op==2)
    {
        printf("\n\t\t请输入要查找的姓名:");
        scanf("%s",search_name);
        while ( l < n)
        {   for(h=0;h<20;h++)
            {if(search_name[h]==stu[l].name[h])
        g++;
        if(search_name[h]!=stu[l].name[h])break;
        }
        if(g!=h)
            l++;}

    if (l >= n)
    {   system("cls");
        printf("\n\t\t未查询到相关信息!");
        
    }

    else{
system("cls");
    printf("_____________________________________________________________________\n");
    printf("\n\t\t学号");
    printf("\t\t姓名");
for(j=0;j<m;j++)
    {printf("\t\t%s", stu[l].grade[j].name);
}
    printf("_______________________________________________________________________\n");

printf("\n\t\t%ld", stu[l].no);
    printf("\t\t%s", stu[l].name);
for(k=0;k<m;k++)
{printf("\t\t%d",stu[l].grade[k].score);}
    printf("________________________________________________________________________\n");
}
    }
}
}



void del(struct student *stu)
{
    int i,num,j=0;
    printf("请输入要删除的学生的学号");
    scanf("%d",&num);
    for(i=0;i<n;i++)
    {
        if(stu[i].no==num)
            j=i;
    }
    if(j==0) printf("没有该学生的信息!");
    else for(i=j;i<n-1;i++)
        stu[i]=stu[i+1];
    printf("您已删除成功!\n");
}


void average(struct course *cou,struct student *stu)
{
    int i,j;
    double sum=0,ave;
    for(i=0;i<m;i++)
    {
        printf("%s\n",cou[i].name);
        for(j=0;j<n;j++)
        {   
            sum=sum+stu[i].grade[j].score;
        }
        ave=sum/j;
        printf("%f",ave);
    }
}

void allgrade(struct course *cou,struct student *stu)
{
    int i,j,k,l;
    double sum,t;
    double ave[]={0};
    printf("姓名     学号     平均成绩"); 
    for(i=0;i<n;i++)
    {
        sum=0; 
        for(j=0;j<m;j++)
        {
            printf("     %s",cou[j].name);
            sum=sum+stu[i].grade[j].score;
        }
        printf("\n");
        ave[i]=sum/j;
    }
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(l=i+1;l<n;l++)
        if(ave[k]<ave[l])  k=l;
        if(k!=i)
        {
            t=ave[i];ave[i]=ave[k];ave[k]=t;
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%s     %d     %f     ",stu[i].name,stu[i].no,ave[i]);
        for(j=0;j<m;j++)
        printf("%f     ",stu[i].grade[j]);
        printf("\n");   
    }
}

void sele(struct student *stu,struct course *cou)
{
    int i,j,max;
    for(i=0;i<m;i++)
    {
        max=0;
        for(j=0;j<n;j++)
        {
            if(stu[j].grade[i].score > stu[max].grade[i].score)
            max=j;
        }
        printf("%s\t%s\t%d\t%d\n",cou[i],stu[max].name,stu[max].no,stu[max].grade[i]);
    }
 } 

void print()
{    int x;
    void sele(struct student *stu,struct course *cou);
    void average(struct course *cou,struct student *stu);
    void allgrade(struct course *cou,struct student *stu);
    printf("\t***********************************************************\n");
    printf("\t                 1.单科最高成绩打印                        \n");
    printf("\t                 2.单科平均成绩打印                        \n");
    printf("\t                 3.所有学生成绩打印                        \n"); 
    printf("\t***********************************************************\n");
    printf("请输入所选功能序号:");
    scanf("%d",&x);
    switch(x)
    {
        case 1:sele(&stu[n],&cou[m]);break;
        case 2:average(&cou[m],&stu[n]);break;
        case 3:allgrade(&cou[m],&stu[n]);break;
    }
}


void show()
 {
 FILE *fp;
   int i,j,k=0;
   fp=fopen("data1.txt","rb");
   while(!feof(fp))
   {
    if(fread(&stu[m] ,LEN,1,fp)==1)
     k++;
    }
    fclose(fp);
    printf("学号    姓名     成绩\t\n");
    for(i=0;i<k;i++)
    {for(j=0;j<m;j++)
    printf(FORMAT,DATA);
    }
}
void modify(struct course *cou,struct student *stu)
{
      FILE *fp;
      int i=0,j=0,m=0,snum;
      if((fp=fopen("data1.txt","r+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
      }
      while(!feof(fp))
          if(fread(&stu[m] ,LEN,1,fp)==1)
            m++;
      if(m==0)
      {
          printf("文件中没有记录!\n");
        fclose(fp);
          return;
      }
      show();
      printf("请输入要修改的学生学号: ");
      scanf("%d",&snum);
      for(i=0;i<m;i++)
          if(snum==stu[i].no)
          {
              printf("找到了这名学生,可以修改他的信息!\n");
              printf("姓名:");
              scanf("%s",stu[i].name);                                   
            printf("成绩:");
              scanf("%lf",&stu[i].grade);
              printf("修改成功!");

            if((fp=fopen("data1.txt","wb"))==NULL)
             {
                 printf("can not open\n");
                 return;
            }
              for(j=0;j<m;j++)
              if(fwrite(&stu[j] ,LEN,1,fp)!=1)
               {
                   printf("can not save!");
                   getchar();
            }
             fclose(fp);
             break;
          }
          if(i==m)
              printf("没有找到这名学生!\n");
}
 
int main()//主函数 
{  
    int oip,choice;
    enter();
    while(2){
            welcome();
            scanf("%d",&choice);
            switch (choice){
            case 1:newput(&stu[n]);break;
            case 2:del(&stu[n]);break;
            case 3:modify(&cou[m],&stu[n]);break;
            case 4:find(&stu[n]); break;
            case 5:print();break;
        }
        scanf("%d",&oip);
    if(oip==0) break;
}
    
    return 0;
}

img


可以用getchar()吃换行符 不是scanf

你那函数写了这个scanf("\n");

newput输入课程名称前加fflush(stdin);清空缓存

请输入课程名称下面的那个for后面的分号去掉


#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#define NULL 0
#define len sizeof(struct student)
#define LEN sizeof(struct student)
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf%-12.1f\n"
#define DATA stu[i].no,stu[i].name,stu[i].grade[j].name,stu[i].grade[j].score
struct course
{
    char name[30];
    double score;
}cou[50]; 
struct student
{
    int no;//学号
    char name[20];//姓名 
    struct course *grade;
}stu[50];
 
int n, m;
char courseName[30],studentName[30];
 
 
void enter(){//登录界面
        system("color F5");
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**             学生成绩管理系统             **\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**********************************************\n"); 
        printf("\t\t\t\t**************制作者******学号**************\n");
        printf("\t\t\t\t**********************************************\n");                                 
}
void welcome(){
        
        printf("\t\t\t\t**********************************************\n"); 
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**               欢迎进入!                 **\n");
        printf("\t\t\t\t**                                          **\n");
        printf("\t\t\t\t**********************************************\n");
        printf("\t\t\t\t**---------------功能菜单-------------------**\n");
        printf("\t\t\t\t**             增加学生信息 ------------1   **\n");
        printf("\t\t\t\t**             删除学生信息 ------------2   **\n");
        printf("\t\t\t\t**             修改学生信息 ------------3   **\n");
        printf("\t\t\t\t**             查询学生信息 ------------4   **\n");
        printf("\t\t\t\t**             输出成绩排名 ------------5   **\n");
        printf("\t\t\t\t**             退出管理系统 ------------0   **\n");
        printf("\t\t\t\t**********************************************\n");
        printf("请输入你想要进行的操作(数字): ");
} 
void newput(struct student *st)   
{
    int i,j;
    printf("请输入学生数及课程数:");
    scanf("%d %d",&n,&m);
    printf("请输入课程名称:");
    for(j=0;j<m;j++)
    {
        fflush(stdin);
        gets(cou[j].name);
        fflush(stdin);
    }
    printf("\t姓名\t学号\t");
    for(j=0;j<m;j++)
    {
        puts(cou[j].name);
        printf("\t");
     } 
   for(i=0;i<n;i++)
   {
    scanf("%s%d",stu[i].name,&stu[i].no);
    for(j=0;j<m;j++)
    {
        scanf("%f",&stu[i].grade[j].score);
    }
   }
}
void find(struct student *stu)
{
    int op;
    int i=0,j,k,h,g=0,l=0;
     int result=1;
    int  search_no;
    char search_name[20] = { 0 };
while(1)    {
printf("_________________________________________________________________\n");
    printf("\n\t\t\t1、按学号查找\n");
    printf("\t\t\t2、按姓名查找\n");
printf("\t\t\t退出当前菜单请输入-1\n");
    printf("______________________________________________________________\n");
    printf("\n\t\t\t请选择相应的选项:");
    scanf("%d",&op);
    system("cls");
 if(op==-1)
     return welcome() ;
if (op==1)
    {
        printf("\n\t\t请输入要查找的学号:");
        scanf("%d",&search_no);
        if(search_no<0)
            {printf("输入的学号有误,请重新输入");
        scanf("%d",&search_no);}
        else{
        for (i=0;i<n;i++)
        {
            if(stu[i].no==search_no)
            break;
        }
        if (i >= n)
        {   system("cls");
        printf("\n\t\t未查询到相关信息!");
        
    }
    else{
    system("cls");
    printf("_____________________________________________________________________\n");
    printf("\n\t\t学号");
    printf("\t\t姓名");
for(j=0;j<m;j++)
    {printf("\t\t%s", stu[i].grade[j].name);
}
    printf("_______________________________________________________________________\n");
printf("\n\t\t%ld", stu[i].no);
    printf("\t\t%s", stu[i].name);
for(k=0;k<m;k++)
{printf("\t\t%d",stu[i].grade[k].score);}
    printf("________________________________________________________________________\n");
}
    }
}
    if (op==2)
    {
        printf("\n\t\t请输入要查找的姓名:");
        scanf("%s",search_name);
        while ( l < n)
        {   for(h=0;h<20;h++)
            {if(search_name[h]==stu[l].name[h])
        g++;
        if(search_name[h]!=stu[l].name[h])break;
        }
        if(g!=h)
            l++;}
    if (l >= n)
    {   system("cls");
        printf("\n\t\t未查询到相关信息!");
        
    }
    else{
system("cls");
    printf("_____________________________________________________________________\n");
    printf("\n\t\t学号");
    printf("\t\t姓名");
for(j=0;j<m;j++)
    {printf("\t\t%s", stu[l].grade[j].name);
}
    printf("_______________________________________________________________________\n");
printf("\n\t\t%ld", stu[l].no);
    printf("\t\t%s", stu[l].name);
for(k=0;k<m;k++)
{printf("\t\t%d",stu[l].grade[k].score);}
    printf("________________________________________________________________________\n");
}
    }
}
}
void del(struct student *stu)
{
    int i,num,j=0;
    printf("请输入要删除的学生的学号");
    scanf("%d",&num);
    for(i=0;i<n;i++)
    {
        if(stu[i].no==num)
            j=i;
    }
    if(j==0) printf("没有该学生的信息!");
    else for(i=j;i<n-1;i++)
        stu[i]=stu[i+1];
    printf("您已删除成功!\n");
}
void average(struct course *cou,struct student *stu)
{
    int i,j;
    double sum=0,ave;
    for(i=0;i<m;i++)
    {
        printf("%s\n",cou[i].name);
        for(j=0;j<n;j++)
        {   
            sum=sum+stu[i].grade[j].score;
        }
        ave=sum/j;
        printf("%f",ave);
    }
}
void allgrade(struct course *cou,struct student *stu)
{
    int i,j,k,l;
    double sum,t;
    double ave[]={0};
    printf("姓名     学号     平均成绩"); 
    for(i=0;i<n;i++)
    {
        sum=0; 
        for(j=0;j<m;j++)
        {
            printf("     %s",cou[j].name);
            sum=sum+stu[i].grade[j].score;
        }
        printf("\n");
        ave[i]=sum/j;
    }
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(l=i+1;l<n;l++)
        if(ave[k]<ave[l])  k=l;
        if(k!=i)
        {
            t=ave[i];ave[i]=ave[k];ave[k]=t;
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%s     %d     %f     ",stu[i].name,stu[i].no,ave[i]);
        for(j=0;j<m;j++)
        printf("%f     ",stu[i].grade[j]);
        printf("\n");   
    }
}
void sele(struct student *stu,struct course *cou)
{
    int i,j,max;
    for(i=0;i<m;i++)
    {
        max=0;
        for(j=0;j<n;j++)
        {
            if(stu[j].grade[i].score > stu[max].grade[i].score)
            max=j;
        }
        printf("%s\t%s\t%d\t%d\n",cou[i],stu[max].name,stu[max].no,stu[max].grade[i]);
    }
 } 
void print()
{    int x;
    void sele(struct student *stu,struct course *cou);
    void average(struct course *cou,struct student *stu);
    void allgrade(struct course *cou,struct student *stu);
    printf("\t***********************************************************\n");
    printf("\t                 1.单科最高成绩打印                        \n");
    printf("\t                 2.单科平均成绩打印                        \n");
    printf("\t                 3.所有学生成绩打印                        \n"); 
    printf("\t***********************************************************\n");
    printf("请输入所选功能序号:");
    scanf("%d",&x);
    switch(x)
    {
        case 1:sele(&stu[n],&cou[m]);break;
        case 2:average(&cou[m],&stu[n]);break;
        case 3:allgrade(&cou[m],&stu[n]);break;
    }
}
void show()
 {
 FILE *fp;
   int i,j,k=0;
   fp=fopen("data1.txt","rb");
   while(!feof(fp))
   {
    if(fread(&stu[m] ,LEN,1,fp)==1)
     k++;
    }
    fclose(fp);
    printf("学号    姓名     成绩\t\n");
    for(i=0;i<k;i++)
    {for(j=0;j<m;j++)
    printf(FORMAT,DATA);
    }
}
void modify(struct course *cou,struct student *stu)
{
      FILE *fp;
      int i=0,j=0,m=0,snum;
      if((fp=fopen("data1.txt","r+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
      }
      while(!feof(fp))
          if(fread(&stu[m] ,LEN,1,fp)==1)
            m++;
      if(m==0)
      {
          printf("文件中没有记录!\n");
        fclose(fp);
          return;
      }
      show();
      printf("请输入要修改的学生学号: ");
      scanf("%d",&snum);
      for(i=0;i<m;i++)
          if(snum==stu[i].no)
          {
              printf("找到了这名学生,可以修改他的信息!\n");
              printf("姓名:");
              scanf("%s",stu[i].name);                                   
            printf("成绩:");
              scanf("%lf",&stu[i].grade);
              printf("修改成功!");
 
            if((fp=fopen("data1.txt","wb"))==NULL)
             {
                 printf("can not open\n");
                 return;
            }
              for(j=0;j<m;j++)
              if(fwrite(&stu[j] ,LEN,1,fp)!=1)
               {
                   printf("can not save!");
                   getchar();
            }
             fclose(fp);
             break;
          }
          if(i==m)
              printf("没有找到这名学生!\n");
}
 
int main()//主函数 
{  
    int oip,choice;
    enter();
    while(2){
            welcome();
            scanf("%d",&choice);
            switch (choice){
            case 1:newput(&stu[n]);break;
            case 2:del(&stu[n]);break;
            case 3:modify(&cou[m],&stu[n]);break;
            case 4:find(&stu[n]); break;
            case 5:print();break;
        }
        scanf("%d",&oip);
    if(oip==0) break;
}
    
    return 0;
}