《循环结构程序设计教案ppt课件.ppt》由会员分享,可在线阅读,更多相关《循环结构程序设计教案ppt课件.ppt(23页珍藏版)》请在三一办公上搜索。
1、,王小琼信息科技学院2009.3.10,C语言程序设计,第三章 循环结构程序设计,3.4.1自增自减运算,+ -是单目运算符有前缀和后缀两种形式 前缀形式: 先自增(自减)再引用;后缀形式: 先引用再自增(自减);功能: 前缀形式 + a 等价于 a = a + 1 - a 等价于 a = a 1 后缀形式 a + 等价于 a = a + 1 a - 等价于 a = a 1,表达式的值会不同, +,-只能用于变量,不能用于常量和表达式10+ +(x+y) (-i)- 等都是错误的,例如:,当 a5 时 +a 表达式的值为 6,且 a6 a+ 表达式的值为5 ,且 a6 b=+a 等价于 表达式
2、的值为6,且 a=6, b=6 b=a+ 等价于 表达式的值为5,且 a=6, b=5,循环的基本概念,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为某一任意指定的数)呢?,Ex s=1+2+3+n,分解2,s=0; i=1;,循环的使用方法,当条件e成立(真)时,反复执行A。直到e为假才停止循环,先执行A操作,再判断e是否为真,若e为真,再执行A,如此反复,e为假停止循环,执行e1(循环变量赋初值),判断e2是否为真,若e2为真,执行循环体A,然后用e3改变循环变量的值,再
3、判断e2是否为真,如此反复,直到e2为假停止循环,当型先判断循环,当型后判断循环,步长型循环,while (e) A ,do A while (e),for (e1;e2;e3) A ,Ex3.13 求s=1+2+3+100,算法:1 定义变量,初始化 3 输出结果,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 用循环求s,while(e) s; e表达式 s语句(循环体),3.4.2 while语句,说明:当表达
4、式(条件) 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,#include main() int n , i, s; printf( Enter n:“ ); scanf( %d, ,程序: s=1+2+3+n,注意: 循环体如果包含一条以上语句, 应该用复合语句(即语句序列) 循环体重应有使循环趋于结束的语句 有可能一次也不执行循环体,真,s += i;i+;,输出结果s
5、,s = 0; i = 1;while( i = n) s += i; i+; ,Ex 计算,#include main() int i = 1; float s = 0; printf( s=%fn, s );,while( i = 100 ) s += 1.0 / i; i+; ,3.3 do-while 语句,do s while( e );,e 表达式 s 语句(循环体),说明:先执行语句s(循环体),再判断e是否为真,若e为真,再执行语句s,如此反复,直到e为假为止,注意: dowhile 至少执行一次循环体,即使条件一开始就不成立 一般情况下,while与do-while处理同一问
6、题时,结果相同,#include main() int i = 1, n; long t = 1; printf( Enter n:“ ); scanf( %d, ,do t *= i; i+; while( i = n );,先执行后判断,Ex403 计算t=n!,a y 输出10 012 12 a=12 y=121416 28 a=16 y=28,main() int a=10,y=0; do a+=2; y+=a; printf( a=%d y=%dn, a, y ); if ( y 20 ) break; while( a = 14 );,Ex 下列程序的输出是什么?,for语句,fo
7、r( e1; e2; e3 ) s;e1、e2、e3表达式s语句(循环体)说明:执行e1(循环变量赋初值),判断e2是否为真,若e2为真,执行循环体A,然后用e3改变循环变量的值,再判断e2是否为真,如此反复,直到e2为假停止循环,例如,下面程序段计算1 + 2 + + 100并输出,它的执行过程如图所示。 for ( sum = 0 , i = 1; i = 100 ; i + ) sum = sum + i ; printf ( “ %d ” , sum ) ;,e1,e2,e3,循环体语句,后续语句,下面来分析其中的几个问题,for ( sum = 0 , i = 1; i = 100
8、; i + ) sum = sum + i ;,问:(1)循环控制变量的初始条件? 循环控制变量的终止条件? 循环控制变量的增量(步长)?,1,100,1,(2)循环体共循环了多少次?,循环体循环次数(终止值初始值)/步长1,100,(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语句一般形式中的“语句”部分就是循环体,它可以是一个单语句,也可以是
9、一个复合语句。如果不加 ,系统只将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+
10、) s+=i;,for(i=1;i=n;) s+=i;i+;,for( ; ; ) s;,while( 1 ) s;,3 表达式e3可以省略,放入后面的循环体语句s中,4 三个表达式都省略死循环,一个循环体内又包含另一个完整的循环结构称为循环嵌套(p61)。 内嵌的循环中又嵌套有循环时称为多重循环。 多重循环的嵌套次数可以是任意的,可以根据嵌套的层数分别叫做二重循环、三重循环等。 最常用的循环嵌套形式是:for语句的循环体中又是一条或多条for语句。,例如,下面这条语句是二重循环: for ( i =1 ; i = 10 ; i + ) for ( j = 1 ; j = 10 ; j + )
11、 printf ( “ %d ” , i * j );其中,第一个for是外循环、第二个for是内循环。,循环嵌套,Ex 执行下列语句后,a=?int a = 0, i;for( i = 1; i 5; i+ ) switch( i ) case 0: case 3: a+=2; case 1: case 2: a+=3; default:a+=5; ,1,2,3,4,i i5 执行 a,1,真,case 1 a+=3,3,8,a+=5,11,2,真,case 2 a+=3,16,a+=5,18,3,真,case 3 a+=2,21,a+=3,26,a+=5,31,4,真,default a+
12、=5,假,5,break与continue语句,break语句只能用在switch语句或循环语句中,用以终止它所在的switch语句或循环语句的执行,continue语句只能出现在循环语句中,用以跳过循环体中其后面的语句,直接转去判别下次循环控制条件(while或do_while语句)或表达式e3(for语句),break用于结束循环,continue提前循环,Ex,算法,1 定义变量n、i、j、k2 n从100到999做循环,将n的各位数字(i、j、k)分离出来3 判断:若n是水仙花数则输出,#include main() ,1 定义变量n、i、j、k,int n,i,j,k;,将n的各位数
13、字(i、j、k)分离出来,i=n/100;,n的百位数字,设n=153,j=n/10%10;,n的十位数字,i=n/100=153/100=1,j=n/10%10=153/10%10=5,3 判断:若n是水仙花数则输出,2 n从100到999做循环,,if(n=i*i*i+j*j*j+k*k*k) printf(%dn,n);,如果只要求一个水仙花数,可在if语句后加上break语句终止循环,k=n%10;,n的个位数字,k=n%10=153%10=3,break语句只能用在switch语句或循环语句中,用以终止它所在的 switch语句或循环语句的执行,水仙花数:一个3位数的各位数字的立方和
14、恰好等于它本身, 这样的3位数称为水仙花数。编程求出所有的水仙花数。, break与continue语句,Ex 执行下列语句后,a=?,main() int i = 0,a = 0; while( i 20 ) for( ; ; ) if( i % 10 ) = 0 ) break; else i-; i += 11; a += i; ,i a i20 i%10= =0 break,0,0,真,0,真,11,11,真,1,假,10,0,真,假,21,32,Ex 输出两位数中所有能同时被3和5整除的数,main() int n; for( n = 10; n 100; n+ ) if( n%3=
15、0 ,main() int n; for( n = 10; n 100; n+ ) if( n%3!=0 | n%5!=0 ) continue; printf( %5d, n ); ,解法1,解法2,1 输入整数k,设置素数标记l=1(l=0,则k不是素数)2 i从2到k-1做循环,若k整除i,k不是素数,循环结束 (l=0;i=k);否则继续循环3 循环结束后,根据l的值输出结果: 如果l=1,则k是素数;否则k不是素数。,#include main() int i,k,l; printf(Input k:); scanf(%d,算法,Ex3.22 检测给定整数是否是素数,素数:一个自然数,若除了1和它本身外不能被其他整数整除,则称 为素数,1 输入整数k,设置素数标记l=1(l=0,则k不是素数),if(l= =1) printf(%d is a prime.n,k); else printf(%d is not a prime.n,k);,for(i=2;ik;i+) if(k%i= =0),3 循环结束后,根据l的值输出结果: 如果l=1,则k是素数;否则k不是素数。,2 i从2到k-1做循环,若k整除i,,循环结束,k不是素数,,(l=0;i=k);否则继续循环,i=k;, l=0; ,