C语言循环结构_第1页
C语言循环结构_第2页
C语言循环结构_第3页
C语言循环结构_第4页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

循环结构ー、循环的分类1、计数型循环:事先知道循环的次数。非计数型循环:事先不知道循环的次数。2、当型循环:“先判断,后执行”,循环体有可能执行0遍。直到型循环:“先执行,后判断”,循环体至少执行一遍。ェwhile语句:擅长描述当型循环1、格式:while(表达式)语句2、功能:3、说明:(1)“表达式”通常是关系或逻辑表达式,也可以是任意表达式。“语句”又称“循环体(语句)”,必须是ー个以分号结束的语句,或ー个复合语句。“循环体”中必须有一个操作,使得“表达式"最终为0(条件不成立)否则,会出现“无限循环”即“死循环”,若出现“死循环”,按“Ctrl+Break”键终止程序的执行。然后修改程序。4、基本算法二:累加例如:求1+2+3+ +100的和。main(){ints,i;s=0;i=l;while(i<=100){s=s+i; i=i+l;}printf(66l+2+...+100=%d\n,\s);)【分析:出循环时,i为101,其最后ー个合法取值(终值)为100;本题中S被称为累加器,它以"s=s+……”的形式出现在循环中,该式被称为累加式,累加器在进入循环前必须获得合法初值,通常为0。i是ー个特殊的累加器,每次递增1,又称为计数器。i身兼二职:控制循环的次数,同时兼做累加式的通项。】三、d〇…while语句(直到型)1、格式:do语句while(表达式);2、功能:3、说明:(1)最后有一个分号“语句”依然是一个语句(当含多个语句分量时,必须括成复合语句)“表达式”成立时(非0)接着做“循环体语句”。4、改写上例(累加):main(){ints,i;s=0;i=l;do{s=s+i;i=i+l;}while(i<=100)printfC4l+2+...+100=%d\n,\s);【当型循环和直到型循环,在循环体被执行1次及1次以上时,可以互相替换】例2、输出1+1/2+1/3+...+1/100的和。main(){floats;++-WI+S2)(OOIHVDa_2M」エiooHSprintf(n%f\nf\s);)例3、输出1-1/2+1/3-1/4...-1/100的ネロ。main(){floats;intt=1;s=0.0;i=l;while(i<=100){s=s+l.O/i*t;=-t;*/i++;}printf("%f\n”,s);四、for循环语句(擅长于计数型循环)1、格式:for(表达式1;表达式25表达式3)语句2、功能:3、说明:“语句”即循环体(语句),只能是ー个语句(单个以分号结束的语句或一个复合语句)for后的()中由两个;隔开3个表达式,其中“表达式1”通常是对“循环控制变量”赋初值,“表达式2”通常是关系或逻辑表达式,“表达式3”通常是对“循环控制变量”做增值变化。3个表达式都可以省略(也可以省略其中的任意多个),但2个分号不允许省略。4、改写“求1+2+ +100的和“main(){ints,i;for(s=0,i=l;i<=100;i++)s=s+i;printf(“%d\n”,s);}【改写:表达式省略】main(){ints,i;s=0;i=l;for(;;){s=s+i;i++;if(i>100)break;}printf(u%d\n”,s);}【结论】计数型循环的循环次数:循环控制变量的终值即最后ー个合法取值,初值是其第一个合法取值。步长是循环控制变量每一次递增的值。五、几个重要算法:1、穷举法对所有的可能性进行判断,凡是符合条件的做相应处理(输出、保存等)。例!:输出所有的“水仙花”数,即这样的三位正整数:其每ー数位上的数字的立方和等于该数本身。比如,153=13+53+33〇【法一:一重循环,难点:求出每位数字】main(){intx,b,s,g;/*b=存放百位数字・/for(x=0;x<= );x++){b=x/100;s=x/10%10;g=x%10;/・任何正整数%10的・//・余数即为其个位数字・/if(g*g*g+s*s*s+b*b*b==x)printf("%d\n”,x);))【法二:三重循环】main(){intb,s,g;for(b=l;bv=9;b++)/・时针・/for(s=0;s<=9;s++)for(g=0;g<=9;g++)if(g*g*g+s*s*s+b*b*b==b*100+s*10+g)printf("%d\n”,b*100+s*10+g);【结论,核心语句if被执行了900次】补充:循环的嵌套⑴当某ー循环语句完整地套住另ー循环语句时,称为循环的嵌套。⑵当嵌套时,内循环变化得快,外循环变化得慢。(3)当外循环独立执行时,重复次数为x,内循环独立执行时,重复次数为y,则嵌套时其核心语句被执行xXy次。例2、用100元购买麦当劳(5元/份)和肯德基(7元/份),恰巧用完,问共有几种买法?main(){intm,k;for(m=0;m<=20;m++)for(k=0;k<=14;k++)

if(5*m+7*k=100)printf(uM:%d,K:%d\n,\m,k);2、正整数的各数位上数字的获取例1:任意读入ー个正整数,依次输出其低位到高位上的每一位数字。(oxmquヌアvx)3ロquシuejsopPXMU®}OU-EUI{printf(u%d“ハ%10);x=x/10;))例2:任意读入ー个整数,依次输出其低位到高位上的每一位数字及其符号位,但若是〇不输出符号位。main(){longx;longy;charfh;scanf("%ld”,&x);y=x;/・保留x原值・/if(x<0){fh=’」;x=-x;}elsefh='+';do{printf(a%d",x%10);x=x/10;}while(x!=O);if(y!=O)printf(“%c\n”,fh);3、迭代法例1.猴子吃桃问题。某猴子某天摘了若干只桃子,吃了一半,不过瘾,又多吃ー只;第二天又吃了一半,不过瘾,再多吃ー只……到第十天,发现只剩1只桃子了。问第一天共摘了多少只桃子。main(){intpeach,day;peach=l;day=10;for(day=9;day>=l;day-)/・求前9天的桃子数・/{peach=(peach+l)*2;printf(<6%dday:%d\n^,day,peach);})【归纳:类似于本题peach变量的特点:其值不停地被新值替代(自身的原值变化而来),直到满足所求终止。】4、辗转相除法求两正整数的最大公约数main(){intx,y,r;scaiif("%d%d”,&x,&y);/*x和y>〇・/r=x%y;while(r!=0){x=y;y=r;r=x%y;}printf(“%d\n”,y);)【改写:用do while]main(){intx,y,r;scanf("%d%d”,&x,&y);/*x和y>〇・/do{r=x%y;x=y;y=r;}while(r!=0);/・出循环y为〇・/printf("%d\n",x);)【09春省考真题的思路】不好!!!main(){intx,y,r;scanf(“%d%d”,&x,&y);/*x和y>〇・/while(y!=0){r=x%y;x=y;y=r;}printf(a%d\n”,y);)5、判断素数数学定义:“凡是只能被1和自身整除的大于1的整数,就称为质数,即素数。”例1.任意读入一个大于1的整数,判断其是否为素数。【法一:紧扣数学定义:]main(){intx,k;do{printf(^Inputx>l:\パ);scanf(“%d”,&x);}while(x<=l);for(k=2;k<=x-l;k++)if(x%k==O)break;if(x==k)printf(66%dissushn\n",x);elseprintf(u%disnotsushu\n',x);}【用ー个小技巧:借助一个“逻辑型”变量】main(){intx,k;intflag=l;/・总是先认为X是素数・/do{printf(<6Inputx>l:\n^^);scanf(“%d”,&x);}while(x<=l);for(k=2;k<=x-l;k++)if(x%k==O){flag=O;break;}if(flag==l)printf(a%dissushuW^x);elseprintfC6%disnotsushu\n'',x);)【用while改写】main(){intx,k;do{printf(^Inputx>l:\パ);scanf(“%d”,&x);}while(x<=l);k=2;while(x%k!=0)k++;if(k==x)printf(<6%dissushu\n,5,x);elseprintf(^%disnotsushuW^x);)【变形ー:用sqrt函数,求平方根】#include<math.h>main(){intx,k;intflag=l;/*最好用flag*/do{printf(uInputx>l:\n");scanf(“%d”,&x);}while(x<=l);for(k=2;k<=sqrt(x);k++)if(x%k==O){flag=O;break;}if(flag==l)printf(a%dissushu\n9\x);elseprintf(u%disnotsushu\n",x);补充:break;语句与continue5语句break;只可以出现在循环语句及switch语句中,用于提前跳出所在语句。在循环语句中出现的break语句通常处在if的控制之下。continue;语句只能出现在循环语句中,通常在if的控制之下,一旦被执行,本次循环其后的几个操作语句不被执行,而是继续从下一轮循环开始。例1.输出100以内的所有3的倍数。main(){intx;for(x=l;x<=100;x++){if(x%3!=0)continue;printf(''%d\n'',x);)6.累乘(基本算法)例1,求n!。main(){intn;intk;longjc;do{printf(H0<=n<=10H);scanf(H%dH,&n);}while(n<0lln>10);jc=l;for(k=l;kv=n;k++)jc=jc*k;printf(n%ld\nn,jc);)【总结:10!=1X2X3 X10,累乘器jc在进入循环前必须获得合适初值;通常为1。累乘式"jc=jc*…”必须出现在循环中。注意,不要让jc溢出。】算法分为“非数值型”算法和“数值型”算法两大类。“数值型”算法通常解决的有一定计算难度的数学问题(级数计算、高次方程求根),通常所求值为近似值。7.级数计算(展开式的求解)例1、求1+1/2!+1/3!+…+l/n!+.・.,直到某项的值小于10访为止。【法一:直接法。直接利用项次描述通项。】main(){floats;intk;floatjc;floatt;inti;s=0.0;k=l;/*k用来描述项次・/t=l; /・先让t存放第一项的值・/while(t>=le-6){s=s+t;k++;/・准备求下ー项・/jc=l;/*求k!*/for(i=l;i<=k;i++)jc=jc*i;t=l/jc;}printf("%f\n”,s);递推法(间接法)求通项:利用前项求后项。【法二:间接法求通项】main(){floats,t;intk;s=0.0;k=l;t=l;while(t>=le-6){s=s+t; k++;t=t/k;}printf("%f\n”,s);)例2、求斐比利斯数列的前20项。1、1、2、3、5、8、13 (制定前两项,第三项开始总是前两项之和。)main(){intfl,f2,f3;i

温馨提示

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

评论

0/150

提交评论