291. 数据库检索-软件14 //字符串格式控制

题目描述
在数据库的操作过程中,我们进场会遇到检索操作。这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果。
我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex)以及出生日期(Birthday)。其中,Name项是长度不超过30的字符串,只可能包含大小写字母,没有空格;Sex项进可能为‘Male’或者‘Female’(不含引号);Birthday项以yyy/mm/dd的格式存储,如:1990/01/01,
1991/12/31,等等。
每个查询所可能包含的条件如下:
Name=‘REQUIRED_NAME’,查询姓名为REQUIRED_NAME的学生,其中REQUIRED_NAME为长度在1到30之间的字符串;
Sex=‘Male’或Sex=‘Female’,查询性别为男/女的学生;
Birthday=‘yyy/mm/dd’,查询出生年/月/日为特定值的学生。如果其中某项为’*’, 说明该项不受限制。例如,'1990/06/*‘表示1990年6月出生,’*/03/*'表示出生月份为3月。
给定数据库的所有表项以及若干条查询,你需要对每条查询输出它返回的结果。

输入格式
输入包含多组测试数据。输入的第一行为测试数据的组数T(1<=T<=50)。
对于每组测试数据,第一行是两个整数N和M(N,M<=500),分别表示数据的数量以及查询的数量。
接下来N行,每行以Name Sex Birthday的形式给出每个学生的信息。
没下来M行,每行给出若干条限制条件,以空格隔开。条件以Name Sex Birthday的顺序给出(如果存在),且每种限制条件最多只出现一次。

输出格式
对于每条查询,按照输入的顺序输出符合条件的学生姓名,每个一行。如果没有符合查询的信息,则输出一行NULL。

样例输入

1
5 6
Michael Male 1990/02/28
Amy Female 1992/04/03
Tom Male 1991/12/15
Lynn Female 1991/04/09
Zheng Male 1990/04/20
Name='Amy'
Name='Betty'
Sex='Female' Birthday='*/04/09'
Sex='Female' Birthday='*/*/*'
Name='Michael' Sex='Female'
Name='Michael' Sex='Male' Birthday='1990/02/*'

样例输出

Amy
NULL
Lynn
Amy
Lynn
NULL
Michael

AC代码:

#include<bits/stdc++.h>
using namespace std;
struct student
{
	string name,sex,bir[3];
}st[503];
int main()
{
	int t,n,m,i,j;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		string name,sex,bir[3];
		char name1[33],sex1[10],bir1[3][10],s1[3][33],s[103];
		
		for(i=0;i<n;++i)
		{
			
			//cin>>name>>sex; 本题要用scanf、sscanf与printf搭配,不能与cout混用,否则会超时 
			scanf("%s %s %[^/]/%[^/]/%s",name1,sex1,bir1[0],bir1[1],bir1[2]);
			st[i].name=name1;
			st[i].sex=sex1;
			st[i].bir[0]=bir1[0];
			st[i].bir[1]=bir1[1];
			st[i].bir[2]=bir1[2];
			//cout<<name<<" "<<sex<<" "<<bir[0]<<" "<<bir[1]<<" "<<bir[2]<<endl;
		}
		getchar();
		for(i=0;i<m;++i)
		{
			//string s;
			
			memset(name1,0,sizeof(name1));//初始化char数组 
			memset(sex1,0,sizeof(sex1));
			memset(bir1,0,sizeof(bir1));
			gets(s);
			int l=sscanf(s,"%s %s %s",s1[0],s1[1],s1[2]);
			//int n1=0,s1=0,b1=0;
			for(j=0;j<l;++j)
			{
				if(s1[j][0]=='N')
				{
					//n1=
					sscanf(s1[j],"Name='%[^']'",name1);//%[^x]表示到x之前的字符串 
				}
				if(s1[j][0]=='S')
				{
					sscanf(s1[j],"Sex='%[^']'",sex1);
				}
				if(s1[j][0]=='B')
				{
					sscanf(s1[j],"Birthday='%[^/]/%[^/]/%[^']'",bir1[0],bir1[1],bir1[2]);
				}
			}
			//sscanf(s.c_str(),"Name='%s' Sex='%s' Birthday='%s/%s/%s'",name1,sex1,bir1[0],bir1[1],bir1[2]);
			//cout<<i<<endl;
			//cout<<name1<<" "<<sex1<<" "<<bir1[0]<<" "<<bir1[1]<<" "<<bir1[2]<<endl;
			name=name1;
			sex=sex1;
			string bir2[3];
			bir2[0]=bir1[0];
			bir2[1]=bir1[1];
			bir2[2]=bir1[2];
			//cout<<name<<" "<<sex<<" "<<bir2[0]<<bir2[1]<<bir2[2]<<endl;
			int k=1;
			for(j=0;j<n;++j)
			{
				if((name==st[j].name||name=="")&&(sex==st[j].sex||sex=="")//""代表空字符串 
				&&(bir2[0]==st[j].bir[0]||bir2[0]==""||bir2[0]=="*")
				&&(bir2[1]==st[j].bir[1]||bir2[1]==""||bir2[1]=="*")
				&&(bir2[2]==st[j].bir[2]||bir2[2]==""||bir2[2]=="*"))
				{
					//cout<<st[j].name<<endl;
					printf("%s\n",st[j].name.c_str());
					k=0;
					//break;
				}
				
			}
			if(k)printf("NULL\n");//cout<<"NULL"<<endl; 
		}
	}
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值