2011-12-18 244 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,并且必须有一个小数部分将用户发送给其他人。

也许。

相关问题