1069查找学生信息

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct Student{//表示学生个体的结构体 
	char no[100];//学号
	char name[100];//姓名
	int age;//年龄
	char sex[5];//性别
	bool operator< (const Student &A) const {//重载小于运算符使其能使用sort函数
	//进行排序 
		 return strcmp (no,A.no)<0;
	} 
}buf[1000];
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++)
		   scanf("%s%s%s%d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
        sort(buf,buf+n);//对数组排序使其按照学号升序排列
		int t;
		scanf("%d",&t);//有t组询问 
		while(t--!=0){//while循环保证查询次数为1
		      int ans=-1;//目标元素下标,初始化为-1
			  char x[30];
			  scanf("%s",x);//待查找学号
			  int top=n-1,base=0;//初试时,开始下标为0,结束下标n-1,查找子集为整个数组
			  while(top>=base){//当查找子集不为空集时重复二分查找
			  		int mid=(base+top)/2;//计算中间点下标
					int tmp=strcmp(buf[mid].no,x);//比较中间点学号与目标学号
					if(tmp==0){
						ans=mid;
						break;//若相等,则查找完成跳出二分查找 
					} 
					else if(tmp>0) top=mid-1;//若大于,则结束下标变为中间点前一个点下标
					else base=mid+1;//若小于,则开始点下标变为中间点后一个点坐标 
		     }
			 if(ans==-1){//若查找失败 
			 	printf("No Answer!\n");
			 } 
		     else printf("%s%s%s%d",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);
		} 
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值