/*今天是北航2015年机试第三题,
题目,统计词语
输入一段含标点的英文语段,(若干行,以ctrl+z结束)
统计这段话中出现的所有词语(相同的词语只出现一次)
要求,按照字典顺序输出词语,每输出一个词换一行*/
#include<stdio.h>
char words[1000][50],words2[1000][50];
int length=0,length2=0;
//处理字符串的函数
int GetType(char c){
if(c>='a'&&c<='z'){
return 1;
}
if(c>='A'&&c<='Z'){
return 2;
}
if(c==','||c=='.'||c==' '){
return 3;
}
return -1;
}
//排序的法则,如果A单词在B单词之后,返回1
int shunxu(char a[],char b[]){
int i=0,j=0;
while(a[i]!='\0'){
if(b[i]!='\0'){
if(a[i]>b[i]){
return 1;
}
else if(a[i]==b[i]){
i++;
}
else if(a[i]<b[i]){
return 0;
}
}
else
return 1;
}
if(b[i]!='\0')
return 0;
}
//排序函数
void paixu(){
int i=0,j=0;
char temp[50];
for(i=0;i<length-1;i++)
for(j=i+1;j<length;j++){
if(shunxu(words[i],words[j])){
strcpy(temp,words[i]);
strcpy(words[i],words[j]);
strcpy(words[j],temp);
}
}
}
//去重函数
void quchong(){
int i=0,j=0;
for(i=1;i<length;i++){
if(strcmp(words[i],words[i-1])!=0){
strcpy(words2[j++],words[i]);
length2++;
}
}
}
void HandleStr(char c[]){
int i=0,m=0,n=0;
while(c[i]!='\0'){
switch(GetType(c[i])){
case 2:c[i]=c[i]+32;//化成小写字母
case 1:words[m][n]=c[i];
n++;
i++;
break;
case 3:if(GetType(c[i-1])==1||GetType(c[i-1])==2){
words[m][n]='\0';
m++;
n=0;
}i++;
break;
case -1:i++;break;
}
}
length=m;
}
void main(){
int i;
char str[1000000]="",s[1024];
while(gets(s)!=NULL){//以ctrl+z结尾的真正含义。scanf("%s",s)!=EOF)
strcat(str,s);
}
strcat(str,"\0");
HandleStr(str);
paixu();
quchong();
for(i=0;i<length2;i++){
puts(words2[i]);
}
}
//英文单词以‘ ’隔开