第二章基本制结构程序设计习题.docx

上传人:b****6 文档编号:5110918 上传时间:2022-12-13 格式:DOCX 页数:21 大小:40.95KB
下载 相关 举报
第二章基本制结构程序设计习题.docx_第1页
第1页 / 共21页
第二章基本制结构程序设计习题.docx_第2页
第2页 / 共21页
第二章基本制结构程序设计习题.docx_第3页
第3页 / 共21页
第二章基本制结构程序设计习题.docx_第4页
第4页 / 共21页
第二章基本制结构程序设计习题.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

第二章基本制结构程序设计习题.docx

《第二章基本制结构程序设计习题.docx》由会员分享,可在线阅读,更多相关《第二章基本制结构程序设计习题.docx(21页珍藏版)》请在冰豆网上搜索。

第二章基本制结构程序设计习题.docx

第二章基本制结构程序设计习题

第二章基本控制结构程序设计习题

一.基本概念与基础知识自测题

2.1程序阅读题

2.1.1设有说明:

inta=3,b=100;

下面的循环语句执行

(1)次,执行后a、b的值分别为

(2)、(3)。

while(b/a>5){

if(b-a>25)a++;

elseb/=a;

}

解答:

本题检查学生整除的概念。

跟踪:

a

b

b/a

循环次数

b-a

3

100

33

1

97

4

100

25

2

96

5

100

20

3

95

15

100

6

13

85

16

100

6

14

84

17

100

5

(1)14

(2)17

(3)100

2.1.2设有说明:

intx,y,n,k;

下面程序段的功能是备选答案中的

(1),当n=10,x=10打印结果是

(2)。

cin>>x>>n;

k=0;

do{

x/=2;

k++;

}while(k

y=1+x;

k=0;

do{

y=y*y;

k++;

}while(k

cout<

备选答案:

A.

B.

C.

D.

解答:

第一个循环使x成为:

;y成为:

;第二个循环使y成为:

(1)B

考虑整除,当x连除4次2以后即为0,所以:

为0

(2)1

2.1.3请看如下程序段:

if(num==1)cout<<”Alpha”;

elseif(num==2)cout<<”Bata”;

elseif(num==3)cout<<”Gamma”;

elsecout<<”Delta”;

当num的值分别为1、2、3时,上面程序段的输出分别为

(1)、

(2)、(3)。

解答:

检查条件语句与字符串输出概念:

(1)Alpha

(2)Bata

(3)Gamma

2.1.4执行下面程序段后,m和k的值分别为

(1)、

(2)。

intm,k;

for(k=1,m=0;k<=50;k++){

if(m>=10)break;

if(m%2==0){

m+=5;

continue;

}

m-=3;

}

解答:

注意continue语句的使用

初值

m=0

k=1

第1次循环后

m=5

k=2

第2次循环后

m=2

k=3

第3次循环后

m=7

k=4

第4次循环后

m=4

k=5

第5次循环后

m=9

k=6

第6次循环后

m=6

k=7

第7次循环后

m=11

k=8

第8次循环

m=11结束

k=8,k++未做

(1)11

(2)8

二.编程与综合练习题

2.2有一个函数:

编写程序,输入x,输出y。

解:

#include

usingnamespacestd;

intmain(){

doublex,y;

cout<<"输入x=";

cin>>x;

if(x<1)y=x;

elseif(x<10)y=2*x-1;

elsey=3*x-11;

cout<<"y="<

return0;

}

2.3设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,80~89分为4分,70~79分为3分,60~69分为2分,60分以下为1分。

解:

10分一档用10进行整除获得,转换用开关语句实行。

#include

usingnamespacestd;

intmain(){

intmark,result;//mark是百分制成绩,result是5分制

cout<<"请输入百分制成绩:

"<

cin>>mark;

if(mark<0){

cout<<"缺考!

"<

return0;

}

switch(mark/10){

case9:

case10:

result=5;

cout<<"输出五分制成绩:

"<

break;

case8:

result=4;

cout<<"输出五分制成绩:

"<

break;

case7:

result=3;

cout<<"输出五分制成绩:

"<

break;

case6:

result=2;

cout<<"输出五分制成绩:

"<

break;

case5:

case4:

case3:

case2:

case1:

case0:

result=1;

cout<<"输出五分制成绩:

"<

break;

default:

cout<<"输入错误!

"<

}

return0;

}

2.4编程计算个人所得税。

个人所得税率表如下:

月收入1200元起征,超过起征点500元以内部分税率5%,超过500元到2,000元部分税率10%,超过2,000元到5,000元部分税率15%,超过5,000元到20,000元部分税率20%,超过20,000元到40,000元部分税率25%,超过40,000元到60,000元部分税率30%,超过60,000元到80,000元部分税率35%,超过80,000元到100,000元部分税率40%,超过100,000元部分税率45%。

解:

应该从最高税率段开始计算,分段叠加。

先算两万元以上各段,每两万为一档,采用switch语句,注意没有使用break语句。

后面各低收入段,用if语句,也没有使用else,这两种方法是对应的。

第二要注意计算的入口处,收入减去该段的下限,进行计算,以后各段都是完整的段,计算十分简单。

#include

usingnamespacestd;

intmain(){

doubleincome,tax=0;

intk;

cout<<"请输入个人月收入:

"<

cin>>income;

if(income<=1200){

cout<<"免征个人所得税"<

return0;

}

elseincome-=1200;

if(income>20000){

k=income/20000;

switch(k){

default:

tax+=(income-100000)*0.45;income=100000;

case4:

tax+=(income-80000)*0.40;income=80000;

case3:

tax+=(income-60000)*0.35;income=60000;

case2:

tax+=(income-40000)*0.30;income=40000;

case1:

tax+=(income-20000)*0.25;income=20000;

}

}

if(income>5000){

tax+=(income-5000)*0.20;

income=5000;

}

if(income>2000){

tax+=(income-2000)*0.15;

income=2000;

}

if(income>500){

tax+=(income-500)*0.10;

income=500;

}

tax+=income*0.05;

cout<<"应征所得税:

"<

return0;

}

2.5编程打印如下图形:

*

***

*****

*******

***

***

***

解:

难点在三角形左边的空格的控制,嵌套一个循环语句完成此任务。

#include

usingnamespacestd;

intmain(){

inti,j;

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

for(j=4-i;j>0;j--)cout<<"";//三角形每行前部的空格

for(j=1;j<=2*i-1;j++)cout<<"*";

cout<

}

for(i=1;i<=3;i++)cout<<"***\n";

return0;

}

2.6编程输出下列图形,中间一行英文字母由输入得到。

A

BBB

CCCCC

DDDDDDD

CCCCC

BBB

A

解:

分上三角和下三角两部分分别处理左边的空格。

#include

usingnamespacestd;

intmain(){

charin;

inti,j;

do{

cout<<"输入一个字母:

";

cin>>in;

if((in>=97)&&(in<=122))in-=32;//小写改大写

}while((in<65)||(in>90));

intline=in-'A';

for(i=0;i<=line;i++){//上三角

for(j=line-i;j>0;j--)cout<<"";//前方空格

for(j=1;j<=2*i+1;j++)cout<<''<

cout<

}

for(i=line;i>0;i--){//下三角(少一行)

for(j=0;j<=line-i;j++)cout<<"";

for(j=1;j<=2*i-1;j++)cout<<''<

cout<

}

return0;

}

2.7输入n,求1!

+2!

+3!

+…+n!

解:

通常求和作为外循环,阶乘作为内循环。

这里考虑到:

n!

=n*(n-1)!

,利用递推法运算速度大大提高,同时两者可合并为一个循环。

本程序考虑了输入的健壮性。

#include

#include

usingnamespacestd;

intmain(){

intn,i,jch=1;

doubleresult=0;//result是结果

cout<<"请输入正整数n:

"<

cin>>n;

if(n<1){

cout<<"输入错误!

"<

return1;

}

result=1;

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

jch*=i;//jch是i的阶乘,注意n!

=n*(n-1)!

这样可少一层循环

result+=jch;

}

cout<

return0;

}

2.8猴子吃桃问题:

猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。

解:

采用递推法。

从最后一天逆推到第一天,9次循环。

#include

usingnamespacestd;

constintday=10;

intmain(){

inti,x=1;//最后一天只有一个

for(i=1;i

cout<<"开始共有桃子"<

\n";

return0;

}

2.9从键盘输入一组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中正数和负数的个数。

解:

将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数由和除以整数数量取得。

#include

#include

usingnamespacestd;

intmain(){

intstem[256],sum=0,pnum=0,nnum=0,i=0;

cout<<"从键盘输入一组非0整数,以输入0标志结束:

"<

cin>>stem[i];

while(stem[i]!

=0){

sum+=stem[i];//求和

if(stem[i]>0)pnum++;//正数数量

elsennum++;//负数数量

i++;

cin>>stem[i];

}

if(!

i)cout<<"0个数"<

else{

cout<<"平均值="<<(double)sum/(pnum+nnum)<

cout<<"正数个数="<

cout<<"负数个数="<

}

return0;

}

2.10编程找出1~500之中满足除以3余2,除以5余3,除以7余2的整数。

解:

中国古代数学问题(韩信点兵),采用穷举法。

注意三个条件同时成立用&&。

#include

usingnamespacestd;

intmain(){

inti;

for(i=1;i<=500;i++)

if((i%3==2)&&(i%5==3)&&(i%7==2))cout<

return0;

}

2.11编程求1000之内的所有完全数。

所谓完全数指的是一个数恰好等于它的所有因子和。

例如6=1+2+3,就是一个完全数。

解:

采用穷举法。

两重循环,外层是从1到999依次处理,内层是求该数的所有因子的和,并判断是否等于该数。

#include

usingnamespacestd;

intmain(){

inti,a,sum_yz;//sum_yz是a的因子和

for(a=1;a<1000;a++){

sum_yz=0;

for(i=1;i

if(a==sum_yz)cout<

}

return0;

}

2.12将100元换成用10元、5元和1元的组合,共有多少种组合方法。

解:

采用穷举法。

考虑10元最多10张,5元最多20张,余下是1元。

#include

usingnamespacestd;

intmain(){

inti,j,k,count=0;

for(i=0;i<=10;i++)//i是10元张数,j是5元张数,k是1元张数

for(j=0;j<=20;j++){

k=100-10*i-5*j;

if(k>=0){

cout<

count++;

}

}

cout<

return0;

}

2.13利用反正切展开计算π的近似值,要求误差10-5,公式如下:

令x=1,可计算出π/4的近似值。

解:

采用递推法。

初看每一项的递推通式不易写出,但每一项全看作奇数项,而偶数项全为零,则很容易写出:

第1项为x,第3项为第1项乘以x的平方除以项序号3乘以-1,其余类推。

同时和的误差小于最后一项的绝对值。

#include

#include

usingnamespacestd;

constdoublee=1e-5;

intmain(){

doublex,a,sum;

inti=3;

cout<<"请输入正切值:

"<

cin>>x;

a=x;

sum=x;

do{

a*=x*x*(-1);

sum+=a/i;

i+=2;

}while(fabs(a/i)>e);

cout<<"arctg("<

return0;

}

2.14用迭代法求方程x2+10cosx=0的根,误差限为10-5。

迭代公式如下:

解:

迭代法也是用循环语句实现,数学上

#include

#include

usingnamespacestd;

constdoublee=1e-5;

intmain(){

doublex0,x1;

intn=0;

cout<<"输入初始近似值:

"<

cin>>x1;

do{

x0=x1;

x1=(x0*x0-10*(x0*sin(x0)+cos(x0)))/(2*x0-10*sin(x0));

//x0是上次算出的结果,x1用作保存新算出的结果

n++;

}while((fabs(x1-x0)>e)&&(n<=1e5));

if(n>1e5)

cout<<"超出迭代1e5次\n";

elsecout<<"方程x*x+10*cos(x)=0的一个根为:

"<

cout<<"方程误差为:

"<

return0;

}

2.15两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛配对名单。

规定A不和J比赛,M不和D及E比赛。

列出所有可能的比赛名单。

解:

这是一个组合问题,使用穷举法。

共有5个位置,设甲队5名队员位置不变,乙队改变队员位置,进行配对。

注意第1个位置可在5个队员中任选一个,以后的位置必须扣除已选过的队员。

并扣除不能配对的情况,即得所有可能的比赛名单。

#include

usingnamespacestd;

intmain(){

charst1[5]={'A','B','C','D','E'},st2[5]={'J','K','L','M','N'};

inti=0,j,k,l,m,n;

for(j=0;j<5;j++){//0号位

if(j==0)continue;//A不与J比赛,即st1[0]不与st2[0]比赛

for(k=0;k<5;k++){//1号位

if(k==j)continue;

for(l=0;l<5;l++){//2号位

if(l==j||l==k)continue;

for(m=0;m<5;m++){//3号位

if(m==j||m==k||m==l)continue;

if(m==3)continue;//M不与D比赛,即st1[3]不与st2[3]比赛

for(n=0;n<5;n++){//4号位

if(n==3)continue;//M不与E比赛,即st1[4]不与st2[3]比赛

if(n==j||n==k||n==l||n==m)continue;

cout<

cout<

cout<

i++;

}

}

}

}

}

cout<

return0;

}

2.16编程模拟选举过程。

假定四位候选人:

zhang、wang、li、zhao,代号分别为1、2、3、4。

选举人直接键入候选人代号,1~4之外的整数视为弃权票,-1为终止标志。

打印各位候选人的得票以及当选者(得票数超过选票总数一半)名单。

解:

用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。

#include

#include

usingnamespacestd;

intmain(){

enumcandidate{feipiao,zhang,wang,li,zhao}cand;

intvote[5]={0},i,k=0,n;

cin>>n;

while(n!

=-1){

k++;

if(n>=1&&n<=4)vote[n]++;

elsevote[0]++;

cin>>n;

}

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

cand=(candidate)i;

switch(cand){

casefeipiao:

cout<

casezhang:

cout<

if(vote[cand]>k/2)cout<<"当选"<

elsecout<

break;

casewang:

cout<

if(vote[cand]>k/2)cout<<"当选"<

elsecout<

break;

caseli:

cout<

if(vote[cand]>k/2)cout<<"当选"<

elsecout<

break;

casezhao:

cout<

if(vote[cand]>k/2)cout<<"当选"<

elsecout<

break;

}

}

return0;

}

2.17改造【例2.14】,将运行结果(Fibonacii数列的前20项)存入文件。

解:

采用3步法。

所谓3步法,是将书上的第1和第2步合并,格式如下:

首先建立或打开一个输出文件,并与磁盘文件联系:

ofstreamofile("myfile2_17.txt");

再按一定格式存入数据:

ofile<

然后关闭文件:

ofile.close();

如要读出数据,则用输入文件打开,并与同一磁盘文件联系:

ifstreamifile("myfile2_17.txt");

再按同一格式读入数据:

ifile>>i

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

当前位置:首页 > 高中教育 > 初中教育

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

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