第03章 循环结构程序设计.ppt
第第 3章章 之之 循环结构程序设计循环结构程序设计 第三章之循环结构程序设计 u学习的意义学习的意义 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 许多实际问题中往往需要有规律地重复某些操作,如菜许多实际问题中往往需要有规律地重复某些操作,如菜 谱中可以有:谱中可以有: ““ 打鸡蛋直到泡沫状打鸡蛋直到泡沫状 ”” 这样的步骤,也就是说这样的步骤,也就是说 ,在鸡蛋没有打成泡沫状时要反复地打。相应的操作在计算,在鸡蛋没有打成泡沫状时要反复地打。相应的操作在计算 机程序中就体现为某些语句的重复执行,这就时所谓的机程序中就体现为某些语句的重复执行,这就时所谓的 循环循环 。。 下面来思考一个问题:下面来思考一个问题: 如何编程来计算如何编程来计算 1 + 2 + 3 + … + 100 ?? 程序如下:程序如下: int s = 0; s = s + 1; s = s + 2; s = s + 3; ………… s = s + 100; printf (“s = %d”, s); 重复重复 100次,次, 晕!!!晕!!! 有没有更好的方法来有没有更好的方法来 计算呢?计算呢? 有!就是用循有!就是用循 环来编程。环来编程。 ü While、 do-while、 for语句 ü 循环嵌套 ü Break、 continue、 goto语句 ü exit()函数 ü 循环结构类型的选择及转换 ü 循环结构程序设计举例 ü 本讲小结 u学习目标学习目标 Ø 理解循环结构的含义; Ø 掌握 C语言三种循环结构的特点; Ø 掌握 while、 do-while、 for、 goto、 break、 continue语 句的使用方法; Ø 掌握不同循环结构的选择及其转换方法; Ø 掌握混合控制结构程序设计的方法。 u学习内容学习内容 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 3.5 循环结构的程序设计 1. while语句语句 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C Ø 一般形式:一般形式: while (表达式表达式 ) 循环体语句;循环体语句; Ø 执行流程:执行流程: F T expr 循环体循环体 while 其中:其中: l while后面的括号(后面的括号( )不能省。)不能省。 l while后面的表达式可以是任意类型后面的表达式可以是任意类型 的表达式,但一般是条件表达式或逻辑的表达式,但一般是条件表达式或逻辑 表达式。表达式。 l 表达式的值是循环的控制条件。表达式的值是循环的控制条件。 l 语句部分称为循环体,当需要执行多语句部分称为循环体,当需要执行多 条语句时,应使用复合语句条语句时,应使用复合语句 。。 特点:先判断表达式,再执行循环体特点:先判断表达式,再执行循环体 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 【【 例例 】】 用用 while语句求语句求 1~~ 100的累计和。的累计和。 #include void main ( ) { int i = 1, sum = 0; while ( i void main ( ) { int i = 1; while ( i 0) //a 0为假,为假, b++不可能执行不可能执行 b++; int num = 0; //字符计数字符计数 while ( 1 ) { if (getche ( ) == \n ) //如果输入的字符是回车符,则返回如果输入的字符是回车符,则返回 return; num++; } (4) 在执行在执行 while语句之前,循环控制变量必须初始化语句之前,循环控制变量必须初始化 ,否则执行的结果将是不可预知的。,否则执行的结果将是不可预知的。 (5) 要在要在 while语句的某处(表达式或循环体内)改变语句的某处(表达式或循环体内)改变 循环控制变量,否则极易构成死循环。循环控制变量,否则极易构成死循环。 (6) 允许允许 while语句的循环体又是语句的循环体又是 while语句,从而形语句,从而形 成双重循环。成双重循环。 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C Ø while语句注意事项:语句注意事项: 例:计算例:计算 10! #include void main ( ) { int i; // i应赋初始值应赋初始值 10 long s = 1; while (i = 1) s *= i--; printf (“10! = %ld\n“, s); } i = 1; while (i void main ( ) { int m, n, r; printf (“Please input two positive integer: “); scanf (“% d%d “, while (n != 0) { r = m % n; //求余数求余数 m = n; n = r; } printf (“Their greatest common divisor is % d\n“, m); } 运行结果:运行结果: Please input two positive integer: 24 56↙ Their greatest common divisor is 8 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 2. do_while语句语句 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C Ø 一般形式:一般形式: do 循环体语句;循环体语句; while(表达式表达式 ); Ø 执行流程:执行流程: 其中:其中: l while后面的括号(后面的括号( )不能省。)不能省。 l while最后面的分号最后面的分号 ;不能省。不能省。 l while后面的表达式可以是任意类型后面的表达式可以是任意类型 的表达式,但一般是条件表达式或逻辑的表达式,但一般是条件表达式或逻辑 表达式。表达式。 l 表达式的值是循环的控制条件。表达式的值是循环的控制条件。 l 语句部分称为循环体,当需要执行多语句部分称为循环体,当需要执行多 条语句时,应使用复合语句条语句时,应使用复合语句 。。 F T expr 循环体循环体 do while 特点:先执行循环体,再判断表达式特点:先执行循环体,再判断表达式 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 【【 例例 】】 用用 do_while语句求语句求 1~~ 100的累计和。的累计和。 #include void main ( ) { int i = 1, sum = 0; do { sum += i; i++; } while ( i 0) ; (1) 如果如果 do-while后的表达式的值一开始就为假,循环后的表达式的值一开始就为假,循环 体还是要执行一次。体还是要执行一次。 (2)在在 if语句、语句、 while语句中,表达式后面都不能加分号语句中,表达式后面都不能加分号 ,而在,而在 do-while语句的表达式后面则必须加分号,否则将产语句的表达式后面则必须加分号,否则将产 生语法错误。生语法错误。 (3) 循环体中的语句可为任意类型的循环体中的语句可为任意类型的 C语句。语句。 (4) 和和 while语句一样,在使用语句一样,在使用 do-while语句时,不要语句时,不要 忘记初始化循环控制变量,否则执行的结果将是不可预知的忘记初始化循环控制变量,否则执行的结果将是不可预知的 。。 (5) 要在要在 do-while语句的某处(表达式或循环体内)改语句的某处(表达式或循环体内)改 变循环控制变量的值,否则极易构成死循环。变循环控制变量的值,否则极易构成死循环。 (6) do-while语句也可以组成多重循环,而且也可以和语句也可以组成多重循环,而且也可以和 while语句相互嵌套。语句相互嵌套。 3. for语句语句 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C Ø 一般形式:一般形式: for (表达式表达式 1;表达式;表达式 2;表达式;表达式 3) 循环体语句;循环体语句; Ø 执行流程:执行流程: 其中:其中: l for后面的括号(后面的括号( )不能省。)不能省。 l 表达式表达式 1:: 一般为赋值表达式,给控一般为赋值表达式,给控 制变量赋初值。制变量赋初值。 l 表达式表达式 2:: 关系表达式或逻辑表达式关系表达式或逻辑表达式 ,循环控制条件。,循环控制条件。 l 表达式表达式 3:: 一般为赋值表达式,给控一般为赋值表达式,给控 制变量增量或减量。制变量增量或减量。 l 表达式之间用分号分隔。表达式之间用分号分隔。 l 语句部分称为循环体,当需要执行多语句部分称为循环体,当需要执行多 条语句时,应使用复合语句。条语句时,应使用复合语句。 F T expr2 循环体循环体 for expr1 expr3 for语句很好地体现了正确表达循环结构应注意的三个问题:语句很好地体现了正确表达循环结构应注意的三个问题: Ø 控制变量的初始化。控制变量的初始化。 Ø 循环的条件。循环的条件。 Ø 循环控制变量的更新。循环控制变量的更新。 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 【【 例例 】】 用用 for语句求语句求 1~~ 100的累计和。的累计和。 #include void main ( ) { int i , sum = 0; for (i = 1; i void main ( ) { int i, sum = 0; i = 1; for ( ; i void main ( ) { int i, sum = 0; i = 1; for ( ; i void main ( ) { int i, sum = 0; i = 1; for ( ; ; ) { if (i 100) break; sum += i++; } printf(“sum = % d\n“, sum); } 省掉表达式省掉表达式 1,2,3 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C Ø for语句注意事项:语句注意事项: for (a = 1; ; a++) printf (“ (3) 表达式表达式 2如果为空则相当于表达式如果为空则相当于表达式 2的值是真的值是真 。 死循环啦!死循环啦! (4) 循环体中的语句可为任意类型的循环体中的语句可为任意类型的 C语句。语句。 (5) for语句也可以组成多重循环,而且也可以和语句也可以组成多重循环,而且也可以和 while语语 句和句和 do-while语句相互嵌套。语句相互嵌套。 (6) 循环体可以是空语句。循环体可以是空语句。 例:计算用户输入的字符数(当输入是回车例:计算用户输入的字符数(当输入是回车 符时统计结束符时统计结束 )。。 #include void main ( ) { int n = 0; printf (“input a string:\n“); for ( ; getchar( ) != \n ; n++) ; printf (“% d“,n); } 表示循环体为空语表示循环体为空语 句,并非表示句,并非表示 for语语 句结束句结束 Ø 三种循环可互相嵌套三种循环可互相嵌套 ,层数不限层数不限 Ø 外层循环可包含两个以上内循环外层循环可包含两个以上内循环 ,但不能相互交叉但不能相互交叉 Ø 嵌套循环的执行流程嵌套循环的执行流程 (1) while() { …… while() { …… } …. } (2) do { …… do { …… }while( ); …. }while( ); (3) while() { …… do { …… }while( ); ……. } Ø 嵌套循环的跳转嵌套循环的跳转 禁止:禁止: l 从外层跳入内层从外层跳入内层 l 跳入同层的另一循环跳入同层的另一循环 l 向上跳转向上跳转 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 4. 循环嵌套循环嵌套 (4) for( ; ;) { …… do { …… }while(); …… while() { …… } …. } 外循环外循环 内循环内循环 内循环内循环 【【 例例 】】 循环嵌套,输出九九表循环嵌套,输出九九表 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 9 18 27 36 45 54 63 72 81 …………… i j 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C #include void main ( ) { int i, j; for (i = 1; i void main ( ) { char c; while ( 1 ) { c = getchar ( ); //读取一个字符读取一个字符 if ( c = a float sum = 0; for (i = 0; i void main ( ) { int i = 1, sum = 0; loop: sum += i++; if (i 程序设计分析:程序设计分析: 由数学知识可知,求三角形面积的公式是:由数学知识可知,求三角形面积的公式是: 其中,其中, a、、 b、、 c是三角形的三个边长,是三角形的三个边长, s = (a + b + c) / 2。。 因此,程序中应该有三个因此,程序中应该有三个 float型变量用来存放型变量用来存放 a、、 b、、 c的值的值 ,为了方便起见,还应有一个变量存放,为了方便起见,还应有一个变量存放 s,最后有必要设置一个,最后有必要设置一个 变量来存放三角形的面积值。公式中存在求平方根的操作,这要变量来存放三角形的面积值。公式中存在求平方根的操作,这要 用到用到 C语言数学库函数语言数学库函数 sqrt。。 sqrt函数带有一个参数,它的功能函数带有一个参数,它的功能 是返回参数的平方根。程序在开始接受用户输入的三角形的三个是返回参数的平方根。程序在开始接受用户输入的三角形的三个 边长后,首先要对这三边作合法性检查,如三边中有某一边长度边长后,首先要对这三边作合法性检查,如三边中有某一边长度 小于或等于小于或等于 0,则终止程序的执行,同样如果,则终止程序的执行,同样如果 s*(s-a)*(s-b)*(s- c)为负,也要终止程序的执行。为负,也要终止程序的执行。 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 【【 例例 】】 输入三角形的边长,求三角形面积。输入三角形的边长,求三角形面积。 #include #include #include void main ( ) { float a, b, c; float s, area; printf (“input the length of three edges of triangle: “); scanf (“% f%f%f “, if (a = 0 || b = 0 || c = 0) { printf (“the length of three edges of triangle is error!\n“); exit (-1); } s = (a + b + c) / 2; s = s * (s - a) * (s - b) * (s - c); if (s 0) { printf (“the length of three edges of triangle is error!\n“); exit (-1); } area = (float)sqrt (s); printf (“area = %.2f\n“, area); } 运行结果:运行结果: input the length of three edges of triangle: 3 4 5↙ area = 6.00 input the length of three edges of triangle: 3 -4 5↙ the length of three edges of triangle is error! 3.6 循环结构类型的选择及转换 语 言 程 序 设 计 第 三 章 之 循 环 结 构 程 序 设 计 C 1. 循环结构类型的选择原则循环结构类型的选择原则 Ø 如果循环次数在执行循环体之前就已确定,一般用如果循环次数在执行循环体之前就已确定,一般用 for 循环;如果循环次数是由循环体的执行情况确定的,一般循环;如果循环次数是由循环体的执行情况确定的,一般 用用 while循环或者循环或者 do-while循环。循环。 Ø 当循环体至少执行一次时,用当循环体至少执行一次时,用 do-while循环,反之,如循环,反之,如 果循环体可能一次也不执行,选用果循环体可能一次也不执行,选用 while循环。循环。 2. 循环结构类型之间的相互转换循环结构类型之间的相互转换 尽管上面对于循环结构的选择给出了原则性指导意见,尽管上面对于循环结构的选择给出了原则性指导意见, 但是我们应注意到其实这三种循环结构彼此之间可以相互转但是我们应注意到其实这三种循环结构彼此之间可以相互转 换,象前面我们分别用换,象前面我们分别用 while循环、循环、 do-while循环、循环、 for循环循环 来求来求 1~~ 100的累计和的例子就说明了这一点。的累计和的例子就说明了这一点。