一 请问大家用c语言写一个判断主ID和马甲的程序
题目:
1.输入格式
输入一个偶数n(0<=n<=20),紧接着有n行信息,每行由两个字符串组成:
BBS_ID IP_Address
BBS_ID只包含小写字母,长度不超过12,IP_Address是该ID的IP地址,格式为“A.B.C.D”,其中A,B,C,D是0-255范围内的整数。每一个IP地址正好对应两个BBS_ID,首次出现的ID为主ID,后面出现的为马甲。
当程序输入n为0时表示结束。
2.输出格式
对于每一个测试用例,输出n/2行,输出要求按main_ID升序排列。每一个测试用例后应该输出一个空行。
比如输入
8
inkfish 192.168.29.24
zhi 192.168.29.235
magicpig 192.168.50.170
pegasus 192.168.29.235
iamcs 202.116.77.131
finalBob 192.168.29.24
tomek 202.116.77.131
magicduck 192.168.50.170
4
mmmmmm 172.16.72.126
kkkkkk 192.168.49.161
llllll 192.168.49.161
nnnnnn 172.16.72.126
0
输出
tomek is the MaJia of iamcs
finalBob is the MaJia of inkfish
magicduck is the MaJia of magicpig
pegasus is the MaJia of zhi
llllll is the MaJia of kkkkkk
nnnnnn is the MaJia of mmmmmm
代码(在最新版本VS里验证通过&&解法看注释):
#include<stdio.h> #include<string.h> #include<stdlib.h> struct ID { char main_ID[15]; char MaJia[15]; char IP_Address[20]; }AllBBS[22]; /*will be used in sort the strcut array as compare function*/ int cmp(const void *a,const void *b) { struct ID *aa=(struct ID *)a; struct ID *bb=(struct ID *)b; return strcmp(aa->main_ID,bb->main_ID); } int main() { /*input redirect to debug\\input.txt file*/ freopen("debug\\input.txt","r",stdin); /* n is the number of BBS_ID, begin the last index of IP info */ int n,begin=0; char tempID[15],tempIP_Address[20]; while(scanf("%d",&n),n!=0) { begin=0; for(int index=0;index<n;index++) { scanf("%s %s",tempID,tempIP_Address); int findedIP=-1; /*fist search the existing array , try to find the esixting IP*/ for(int i=0;i<begin;i++) { if (strcmp(AllBBS[i].IP_Address,tempIP_Address)==0) // find the existing IP { findedIP=i; strcpy(AllBBS[i].MaJia,tempID); } } /* not find the existing IP , add a new one*/ if(findedIP==-1) { strcpy(AllBBS[begin].main_ID,tempID); strcpy(AllBBS[begin].IP_Address,tempIP_Address); begin++; } } /*sort the array according to Main_ID*/ qsort(AllBBS,begin,sizeof(AllBBS[0]),cmp); for (int i = 0; i < begin; i++) { printf("%s is the MaJia of %s\n",AllBBS[i].MaJia,AllBBS[i].main_ID); } printf("\n"); } return 0; }
关键字搜索
题目:
我们可爱的新网站具有了全新的搜索功能,使用了2个通配符“*”和“?”,其中“*”表示0或者多个小写字母,“?”代表1个字母。
当我们输入一个关键字的时候,我们在不确定的地方就使用通配符。我们在数据库里面有多条记录,每条记录都是由小写字母组成,现在给出一个关键字,你能告诉我数据库里面有多少条与关键字相匹配的记录吗?
例如: 如果关键字是j*y*m*y?,那么jiyanmoyu,jyanmoyu,jymyu都是相匹配的记录。
Input
多组测试数据,小于20组。
对于每组测试数据,第一行是输入的关键字,接下是数据库里面的所有记录的条数n,1<=n<=10000,每条记录的长度不超过50个小写字母。
Output
对于每组测试数据,输出与关键字想匹配的总记录条数,占一行。
Sample Input
jiyanmoyu
2
jiyanmoyu
huyanluanyu
ji*moy?
3
jiyanmoyu
jimoyu
huyanluanyu
Sample Output
1
2
代码(在最新版本VS测试成功 &&解法看注释):
#include<stdio.h> #include<string.h> #include<stdlib.h> bool map(char *key, int keyI,char *tc, int tcI) { if(tc[tcI]=='\0') { if(key[keyI]=='\0' || key[keyI]=='*' ) { return true; } return false; } switch (key[keyI]) { case '?': return map(key,keyI+1,tc,tcI+1); /*one key, one TC*/ case '*': return map(key,keyI+1,tc,tcI) || map(key,keyI,tc,tcI+1)|| map(key,keyI+1,tc,tcI+1);/*0 OR 1+ OR 1 */ default: return (key[keyI]==tc[tcI]) && map(key,keyI+1,tc,tcI+1); } } int main() { /*input redirect to debug\\input.txt file*/ freopen("debug\\input.txt","r",stdin); char key[55],tc[55]; int n=0,total=0; while(scanf("%s",key),key[0]!='\0') { scanf("%d",&n); total=0; for (int i = 0; i < n; i++) { scanf("%s",tc); if(map(key,0,tc,0)==true) { //printf("%s\n",tc); total++; } } printf("%d\n",total); key[0]='\0'; } return 0; }