检查CS50哈佛大学现金应用程序中的50错误
非常新的编码,所以任何帮助是感激的,已经在这些检查错误上停留了一段时间检查CS50哈佛大学现金应用程序中的50错误,c,cs50,C,Cs50,非常新的编码,所以任何帮助是感激的,已经在这些检查错误上停留了一段时间 //源代码 #包括 #包括 #包括 内部主(空) { 浮动用户; 整数变化,硬币,小数; 做 { printf(“输入变更金额”); user=get\u float(“”); }while(用户=25) { 改变=改变-25; 硬币++; } 而(更改>=10) { 改变=改变-10; 硬币++; } 而(更改>=5) { 改变=改变-5; 硬币++; } 而(更改>=1) { 改变=改变-1; 硬币++; } print
//源代码
#包括
#包括
#包括
内部主(空)
{
浮动用户;
整数变化,硬币,小数;
做
{
printf(“输入变更金额”);
user=get\u float(“”);
}while(用户=25)
{
改变=改变-25;
硬币++;
}
而(更改>=10)
{
改变=改变-10;
硬币++;
}
而(更改>=5)
{
改变=改变-5;
硬币++;
}
而(更改>=1)
{
改变=改变-1;
硬币++;
}
printf(“您已输入\f%.1f\n”,用户);
睡眠(1);
printf(“尽可能少的硬币数量\f%.2d\n”,硬币);
}
我不断收到的错误消息:
:(0.01的输入产生1的输出
应为“1\n”,而不是“You have enter…”这实际上返回01,因此不确定
:(1.6的输入产生7的输出
应该是“7\n”,而不是“您已输入…”同样的事情只是07有办法删除零吗?
:(4.2的输入产生18的输出
应为“18\n”,而不是“您已输入…”
你忘了把你的输入四舍五入到最接近的一分吗
这个我不确定它的输出是否为22对于输入
4.20
来说,您看到的是22
而不是18
,这是因为浮点的不精确性。浮点不能准确地表示值4.20
,因此它将存储一个稍大或稍小的值4.20
在变量中
如果使用稍小的值(例如4.1999999或4.19998567),将其与100相乘,得到接近419.99999的值。将其转换为int
将截断为419,得到22枚硬币的结果
解决方案是在将浮点数转换为整数时舍入到最接近的整数,而不是截断。一个适用于小浮点数的常见技巧是在截断之前加0.5:
change = user * 100 + 0.5;
419.5000到420.4999范围内的值将转换为420.0000到420.99999范围内的值。然后截断将生成420
当然,您也可以使用c
附带的内置舍入函数
你也应该考虑使用<代码>双<代码>,而不是<代码>浮点。使用<代码>浮点保存的空间在现代桌面系统上通常是不值得的。
问题集很清楚程序应该输出什么样的输出。你不匹配它。再次阅读。< /P>
别忘了根据习题集对输入进行四舍五入。什么是
的内容?尽管仔细看一下预期的输出,你是否没有得到预期的结果?你知道'\n'
是什么吗?我想检查程序只是想让你打印一个数字,而不是友好的文本。还有几点注意:你知道吗无需使用printf
提示输入浮点(get\u float
支持提示输入)。计算可以用整数除法和模来完成,不需要循环。如果在打印整数时不需要前导零,那么不要在格式字符串中要求它们。@sweenish,cs50。h
是harward cs50课程使用的内存泄漏输入库的头。它的优点是教学生不要使用 scanf
用于输入。主要的缺点是它定义了typedef char*string
,并且它的字符串输入是以一种不可能修复内存泄漏的方式写入的。@HAL9000,很有趣。我假设get_float()
来自它;我很难理解为什么它需要用空字符串文字进行初始化。在我教学时,Intro从未对输入验证感到烦恼,因为它的兔子洞太大了,无法打扰那些学生。后来的课程只是“将其作为字符串并对其运行一些基本验证。”这个代码看起来像C++标签应该被删除。谢谢你对这个提示非常感激和感谢。你知道为什么我仍然会收到这些错误,即使它正确的只是前面有一个零。(输入1.6的输出结果为7)预期“7 \n”,而不是“你已经进入……(输入0.01的产出预期1的预期)1”,“不”。你必须进入……”