废话少说,上代码:
#include<stdio.h> #include<math.h> int main()//解一元二次方程 { int a,b,c; double tool,x1,x2; printf("请以此输入一元二次方程的系数:a,b,c\n"); scanf("%d",&a);//编译是在主函数中是自上向下编译的,所以不要把赋值tool,x1,x2写在scanf函数之前 scanf("%d",&b); scanf("%d",&c); tool=b*b-4*a*c; x1=(-b+sqrt(tool))/(2*a); x2=(-b-sqrt(tool))/(2*a); if(tool>0) { printf("方程有两个解:\nx1=%lf\nx2=%lf\n",x1,x2); } else if(tool==0) { printf("方程有一个解:x=%lf\n",x1); } else { printf("方程无解\n"); } return 0; }
分享一下敲这个代码时的思路和遇到的问题:
1.虽然感觉有些丢脸但我还是要说的,我居然因为少打一个()和一个*,用了足足2分钟才找到这两个错误......
x1=(-b+sqrt(tool))/(2*a); ----------就是这里 2*a 敲成了 2a ,”/“后的()没有加 !!!
2.不同数据类型运算问题:不同数据类型相互运算,两个数据会先自动转换为精度较大的数据类型,再进行运算(据说这是计算机为了数据更精准偷摸干的)
3.不同数据类型赋值问题:首先要知道赋值是将”=“右边的数据赋值给左边,如果右边数据类型精度较大,可能会导致数据丢失(不是一定);
反之如果左边的数据类型精度较大,则无需担心数据的丢失(因为人家装的下嘛 ~ ~ )
4.一开始我把对 tool,x1,x2 的赋值放在了 scanf 函数之前,但我发现结果总出问题!!!
仔细想想我靠,又是编译顺序的问题,编译器自上向下编译,当看到 tool=b*b-4*a*c; x1=(-b+sqrt(tool))/(2*a); x2=(-b-sqrt(tool))/(2*a);
编译器:”tool=b*.....,哎!?b是谁啊,我靠???“,好家伙这锅我背,变量 b 这时还没进行初始化就对变量 tool 赋值,代码跑起来自然是错误的结果...
孩子只是个大一的弟弟,如果文章有错误,请狠狠地批评我 (~ ̄(OO) ̄)ブ