C语言基础-第五章-循环结构ppt课件.ppt
C C的基本结构的基本结构程序设计程序设计 程序的基本结构:程序的基本结构: 复习提问:复习提问: 顺序结构顺序结构选择结构选择结构循环结构循环结构 C C的基本结构的基本结构程序设计程序设计 程序的基本结构:程序的基本结构: 复习提问:复习提问: 顺序结构顺序结构选择结构选择结构循环结构循环结构 C C的基本结构的基本结构程序设计程序设计 程序的基本结构:程序的基本结构: 复习提问:复习提问: 顺序结构顺序结构选择结构选择结构循环结构循环结构顺序结构的特点:顺序结构的特点:每一条语句按顺序执行;每一条语句按顺序执行;每一条语句只执行一遍,每一条语句只执行一遍,不重复执行;不重复执行;也没有语句不执行。也没有语句不执行。命令序列2命令序列1命令序列STARTEND复习提问:复习提问: C C的基本结构的基本结构程序设计程序设计复习提问:复习提问: 分支结构的特点:分支结构的特点:每一条执行了的语句每一条执行了的语句都只执行一遍。都只执行一遍。不重复执行;不重复执行;但有语句不执行。但有语句不执行。条件命令序列If语句后面的下一条语句NY命令序列条件命令序列2If语句后面的下一条语句命令序列1YN C C的基本结构的基本结构程序设计程序设计 C C的基本结构的基本结构程序设计程序设计 循环结构程序设计循环结构程序设计 主要内容主要内容: : 循环的概念、循环变量的概念等。(重点)循环的概念、循环变量的概念等。(重点) whilewhile语句语句 do whiledo while语句语句 for for 语句语句(每一种语句的格式和使用都是重点)(每一种语句的格式和使用都是重点) 循环的嵌套(难点)循环的嵌套(难点) scanf(%f,&a); s=s+a; scanf(%f,&a); s=s+a; . 这样重复一百次,然后这样重复一百次,然后 输出输出s的值。的值。这样写显然非常麻烦。我们注意到这样写显然非常麻烦。我们注意到程序中的程序中的 scanf(%f,&a); s=s+a;两句话是一直重复的,如果能用一两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的执行一百次,就可以简化了书写的麻烦,这就是循环语句。麻烦,这就是循环语句。编程解决这样的一个问题:编程解决这样的一个问题:从键盘输入一百个学生的成绩,求总成绩。从键盘输入一百个学生的成绩,求总成绩。从前面所学,有两种解决方法。从前面所学,有两种解决方法。1.设一百个变量,分别输入学生的成绩,然后求和。设一百个变量,分别输入学生的成绩,然后求和。 这种方法浪费内存空间,显然不实际。这种方法浪费内存空间,显然不实际。2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:绩,如下:循环的概念循环的概念在循环条件的范围内反复在循环条件的范围内反复执行相同的循环体执行相同的循环体,称循环程序设计称循环程序设计。条件命令序列命令序列break命令序列循环后面下一条语句NY循环结构的特点:循环结构的特点:循环体中的语句,在循环体中的语句,在条件满足的情况下,条件满足的情况下,可反复执行可反复执行 5.2 while语句构成的循环结构 v一般形式一般形式:循环变量的初始值;while(循环条件表达式) 循环体语句;v执行流程执行流程:条件循环体语句假(0)真(非0)语句循环体语句可以是一条,循环体语句可以是一条,也可以是多条,也可以是多条,多条的时候应用复合语句多条的时候应用复合语句将多条语句括起来。将多条语句括起来。循环变量的调整语句避免死循环表达式语句真假表达式1.1.计算表达式计算表达式语句2.2.如果表达式的值为非零如果表达式的值为非零,执行语句执行语句表达式3. 返回第一步,重新计算表达式返回第一步,重新计算表达式4. 如果表达式的值为零,则结束循环如果表达式的值为零,则结束循环如果表达式的值一开始就为如果表达式的值一开始就为0 0,则语,则语句一次也不会被执行。句一次也不会被执行。执行流程:执行流程:while语句举例语句举例问题问题: 求求1-10的和。的和。 算法分析算法分析: 1. 定义变量定义变量n存储加数,定义存储加数,定义s=0存储累加的和。存储累加的和。 2. 输入第一个加数输入第一个加数n 3. 若若n=10,执行第执行第4步,否则执行第步,否则执行第6步步 4. s=s+n 5. n+ 6. 输出输出s.例:例:求求S=1+2+3+10的值的值 i=10s=s+i;i=i+1;输出s的值NYi=1;源程序:源程序:#includevoid main( ) int i , s ; i=1; while ( i=10 ) s=s+i; i=i+1; printf(please output s=%dn,s); 实例,用while循环语句实现求#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体While(i=100) i+; sum=sum+i;i=10s=s+i;i=i+1;输出s的值NYi=1;源程序:源程序:#includevoid main( ) int i , s ,n; printf(please input n:); scanf(%d,&n); i=1; while ( i=n ) s=s+i; i=i+1; printf(please output s=%dn,s);例:求例:求S=1+2+3+n 的值的值nv一般形式一般形式:循环变量的初始值;do 循环体语句;while(循环条件表达式);v执行流程执行流程:do循环体expr假(0)真(非0)while dowhile语句1.1.执行语句执行语句3.3.表达式的值为非零表达式的值为非零,返回第,返回第1步步4.表达式的值为零,结束循环表达式的值为零,结束循环语句至少被执行一次。语句至少被执行一次。2.2.计算表达式计算表达式执行流程:执行流程:注意:注意:分号不能丢分号不能丢 实例,用do-while循环语句实现求#include main() int i,sum=0; i=1; do sum=sum+i; i=i+1; while(i=100); printf(%d,sum);由于由于do-while语句至语句至少要被执行一次,特少要被执行一次,特别要注意别要注意i和和sum的取值的取值问题!问题!想想这样的一段循环语句的执行结果想想这样的一段循环语句的执行结果:i=1;while (i=100) putchar(*);i+; 这个循环永远不会结束这个循环永远不会结束,因为循环控制变量因为循环控制变量i没有没有在循环体内被改变,在循环体内被改变,i+; 不属于循环体。不属于循环体。 循环语句中一定要注循环语句中一定要注意表达式的值是否能在意表达式的值是否能在循环执行过程中被改变,循环执行过程中被改变,以免造成死循环。以免造成死循环。 do-while同 while语句的重要区别expr循环体假(0)真(非0)while循环控制在循环体之前,循环控制在循环体之前,只有当只有当whilewhile后的表达式为后的表达式为非非0 0时,才可能执行循环体,时,才可能执行循环体,循环体有可能一次都不执循环体有可能一次都不执行。行。do循环体expr假(0)真(非0)while总是先执行一次循环体,总是先执行一次循环体,然后再求表达式的值,因然后再求表达式的值,因此,无论表达式的值是此,无论表达式的值是0 0还还是非是非0 0,循环体至少执行一,循环体至少执行一次。次。源程序:源程序:#includevoid main( ) int sum=0,i; scanf(%d,&i); while ( i=100 ) sum=sum+i; i=i+1; printf(sum=%dn,sum);例:例:while和和do while循环比较循环比较源程序:源程序:#includevoid main( ) int sum=0,i; scanf(%d,&i); do sum=sum+i; i=i+1; while ( i=100 ); printf(sum=%dn,sum); 5.4 for语句 一般形式 执行流程for(expr1 ; expr2 ; expr3) 循环体语句;expr2循环体假(0)真(非0)forexpr1expr3 for语句的一般应用形式for(循环变量赋初值;循环条件;循环变量增值)循环体语句;#include main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%d,sum);例 用for循环求 for语句的几点说明 for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省 无限循环:for( ; ;) for语句可以转换成while结构语句i=1;for (; i=100; i+) sum=sum+i;for (i=1; ; i+) sum=sum+i;for (sum=0,i=1;i=100;) sum=sum+i; i+; i=1;for (;i=100;) sum=sum+i; i+; for ( ; ;) 语句相当于while(1) 语句expr1;while(expr2)循环体语句;expr3;解1:#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); 运行结果:abcdefghij解2:#include main( ) int i=0; for(;i10;i+) putchar(a+i); 解3:#include main( ) int i=0; for(;i10;) putchar(a+(i+); 解4:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; 例例 从从a显示到显示到j。例: 求 ,即计算!n1n main() int i,s,n; s=1; printf(Enter n:); scanf(%d,&n); for(i=1;i=n;i+) s=s*i; printf(s=%dn,s);注意此处注意此处的分号。的分号。;练习练习1:观察以下程序运行结果并分析。:观察以下程序运行结果并分析。void main()int n=0;while (n3)printf(n is %dn,n);n+;printf(Thats all this prgram doesn);在使用在使用while时,只有位于判断条件之后的单时,只有位于判断条件之后的单个语句(简单语句或复合语句)才是循环的部分。个语句(简单语句或复合语句)才是循环的部分。printf(n is %dn,n);练习练习2:观察以下程序运行结果并分析。:观察以下程序运行结果并分析。void main( )int n=0;while(n+3); printf(n is %dn,n);printf(Thats all this program does.n);循环在判断条件后的第一个简单或复合语句处就结循环在判断条件后的第一个简单或复合语句处就结束了。束了。 循环体是空语句!循环体是空语句!练习练习3:观察以下程序运行结果并分析。:观察以下程序运行结果并分析。int main(void)long num;long sum = 0l;int status;printf(Please enter an integer to be summed. );printf(Enter q to quit.n);status = scanf(%ld,&num);while( status = 1)sum += num;printf(Please enter next integer to be summed. );printf(Enter q to quit.n);status = scanf(%ld,&num);printf(Those integers sum to %ld.n,num);return 0 ;分析:分析:这个例子改变了这个例子改变了while的判断条件,用的判断条件,用status=1代替了代替了status=1。前一个表达式。前一个表达式是一个赋值表达式,它把是一个赋值表达式,它把status赋值为赋值为1。而且表达式的值就是其左侧的值,这样而且表达式的值就是其左侧的值,这样status=1的值也为的值也为1。因此,实际上这个。因此,实际上这个while循环就等于使用了循环就等于使用了while(1),即无限,即无限循环。循环。 5.5 循环的嵌套 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程(1) while() while() . (2) do do while( ); . while( );(3) while() do while( ); . (4) for( ; ;) do while(); while() . 内循环外循环内循环main() int i,j,k; for(i=0;i2;i+) for(j=0;j2;j+) for(k=0;k2;k+) printf(%d,%d,%dn,i,j,k);运行结果:例: 循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281.#include main() int i,j; for(i=1;i10;i+) printf(%4d,i); printf(n-n); for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);i10printf假(0)真(非0)i=1j+j=1j10真(非0)假(0)i+for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);内循环外循环例例: 打印如图显示:打印如图显示:#include main( )const int ROWS=6;const int CHARS=6;int row;char ch;for( row = 0; row ROWS ;row+ )for(ch=(A+row ); ch(A+CHARS); ch+)printf(%c,ch);printf(n); 5.6 break语句和continue语句 vbreakbreak语句语句功能:在循环语句和功能:在循环语句和switchswitch语句中语句中, ,终止终止并跳出循环体或开关体。并跳出循环体或开关体。说明:说明:breakbreak只能只能终止并跳出终止并跳出最近一层最近一层的结的结构构breakbreak不能用于循环语句和不能用于循环语句和switchswitch语语句之外的任何其它语句之中句之外的任何其它语句之中。exprbreak;假(0)真(非0)whiledobreak;.expr假(0)真(非0)whileexpr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.const 1const 2const ndefaultcase 例例 break举例:输出圆面积,面积大于举例:输出圆面积,面积大于100时停止时停止。#define PI 3.14159#include stdio.hmain() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); 例例 break举例:小写字母转换成大写字母举例:小写字母转换成大写字母,直至输入非直至输入非小写小写字母字母 。#include main() int i,j; char c; while(1) c=getchar(); if(c=a & c=z) putchar(c-a+A); else break; continue语句v功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断v仅用于循环语句中exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3continuecontinue举例:输出举例:输出100100以内不能被以内不能被7 7整除的数。整除的数。main()int n; for(n=1;n=100;n+) if (n%7= 0) continue; printf(%d,n); 5.7 应用综合举例 #include main() char c; printf(input one letter, enter for finish:n); while(c=getchar()!=n) if (c=a&c=z) c=c-a+A; putchar(c); 例 从终端输入一行字符,把所有的小写转换成大写。 #include main()int a,n,i=1; long int sn=0,tn=0; printf(please input a and n:n); scanf(%d,%d,&a,&n); while (i=n) 例 求s=a+aa+aaa+aaaa+aaa的值,其中a是一个数字。例如:2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入。 tn=tn+a; sn=sn+tn; tn=tn*10; i+; printf(%d,sn); #include stdio.hmain()int i,j,k; for (i=0;i=3;i+) for (j=0;j=i;j+) putchar( ); for (k=0;k=6-2*i;k+) putchar(*); putchar(n); for(i=0;i=2;i+) for(j=0;j=2-i;j+) putchar( ); for (k=0;k=2*i+2;k+) putchar(*); putchar(n);打印图形打印图形* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *练习练习:打印出以下图案:打印出以下图案: * * * * * * * * * * * * * * * * 学生自己动笔做学生自己动笔做 * * * * * * * * * * * * * * * * * * * * * * * * * * 练习练习:打印出以下图案:打印出以下图案: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 学生自己动笔做学生自己动笔做while语句构成的循环结构语句构成的循环结构do while语句构成的循环结构语句构成的循环结构for 语句语句循环的嵌套循环的嵌套break语句和语句和continue语句语句循环结构程序设计循环结构程序设计#include stdio.hmain() int i,j,k; for(i=0;i4;i+) for(k=0;k(3-i)*2;k+) putchar( ); for(j=0;j4;j+) printf(* ); printf(n); #include stdio.hmain() int i,j,k; for(i=0;i5;i+) for(k=0;k(4-i)*2;k+) putchar( ); for(j=0;j2*i+1;j+) printf(* ); printf(nn); for(i=0;i4;i+) for(k=0;k(i+1)*2;k+) putchar( ); for(j=0;j7-2*i ;j+) printf(* ); printf(nn);