C-四舍五入问题(CS50)
我已经在谷歌上搜索了好几天了,我迷路了。所以在网上做CS50似乎无法处理这个数字的舍入。我的程序将像2.10这样的浮点数与像100这样的整数相乘,结果将是209.xxxxxxxx 现在就像我说的,我已经读了无数关于我应该使用ceilf并包括的帖子,但是我得到了一个错误 贪婪的.c:(.text+0x74):对'ceilf'的未定义引用 collect2:错误:ld返回了1个退出状态make:**[贪婪]错误1 adam@beethoven:~/projects/atom/edx/pSet1/greedy$ 我看过关于-lm和某个文件的帖子,但如果我是诚实的,我不明白这是什么意思 我不是在寻找一个彻底的解决方案,只是在改进方面寻求指导 这是我的代码,可能没有一些人希望的那么精简,但我在这里又回到了基础;)C-四舍五入问题(CS50),c,rounding,math.h,cs50,C,Rounding,Math.h,Cs50,我已经在谷歌上搜索了好几天了,我迷路了。所以在网上做CS50似乎无法处理这个数字的舍入。我的程序将像2.10这样的浮点数与像100这样的整数相乘,结果将是209.xxxxxxxx 现在就像我说的,我已经读了无数关于我应该使用ceilf并包括的帖子,但是我得到了一个错误 贪婪的.c:(.text+0x74):对'ceilf'的未定义引用 collect2:错误:ld返回了1个退出状态make:**[贪婪]错误1 adam@beethoven:~/projects/atom/edx/pSet1/gr
#包括
#包括
int main(){
//初始化变量
int coinsTotal=0,
四分之一=25,
一角=10,
镍=5,
便士=1,
美分;
浮动到期日;
做{
printf(“您欠多少零钱?(格式=0.00)($):”;
scanf(“%f”、&changeDue);
//兑换成美分
美分=到期换单*100;
}而(美分=四分之一){
美分=美分-四分之一;
coinsTotal=coinsTotal+1;
}如果(美分==0){
printf(“硬币的最小数量为:%d\n”,coinsTotal);
}否则{
而(分>=一角){
美分一角;
coinsTotal=coinsTotal+1;
}如果(美分==0){
printf(“最小硬币数量为:%d\n”,coinsTotal);
}否则{
而(美分>=镍){
美分=美分-镍;
coinsTotal=coinsTotal+1;
}如果(美分==0){
printf(“最小硬币数量为:%d\n”,coinsTotal);
}否则{
而(美分>=便士){
美分=美分-便士;
coinsTotal=coinsTotal+1;
}如果(美分==0){
printf(“最小硬币数量为:%d\n”,coinsTotal);
}
}
}
}
}
基本上,它应该计算出制造一定数量硬币所需的最小数量。在大多数情况下,它会一直工作,直到浮子弄乱为止。请原谅,我喜欢写我做过的事情,这样我会学得更好
更新尝试使用-lm使用GCC进行编译,但仍然失败。
adam@beethoven:~/projects/atom/edx/pSet1/greedy$gcc-o foo-lm
贪婪的.c/tmp/cc3qHAK7.o:在函数main]中:贪婪的.c:(.text+0x6e):
未定义对
ceilf'collect2的引用:错误:ld返回1个出口
地位adam@beethoven:~/projects/atom/edx/pSet1/greedy$
解决方案,而不是使用make命令,我使用了gcc并添加了
命令末尾的-lm标志gcc-o foo greedy.c-lm
我看过关于-lm和某个文件的帖子,但如果我是诚实的,我不明白这是什么意思
您必须链接到数学库才能修复错误。数学函数的实现通常作为一个单独的库,即数学库。如果您使用
gcc
将-lm
添加到链接器命令。我假定您希望将浮点数四舍五入到最接近的整数ceilf
没有这样做,它正在向上取整。如果可能,可以使用此宏舍入到最接近的长度:
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
此外,由于未链接到数学库,因此会出现链接错误。例如,使用:
gcc greedy.c -lm -o greedy
你知道MCVE是什么吗?嗨,阿米特我不知道它是什么。我用谷歌搜索了一下,在这个网站上找到了这个页面。我感谢你指出这一点,我将据此编辑我的文章。好的,你是一个模范公民:-)为什么不直接手工解析输入字符串,这样你就不必使用任何数学函数来做一些简单的事情,比如读取一个字符串,比如“2.10”并将其转换为210?指导:1)如果代码要使用浮点货币,请使用
double
。2) 无论何时将浮点货币转换为int
,请使用round()
,如cents=round(changeDue*100)代码>添加-lm
表示“请链接一个名为libm的库”。如果您使用的是Makefile,请查找用于生成最终二进制文件的命令,并向其中添加-lm
。@Adam'Sacki'Sackfield由于您使用的是Makefile,您可能希望将其添加到Makefile开头的LDFLAGS
,或者只使用make LDFLAGS=-lm greedy
,假设makefile中的cc
行在行尾列出了$(LDFLAGS)
。如果它没有列在cc
行上,您可以在cc
行的末尾添加$(LDFLAGS)
,也可以在行的末尾添加硬编码-lm
本身以代替$(LDFLAGS)
<但是,code>$(LDFLAGS)
更灵活,因为它允许您列出多个库,例如,make LDFLAGS='-lmylib-lXt-lX11-lm
您可以使用以下神秘的调用:make myprog LDLIBS=-lm
(用myprog
代替您通常制作的任何库)。@ChronoKitsune:LDLIBS,而不是LDFLAGS。LDFLAGS在命令行中来得太早。@ ADAM'sAcsi'sAcfield long
的整数,但不代表double
,还有一些类似的情况。它的优点是不需要数学库,而OP链接起来有困难。
gcc greedy.c -lm -o greedy