Vasudha Dixit Ответов: 2

Программа C возвращает факториальное значение до 33 числа и вывод идет в бесконечном цикле после ввода символа в качестве входного


Я пишу одну факториальную программу C, в которой пользователю не разрешается вводить отрицательный и алфавитный символ, но допускается число от 0. Программа будет запрашивать ввод до тех пор, пока не будет нажата клавиша enter.

Программа отлично работает, когда я ввожу любое число или нажимаю клавишу enter, но когда я ввожу любой символ, он переходит в бесконечный цикл, выдавая вывод в виде "факториал 1 равен 1"... Почему это происходит?

Кроме того, когда я ввожу ASCII-значение символа алфавита(например, 109), я получаю вывод в виде "алфавит не допускается- но ожидание-это факторное значение этого числа. Я знаю, что это происходит потому, что я использую одну и ту же переменную для проверки алфавита и числа. Тогда как мне проверить наличие алфавита и числа отдельно? поскольку входное значение хранится в одной переменной.

На выходе я получаю факториал только до 33 числа. Если я ввожу 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);
    }
}

2 Ответов

Рейтинг:
1

Richard MacCutchan

Вам нужно проверить результат вашей работы. scanf позвоните, чтобы убедиться, что пользователь набрал правильный номер. Видеть scanf, _scanf_l, wscanf, _wscanf_l[^] для возвращения значения из scanf вызов. Заметьте также, что ваш display функция никогда не вернет значение '\n' символ, так как он принимает только целочисленные входные данные. Вы должны использовать специальное значение, чтобы указать конец.

Этот код является избыточным:

if((num_fact>='a' && num_fact<='z') || (num_fact>='A' && num_fact<='Z'))
{
    printf("Alphabet is not allowed");
}

У вас уже есть целочисленное значение (проверено в поле display функция), поэтому сравнение его с произвольным диапазоном чисел не означает того, что вы думаете.


Рейтинг:
0

OriginalGriff

Проблема в том, что вы не делаете никакой проверки ошибок: Библиотечная функция C - scanf()[^] возвращает отрицательное число, если введено "плохое значение", и вы не проверяете это, вы просто предполагаете, что значение в input это всегда правильно и справедливо.

Измените свой display функция для проверки ответа и повторения до тех пор, пока пользователь не наберет что-то правильное. И изменить его название! Он не "отображает", он запрашивает ввод и получает значение от пользователя.

Но это не единственная ваша проблема: потому что вы используете scanf с числовым кодом - "%d" - он никогда не вернет "\n", так что это тоже не будет работать слишком хорошо.

То, что я хотел бы предложить, что вы используете scanf чтобы прочитать строку символов от пользователя, а затем проверить, что для "пусто" - если она пуста, то пользователь нажал ENTER без номера, и все готово. Если это не так, то используйте Библиотечная функция C - atoi()[^] чтобы попытаться преобразовать его в целое число. Затем вы можете выбросить свою проверку A-Z и просто продолжить работу с факториалом.

Имейте в виду, что факториалы становятся очень большими, очень быстро: они превысят 32-битное целое число задолго до того, как n достигнет 33!