題目描述
在數據庫的操作過程中,我們進場會遇到檢索操作。這個題目的任務是完成一些特定格式的檢索,並輸出符合條件的數據庫中的所有結果。
我們現在有一個數據庫,維護了學生的姓名(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;
}
}
}