2016-09-04 4 views
1

Я написал программу, которая принимает целое число и в зависимости от этого числа принимает дальнейшие действия, такие как вычисление Factorial, Fibonacci и выход из программы. Но с кодом что-то не так. Когда он вычисляет Фибоначчи или Факториал, он показывает случайное число в последнем из выходных данных, которое является странным, и я не могу понять это. Код и скриншот ниже enter image description hereДополнительное целое число на выходе

#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', действительно ?! –

+0

@LeeTaylor Он просто учится :) –

+1

1) Текст сообщения, текст, а не изображения. 2) Отформатировать и откорректировать код; он не читается. 3) 'goto' имеет свои обычаи. Но не для этой проблемы! 4) См. [Ask]. – Olaf

ответ

3

«лишние» выход, потому что вы печатаете возвращаемое значение Menu() (но не возвращает один). Это undefined behaviour.

Что происходит, что printf() печатает 120 (printf("%d", Fact(n));) для выбранного входа 5 и возвращаемого значения (количество символов напечатанного) является 3, который напечатан на printf() в основной(). Но не полагайтесь на это, так как это просто объяснение того, что происходит в вашем случае и отнюдь не гарантия. Как уже было сказано, ваш код имеет неопределенное поведение.

Если у вас нет необходимости возвращать значение от Menu(), вы можете просто сделать его функцией void.


Есть больше проблем, которые я изначально нашел. Компиляция кода, сообщает GCC:

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) Вы вызываете Fact() и Fib(), прежде чем компилятор может их деклараций. Вы можете это исправить, объявив на вершине:

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

2) Вы не включили stdlib.h> для exit() «s прототипа.

3) что-нибудь для других, чем 1 или 0 входов от Fact() и Fib() функции не возвращается. Вы можете исправить это, возвращающихся значениями из else частей:

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

и

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

Функция 'Fact()' не имеет 'return'. 120, кажется, тоже мусор –

+0

Я не писал никакого оператора возврата. Можете ли вы сказать мне, что мне следует писать для печати Factorial of 5? –

+0

@ Орхан Алиханов справа. Кажется, одна и та же проблема существует и в 'Fib()'! – usr

1

Вы можете изменить функцию факториала как:

int Fact(int n){ 

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


} 
+0

Спасибо за большую помощь, я получил его :) –

1

В отличии от некоторых других языков, возвращение значение создается в коде функции оператором return. Вы неправильно используете Fib и Fact, так как компилятор подчеркивал бы предупреждениями при вызове с соответствующими флагами (например, gcc -Wall).

Вот исправленный вариант:

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); 
    } 
} 

Поскольку функции были ничего не возвращаются в общем случае, printf была печать любого значения оказывается в реестре, который обычно установлен с возвращаемым значением , Это форма неопределенного поведения: ничего не происходит, попытка интерпретировать наблюдаемое поведение бесполезна.

Кроме того, следует вывести перевод строки после номера:

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

Заметим также, что условие в while (num < 0^num > 2), вероятно, не то, что вы имели в виду: оператор логического ИЛИ записывается ||. ^ является побитовым эксклюзивным или оператором.

while (num < 0 || num > 2)