程序的控制结构循环结构

程序的控制结构循环结构

ID:38443752

大小:1.07 MB

页数:49页

时间:2019-06-12

上传者:U-145848
程序的控制结构循环结构_第1页
程序的控制结构循环结构_第2页
程序的控制结构循环结构_第3页
程序的控制结构循环结构_第4页
程序的控制结构循环结构_第5页
资源描述:

《程序的控制结构循环结构》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

程序的控制结构——循环结构 在解决一些复杂问题时,常常需要做许多相似的甚至重复的工作。而这些工作转化为程序,就是若干重复的程序段。同样的程序段反复执行多次,这就是循环的概念。循环结构程序设计可能减少重复书写程序段的工作量,用于解决一些需要重复多次才能完成的问题。顺序结构、分支结构和循环结构并不是孤立的,在循环结构中可以有分支结构和顺序结构,同样在选择结构中也可以有循环结构和顺序结构。在实际编程中经常将这三种结构相互结合以实现各种算法,设计出相应的程序。 for语句 for语句格式for(循环变量初始化;循环条件;循环变量增量)语句1;for(循环变量初始化;循环条件;循环变量增量){语句1;语句2;……}开始循环变量初始化条件表达式执行循环体语句循环变量增量结束falsetrue(1)执行“循环变量初始化”语句,使循环变量获得一个初值。(2)判断是否满足“循环条件”,若满足则执行一遍循环体,否则结束整个for语句。(3)由循环变量增量语句,得出循环变量的新值。(4)自动转到第(2)步。 for语句——语句格式举例将控制变量从1变到100,增量为1for(i=1;i<=100;++i)将控制变量从100变到1,增量为-1for(i=100;i>=1;--i)控制变量从7变到77,增量为7for(i=7;i<=77;i+=7)控制变量从20变到2,增量为-2for(inti=20;i>=2;i-=2)按所示数列改变控制变量值:99、88、77、66、55、44、33、22、11、0,增量为-11for(intj=99;j>=0;j-=11)控制变量i和j共同进行循环控制,i从1变到99,j从2变到100,增量均为2。for(inti=1,j=2;i<=99&&j<=100;i+=2,j+=2)需要说明的是:可以在for循环“循环变量初始化”语句中声明变量(如最后3个例子),这些变量只在for循环结构中有效,离开了该for结构,变量就无效了。 for语句——例4.1输出1—100之间所有偶数。#includeusingnamespacestd;intmain(){for(inti=2;i<=100;i+=2)cout<usingnamespacestd;intmain(){intsum=0;for(inti=1;i<=100;++i)sum+=i;cout<usingnamespacestd;intmain(){longlongs;//longlong的范围为-263~263-1,//比-1019~1019略窄intn;//n不能定义为longlong,否则for语句死循环s=1;scanf("%d",&n);for(inti=1;i<=n;++i)//当n=13时s超出longint的范围s*=i;printf("%I64d ",s);//使用%d输出longlong结果有误return0;} for语句——例4.4利用for循环,分别计算1—100中奇数的和、偶数#includeusingnamespacestd;intmain(){intjssum=0;intossum=0;for(intjs=1,os=2;js<=99&&os<=100;js+=2,os+=2){jssum+=js;ossum+=os;}cout<<"thesumofoddnumbersis:"<>x;while(x<0)cin>>x;功能:当输入的数据小于0时,重复读数据。 while语句——例4.5求s=1+2+3……+n,当加到第几项时,s的值会超过1000?#includeusingnamespacestd;intmain(){intn=0,s=0;while(s<=1000){++n;s+=n;}cout<usingnamespacestd;intmain(){inta,b,c;cin>>a>>b;c=a%b;while(c!=0)//也可以使用while(c),c++中非0即真{a=b;b=c;c=a%b;}cout<<"最大公约数="<=5的最小n值。分析:不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要求出的。对于和式中的每个数据项,对应的通式为1/i,i=1,2,…n。所以可采用循环累加的方法来计算出它的值。设循环变量为i,它应从1开始取值,每次增加1,直到和式的值不小于5为止,此时的i值就是所求的n。设累加变量为s,在循环体内把1/i的值累加到s上。 while语句——例4.7#includeusingnamespacestd;intmain(){inti=0;floats=0;while(s<5)//当s的未超过5时{++i;s+=1.0/i;}cout<usingnamespacestd;intmain(){inti;floats=0;for(i=1;s<5;++i)s+=1.0/i;cout<intmain(){intx,n=0,min=1000,max=-1000,s=0;while(scanf("%d",&x)==1){s+=x;if(xmax)max=x;++n;}printf("%d%d%.3lf ",min,max,(double)s/n);return0;} 上机练习1、球弹跳高度的计算:一球从某一高度h落下(单位米),每次落地后反跳回原来高度的一半,再落下。编程计算气球在第10次落地时,共经过多少米?第10次反弹多高?2、角谷猜想:对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。程序要求输入一个整数,将经过处理得到1的过程输出来。3、级数求和:已知:Sn=1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。现给出一个整数K(1<=k<=15),要求计算出一个最小的n,使得Sn>K。4、分离整数的各个数:给定一个整数n(1<=n<=100000000),要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。5、数字反转:给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如输入-380,反转后得到的新数为-83。6、含k个3的数:输入两个正整数m和k,其中1usingnamespacestd;intmain(){inta,b,c;cin>>a>>b;do{c=a%b;a=______;b=______;}while(______);cout<<"thegreatestcommondivisoris:"<<______;return0;}bcc!=0a do-while语句——例4.10求1992个1992的乘积的末两位数是多少?【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求1992个92相乘,并且每次的乘积只需取末两位。#includeusingnamespacestd;intmain(){inta=1,t=0;do{++t;a=(a*92)%100;}while(t!=1992);cout<usingnamespacestd;intmain(){boolyes;intx=0;do{yes=true;x+=7;if(x%2!=1)yes=false;if(x%3!=1)yes=false;if(x%4!=1)yes=false;if(x%5!=1)yes=false;if(x%6!=1)yes=false;}while(yes==false);cout<<"All="<usingnamespacestd;intmain(){intx=0;do{x+=7;}while((x%2!=1)||(x%3!=1)||(x%4!=1)||(x%5!=1)||(x%6!=1));cout<<"All="<usingnamespacestd;intmain(){intt,s;s=0;for(inti=1;i<=10;++i){t=1;for(intj=1;j<=i;++j)//求i!t*=j;s+=t;//累加i!}cout<usingnamespacestd;intmain(){intt=1,s=0;for(inti=1;i<=10;++i){t*=i;//t为上一个数的i-1的阶乘值,再乘以i即为i!s+=t;//累加i!}cout<usingnamespacestd;intmain(){intk;for(inti=0;i<=33;++i)//枚举母鸡的数量for(intj=0;j<=50;++j)//枚举公鸡的数量{k=90-i-j;if(15*i+10*j+k*5==500){cout<<"母鸡有"<usingnamespacestd;intmain(){for(inti=1;i<=5;++i)//控制行数{for(intj=1;j<=i;++j)//输出一行中的*数cout<<"*";cout<#include//调用setw函数需注明使用该库usingnamespacestd;intmain(){for(inta=1;a<=9;++a)for(intb=0;b<=9;++b)for(intc=0;c<=9;++c){if(a*a*a+b*b*b+c*c*c==a*100+b*10+c)cout<#include//sqrt和floor函数需调用数学函数库cmathusingnamespacestd;intmain(){intx;for(inti=100;i<=200;++i){x=2;while(x<=floor(sqrt(i))&&(i%x!=0))//floor为取整函数x=x+1;//在枚举的范围内并且没有出现约数则继续枚举if(x>floor(sqrt(i)))cout<intmain(){intn=0,hi,lo;for(intx=1;;++x)//可以直接从x=33开始枚举{n=x*x;if(n<1000)continue;//跳过循环体其它语句,进行下一个循环if(n>9999)break;//终止循环hi=n/100;lo=n%100;if(hi/10==hi%10&&lo/10==lo%10)printf("%d ",n);}return0;} 循环嵌套——例4.18阶乘之和输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n<=106,n!表示前n个正整数之积。样例输入:10样例输出:37913【分析】这个任务并不难,设S为阶乘之和,核心算法只有一句话:for(i=1;i<=n;i++)S+=i!。不过C++语言并没有阶乘运算符,所以这句话只是伪代码,而不是真正的代码。事实上,我们还需要一次循环来计算i!:for(j=1;j<=i;++j)factorial*=j;。 循环嵌套——例4.18#includeintmain(){intn,s=0;scanf("%d",&n);for(inti=1;i<=n;++i){intfactorial=1;for(intj=1;j<=i;++j)factorial*=j;s+=factorial;}printf("%d ",s%1000000);return0;}当n=100时,输出-961703,直觉告诉我们:乘法溢出了。 循环嵌套——例4.18#includeintmain(){constintMOD=1000000;intn,s=0;scanf("%d",&n);for(inti=1;i<=n;++i){intfactorial=1;for(intj=1;j<=i;++j)factorial=(factorial*j%MOD);s=(s+factorial)%MOD;}printf("%d ",s);return0;}求factorial的过程还可以优化,参考例12另外,当n>=22之后,s不再有变化,为什么? 上机练习1、求阶乘的和:给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+...+n!),输出阶乘的和。2、求出e的值:利用公式e=1+1/1!+1/2!+1/3!+...+1/n!,求e的值,要求保留小数点后10位。3、计算多项式的值:假定多项式的形式为x^n+x^(n-1)+…+x^2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值。x在float范围内,n<=1000000。多项式的值精确到小数点后两位,保证最终结果在float范围内。4、与7无关的数:一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数。现求所有小于等于n(n<100)与7无关的正整数的平方和。5、数1的个数:给定一个十进制正整数n(1<=n<=10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。6、数字统计:请统计某个给定范围[L,R]的所有整数中,数字2出现的次数。 比如给定范围[2,22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。 上机练习7、画矩形:根据参数,画出矩形。输入四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。8、质因数分解:已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。9、第n小的质数:输入一个正整数n,求第n小的质数。10、金币:国王将金币作为工资,发放给忠诚的骑士。第1天,骑士收到一枚金币;之后两天(第2天和第3天)里,每天收到两枚金币;之后三天(第4、5、6天)里,每天收到三枚金币;之后四天(第7、8、9、10天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续n天每天收到n枚金币后,骑士会在之后的连续n+1天里,每天收到n+1枚金币(n为任意正整数)。你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。11、不定方程求解:给定正整数a,b,c。求不定方程ax+by=c关于未知数x和y的所有非负整数解组数。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭