c语言 在两个英语句子中寻找最大的共同单词并返回其长度 简单版

题目:

编写一个程序,输入两个英文句子,每个句子里英文单词之间用空格分割,最后输出两者的最长公共单词

思路:

切分两个句子为一个一个的单词,分别存放到两个可以容纳很多单词的结构体数组中,并且结构体还可以存放这个单词的长度

然后拿第一句话中的单词和第二句话中的单词一一做对比即可

#include<stdio.h>
#include<string.h>
typedef struct{//定义一个结构体,存放单词和其单词对应的长度
    char w[15];
    int len;
}words;

typedef struct{//定义一个存放最长单词信息的结构题题
    char a[15];
    int maxlen;
}maxone;

void replace(char a[])//替换函数,将句子当中的标点符号换成空格
{
    for(int i=0;a[i]!='\0';i++)
        if(a[i]=='.')
            a[i]=' ';
}
void cut(words one[],char a[])//切分函数,将句子中的单词切分出来放到words结构题当中保存
{
    for(int i=0,j=0;a[i]!='\0';i++)//i在a中循环,j在one中循环,k在one.a中循环
    {
        int k=0;
        while(a[i]!=' ')//以空格为一个单词的做区分
            one[j].w[k++]=a[i++];//单词中的字母挨个存放到one数组的每个保存单词的字符串当中
        one[j].w[k]='\0';//给最后一项给一个结束符号,上述方法编译系统不会主动添加结束符号
        one[j].len=(int)strlen(one[j].w);//获取单词的长度放到单词的长度len变量当中保存
        //此时,w得到一个单词,而a[i]遇到空格,通过for循环里面的i++跳过空格
        ++j;//结构体数组换到下一个,来保存下一个单词的信息
    }
}
int show(words word[])//显示单词并返回这个结构题当中保存了多少个单词
{
    int cnt=0;//计数器设为0
    for(int i=0;i<10;i++)
        if(word[i].len){//若长度不为0则认为是有效的单词
            ++cnt;//计数器自加
            printf("%s\t",word[i].w);//显示这个单词
        }
    return cnt;//返还结构体数组中保存了多少个单词
}
maxone find(words one[], words two[],int len_one,int len_two)//寻找共同的最大长度的单词
{
    maxone MAX;//定义一个maxone型结构体保存最大单词的长度
    MAX.maxlen=0;//首先初始化最大单词的长度为1
    for(int i=0;i<len_one;i++)//遍历one,那one中的单词和two一一对比
        for(int j=0;j<len_two;j++)//用two的每一个单词和one[i]做对比
            if(!(strcmp(one[i].w, two[j].w)))//若发现单词一样
                if(MAX.maxlen<one[i].len)//并且长度还大于已知的最大长度
                {
                    strcpy(MAX.a,one[i].w);//将找到的最大的共通单词放入MAX结构体中保存
                    MAX.maxlen=one[i].len;
                }
    return MAX;//返还最大的单词的信息
}
int main(){
    char a[]="hello everyone this is micheal here and please.";
    char b[]="hello everybody this is edward here and please go on.";
    words one[10];//执行cut函数,将切分好的单词放到one当中
    words two[10];//同理,切分好以后放入two中
    
    replace(a);//移除句子中的句号
    replace(b);
    
    for(int i=0;i<10;i++)//初始化每一个结构体中的变量
    {
        one[i].w[0]='1';
        one[i].len=0;
        two[i].w[0]='1';
        two[i].len=0;
    }
    cut(one, a);//执行切分函数,切好的单词和单词对应的长度放入结构体中保存
    cut(two, b);
    
    int len_one=show(one);//获得one中有效的单词的个数
    printf("\n");
    int len_two=show(two);//同理
    
    printf("\nlen_one=%d\n",len_one);//检验切分的单词数量是否正确
    printf("len_one=%d\n",len_two);
    
    maxone MAX=find(one, two, len_one, len_two);//通过比对获得最长的单词的数量
    printf("%s\n%d\n",MAX.a,MAX.maxlen);
}

 

运行截图:

 

posted @ 2020-08-31 16:56  雾漫大武汉  阅读(808)  评论(0编辑  收藏  举报