В заданном массиве строк найти все слова, содержащие заданное количество гласных букв, и вывести их - C (СИ)
Формулировка задачи:
Решение задачи: «В заданном массиве строк найти все слова, содержащие заданное количество гласных букв, и вывести их»
#include <stdio.h>
#include <string.h>
int is_vowels(const char* s, int n){
int k, j;
static char cs[26];
static const char* i = NULL;
if(i == NULL){
memset(cs, 0, sizeof(cs));
for(i = "AEIOUY"; *i; ++i)
cs[*i - 'A'] = 1;
}
for(j = 0; *s; ++s){
k = *s & 0xDF;
if(k >= 'A' && k <= 'Z'){
if(cs[k - 'A'])
++j;
}
}
return (j == n);
}
int main(void){
int n, i;
char* w[] = {
{"ESI"}, {"EBX"}, {"EDI"}, {"EAX"}, {"ESP"}, {"EBP"}, {"EDX"}, {"ECI"}
};
n = sizeof(w)/sizeof(w[0]);
//вывести слова с двумя гласными
for(i = 0; i < n; ++i){
if(is_vowels(w[i], 2))
printf("%s ", w[i]);
}
putchar('\n');
//вывести слова с одним гласным
for(i = 0; i < n; ++i){
if(is_vowels(w[i], 1))
printf("%s ", w[i]);
}
return 0;
}
Объяснение кода листинга программы
В данном коде на языке C реализована функция is_vowels, которая принимает на вход два параметра: строку s и число n. Функция проверяет, содержит ли строка s заданное количество гласных букв (гласными считаются буквы A, E, I, O, U, Y). В функции используется массив cs, который содержит булевые значения для каждой буквы алфавита: если значение равно 1, то буква является гласной. В начале функции, если массив cs еще не инициализирован, он инициализируется значением 0. Затем происходит проверка каждой буквы строки s на принадлежность к гласным буквам. Если функция is_vowels возвращает значение 1, значит строка s содержит заданное количество гласных букв. В функции main создается массив строк w, содержащий несколько слов. Затем выполняется два прохода по массиву w: первый проход выводит на экран слова с двумя гласными буквами, второй проход выводит слова с одной гласной буквой. Пример вывода на экран: ESI EBX EBP ECI