问题在于:游戏总计可以由任意数量的人玩。它从总共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 :(得分:15)
您可以将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
进行比较时,显然它们的价值不同,因此“小数”!将被打印。
答案 1 :(得分:13)
#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
会回答你的问题。
答案 2 :(得分:3)
如果您想知道实数x
是否没有小数部分,请尝试x==floor(x)
。
答案 3 :(得分:0)
使用scanf()
是有问题的。如果用户在输入的第一行输入-5 +10 -15 -15
,然后点击返回,则会使用scanf()
依次处理4个数字。这可能不是你想要的。此外,当然,如果用户键入+3 or more
,则在读取空格后第一次转换会停止,并且o
或or
上的所有后续转换都会失败,并且代码会进入一个循环。您必须检查scanf()
的返回值,以了解它是否能够转换任何内容。
预读问题非常严重,我会选择使用fgets()
读取一行数据的准标准替代方案,然后使用sscanf()
(额外{{1}解析一个数字是非常重要的。
要确定浮点数是否包含小数部分以及整数部分,您可以使用modf()
or modff()
函数 - 后者,因为s
是adj
:< / p>
float
返回值是#include <math.h>
double modf(double x, double *iptr);
float modff(float value, float *iptr);
的带符号小数部分; x
中的值是整数部分。请注意,iptr
可能在不支持C99的编译器(运行时库)中不可用。在这种情况下,您可能必须使用modff()
和double
。但是,限制用户输入modf()
格式的整数和%d
的整数类型可能很简单;这就是我从一开始就做的事情。
另一个细节问题:你真的想要计算总尝试次数中的无效数字吗?
adj
很明显,我刻意忽略了在输入回复之前有人可能输入超过4095个字符的可能性。