Программа не работает, когда ввод 10 и факториальное значение возвращается только до 33 числа - PullRequest
0 голосов
/ 23 сентября 2018

Когда 10 вводится в качестве входных данных, программа (для вычисления факториалов) дает сбой, тогда как для всех других входных данных (в пределах системы) программа работает нормально, за исключением того, что при вводе любого символа она входит в бесконечный цикл свывод как «Факториал 1 есть 1».

Если я введу 34 или любое число больше 34, тогда я получаю вывод, поскольку «факториал [введенного числа] равен 0».Почему факториальное значение равно 0 для числа больше 33?

Вот программа:

 #include <stdio.h>
    #include <stdlib.h>

int display();
void fact_fun(int num_fact);

int main()
{
    int num = 0;
    char next;

    next=display();

    while( next != '\n')
    {
        num = next;
        fact_fun(num);
        next=display();
    }

    return 0;
}

int display()
{
    int input;
    printf("\nEnter number to find factorial or press ENTER to exit :");
    scanf("%d",&input);

    return input;
}

void fact_fun(int num_fact)
{
    int fact=1;
    if((num_fact>='a' && num_fact<='z') || (num_fact>='A' && num_fact<='Z'))
    {
        printf("Alphabet is not allowed");
    }
    else if(num_fact < 0)
    {
        printf("Negative number is not allowed");
    }
    else if(num_fact == 0)
    {
        printf("Factorial of %d is 1",num_fact);
    }
    else
    {
        for(int i = 1; i<= num_fact; i++)
        {
            fact = fact*i;
        }
        printf("Factorial of %d is %d",num_fact,fact);
    }
}

Пожалуйста, сообщите мне, где я делаю ошибку.

1 Ответ

0 голосов
/ 23 сентября 2018

В функции display вы используете char вместо int, так как вы используете спецификатор формата %d в scanf, измените его на int везде.Вы, должно быть, видели предупреждение при компиляции:

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’

Кроме этого, ваша программа не может доставить, когда введено число 10 , для ее решения:

 while(next>=0) //WHEN NEGATIVE NUMBER IS ENTERED IT WILL END THE LOOP
 {
    num = next;
    fact_fun(num);
    next=display();
 }

Упростите fact_fun:

void fact_fun(int num_fact)
{
    int fact =1;
    if(num_fact == 0)
    {
        printf("Factorial of %d is 1",num_fact);
        return;
    }
    else
    {
        for(int i = 1; i<= num_fact; i++)
        {
            fact = fact*i;
        }
        printf("Factorial of %d is %d",num_fact,fact);
    }
}

Тогда все будет работать нормально.

ПРИЧИНА ЗА СБОЙ ПРОГРАММЫ, КОГДА ВХОД 10: ASCII значение новой строки \n также равно 10 , поэтому при вводе десяти значение int \n сравнивается со значением, возвращаемым display, т. Е. 10 , следовательно, цикл while никогда не выполняется в этом случае.

Вот как должен быть безопасен метод ввода данных (scanf - это катастрофа):

int display()
{
    char inp[10]={0};
    int  input;
    int index=0;
    printf("Enter number to find factorial or press ENTER to exit : ");

    while(((input=getchar())!=EOF)&(index<10))
    {
        if((input>='0')&&(input<='9'))
        {
            inp[index++]=input;
        }
        else if(input=='\n')
            break;
        else
            return -1;
    }
    input=atoi(inp);

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