當前位置:編程學習大全網 - 編程語言 - 單調增量編程

單調增量編程

代碼如下,非常完整。

# 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 ");

}

}

}

}

  • 上一篇:關於arm板上的 spi控制器 的工作原理
  • 下一篇:高考集訓班的利弊
  • copyright 2024編程學習大全網