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

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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。