问题是:Totals 游戏可以由任意数量的人玩。一开始的总数为 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);
}
我需要什么: 当输入十进制数时,它会转到其他数字。如何确定浮点数是否有小数部分。
您可以将
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
进行比较时,很明显它们不是相同的值,因此是“小数!”将被打印。
#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
会回答你的问题。
如果你想知道实数
x
是否没有小数部分,请尝试x==floor(x)
。
我只学习C,所以如果我错了,请告诉我。
但是如果不使用
scanf("%f",&adj);
如果您使用:
scanf("%d%d", &adj, &IsUndef);
因此,如果用户输入除整个整数以外的任何内容,&IsUndef 将不等于 NULL,并且必须有一个小数部分将用户发送到其他位置。
也许吧。
使用
scanf()
是有问题的。如果用户在第一行输入中输入 -5 +10 -15 -15
,然后按回车键,您将使用 scanf()
依次处理 4 个数字。这可能不是您想要的。当然,如果用户输入 +3 or more
,那么一旦读取到空格,第一次转换就会停止,并且所有后续转换在 o
或 or
上都会失败,并且代码会进入循环。您必须检查 scanf()
的返回值以了解它是否能够转换任何内容。
预读问题非常严重,我会选择使用
fgets()
读取一行数据的准标准替代方案,然后使用 sscanf()
(额外的 s
非常重要)来解析一个数字。
modf()
或 modff()
函数 - 后者因为您的 adj
是 float
:
#include <math.h>
double modf(double x, double *iptr);
float modff(float value, float *iptr);
返回值是
x
的有符号小数部分; iptr
中的值为整数部分。请注意,modff()
在不支持 C99 的编译器(运行时库)中可能不可用。在这种情况下,您可能必须使用 double
和 modf()
。然而,限制用户输入 %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);
}
显然,我故意忽略了有人可能在输入 return 之前输入超过 4095 个字符的可能性。