11

問題は次のとおりです。ゲームの合計は、任意の数の人がプレイできます。それは合計100から始まり、各プレーヤーは順番にその合計に対して-20から20の間の整数の変位を行います。勝者は、調整によって合計が5になるプレーヤーです。指定された3つの変数のみを使用します。合計調整カウンターこれまでのところ、次のようになっています。

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

}

必要なもの:10進数を入力すると、elseに移動します。フロートに小数部分があるかどうかを確認するにはどうすればよいですか。

4

5 に答える 5

24

をにキャストしfloatint、元の変数と比較することができます。それらが同じである場合、小数部分はありませんでした。

このメソッドを使用することにより、一時変数や関数呼び出しは必要ありません。

  float adj;

  ....     

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

説明

intは分数を処理できないため、の値はに切り捨てられます(floatintとして)(float)14.3に切り捨てられ(int)14ます。

比較14する14.3と、それらが同じ値ではないことは明らかであり、したがって「分数」です。印刷されます。

于 2011-12-18T02:14:21.790 に答える
14
#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小数部分を見つけるので、それがあなたの質問に等しいか、答えるかどうかをテストすると思い0ます。null

于 2011-12-18T02:13:58.063 に答える
3

実数xに小数部がないかどうかを知りたい場合は、を試してくださいx==floor(x)

于 2011-12-18T02:13:05.860 に答える
1

私はCしか学んでいないので、間違っていたら教えてください。

しかし、使用する代わりに

scanf("%f",&adj);

使用する場合:

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

したがって、ユーザーが完全な整数以外のものを入力した場合、&IsUndef は NULL と等しくならず、ユーザーを else に送信する小数部分が必要です。

多分。

于 2011-12-18T13:02:21.843 に答える
0

使用scanf()には問題があります。ユーザーが入力-5 +10 -15 -15の 1 行目に入力してから Return キーを押した場合、4 つの数字を で順番に処理しscanf()ます。これはおそらくあなたが望んでいたものではありません。また、もちろん、ユーザーが を入力+3 or moreすると、スペースが読み取られると最初の変換が停止し、以降の変換はすべてoまたはorで失敗し、コードはループに入ります。からの戻り値をチェックしてscanf()、何かを変換できたかどうかを確認する必要があります。

先読みの問題は十分に深刻なので、 を使用fgets()してデータ行を読み取り、次に を使用して数値を解析するという準標準の代替手段を使用しますsscanf()(その余分なsものはすべて重要です)。

浮動小数点数に小数部分と整数部分があるかどうかを判断するには、ormodf()関数modff()を使用できます。adjfloat

#include <math.h>

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

戻り値は の符号付き小数部分ですx。の値iptrは整数部分です。modff()C99 をサポートしないコンパイラ (ランタイム ライブラリ) では使用できない場合があることに注意してください。その場合、doubleandを使用する必要があるかもしれませんmodf()%dただし、ユーザーがformat を使用して整数を入力し、 の整数型を入力するように制限するのはおそらく簡単ですadj。それは私が最初からやっていたことです。

もう 1 つの詳細事項: 試行の合計回数に無効な数値を本当にカウントしますか?

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

明らかに、誰かが return を入力する前に 4095 文字を超える文字を入力する可能性を、私は慎重に無視しています。

于 2011-12-18T02:42:15.487 に答える