Подсчитайте количество гласных в строке - PullRequest
1 голос
/ 31 мая 2011

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

#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', '\0'}, 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] == '\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, &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(&vowels[1], set);
        }

    return(ans);
}

Ответы [ 6 ]

3 голосов
/ 31 мая 2011

В коде 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

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

1 голос
/ 17 июля 2016
#include <stdio.h>



int vowel(char str[],int k)
{
int count = 0;
while(str[k]!='\0')
{
    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));
}
1 голос
/ 31 мая 2011

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

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

/* int is_vowel(const char *vowels, const char *set); */
int is_vowel(const char *vowels, int ch);
0 голосов
/ 26 августа 2016

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

def гласных (ей):

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«

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

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

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

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

0 голосов
/ 31 мая 2011

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

#define VOWELS "aeiouAEIOU"

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

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

        return i;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...