题目,假设要在人群中找一位领袖,领袖的相关信息有,他的眼睛是绿色的,如果他长着红头发,名字至少两个连续字母相同,如果戴眼镜的话,名字中 有且仅有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
函数检查他们是否是领袖。
//如果找到领袖,打印领袖的名字并设置leaderFound
为true
,然后退出循环。
//如果遍历完所有人都没有找到领袖,打印提示信息。
//返回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
,表示这个人符合所有条件,是领袖。