user-0 提问: C语言新手问题

回复:
user: user-0
content: 引用 17 楼 a149979032 的回复:[quote=引用 15 楼 a149979032 的回复:] [quote=引用 14 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 a149979032 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 // [/quote] 您能跟我说一下问题是出在哪里了吗？我输出也改了%lf了[/quote] 我试了输出还是0.00000，表示不解[/quote] 终于好了原来是n没有赋初值，十分感谢老师！

user: user-0
content: 引用 15 楼 a149979032 的回复:[quote=引用 14 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 a149979032 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 // [/quote] 您能跟我说一下问题是出在哪里了吗？我输出也改了%lf了[/quote] 我试了输出还是0.00000，表示不解

user: user-0
content: 又遇到问题了，这个怎么用double输出的时候是0.000000，求大神解答 #include<stdio.h> #include<math.h> int main() { 	int i,n; 	float x0,x1,f,f1; 	x0=1.5; 	for(i=1;i<=n;i++) 	{ 		f=2*x0*x0*x0-4*x0*x0+3*x0-6; 		f1=6*x0*x0-8*x0+3; 		x1=x0-f/f1; 		if(fabs(x0-x1)<1e-5) break; 		x0=x1; 	} 	printf("x1=%f\n",x1); 	return 0; }

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-0
content: 谢谢解答

user: user-2
content: http://blog.csdn.net/shenzhou111/article/details/7826444

user: user-3
content: scanf("%f",&a);  改成：  scanf("%lf",&a);  输入时double一定要用 %lf  输出时可以用 %f

user: user-4
content: double 8字节，flot 4字节，你scanf使用 %f肯定是不行的 scanf 的话 %f和%lf不能混淆的

user: user-4
content: 把%f 改成 %lf

user: user-5
content: 类型匹配：float对应的是%f,double对应的是%lf

user: user-0
content: 引用 14 楼 zhao4zhong1 的回复:[quote=引用 12 楼 a149979032 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 // [/quote] 您能跟我说一下问题是出在哪里了吗？我输出也改了%lf了

user: user-1
content: 引用 12 楼 a149979032 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //

user: user-0
content: 引用 10 楼 user-6 的回复:[quote=引用 7 楼 a149979032 的回复:] 又遇到问题了，这个怎么用double输出的时候是0.000000，求大神解答 #include<stdio.h> #include<math.h> int main() { 	int i,n; 	float x0,x1,f,f1; 	x0=1.5; 	for(i=1;i<=n;i++) 	{ 		f=2*x0*x0*x0-4*x0*x0+3*x0-6; 		f1=6*x0*x0-8*x0+3; 		x1=x0-f/f1; 		if(fabs(x0-x1)<1e-5) break; 		x0=x1; 	} 	printf("x1=%f\n",x1); 	return 0; } 没有进入for循环，x1为初始值[/quote] 你试一下看看啊

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:#include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗

user: user-1
content: #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //

user: user-6
content: 引用 7 楼 a149979032 的回复:又遇到问题了，这个怎么用double输出的时候是0.000000，求大神解答 #include<stdio.h> #include<math.h> int main() { 	int i,n; 	float x0,x1,f,f1; 	x0=1.5; 	for(i=1;i<=n;i++) 	{ 		f=2*x0*x0*x0-4*x0*x0+3*x0-6; 		f1=6*x0*x0-8*x0+3; 		x1=x0-f/f1; 		if(fabs(x0-x1)<1e-5) break; 		x0=x1; 	} 	printf("x1=%f\n",x1); 	return 0; } 没有进入for循环，x1为初始值

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 老师，我最下面这个程序经过调试在float时没有出现问题，但是变成double就不行了，试了很多次，找不出原因，真心求解，望帮我解惑，谢谢

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