一、题意
二、解答过程
思路:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct student//用于表示学生的结构体 { char sno[100];//学号 char name[100];//姓名 char sex[10];//性别 int age;//年龄 //结构体内嵌的比较函数 bool operator < (const student &b) const//比较函数,使其能够进行sort函数排序 { return strcmp(sno,b.sno)<0; } }buf[1000]; int main() { int n,m; char x[100]; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%s %s %s %d",&buf[i].sno,&buf[i].name,&buf[i].sex,&buf[i].age); } sort(buf,buf+n);//对数组排序,使其按照学号升序排序 scanf("%d",&m); while(m--!=0) { int ans=-1; scanf("%s",&x);//输入待查找学号 int top=n-1,base=0;//开始下标为0,结束下标为n-1,查找整个数组 int cnt=1; while(top>=base) { int mid=(top+base)/2;//计算中间点下标 int tmp=strcmp(buf[mid].sno,x);//比较中间学号与目标学号 if(tmp==0) { ans=mid; break;//若相等则完成跳出二分查找 } else if(tmp<0)base=mid+1;//若小于,则开始下标变为中间节点后一个点坐标 else top=mid-1;//若大于,则结束下标变为中间节点前一点下标 printf("%d\t",mid); printf("%d\t",cnt++); } if(ans==-1)printf(" not find");//查找失败 else printf("%s %s %s %d\n",buf[ans].sno,buf[ans].name,buf[ans].sex,buf[ans].age); } } }