王小琼信息科技学院2009.3.10C语言程序设计第三章循环结构程序设计3.4.1自增自减运算•++--是单目运算符•有前缀和后缀两种形式–前缀形式:先自增(自减)再引用;–后缀形式:先引用再自增(自减);•功能:前缀形式++a等价于a=a+1--a等价于a=a–1后缀形式a++等价于a=a+1a--等价于a=a–1表达式的值会不同●++,--只能用于变量,不能用于常量和表达式10++++(x+y)(-i)--等都是错误的例如:当a=5时⑴++a表达式的值为6,且a=6⑵a++表达式的值为5,且a=6⑶b=++a等价于表达式的值为6,且a=6,b=6⑷b=a++等价于表达式的值为5,且a=6,b=5a;b1;aa1;aaa;b循环的基本概念Ex求1+2+3+4+5+6+7+8+9+10=?s=1+2+3+4+5+6+7+8+9+10如果求1+2+3+…+100呢?或者求1+2+3+…+n(n为某一任意指定的数)呢?计算机的操作是一步一步执行的,步步分解变量初始化每步执行语句Exs=1+2+3+…+n分解1s=0;s+=1;s+=2;……s+=n;1,2,3,…,n可以用一计数变量i表示s+=i;i++;s+=i;i++;……s+=i;i++;其中i=n循环结构分解2s=0;i=1;循环两概念循环变量:在循环中表示循环增量的变量i步长语句:在循环语句中循环变量的变化语句i++变量赋初值s=0;i=1;循环三要素循环体s+=i;i++;循环条件i=n循环的使用方法当条件e成立(真)时,反复执行A。直到e为假才停止循环先执行A操作,再判断e是否为真,若e为真,再执行A,如此反复,e为假停止循环执行e1(循环变量赋初值),判断e2是否为真,若e2为真,执行循环体A,然后用e3改变循环变量的值,再判断e2是否为真,如此反复,直到e2为假停止循环e2假真e1e3A真假eA真假eA当型先判断循环当型后判断循环步长型循环while(e){A}do{A}while(e)for(e1;e2;e3){A}Ex3.13求s=1+2+3+…+100算法:1定义变量,初始化3输出结果解法1while语句#inlcudestdio.hmain(){ints=0,i=1;printf(1+2+3+…+100=%d\n,s);}解法3for语句#inlcudestdio.hmain(){ints=0,i=1;printf(1+2+3+…+100=%d\n,s);}解法2do_while语句#inlcudestdio.hmain(){ints=0,i=1;printf(1+2+3+…+100=%d\n“,s);}while(i=100){s=s+i;i++;}do{s=s+i;i++;}while(i=100);for(i=1,s=0;i=100;i++)s+=i;2用循环求swhile(e)s;e—表达式s—语句(循环体)3.4.2while语句说明:当表达式(条件)e的值为真(非0)时,反复执行语句s(循环体);直到e为假才停止循环。注意:只包含了两个要素,初始化应放在while前例:s=1+2+3+…+n分解s=0;i=1;s+=i;i++;s+=i;i++;……s+=i;i++;其中i=n真假es初始化真假s=0;i=1;s+=i;i++;i=n结束条件循环语句●先判断后执行#includestdio.hmain(){intn,i,s;printf(Entern:“);scanf(%d,&n);//输入n的值;printf(s=1+2+…+%d=%d\n“,n,s);}程序:s=1+2+3+…+n注意:●循环体如果包含一条以上语句,应该用复合语句(即语句序列)●循环体重应有使循环趋于结束的语句●有可能一次也不执行循环体真s=0;i=1;输入n的值i=n假s+=i;i++;输出结果ss=0;i=1;while(i=n){s+=i;i++;}Ex计算100131211s#includestdio.hmain(){inti=1;floats=0;printf(s=%f\n,s);}while(i=100){s+=1.0/i;i++;}初始化i与si=100输出s假s+=1.0/i;i++;真3.3do--while语句do{s}while(e);e—表达式s—语句(循环体)说明:先执行语句s(循环体),再判断e是否为真,若e为真,再执行语句s,如此反复,直到e为假为止注意:●do—while至少执行一次循环体,即使条件一开始就不成立●一般情况下,while与do--while处理同一问题时,结果相同es真假#includestdio.hmain(){inti=1,n;longt=1;printf(Entern:“);scanf(%d,&n);printf(%d!=%ld\n,n,t);}do{t*=i;i++;}while(i=n);●先执行后判断初始化输入nt*=i;i++;i=n输出n假真Ex403计算t=n!ay输出1001212a=12y=12141628a=16y=28main(){inta=10,y=0;do{a+=2;y+=a;printf(a=%dy=%d\n,a,y);if(y20)break;}while(a=14);}Ex下列程序的输出是什么?y20a=14a=10,y=0a+=2,y+=a;printf();真真假1234for语句for(e1;e2;e3)s;e1、e2、e3—表达式s—语句(循环体)说明:执行e1(循环变量赋初值),判断e2是否为真,若e2为真,执行循环体A,然后用e3改变循环变量的值,再判断e2是否为真,如此反复,直到e2为假停止循环e2假真e1e3A后续语句例如,下面程序段计算1+2+…+100并输出,它的执行过程如图所示。for(sum=0,i=1;i=100;i++)sum=sum+i;printf(“%d”,sum);e1e2e3循环体语句后续语句下面来分析其中的几个问题for(sum=0,i=1;i=100;i++)sum=sum+i;问:(1)循环控制变量的初始条件=?循环控制变量的终止条件=?循环控制变量的增量(步长)=?1100+1(2)循环体共循环了多少次?循环体循环次数=(终止值-初始值)/步长+1100(3)当循环100次后,i,sum=?101,5050例如:for(i=1;i=10;i++){a=a+1;b=b+1;}注意:例如:a=0;b=0;for(i=1;i=10;i++){a=a+1;b=b+1;}for语句一般形式中的“语句”部分就是循环体,它可以是一个单语句,也可以是一个复合语句。如果不加{},系统只将for后面的一个单语句作为循环体。例如:a=0;b=0;for(i=1;i=10;i++)a=a+1;b=b+1;执行后a的值为10,b的值为10。执行后a的值为10,b的值为1。注意:for(i=1;i=n;i++)s+=i;2若表达式e2省略,即不判断循环条件,循环无法终止—死循环(应避免),该结构一定要有break之类的跳出循环控制语句1表达式e1可以省略(分号不能省),此时应在for语句之前给循环变量赋初值s=0;i=1;for(i=1;i=n;i++)s+=i;for(i=1;i=n;){s+=i;i++;}for(;;)s;while(1)s;3表达式e3可以省略,放入后面的循环体语句s中4三个表达式都省略—死循环i=1;while(1){s+=i;i++;}for(i=1;;i++)s+=i;一个循环体内又包含另一个完整的循环结构称为循环嵌套(p61)。内嵌的循环中又嵌套有循环时称为多重循环。多重循环的嵌套次数可以是任意的,可以根据嵌套的层数分别叫做二重循环、三重循环等。最常用的循环嵌套形式是:for语句的循环体中又是一条或多条for语句。例如,下面这条语句是二重循环:for(i=1;i=10;i++)for(j=1;j=10;j++)printf(“%d”,i*j);其中,第一个for是外循环、第二个for是内循环。循环嵌套Ex执行下列语句后,a=?inta=0,i;for(i=1;i5;i++){switch(i){case0:case3:a+=2;case1:case2:a+=3;default:a+=5;}}1231,20,3a+=2;a+=3;a+=5;default4ii5执行a1真case1a+=338a+=5112真case2a+=316a+=5183真case3a+=221a+=326a+=5314真defaulta+=5假5continuebreakbreak与continue语句break语句只能用在switch语句或循环语句中,用以终止它所在的switch语句或循环语句的执行continue语句只能出现在循环语句中,用以跳过循环体中其后面的语句,直接转去判别下次循环控制条件(while或do_while语句)或表达式e3(for语句)break用于结束循环continue提前循环Ex算法1定义变量n、i、j、k2n从100到999做循环,将n的各位数字(i、j、k)分离出来3判断:若n是水仙花数则输出#includestdio.hmain(){}1定义变量n、i、j、kintn,i,j,k;将n的各位数字(i、j、k)分离出来i=n/100;n的百位数字设n=153j=n/10%10;n的十位数字i=n/100=153/100=1j=n/10%10=153/10%10=53判断:若n是水仙花数则输出2n从100到999做循环,if(n==i*i*i+j*j*j+k*k*k)printf(%d\n,n);如果只要求一个水仙花数,可在if语句后加上break语句终止循环k=n%10;for(n=100;n=999;n++){}n的个位数字k=n%10=153%10=3break语句只能用在switch语句或循环语句中,用以终止它所在的switch语句或循环语句的执行水仙花数:一个3位数的各位数字的立方和恰好等于它本身,这样的3位数称为水仙花数。编程求出所有的水仙花数。●break与continue语句breakcontinueEx执行下列语句后,a=?main(){inti=0,a=0;while(i20){for(;;){if((i%10)==0)break;elsei--;}i+=11;a+=i;}}iai20i%10==0break00√真0真×1111真1假√100真假2132Ex输出两位数中所有能同时被3和5整除的数main(){intn;for(n=10;n100;n++){if(n%3==0&&n%5==0)printf(%5d,n);}}main(){intn;for(n=10;n100;n++){if(n%3!=0||n%5!=0)continue;printf(%5d,n);}}解法1解法21输入整数k,设置素数标记l=1(l=0,则k不是素数)2i从2到k-1做循环,若k整除i,k不是素数,循环结束(l=0;i=k);否则继续循环3循环结束后,根据l的值输出结果:如果l=1,则k是素数;否则k不是素数。#includestdio.hmain(){inti,k,l;printf(Inputk:);scanf(%d,&k);l=1;算法Ex3.22检测给定整数是否是素数素数:一个自然数,若除了1和它本身外不能被其他整数整除,则称为素数1输入整数k,设置素数标记l=1(l=0,则k不是素数)if(l==1)printf(%disaprime.\n,k);elseprintf(%disnotaprime.\n,k);}for(i=2;ik;i++)if(k%i==0)3循环结束后,根据l的值输出结果:如果l=1,则k是素数;否则k不是素数。2i从2到k-1做循环,若k整除i,循环结束