基本控制结构程序设计习题.docx

上传人:b****4 文档编号:27005572 上传时间:2023-06-25 格式:DOCX 页数:23 大小:38.05KB
下载 相关 举报
基本控制结构程序设计习题.docx_第1页
第1页 / 共23页
基本控制结构程序设计习题.docx_第2页
第2页 / 共23页
基本控制结构程序设计习题.docx_第3页
第3页 / 共23页
基本控制结构程序设计习题.docx_第4页
第4页 / 共23页
基本控制结构程序设计习题.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

基本控制结构程序设计习题.docx

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

基本控制结构程序设计习题.docx

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

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

3.1程序阅读题

3.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

3.1.2设有说明:

intn,x,k,y。

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

(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

考虑整除,

连除4次以后为零,所以:

(2)1

3.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

3.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=1

k=0

第1次循环后

m=5

k=1

第2次循环

m=2

k=2

第3次循环

m=7

k=3

第4次循环

m=4

k=4

第5次循环

m=9

k=5

第6次循环

m=6

k=6

第7次循环

m=11

结束,k++未做

(1)11

(2)6

二.编程与综合练习题

3.2编程求一元二次方程ax2+bx+c=0的根。

包括以下判断和结果:

若输入a=0,给出提示;若∆>0,输出两个不等实根;若∆=0,输出两个相等实根;若∆<0,输出两个复数根。

解:

本题以一个绝对值极小的数作为实数0。

#include

#include

#include

voidmain(){

doublea,b,c。

doubledelta,x1,x2。

constdoublezero=1e-9。

//定义一个很小的常数

intsign。

cout<<"输入三个系数a(a!

=0),b,c:

"<

cin>>a>>b>>c。

if(fabs(a)

cout<<"二次项系数为0,方程根是-c/b"。

exit(0)。

}

cout<<"a="<

delta=b*b-4*a*c。

if(fabs(delta)

cout<<"方程有两个相同实根:

"。

cout<<"x1=x2="<<-b/(2*a)<

}

else{

if(delta>0)

sign=1。

else

sign=0。

delta=sqrt(fabs(delta))。

x1=-b/(2*a)。

x2=delta/(2*a)。

if(sign){

cout<<"方程有两个不同实根:

"。

cout<<"x1="<

}

else{//delta<0

cout<<"方程无实根!

有两个不同复数根:

"。

cout<<"x1="<

}

}

}

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

解:

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

#include

voidmain(){

intmark,result。

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

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

"<

cin>>mark。

if(mark<0){

cout<<"缺考!

"<

return。

}

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<<"输入错误!

"<

}

}

3.4编程打印如下图形:

*

***

*****

*******

***

***

***

解:

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

#include

voidmain(){

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"。

}

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

A

BBB

CCCCC

DDDDDDD

CCCCC

BBB

A

解:

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

#include

voidmain(){

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<

}

}

3.6输入n,求1!

+2!

+3!

+…+n!

解:

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

这里考虑到:

n!

=n*(n-1)!

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

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

#include

#include

voidmain(){

intn。

doubleresult=0。

//result是结果

cin>>n。

if(n<1)

{

cout<<"输入错误!

"<

//return。

exit(0)。

}

result=1。

for(inti=2,jch=1。

i<=n。

i++)

{

jch*=i。

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

=n*(n-1)!

这样可少一层循环

result+=jch。

}

cout<

}

3.7猴子吃桃问题:

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

解:

采用递推法。

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

#include

constintday=10。

voidmain(){

inti,x=1。

//最后一天只有一个

for(i=1。

i

i++)//从一天前推到九天前

x=(x+1)*2。

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

\n"。

}

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

解:

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

#include

#include

voidmain(){

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<<"负数个数="<

}

}

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

解:

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

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

#include

voidmain(){

inti。

for(i=1。

i<=500。

i++)

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

cout<

}

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

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

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

解:

采用穷举法。

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

#include

voidmain(){

inti,a,sum_yz。

//sum_yz是a的因子和

for(a=1。

a<1000。

a++){

sum_yz=0。

for(i=1。

i

i++)

if(a%i==0)sum_yz+=i。

if(a==sum_yz)

cout<

}

}

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

解:

采用穷举法。

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

#include

voidmain(){

for(inti=0,j,k,count=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<

}

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

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

解:

采用递推法。

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

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

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

#include

#include

constdoublee=1e-6。

voidmain(){

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("<

}

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

迭代公式如下:

解:

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

#include

#include

constdoublee=1e-5。

voidmain(){

floatx0,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<<"方程误差为:

"<

}

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

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

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

解:

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

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

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

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

#include

voidmain(){

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<

}

3.15编程模拟选举过程。

假定四位候选人:

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

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

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

解:

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

#include

#include

voidmain(){

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<

break。

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。

}

}

}

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

解:

采用3步法。

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

ofstreamofile("myfile3_16.txt")。

再按一定格式存入数据:

ofile<

然后关闭文件:

ofile.close()。

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

ifstreamifile("myfile3_16.txt")。

再按同一格式读入数据:

ifile>>i>>j>>k>>l。

等,并输出

最后关闭文件:

file.close()。

#include

#include

constintm=20。

voidmain(){

intfib0=0,fib1=1,fib2,i,j,k,l。

charch,a[256]。

ofstreamofile("myfile3_16.txt")。

ofile<

for(intn=3。

n<=m。

n++){

fib2=fib0+fib1。

ofile<

if(n%5==0)ofile<

//控制每行5个数据

fib0=fib1。

fib1=fib2。

}

ofile.close()。

cout<<"是否要将文件输出?

Y或N"<

cin>>ch。

if(ch=='y'||ch=='Y'){

ifstreamifile("myfile3_16.txt")。

while

(1){

ifile>>i>>j>>k>>l。

//由文件读入

if(ifile.eof()!

=0)break。

cout<

//屏幕显示

}

ifile.close()。

}

}

3.17改造【例3.16】,将运行结果(100以内素数)存入文件。

解:

采用4步法。

首先定义一个输出文件:

ofstreamofile。

再打开该文件并与并与磁盘文件联系:

ofile.open("myfile3_17.txt")。

按一定格式把数据存入文件。

最后关闭文件。

效果与3步法相同。

读文件同样可用3步法或4步法。

#include

#include

#include

constintn=100。

voidmain(){

inta[n],i,j。

charch,b[256]。

ofstreamofile。

ifstreamifile。

for(i=0。

i

i++)a[i]=1+i。

//用数组保存整数1-100

a[0]=0。

//1不是素数,置0

for(i=0。

i

i++){

if(a[i]==0)continue。

//该数已经置0,判断下一个数

for(j=i+1。

j

j++)if(a[j]%a[i]==0)a[j]=0。

//是a[i]倍数的元素置0;

}

ofile.open("myf

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

当前位置:首页 > PPT模板 > 其它模板

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

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