c语言解一元二次方程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言解一元二次方程相关的知识,希望对你有一定的参考价值。
#include "stdio.h"
#include "math.h"
void main()
printf("求方程ax^2+bx+c=0的根:\n");
L: printf("请分别输入a,b,c的值。\n");
double a,b,c,x1,x2,x,y;
char z;
printf("a=");
scanf("%lf",&a);
printf("b=");
scanf("%lf",&b);
printf("c=");
scanf("%lf",&c);
printf("你所输入的方程为%lfx^2+%lfx+%lf=0。\n",a,b,c);
M: printf("是否正确?(是y\否n)\n");
scanf("%c",&z);
if (z=='n')
goto L;
else if (z=='y')
if ((b*b-4*a*c)>0)
x1=(-b+sqrt(b*b-4*a*c))/(2*a),
x2=(-b-sqrt(b*b-4*a*c))/(2*a),
printf("有两个不同的实根:\nx1=%lf\nx2=%lf\n",x1,x2),
printf("\n");
if ((b*b-4*a*c)==0)
x1=-b/(2*a),
printf("有两个相同的实根:\nx1=x2=%lf\n",x1),
printf("\n");
if ((b*b-4*a*c)<0)
x=-b/(2*a),
y=sqrt(4*a*c-b*b)/(2*a),
printf("有两表个不同的曾根:\nx1=%lf+%lfi\nx2=%lf-%lfi\n",x,y,x,y),
printf("\n");
goto L ;
else printf("请正确输入,谢谢合作!\n");
//goto M;
运行后总多出一句“请正确输入,谢谢合作!”与“是否正确?(是y\否n)”请问为什么?怎么改进?
注意一下scanf,scanf并不是像通常所误解的,认为是直接读取用户的当前输入为输入值。
而是读取当前键盘缓冲区中的数据为本次输入值。
所以如果当前的键盘缓冲区内仍有数据,那么就不会接受当前的用户输入值。
在这个程序中,
由于键盘缓冲区内仍有用户上次输入数据时所残留的回车符(也就是输入a,b,c时最后敲的回车),
所以scanf("%c",&z); 这一句就将键盘缓冲区中的回车读入,作为z值了。
所以判断失败,多出一句“请正确输入,谢谢合作!”与“是否正确?(是y\否n)”。
改正办法:
在每句scanf前,加上强制清空键盘缓冲区的处理fflush(stdin);,以保证接收的数据的正确性。
这也是一个好的编程习惯。
改过以后的程序:
#include "stdio.h"
#include "math.h"
void main()
printf("求方程ax^2+bx+c=0的根:\n");
L: printf("请分别输入a,b,c的值。\n");
double a,b,c,x1,x2,x,y;
char z;
printf("a=");
fflush(stdin); //强制清空键盘缓冲区
scanf("%lf",&a);
printf("b=");
fflush(stdin); //强制清空键盘缓冲区
scanf("%lf",&b);
printf("c=");
fflush(stdin); //强制清空键盘缓冲区
scanf("%lf",&c);
printf("你所输入的方程为%lfx^2+%lfx+%lf=0。\n",a,b,c);
M: printf("是否正确?(是y\否n)\n");
fflush(stdin); //强制清空键盘缓冲区
scanf("%c",&z);
if (z=='n')
goto L;
else if (z=='y')
if ((b*b-4*a*c)>0)
x1=(-b+sqrt(b*b-4*a*c))/(2*a),
x2=(-b-sqrt(b*b-4*a*c))/(2*a),
printf("有两个不同的实根:\nx1=%lf\nx2=%lf\n",x1,x2),
printf("\n");
if ((b*b-4*a*c)==0)
x1=-b/(2*a),
printf("有两个相同的实根:\nx1=x2=%lf\n",x1),
printf("\n");
if ((b*b-4*a*c)<0)
x=-b/(2*a),
y=sqrt(4*a*c-b*b)/(2*a),
printf("有两表个不同的曾根:\nx1=%lf+%lfi\nx2=%lf-%lfi\n",x,y,x,y),
printf("\n");
goto L ;
else printf("请正确输入,谢谢合作!\n");
goto M;
参考技术A #include "stdio.h"
#include "math.h"
void main()
printf("求方程ax^2+bx+c=0的根:\n");
L: printf("请分别输入a,b,c的值。\n");
double a,b,c,x1,x2,x,y;
char z;
printf("a=");
scanf("%lf",&a);
printf("b=");
scanf("%lf",&b);
printf("c=");
scanf("%lf",&c);
printf("你所输入的方程为%lfx^2+%lfx+%lf=0。\n",a,b,c);
M: printf("是否正确?(是y\否n)\n");
scanf("%c",&z);
if (z=='n')
goto L;
if ((b*b-4*a*c)>0)
x1=(-b+sqrt(b*b-4*a*c))/(2*a),
x2=(-b-sqrt(b*b-4*a*c))/(2*a),
printf("有两个不同的实根:\nx1=%lf\nx2=%lf\n",x1,x2),
printf("\n");
if ((b*b-4*a*c)==0)
x1=-b/(2*a),
printf("有两个相同的实根:\nx1=x2=%lf\n",x1),
printf("\n");
if ((b*b-4*a*c)<0)
x=-b/(2*a),
y=sqrt(4*a*c-b*b)/(2*a),
printf("有两表个不同的曾根:\nx1=%lf+%lfi\nx2=%lf-%lfi\n",x,y,x,y),
printf("\n");
goto L ;
else printf("请正确输入,谢谢合作!\n");
//goto M;
很明显,else printf("请正确输入,谢谢合作!\n"); 与if (z=='n'),else if (z=='y') 属于同一判断等级,当输入完a,b,c后,程序开始判断z的情况,由于程序运行速度很快,第一次z应该为一个不定值,故选择最后一种情况输出,不防用switch语句,或许可以避免 参考技术B 我帮你改好了。我直接给你代码不好给你讲解,你加一下我的QQ吧QQ:510685263 参考技术C 你在输入完c的值以后要按一下回车,实际上这个值就被第一次赋给了z。
所以会有你所说的状况。
改法 M: printf("是否正确?(是y\否n)\n");
scanf("%c",&z);
getchar();
这样就可以了! 参考技术D 在判断根的时候,出现了三种情况,每个部分你没用用大括号括起来
以下是在visual c++ 6.0中调试通过的一段代码,希望有用:
#include "stdio.h"
#include "math.h"
void main()
printf("求方程ax^2+bx+c=0的根:\n");
L: printf("请分别输入a,b,c的值。\n");
double a,b,c,x1,x2,x,y;
char z;
printf("a=");
scanf("%lf",&a);
printf("b=");
scanf("%lf",&b);
printf("c=");
scanf("%lf",&c);
printf("你所输入的方程为%lfx^2+%lfx+%lf=0。\n",a,b,c);
printf("是否正确?(是y\否n)\n");
scanf("%c",&z);//这里用来读上次的回车
scanf("%c",&z);
if (z=='n')
goto L;
else if (z=='y')
if ((b*b-4*a*c)>0)
x1=(-b+sqrt(b*b-4*a*c))/(2*a),
x2=(-b-sqrt(b*b-4*a*c))/(2*a),
printf("有两个不同的实根:\nx1=%lf\nx2=%lf\n",x1,x2),
printf("\n");
if ((b*b-4*a*c)==0)
x1=-b/(2*a),
printf("有两个相同的实根:\nx1=x2=%lf\n",x1),
printf("\n");
if ((b*b-4*a*c)<0)
x=-b/(2*a),
y=sqrt(4*a*c-b*b)/(2*a),
printf("有两表个不同的曾根:\nx1=%lf+%lfi\nx2=%lf-%lfi\n",x,y,x,y),
printf("\n");
goto L ;
else
printf("请正确输入,谢谢合作!\n");
//goto M;
//应该再给程序写一个出口
怎样用C语言编一个解一元二次方程的程序?
这个只能计算已经化简成aX^2+bX+c=0的一元二次方程
double p=b*b-4*a*c;//计算Δ
if (p<0)
return 0;//方程无解,返回0
p=√p//求Δ的平方根
*x1=……//用求根公式计算X1
*x2=……//用求根公式计算X2
return 1;//方程有解,返回1
就这些了,求根公式和求平方根函数我忘了,你自己查一下。头文件要加一个<math.h>。
参考技术A#include <stdio.h>
#include <math.h>
int main(void)
double a,b,c,x1,x2,d;
scanf("%lf%lf%lf",&a,&b,&c);
d = b * b - 4 * a * c;
if(d > 0)
x1 = (-1 * b + sqrt(d)) / (2 * a);
x2 = (-1 * b - sqrt(d)) / (2 * a);
printf("x1 = %g,x2 = %g\\n",x1,x2);
else if(d = 0)
x1 = x2 = (-1 * b) / (2 * a);
printf("x1 = %g,x2 = %g\\n",x1,x2);
else
printf("方程没有实根\\n");
return();
哪有无关内容?最后一句return那个是返回值好吧
参考技术B用三个变量,来接一元二次方程的三个参数,
然后根据这三个参数计算△=b*b-4ac,再根据△判断根情况,并根据求根公式计算出相应根,以上都是用c数学计算不难 ,用到开方函数sqrt
(直接开)
形如x=p或(nx+m)=p(p≥0)的一元二次方程可采用直接开平方的方法解一元二次方程.
如果方程化成x²=p的形式,那么可得x=±p;(x²=p,x=±根号p)
如果方程能化成(nx+m)=p(p≥0)的形式,那么nx+m=±p.(同上)
注意:
①等号左边是一个数的平方的形式而等号右边是一个非负数.
②降次的实质是由一个一元二次方程转化为两个一元一次方程.
③方法是根据平方根的意义开平方
(配方法)
(1)将一元二次方程配成(x+m)=n的形式,再利用直接开平方法求解,这种解一元二次方程的方法叫配方法.
(2)用配方法解一元二次方程的步骤:
①把原方程化为ax²+bx+c=0(a≠0)的形式;
②方程两边同除以二次项系数,使二次项系数为1,并把常数项移到方程右边;
③方程两边同时加上一次项系数一半的平方;
④把左边配成一个完全平方式,右边化为一个常数;
⑤如果右边是非负数,就可以进一步通过直接开平方法来求出它的解,如果右边是一个负数,则判定此方程无实数解。
以上是关于c语言解一元二次方程的主要内容,如果未能解决你的问题,请参考以下文章