该计算器的代码由本人独立创作,如有错误及需要改进的地方,恳请指正,不胜感激。
一、基础知识
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语言实现)》对你有帮助,请点赞、收藏,并留下你的观点哦!