一位鹿人 2023-01-08 18:38 采纳率: 85.7%
浏览 34
已结题

C语言学生信息管理系统实现查询学生信息时出现问题

用程序运行search()函数查询学生信息时,文件中有学生信息,但是每次输入学号或姓名后都显示“查无此人”。这个该怎么办呢?
search()函数代码如下:

void search()   //该函数用于查询学生信息
{
    int searchmode; //子菜单选择
    int i,j = 0,findid;
    char findname[10];
    int findok;  //定义一个判断标志的整型变量findok
    char findct; //定义一个用于判断是否继续查找的字符变量findct
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "r"); //以"只读"方式打开students文本文件
    /*查询菜单*/
    printf("\t\t成绩查询");
    printf("\n\t1按姓名查询");
    printf("\n\t2按学号查询");
    printf("\n\t0返回上级菜单");
    printf("\n请输入您的操作:");
    scanf("%d", &searchmode);
    /*查询操作*/
    switch (searchmode)
    {
    case 1:
        {
            printf("请输入要查询学生的姓名:\n");
            getchar();
            scanf("%s", findname);
            for (i = 0; i < n; i++)
            {
                fread( & st[i], sizeof(struct Student), 1, fp); //读入students文本文件
                if (strcmp(st[i].name, findname) == 0) //比较字符串
                {
                    j++;
                    printf("\n查寻到的学生为:\n");
                    printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                    printf(" %d ", st[i].id);
                    printf("    %-s ", st[i].name);
                    printf("     %-s ", st[i].gender);
                    printf("     %d ", st[i].age);
                    printf("\t%d ", st[i].MathAna);
                    printf("\t\t%d ", st[i].LiAlg);
                    printf("\t\t%d ", st[i].Computer);
                    printf("\t\t%d ", st[i].English);
                    printf("\t\t%.2f \n", st[i].GPA);
                }
            }
            if (j == 0)
            printf("\n>>>查无此人!");
            //提示是否继续 
            printf("\n是否继续查找(Y/N)?");
            getchar();
            findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
            if (findct == 'Y' || findct == 'y')
            search();
        }
        break;
    case 2:
        {
            printf("请输入要查询学生的学号:");
            scanf("%d", &findid);
            for (i = 0; i < n; i++)
            {
                fread( & st[i], sizeof(struct Student), 1, fp); //以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个学生的信息
                if (st[i].id == findid) //整型数字的比较
                {
                    findok = 1;
                    break;
                }
                else findok = 0;
            }
            if (!findok)
            printf("\n>>>查无此人!");
            else
            {
                printf("\n查寻到的学生为:\n");
                printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                printf(" %d ", st[i].id);
                printf("    %-s ", st[i].name);
                printf("     %-s ", st[i].gender);
                printf("     %d ", st[i].age);
                printf("\t%d ", st[i].MathAna);
                printf("\t\t%d ", st[i].LiAlg);
                printf("\t\t%d ", st[i].Computer);
                printf("\t\t%d ", st[i].English);
                printf("\t\t%.2f \n", st[i].GPA);
            }
            //提示是否继续
            printf("\n是否继续查找(Y/N)?");
            getchar();
            findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
            if (findct == 'Y' || findct == 'y')
            search();
        }
        break;
    }
    fclose(fp); //关闭文件
}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-01-08 21:19
    关注

    修改如下,供参考:

    void search()   //该函数用于查询学生信息
    {
        struct Student stmp;//修改
    
        int searchmode; //子菜单选择
        int i,j = 0,findid;
        char findname[10];
        int  findok;  //定义一个判断标志的整型变量findok
        char findct; //定义一个用于判断是否继续查找的字符变量findct
        FILE * fp; //定义一个文件指针fp
        fp = fopen("students.txt", "r"); //"只读"方式打开students文本文件
        /*查询菜单*/
        printf("\t\t成绩查询");
        printf("\n\t1按姓名查询");
        printf("\n\t2按学号查询");
        printf("\n\t0返回上级菜单");
        printf("\n请输入您的操作:");
        scanf("%d", &searchmode);
        /*查询操作*/
        switch (searchmode)
        {
        case 1:
            {
                j = 0;  //修改
                printf("请输入要查询学生的姓名:\n");
                getchar();
                scanf("%s", findname);
                while (1) //for (i = 0; i < n; i++)  修改
                {   //读入students文本文件
                    if (fread(&stmp, sizeof(struct Student), 1, fp) != 1) break; //修改
                    if (strcmp(stmp.name, findname) == 0) //比较字符串
                    {
                        j++;
                        printf("\n查寻到的学生为:\n");
                        printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                        printf(" %d ", stmp.id);          //修改
                        printf("    %-s ", stmp.name);    //修改
                        printf("     %-s ", stmp.gender); //修改
                        printf("     %d ", stmp.age);     //修改
                        printf("\t%d ",   stmp.MathAna);  //修改
                        printf("\t\t%d ", stmp.LiAlg);    //修改
                        printf("\t\t%d ", stmp.Computer); //修改
                        printf("\t\t%d ", stmp.English);  //修改
                        printf("\t\t%.2f \n", stmp.GPA);  //修改
                    }
                }
                if (j == 0)
                    printf("\n>>>查无此人!");
                //提示是否继续
                fclose(fp); //     修改
                printf("\n是否继续查找(Y/N)?");
                getchar();
                findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
                if (findct == 'Y' || findct == 'y')
                    search();
            }
            break;
        case 2:
            {
                findok = 0;    //修改
                printf("请输入要查询学生的学号:");
                scanf("%d", &findid);
                 while (1)  //for (i = 0; i < n; i++)   //修改
                {   //以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个学生的信息
                    if (fread(&stmp, sizeof(struct Student), 1, fp) != 1) break; //修改
                    if (stmp.id == findid) //整型数字的比较
                    {
                        findok = 1;
                        printf("\n查寻到的学生为:\n");
                        printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                        printf(" %d ", stmp.id);         //修改
                        printf("    %-s ", stmp.name);   //修改
                        printf("     %-s ",stmp.gender); //修改
                        printf("     %d ", stmp.age);    //修改
                        printf("\t%d ", stmp.MathAna);   //修改
                        printf("\t\t%d ", stmp.LiAlg);   //修改
                        printf("\t\t%d ", stmp.Computer);//修改
                        printf("\t\t%d ", stmp.English); //修改
                        printf("\t\t%.2f \n",stmp.GPA);  //修改
                    }
                    //else findok = 0;  修改
                }
                if (!findok)
                    printf("\n>>>查无此人!");
                //else                            //修改
                //{                               //修改
                //    printf("\n查寻到的学生为:\n");
                //    printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                //    printf(" %d ", st[i].id);
                //    printf("    %-s ", st[i].name);
                //    printf("     %-s ", st[i].gender);
                //    printf("     %d ", st[i].age);
                //    printf("\t%d ", st[i].MathAna);
                //    printf("\t\t%d ", st[i].LiAlg);
                //    printf("\t\t%d ", st[i].Computer);
                //    printf("\t\t%d ", st[i].English);
                //    printf("\t\t%.2f \n", st[i].GPA);
                //}
                //提示是否继续
                fclose(fp); //     修改
                printf("\n是否继续查找(Y/N)?");
                getchar();
                findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
                if (findct == 'Y' || findct == 'y')
                    search();
            }
            break;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月17日
  • 已采纳回答 1月9日
  • 创建了问题 1月8日

悬赏问题

  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答