C语言编程习题.docx
《C语言编程习题.docx》由会员分享,可在线阅读,更多相关《C语言编程习题.docx(55页珍藏版)》请在冰豆网上搜索。
![C语言编程习题.docx](https://file1.bdocx.com/fileroot1/2023-1/29/6701df61-cadb-4b5d-a026-da58d5cf7eea/6701df61-cadb-4b5d-a026-da58d5cf7eea1.gif)
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;ireturnresult;
}
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;kz1=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.用高斯—赛