user-0 提问: 请教C语言教材中的一道编程题

回复:
user: user-1
content: 引用 11 楼 jlfzhz 的回复:[quote=引用 10 楼 w673339759 的回复:] [quote=引用 5 楼 beiyuexianren 的回复:] [quote=引用 4 楼 lisong694767315 的回复:]  #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }   这个应该是正确的，不过(float)(1/fac)是不是更好一些？[/quote] 损失精度，整数相除，按整数相除规则处理，结果取整；将分子强制转换为浮点数，按浮点数相除规则处理，结果按浮点数存储[/quote]  +1[/quote]+1

user: user-2
content: 楼上说的基本都对

user: user-3
content: 引用 13 楼 yshhq 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  请问vc++6.0怎么单步调试和设断点调试？[/quote] VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。

user: user-4
content: 楼主加油，vc++调试起来

user: user-5
content: 引用 13 楼 yshhq 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  请问vc++6.0怎么单步调试和设断点调试？[/quote] 6.0太古老，电脑好的话建议vs2013，在msdn我告诉你上找，要么codeblocks也不错，就当练练英文了

user: user-6
content: 引用 7 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  请问vc++6.0怎么单步调试和设断点调试？

user: user-7
content: 自己调试分析分析呗。这种问题还是能发现的。

user: user-8
content: 引用 10 楼 w673339759 的回复:[quote=引用 5 楼 beiyuexianren 的回复:] [quote=引用 4 楼 lisong694767315 的回复:]  #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }   这个应该是正确的，不过(float)(1/fac)是不是更好一些？[/quote] 损失精度，整数相除，按整数相除规则处理，结果取整；将分子强制转换为浮点数，按浮点数相除规则处理，结果按浮点数存储[/quote]  +1

user: user-9
content: 引用 5 楼 beiyuexianren 的回复:[quote=引用 4 楼 lisong694767315 的回复:]  #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }   这个应该是正确的，不过(float)(1/fac)是不是更好一些？[/quote] 损失精度，整数相除，按整数相除规则处理，结果取整；将分子强制转换为浮点数，按浮点数相除规则处理，结果按浮点数存储

user: user-10
content: 分母为0了，循环的第一步，你看看

user: user-11
content: 引用 4 楼 lisong694767315 的回复: #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }   1.0 / fac 也不错

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-12
content: 引用 5 楼 beiyuexianren 的回复:[quote=引用 4 楼 lisong694767315 的回复:]  #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }   这个应该是正确的，不过(float)(1/fac)是不是更好一些？[/quote]  (float)(1/fac) 这个有问题吧？  (float)1/fac才对

user: user-13
content: 引用 4 楼 lisong694767315 的回复: #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }   这个应该是正确的，不过(float)(1/fac)是不是更好一些？

user: user-14
content: #include <stdio.h>  int main (void) { 	int i, n; 	long fac; 	float sum;  	printf("Enter an int number: "); 	scanf("%d", &n);  	fac = 1; 	sum = 1.0f;  	for (i = 1; i <= n; i++)  // 修改为1～n 	{ 		fac = fac * i; 		sum = sum + (float)1 / fac;  // 强制转换float 	}  	printf("E is: %f\n", sum);  	return 0; }

user: user-15
content: 同楼上~....

user: user-16
content: for (i = 0; i < n; i++) { fac = fac * i; sum = sum + 1 / fac; }  这个代码有问题，i=0时，fac也是0。会出现除数0这样的错误。  好好改一下这段的逻辑，即使没有除0错误，你也没有计算出n!的值。