c++ 机械工业出版社课后习题.docx
《c++ 机械工业出版社课后习题.docx》由会员分享,可在线阅读,更多相关《c++ 机械工业出版社课后习题.docx(56页珍藏版)》请在冰豆网上搜索。
![c++ 机械工业出版社课后习题.docx](https://file1.bdocx.com/fileroot1/2022-11/23/1fc47d6c-6e7e-43e0-bcfd-767bf1895dd9/1fc47d6c-6e7e-43e0-bcfd-767bf1895dd91.gif)
c++机械工业出版社课后习题
习题1
1、编写一个程序,读取圆的半径,打印圆的直径、周长和面积。
π用常量值3.14159。
在输出中进行这些计算。
#include
usingnamespacestd;
intmain()
{
doubler,P=3.14159;
cout<<"Pleaseenterther:
"<cin>>r;
cout<<"d\tc\ts"<cout<<2*r<<"\t"<<2*P*r<<"\t"<
return0;
}
2、编写一个程序,读取5个整数并确定和打印其中的最大值。
#include
usingnamespacestd;
intmain()
{
inta[5],max,i;
cout<<"pleaseenterfivenumbers:
"<for(i=0;i<5;i++)
cin>>a[i];
max=a[0];
for(i=1;i<5;i++)
{
if(a[i]>max)
max=a[i];
}
cout<<"maxis"<return0;
}
3、编写一个程序,读取一个整数并确定和打印其为奇数或偶数。
#include
usingnamespacestd;
intmain()
{
intn;
cout<<"Pleaseenteranumber:
"<cin>>n;
if(n%2==0)
cout<<"even!
"<else
cout<<"odd!
"<return0;
}
4、用八条输出语句显示下列棋盘图案,然后用更少的语句显示这个棋盘图案。
********
********
********
********
********
********
********
********
#include
usingnamespacestd;
intmain()
{
cout<<"********"<cout<<"********"<cout<<"********"<cout<<"********"<cout<<"********"<cout<<"********"<cout<<"********"<cout<<"********"<return0;
}
习题2
2.1输入n,求1!
+2!
+3!
+…+n!
#include
usingnamespacestd;
intmain()
{
intfun(intx);
intn,i,s=0;
cout<<"pleaseenteranumber:
"<cin>>n;
for(i=1;i<=n;i++)
s=s+fun(i);
cout<<"1!
+2!
+3!
+…+n!
="<
return0;
}
intfun(intx)
{
inty;
if(x==1||x==0)
y=1;
else
y=x*fun(x-1);
returny;
}
2.2猴子吃桃问题:
猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。
#include
usingnamespacestd;
intmain()
{
intr=1,n,d=9;
for(d=9;d>0;d--)
{
n=2*(r+1);
r=n;
}
cout<<"total="<return0;
}
2.3从键盘输入一组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中正数和负数的个数。
#include
usingnamespacestd;
intmain()
{
inta[100],i,j,sum=0,n1=0,n2=0;
doubleave;
cout<<"Pleaseinputthearray(endwith0):
"<for(i=0;i<100;i++)
{
cin>>a[i];
if(a[i]==0)
break;
}
for(j=0;j
{
sum=sum+a[j];
if(a[j]>0)
n1=n1+1;
else
n2=n2+1;
}
ave=(double)sum/i;
cout<<"average="<cout<return0;
}
2.4编程找出1~500之中满足除以3余2,除以5余3,除以7余2的整数。
#include
usingnamespacestd;
intmain()
{
inti;
for(i=1;i<=500;i++)
{
if(i%3==2)
if(i%5==2)
if(i%7==2)
cout<
}
cout<return0;
}
2.5编程求1000之内的所有完全数。
所谓完全数指的是一个数恰好等于它的所有因子和。
例如6=1+2+3,就是一个完全数。
#include
usingnamespacestd;
intmain()
{
inti,j,s;
for(i=2;i<=1000;i++)
{
s=0;
for(j=1;j
{
if(i%j==0)
s=s+j;
}
if(i==s)//完全数的条件
{
cout<
cout<<"其因子分别为";
for(j=1;j
{
if(i%j==0)
cout<}
cout<}
}
return0;
}
2.6将100元换成用10元、5元和1元的组合,共有多少种组合方法。
#include
usingnamespacestd;
intmain()
{
inti,j,k,n=0;
for(i=0;i<=10;i++)//计算组合方法总数
{
for(j=0;j<=20;j++)
{
for(k=0;k<=100;k++)
{
if((i*10+j*5+k)==100)
n=n+1;
}
}
}
cout<<"共有"<cout<<"分别为"<cout<<"十块\t"<<"五块\t"<<"一块"<for(i=0;i<=10;i++)//分别将各种组合输出
{
for(j=0;j<=20;j++)
{
for(k=0;k<=100;k++)
{
if((i*10+j*5+k)==100)
{
cout<
<<}
}
}
}
return0;
}
习题3
3.1设计函数,将小写英文字符变为对应的大写字符。
#include
usingnamespacestd;
intmain()
{
chari,j;
charfun(chara);//函数声明
cout<<"请输入一个小写字母"<cin>>i;
j=fun(i);
cout<return0;
}
charfun(chara)//转换函数
{
charb;
b=a-32;
returnb;
}
3.2设计两个函数,分别求两个整数的最大公约数和最小公倍数。
#include
usingnamespacestd;
intmain()
{
inta,b,g,l;
intgcd(inta,intb);//gcd为英语最大公约数的首字母缩写,下面的lcm即为最小公倍数的缩写
intlcm(inta,intb);
cout<<"请输入两个不等的整数:
"<cin>>a>>b;
g=gcd(a,b);
l=lcm(a,b);
cout<<"最大公约数为"<cout<<"最小公倍数为"<return0;
}
intgcd(inta,intb)//用更相减损法求最大公约数
{
intc;
while(a!
=b)
{
if(a>b)
{
c=a-b;
a=c;
}
else
{
c=b-a;
b=c;
}
}
returna;
}
intlcm(inta,intb)//最小公倍数等于两数的积除以两数的最大公约数
{
intg,l;
g=gcd(a,b);
l=a*b/g;
returnl;
}
3.3设计函数digit(num,k),返回整数num从右边开始的第k位数字的值。
例如:
digit(4647,3)=6
digit(23523,7)=0
#include
usingnamespacestd;
intmain()
{
intdigit(intnum,intk);
intnum,k;
cout<<"请输入一个正整数及所求位数:
"<cin>>num>>k;
cout<return0;
}
intdigit(intnum,intk)
{
inta=1,b=1,i,j;
for(i=1;i<=k-1;i++)
a=a*10;
for(i=1;i<=k;i++)
b=b*10;
j=(num/a)-10*(num/b);
returnj;
}
3.4设计函数factors(num,k),返回整数num中包含因子k的个数,如果没有该因子,则返回0。
#include
usingnamespacestd;
intmain()
{
intfactors(intnum,intk);
intnum,k;
cout<<"请输入一个整数及所求因子"<cin>>num>>k;
cout<return0;
}
intfactors(intnum,intk)
{
intn=0;
while(num%k==0)
{
n=n+1;
k=k*k;
}
returnn;
}
3.5歌德巴赫猜想指出:
任何一个充分大的偶数都可以表示为两个素数之和。
例如:
4=2+26=3+38=3+5……50=3+47
将4~50之间的所有偶数用两个素数之和表示。
判断一个整数是否为素数用函数完成。
/*歌德巴赫猜想指出:
任何一个充分大的偶数都可以表示为两个素数之和。
例如:
4=2+26=3+38=3+5……50=3+47
将4~50之间的所有偶数用两个素数之和表示。
判断一个整数是否为素数用函数完成。
*/
#include
usingnamespacestd;
intmain()
{
intfun(intx);//声明判断素数的函数
inti,j,k;
for(i=4;i<=50;i=i+2)
{
for(j=1;j<=50;j++)
{
if(fun(j)==1)//代表j为素数
{
for(k=j;k<=50;k++)
{
if(fun(k)==1)
{
if(i==j+k)
cout<
}
}
}
}
}
return0;
}
intfun(intx)//判断素数的函数
{
inti,y;
if(x<=1)
y=0;
else
{
y=1;
for(i=2;i{
if(x%i==0)
{
y=0;
break;
}
}
}
returny;
}
习题4
4.1引用作为函数参数时为什么能实现两个实参之间的数据交换?
为什么对应实参不能为引用?
为什么返回值为引用的函数可以作为左值?
答:
因为当函数参数为实参的引用时,实际上是将实参的地址传递给了形参,它们共用同一个地址,所以当形参改变时,实参之间的数据也改变了;
因为引用不是一种独立的数据类型,所以对应实参不能为引用;
因为引用与变量共用相同的内存空间,当返回值为引用时,实际上就是返回的变量的值。
4.2构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括设置日期时间和输出时间,其中年、月请用枚举类型,并完成测试。
(包括用成员函数和用普通函数)
#include
#include
usingnamespacestd;
enumyear{Y2000,Y2001,Y2002,Y2003,Y2004,Y2005,Y2006,Y2007,Y2008,Y2009,Y2010,Y2011};//
enummonth{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
classTimedate
{
private:
yearY;
monthM;
intD,H,Min,S;
public:
Timedate()
{
Y=Y2011;
M=Jan;
D=1;
H=0;
Min=0;
S=0;
};
voidset(yeara,monthb,intc,intd,inte,intf)
{
Y=a;
M=b;
D=c;
H=d;
Min=e;
S=f;
};
voidshow()
{
cout<<"日期:
\n";
switch(Y)
{
caseY2000:
cout<<"2000年";break;
caseY2001:
cout<<"2001年";break;
caseY2002:
cout<<"2002年";break;
caseY2003:
cout<<"2003年";break;
caseY2004:
cout<<"2004年";break;
caseY2005:
cout<<"2005年";break;
caseY2006:
cout<<"2006年";break;
caseY2007:
cout<<"2007年";break;
caseY2008:
cout<<"2008年";break;
caseY2009:
cout<<"2009年";break;
caseY2010:
cout<<"2010年";break;
caseY2011:
cout<<"2011年";break;
}
switch(M)
{
caseJan:
cout<<"1月";break;
caseFeb:
cout<<"2月";break;
caseMar:
cout<<"3月";break;
caseApr:
cout<<"4月";break;
caseMay:
cout<<"5月";break;
caseJun:
cout<<"6月";break;
caseJul:
cout<<"7月";break;
caseAug:
cout<<"8月";break;
caseSep:
cout<<"9月";break;
caseOct:
cout<<"10月";break;
caseNov:
cout<<"11月";break;
caseDec:
cout<<"12月";break;
}
cout<cout<<"时间:
\n"
<<<
cout<};
voidget(year&a,month&b,int&c,int&d,int&e,int&f)
{
a=Y;
b=M;
c=D;
d=H;
e=Min;
f=S;
};
};
voidshow(Timedatea)
{
yearY;
monthM;
intD,H,Min,S;
a.get(Y,M,D,H,Min,S);
cout<<"日期:
\n";
switch(Y)
{
caseY2000:
cout<<"2000年";break;
caseY2001:
cout<<"2001年";break;
caseY2002:
cout<<"2002年";break;
caseY2003:
cout<<"2003年";break;
caseY2004:
cout<<"2004年";break;
caseY2005:
cout<<"2005年";break;
caseY2006:
cout<<"2006年";break;
caseY2007:
cout<<"2007年";break;
caseY2008:
cout<<"2008年";break;
caseY2009:
cout<<"2009年";break;
caseY2010:
cout<<"2010年";break;
caseY2011:
cout<<"2011年";break;
}
switch(M)
{
caseJan:
cout<<"1月";break;
caseFeb:
cout<<"2月";break;
caseMar:
cout<<"3月";break;
caseApr:
cout<<"4月";break;
caseMay:
cout<<"5月";break;
caseJun:
cout<<"6月";break;
caseJul:
cout<<"7月";break;
caseAug:
cout<<"8月";break;
caseSep:
cout<<"9月";break;
caseOct:
cout<<"10月";break;
caseNov:
cout<<"11月";break;
caseDec:
cout<<"12月";break;
}
cout<cout<<"时间:
\n"
<<<
cout<}
intmain()
{
Timedater;
r.set(Y2011,Apr,1,14,30,50);
r.show();
show(r);
r.set(Y2010,Jun,8,1,50,00);
r.show();
show(r);
return0;
}
4.3设计并测试一个矩形类(Rectangle),属性为矩形的左下与右上角的坐标,矩形水平放置。
操作为计算矩形周长与面积。
测试包括用成员函数和普通函数。
#include
usingnamespacestd;
classRectangle
{
private:
intx1,x2,y1,y2;
public:
Rectangle()
{
cout<<"请输入左下角和右上角的坐标:
"<cin>>x1>>y1>>x2>>y2;
};
intgetleftx()
{
returnx1;
};
intgetlefty()
{
returny1;
};
intgetrightx()
{
returnx2;
};
intgetrighty()
{
returny2;
};
intcircumference()//成员函数
{
return2*(x2-x1+y2-y1);
};
doublearea()
{
doubles;
s=(double)(x2-x1)*(y2-y1);
returns;
};
};
intcir(intx1,inty1,intx2,inty2)//普通函数
{
intc;
c=2*(x2-x1+y2-y1);
returnc;
}
doublear(intx1,inty1,intx2,inty2)
{
doubles;
s=(double)(x2-x1)*(y2-y1);
returns;
}
intmain()
{
Rectangler;
intc;
doubles;
c=r.circumference();//调用成员函数
s=r.area();
cout<<"周长为"<cout<<"