C语言编程习题.docx

上传人:b****6 文档编号:8261410 上传时间:2023-01-30 格式:DOCX 页数:55 大小:106.18KB
下载 相关 举报
C语言编程习题.docx_第1页
第1页 / 共55页
C语言编程习题.docx_第2页
第2页 / 共55页
C语言编程习题.docx_第3页
第3页 / 共55页
C语言编程习题.docx_第4页
第4页 / 共55页
C语言编程习题.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

C语言编程习题.docx

《C语言编程习题.docx》由会员分享,可在线阅读,更多相关《C语言编程习题.docx(55页珍藏版)》请在冰豆网上搜索。

C语言编程习题.docx

C语言编程习题

C语言编程习题

第二章

习题2-2

5.用二分法编程求6x4-40x2+9=0的所有实根。

#include

#include

#defineN10000

doubleA,B,C;

doublef(doublex)

{

return(A*x*x*x*x+B*x*x+C);

}

voidBM(doublea,doubleb,doubleeps1,doubleeps2)

{

intk;

doublex,xe;

doublevaluea=f(a);

doublevalueb=f(b);

if(valuea>0&&valueb>0||valuea<0&&valueb<0)return;

printf("Findingrootintherange:

[%.3lf,%.3lf]\n",a,b);

for(k=1;k<=N;k++){

x=(a+b)/2;

xe=(b-a)/2;

if(fabs(xe)

printf("Thexvalueis:

%g\n",x);

printf("f(x)=%g\n\n",f(x));

return;

}

if(f(a)*f(x)<0)b=x;

elsea=x;

}

printf("Noconvergence!

\n");

}

intmain()

{

doublea,b,eps1,eps2,step,start;

printf("PleaseinputA,B,C:

\n");

scanf("%lf%lf%lf",&A,&B,&C);

printf("Pleaseinputa,b,step,eps1,eps2:

\n");

scanf("%lf%lf%lf%lf%lf",&a,&b,&step,&eps1,&eps2);

for(start=a;(start+step)<=b;start+=step){

doubleleft=start;

doubleright=start+step;

BM(left,right,eps1,eps2);

}

return0;

}

运行:

PleaseinputA,B,C:

6-409

Pleaseinputa,b,step,eps1,eps2:

-101011e-51e-5

Findingrootintherange:

[-3.000,-2.000]

Thexvalueis:

-2.53643

f(x)=-0.00124902

Findingrootintherange:

[-1.000,0.000]

Thexvalueis:

-0.482857

f(x)=0.00012967

Findingrootintherange:

[0.000,1.000]

Thexvalueis:

0.482857

f(x)=0.00012967

Findingrootintherange:

[2.000,3.000]

Thexvalueis:

2.53643

f(x)=-0.00124902

有时若把判别语句

if(fabs(xe)

改为

if(fabs(xe)

会提高精度,对同一题运行结果:

Findingrootintherange:

[-3.000,-2.000]

Thexvalueis:

-2.53644

f(x)=-4.26496e-007

Findingrootintherange:

[-1.000,0.000]

Thexvalueis:

-0.482861

f(x)=-7.3797e-006

Findingrootintherange:

[0.000,1.000]

Thexvalueis:

0.482861

f(x)=-7.3797e-006

Findingrootintherange:

[2.000,3.000]

Thexvalueis:

2.53644

f(x)=-4.26496e-007

 

习题2-3

5.请用埃特金方法编程求出x=tgx在4.5(弧度)附近的根。

#include

#include

#defineN100

#definePI3.1415926

voidSM(doublex0,doubleeps)

{

intk;

doublex;

doublex1,x2;

for(k=1;k<=N;k++){

x1=sin(x0)/cos(x0);

x2=sin(x1)/cos(x1);

x=x0-(x1-x0)*(x1-x0)/(x2-2*x1+x0);

if(fabs(x-x0)

printf("Thexvalueis:

%g\n",x);

return;

}

x0=x;

}

printf("Noconvegence!

\n");

}

intmain()

{

doubleeps,x0;

printf("Pleaseinputeps,x0:

\n");

scanf("%lf%lf",&eps,&x0);

SM(x0,eps);

return0;

}

运行:

Pleaseinputeps,x0:

1e-54.5

Thexvalueis:

4.49341

 

习题2-4

11.请编出用牛顿法求复根的程序,并求出

P(z)=z4-3z3+20z2+44z+54=0

接近于z0=2.5+4.5i的零点。

#include

#include

#defineMAX_TIMES1000

typedefstruct{

doublereal,image;

}COMPLEX;

COMPLEXAa[5]={{54,0},{44,0},{20,0},{-3,0},{1,0}};

COMPLEXBb[4]={{44,0},{40,0},{-9,0},{4,0}};

COMPLEXzero={0,0};

doubleeps1=1e-6;

doubleeps2=1e-6;

COMPLEXmulti(COMPLEXa,COMPLEXb)

{

COMPLEXresult;

result.real=a.real*b.real-a.image*b.image;

result.image=a.image*b.real+a.real*b.image;

returnresult;

}

COMPLEXDiv(COMPLEXa,COMPLEXb){

COMPLEXz3;

doubles;

s=(b.real*b.real)+(b.image*b.image);

z3.real=b.real;

z3.image=-b.image;

z3=multi(a,z3);

z3.real=z3.real/s;

z3.image=z3.image/s;

returnz3;

}

COMPLEXadd(COMPLEXa,COMPLEXb)

{

COMPLEXresult;

result.real=a.real+b.real;

result.image=a.image+b.image;

returnresult;

}

COMPLEXsubtract(COMPLEXa,COMPLEXb)

{

COMPLEXresult;

result.real=a.real-b.real;

result.image=a.image-b.image;

returnresult;

}

COMPLEXtimes(COMPLEXz,intn){

inti;

COMPLEXresult={1,0};

for(i=0;i

returnresult;

}

doubledistance(COMPLEXa,COMPLEXb){

returnsqrt((a.real-b.real)*(a.real-b.real)+(a.image-b.image)*(a.image-b.image));

}

doublecomplex_abs(COMPLEXa){

returnsqrt(a.real*a.real+a.image*a.image);

}

COMPLEXf(COMPLEXx)

{

inti;

COMPLEXresult=zero;

for(i=0;i<5;i++){

result=add(result,multi(Aa[i],times(x,i)));

}

returnresult;

}

COMPLEXff(COMPLEXx){

inti;

COMPLEXresult=zero;

for(i=0;i<4;i++){

result=add(result,multi(Bb[i],times(x,i)));

}

returnresult;

}

intmain(){

COMPLEXz0,z1,result;

doublex,y;

intk;

printf("pleaseinputx,y\n");

scanf("%lf%lf",&x,&y);

z0.real=x;z0.image=y;

for(k=0;k

z1=subtract(z0,Div(f(z0),ff(z0)));

result=f(z1);

if(distance(z0,z1)

printf("Therootis:

z=(%.3f+%.3fi),f(z)=(%e+%ei)\n",z1.real,z1.image,result.real,result.image);

return0;

}

z0=z1;

}

printf("Noconvergence!

\n");

return0;

}

运行:

pleaseinputx,y

2.54.5

Therootis:

z=(2.471+4.641i),f(z)=(-1.122705e-007+-1.910245e-007i)

 

习题2-6

2.请编程用劈因子法求高次方程x4+x3+5x2+4x+4=0的所有复根。

#include

#include

intmain()

{

floatb[20],c[20];

floatdelta;

floateps;

intprint=0;

floatfru0,fru1,s0,s1,frv0,frv1;

floatdeltau,deltav;

floatu,v;

floata[20];

intn,j;

floatr0,r1;

floatr;

inti,k;

printf("Pleaseinputmaxexponent:

\n");

scanf("%d",&n);

printf("Pleaseinputepslion:

\n");

scanf("%f",&eps);

printf("Pleaseinputthecoefficient:

\n");

for(i=0;i<=n;i++)scanf("%f,",&a[i]);

for(j=0;j<=n;j++)printf("+%.3fX^%d",a[j],n-j);

printf("\n");

for(k=1;k<=2;k++){

u=a[n-1]/a[n-2];

v=a[n]/a[n-2];

if(k==2){

u=0;v=4;

}

while

(1){

b[0]=a[0];

b[1]=a[1]-u*b[0];

for(j=2;j<=n;j++){

b[j]=a[j]-u*b[j-1]-v*b[j-2];

}

r0=b[n-1];

r1=b[n]+u*b[n-1];

c[0]=b[0];

c[1]=b[1]-u*b[0];

for(j=2;j<=n-2;j++)

c[j]=b[j]-u*c[j-1]-v*c[j-2];

s0=c[n-3];

s1=c[n-2]+u*c[n-3];

fru0=u*s0-s1;

fru1=v*s0;

frv0=-s0;

frv1=-s1;

deltau=-(frv1*r0-frv0*r1)/(fru0*frv1-fru1*frv0);

deltav=-(fru1*r0-fru0*r1)/(frv0*fru1-frv1*fru0);

u=u+deltau;

v+=deltav;

delta=u*u-4*v;

if((fabs(deltau)

{

print=1;

printf("foundroots:

");

r=-u/2;

i=(int)sqrt(fabs(delta))/2;

if(delta<0){

printf("%.3f+%.3fi\t",r,fabs((double)i));

printf("%.3f-%.3fi\n",r,fabs((double)i));

}

else{

printf("%.3f\t\t",r+i);

printf("%.3f\n",r-i);

}

if(n==1)printf("Foundroot:

%.3f\n",a[1]/a[0]);

if(k==2)return0;

}

if(k==1&&print)break;

}/*endwhile*/

}/*endfor*/

return0;

}

运行:

Pleaseinputmaxexponent:

4

Pleaseinputepslion:

1e-5

Pleaseinputthecoefficient:

11544

+1.000X^4+1.000X^3+5.000X^2+4.000X^1+4.000X^0

foundroots:

-0.500+0.000i-0.500-0.000i

foundroots:

0.000+2.000i0.000-2.000i

 

习题3-1

5.请编程用列全主元高斯—约当消去法求矩阵A,B的逆矩阵。

#include

#include

#defineMAX10

intROW;

staticfloatA[MAX+1][2*MAX+1];

voidputout()

{

inti,j;

printf("\nThereversematrixis:

\n");

for(i=1;i<=ROW;i++){

for(j=ROW+1;j<=2*ROW;j++){

printf("%.3f",A[i][j]);

}

printf("\n");

}

}

intget()

{

floatmax[MAX+1];

intcount_r[MAX+1];

floattmp[2*MAX+1];

floatpass1,pass2;

inti,j,k;

for(i=1;i<=ROW;i++){

max[i]=A[i][i];

count_r[i]=i;

for(k=i;k<=ROW;k++){

if(max[i]

max[i]=A[k][i];

count_r[i]=k;

}

}/***********findthemaxone**********/

if(max[i]==0)return-1;

if(count_r[i]!

=i){

for(k=1;k<=2*ROW;k++)

{

tmp[k]=A[count_r[i]][k];

A[count_r[i]][k]=A[i][k];

A[i][k]=tmp[k];

}

}/*********changetherows*************/

pass1=A[i][i];

for(k=1;k<=2*ROW;k++){

A[i][k]/=pass1;

}

for(j=1;j<=ROW;j++){

if(j==i)continue;

else{

pass2=A[j][i];

for(k=1;k<=2*ROW;k++){

A[j][k]=A[j][k]-pass2*A[i][k];

}

}

}/************getsimple**************/

}

putout();

return0;

}

intmain()

{

inti,j;

floattmp=-1;

floatp;

printf("pleaseinputthenumberofROW:

");

scanf("%d",&ROW);

printf("\n");

if(ROW>=MAX){

printf("thenumberofrowistoobig!

\n");

return0;

}

printf("PleaseinputthematrixA:

\n");

for(i=1;i<=ROW;i++){

for(j=1;j<=ROW;j++){

scanf("%f,",&p);

A[i][j]=p;

if(tmp

}

}

if(tmp==0){

printf("Noinverse!

");

return0;

}

for(i=1;i<=ROW;i++){

A[i][i+ROW]=1;

}

returnget();

}

运行:

pleaseinputthenumberofROW:

3

PleaseinputthematrixA:

-385

2-74

19-6

Thereversematrixis:

0.0260.3960.285

0.0680.0550.094

0.1060.1490.021

pleaseinputthenumberofROW:

4

PleaseinputthematrixA:

21-3-1

3107

-124-2

10-15

Thereversematrixis:

-0.0470.588-0.271-0.941

0.388-0.3530.4820.765

-0.2240.294-0.035-0.471

-0.035-0.0590.0470.294

习题3-2

4.编程用追赶法解下列三对角线方程组。

#include

#include

#defineROW5

staticfloatA[ROW+1]={0,0,0,0,0,0};

staticfloatB[ROW+1]={0,0,0,0,0,0};

staticfloatC[ROW+1]={0,0,0,0,0,0};

staticfloatX[ROW+1]={0,0,0,0,0,0};

intmain()

{

inti;

printf("PleaseinputtheA:

\n");

for(i=2;i<=ROW;i++)scanf("%f,",&A[i]);

printf("PleaseinputtheB:

\n");

for(i=1;i<=ROW;i++)scanf("%f,",&B[i]);

printf("PleaseinputtheC:

\n");

for(i=1;i<=ROW-1;i++)scanf("%f,",&C[i]);

printf("PleaseinputtheF:

\n");

for(i=1;i<=ROW;i++)scanf("%f,",&X[i]);

C[1]=C[1]/B[1];

for(i=2;i<=ROW-1;i++)

C[i]=C[i]/(B[i]-A[i]*C[i-1]);

X[1]=X[1]/B[1];

for(i=2;i<=ROW;i++)

X[i]=(X[i]-A[i]*X[i-1])/(B[i]-A[i]*C[i-1]);

for(i=ROW-1;i>=1;i--)

X[i]=X[i]-C[i]*X[i+1];

printf("Thevalueis:

\n");

for(i=1;i<=ROW;i++)printf("x%d=%.3f\n",i,X[i]);

return0;

}

运行:

PleaseinputtheA:

-1-1-1-1

PleaseinputtheB:

44444

PleaseinputtheC:

-1-1-1-1

PleaseinputtheF:

100200200200100

Thevalueis:

x1=46.154

x2=84.615

x3=92.308

x4=84.615

x5=46.154

 

习题4-3

1.用高斯—赛

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1