1、第五章,循环结构程序设计,第5章 循环语句程序设计,5.2、while语句(p115),5.3、dowhile语句(p115),5.4、for语句(p118),5.5、break和contiune语句,5.6、典型举例说明,52 while语句,1. while的语句格式:while (条件) 语句,2. 当条件为真(非)时重复执行内嵌语句(循环体);当条件为假()时,跳过内嵌语句,执行整个while的后续语句。,程序 用while 语句实现求1 + 2 + + n 。main ( ) int i , sum , n ;scanf ( “ %d ” , sum = 0 ; /*初始化i = 1
2、, sum = 0 */while ( i = n ) sum = sum + i;i + ; printf ( “ %d ” , sum ) ; ,53 do-while语句,1. do while 的语句格式:do语句while (条件);,2.功能:,例 比较下面两个程序的区别,分别写出它们的执行结果。main ( ) /*程序1*/ int i , sum = 0 ; i = 1 ;while ( i = 100 ) sum = sum + i ;i + ; printf ( “ %d “ , sum ) ; main ( ) /*程序2*/ int i , sum = 0 ; i =
3、 1 ;do sum = sum + i ;i + ; while ( i = 100 ) ; printf ( “ %d “ , sum ) ; ,结果相同,同样是下列程序,但如果while后面的表达式结果一开始就是假时,两种循环结果会不一样。main ( ) /*程序1*/ int i , sum = 0 ; i = 101 ;while ( i = 100 ) sum = sum + i ;i + ; printf ( “ %d “ , sum ) ; main ( ) /*程序2*/ int i , sum = 0 ; i = 101 ;do sum = sum + i ;i + ;
4、while ( i = 100 ) ; printf ( “ %d “ , sum ) ; ,输出结果为:sum0,输出结果为:sum101,结果不相同 (表达式的值第一次为真时, 两值相同,否则不同),5 4 for语句,1. for的语句格式:for (表达式;表达式;表达式)语句,2. for语句的执行过程。(1)先求解表达式1(表达式1通常是为循环变量赋初值)。(2)再求解表达式2(循环的控制条件)。若为非0,则执行第(3)步;若为0,则结束循环,转到第(5)步。(3)执行内嵌语句(循环体)后,求解表达式3(通常对表达式2中的循环控制变量进行修正,以便在若干次循环之后能够使表达式2的值
5、为0, 结束循环)。(4)转回上面第(2)步,继续执行。(5)执行for语句的下面一个语句(后续语句)。,for语句的执行过程流程图表示,例,下面程序段计算1 + 2 + + 100并输出,它的执行过程如图所示。 for ( sum = 0 , i = 1; i = 100 ; i + ) sum = sum + i ; printf ( “ %d ” , sum ) ;,表达式1,表达式2,表达式3,循环体语句,后续语句,程序的结构和流程图,另外,也可以参考书上的用while语句等价表示。,3.说明:,(1) for语句的3个表达式都可为逗号表达式。尤其是表达式1常用逗号表达式给多个变量赋初
6、值。 例如: for ( sum = 0 , i = 1 ; i = 100 ; i + ) sum = sum + i ; 上面for语句中表达式1:sum = 0 , i = 1为逗号表达式,负责为sum和i赋初值。,注意:上述程序也可以写成: sum = 0 ;for ( i = 1 ; i = 100 ; i + ) sum = sum + i ;,(2) 表达式2一般是关系表达式(如 i 0 其中:表达式2为算术表达式num % 2 。当num为奇数时循环执行scanf ( “ %d ” , & num )。,(3) for语句一般形式中的“语句”部分就是循环体,它可以是一个单语句,
7、也可以是一个复合语句。如果不加 ,系统只将for后面的一个单语句作为循环体。例如: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 ; 执行后a的值为10, b的值为10。而程序段a = 0 ; b = 0 ;for ( i = 1 ; i = 10 ; i +)a = a + 1 ;b = b + 1 ; 执行后a的值为10, b的值为1。,(4) for语句一般形式中的表达式1,2,3都可以省略,但其后
8、的分号不能省略。但注意若表达式2省略,代表条件永远为真(死循环)。 例如: sum = 0 ; i = 1 ;for ( ;i = 100 ; i + ) sum = sum + i ; 例如: for ( sum = 0 , i = 1 ; ; i + ) sum = sum + i ; 例如:for ( sum = 0 , i = 1 ; i = 100 ; ) sum = sum + i ;i + ; ,一个循环体内又包含另一个完整的循环结构称为循环嵌套。多重循环的嵌套次数可以是任意的,可以根据嵌套的层数分别叫做二重循环、三重循环等。for语句、while语句和dowhile语句在循环嵌
9、套时互相嵌套的情况。,55 循环的嵌套,例如,下面这条语句是二重循环: for ( i =1 ; i = 10 ; i + ) for ( j = 1 ; j = 10 ; j + )printf ( “ %d ” , i * j );其中,第一个for是外循环、第二个for是内循环。,其实,内循环包含在外循环的循环体中,是外循环的循环体中的一个语句或复合语句。,执行过程如图所示。其中i为外循环的控制变量,j为内循环的控制变量。,例4 编程打印“九九乘法表”。,分析:九九乘法表111 122 133 199212 224 236 2918313 326 339 3927 919 9218 93
10、27 9981,假设行号用i标识,列号用j标识,则第i行第j列的值正好就是i与j的乘积。i与j定义为整型变量。,程序若按下面的步骤执行,则可以打印出“九九乘法表”。 打印第1行 ( i = 1 )for (j=1;j=9;j+) printf (“%5d”,i*j) ;printf ( “ n ” ) ; /*换行打印*/ 打印第2行 ( i = 2 )for (j=1;j=9;j+) printf(“%5d”,i*j) ;printf ( “ n ” ) ; /*换行打印*/ 打印第9行 ( i = 9 )for (j=1;j=9;j+) printf(“%5d”,i*j) ;printf
11、( “ n ” ) ; /*换行打印*/,程序段如下:int i, j ; for (i=1; i=9; i+) for (j=1; j=9; j+) printf (“%5d”,i*j) ;printf ( “ n ” ) ;,程序流程图表示,执行过程的N-S图所示。其中i为外循环的控制变量,j为内循环的控制变量。,57 改变循环执行状态break语句与continue 语句,5.7.1 break语句1. break的语句格式:break;,2.功能:从switch结构或包含它的最内层循环结构中跳出。该语句只能用于switch 语句和三种循环语句(for、while、dowhile)的循环
12、体中。,程序 计算 r = 1 到 r = 10 时的圆面积,直到面积大于为止。# define pi 3.14main ( ) int r; float area ; for ( r = 1 ; r 100 ) break; printf ( “ %f ” , area ) ; printf ( “ ok ” ) ;,注意:在多重循环中,break只能退出其所在的循环,即:退出其所在的内层循环,对外层循环不起作用。若要从内层循环直接退出外层循环,可以使用goto语句。,例7 百钱买百鸡问题。公鸡5元一只,母鸡3元一只,小鸡1元三只。100元要买100只鸡,且需包括公鸡、母鸡和小鸡。求公鸡、母
13、鸡和小鸡各买多少只?(找到一组解即可),讨论:假设要买的公鸡、母鸡和小鸡个数分别标识为x , y , z ,将它们定义为整型变量。由题目的条件可以列出下面的方程组:x + y + z = 1005 x + 3 y + z / 3.0 = 100这个方程组可能存在多个解。所以需要用穷举法解方程。很明显x的最大值不会超过20, y的最大值不会超过33 ( 还可以根据数论知识将x和y的取值范围缩小),z可以根据x、 y计算得出。,所以程序需要设计成二重循环。由于题目只要求找到一组解,所以在循环过程中只要找到一组满足条件的x, y, z就可以跳出循环。跳出循环的方法可以采用break语句,但是,因为是
14、二重循环,所以要考虑使用break是否方便。,程序 百钱买百鸡问题。void main ( ) int x , y , z ; for ( x = 1 ; x 20 ; x + )for ( y = 1 ; y 33 ; y + ) z = 100 x y ; /*计算小鸡个数*/if ( z ! = 0 ,程序 百钱买百鸡问题。main ( ) int x , y , z ; for ( x = 1 ; x 20 ; x + )for ( y = 1 ; y 33 ; y + ) z = 100 x y ; /*计算小鸡个数*/if ( z ! = 0 & 5 * x + 3 * y + z
15、 / 3.0 = = 100 ) break ;end : printf ( “公鸡%d, 母鸡%d, 小鸡%d n “ , x, y , z );,57 break语句与continue 语句,5.7.2 continue语句 1. continue的语句格式:continue ;,2.功能:结束本轮循环,即跳过循环体中continue下面的语句,执行下一次循环。continue语句只适用于循环语句中。注意:continue与break在功能上有很大的区别。,程序 把之间的能被7整除的数输出。main ( ) int n;for ( n = 1 ; n = 100 ; n + ) if (
16、n % 7 != 0 ) continue ; printf ( “ %d ” , n ) ;,程序 把之间的能被7整除的数输出。main ( ) int n;for ( n = 1 ; n = 100 ; n + ) if ( n % 7 != 0 ) break ; printf ( “ %d ” , n ) ;,main( ) int i;for ( i = 1 ; i 6 ; i + ) if ( i % 2 ) printf ( “ 1 ” ) ; else continue ;printf ( “ 2 ” ) ; ,输出结果:121212,main( ) int i;for ( i
17、 = 1 ; i 6 ; i + ) if ( i % 2 ) printf ( “ 1 ” ) ; continue ; else printf ( “ 2 ” ) ; ,输出结果:12121,main( ) int i;for ( i = 1 ; i 6 ; i + ) if ( i % 2 ) printf ( “ 1 ” ) ; continue ; printf ( “ 2 ” ) ; ,输出结果:111,58 程序举例,1.最大最小问题,2.分段(多条件)问题,3.函数公式套用,4.求素数问题,5.求累加或累乘问题,6.译码问题,7.最大公倍数和最小公约数问题,程序 .读入三个数,
18、找出并打印其中的最大数,程序如下:main( ) int a, b , c, max;scanf(“%d,%d,%d”,请问:有什么问题吗?,假若:ab 但 ca 呢?,例如:a5 b5 c4,ab,ac,Y,Y,max=a,max=c,N,bc,max=b,N,Y,N,max=c,main( ) int a, b , c, max;scanf(“%d,%d,%d”,程序 输入10个数,求出其中的最大值(或最小值)。,比如,依次输入 20 10 30 27 37 90 36 77 63 89,最大 :90 最小 :27,有什么算法呢?,程序 输入10个数,求出其中的最大值与最小值。,设一个变量
19、max,依次输入 20 10 30 27 37 90 36 77 63 89,20,30,37,90,这种算法俗称:打擂台法,输入a,maxa; i1;,i=9,Y,新输入a,amax,max=a;,i+;,Y,N,输出max,N,程序 读入三个数,找出并打印其中的最大数,程序如下(用打擂台法实现):main( ) int a, b , c, max;scanf(“%d,%d,%d”,程序 求50100之间的所有素数。,#include main ( ) int m , i , k ;for ( m=51; mk ) printf(“%4d”,m) ; ,程序的循环结构是控制结构的的重大要素,
20、也是编程的基础。我们以顺序执行结构为基本框架,通过选择控制结构,可以改变程序的执行路线,而通过循环结构,则可以让程序反复做,直到满意为止。一个程序中三种结构可以不同时存在,但至少存在顺序执行结构。因此如何在顺序执行结构在基础上,采用合适的循环控制,实现程序的意图,即设计合适的算法,是程序设计的重点。而要能够设计算法,必须掌握程序的基本框架,正确运用循环语句,掌握其格式和执行流程。即掌握:,1、while、do_while和for三种循环结构的构成 形式、运行流程; 2、break、continue语句的作用。,本章小结,在与switch语句配套的case语句中所使用的表达式_。A)只能是常量B
21、)可以是变量或常量C)只能是常量或常量表达式D)无论是常量还是变量,只要在执行时已经有确定的值就行,本题考核了case语句的规定。正确答案是C。,课堂同步: 做做与练练,【练5.1】,试题分析,选择正确的选项:,课堂同步: 做做与练练,【练5.2】,试题分析,if语句中用来作为判断条件的表达式为_。A)逻辑表达式B)关系表达式C)算术表达式D)以上三种表达式,if语句中表达式作为分支的判断条件,判断为“真”还是“假”的依据是表达式的值:0为真、非0为假。正确答案是D。,选择正确的选项:,课堂同步: 做做与练练,【练5.3】,试题分析,#include void main() float fpr
22、ice = 0;printf(“Please input price:n”);scanf(“%f”, ,分析下面程序中的错误:,这个程序无论输入什么价格,都会输出“Buy it !”。其错误在if语句中,fprice = 300进行的是赋值运算,而不是想要的比较相等的关系运算。,课堂同步: 做做与练练,【练5.4】,试题分析,#include void main() int result10=0,iindex=0;while (iindex 9) resultiindex=20;printf(“%d“,resultiindex); ,这个程序是一个死循环,程序将一直不停地在屏幕上输出20。解决的办法是在循环体内增加语句,改变循环变量iindex的值,使其最后达到条件为真。,分析下面程序中的错误:,课堂同步:课后练习与作业,1、输入两个正整数m和n,求其最大公约数和最小公倍数。,2、输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。,3、打印出所有“水仙花数“,所谓“水仙花数“是指一个三位数,其各位数字立方和等于该本身。,4、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 求出这个数列的前20项之和。,5、一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?,