题目描述:
输入一个字典(用******结尾),然后再输入若干单词w,你
都需要在字典中找出所有的w的字母重排后得到的单词,并按照字典序冲销到大的
顺序在一行中输出(如果不存在,输出:()。输入单词之间用空格或则空行隔开,
且所有的输入单词都由不草果6个字母组成,注意字典的单词不一定按照字典的书序排列
都需要在字典中找出所有的w的字母重排后得到的单词,并按照字典序冲销到大的
顺序在一行中输出(如果不存在,输出:()。输入单词之间用空格或则空行隔开,
且所有的输入单词都由不草果6个字母组成,注意字典的单词不一定按照字典的书序排列
样例输入
tarp given score refund only trap work carn work earn course pepper part
******
resco nfudre aptr sett oresuc
tarp given score refund only trap work carn work earn course pepper part
******
resco nfudre aptr sett oresuc
样例输出
score
refund
part tarp trap
:(
course
分析:
1.首先,是要将字典里的单词按照字典序,记为word[i],这可以写一个字符串比较函数cmp,利用库函数中的qsort(数组,元素个数,每个元素空间(sizeof(char),自己写的比较函数))。
对于比较函数cmp 有固定的格式,而字符串比较,直接利用strcmp函数作为比较方法即可
int cmp(const void *p1,const void *p2)
{
return strcmp((char *)p2,(char *)p1);
}
2.接着对于字典中的单词,每一个元素内部都要进行字典排序记为sorted[i],例如“tape”排完序后为“aept”,还要写个字符比较函数直接比较字符的ascii值即可,依旧利用qsort。
3.用上一个方法对输入的字符串的数组str进行字符的字典排序。
4.依次比较输入的字符str和sorted[i],若相同,说明输入字符的某种排列能形成word[i].
5.直接输出匹配的word[i],并继续比较,直至结束。
1 #include<stdio.h> 2 #include<math.h> 3 #include<assert.h> 4 #include<string.h> 5 #include<stdlib.h> 6 char word[2000][10],sorted[2000][10]; 7 int n;//字典单词个数 8 9 int cmp_char(const void* _a,const void* _b)//单个字符比较 10 { 11 char* a=(char*)_a; 12 char* b=(char*)_b; 13 return *a-*b; 14 } 15 16 int cmp_string(const void* _a,const void* _b) 17 { 18 char* a=(char*)_a; 19 char* b=(char*)_b; 20 return strcmp(a,b); 21 } 22 int main() 23 { 24 n=0; 25 while (scanf("%s",word[n])!=EOF)//读入 26 { 27 if(word[n][0]=='*') 28 break; 29 n++; 30 } 31 qsort(word,n,sizeof(word[0]),cmp_string);//对单词进行 32 for(int i=0;i<n;i++) 33 { 34 strcpy(sorted[i],word[i]); 35 qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char); 36 } 37 char s[10]; 38 while(scanf("%s",s)==1) 39 { 40 qsort(s,strlen(s),sizeof(char),cmp_char); 41 int found=0; 42 for(int i=0;i<n;i++)//继续找 43 if(strcmp(sorted[i],s)==0) 44 { 45 found=1; 46 printf("%s",word[i]); 47 } 48 if(!found)printf(":("); 49 printf("\n"); 50 } 51 return 0; 52 }