问题描述:
小明对类似于hello这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。(元音字母包括a,e,i,o,u,共五个,其他均为辅音字母。)
输入格式:
输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式:
输出答案,或者为yes,或者为no。
样例输入:lanqiao
样例输出:yes
样例输入:world
样例输出:no
思路:根据题意应有四段,先从前往后按顺序找出辅音、元音、辅音、元音四段的开头下标,然后从第四段(元音)开头往后找,如果此后再出现了辅音,那么就no,否则为yes。
代码:
#include<stdio.h>
#include<string.h>
int t;
int fuyin(int t);
int main()
{
int i,j,k,l;//先把该定义的都定义了
int c,d,e;
char a[100];//单词嘛,所以定义char类型的数组
scanf("%s",a);
int x[100]={0};//定义整型数组,把char数组转为int数组处理,毕竟看int舒服一点
for(i=0;i<strlen(a);i++)//利用ASCII码表将a数组元素一个一个得放进x
{
x[i]=(int)a[i];
}
/*
*转换好了是吧,分为四段,
*依次找出每一段开头
*从第四段开头往后找,若出现了辅音,那这单词就no了
*否则就是yes
*/
for(i=1;i<strlen(a);i++)//strlen计算字符串长度,要加相应头文件
{
if(fuyin(x[0])==0||fuyin(x[strlen(a)-1])==1)//如果第一段元或最后一段辅,直接pass
{
printf("no");
break;
}
else
{
if(fuyin(a[i])==0)//上个if判断了第一个字母是辅音,那么下面就找元音
{
c=i;//查找并记录从前往后找到的第一个元音所在下标
for(j=c;j<strlen(a);j++)
{
if(fuyin(a[j])==1)//从元音部分向后找辅音的
{
d=j;//c和d分别记录向后找到的第二段和第三段的开头
for(k=d;k<strlen(a);k++)
{
if(fuyin(a[k])==0)//第三段后找元音,也就是第四段开头
{
e=k;
//如果此时再往后还能找到辅音的话,则错误
for(l=e;l<strlen(a);l++)
{
if(fuyin(a[l])==1)//表示第四段中夹杂辅音
{
printf("no");
break;
}
if(l==strlen(a)-1)//表示已经到达最后一个元素,这在之前已经判断过
{
printf("yes");
break;
}
}
break;
}
}
break;
}
}
}
}
}
return 0;
}
int fuyin(int t)//判断是否为辅音(别在意这通俗易懂的函数名)
{
if(t!=97&&t!=101&&t!=105&&t!=111&&t!=117)//元音字母对应的ASCII码
{
return 1;//辅音返回1
}
else
{
return 0;//元音返回0
}
}
测试1:
测试2:
写在末尾:中间转int数组其实是完全可以去掉的,加上了反而增加运行时间。我再好好练练char数组的使用吧。。。