2016-09-04 1 views
1

Ich schrieb ein Programm, das eine ganze Zahl nimmt und abhängig von dieser Zahl weitere Maßnahmen, wie die Berechnung von Factorial, Fibonacci und Beenden des Programms. Aber mit dem Code stimmt etwas nicht. Wenn es das Fibonacci oder das Factorial berechnet, zeigt es Zufallszahl in der letzten Ausgabe, die seltsam ist, und ich kann es nicht herausfinden. Code und Screenshot unterhalb enter image description hereExtra ganze Zahl in der Ausgabe

#include <stdio.h> 
#include <conio.h> 

int Menu(int num) { 
    printf("Press 1 to calculate Factorial\n"); 
    printf("Press 2 to calculate Fibannaci series\n"); 
    printf("Press 0 to Quit\n"); 
    scanf("%d", &num); 
LOOP: 
    if (num == 1) { 
     int n; 
     printf("Enter the number whose Factorial you wanna calculate: "); 
     scanf("%d", &n); 
     printf("%d", Fact(n)); 
    } else 
    if (num == 2) { 
     int n; 
     printf("Enter the term whose Fibannaci series you wanna calculate: "); 
     scanf("%d", &n); 
     printf("%d", Fib(n)); 
    } else 
    if (num == 0) { 
     printf("Program is Quitting!"); 
     exit(0); 
    } else { 
     while (num < 0^num > 2) { 
      printf("Enter Correct number: "); 
      scanf("%d", &num); 
     } 
     goto LOOP; 
    } 
} 

int Fact(int n) { 
    int Factorial; 
    if (n == 1 || n == 0) { 
     return 1; 
    } else { 
     Factorial = n * Fact(n - 1); 
    } 
} 

int Fib(int n) { 
    int Fibonacci; 
    if (n <= 1) { 
     return n; 
    } else { 
     Fibonacci = Fib(n - 1) + Fib(n - 2); 
    } 
} 

int main() { 
    printf("%d", Menu(1)); 
} 
+2

'goto', wirklich ?! –

+0

@LeeTaylor Er lernt gerade :) –

+1

1) Poste Text als Text, nicht Bilder. 2) Formatieren Sie den Code und ziehen Sie ihn richtig ein. es ist nicht lesbar. 3) 'goto' hat seine Verwendungen. Aber nicht für dieses Problem! 4) Siehe [fragen]. – Olaf

Antwort

3

Die „extra“ -Ausgabe ist, weil Sie den Rückgabewert von Menu() drucken (aber man nicht zurück). Dies ist undefined behaviour.

Was geschieht, ist, dass printf() Druck 120 (printf("%d", Fact(n));) für den gewünschten Eingang 5 und den Rückgabewert (die Anzahl von Zeichen gedruckt) 3 ist, die durch die in printf() main() gedruckt wird. Aber verlassen Sie sich nicht darauf, denn dies ist nur eine Erklärung dessen, was in Ihrem Fall passiert und ist keineswegs eine Garantie. Wie bereits erwähnt, hat Ihr Code ein undefiniertes Verhalten.

Wenn Sie keinen Wert von Menu() zurückgeben müssen, können Sie es einfach zu einer void Funktion machen.


Es gibt mehr Probleme, die ich anfangs fand. Kompilieren Sie den Code, GCC berichtet:

test.c: In function ‘Menu’: 
test.c:12:18: warning: implicit declaration of function ‘Fact’ [-Wimplicit-function-declaration] 
    printf("%d", Fact(n)); 
       ^
test.c:18:18: warning: implicit declaration of function ‘Fib’ [-Wimplicit-function-declaration] 
    printf("%d", Fib(n)); 
       ^
test.c:22:5: warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration] 
    exit(0); 
    ^
test.c:22:5: warning: incompatible implicit declaration of built-in function ‘exit’ 
test.c:22:5: note: include ‘<stdlib.h>’ or provide a declaration of ‘exit’ 
test.c:26:14: warning: suggest parentheses around comparison in operand of ‘^’ [-Wparentheses] 
    while(num<0^num>2){ 
      ^
test.c: In function ‘Fact’: 
test.c:36:9: warning: variable ‘Factorial’ set but not used [-Wunused-but-set-variable] 
    int Factorial; 
     ^
test.c: In function ‘Fib’: 
test.c:46:9: warning: variable ‘Fibinnaci’ set but not used [-Wunused-but-set-variable] 
    int Fibinnaci; 
     ^
test.c: In function ‘Menu’: 
test.c:33:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
test.c: In function ‘Fact’: 
test.c:43:2: warning: control reaches end of non-void function [-Wreturn-type] 
    } 
^
test.c: In function ‘Fib’: 
test.c:53:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 

1) Sie rufen Fact() und Fib() vor Compiler konnte ihre Erklärungen. Sie können das Problem beheben, indem Sie oben erklärt:

int Fact(int); 
int Fib(int); 

2) Sie haben für exit() ‚s-Prototyp nicht stdlib.h> enthalten.

3) Nicht alles, was für die Eingänge der Rückkehr anders als 1 oder 0 von Fact() und Fib() Funktionen. Sie können dieses Problem beheben, indem Rückgabe von Werten aus den else Teilen:

else { 
    return n* Fact(n-1); 
} 

und

else { 
    return Fib(n-1)+ Fib(n-2); 
} 
+2

'Fact()' Funktion hat keine 'return'. 120 scheint auch Müll zu sein –

+0

Ich habe keine Return-Anweisung geschrieben. Kannst du mir genau sagen, was ich schreiben soll, um Faktor 5 zu drucken? –

+0

@OrkhanAlikhanov Richtig. Scheint das gleiche Problem gibt es auch in 'Fib()'! – usr

1

Sie konnten die Fakultätsfunktion ändern:

int Fact(int n){ 

    if(n==1 || n==0){ 
     return 1; 
    } 
    else{ 
    return n* Fact(n-1); 
    } 


} 
+0

Danke für die große Hilfe, ich habe es :) –

1

Anders als in einigen anderen Sprachen, die Rückkehr Wert wird im Funktionscode durch die return-Anweisung erzeugt. Sie Fib und Fact Funktionen sind falsch, wie der Compiler würde mit Warnungen unterstreichen, wenn mit den entsprechenden Flags (wie gcc -Wall) aufgerufen.

hier eine korrigierte Version ist:

int Fact(int n) { 
    if (n == 1 || n == 0) { 
     return 1; 
    } else { 
     return n * Fact(n - 1); 
    } 
} 

int Fib(int n) { 
    if (n <= 1) { 
     return n; 
    } else { 
     return Fib(n - 1) + Fib(n - 2); 
    } 
} 

Da die Funktionen nichts für den allgemeinen Fall zurückkehrten, printf war Druck, was Wert im Register sein geschieht, die normalerweise mit dem Rückgabewert eingestellt werden würde . Dies ist eine Form von undefiniertem Verhalten: alles was passieren kann, versuchen, das beobachtete Verhalten zu interpretieren ist nutzlos.

Darüber hinaus sollten Sie Ausgabe einen Zeilenvorschub nach der Nummer:

printf("%d\n", Fact(n)); 

Beachten Sie auch, dass die Bedingung in while (num < 0^num > 2) ist wahrscheinlich nicht das, was Sie gemeint: den Operator für logisches ODER wird || geschrieben. Der ^ ist der bitweise Exklusiv- oder Operator.

while (num < 0 || num > 2)