给不了的未来 2021-12-30 19:33 采纳率: 100%
浏览 76
已结题

C语言学生管理系统在查找学生模块出现输入

问题遇到的现象和发生背景

代码是输入学号和姓名并进行循环,查到学号相同或姓名相同时输出,但在实际使用时出现输入的和输出的对应不上,不知道是哪里出现了问题,软件使用的是VS2019

问题相关代码,请勿粘贴截图
//题目 5:学生成绩记录系统
//设计和实现一个“学生成绩记录系统”,满足以下要求:
//1.系统以菜单方式工作;
//2.使用链表或结构数组对不同班级的学生成绩信息进行管理和维护;
//3.使用二进制文件在磁盘上保存学生记录信息;
//4.链表中各结点或结构数组中各元素包括“学号、班级、姓名、语文、数学、
//外语、计算机、平均分、总分”字段;
//5.实现如下基本功能:
//(1)列出指定班级的所有学生的成绩单
//(2)录入学生记录 (新增学生的信息)
//(3)查找学生 (查找指定学号的学生,显示该学生的学号、班级、
//姓名、所有课程成绩)
//(4)删除学生 (删除指定学号的学生)
//(5)计算总分和平均分 (计算每位学生四门课程的平均分和总分)
//(5)排序 (对指定班级的所有学生按总分由高到低的方式排序并输出)
//(6)统计指定班级各门课程的平均分 (计算并输出某班级学生每门课程
//的平均分)
//(7)查询所有存在不及格课程的学生,并输出这些学生信息;
//(8)将学生记录保存到文件存盘 (将数据以文件的形式存盘)
//(9)从文件中读入学生记录 (将已经盘的文件数据读入内存)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
//链表基础
typedef struct _student
{
    int num, cla;
    char name[20];
    float chi, mat, eng, com, aver, sum;
}student;
//链表节点
typedef struct _Node
{
    student stu;
    struct _Node* pNext;
}Node;
Node* g_pHead = NULL;
//启动界面
void interface()
{
    printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*\t\t学生信息管理系统(初版)\t*\n");
    printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*\t\t1.显示学生信息\t\t\t*\n");
    printf("*\t\t2.录入学生信息\t\t\t*\n");
    printf("*\t\t3.查找学生信息\t\t\t*\n");
    printf("*\t\t4.删除学生信息\t\t\t*\n");
    printf("*\t\t5.计算平均分、总分\t\t*\n");
    printf("*\t\t6.统计科目平均分\t\t*\n");
    printf("*\t\t7.查询存在挂科学生\t\t*\n");
    printf("*\t\t8.保存学生信息\t\t\t*\n");
    printf("*\t\t9.读取学生信息\t\t\t*\n");
    printf("*\t\t0.退出程序\t\t\t*\n");
    printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
}
//功能1:显示学生信息
void print()
{
    system("cls");//清除屏幕
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*\t\t\t\t\t\t学生信息管理系统(初版)\t\t\t\t\t*\n");
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*\t姓名\t*\t学号\t*\t班级\t*\t语文\t*\t数学\t*\t英语\t*\t计算机\t*\n");
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    Node* p = g_pHead;
    while (p != NULL)
    {
        printf("*\t%s\t*\t%d\t*\t%d\t*\t%5.1f\t*\t%5.1f\t*\t%5.1f\t*\t%5.1f\t*\n", p->stu.name, p->stu.num, p->stu.cla, p->stu.chi, p->stu.mat, p->stu.eng, p->stu.com);
        p = p->pNext;
    }
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    system("pause");//暂停程序
    system("cls");//清除屏幕
}
//功能2:录入学生信息
void enter()
{
    Node* pNewNode = (Node*)malloc(sizeof(Node));//pNewNode是一个空的新节点
    pNewNode->pNext = NULL;
    if (g_pHead == NULL)//头插法
    {
        g_pHead = pNewNode;
    }
    else
    {
        pNewNode->pNext = g_pHead;
        g_pHead = pNewNode;
    }
    printf("请输入学生姓名:\n");
    scanf_s("%s", pNewNode->stu.name,20);//接收姓名
    printf("请输入学号:\n");
    scanf_s("%d", &pNewNode->stu.num);//接收学号
    printf("请输入班级:\n");
    scanf_s("%d", &pNewNode->stu.cla);//接收班级
    printf("请输入语文、数学、英语、计算机成绩:\n");
    scanf_s("%f%f%f%f", &pNewNode->stu.chi, &pNewNode->stu.mat, &pNewNode->stu.eng, &pNewNode->stu.com);//接收各科目成绩
    printf("录入成功!\n");
    system("pause");//暂停程序
    system("cls");//清除屏幕
}
//功能3:查找学生信息
Node* find()
{
    int numstu;
    char namestu[20];
    printf("请输入要查找的学生的学号:");
    scanf_s("%d", &numstu);
    printf("请输入要查找学生的姓名:");
    scanf_s("%s", namestu,20);
    Node* p = g_pHead;
    while (p!=NULL)
    {
        if (p->stu.num == numstu || strcmp(p->stu.name, namestu))
        {
            return p;
        }
        p = p->pNext;
    }
    return NULL;
}
//功能4:删除学生信息
void deletestu()
{
    int numstu;
    printf("请输入要删除的学生学号:");
    scanf_s("%d", &numstu);
    Node* p1, * p2;
    //判断是否为头节点
    if (g_pHead->stu.num == numstu)
    {
        p1 = g_pHead;
        g_pHead = g_pHead->pNext;
        free(p1);
        return;
    }
    //当不是头结点时
    Node* p = g_pHead;
    while (p->pNext != NULL)
    {
        if (p->pNext->stu.num == numstu)
        {
            p2 = p->pNext;
            p->pNext = p->pNext->pNext;
            free(p2);
            return;
        }
        p = p->pNext;
        if (p->pNext == NULL)
        {
            break;
        }
    }
    if (p->pNext == NULL)
    {
        printf("未找到该学生!\n");
    }
}
//功能5:计算平均分和总分
void plus()
{
    printf("正在计算每位同学的平均分和总分。。。\n");
    printf("计算完成!\n");
    system("pause");//暂停程序
    system("cls");//清除屏幕
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*\t\t\t\t学生信息管理系统(初版)\t\t\t*\n");
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*\t姓名\t*\t学号\t*\t班级\t*\t平均分\t*\t总分\t*\n");
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    Node* p = g_pHead;
    while (p != NULL)
    {
        p->stu.aver = (p->stu.chi + p->stu.mat + p->stu.eng + p->stu.com) / 4;
        p->stu.sum = p->stu.chi + p->stu.mat + p->stu.eng + p->stu.com;
        printf("*\t%s\t*\t%d\t*\t%d\t*\t%5.1f\t*\t%5.1f\t*\n",p->stu.name,p->stu.num,p->stu.cla,p->stu.aver,p->stu.sum);
        p = p->pNext;
    }
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    system("pause");//暂停程序
    system("cls");//清除屏幕
}
//功能6:统计某一科目的平均分

//功能7:查询存在不及格的学生

//功能8:保存学生信息
void save()
{
    FILE* fp = fopen("C:\\Users\\给不了的未来\\Documents\\information.dat", "w+");//打开文件并写入
    if (fp == NULL)
    {
        perror("未能成功打开文件。\n");
        system("pause");//暂停程序
        system("cls");//清除屏幕
        return;
    }
    Node* p = g_pHead;
    while (p != NULL)
    {
        fwrite(&p->stu, 1, sizeof(student), fp);
        p = p->pNext;
    }
    fclose(fp);//关闭文件
    printf("\n保存文件成功!\n");
    system("pause");//暂停程序
    system("cls");//清除屏幕
}
//功能9:读取学生信息
void load()
{
    FILE* fp = fopen("C:\\Users\\给不了的未来\\Documents\\information.dat", "r");
    if (fp == NULL)
    {
        printf("打开文件失败或该文件不存在!\n");
        system("pause");//暂停程序
        system("cls");//清除屏幕
        return;
    }
    student stu;
    while (fread(&stu, 1, sizeof(student), fp))
    {
        Node* pNewNode = (Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;
        memcpy(pNewNode, &stu, sizeof(student));
        if (g_pHead == NULL)
        {
            g_pHead = pNewNode;
        }
        else
        {
            pNewNode->pNext = g_pHead;
            g_pHead = pNewNode;
        }
    }
    fclose(fp);
    printf("成功加载文件中的数据!\n");
    system("pause");//暂停程序
    system("cls");//清除屏幕
}
 //主函数
int main()
{
    while (1)
    {
        interface();
        char ch=_getch();
        switch (ch)
        {
        case '1':
            print();
            break;//功能1:显示学生信息
        case '2':
            enter();
            break;//功能2:录入学生信息
        case '3':
        {
            Node* p = find();
            if (p != NULL)
            {
                printf("姓名:%s\t学号:%d\t班级:%d\t语文:%5.1f\t数学:%5.1f\t英语:%5.1f\t计算机:%5.1f\n",p->stu.name,p->stu.num,p->stu.cla,p->stu.chi,p->stu.mat,p->stu.eng,p->stu.com);
            }
            else
                printf("未找到该学生!\n");
            system("pause");//暂停程序
            system("cls");//清除屏幕
            break;//功能3:查找学生信息
        }
        case '4':
        {
            deletestu();
            system("pause");//暂停程序
            system("cls");//清除屏幕
            break;//功能4:删除学生信息
        }
        case '5':
            plus();
            break;//功能5:计算平均分和总分
        case '6':break;//功能6:统计某一科目的平均分
        case '7':break;//功能7:查询存在不及格的学生
        case '8':
            save();
            break;//功能8:保存学生信息
        case '9':
            load();
            break;//功能9:读取学生信息
        case '0':
            printf("谢谢您的使用!\n");
            return 0;
        default:
            printf("您的输入有误,请重新输入!\n");
            system("pause");//暂停程序
            system("cls");//清除屏幕
        }
    }
    return 0;
}
运行结果及报错内容

img

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 关注

    第115行 if (p->stu.num == numstu || strcmp(p->stu.name, namestu))这里,改成
    if (p->stu.num == numstu || strcmp(p->stu.name, namestu)==0) //字符串相等返回的是0,所以需要用==0来判断

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月10日
  • 已采纳回答 1月2日
  • 创建了问题 12月30日

悬赏问题

  • ¥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)