解题思路:
首先定义一个字符数组用来存放 'a', 'e', 'i', 'o', 'u' 五个元音字母,并用一个长度为5的整型数组 a 与五个元音字母对应,控制元音字母的输出

举个栗子:若 a [0] != 0,则表示输入的字符串中有 ' a ' 这个字母,所以输出 ' a ' ,否则不输出 ' a ' ,依此类推,这样就省去了排序的过程

我们要将数组 a [5] 初始化全为 0 ,然后对输入的字符串中的字符挨个判断是否为元音字母,若是就将数组中对应的数字赋值为 1 就可以了

这样的话我们不仅要知道字符是否为元音字母,还要知道是哪一个元音字母,我们可以写五个i f 语句,像这样:

if (s[i] == 'a')
    a[0] = 1;
else if (s[i] == 'e')
    a[1] = 1;
else if (s[i] == 'i')
    a[2] = 1;
else if (s[i] == 'o')
    a[3] = 1;
else if (s[i] == 'u')
    a[4] = 1;

但是这样太长了,所以我非常骚气地把代码改成了这样:

if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')        //判断字符是否为元音字母
{
    int index = (s[i] > 'a') + (s[i] > 'e') + (s[i] > 'i') + (s[i] > 'o');          //利用逻辑运算获得a的下标
    a[index] = 1;
}

每一个逻辑运算的结果都是用 0 或 1 表示的,所以经给四次比较的结果相加就能得到我们想要的数组下标

但是我很快发现,虽然代码变短了,但对于计算机来说,事情变得更复杂了,好像是多此一举了……


参考代码:

#include <stdio.h>
 
int main()
{
    char s[101];                                //定义输入的字符串
    char vowels[6] = {'a', 'e', 'i', 'o', 'u'}; //定义元音字母数组
    int a[5] = {0};                             //定义控制输出数组,初始化全为0
    gets(s);                                    //输入字符串
    for (int i = 0; s[i] != '\0'; i++)          //循环字符串到结尾符
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') //判断字符是否为元音字母
        {
            int index = (s[i] > 'a') + (s[i] > 'e') + (s[i] > 'i') + (s[i] > 'o');  //利用逻辑运算获得a的下标
            a[index] = 1;                                                           //令a[index]=1,表示存在对应的元音字母
        }
    }
    for (int i = 0; i < 5; i++)
    {
        if (a[i])                    //若a[i]!=0
            printf("%c", vowels[i]); //输出对应的元音字母
    }
    return 0;
}


点赞(0)
 

0.0分

19 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 6 条评论

1年前 回复TA
@詹鸿培 index是为了求下标
2年前 回复TA
如果字符串长度超过100多呢?
ityyds 3年前 回复TA
为何不用循环判断呢?
詹鸿培 3年前 回复TA
@詹鸿培 我是问a[index] = 1
CodeRookie 3年前 回复TA
@詹鸿培 这句前面的if语句只判断了是否为元音字母,但是不知道是哪个字母,所以我用逻辑运算来计算字母对应数组的下标,你试着看下我代码前写的,应该能明白
詹鸿培 3年前 回复TA
int index = (s[i] > 'a') + (s[i] > 'e') + (s[i] > 'i') + (s[i] > 'o');  //利用逻辑运算获得a的下标
            a[index] = 1;                                                           //令a[index]=1,表示存在对应的元音字母
这个是什么意思