2011-12-18 83 views
8

這裏是問題:遊戲總數可以由任何人玩。它總共從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); 

} 

我需要: 當輸入十進制數字後轉到else。我如何確定浮動是否有小數部分。

+0

在二進制級別上,浮點數沒有小數。 http://en.wikipedia.org/wiki/IEEE_754-2008 – 2011-12-18 02:13:22

+0

我們在這裏討論漂浮物。它總是「有一個小數」。改爲使用「double」。 (FYI @Chris和我的意思是一樣的) – 2011-12-18 02:13:54

+2

@TomvanderWoerdt:'double'有什麼區別? – 2011-12-18 02:14:53

回答

3

如果您想知道實際數字x是否沒有小數部分,請嘗試x==floor(x)

+0

@sarnold,在這種情況下,不是。可以表示爲「float」或「double」的整數表示正確,「floor」表示沒有錯誤。 – lhf 2011-12-18 02:16:36

+0

感謝您的更詳細的解答。 :) – sarnold 2011-12-18 02:22:34

+0

我不相信所有使用這種技術的答案都是健壯的。如果'adj'實際上是中間計算的結果,則它可以保存在擴展精度寄存器中。因此,即使在稍後檢查「adj」時,它的比較可能會返回'false',但實際上它是一個整數值。 – 2011-12-18 02:37:38

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找到小數部分,所以我想測試它是否等於0null會回答你的問題。

+0

你應該被接受的答案,謝謝! – VivienLeger 2017-06-17 07:39:34

13

您可以將float投射到int,然後將其與原始變量進行比較。如果它們是相同的,則不存在小數部分。

通過使用此方法,不需要臨時變量或函數調用。

float adj; 

    ....  

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

說明

由於一個int不能處理的級分的float的值將被截斷成int(作爲示例(float)14.3將被截斷成(int)14)。

當比較1414.3很明顯它們不是相同的值,因此「分數!」將被打印。

+2

你不需要顯式轉換回'float',它會自動轉換。你的解決方案沒有錯,我只是把它寫成'f ==(int)f',我發現它更易於閱讀和理解。 – Kevin 2011-12-18 02:16:05

+0

@Kevin我在編寫你的評論的同時編輯了這個內容,然後我添加了一些關於此事的更多信息,謝謝。 – 2011-12-18 02:21:18

+2

我不相信所有使用這種技術的答案都是健壯的。如果'adj'實際上是中間計算的結果,則它可以保存在擴展精度寄存器中。因此,即使在稍後檢查「adj」時,它的比較可能會返回'false',但實際上它是一個整數值。 – 2011-12-18 02:32:27

0

使用scanf()存在問題。如果用戶在輸入的第一行輸入-5 +10 -15 -15,然後按回車,您將依次用scanf()處理這4個數字。這可能不是你想要的。此外,當然,如果用戶鍵入+3 or more,則第一次轉換在讀取空間後停止,並且所有後續轉換在oor上失敗,並且代碼進入循環。您必須檢查scanf()的返回值以瞭解它是否能夠轉換任何東西。

預讀的問題足夠嚴重,我會去使用fgets()讀取一行數據,然後使用sscanf()的準標準的替代(即額外s是最重要的)來解析一個數字。

要確定一個浮點數字是否具有小數部分以及整數部分,你可以使用modf() or modff()功能 - 因爲你adj後者是float

#include <math.h> 

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

返回值是有符號小數部分x; iptr中的值是整數部分。請注意,modff()可能在不支持C99的編譯器(運行時庫)中可用。在這種情況下,您可能需要使用doublemodf()。但是,限制用戶使用%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個字符輸入的可能性。

0

我只學習C,所以告訴我,如果我錯了,請。

但如果不是使用

scanf("%f",&adj); 

如果你使用:

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

因此,如果用戶輸入以外的任何其他一個整體整數& IsUndef會不等於NULL,並且必須有一個小數部分將用戶發送給其他人。

也許。

相關問題