爱喝奶茶的喵喵 2021-05-24 11:28 采纳率: 0%
浏览 54
已结题

求大佬给解决,小弟在此有礼了!

只会特定的几个人的成绩,这个要求,求大佬解 实验要求: 1)输入,修改和显示 n个学生的 m 门考试科目的成绩,计算总分和平均分。 2)分别按总分和学号进行排序。 3)输入学生的学号,显示该学生的姓名、各门课程的成绩。 4)将输入的学生成绩数据保存到文件中, 5)从文件中读出学生成绫数据,查询学生成绩。 6)程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。”

  • 写回答

2条回答 默认 最新

  • technologist_30 2021-05-24 12:25
    关注
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define SCORESIZE 4
    #define YES 14
    #define NO 60
    #define ERROR_VALUE 99
    #define ERROR_VALUE_OUT printf("错误,没有这个选项,请认真输入!!!\n")
    #define ERROR_LENTH -1
    #define ERROR_LENTH_OUT printf("提示:请输入正确的命令,命令有一个数字组成,请勿多输!\n")
    #define ERROR printf("输入错误,请重新输入!\n")
    /*
    *学生对象结构体
    */
    typedef struct
    {
    int no; //学号
    char *name; //姓名
    int score[3]; //三门课程的成绩
    int sum; //总成绩
    double avr; //平均成绩
    }student_t;
    student_t stu[50];
    /*
    *获取一个字符串,开辟字符串长度+1的内存空间
    *返回开辟的内存地址
    */
    char * GetString()
    {
    char *p;
    int len = 0;
    p = (char *)malloc(1*sizeof(char));
    while((*(p+len)=getchar()) != '\n')
    {
    ++len;
    p = (char *)realloc(p, (len+1)*sizeof(char));
    }
    *(p+len) = '\0';
    return p;
    }
    /*
    *主菜单
    */
    void menu()
    {
    printf("|------------------------------学员成绩管理-------------------------------|\n"); printf("| |\n");
    printf("| |\n");
    printf("| 1------------>录入学生信息 |\n");
    printf("| |\n");
    printf("| |\n");
    printf("| 2------------>查看所有学员成绩信息 |\n");
    printf("| |\n");
    printf("| |\n");
    printf("| 3------------>插入 |\n");
    printf("| |\n");
    printf("| |\n");
    printf("| 4------------>删除 |\n");
    printf("| |\n");
    printf("| |\n");
    printf("| 5------------>查找 |\n");
    printf("| |\n");
    printf("| |\n");
    printf("| 0------------>退出本系统 |\n");
    printf("|-------------------------------------------------------------------------|\n");
    printf("^_^ 提示:请输入操作命令 > > > > > > > > > > > > > > > > > > >:");
    }
    /*
    *输出stu的全部的信息
    */
    void output(student_t *s,int len)
    {
    int i;
    printf("\t\t\t\t所有成绩信息显示\n");
    printf("\t\t学号\t姓名\t成绩①\t成绩②\t成绩③\t平均成绩\t总分\n");
    for(i=0;i<len;i++)
    {
    printf("\t\t%d\t%s\t%d\t%d\t%d\t%.2lf\t\t%d\n",(*(s+i)).no,(*(s+i)).name,
    (*(s+i)).score[0],(*(s+i)).score[1],(*(s+i)).score[2],(*(s+i)).avr,
    (*(s+i)).sum);
    }
    }
    /*
    *获取用户输入命令
    *返回一个正整数
    */
    int GetCommand()
    {
    char *cmd;
    cmd = GetString();
    if(strlen(cmd) == 1)
    {
    if(*cmd == '1')
    {
    return 1;
    }
    if(*cmd == '2')
    {
    return 2;
    }
    if(*cmd == '3')
    {
    return 3;
    }
    if(*cmd == '4')
    {
    return 4;
    }
    if(*cmd == '5')
    {
    return 5;
    }
    if(*cmd == '0')
    {
    return 0;
    }
    if((*cmd == 'Y')||(*cmd == 'y'))
    {
    return YES;
    }
    if((*cmd == 'N')||(*cmd == 'n'))
    {
    return NO;
    }
    else
    {
    return ERROR_VALUE;
    }
    }
    return ERROR_LENTH;
    free(cmd);
    }
    /*
    *获取一个学生的信息
    */
    student_t input()
    {
    int i;
    student_t s;
    //获取学号
    do
    {
    printf("学号:");
    scanf("%d",&s.no);
    if(s.no>0&&s.no<=50)
    {
    break;
    }
    else
    {
    printf("错误,请输入0-50中的数字!\n");
    fflush(stdin);
    continue;
    }
    } while(1);
    fflush(stdin);
    //获取姓名
    printf("姓名:");
    s.name=GetString();
    for(i=0;i<3;i++)
    {
    do
    {
    printf("请输入第%d成绩:",i+1);
    scanf("%d",&s.score[i]);
    if(s.score[i]>0&&s.score[i]<=100)
    break;
    else
    {
    printf("请输入正确的学生成绩!(0-100)\n");
    fflush(stdin);
    continue;
    }
    } while(1);
    }
    //计算平均成绩并赋值给s.avr
    s.sum = s.score[0]+s.score[1]+s.score[2];
    s.avr=(s.sum)/3.00;
    return s;
    }
    /*
    *获取所有学生的信息
    *返回输入的学生总数
    */
    int GetAllStudent()
    {
    int i=0,cmd;
    do
    {
    system("cls");
    printf("请避免输入重复的学号,以免混淆!\n");
    stu[i] = input(); //将获得的学生信息给stu[i]
    fflush(stdin);
    lo: printf("是否继续录入(Y/N):");
    cmd = GetCommand();
    switch(cmd)
    {
    case YES:
    i++;
    break;
    case NO:
    return (i+1);
    case ERROR_VALUE:
    ERROR_VALUE_OUT;
    goto lo;
    default:
    ERROR_LENTH_OUT;
    goto lo;
    }
    }while(1);
    return (i+1);
    }
    /*
    *对学生按平均成绩进行排序(冒泡)
    */
    void sort(int len)
    {
    int i;
    student_t *p,temp;
    for(i=0;i<len-1;i++)
    {
    for(p=stu;p<stu+len-1;p++)
    {
    if((*p).sum<(*(p+1)).sum)
    {
    temp=(*p);
    (*p)=(*(p+1));
    (*(p+1))=temp;
    }
    }
    }
    }
    /*
    *显示学员信息
    *形参:学生的人数
    */
    void DisplayAllStudent(int len)
    {
    system("cls");
    system("color 70");
    printf("现有成绩信息:\n");
    output(stu,len);
    sort(len);
    printf("排序后成绩信息:\n");
    output(stu,len);
    system("pause");
    }
    int insert(int len)
    {
    int cmd;
    do
    {
    system("cls");
    printf("现有成绩信息:\n");
    output(stu,len);
    printf("请避免输入重复的学号,以免混淆!\n");
    stu[len] = input(); //录入信息
    len++; //长度+1;
    sort(len); //排序
    printf("插入后成绩信息:\n");
    output(stu,len);
    fflush(stdin);
    lc: printf("是否继续插入(Y/N):");
    cmd = GetCommand(); //获取命令
    switch(cmd)
    {
    case YES:
    break;
    case NO:
    return len;
    case ERROR_VALUE:
    ERROR_VALUE_OUT;
    goto lc;
    default:
    ERROR_LENTH_OUT;
    goto lc;
    }
    }while(1);
    return len;
    }
    /*
    *删除学员信息,并显示删除前后所有的成绩信息
    */
    int del(int len) //len 学生的个数
    {
    int cmd,n,i,j=0,statu=0; //statu 找到和未找到的标记 0未找到
    do
    {
    system("cls");
    printf("现有成绩信息:\n");
    output(stu,len);
    printf("请输入要删除的学生学号:");
    scanf("%d",&n);
    for(i=0;i<len;i++)
    {
    if(stu[i].no==n)
    {
    statu=1;
    for(j=i;j<len;j++)
    {
    stu[j]=stu[j+1];
    }
    len--;
    }
    }
    if(statu==0)
    {
    fflush(stdin);
    printf("未找到任何有关该学号的信息!\n");
    goto lc;
    }
    sort(len);
    printf("删除后成绩信息:\n");
    output(stu,len);
    fflush(stdin);
    lc: printf("是否继续删除(Y/N):");
    cmd = GetCommand();
    switch(cmd)
    {
    case YES:
    break;
    case NO:
    return len;
    case ERROR_VALUE:
    ERROR_VALUE_OUT;
    goto lc;
    default:
    ERROR_LENTH_OUT;
    goto lc;
    }
    }while(1);
    return len;
    }
    int main(void)
    {
    int cmd,lenth=0,n,i;
    system("color 2B");
    do
    {
    system("color 2B");
    system("cls");
    menu();
    cmd = GetCommand();
    switch(cmd)
    {
    case 1:
    system("color 3E");
    system("cls");
    printf("\t\t\t警告:录入成绩将删除原有的所有学生信息!\n");
    lenth = GetAllStudent();
    break;
    case 2:
    DisplayAllStudent(lenth);
    break;
    case 3:
    system("color 3E");
    system("cls");
    lenth = insert(lenth);
    break;
    case 4:
    system("color 3E");
    system("cls");
    lenth = del(lenth);
    break;
    case 5:
    printf("请输入要查找的学生学号:");
    scanf("%d",&n);
    for(i=0;i<lenth;i++)
    {
    if(stu[i].no==n)
    {
    printf("\t\t学号\t姓名\t成绩①\t成绩②\t成绩③\t平均成绩\t总分\n");
    printf("\t\t%d\t%s\t%d\t%d\t%d\t%.2lf\t\t%d\n",stu[i].no,stu[i].name,
    stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].avr,stu[i].sum);
    break;
    }
    }
    if(i>=lenth)
    {
    printf("未找到任何有关该学号的信息!\n");
    }
    fflush(stdin);
    system("pause");
    break;
    case 0:
    exit(0);
    case ERROR_LENTH:
    ERROR_LENTH_OUT;
    system("pause");
    break;
    default:
    ERROR_VALUE_OUT;
    system("pause");
    break;
    }
    }
    while(1);
    }
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月1日

悬赏问题

  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴
  • ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
  • ¥50 爬虫预算充足,跪巨佬
  • ¥15 滑块验证码拖动问题悬赏
  • ¥15 Wanted but not invoked:Actually, there were zero interactions with this moc
  • ¥20 怎么驱动tb6612