失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 编写c语言程序解一元一次方程 一元方程计算器1.0的代码(C语言实现)

编写c语言程序解一元一次方程 一元方程计算器1.0的代码(C语言实现)

时间:2022-10-10 22:13:25

相关推荐

编写c语言程序解一元一次方程 一元方程计算器1.0的代码(C语言实现)

该计算器的代码由本人独立创作,如有错误及需要改进的地方,恳请指正,不胜感激。

一、基础知识

1.一元一次方程

1.1基本形式

ax + b = 0(其中a≠0)

1.2求解方法

一元一次方程的求解比较简单,只需移项、系数化为一即可,则一元一次方程的解为

x = -b / a

2.一元二次方程

2.1基本形式

ax^2 + bx + c = 0(其中a≠0)

2.2求解方法

一元二次方程的求解方法较多,这里为了编程的方便,运用求根公式法,方法如下:

(1)把Δ=

b^2 -4ac叫做一元二次方程ax^2

+ bx + c = 0(其中a≠0)的根的判别式。

(2)用求根公式解一元二次方程的方法叫做求根公式法。

(3)用求根公式法解一元二次方程的一般步骤为:

①把方程化成一般形式,进而确定a,b,c的值(注意符号);

②求出Δ=

b^2 -4ac的值(若Δ<0,则方程无实数根;若Δ>0,则方程有两个不相等的实数根;若Δ=0,则方程有两个相等实数根);

③在Δ=

b^2 -4ac>=0的前提下,把a、b、c的值代入公式进行计算求出方程的根。

注意:用求根公式法解一元二次方程的前提条件有两个:①a≠0;

②Δ大于等于0

一元二次方程的求根公式:

利用一元二次方程根的判别式(△=b-4ac)判断方程的根的情况。

一元二次方程ax^2

+ bx + c = 0(其中a≠0)的根与△=b-4ac有如下关系:

①当Δ>0时,方程有两个不相等的实数根;

②当Δ=0时,方程有两个相等的实数根;

③当Δ<0时,方程无实数根。

上述结论反过来也成立。

3.一元三次方程

3.1基本形式

ax^3 + bx^2 + cx +d =0(其中a≠0)

3.2求解方法

为了编程的方便,这里只叙述盛金求根法:

(1)盛金定理:

当b=0,c=0时,盛金公式1无意义;当A=0时,盛金公式3无意义;当A≤0时,盛金公式4无意义;当T1

时,盛金公式4无意义。

当b=0,c=0时,盛金公式1是否成立?盛金公式3与盛金公式4是否存在A≤0的值?盛金公式4是否存在T1

的值?盛金定理给出如下回答:

盛金定理1:当A=B=0时,若b=0,则必定有c=d=0(此时,方程有一个三重实根0,盛金公式1仍成立)。

盛金定理2:当A=B=0时,若b≠0,则必定有c≠0(此时,适用盛金公式1解题)。

盛金定理3:当A=B=0时,则必定有C=0(此时,适用盛金公式1解题)。

盛金定理4:当A=0时,若B≠0,则必定有Δ>0(此时,适用盛金公式2解题)。

盛金定理5:当A<0时,则必定有Δ>0(此时,适用盛金公式2解题)。

盛金定理6:当Δ=0时,若A=0,则必定有B=0(此时,适用盛金公式1解题)。

盛金定理7:当Δ=0时,若B≠0,盛金公式3一定不存在A≤0的值(此时,适用盛金公式3解题)。

盛金定理8:当Δ<0时,盛金公式4一定不存在A≤0的值。(此时,适用盛金公式4解题)。

盛金定理9:当Δ<0时,盛金公式4一定不存在T≤-1或T≥1的值,即T出现的值必定是-1<T<1。

显然,当A≤0时,都有相应的盛金公式解题。

注意:盛金定理逆之不一定成立。如:当Δ>0时,不一定有A<0。

盛金定理表明:盛金公式始终保持有意义。任意实系数的一元三次方程都可以运用盛金公式直观求解。

(2)利用盛金定理进行计算:(图片来自百度百科)

4.一元四次方程

4.1基本形式

ax^4 + bx^3 +cx^2 + dx + e = 0(其中a≠0)

4.2求解方法

为了编程的方便,这里只叙述置换群解法与盛金公式综合求根:(图片来自百度百科)

二、源代码

//整体架构

#include

#include

void fun1(); //定义“一元一次方程”的函数

void fun2(); //定义“一元二次方程”的函数

void fun3();//定义“一元三次方程”的函数

void fun4(); //定义“一元四次方程”的函数

int main(void)

{

char sel;

//初始化界面设计

printf(" 一元方程计算器1.0\n");

printf("\n\n");

printf("选择你要计算的方程:\n");

printf("a.一元一次方程(ax + b = 0, a !=0)\n");

printf("b.一元二次方程(ax^2 + bx + c = 0, a != 0)\n");

printf("c.一元三次方程(ax^3 + bx^2 + cx + d = 0, a != 0)\n");

printf("d.一元四次方程(ax^4 + bx^3 + cx^2 + dx + e = 0, a != 0)\n");

printf("你的选择是(a,b,c,d中的一个):");

//对所选择的方程输入数值并计算

while( scanf("%c", &sel) != 0 )

{

if( sel == 'a' )

{

fun1();

printf("\n\n");

}

else if( sel == 'b')

{

fun2();

printf("\n\n");

}

else if( sel == 'c')

{

fun3();

printf("\n\n");

}

else if( sel == 'd')

{

fun4();

printf("\n\n");

}

else{

printf("看清楚选项!你个逗逼!\n");

printf("再选一次:");

continue;

}

printf("需要继续计算方程吗?\n");

printf("如果需要,通过输入a,b,c,d选择方程计算;\n");

printf("如果不需要,按“关闭”退出。\n");

printf("你的选择是:");

scanf("%c", &sel);

}

return 0;

}

//“一元一次方程”的函数

void fun1()

{

float a, b;

printf("请输入方程的系数\n");

printf("a = ");

scanf("%f", &a);

printf("b = ");

scanf("%f", &b);

printf("该一元一次方程的解为:x = %.3f\n", -b/a);

}

//“一元二次方程”的函数

void fun2()

{

float a, b, c;

double delta;

double x1, x2;

printf("请输入方程的系数:\n");

printf("a = ");

scanf("%f", &a);

printf("b = ");

scanf("%f", &b);

printf("c = ");

scanf("%f", &c);

delta = b * b - 4 * a * c;

if( delta > 0 )

{

x1 = ( -b - sqrt(delta) ) / ( 2 * a );

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

printf("方程有两个解:x1 = %.3lf, x2 = %.3lf\n", x1, x2);

}

else if( delta == 0 )

{

x1 = -b / ( 2 * a );

printf("方程有唯一解:x1 = x2 = %.3lf\n", x1);

}

else

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

}

//“一元三次方程”的函数

void fun3()

{

float a, b, c, d; //存放三元一次方程的系数

double A, B, C, delta; //存放判别式

double x1, x2, x3; //存放方程的根

double Y1, Y2, X, T; //存放中间变量

printf("请输入方程的系数:\n");

printf("a = ");

scanf("%f", &a);

printf("b = ");

scanf("%f", &b);

printf("c = ");

scanf("%f", &c);

printf("d = ");

scanf("%f", &d);

//计算重根判别式

A = b * b - 3 * a * c;

B = b * c - 9 * a * d;

C = c * c - 3 * b * d;

//计算总判别式

delta = B * B - 4 * A * C;

// A = B = 0 的情况(盛金公式1)

if( A == 0 && B == 0 )

{

x1 = -b / (3 * a);

printf("方程有一个三重根:x1 = x2 =x3 = %.3lf\n", x1);

}

//delta > 0 的情况(盛金公式2)

else if( delta > 0 )

{

Y1 = A * b + 3 * a * (-B + sqrt(delta)) / 2;

Y2 = A * b + 3 * a * (-B + sqrt(delta)) / 2;

x1 = (-b - (pow(Y1,1/3) + pow(Y2,1/3))) / (3 * a);

X = (-b +(pow(Y1,1/3)) + pow(Y2,1/3)) / (6 *

a);

x2 = sqrt(3) * (pow(Y1,1/3) + pow(Y2,1/3)) / (6 * a);

x3 = -x2;

printf("方程有一个实根和一对共轭虚根,实根为:x1 = %lf\n", x1);

printf("虚根为:x2 = %.3lf + %.3lfi, x3 = %.3lf + %.3lfi\n", X, x2, X ,

x3);

}

//delta = 0

的情况(盛金公式3)

else if( delta == 0 )

{

x1 = -b / a + B / A;

x2 = -B / (2 * A);

printf("方程有3个实数根,其中有一个二重根:x1 = %.3lf, x2 = x3 = %.3lf\n", x1,

x2);

}

//delta < 0

的情况(盛金公式4)

else if( delta < 0 )

{

T = (2 * A * b - 3 * a * B) / (2 * sqrt(A * A * A));

X = acos(T);

x1 = (-b - 2 * sqrt(A) * cos(X/3)) / (3 * a);

x2 = (-b + sqrt(A) * (cos(X/3) + sqrt(3) *sin(X/3))) / (3 * a);

x3 = (-b + sqrt(A) * (cos(X/3) - sqrt(3) *sin(X/3))) / (3 * a);

printf("方程有三个不相等的实根:x1 = %.3lf, x2 = %.3lf, x3 = %.3lf\n", x1, x2,

x3);

}

}

// “一元四次方程”的函数

void fun4()

{

float a, b, c, d, e; //存放方程的系数

long double A, B, C, D, E, F, delta; //存放判别式变量

long double x1, x2, x3, x4;// 存放方程的根

long double X1, X2, y1, y2, y3, Y1, Y2, T, Z1, Z2, Z, W1, W2, X;

//存放中间变量

printf("请输入方程的系数:\n");

printf("a = ");

scanf("%f", &a);

printf("b = ");

scanf("%f", &b);

printf("c = ");

scanf("%f", &c);

printf("d = ");

scanf("%f", &d);

printf("e = ");

scanf("%f", &e);

//计算判别式

D = -(3 * b * b - 8 * a * c);

E = 3 * pow(b,4) + 16 * a * a * c * c - 16 * a * b * c + 16 * a * a

* b * d - 64 * pow(a,3) * e;

F = -(b * b * b - 4 * a * c + 8 * a * a * d);

A = D * D - 3 * E;

B = D * E - 9 * F;

C = E * E - 3 * D * F;

delta = B * B - 4 * A * C;

//D = E = F = 0 的情况

if( D == 0 && E == 0 && F == 0 )

{

x1 = -b / (4 * a);

printf("方程有一个四重根:x1 = x2 = x3 = x4 = %.3g\n", x1);

}

//A = B = C = 0 ,且 D != 0, E != 0, F != 0

的情况

else if( A == 0 && B == 0 && C == 0 && D !=

0 && E != 0 && F != 0 )

{

x1 = -b / (4 * a) - F / (4 * a * D);

x2 = -b / (4 * a) + 3 * F / (4 * a * D);

printf("方程有一个三重根:x1 = %.3g, x2 = x3 = x4 = %.3g\n", x1, x2);

}

//E = F = 0,且D != 0的情况

else if( E == 0 && F == 0 && D != 0 )

{

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

x3 = (-b - sqrt(-D)) / (4 * a);

printf("方程有两对重根:x1 = x2 = %.3g, x3 = x4 = %.3g\n", x1, x3);

}

//delta = 0 且A != 0的情况

else if( delta == 0 && A != 0 )

{

X1 = -D + B / A;

X2 = -B / (2 * A);

x1 = (-b + sqrt(X1) + sqrt(X2)) / (4 * a);

x2 = (-b + sqrt(X1) - sqrt(X2)) / (4 * a);

x3 = (-b - sqrt(X1)) / (4 * a);

printf("方程只有一对重根:x1 = %.3g, x2 = %.3g, x3 = x4 = %.3g\n", x1, x2,

x3);

}

//delta < 0的情况

else if( delta < 0 )

{

T = acos((2 * A * D - 3 * B) / (2 * sqrt(A * A * A)));

y1 = -(D + 2 * sqrt(A) * cos(T/3)) / 3;

y2 = -(D + 2 * sqrt(A) * cos((T + 2 * 3.14) / 3)) / 3;

y3 = -(D + 2 * sqrt(A) * cos((T + 2 * 3.14) / 3)) / 3;

x1 = (-b + sqrt(y1) + sqrt(y2) + sqrt(y3)) / (4 *

a);

x2 = (-b + sqrt(y1) - sqrt(y2) - sqrt(y3)) / (4 * a);

x3 = (-b - sqrt(y1) - sqrt(y2) + sqrt(y3)) / (4 * a);

x4 = (-b - sqrt(y1) + sqrt(y2) + sqrt(y3)) / (4 * a);

printf("方程有四个不同的实根:x1 = %.3g, x2 = %.3g, x3 = %.3g, x4 =

%.3g\n",x1, x2,x3, x4);

}

//delta > 0 的情况

else if( delta > 0 )

{

Y1 = A * D + 1.5 * (-B + sqrt(delta));

Y2 = A * D - 1.5 * (-B - sqrt(delta));

Z1 = (-2 * D - pow(Y1,1/3) - pow(Y2,1/3)) / 6;

Z2 = sqrt(3) * (pow(Y1,1/3) - pow(Y2,1/3)) / 6;

Z = -(-D + pow(Y1,1/3) - pow(Y2,1/3)) / 3;

W1 = sqrt(2 *(Z1 + sqrt(Z1 * Z1 + Z2 * Z2)));

W2 = sqrt(2 *(-Z1 + sqrt(Z1 * Z1 + Z2 * Z2)));

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

x2 = (-b + sqrt(Z) - 2 * W1) / (4 * a);

X = (-b - sqrt(Z)) / (4 * a);

x3 = -W2 / (2 * a);

x4 = -x3;

printf("方程有一对实根和一对虚根:\n");

printf("实根为:x1 = %.3g, x2 = %.3g\n", x1,

x2);

printf("虚根为:x3 = %.3g + %.3gi, x4 = %.3g +

%.3gi\n", X, x3, X, x4);

}

}

如果觉得《编写c语言程序解一元一次方程 一元方程计算器1.0的代码(C语言实现)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。