# include & ltstdio.h & gt
# include & ltmath.h & gt
void main()
{
double x0,x1,xm,f0,f1,fm,x2,x3;//x2,x3是駐點,x0,x1,xm,f0,x1是二分法求根的工具。
雙a[3],r[3];
int i,j = 0;
printf("輸入3個系數:\ n ");
for(I = 0;我& lt3;i++)
{
printf("a[%d]= ",I);
scanf("%lf ",a+I);
}
printf("函數為:\ n ");
printf(" x * x * x+% 5.2f * x * x+% 5.2f * x+% 5.2f = 0 \ n ",a[0],a[1],a[2]);
//y=3*x*x+2*a[0]*x+a[1]
if(4 * a[0]* a[0]-12 * a[1]& lt;0)//方程是單調遞增的,與橫軸只有壹個交點。
{
printf("隨意輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
if(f0*f1==0)
{
如果(f0==0)
{
xm = x0
printf("函數的唯壹根是%.2f\n ",XM);
}
其他
{
XM = x 1;
printf("函數的唯壹根是%.2f\n ",XM);
}
if(fabs(XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2])& lt;1e-6)
printf("恭喜!答案是對的!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
其他
{
while(F0 * f 1 & gt;=0)
{
printf("再次輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
}
做
{
XM =(x0+x 1)/2;
FM = XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2];
if(F0 * FM & gt;0)
x0 = xm
其他
x 1 = XM;
}while(fabs(x0-x1)>1e-6);
XM =(x0+x 1)/2;
printf("函數的唯壹根是%.2f\n ",XM);
if(fabs(XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2])& lt;1e-6)
printf("恭喜!答案是對的!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
}
else//方程增減,但與橫軸的交點不確定。
{
x2 =(-2 * a[0]-sqrt(4 * a[0]* a[0]-12 * a[1]))/6;
x3 =(-2 * a[0]+sqrt(4 * a[0]* a[0]-12 * a[1]))/6;
printf("停滯的函數有:\ n ");
printf("x2=%.2f\nx3=%.2f\n ",x2,x3);
if((x2 * x2 * x2+a[0]* x2 * x2+a[1]* x2+a[2])& gt;0 & amp& amp(x3 * x3 * x3+a[0]* x3 * x3+a[1]* x3+a[2])& gt;0)
//等式的左半單調遞增分支與水平軸相交。
{
printf("輸入2個數字啟動程序,其中壹個數字應該是x2,另壹個應該小於x2。妳只能得到壹個根。\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
while(F0 * f 1 & gt;=0)
{
printf("再次輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
}
做
{
XM =(x0+x 1)/2;
FM = XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2];
if(F0 * FM & gt;0)
x0 = xm
其他
x 1 = XM;
}while(fabs(x0-x1)>1e-6);
XM =(x0+x 1)/2;
printf("函數的唯壹根是%.2f\n ",XM);
if(fabs(XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2])& lt;1e-6)
printf("恭喜!答案是對的!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
else if((x2 * x2 * x2+a[0]* x2 * x2+a[1]* x2+a[2])& lt;0 & amp& amp(x3 * x3 * x3+a[0]* x3 * x3+a[1]* x3+a[2])& lt;0)
//方程的右半單調遞增分支與橫軸相交。
{
printf("輸入2個數字來開始這個過程,其中壹個數字應該是x3,另壹個應該大於x3,妳將只得到壹個根。\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
while(F0 * f 1 & gt;=0)
{
printf("再次輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
}
做
{
XM =(x0+x 1)/2;
FM = XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2];
if(F0 * FM & gt;0)
x0 = xm
其他
x 1 = XM;
}while(fabs(x0-x1)>1e-6);
XM =(x0+x 1)/2;
printf("函數的唯壹根是%.2f\n ",XM);
if(fabs(XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2])& lt;1e-6)
printf("恭喜!答案是對的!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
else if((x2 * x2 * x2+a[0]* x2 * x2+a[1]* x2+a[2])*(x3 * x3 * x3+a[0]* x3 * x3+a[1]* x3+a[2])& lt;0)//壹般方程有三個交點,分別位於遞增、遞減、遞增區間。
{
printf("妳會得到3個根,3次輸入2個數字,第壹種情況,妳輸入的較大的數字應該是x2;在第二種情況下,妳輸入的2個數字應該是x2和x3,在第三種情況下,較小的應該是x3。\ n ");
for(I = 0;我& lt3;i++)
{
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
while(F0 * f 1 & gt;=0)
{
printf("再次輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
}
做
{
XM =(x0+x 1)/2;
FM = XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2];
if(F0 * FM & gt;0)
x0 = xm
其他
x 1 = XM;
}while(fabs(x0-x1)>1e-6);
r[I]=(x0+x 1)/2;
printf("好,下壹個!\ n ");
}//循環三次,求三根。
printf("函數的3個根是:\ n ");
for(I = 0;我& lt3;i++)
printf("r[%d]=%.2f\n ",I,r[I]);
for(I = 0;我& lt3;i++)
if(fabs(r[I]* r[I]* r[I]+a[0]* r[I]* r[I]+a[1]* r[I]+a[2])& lt;1e-6)
j++;
如果(j==3)
printf("恭喜妳,答案都答對了!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
其他
{
if(x2 * x2 * x2+a[0]* x2 * x2+a[1]* x2+a[2]= = 0 & amp;& ampx3 * x3 * x3+a[0]* x3 * x3+a[1]* x3+a[2]!=0)//x2是重根。
{
r[0]= r[1]= x2;
//補充剩下的
printf("輸入2個數字來開始這個過程,其中壹個數字應該是x3,另壹個應該大於x3,妳將只得到壹個根。\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
while(F0 * f 1 & gt;=0)
{
printf("再次輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
}
做
{
XM =(x0+x 1)/2;
FM = XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2];
if(F0 * FM & gt;0)
x0 = xm
其他
x 1 = XM;
}while(fabs(x0-x1)>1e-6);
r[2]=(x0+x 1)/2;
printf("函數的2個根是:\ n ");
for(I = 0;我& lt3;i++)
printf("r[%d]=%.2f\n ",I,r[I]);
for(I = 0;我& lt3;i++)
if(fabs(r[I]* r[I]* r[I]+a[0]* r[I]* r[I]+a[1]* r[I]+a[2])& lt;1e-6)
j++;
如果(j==3)
printf("恭喜妳,答案都答對了!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
else if(x2 * x2 * x2+a[0]* x2 * x2+a[1]* x2+a[2]!= 0 & amp& ampx3 * x3 * x3+a[0]* x3 * x3+a[1]* x3+a[2]= = 0)
{
r[0]= r[1]= x3;
//補充剩下的
printf("輸入2個數字開始這個過程,其中壹個數字應該是x2,另壹個應該小於x2,妳將得到壹個根。\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
while(F0 * f 1 & gt;=0)
{
printf("再次輸入2個數字:\ n ");
printf(" x0 = ");
scanf("%lf ",& ampx0);
printf(" x 1 = ");
scanf("%lf ",& ampx 1);
F0 = x0 * x0 * x0+a[0]* x0 * x0+a[1]* x0+a[2];
f 1 = x 1 * x 1 * x 1 a[0]* x 1 * x 1+a[1]* x 1+a[2];
}
做
{
XM =(x0+x 1)/2;
FM = XM * XM * XM+a[0]* XM * XM+a[1]* XM+a[2];
if(F0 * FM & gt;0)
x0 = xm
其他
x 1 = XM;
}while(fabs(x0-x1)>1e-6);
r[2]=(x0+x 1)/2;
printf("函數的2個根是:\ n ");
for(I = 0;我& lt3;i++)
printf("r[%d]=%.2f\n ",I,r[I]);
for(I = 0;我& lt3;i++)
if(fabs(r[I]* r[I]* r[I]+a[0]* r[I]* r[I]+a[1]* r[I]+a[2])& lt;1e-6)
j++;
如果(j==3)
printf("恭喜妳,答案都答對了!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
其他
{
r[0]= r[1]= r[2]= x2;
printf("3根相等!\ n ");
printf(" 3根是:\ n ");
for(I = 0;我& lt3;i++)
printf("r[%d]=%.2f\n ",I,r[I]);
for(I = 0;我& lt3;i++)
if(fabs(r[I]* r[I]* r[I]+a[0]* r[I]* r[I]+a[1]* r[I]+a[2])& lt;1e-6)
j++;
如果(j==3)
printf("恭喜妳,答案都答對了!\ n ");
其他
printf("對不起,妳應該再試壹次。\ n ");
}
}
}
}