2015-02-25 11 views
5

Próbuję napisać funkcję rekursywną, aby sprawdzić, czy użytkownik wprowadza liczbę zawierającą wszystkie cyfry parzyste.Funkcja rekursywna, aby sprawdzić, czy wszystkie cyfry w zmiennej int są równe

Co jest nie tak z moją logiką? Kiedy próbowałem z "556" Wynik jest 1.

int main() 
{ 
    int num; 
    int *result; 
    printf("Enter a number: "); 
    scanf("%d", &num); 
    allEven(num, &result); 
    printf("allEven(): %d", result); 

} 
void allEven(int number, int *result) 
{ 
    if ((number % 10) % 2) // if the last digit is odd 
    { 
     *result = 0; 
    } 
    else 
    { 
     *result = 1; 
     if ((number/10) != 0) //not the last digit to evaluate, we call the function again. 
     { 
      allEven((number/10), &result); 
     } 
    } 
} 
+0

nie masz arror kompilatora w' allEven ((liczba/10) i wynik); 'drugi parametr? – CiaPan

+0

Wygląda jak pytanie 6 twojego przypisania programowania – user1758596

Odpowiedz

3

Należy napisać go w ten sposób, aby skompilować kod:

void allEven(int number, int *result) 
{ 
    if ((number % 10) % 2) // if the last digit is odd 
    { 
     *result = 0; 
    } 
    else 
    { 
     *result = 1; 
     if ((number/10) != 0) //not the last digit to evaluate, we call the function again. 
     { 
      allEven((number/10), result); 
     } 
    } 
} 
int main() 
{ 
    int num; 
    int result; 
    printf("Enter a number: "); 
    scanf("%d", &num); 
    allEven(num, &result); 
    printf("allEven(): %d", result); 

} 

1) "int * wynik" zastąp "wynik int"

2) „allEven ((liczba/10) , & wynik)”call w main() zastąpić allEven ((numer/10), wynik)

3) przegapiłeś klamra w funkcji allEven

+0

Nie rezygnuję z pobierania go dla drugiego parametru allEven. Czy nie pyta o adres z (int * wynikiem)? Dlaczego właśnie przekazujemy "wynik", który jest wartością, a nie adresem, kiedy nazywamy allEven? –

+1

po przekazaniu go z main(), podajesz mu adres wyniku (via i wynik). Ale kiedy przekazujesz go z rekursywnego wywołania allEven(), masz już tam wskaźnik, więc musimy go użyć bez "&" – ars

+0

prawdopodobnie nadal występują błędy w logice kodu. Tak, myślę, że to przydatna rada – ars

0

Wymień

int *result;

Z

int result;

5

allEven((number/10), &result); należy zastąpić

allEven((number/10), result); 

Ponieważ allEven spodziewa Drugi argument typu int * i &result jest int **

także int *result powinny być int result = 1

Working example here

Jeśli kompilacji z odpowiednich flag ostrzegawczych -W -Wall na przykład na gcc (lepiej z -O2) powinieneś otrzymać odpowiednie ostrzeżenia, aby poprawić swój kod.

Powiązane problemy