Определение, если поплавок имеет дробную часть? - PullRequest
10 голосов
/ 18 декабря 2011

Вот проблема: в игру Итоги может играть любое количество людей.Все начинается с 100, и каждый игрок в свою очередь делает целочисленное смещение от -20 до 20 к этому общему количеству.Победителем становится игрок, чья корректировка делает итоговое значение равным 5. Используя только три указанные переменные: счетчик общей корректировки Вот что у меня есть:

#include <stdio.h>
int main (void)
{
    int counter=0;
    float adj;
    int ttl=100;

    printf("You all know the rules now lets begin!!!\n\n\nWe start with 100. What is\n");

    while (ttl!=5)
    {
        printf("YOUR ADJUSTMENT?");
        scanf("%f",&adj);
        counter++;
        if (adj<=20 && adj>=-20)
        {
        ttl=ttl+adj;
        printf("The total is %d\n",ttl);
        }
        else
        {
        printf ("I'm sorry. Do you not know the rules?\n");
        }
    }
    printf("The game is won in %d steps!",counter);

}

Что мне нужно: Когда десятичное числовошел он идет в остальное.Как определить, имеет ли дробь дробную часть.

Ответы [ 5 ]

15 голосов
/ 18 декабря 2011

Вы можете привести float к int и затем сравнить его с вашей исходной переменной. Если они одинаковые, то дробной части не было.

При использовании этого метода нет необходимости во временной переменной или вызове функции.

  float adj;

  ....     

  if (adj == (int)adj)
    printf ("no fractional!\n");
  else
    printf ("fractional!\n");

Объяснение

Поскольку int не может обрабатывать дроби, значение вашего float будет усечено до int (например, (float)14.3 будет усечено до (int)14).

При сравнении 14 с 14.3 очевидно, что они не имеют одинаковое значение, и поэтому "дробно!" будет напечатан.

13 голосов
/ 18 декабря 2011
#include <stdio.h>
#include <math.h>

int main ()
{
  float param, fractpart, intpart;

  param = 3.14159265;
  fractpart = modff (param , &intpart);
  return 0;
}

http://www.cplusplus.com/reference/clibrary/cmath/modf/

modff находит дробную часть, поэтому я предполагаю, что проверка, равна ли она 1006 * или null, ответит на ваш вопрос.

3 голосов
/ 18 декабря 2011

, если вы хотите узнать, имеет ли действительное число x дробную часть, попробуйте x==floor(x).

1 голос
/ 18 декабря 2011

Я только учу C, поэтому скажите мне, если я ошибаюсь, пожалуйста.

Но если вместо использования

scanf("%f",&adj);

, если вы используете:

scanf("%d%d", &adj, &IsUndef);

Поэтому, если пользователь введет что-либо, кроме целого числа, IsUndef не будет равен NULLдолжна иметь дробную часть, отправляющую пользователя к другому.

возможно.

0 голосов
/ 18 декабря 2011

Использование scanf() проблематично.Если пользователь набрал -5 +10 -15 -15 в первой строке ввода, а затем нажал return, вы обработали бы 4 числа по очереди с scanf().Это, вероятно, не то, что вы хотели.Также, конечно, если пользователь вводит +3 or more, то первое преобразование останавливается, когда читается пробел, и все последующие преобразования завершаются неудачно на o или or, и код переходит в цикл.Вы должны проверить возвращаемое значение из scanf(), чтобы узнать, удалось ли что-либо преобразовать.

Проблемы с чтением вперед достаточно серьезны, поэтому я бы выбрал квазистандартную альтернативу использования fgets()прочитать строку данных, а затем с помощью sscanf() (все эти дополнительные s важны) проанализировать число.

Чтобы определить, имеет ли число с плавающей запятой дробную часть и целое числочасть, вы могли бы использовать функцию modf() или modff() - последняя, ​​поскольку ваш adj является float:

#include <math.h>

double modf(double x, double *iptr);
float modff(float value, float *iptr);

Возвращаемое значение является знаковым дробнымчасть x;значение в iptr является целочисленной частью.Обратите внимание, что modff() может быть недоступно в компиляторах (библиотеках времени выполнения), которые не поддерживают C99.В этом случае вам, возможно, придется использовать double и modf().Однако, вероятно, так же просто ограничить пользователя вводом целых чисел в формате %d и целочисленного типа для adj;это то, что я бы сделал с самого начала.

Еще один момент: вы действительно хотите подсчитать недействительные числа в общем количестве попыток?

#include <stdio.h>
#include <math.h>

int main(void)
{
    int counter=0;
    int ttl=100;

    printf("You all know the rules now lets begin!!!\n"
           "\n\nWe start with 100. What is\n");

    while (ttl != 5)
    {
        char  buffer[4096];
        float a_int;
        float adj;

        printf("YOUR ADJUSTMENT?");
        if (fgets(buffer, sizeof(buffer), stdin) == 0)
            break;
        if (sscanf("%f", &adj) != 1)
            break;
        if (adj<=20 && adj>=-20 && modff(adj, &a_int) == 0.0)
        {
            counter++;  // Not counting invalid numbers
            ttl += adj;
            printf("The total is %d\n", ttl);
        }
        else
        {
            printf ("I'm sorry. Do you not know the rules?\n");
        }
    }

    if (ttl == 5)
        printf("The game is won in %d steps!\n", counter);
    else
        printf("No-one wins; the total is not 5\n");
    return(0);
}

Понятно, я 'Я старательно игнорирую возможность того, что кто-то может набрать более 4095 символов перед вводом return.

...