基本控制结构程序设计习题.doc_第1页
基本控制结构程序设计习题.doc_第2页
基本控制结构程序设计习题.doc_第3页
基本控制结构程序设计习题.doc_第4页
基本控制结构程序设计习题.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

14第二章 基本控制结构程序设计习题第二章 基本控制结构程序设计习题一基本概念与基础知识自测题3.1 程序阅读题3.1.1 设有说明:int a=3, b=100;下面的循环语句执行 (1) 次,执行后a、b的值分别为 (2) 、 (3) 。while(b/a5)if(b-a25) a+;else b/=a;解答:本题检查学生整除的概念。跟踪:abb/a循环次数b-a31003319741002529651002039515100613851610061484171005停(1)14(2)17(3)1003.1.2 设有说明:int n,x,k,y;下面程序段的功能是备选答案中的 (1) ,当n=10,x=10打印结果是 (2) 。cinxn;k=0;dox/=2;k+;while(kn);y=1+x;k=0;doy=y*y;k+;while(kn);coutyendl;备选答案:A. B. C. D. 解答:第一个循环使x成为:;y成为:;第一个循环使y成为:;(1)B考虑整除,连除4次以后为零,所以:(2)13.1.3 请看如下程序段:if(num=1) cout”Alpha”;else if(num=2) cout”Bata”;else if(num=3) cout”Gamma”;else cout”Delta”;当num的值分别为1、2、3时,上面程序段的输出分别为(1) 、(2) 、(3) 。解答:检查条件语句与字符串输出概念:(1)Alpha(2)Bata(3)Gamma3.1.4 执行下面程序段后,m和k的值分别为 (1) 、 (2) 。int m,k;for(k=1,m=0;k=10) break;if(m%2=0)m+=5;continue;m-=3;解答:注意continue语句的使用初值m=1k=0第1次循环后m=5k=1第2次循环m=2k=2第3次循环m=7k=3第4次循环m=4k=4第5次循环m=9k=5第6次循环m=6k=6第7次循环m=11结束,k+未做(1)11(2)6二编程与综合练习题3.2 编程求一元二次方程ax2+bx+c=0的根。包括以下判断和结果:若输入a=0,给出提示;若D0,输出两个不等实根;若D=0,输出两个相等实根;若D0,输出两个复数根。解:本题以一个绝对值极小的数作为实数0。#include #include #include void main()double a,b,c;double delta,x1,x2;const double zero=1e-9;/定义一个很小的常数int sign;cout输入三个系数a(a!=0), b, c:abc;if(fabs(a)zero)cout二次项系数为0,方程根是-c/b;exit(0);couta=atb=btc=cendl;delta=b*b-4*a*c;if(fabs(delta)zero)/绝对值很小的数即被认为是0cout方程有两个相同实根:;coutx1=x2=-b/(2*a)0)sign=1;else sign=0;delta=sqrt(fabs(delta);x1=-b/(2*a);x2=delta/(2*a);if(sign)cout方程有两个不同实根:;coutx1=x1+x2tx2=x1-x2endl;else/delta0cout方程无实根!有两个不同复数根:;coutx1=x1+ix2tx2=x1-ix2endl;3.3 设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,8089分为4分,7079分为3分,6069分为2分,60分以下为1分。解:10分一档用10进行整除获得,转换用开关语句实行。#include void main()int mark,result; /mark是百分制成绩,result是5分制cout请输入百分制成绩:mark;if(mark0) cout缺考!endl;return;switch (mark/10)case 9:case 10:result=5;cout输出五分制成绩:resultendl;break;case 8:result=4;cout输出五分制成绩:resultendl;break;case 7: result=3;cout输出五分制成绩:resultendl;break;case 6: result=2;cout输出五分制成绩:resultendl;break;case 5:case 4:case 3:case 2:case 1:case 0: result=1;cout输出五分制成绩:resultendl;break;default: cout输入错误!endl;3.4 编程打印如下图形: * * * * * * * * * * * * * * * * * * * * * * * * *解:难点在三角形左边的空格的控制,嵌套一个循环语句完成此任务。#include void main()int i,j;for (i=1;i0;j-)/三角形每行前部的空格cout ;for(j=1;j=2*i-1;j+)cout *;coutendl;for(i=1;i=3;i+) cout * * *n;3.5 编程输出下列图形,中间一行英文字母由输入得到。AB B BC C C C C D D D D D D D C C C C C B B B A解:分上三角和下三角两部分分别处理左边的空格。#include void main()char in;int i,j;docoutin;if(in=97)&(in=122) in-=32;/小写改大写while(in90);int line=in-A;for (i=0;i0;j-)cout ;/前方空格for(j=1;j=2*i+1;j+)cout char(i+A);cout0;i-)/下三角(少一行)for(j=0;j=line-i;j+)cout ;for(j=1;j=2*i-1;j+)cout char(i-1+A);coutendl;3.6 输入n,求1!+2!+3!+n!解:通常求和作为外循环,阶乘作为内循环。这里考虑到:n!=n*(n-1)!,利用递推法运算速度大大提高,同时两者可合并为一个循环。本程序考虑了输入的健壮性。#include #include void main()int n;double result=0; /result是结果cinn;if(n1) cout输入错误!endl;/return;exit(0);result=1;for(int i=2,jch=1;i=n;i+)jch*=i; /jch是i的阶乘,注意n!=n*(n-1)!这样可少一层循环result+=jch;coutresultendl;3.7 猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。解:采用递推法。从最后一天逆推到第一天,9次循环。#include const int day=10;void main()int i,x=1;/最后一天只有一个for(i=1;iday;i+)/从一天前推到九天前x=(x+1)*2;cout开始共有桃子x个。n;3.8 从键盘输入一组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中的个数。解:将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数由和除以整数数量取得。#include #include void main()int stem256,sum=0,pnum=0,nnum=0,i=0;cout从键盘输入一组非0整数,以输入0标志结束:stemi;while(stemi!=0)sum+=stemi;/求和if(stemi0) pnum+;/正数数量else nnum+;/负数数量i+;cinstemi;if(!i) cout0个数endl;else cout平均值(double)sum/(pnum+nnum)endl;/平均值习惯不用整数cout正数个数pnumendl;cout负数个数nnumendl;3.9 编程找出1500之中满足除以3余2,除以5余3,除以7余2的整数。解:中国古代数学问题(韩信点兵),采用穷举法。注意三个条件同时成立用&。#include void main()int i;for(i=1;i=500;i+)if(i%3=2)&(i%5=3)&(i%7=2)coutiendl;3.10 编程求1000之内的所有完全数。所谓完全数指的是一个数恰好等于它的所有因子和。例如6=1+2+3,就是一个完全数。解:采用穷举法。两重循环,外层是从1到999依次处理,内层是求该数的所有因子的和,并判断是否等于该数。#include void main()int i,a,sum_yz; /sum_yz是a的因子和for(a=1;a1000;a+)sum_yz=0;for(i=1;ia;i+)if (a%i=0) sum_yz+=i;if (a=sum_yz)coutaendl;3.11 将100元换成用10元、5元和1元的组合,共有多少种组合方法。解:采用穷举法。考虑10元最多10张,5元最多20张,余下是1元。#include void main()for(int i=0,j,k,count=0;i=10;i+)/i是10元张数,j是5元张数,k是1元张数for(j=0;j=0)coutitjtkendl;count+;coutcountendl;3.12 利用反正切展开计算p的近似值,要求误差10-5,公式如下:令x=1,可计算出p/4的近似值。解:采用递推法。初看每一项的递推通式不易写出,但每一项全看作奇数项,而偶数项全为零,则很容易写出:第1项为x,第3项为第1项乘以x的平方除以项序号3乘以-1,其余类推。同时和的误差小于最后一项的绝对值。#include#includeconst double e=1e-6;void main()double x,a,sum;int i=3;cout请输入弧度值:x;a=x;sum=x;doa*=x*x*(-1);sum+=a/i;i+=2;while(fabs(a/i)e);coutarctg(x)=sumendl;3.13 用迭代法求方程x2+10cosx=0的根,误差限为10-5。迭代公式如下:解:迭代法也是用循环语句实现,数学上#include#includeconst double e=1e-5;void main()float x0,x1;int n=0;cout输入初始近似值:x1;dox0=x1;x1=(x0*x0-10*(x0*sin(x0)+cos(x0)/(2*x0-10*sin(x0);/x0是上次算出的结果,x1用作保存新算出的结果n+;while(fabs(x1-x0) e)&(n1e5)cout超出迭代1e5次n;else cout方程x*x+10*cos(x)=0的一个根为:x1endl;cout方程误差为:x1*x1+10*cos(x1)endl;3.14 两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛配对名单。规定A不和J比赛,M不和D及E比赛。列出所有可能的比赛名单。解:这是一个组合问题,使用穷举法。共有5个位置,设甲队5名队员位置不变,乙队改变队员位置,进行配对。注意第1个位置可在5个队员中任选一个,以后的位置必须扣除已选过的队员。并扣除不能配对的情况,即得所有可能的比赛名单。#includevoid main()char st15=A,B,C,D,E,st25=J,K,L,M,N;int i=0,j,k,l,m,n;for(j=0;j5;j+)/0号位if(j=0) continue;/A不与J比赛,即st10不与st20比赛for(k=0;k5;k+)/1号位if(k=j) continue;for(l=0;l5;l+)/2号位if(l=j|l=k) continue;for(m=0;m5;m+)/3号位if(m=j|m=k|m=l) continue;if(m=3) continue;/M不与D比赛,即st13不与st23比赛for(n=0;n5;n+)/4号位if(n=3) continue;/M不与E比赛,即st14不与st23比赛if(n=j|n=k|n=l|n=m) continue;coutst10-st2jtst11-st2kt;coutst12-st2ltst13-st2mt;coutst14-st2nendl;i+;coutiendl;3.15 编程模拟选举过程。假定四位候选人:zhang、wang、li、zhao,代号分别为1、2、3、4。选举人直接键入候选人代号,14之外的整数视为弃权票,-1为终止标志。打印各位候选人的得票以及当选者(得票数超过选票总数一半)名单。解:用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。#include#includevoid main()enum candidatefeipiao,zhang,wang,li,zhaocand;int vote5=0,i,k=0,n;cinn;while(n!=-1)k+;if(n=1&nn;for(i=0;i5;i+)cand=(candidate)i;switch(cand)case feipiao:coutsetw(10)feipiaotvotecandendl;break;case zhang:coutsetw(10)zhangtk/2) cout 当选endl;else coutendl;break;case wang:coutsetw(10)wangtk/2) cout 当选endl;else coutendl;break;case li:coutsetw(10)litk/2) cout 当选endl;else coutendl;break;case zhao:coutsetw(10)zhaotk/2) cout 当选endl;else coutendl;break;3.16 改造【例3.11】,将运行结果(Fibonacii数列的前20项)存入文件。解:采用3步法。首先建立或打开一个输出文件,并与磁盘文件联系:ofstream ofile(myfile3_16.txt);再按一定格式存入数据:ofilesetw(15)fib0setw(15)ijkl;等,并输出最后关闭文件:file.close();#include#includeconst int m=20;void main()int fib0=0,fib1=1,fib2,i,j,k,l;char ch,a256;ofstream ofile(myfile3_16.txt);ofilesetw(15)fib0setw(15)fib1;for(int n=3;n=m;n+)fib2=fib0+fib1;ofilesetw(15)fib2;if(n%5=0) ofileendl;/控制每行5个数据fib0=fib1; fib1=fib2;ofile.close();cout是否要将文件输出?Y或Nch;if(ch=y|ch=Y)ifstream ifile(myfile3_16.txt);while(1)ifileijkl;/由文件读入if(ifile.eof()!=0) break;coutsetw(15)isetw(15)jsetw(15)ksetw(15)lendl;/屏幕显示ifile.close();3.17 改造【例3.16】,将运行结果(100以内素数)存入文件。解:采用4步法。首先定义一个输出文件:ofstream ofile;再打开该文件并与并与磁盘文件联系:ofile.open(myfile3_17.txt);按一定格式把数据存入文件。最后关闭文件。效果与3步法相同。读文件同样可用3步法或4步法。#include#include#includeconst int n=100;void main()int an,i,j;char ch,b256;ofstream ofile;ifstream ifile;for(i=0;in;i+) ai=1+i;/用数组保存整数1-100a0=0;/1不是素数,置0for(i=0;in;i+)if(ai=0) continue;/该数已经置0,判断下一个数for(j=i+1;jn;j+) if(aj%ai=0) aj=0;/是ai倍数的元素置0;ofile.open(myfile3_17.txt);int count=0;ofile1-n之间的素数:endl;for(i=0;in;i+)/输出所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论