yang_xingui 2021-06-17 21:05 采纳率: 90.9%
浏览 110
已结题

为什么刚输入一个学生的信息后再按回车想输第二个时,直接结束程序了?求大神解答

 

 

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N  3
#define M  3
struct student
{
    char num[12];
    char name[20];
    int score[3];
    float ave;
}stu[N];
int student_number = 0;
int Menu()
{
    int a;
    do {
        system("cls");                                                                              /*运行前清屏,把选择清掉*/
        printf("**********************************************************\n");
        printf("*              欢迎使用高校学生成绩管理系统V1.0          *\n");
        printf("*                        请选择功能                      *\n");
        printf("**********************************************************\n");
        printf("*                   1.录入学生成绩计算学生总平均分       *\n");
        printf("*                   2.查找学生成绩                       *\n");
        printf("*                   3.修改学生成绩                       *\n");
        printf("*                   4.计算学生每门课平均分最高分最低分   *\n");
        printf("*                   5.根据学生总平均分从高到低排序       *\n");
        printf("*                   6.划分学生成绩等级                   *\n");
        printf("*                   0.退出系统                           *\n");
        printf("**********************************************************\n");
        printf("请输入所选功能前的序号:");
        scanf_s("%d", &a);
        if (a < 0 || a>6)
        {
            printf("错误选择");
            system("pause");
        }
    } while (a < 0 || a>10);
    return a;
}

void ll()
{
    int i;
    float sum[N];
    printf("请输入学生学号、姓名及高数、C语言、数据结构的成绩\n");
    for (i = 0; i < N; i++)
    {
        scanf_s("%s %s %d %d %d", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
        sum[i] = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];
        stu[i].ave = sum[i] / 3;
    }
    printf("\n学号\t姓名\t高数\tc语言\t数据结构\t平均分\n");
    for (i = 0; i < N; i++)
    {
        printf("%s\t%s\t%d\t%d\t%d\t%f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
    }
}

void px()
{
    int i = 0;
    char testnum[12];
    printf("请输入要查找学生的学号:");
    scanf_s("%s", testnum);
    i = 0;
    while (strcmp(testnum, stu[i].num) != 0 && i < student_number)
    {
        i++;
    }
    if (i < student_number)
    {
        printf("\n学号\t姓名\t高数\tc语言\t数据结构\t平均分\n");
        printf("%s\t%s\t%d\t%d\t%d\t%f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
    }
    else
        printf("查无此人");
}

void pj()
{
    int i = 0, j;
    char testnum[12];
    printf("请输入要修改学生的学号:");
    scanf_s("%s", testnum);
    while (strcmp(testnum, stu[i].num) != 0 && i < student_number)
    {
        i++;
    }
    if (i < student_number)
    {
        printf("开始修改\n");
        printf("学号\t:");
        scanf_s("%s", stu[i].num);
        printf("姓名\t:");
        scanf_s("%s", stu[i].name);
        printf("高数\t:");
        scanf_s("%d", &stu[i].score[0]);
        printf("c语言\t:");
        scanf_s("%d", &stu[i].score[1]);
        printf("数据结构\t:");
        scanf_s("%d", &stu[i].score[2]);
        stu[i].ave = (float)(stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3;
        printf("\n学号\t姓名\t高数\tc语言\t数据结构\t平均分\n");
        printf("%s\t%s\t%d\t%d\t%d\t%f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
        printf("修改成功");
    }
}
void zg()
{
    int i = 0, j, max = stu[0].score[i], min = stu[0].score[i], t[3], s[3];
    float sum[M];
    float ave1[3];
    for (i = 0; i < N; i++)
    {
        sum[i] = stu[0].score[i] + stu[1].score[i] + stu[2].score[i];
        ave1[i] = sum[i] / 3;
    }
    printf("各科的平均分分别为:%8.2f \n", ave1[i]);
    printf("\n");
    for (i = 0; i < N; i++)
    {
        max = stu[0].score[i];
        for (j = 0; j < 3; j++)
        {
            if (max < stu[j].score[i])
            {
                max = stu[j].score[i];
                t[i] = max;
            }
        }printf("各科最高分分别为:%d %d %d \n", t[0],t[1],t[2]);
    }
    printf("\n");
    for (i = 0; i < N; i++)
    {
        min = stu[0].score[i];
        for (j = 0; j < 3; j++)
        {
            if (min > stu[j].score[i])
            {
                min = stu[j].score[i];
                s[i] = min;
            }
        }printf("各科最低分分别为:%d %d %d \n", s[0],s[1],s[2]);
    }
}
void dj()
{
    int i, j, t;
    float sum[M];
    float ave1[3];
    for (i = 0; i < N; i++)
    {
        sum[i] = stu[0].score[i] + stu[1].score[i] + stu[2].score[i];
        ave1[i] = sum[i] / 3;
    }
    for (j = 0; j < 3; j++)
    {
        for (i = 0; i < 2 - j; i++)
            if (stu[i].ave < stu[i + 1].ave)
            {
                t = stu[i].ave; stu[i].ave = stu[i + 1].ave; stu[i + 1].ave = t;
            }
    }
    printf("根据平均分从高到低排序后:%s  %.2f\n", stu[i].num, stu[i].ave);
    printf("\n");
}
void di()
{
    int i;
    char* testnum = 0;
    printf("请输入要划分等级的学生学号: ");
    scanf_s("%s", testnum);
    printf("\n");
    for (i = 0; i <= N; i++)
    {
        if (stu[i].num == testnum)
            scanf_s("%f\n", stu[i].ave);
    }
    for (i = 0; i < N; i++)
    {
        if (stu[i].ave >= 90)
            printf("优\n");
        else if (stu[i].ave >= 80 && stu[i].ave < 90)
            printf("良\n");
        else if (stu[i].ave >= 60 && stu[i].ave < 80)
            printf("中\n");
        else
            printf("差\n");
    }
}

void AddFromText()
{
    FILE* fp;
    int i = 0;
    if ((fp = fopen("D:\\student.txt", "r")) == NULL)
    {
        printf("打开文件失败,无读取数据");
    }
    else
    {
        fscanf(fp, "%s", &student_number);
        while (i < student_number)
        {
            fscanf(fp, "%s%s%d%d%d%f", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
            i++;
        }
        fclose(fp);
        exit(0);
    }
}

void Write()
{
    int i = 0;
    FILE* fp;
    if ((fp = fopen("D:\\student.txt", "w")) == NULL)
    {
        printf("保存失败");
    }
    else
    {
        fprintf(fp, "%d", student_number);
        while (i < student_number)
        {
            fprintf(fp, "%s%d%d%d%d%f", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
            i++;
        }
        fclose(fp);
        printf("保存成功");
        exit(0);
    }
}

int main()
{
    AddFromText();
    for (;;)
    {
        switch (Menu())
        {
        case 1:ll(); system("pause"); continue;
        case 2:px(); system("pause"); continue;
        case 3:pj(); system("pause"); continue;
        case 4:zg(); system("pause"); continue;
        case 5:dj(); system("pause"); continue;
        case 6:di(); system("pause"); continue;
        case 0:Write();
        }
    }
}

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2021-06-17 21:30
    关注

    scanf_s("%s %s %d %d %d", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);

    改为

    scanf_s("%s %s %d %d %d", stu[i].num,12,stu[i].name,20, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);试试呢,scanf_s读入字符串要求指定字符串最大长度的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月16日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)