Подсчитать количество гласных в строке

#c #string #recursion

#c #строка #рекурсия

Вопрос:

Я просто хочу посчитать гласные в строке, используя рекурсию, но это не работает.

 #include <stdio.h>
#include <string.h>

#define SETSIZ 10

#define TRUE 1
#define FALSE 0
int is_empty(const char *set);
int is_element(char vowel, const char *set);
int is_vowel(const char *vowels, const char *set);

int main(void)
{
    int count = 0,i;
    char vowels[11] = {'A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', ''}, set[SETSIZ] = "mustafa";
    for(i=0;i<strlen(set);i  ){
        if(is_vowel(vowels, set))
            count  =  1;
        }
    printf("%s has %d vowels",set, count);
    return(0);
}
int is_empty(const char *set)
{
    return(set[0] == '');
}
int is_element(char vowel, const char *set)
{
    int ans;
    if(is_empty(set))
        ans = FALSE;
    else if (vowel == set[0])
        ans = TRUE;
    else
        ans = is_element(vowel, amp;set[1]);
    return(ans);
}
int is_vowel(const char *vowels, const char *set)
{
    int ans, i = 0;

    if(is_empty(vowels))
        ans = FALSE;
    else if(is_element(vowels[0], set))
    {
        printf("**");
        ans = TRUE;
    }
    else
    {
        printf("--");
        ans = is_vowel(amp;vowels[1], set);
        }

    return(ans);
}
  

Комментарии:

1. В main вы перебираете set (который, по-видимому, не существует в этой области) и всегда передаете одно и то же в is_vowel . Вы никогда не используете счетчик циклов i .

2. set определяется в области прокрутки. Я тоже сначала думал, что это не было определено. К OP: @paranoidgnu — ограничить длину строки 80 символами 🙂

Ответ №1:

В вашем коде is_vowel есть проблема.

 int is_vowel(const char *vowels, const char *set)
{
int ans, i = 0;

if(is_empty(vowels))     //You are passing vowels which would never be empty.
    ans = FALSE;         //Replace it with set character pointer. 
//Rest of the code
  

Вся концепция, применяемая, кажется, неправильной, приятель .Я бы посоветовал вам переписать код.Во всем коде бесчисленное количество ошибок.

Ответ №2:

В main вашем цикле for вызывается is_vowel() несколько раз с точно такими же аргументами.

Возможно, вы захотите переписать функцию с помощью более простого прототипа:

 /* int is_vowel(const char *vowels, const char *set); */
int is_vowel(const char *vowels, int ch);
  

Ответ №3:

 #include <stdio.h>



int vowel(char str[],int k)
{
int count = 0;
while(str[k]!='')
{
    if(str[k] == 'a' || str[k] == 'e' || str[k] == 'i' || str[k] == 'o' || str[k] == 'u')
        return 1   vowel(str,k 1);
    else
        return 0  vowel(str,k 1);
}
return 0;
}
void main()
{
char x[50];
gets(x);
printf("%d",vowel(x,0));
}
  

Ответ №4:

  1. Вы не выполняете цикл set , как вам, вероятно, хотелось бы. Должно быть:

     if(is_vowel(vowels, amp;set[i]))
      
  2. Ваша функция is_element() абсолютно неверна, вы можете изменить ее на:

     int is_element(char vowel, const char *set)
    {
        return (vowel == set[0]);
    }
      

или даже передавать символы вместо указателей на символы.

Ответ №5:

Существует более простое решение вашей проблемы:

 #define VOWELS "aeiouAEIOU"

size_t vcount(const char *s)
{
        size_t i = 0;

        while (s amp;amp; *s) {
                if (strchr(VOWELS, *s))   i;
                  s;
        }

        return i;
}
  

Его можно легко преобразовать в рекурсивную версию.

Ответ №6:

Вы можете использовать этот код на python для подсчета количества гласных:

определить гласные (ы):

 if s == '':
    return 0   # no vowels in the empty string
elif s[0] in 'aeiouAEIOU':
    return 1   vowels( s[1:] )
else:
    return 0   vowels( s[1:] )
  

Вы также можете использовать переменную, такую как vowel_list=’aeiouAEIOU’