2011-12-18 4 views
8

問題は次のとおりです。ゲームの合計は任意の人数でプレイできます。それは合計100で始まり、各プレーヤーは順番にその合計に-20と20の間の整数の変位を行います。私がこれまで持っているもの 総 調整ここで カウンター されています:フロートに小数部があるかどうかを確認しますか?

#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.総等しいが与えられた唯一の三つの変数を使用したプレイヤーであります10進数を入力するとelseに移動します。浮動小数点数に小数部があるかどうかを調べるにはどうすればよいですか?

+0

バイナリレベルでは、浮動小数点数は10進数ではありません。 http://en.wikipedia.org/wiki/IEEE_754-2008 –

+0

ここではフロートについて話しています。それは常に "小数点を持っています"。代わりに 'double'を使います。 (FYI @Chrisと私は同じことを意味します) –

+2

@TomvanderWoerdt:「ダブル」はどのような違いがありますか? –

答えて

3

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

+0

@sarnold、この場合ではなく、いいえ。 'float'や' double'で表現できる整数は正確に表現され、 'floor'はそうでないものと間違いがありません。 – lhf

+0

詳細な回答ありがとうございます。 :) – sarnold

+0

私はこの技術を使用するすべての答えが堅牢であるとは確信していません。 'adj'が実際に中間計算の結果である場合、それは拡張精度レジスタに保持されます。だから、 'adj'が後で検査されたときに、実際には整数値になっても、比較は' false'を返します。 –

10
#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に等しいのですかどうかをテストすることは、あなたの質問にお答えしますね。

+0

あなたは受け入れられた答え、感謝すべきです! – VivienLeger

13

floatintにキャストし、元の変数と比較することができます。それらが同じであれば、小数部分はなかった。

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

float adj; 

    ....  

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

intので

はフラクションあなたfloatの値を扱うことができない説明(例えば(float)14.3(int)14に切り捨てされるように)intに切り捨てられます。

1414.3を比較すると、それらは同じ値ではないことが明らかです。そのため、「分数型」です。印刷されます。

+2

'float'に明示的にキャストする必要はありません。自動的にキャストされます。あなたの解は間違っていないので、私は 'f ==(int)f'と書いただけです。読みやすく理解しやすいと思います。 – Kevin

+0

@ケビン私はあなたのコメントを書いたと同時に私は編集しました。 –

+2

私はこのテクニックを使用するすべての答えが堅牢であるとは確信していません。'adj'が実際に中間計算の結果である場合、それは拡張精度レジスタに保持されます。だから、 'adj'が後で検査されたときに、実際には整数値になっても、比較は' false'を返します。 –

0

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

先読みの問題は、私は、データの行を読み取るためにfgets()を使用して、番号を解析する(余分sはすべて重要であること)sscanf()を使用しての準標準の代替のために行くだろうと十分に深刻です。

#include <math.h> 

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

戻り値は次のとおりです。後者をごadjfloatあるので、 - 浮動小数点数は、小数部分だけでなく、整数部分を持って、あなたはmodf() or modff()関数を使用することができるかどうかを決定するため

xの符号付き小数部。 iptrの値は整数部です。 modff()は、C99をサポートしていないコンパイラ(ランタイムライブラリ)では使用できないことに注意してください。その場合は、doublemodf()を使用する必要があります。しかし、%d形式の整数と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); 
} 

明らかに、誰かが返品をタイプする前に4095文字以上を入力する可能性を慎重に無視しています。

0

私はC言語を学習しているので、間違っているかどうか教えてください。

しかし、あなたが使用している場合

scanf("%f",&adj); 

を使用する代わりに、場合:したがって

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

ユーザーは全体の整数& IsUndefだろう等しくないNULL以外のものを入力し、小数部分を持たなければならない場合ユーザーを他に送ります。

多分。

関連する問題