ik09. 2024-07-01 22:23 采纳率: 50%
浏览 2

C语言学生成绩管理一直运行不了,如何解决?

C语言学生成绩管理程序,程序一直运行不出来,希望有人能帮忙解决下


#include<stdio.h>    
#include<stdlib.h>    
#include<string.h> 
#define LEN 20 
#define N 50  
int M = 0;
void insert();  //录入
void modify();  //修改
void search(); 
void menu();
void save();
void sort();
struct student{
    long int Id;  //学号
    char Name[LEN+1];    //姓名
    char Sex[LEN+1];    //性别
    int  Age;     //年龄
    int  BanJi;      //班级
    float chinese,math,english;
  
}stu[N];
int main()
{
     
    while (1)
    {
        menu();
    }
    system("pause");
    return 0;
  
}
void menu()//菜单函数
{
  
    int num;
    printf("\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*                 0.退出系统                       *\n");
    printf("\t\t\t\t——————————————————————————\n");
    printf("\t\t\t\t请输入所选功能:");
    scanf("%d", &num);
    switch (num)
    {
         
        case 1:
            printf("输入学生数:(M<=50):\n");
            scanf("%d", &M);
            insert();
            break;
        case 2:
            modify();
            break;
        case 3:
            search();
            break;
        case 4:
            sort();
            break; 
        case 0:
            printf("退出程序成功!\n");
            exit(0);
        default:
            printf("请在1-8之间选择\n");
            system("pause");//提示完成之后显示按任意键继续
    }
  
}
void insert()//添加学生信息
    {   int i;
        for(i=1;i<=M;i++)
        {
            printf("请输入第%d个学生的学号:",i);
            scanf("%ld",&stu[i].Id);
            printf("请输入第%d个学生的姓名:",i);
            scanf("%c",&stu[i].Name);
            printf("请输入第%d个学生的性别:",i);
            scanf("%c",&stu[i].Sex);
            printf("请输入第%d个学生的年龄:",i);
            scanf("%d",&stu[i].Age);
            printf("请输入第%d个学生的班级:",i);
            scanf("%d",&stu[i].BanJi);
            printf("请输入第%d个学生的语数英成绩:");
            scanf("%f   %f   %f",&stu[i].chinese,&stu[i].math,&stu[i].english);
        }
        printf("学生信息添加完毕!请立即保存数据信息到文件!");
         
    }
void modify()//修改学生信息
    {
         
    int i, item;
    long int a;
    printf("请输入要修改学生的学号:\n");
    scanf("%ld",&a);
    for (i=1; i<=M; i++)
    {
        if (stu[i].Id==a)
        {
            printf("\t\t\t\t1.修改名字:\n");
            printf("\t\t\t\t2.修改性别:\n");
            printf("\t\t\t\t3.修改年龄:\n");
            printf("\t\t\t\t4.修改班级:\n");
            printf("\t\t\t\t5.修改成绩:\n");
            printf("\t\t\t\t0.结束程序!\n");
            while (1)
            {
                printf("please choose:");
                scanf("%d", &item);
                switch (item)
                {
                case 1:
                    printf("Please input new name:\n");
                    scanf("%c", &stu[i].Name);
                    break;
                case 2:
                    printf("Please input sex:\n ");
                    scanf("%c", &stu[i].Sex);
                    break;
                case 3:
                    printf("Please input new age:\n");
                    scanf("%d", &stu[i].Age);
                    break;
                case 4:
                    printf("Please input new banji:\n ");
                    scanf("%d", &stu[i].BanJi);
                    break;
                case 5:
                    printf("please inpur new chengji:\n");
                    scanf("语文:%f   数学:%f    英语:%f",&stu[i].chinese,&stu[i].math,&stu[i].english);
                    break;
                default: printf("Input error!\n");
                }
                if (item == 0)
                    break;
            }
        }
    }
  
} 
void search()  //查找已知学号的学生信息
{
    long int b,term=-1;
    int i;
    printf("请输入要查找学生的学号:");
    scanf("%ld",&b);
    for (i=1; i<=M; i++)
    {
        if (stu[i].Id==b)
        {
             
            printf("学号:%ld  姓名:%c  性别:%c  年龄:%d   班级:%d   语文:%f  数学:%f   英语:%f\n",stu[i].Id,stu[i].Name,stu[i].Sex,stu[i].Age,stu[i].BanJi,stu[i].chinese,stu[i].math,stu[i].english);
            term=-2;
        }
    }
    if(term!=-2)
    {
        printf("Not found!\n");
    }
     
}
void sort() 
{
    int i,j;
    struct student temp;
    for(i=0;i<M-1;i++)
        for(j=i+1;j<M;j++)
        {
            if(stu[i].chinese+stu[i].math+stu[i].english>stu[j].chinese+stu[j].math+stu[j].english)
            {
                temp=stu[i];
                stu[i]=stu[j];
                stu[j]=temp;
            }
        }
    for(i=0;i<M;i++)
    {
        printf("%f %f  %f\n",stu[i].chinese,stu[i].math,stu[i].english);
    }
    return 0;
}    
void save()
    {
        int i;
     
        FILE *fp;
        fp=fopen("student.txt","w");
  
        for(i=1;i<=M;i++)
        {
            fprintf(fp,"%ld         %c         %c         %d       %d   %f\n",stu[i].Id,stu[i].Name,stu[i].Sex,stu[i].Age,stu[i].BanJi,stu[i]);
  
        }
        fclose(fp);
        printf("学生信息保存成功!");
    }
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-01 22:49
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    你好!我注意到你的C语言学生成绩管理程序中存在一些可能的问题,我会逐一指出并提供解决方案。

    1. scanf读取字符串问题:在insert函数和modify函数中,使用scanf读取字符串时,应该使用%s而不是%c%c会读取单个字符,而%s用于读取字符串。例如,在insert函数中,应改为:

      printf("请输入第%d个学生的姓名:",i);
      scanf("%20s", stu[i].Name); // 限制读取20个字符,防止溢出
      
    2. scanf读取浮点数问题:在insert函数和modify函数中,读取浮点数时,应该在scanf的格式字符串中添加空格以分隔不同变量,例如:

      scanf("%f %f %f", &stu[i].chinese, &stu[i].math, &stu[i].english);
      
    3. 修改学生信息时的循环退出问题:在modify函数中,当用户选择退出(item == 0)时,应该使用break退出while循环,但目前代码中缺少了break语句。

    4. 排序函数的逻辑问题:在sort函数中,排序的条件应该是比较总分,但是你的比较逻辑有误。正确的逻辑应该是:

      if(stu[i].chinese + stu[i].math + stu[i].english < stu[j].chinese + stu[j].math + stu[j].english)
      
    5. 保存函数的写入问题:在save函数中,fprintf的格式字符串不正确。应该使用%f来代替stu[i],并且需要为每个变量指定正确的格式。例如:

      fprintf(fp, "%ld %s %s %d %d %.2f %.2f %.2f\n", stu[i].Id, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].BanJi, stu[i].chinese, stu[i].math, stu[i].english);
      
    6. 主函数中的system("pause")问题:在Windows系统中,system("pause")用于暂停程序,但在其他操作系统中可能无效。如果你的程序需要在多个平台上运行,考虑使用其他方法来实现这个功能。

    7. 内存分配问题:你的程序中没有为stu数组分配动态内存,但由于你使用的是静态分配,这通常不是问题,除非你的数组非常大。

    8. 程序的健壮性:你的程序在用户输入时没有进行错误检查,例如,当用户输入非数字字符时,scanf可能会失败。你可以使用scanf的返回值来检查输入是否成功。

    9. 主循环问题:你的主循环中缺少了break语句,这可能导致在执行完一个功能后不会重新显示菜单。在每个case语句的末尾添加break可以解决这个问题。

    修复这些问题后,你的程序应该能够更稳定地运行。如果你还有其他问题或需要进一步的帮助,请随时告诉我!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月1日