用C语言编写一程序求解一元二次方程的根。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写一程序求解一元二次方程的根。相关的知识,希望对你有一定的参考价值。

要求用一个函数实现,并且分别用三个函数实现判别式大于0、等于0和小于0的运算。

#include<stdio.h>
#include<math.h>
void m(float a,float b,float c)

double x1,x2;
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("方程的根是%.2lf和%.2lf",x1,x2);

void n(float a,float b,float c)

double x;
x=(-b)/(2*a);
printf("方程的根为%.2lf",x);

void f(float a,float b,float c)

printf("方程无实数根\n");

main()

float a,b,c;
printf("请输入a,b,c的值\n");
scanf("%f%f%f",&a,&b,&c);
if(b*b-4*a*c>0)
m(a,b,c);
if(b*b-4*a*c==0)
n(a,b,c);
if(b*b-4*a*c<0)
f(a,b,c);
追问

方程的根是%.2lf和%.2lf", %2lf是什么意思

追答

方程的根是%.2lf和%.2lf", %2lf是什么意思
这个是让输出更好看一些,%.2lf是控制输出的浮点数只输出小数点后两位的

参考技术A

C语言编写一程序求解一元二次方程的根:

#include<stdio.h> 

#include<math.h> 

void m(float a,float b,float c) 

 

double x1,x2; 

x1=(-b+sqrt(b*b-4*a*c))/(2*a); 

x2=(-b-sqrt(b*b-4*a*c))/(2*a); 

printf("方程的根是%.2lf和%.2lf",x1,x2); 

 

void n(float a,float b,float c) 

 

double x; 

x=(-b)/(2*a); 

printf("方程的根为%.2lf",x); 

 

void f(float a,float b,float c) 

 

printf("方程无实数根\\n"); 

 

main() 

 

float a,b,c; 

printf("请输入a,b,c的值\\n"); 

scanf("%f%f%f",&a,&b,&c); 

if(b*b-4*a*c>0) 

m(a,b,c); 

if(b*b-4*a*c==0) 

n(a,b,c); 

if(b*b-4*a*c<0) 

f(a,b,c); 

根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。
具体步骤如下:/导致这种情况的原因主要是。

参考技术B #include<stdio.h>
#include<math.h>
int main(void)

float a,b,c,d,y,x1,x2;
scanf("%f %f %f",&a,&b,&c);
d=b*b-4*a*c;
if(a==0 && b==0 && c==0)
printf("Zero Equation");
else if(a==0 && b==0 && c!=0)


else if(d<0 && b==0 && a>0)
printf("0.00+%.2fi\n0.00-%.2fi",sqrt(-d)/2/a,sqrt(-d)/2/a);
else if(d<0 && b==0 && a<0)
printf("0.00-%.2fi\n0.00+%.2fi",sqrt(-d)/2/a,sqrt(-d)/2/a);

return 0;

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)”请问为什么?怎么改进?

多出一句“请正确输入,谢谢合作!”与“是否正确?(是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语言编写一程序求解一元二次方程的根。的主要内容,如果未能解决你的问题,请参考以下文章

c语言求解一元二次方程

用c语言求一个四元二次方程解的个数

求一元二次方程的根c语言

用C语言编写程序,输入一元二次方程的系数a,b,c,计算方程的根,要考虑虚根的情况,求解答

c语言编写一元2次方程。

用if语言解一元二次方程的C语言程序,在线等~~...