油管视频《编程思维》中的题目,使用C语言编写出来,第二集,反抗

题目,假设要在人群中找一位领袖,领袖的相关信息有,他的眼睛是绿色的,如果他长着红头发,名字至少两个连续字母相同,如果戴眼镜的话,名字中 有且仅有2个元音,否则名字中会有三个元音,只有一人附和以上条件,请下达指令

涉及编程的基础原理

1,结构体的使用,用于存储每个人的信息

2,字符串的处理,检查名字中特定字符和条件,

3,条件判断,使用多重条件来判断出领袖

4,循环控制,遍历人群中每一个人,来寻找领袖

5,函数的使用,将一些逻辑分解为函数,方便代码组织和可读性

具体程序的编写

#include <stdio.h>

#include <string.h>

#include <stdbool.h> //包含了标准输入输出库,字符串库,和布尔类型库

typedef struct{

        int name[100];

        int eyeColor[10];

        int hairColor[10];

        bool wearsGlasses;

} Person;//定义一个结构体,来存储每一个人的基础信息

bool hasTwoConsecutiveLetters(const char *str);//申明函数,检查字符中是否有两个连续想通的字母,同时,bool表示返回类型为布尔值true or false,const表示只读不能修改,*str表示一个指向字符的指针,也表示一个字符串

int countVowels(const char *str);//计算字符串中的元音数量

bool isLeader(const char *p);//检查一个人是否符合领袖条件

int main() {
    Person people[] = {
        {"Alice", "green", "red", true},
        {"Bob", "blue", "black", false},
        {"Charlie", "green", "red", false},
        {"Dave", "green", "red", true},
        {"Eve", "green", "red", false}
    };//main函数中,定义若干个人群数据的数组,包含若干个Person结构体。

int numPeople=sizeof(people)/sizeof(people[0]);//用数组总字节数,除以单个元素字节数,得到元素个数

bool leadFound = false;//表示一开始领袖还没有找到

for(int  i=0;i<numPeople;i++){

        if(isLeader(&people[i])){//利用&取地址运算符,取出people中的元素,塞进一个执行person结构体的指针,输出一个布尔值

                printf("输出找到领袖:%s\n",numPeople[i].name);

                leaderFound = true;

                break;        }

        if(!leaderFound){

        printf("没有找到\n");

        }

return 0;

//使用for循环遍历人群中的每一个人,调用isLeader函数检查他们是否是领袖。

//如果找到领袖,打印领袖的名字并设置leaderFoundtrue,然后退出循环。

//如果遍历完所有人都没有找到领袖,打印提示信息。

//返回0表示程序正常结束。

bool hasTwoConsecutiveLetters(const,char,*str)

{

        for(int i=0;str[i]!='\0';i++){

        //'\0'因为字符的最后一位为\0因此,该意思为,让字符串挨个过完一遍

                if(str[i]==str[i+1]){

                return ture;}

        }

        return false;

}//这个函数检查字符串中是否有两个连续相同的字母。如果找到这样的字母,返回true,否则返回false

int countVowels(const char *str) {
    int count = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        char c = tolower(str[i]);//tolower是一个标准库函数,将字符转为小写,赋给变量c
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
            count++;//这里使用了大量的或,只有是元音,就加一
        }
    }
    return count;
}

计算名字中的元音个数

bool isLeader(const Person *p) {//这是函数的声明和定义。isLeader 函数接受一个指向 Person 结构体的指针 p 作为参数,并返回一个布尔值 (true 或 false)。

    if (strcmp(p->eyeColor, "green") != 0) {
        return false;
    }
    if (strcmp(p->hairColor, "red") == 0 && !hasTwoConsecutiveLetters(p->name)) {
        return false;
    }//使用 strcmp 函数比较 p 指向的 Person 结构体的 eyeColor 字符串和 "green" 字符串。如果 eyeColor 不是 "green"strcmp 返回一个非零值,表示不相等,函数立即返回 false,表示这个人不是领袖。使用 strcmp 函数比较 p 指向的 Person 结构体的 hairColor 字符串和 "red" 字符串。如果 hairColor 是 "red",且 p->name 中没有两个连续相同的字母(通过调用 hasTwoConsecutiveLetters 函数来检查),则函数返回 false,表示这个人不是领袖。

    int vowelCount = countVowels(p->name);
    if (p->wearsGlasses) {
        if (vowelCount != 2) {
            return false;
        }
    } else {
        if (vowelCount != 3) {
            return false;
        }
    }//检查 p 指向的 Person 结构体的 wearsGlasses 布尔值。如果 wearsGlasses 为 true(表示戴眼镜),则检查 vowelCount 是否等于 2。如果不是,函数返回 false。如果 wearsGlasses 为 false(表示不戴眼镜),则检查 vowelCount 是否等于 3。如果不是,函数返回 false

    return true;
}//如果通过了所有前面的检查,函数返回 true,表示这个人符合所有条件,是领袖。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值