编写c语言程序解一元一次方程,一元方程计算器1.0的代码(C语言实现)
該計算器的代碼由本人獨立創(chuàng)作,如有錯誤及需要改進的地方,懇請指正,不勝感激。
一、基礎(chǔ)知識
1.一元一次方程
1.1?基本形式
ax + b = 0(其中a≠0)
1.2?求解方法
一元一次方程的求解比較簡單,只需移項、系數(shù)化為一即可,則一元一次方程的解為
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,則方程無實數(shù)根;若Δ>0,則方程有兩個不相等的實數(shù)根;若Δ=0,則方程有兩個相等實數(shù)根);
③在Δ=
b^2 -4ac>=0的前提下,把a、b、c的值代入公式進行計算求出方程的根。
注意:用求根公式法解一元二次方程的前提條件有兩個:①a≠0;
②Δ大于等于0
一元二次方程的求根公式:
利用一元二次方程根的判別式(△=b-4ac)判斷方程的根的情況。
一元二次方程ax^2
+ bx + c = 0(其中a≠0)的根與△=b-4ac有如下關(guān)系:
①當Δ>0時,方程有兩個不相等的實數(shù)根;
②當Δ=0時,方程有兩個相等的實數(shù)根;
③當Δ<0時,方程無實數(shù)根。
上述結(jié)論反過來也成立。
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出現(xiàn)的值必定是-1<T<1。
顯然,當A≤0時,都有相應(yīng)的盛金公式解題。
注意:盛金定理逆之不一定成立。如:當Δ>0時,不一定有A<0。
盛金定理表明:盛金公式始終保持有意義。任意實系數(shù)的一元三次方程都可以運用盛金公式直觀求解。
(2)利用盛金定理進行計算:(圖片來自百度百科)
?
?
?
4.一元四次方程
4.1?基本形式
ax^4 + bx^3 +cx^2 + dx + e = 0(其中a≠0)
4.2?求解方法
為了編程的方便,這里只敘述置換群解法與盛金公式綜合求根:(圖片來自百度百科)
二、源代碼
//整體架構(gòu)
#include
#include
void fun1(); ?//定義“一元一次方程”的函數(shù)
void fun2(); ?//定義“一元二次方程”的函數(shù)
void fun3();?//定義“一元三次方程”的函數(shù)
void fun4(); ?//定義“一元四次方程”的函數(shù)
int main(void)
{
char sel;
//初始化界面設(shè)計
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中的一個):");
//對所選擇的方程輸入數(shù)值并計算
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("需要繼續(xù)計算方程嗎?\n");
printf("如果需要,通過輸入a,b,c,d選擇方程計算;\n");
printf("如果不需要,按“關(guān)閉”退出。\n");
printf("你的選擇是:");
scanf("%c", &sel);
}
return 0;
}
//“一元一次方程”的函數(shù)
void fun1()
{
float a, b;
printf("請輸入方程的系數(shù)\n");
printf("a = ");
scanf("%f", &a);
printf("b = ");
scanf("%f", &b);
printf("該一元一次方程的解為:x = %.3f\n", -b/a);
}
//“一元二次方程”的函數(shù)
void fun2()
{
float a, b, c;
double delta;
double x1, x2;
printf("請輸入方程的系數(shù):\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("方程無實數(shù)根\n");
}
//“一元三次方程”的函數(shù)
void fun3()
{
float a, b, c, d; ?//存放三元一次方程的系數(shù)
double A, B, C, delta; ?//存放判別式
double x1, x2, x3; ?//存放方程的根
double Y1, Y2, X, T; ?//存放中間變量
printf("請輸入方程的系數(shù):\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個實數(shù)根,其中有一個二重根: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);
}
}
// “一元四次方程”的函數(shù)
void fun4()
{
float a, b, c, d, e; ?//存放方程的系數(shù)
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("請輸入方程的系數(shù):\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);
}
}
總結(jié)
以上是生活随笔為你收集整理的编写c语言程序解一元一次方程,一元方程计算器1.0的代码(C语言实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pads导出坐标文件html,【教程】P
- 下一篇: git clone远程仓库时,输错密码如