2011-05-31 64 views
1

我只想使用遞歸計算字符串中的元音,但它不起作用。計算字符串中元音的數量

#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); 
} 
+0

在'main'中循環'set'(它看起來不在那個範圍內),並且總是把相同的東西傳遞給'is_vowel'。你從不使用循環計數器'i'。 – 2011-05-31 11:24:28

+0

'set'在滾動區域中定義。我還認爲它一開始沒有定義。到OP:@paranoidgnu - 限制行長度爲80個字符:) – pmg 2011-05-31 11:28:21

回答

0
  1. 你不遍歷set因爲你可能想要的。應該是:

    if(is_vowel(vowels, &set[i])) 
    
  2. 你的功能is_element()是絕對錯誤的,你可以把它改成:

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

甚至通過字符,而不是指向字符。

3

您的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 

整體概念,應用似乎是錯的。我的哥們建議你重寫code.There是整個代碼錯誤的無數數量。

0

有一個簡單的解決問題的方法:

#define VOWELS "aeiouAEIOU" 

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

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

     return i; 
} 

它可以很容易地轉化成遞歸版本。

1

main中,您的for循環使用完全相同的參數多次調用is_vowel()

你可能想用一個簡單的protoyype重寫功能:

/* int is_vowel(const char *vowels, const char *set); */ 
int is_vowel(const char *vowels, int ch); 
1
#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)); 
} 
0

可以使用此代碼在python計數元音的數量:(S)

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 '

相關問題