Satellite$hake 2020-12-16 15:46 采纳率: 100%
浏览 108
已采纳

c语言 解决查找学生信息代码bug

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<dos.h>
#define _CRT_SECURE_NO_WARNINGS 1
#define LEN sizeof(struct student)
#define FORMAT"%d\t%s\t%1.1f\t\t%1.1f\t\t%1.1f\t\t%1.1f\t\n"
#define DATA stu[i].num,stu[i].name,stu[i].elective,stu[i].experiment,stu[i].required,stu[i].sum
struct student
{
    int num;  //学生学号 
    char name[15];  //学生姓名 
    double elective;  //选修课 
    double experiment;  //实验课 
    double required;  //必修课 
    double sum;  //总分数 
};
struct student stu[50];
void help(); //帮助 
void in();  //录入
void show();  //显示 
void order();  //排序 
void del();  //删除 
void modify();  //修改 
void menu();  //主菜单 
void insert();  //增加 
void total();  //统计人数 
void search();  //查找 
void help()  //帮助使用 
{
    printf("\n0.欢迎使用系统帮助!\n");
    printf("\n1.初次进入系统后,请先选择录入学生信息;\n");
    printf("\n2.按照菜单提示键入数字代号;\n");
    printf("\n3.增删学生信息后,切记验证是否成功;\n");
    printf("\n4.谢谢您的使用!\n");
}
void menu()  //主菜单显示界面 
{
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t|---------------学生管理系统---------------|\n");
    printf("\t\t|                                          |\n");
    printf("\t\t|            0.退出系统                    |\n");
    printf("\t\t|            1.录入学生信息                |\n");
    printf("\t\t|            2.查找学生信息                |\n");
    printf("\t\t|            3.删除学生信息                |\n");
    printf("\t\t|            4.修改学生信息                |\n");
    printf("\t\t|            5.插入学生信息                |\n");
    printf("\t\t|            6.排序                        |\n");
    printf("\t\t|            7.统计学生信息                |\n");
    printf("\t\t|            8.显示所有学生信息            |\n");    
    printf("\t\t|                                          |\n");
    printf("\t\t|------------------------------------------|\n");
    printf("\t\t请选择(0-8)");
}
main()
{
    system("color f0\n");
    int n;
    menu();
    scanf("%d", &n);
    while (n)
    {
        switch (n)
        {
             case 0:help(); break; 
             case 1:in(); break;
             case 2:search(); break;
             case 3:del(); break;
             case 4:modify(); break;
             case 5:insert(); break;
             case 6:order(); break;
             case 7:total(); break;
              case 8:show(); break; 
             default:break;
        }
        getch();
        menu();
        scanf("%d", &n);
    }
}

void in()  //录入学生信息 
{
    int i, m = 0;
    char ch[2];
    FILE *fp;
    if((fp=fopen("data.txt","a+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))
    {
        if(fread(&stu[m],LEN,1,fp)==1)
        {
            m++;
        }
    }
    fclose(fp);
    if(m==0)
    {
        printf("文件中没有记录\n");
    }
    else
    {
        show();
    }
    if((fp=fopen("data.txt","wb"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    printf("输入学生信息(y/n):");
    scanf("%s",ch);
    while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
    {
        printf("number:");
        scanf("%d",&stu[m].num);
        for(i=0;i<m;i++)
            if(stu[i].num==stu[m].num)
            {
                printf("number已经存在,按任意键继续");
                getch();
                fclose(fp);
                return;
            }
        printf("name:");
        scanf("%s",stu[m].name);
        printf("elective:");
        scanf("%lf",&stu[m].elective);
        printf("experiment:");
        scanf("%lf",&stu[m].experiment);
        printf("required course:");
        scanf("%lf",&stu[m].required);
        stu[m].sum=stu[m].elective+stu[m].experiment+stu[m].required;
        if(fwrite(&stu[m],LEN,1,fp)!=1)
        {
            printf("不能保存!");
            getch();
        }
        else
        {
            printf("%s 被保存!\n",stu[m].name);
            m++;
        }
        printf("继续?(y/n):");
        scanf("%s",ch);
    }
    fclose(fp);
    printf("OK!\n");
}
void search()  //查找学生信息 
{
    FILE *fp;
    int snum,item,i,m=0;
    char sname[15];  
    if((fp=fopen("data.txt","rb"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))
        if(fread(&stu[m],LEN,1,fp)==1)
                m++;
    fclose(fp);
    if(m==0)
    {
        printf("文件中没有记录!\n");
        return;
    }
   printf("----------------------\n");
   printf("-----1.按学号查询-----\n");
   printf("-----2.按姓名查询-----\n");
   printf("-----3.退出本菜单-----\n");
   printf("----------------------\n");
   while(1)
   {
      printf("请选择子菜单编号:");
      scanf("%d",&item);
      switch(item)
        {
        case 1:
           printf("请输入要查询的学生的学号:\n");
           scanf("%d",&snum);
           for(i=0;i<m;i++)
           {
               if(snum==stu[i].num)
               {
                  printf("number\tname\telective\texperiment\trequired\tsum\t\n");
                  printf("--------------------------------------------------------------------\n");
                  printf(FORMAT,DATA);
                  break;
                 }
                   if(i==m)
                    printf("该学号不存在!\n");
           }
          break; 
        case 2:
           printf("请输入要查询的学生的姓名:\n");
           scanf("%s",&sname);
           for(i=0;i<m;i++)
           {
                   if(sname==stu[i].name)
               {
                  printf("number\tname\telective\texperiment\trequired\tsum\t\n");
                     printf("--------------------------------------------------------------------\n");
                     printf(FORMAT,DATA);
                     break;
                 }
             if(i==m)
                printf("该姓名不存在!\n");
                 }
           break;
        case 3:
           return;
        default:printf("请在1-3之间选择\n");
        }
    }
}
void del()  //删除学生信息 
{
    FILE *fp;
    int snum,i,j,m=0;
    char ch[2];
    if((fp=fopen("data.txt","r+"))==NULL)  //判断文件是否存在
    {
        printf("文件不存在!\n");
        return; 
    }
    while(!feof(fp))
    {
        if(fread(&stu[m],LEN,1,fp)==1)
                m++;
    }
    fclose(fp);
    printf("请输入学生学号:\n");
    scanf("%d",&snum);
    for(i=0;i<m;i++)
    {
        if(snum==stu[i].num)
        {
            printf("找到了这一条记录,是否删除?(y/n)");
            scanf("%s",ch);
            if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)  //判断是否要进行删除 
            {
                for(j=i;j<m;j++)
                    stu[j]=stu[j+1];  //将后一个记录移到前一个记录的位置 
                     m--;  //记录的总数个数减1 
                if((fp=fopen("data.txt","wb"))==NULL)
                {
                    printf("文件不存在\n");
                    return;
                }
                for(j=0;j<m;j++)
                    if(fwrite(&stu[j],LEN,1,fp)!=1)
                    {
                        printf(" can not save!\n");
                        getch();
                    }
                fclose(fp);
                printf("删除成功!\n");
            }
            else 
            {
                printf("找到了记录,选择不删除!");
            }
            break;
        }
        else
        {
            printf("没有找到这名学生!\n");
        }
    }
}
void modify()//修改学生信息 
{
    FILE *fp;
    struct student t;
    int i=0,j=0,m=0,snum;
    if((fp=fopen("data.txt","r+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))
        if(fread(&stu[m],LEN,1,fp)==1)
                     m++;
    if(m==0)
    {
        printf("文件中没有记录!\n");
        fclose(fp);
        return;
    }
    show();
    printf("请输入要修改的学生 number: ");
    scanf("%d",&snum);
    for(i=0;i<m;i++)
        if(snum==stu[i].num)
        {
            printf("找到了这名学生,可以修改此学生信息!\n");
            printf("name:");
            scanf("%s",&stu[i].name);
            printf("elective:");
            scanf("%s",&stu[i].elective);
            printf("experiment:");
            scanf("%lf",&stu[i].experiment);
            printf("required course:");
            scanf("%lf",&stu[i].required);
            printf("修改成功!\n");
            stu[i].sum=stu[i].elective+stu[i].experiment+stu[i].required;
            if((fp=fopen("data.txt","wb"))==NULL)
            {
                printf("不能打开文件!\n");
                return;
            }
            for(j=0;j<m;j++)
                if(fwrite(&stu[j],LEN,1,fp)!=1)
                {
                    printf("不能保存文件!\n");
                    getch();
                }
            fclose(fp);
            break;
        }
    if(i==m)
    {
        printf("没有找到这名学生!\n");
    }
}
void insert()  /*自定义插入函数*/
{
    FILE* fp;
    int i,j,k,m=0,snum;
    if((fp=fopen("data.txt","r+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))
        if(fread(&stu[m],LEN,1,fp)==1)
                 m++;
    if(m==0)
    {
        printf("文件中没有记录!\n");
        fclose(fp);
        return;
    }
    printf("请输入想要插入位置(number):\n");
    scanf("%d",&snum);  /*输入要插入的位置*/
    for(i=0;i<m;i++)
        if(snum==stu[i].num)
            break;
    for(j=m-1;j>i;j--)
        stu[j+1]=stu[j];  /*从最后一条记录开始均向后移*/
    printf("现在请输入要插入的学生信息。\n");
    printf("number:");
    scanf("%d",&stu[i+1].num);
    for(k=0;k<m;k++)
        if (stu[k].num==stu[m].num)
        {
            printf("number已经存在,按任意键继续!");
            getch();
            fclose(fp);
            return;
        }
    printf("name:");
    scanf("%s",&stu[i+1].name);
    printf("elective:");
    scanf("%lf",&stu[i+1].elective);
    printf("experiment:");
    scanf("%lf",&stu[i+1].experiment);
    printf("required course:");
    scanf("%lf",&stu[i+1].required);
    stu[i+1].sum=stu[i+1].elective+stu[1+i].experiment+stu[i+1].required;
    printf("插入成功!按任意键返回主界面!");
    if((fp=fopen("data.txt","wb"))==NULL)
    {
        printf("不能打开!\n");
        return;
    }
    for(k=0;k<=m;k++)
        if(fwrite(&stu[k],LEN,1,fp)!=1)/*将修改后的记录写入磁盘文件中*/
        {
            printf("不能保存!");
            getch();
        }
    fclose(fp);
}
void order()  //排序 
{
    FILE *fp;
    struct student t;
    int i=0,j=0,m=0;
    if((fp=fopen("data.txt","r+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))
        if(fread(&stu[m],LEN,1,fp)==1)
                m++;
    fclose(fp);
    if(m==0)
    {
        printf("文件中没有记录!\n");
        return;
    }
    if((fp=fopen("data.txt","wb"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    for(i=0;i<m-1;i++)
        for(j=i+1;j<m;j++)
            if(stu[i].sum<stu[j].sum)
            {
                t=stu[i];
                stu[i]=stu[j];
                stu[j]=t;
            }
    if((fp=fopen("data.txt","wb"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    for(i=0;i<m;i++)
        if(fwrite(&stu[i],LEN,1,fp)!=1)
        {
            printf("%s 不能保存文件!\n");
            getch();
        }
    fclose(fp);
    printf("保存成功\n");
}
void total()//统计学生人数 
{
    int i,m=0;
    char ch[2];
    FILE *fp;
    if((fp=fopen("data.txt","a+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))
    {
        if(fread(&stu[m],LEN,1,fp)==1)
        {
            m++;
        }
    }
    printf("总人数为%d",m);
}
void show()//显示 
{
    FILE *fp;
    int i,m=0;
    fp=fopen("data.txt","rb");
    while(!feof(fp))
    {
        if(fread(&stu[m],LEN,1,fp)==1)
            m++;
    }
    fclose(fp);
    printf("number\tname\telective\texperiment\trequired\tsum\t\n");
    for(i=0;i<m;i++)
    { 
        printf(FORMAT,DATA);
    }
}
 

 

 

 

查找学生信息时无法用姓名实现正确查找 想知道search里的哪一步出了问题..

  • 写回答

2条回答 默认 最新

  • yinjm_316 2020-12-16 16:10
    关注

    字符串比较用strcmp

    if(sname==stu[i].name)

     ↓

    if (strcmp(sname, stu[i].name) == 0)

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

报告相同问题?