QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 819|回复: 8

函数的嵌套调用的问题!:)谢谢指教!:)

[复制链接]
发表于 2004-12-2 21:27:05 | 显示全部楼层 |阅读模式
[code:1]/*用主函数调用方法来实现1!+2!+3!+......+19!+20!的值*/
main()
{
double ajc(x);/*声明*/
double a;
a=ajc(20);
printf("%u\n",a);
}
double ajc(x)
{
double jc(n);/*声明*/
int y,z=0;
for(y=1;y<=x;y++)
z+=jc(y);
return(z);
}
double jc(n)
{int w=1,k=1;
for(k=1;k<=n;k++)
w*=k;
return(w);
}[/code:1]
我的编译结果是:
[code:1]fydream@linux:~/源代码/unit 6> gcc -o dreamdead 64shiyan.c
64shiyan.c: In function `main':
64shiyan.c:4: warning: parameter names (without types) in function declaration
64shiyan.c: In function `ajc':
64shiyan.c:11: warning: parameter names (without types) in function declaration
fydream@linux:~/源代码/unit 6> ./dreamdead
0[/code:1]
结果居然是0.我是在是不能找到什么错的,也许是小弟我还太菜,请各位高手指教,谢谢了!
发表于 2004-12-2 23:43:34 | 显示全部楼层
你的打印选项不对。不是%u,是%f 。同时还有许多类型不匹配的问题,造成结果混乱。
回复

使用道具 举报

发表于 2004-12-3 11:19:02 | 显示全部楼层
double ajc(x)?
参数没写类型
另外在main前面要先申明ajc和jc函数
回复

使用道具 举报

发表于 2004-12-3 11:44:36 | 显示全部楼层
把double全部换成int, printf中的%u 换成%d

另外, 你函数的声明, 强烈建议不要默认的使用gcc缺省类型(int), 要显性的声明为int,
即 int ajc(int x), int jc(int n),这样在编制大一些的程序的时候可以避免很多麻烦
回复

使用道具 举报

 楼主| 发表于 2004-12-3 17:54:39 | 显示全部楼层
好的!谢谢!我试试!
回复

使用道具 举报

 楼主| 发表于 2004-12-3 18:27:04 | 显示全部楼层

好了!谢谢兄弟们!

[code:1]/*用主函数调用方法来实现1!+2!+3!+......+19!+20!的值*/
main()
{
double ajc(double x);/*声明*/
double a;
a=ajc(20);
printf("%lf\n",a);
}
double ajc(double x)
{
double jc(double n);/*声明*/
int y;
double z=0;
for(y=1;y<=x;y++)
z+=jc(y);
return(z);
}
double jc(double n)
{int k=1;
double w=1;
for(k=1;k<=n;k++)
w*=k;
return(w);
}[/code:1]
成功了!确实是我的定义的类型非常混乱导致的错误。
[code:1]
fydream@linux:~/源代码/unit 6> gcc -o dreamdead 64shiyan.c
fydream@linux:~/源代码/unit 6> ./dreamdead
2561327494111820288.000000
fydream@linux:~/源代码/unit 6>
[/code:1]
非常感谢!
回复

使用道具 举报

发表于 2004-12-3 19:25:56 | 显示全部楼层
我不知道你为什么一定要用double, 因为根本就用不到浮点类型的值,
用int, 如果不够表达,用long long就完全就可以了。

当你使用浮点类型的时候,或者混合类型运算,intel的cpu都会调用fpu来计算,fpu一共只有
7个寄存器,而且用法和通用寄存器有一点区别,造成总的效率会下降(包括编译器代码优化
的结果都不如只用整型的), 所以,建议能用整形解决的就不要用浮点型了(float, double)

enjoy
回复

使用道具 举报

发表于 2004-12-3 20:40:17 | 显示全部楼层
[quote:e25ce3a374="yunfan"]我不知道你为什么一定要用double, 因为根本就用不到浮点类型的值,
用int, 如果不够表达,用long long就完全就可以了。

当你使用浮点类型的时候,或者混合类型运算,intel的cpu都会调用fpu来计算,fpu一共只有
7个寄存器,而且用法和通用寄存器有一点区别,造成总的效率会下降(包括编译器代码优化
的结果都不如只用整型的), 所以,建议能用整形解决的就不要用浮点型了(float, double)

enjoy [/quote]受益不少
回复

使用道具 举报

 楼主| 发表于 2004-12-5 13:07:00 | 显示全部楼层
好的!我知道了!以前我不知道还能用两个long来定义,现在知道乐!谢谢老兄的指教!:)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 23:24 , Processed in 0.041951 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表