第十题 二分查找 还是有好多错误

本文介绍了一个使用C++实现的学生信息结构体排序和查找的例子,通过定义结构体成员并重载小于运算符来实现排序功能,再利用二分查找法进行高效查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//这一题操作符又写错了
//bool operator<(const 结构体名字 & b)const{


//};
//这一题使用二分查找的原因在于N<1000不代表每一个学生的id不会大于1000
//使用打表法太耗内存
//strcmp函数的返回值不是bool!!!返回值小于零表示前面小,返回值为0表示相等
//以后使用strcmp的时候一定跟0比较之后放在if里面
//字符串赋值使用strcpy,直接赋值连门都没有
//二分查找的算法写错了。。。我就知道。。。
//以后给我记住了,二分的while()里面是l<=r
//二分判断之后l=mid+1;或者r=mid-1;不是直接赋值为mid!


#include <stdio.h>
#include <algorithm>
#include <string.h>


using namespace std;


struct stu{
    char no[100];
    char na[10];
    char se[10];
    int  ag;
    bool operator < (const stu & b)const {
        int tmp=strcmp(no,b.no);
        return tmp<0;
    }
}buf[1001];


int main()
{
    int n;
    int n2;
    while(scanf("%d",&n)!=EOF)
    {
        //这里求max其实没啥用就是用一下strcmp函数和strcpy函数
        char max[100]={0};
        for(int i=0;i<n;i++)
        {
            scanf("%s%s%s%d",&buf[i].no,&buf[i].na,&buf[i].se,&buf[i].ag);
            if(strcmp(max,buf[i].no)<0)//strcmp函数的返回值不是bool!!!返回值小于零表示前面小,返回值为0表示相等
            {
                strcpy(max,buf[i].no);
            }
        }


        sort(buf,buf+n);


//        for(int i=0;i<n;i++)
//        {
//            printf("%s%s%s%d\n",buf[i].no,buf[i].na,buf[i].se,buf[i].ag);
//        }
        scanf("%d",&n2);
        for(int i=0;i<n2;i++)
        {
            char tmp[100]={0};
            scanf("%s",&tmp);
            int l=0;
            int r=n-1;int mid;
            bool findtrue=0;
            while(l<=r)
            {
                mid=(l+r)/2;
                int tm=strcmp(buf[mid].no,tmp);
                if(tm<0)
                {
                    l=mid+1;
                }
                else if(tm>0)
                {
                    r=mid-1;
                }
                else
                {
                    printf("%s %s %s %d\n",buf[mid].no,buf[mid].na,buf[mid].se,buf[mid].ag);
                    findtrue=1;
                    break;
                }
            }
            if(!findtrue)
                printf("No Answer!\n");


        }
    }




    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值