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; 
		}
	}
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章