题目描述
在数据库的操作过程中,我们进场会遇到检索操作。这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果。
我们现在有一个数据库,维护了学生的姓名(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;
}
}
}