高级程序语言设计循环结构程序设计.ppt_第1页
高级程序语言设计循环结构程序设计.ppt_第2页
高级程序语言设计循环结构程序设计.ppt_第3页
高级程序语言设计循环结构程序设计.ppt_第4页
高级程序语言设计循环结构程序设计.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第6 6章章 循环结构程序设计循环结构程序设计 制作人:王敬华制作人:王敬华 第6章:循环结构程序设计 uu学习的意义学习的意义 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 许多实际问题中往往需要有规律地重复某些操作,如菜许多实际问题中往往需要有规律地重复某些操作,如菜 谱中可以有:谱中可以有:“打鸡蛋直到泡沫状打鸡蛋直到泡沫状”这样的步骤,也就是说这样的步骤,也就是说 ,在鸡蛋没有打成泡沫状时要反复地打。相应的操作在计算,在鸡蛋没有打成泡沫状时要反复地打。相应的操作在计算 机程序中就体现为某些语句的重复执行,这就时所谓的机程序中就体现为某些语句的重复执行,这就时所谓的循环循环 。 下面来思考一个问题:下面来思考一个问题:如何编程来计算如何编程来计算1 + 2 + 3 + + 1001 + 2 + 3 + + 100? 程序如下:程序如下:intint s = 0; s = 0; s = s + 1; s = s + 1; s = s + 2; s = s + 2; s = s + 3; s = s + 3; s = s + 100; s = s + 100; printfprintf (“s = %d”, s); (“s = %d”, s); 重复重复100100次,次, 晕!晕! 有没有更好的方法来有没有更好的方法来 计算呢?计算呢? 有!就是用循有!就是用循 环来编程。环来编程。 第第4 4章已讨论章已讨论 程序结构程序结构 顺序结构顺序结构 选择结构选择结构 循环结构循环结构 本章讨论本章讨论 第第5 5章已讨论章已讨论 While、do-while、for语句 循环嵌套 Break、continue、goto语句 exit()函数 循环结构类型的选择及转换 循环结构程序设计举例 本章小结 uu学习目标学习目标 理解循环结构的含义; 掌握C语言三种循环结构的特点; 掌握while、do-while、for、goto、break、continue语 句的使用方法; 掌握不同循环结构的选择及其转换方法; 掌握混合控制结构程序设计的方法。 u u学习内容学习内容 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 6.1 循环结构的程序设计 1. while1. while语句语句 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 一般形式:一般形式: while (while (表达式表达式) ) 循环体语句;循环体语句; 执行流程:执行流程: F F T T exprexpr 循环体循环体 whilewhile 其中:其中: l l whilewhile后面的括号(后面的括号( )不能省。)不能省。 l l whilewhile后面的表达式可以是任意类型后面的表达式可以是任意类型 的表达式,但一般是条件表达式或逻辑的表达式,但一般是条件表达式或逻辑 表达式。表达式。 l l 表达式的值是是循环的控制条件。表达式的值是是循环的控制条件。 l l 语句部分称为循环体,当需要执行多语句部分称为循环体,当需要执行多 条语句时,应使用复合语句条语句时,应使用复合语句。 特点:先判断表达式,再执行循环体特点:先判断表达式,再执行循环体 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 【例例】 用用whilewhile语句求语句求1 1100100的累计和。的累计和。 #include void main ( )void main ( ) intint i = 1, sum = 0; i = 1, sum = 0; while ( i void main ( ) void main ( ) intint i = 1; i = 1; while ( i 0) while (a 0) /a 0/a 0为假,为假,b+b+不可能执行不可能执行 b+;b+; intint num = 0; num = 0; / /字符计数字符计数 while ( 1 )while ( 1 ) if ( if (getchegetche ( ) = n) ( ) = n) / /如果输入的字符是回车符,则返回如果输入的字符是回车符,则返回 return;return; num+; num+; (4) (4) 在执行在执行whilewhile语句之前,循环控制变量必须初始化语句之前,循环控制变量必须初始化 ,否则执行的结果将是不可预知的。,否则执行的结果将是不可预知的。 (5) (5) 要在要在whilewhile语句的某处(表达式或循环体内)改变语句的某处(表达式或循环体内)改变 循环控制变量,否则极易构成死循环。循环控制变量,否则极易构成死循环。 (6) (6) 允许允许whilewhile语句的循环体又是语句的循环体又是whilewhile语句,从而形语句,从而形 成双重循环。成双重循环。 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C whilewhile语句注意事项:语句注意事项: 例:计算例:计算10! 10! #include void main ( ) void main ( ) intint i; i; / i/ i应赋初始值应赋初始值1010 long s = 1; long s = 1; while (i = 1) while (i = 1) s *= i-; s *= i-; printfprintf (“10! = %ldn“, s); (“10! = %ldn“, s); i = 1;i = 1; while (i void main ( )void main ( ) intint m, n, r; m, n, r; printfprintf (“Please input two positive integer: “); (“Please input two positive integer: “); scanfscanf (“% (“%d%dd%d“, “, while while (n != 0) (n != 0) r = m % n; r = m % n; /求余数求余数 m = n;m = n; n = r; n = r; printfprintf (“Their greatest common divisor is % (“Their greatest common divisor is %dndn“, m);“, m); 运行结果:运行结果: Please input two positive integer: 24 56Please input two positive integer: 24 56 Their greatest common divisor is 8Their greatest common divisor is 8 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 2. 2. do_whiledo_while语句语句 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 一般形式:一般形式: do do 循环体语句;循环体语句; while(while(表达式表达式);); 执行流程:执行流程: 其中:其中: l l whilewhile后面的括号(后面的括号( )不能省。)不能省。 l l whilewhile最后面的分号最后面的分号; ;不能省。不能省。 l l whilewhile后面的表达式可以是任意类型后面的表达式可以是任意类型 的表达式,但一般是条件表达式或逻辑的表达式,但一般是条件表达式或逻辑 表达式。表达式。 l l 表达式的值是是循环的控制条件。表达式的值是是循环的控制条件。 l l 语句部分称为循环体,当需要执行多语句部分称为循环体,当需要执行多 条语句时,应使用复合语句条语句时,应使用复合语句。 F F T T exprexpr 循环体循环体 dodo whilewhile 特点:先执行循环体,再判断表达式特点:先执行循环体,再判断表达式 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 【例例】 用用do_whiledo_while语句求语句求1 1100100的累计和。的累计和。 #include void main ( )void main ( ) intint i = 1, sum = 0; i = 1, sum = 0; do do sum += i; sum += i; i+; i+; while ( i 0) ; while (a 0) ; (1) (1) 如果如果do-whiledo-while后的表达式的值一开始就为假,循环后的表达式的值一开始就为假,循环 体还是要执行一次。体还是要执行一次。 (2)(2)在在ifif语句、语句、whilewhile语句中,表达式后面都不能加分号语句中,表达式后面都不能加分号 ,而在,而在do-whiledo-while语句的表达式后面则必须加分号,否则将产语句的表达式后面则必须加分号,否则将产 生语法错误。生语法错误。 (3) (3) 循环体中的语句可为任意类型的循环体中的语句可为任意类型的C C语句。语句。 (4) (4) 和和whilewhile语句一样,在使用语句一样,在使用do-whiledo-while语句时,不要语句时,不要 忘记初始化循环控制变量,否则执行的结果将是不可预知的忘记初始化循环控制变量,否则执行的结果将是不可预知的 。 (5) (5) 要在要在do-whiledo-while语句的某处(表达式或循环体内)改语句的某处(表达式或循环体内)改 变循环控制变量的值,否则极易构成死循环。变循环控制变量的值,否则极易构成死循环。 (6) do-while(6) do-while语句也可以组成多重循环,而且也可以和语句也可以组成多重循环,而且也可以和 whilewhile语句相互嵌套。语句相互嵌套。 3. for3. for语句语句 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 一般形式:一般形式:for (for (表达式表达式1 1;表达式;表达式2 2;表达式;表达式3)3) 循环体语句;循环体语句; 执行流程:执行流程: 其中:其中: l l forfor后面的括号(后面的括号( )不能省。)不能省。 l l 表达式表达式1 1:一般为赋值表达式,给控一般为赋值表达式,给控 制变量赋初值。制变量赋初值。 l l 表达式表达式2 2:关系表达式或逻辑表达式关系表达式或逻辑表达式 ,循环控制条件。,循环控制条件。 l l 表达式表达式3 3:一般为赋值表达式,给控一般为赋值表达式,给控 制变量增量或减量。制变量增量或减量。 l l 表达式之间用分号分隔。表达式之间用分号分隔。 l l 语句部分称为循环体,当需要执行多语句部分称为循环体,当需要执行多 条语句时,应使用复合语句。条语句时,应使用复合语句。 F T expr2expr2 循环体循环体 forfor expr1expr1 expr3expr3 forfor语句很好地体现了正确表达循环结构应注意的三个问题:语句很好地体现了正确表达循环结构应注意的三个问题: 控制变量的初始化。控制变量的初始化。 循环的条件。循环的条件。 循环控制变量的更新。循环控制变量的更新。 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 【例例】 用用forfor语句求语句求1 1100100的累计和。的累计和。 #include void main ( )void main ( ) intint i , sum = 0; i , sum = 0; for (i = 1; i void main ( )void main ( ) intint i, sum = 0; i, sum = 0; i = 1; i = 1; for ( ; i void main ( )void main ( ) intint i, sum = 0; i, sum = 0; i = 1; i = 1; for ( ; i void main ( )void main ( ) intint i, sum = 0; i, sum = 0; i = 1; i = 1; for ( ; ; ) for ( ; ; ) if (i 100) break; if (i 100) break; sum += i+; sum += i+; printf(“sumprintf(“sum = % = %dndn“, sum);“, sum); 省掉表达式省掉表达式1,2,31,2,3 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C forfor语句注意事项:语句注意事项: for (a = 1; ; a+)for (a = 1; ; a+) printfprintf (“, a); (3) (3) 表达式表达式2 2如果为空则相当于表达式如果为空则相当于表达式2 2的值是真的值是真 。 死循环!死循环! (4) (4) 循环体中的语句可为任意类型的循环体中的语句可为任意类型的C C语句。语句。 (5) for(5) for语句也可以组成多重循环,而且也可以和语句也可以组成多重循环,而且也可以和whilewhile语语 句和句和do-whiledo-while语句相互嵌套。语句相互嵌套。 (6) (6) 循环体可以是空语句。循环体可以是空语句。 例:计算用户输入的字符数(当输入是回车例:计算用户输入的字符数(当输入是回车 符时统计结束符时统计结束) )。 #include void main ( )void main ( ) intint n = 0; n = 0; printfprintf (“input a string:n“); (“input a string:n“); for ( ; for ( ; getchargetchar( ) != n; n+) ( ) != n; n+) ; ; printfprintf (“% (“%d“,nd“,n); ); 表示循环体为空语表示循环体为空语 句,并非表示句,并非表示forfor语语 句结束句结束 三种循环可互相嵌套三种循环可互相嵌套, ,层数不限层数不限 外层循环可包含两个以上内循环外层循环可包含两个以上内循环, ,但不能相互交叉但不能相互交叉 嵌套循环的执行流程嵌套循环的执行流程 (1) while()(1) while() while() while() . . (2) do(2) do do do while( ); while( ); . . while( ); while( ); (3) while()(3) while() do do while( ); while( ); . . 嵌套循环的跳转嵌套循环的跳转 禁止:禁止: l l 从外层跳入内层从外层跳入内层 l l 跳入同层的另一循环跳入同层的另一循环 l l 向上跳转向上跳转 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 4. 4. 循环嵌套循环嵌套 (4) for( ; ;)(4) for( ; ;) do do while(); while(); while() while() . . 外循环外循环 内循环内循环 内循环内循环 【例例】循环嵌套,输出九九表循环嵌套,输出九九表 123456789 123456789 24681012141618 369121518212427 91827364554637281 i j 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C #include void main ( )void main ( ) intint i, j; i, j; for (i = 1; i void main ( )void main ( ) char c; char c; while ( 1 ) while ( 1 ) c = c = getchargetchar ( ); ( ); / /读取一个字符读取一个字符 if ( c = a i, a, num = 0; float sum = 0; float sum = 0; for (i = 0; i void main ( )void main ( ) intint i = 1, sum = 0; i = 1, sum = 0; loop:loop: sum += i+; sum += i+; if (i 程序设计分析:程序设计分析: 由数学知识可知,求三角形面积的公式是:由数学知识可知,求三角形面积的公式是: 其中,其中,a a、b b、c c是三角形的三个边长,是三角形的三个边长,s = (a + b + s = (a + b + c) / 2c) / 2。 因此,程序中应该有三个因此,程序中应该有三个floatfloat型变量用来存放型变量用来存放a a、b b、 c c的值,为了方便起见,还应有一个变量存放的值,为了方便起见,还应有一个变量存放s s,最后有必,最后有必 要设置一个变量来存放三角形的面积值。公式中存在求平要设置一个变量来存放三角形的面积值。公式中存在求平 方根的操作,这要用到方根的操作,这要用到C C语言数学库函数语言数学库函数sqrtsqrt。sqrtsqrt函数带函数带 有一个参数,它的功能是返回参数的平方根。程序在开始有一个参数,它的功能是返回参数的平方根。程序在开始 接受用户输入的三角形的三个边长后,首先要对这三边作接受用户输入的三角形的三个边长后,首先要对这三边作 合法性检查,如三边中有某一边长度小于或等于合法性检查,如三边中有某一边长度小于或等于0 0,则终止,则终止 程序的执行,同样如果程序的执行,同样如果s*(s-a)*(s*(s-a)*(s-bs-b)*()*(s-cs-c) )为负,也要终为负,也要终 止程序的执行。止程序的执行。 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 【例例】 输入三角形的边长,求三角形面积。输入三角形的边长,求三角形面积。 #include #include #include void main ( )void main ( ) float a, b, c; float a, b, c; float s, area; float s, area; printfprintf (“input the length of three edges of triangle: “); (“input the length of three edges of triangle: “); scanfscanf (“% (“%f%f%ff%f%f“, “, if (a #include void main ( )void main ( ) intint m, i, k; m, i, k; printfprintf (“input a number: “); (“input a number: “); scanfscanf (“%d“, (“%d“, k = k = sqrtsqrt (m); i = 2; (m); i = 2; while (i k) if (i k) printfprintf (“yesn“); (“yesn“); else else printfprintf (“non“); (“non“); whilewhile循环循环 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C #include #include void main ( )void main ( ) intint m, i, k; m, i, k; printfprintf (“input a number: “); (“input a number: “); scanfscanf (“%d“, (“%d“, k = k = sqrtsqrt (m); (m); for (i = 2; i k) if (i k) printfprintf (“yesn“); (“yesn“); else else printfprintf (“non“); (“non“); forfor循环循环 #include #include void main ( )void main ( ) intint m, i, k; m, i, k; printfprintf (“input a number: “); (“input a number: “); scanfscanf (“%d“, (“%d“, k = k = sqrtsqrt (m); i = 2; (m); i = 2; dodo if (m % i = 0) break; if (m % i = 0) break; i+; i+; while (i k) if (i k) printfprintf (“yesn“); (“yesn“); else else printfprintf (“non“); (“non“); do_whiledo_while循环循环 6.3 循环结构程序设计举例 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 【例例1 1】验证哥德巴赫猜想:任一充分大的偶数,可以用验证哥德巴赫猜想:任一充分大的偶数,可以用 两个素数之和表示。例如:两个素数之和表示。例如:4 = 2 + 24 = 2 + 2,6 = 3 + 36 = 3 + 3,98 = 19 + 79 98 = 19 + 79 这一思路的算法如下:这一思路的算法如下: 读入大于读入大于3 3的偶数的偶数n n。 p = 1p = 1 do do p = p + 1; q = n - p; p = p + 1; q = n - p; p p是素数吗?是素数吗? q q是素数吗?是素数吗? while p while p、q q有一个不是素数。有一个不是素数。 输出输出n = p + qn = p + q。 问题分析:问题分析: 读入一个偶数读入一个偶数n n,将它分成,将它分成p p和和q q,使,使n = p + qn = p + q。怎样分呢?可以令。怎样分呢?可以令p p从从2 2 开始,每次加开始,每次加1 1,而令,而令q = n - pq = n - p,如果,如果p p、q q均为素数,则正为所求,否则均为素数,则正为所求,否则 令令p = p + 1p = p + 1再试。再试。 flagpflagp = 1; = 1; for (j = 2; j #include #include void main ( )void main ( ) intint i, n, p, q, i, n, p, q, flagpflagp, , flagqflagq; ; printfprintf (“please input n: “); (“please input n: “); scanfscanf (“%d“, (“%d“, / /输入一偶数输入一偶数 if (n #include void main ( )void main ( ) intint s = 1; s = 1; float n = 1.0, t = 1, pi = 0; float n = 1.0, t = 1, pi = 0; while ( while (fabs(tfabs(t) = 1e-6) = 1e-6) pi += t; pi += t; n += 2; n += 2; s = -s; s = -s; t = s / n; t = s / n; pi *= 4; pi *= 4; printfprintf (“pi = %.6fn“, pi); (“pi = %.6fn“, pi); 运行结果:运行结果: pi = 3.141594pi = 3.141594 语 言 程 序 设 计 教 程 第 六 章 循 环 结 构 程 序 设 计 C 【例例】打印大小可变的菱形图案(下面菱形的大小是打印大小可变的菱形图案(下面菱形的大小是7 7)。)。 问题分析:问题分析: 菱形的大小菱形的大小sizesize其实就是中间行中其实就是中间行中* * 号的个数,也是整个菱形的行数,其值必号的个数,也是整个菱形的行数,其值必 须是奇数。须是奇数。 问题的关键之一问题的关键之一是如何确定每行中是如何确定每行中* * 号的个数。经过分析得知:当行数号的个数。经过分析得知:当行数i i(假设(假设 最上面的一行为第最上面的一行为第1 1行)行) (size+1)/2 (size+1)/2时时 ,该行上的,该行上的* *号个数为号个数为n = 2*i-1n = 2*i-1,否则,否则n = n = 2*( size-i+1)-12*( size-i+1)-1。 问题的关键之二问题的关键之二是如何确定每行显是如何确定每行显 示的第一个示的第一个* *号的位置,也就是显示第一个号的位置,也就是显示第一个 * *号之前应显示多少个空格。经过分析得知号之前应显示多少个空格。经过分析得知 :每行应显示的空格数为:每行应显示的空格数为m = (size - n) m = (size - n) / 2/ 2个。个。 #include #include void main ( )void main ( ) intint i, j, k, m, n, size; i, j, k, m, n, size; printfprintf (“input size: “); (“input size: “); / /输入大小提示输入大小提示 scanfscanf (“%d”, (“%d”, / /输入大小输入大小 / /如果为小于或等于如果为小于或等于0 0的数或为偶数的数或为偶数 if (size #include void main ( )void main ( ) intint num1, num2; num1, num2; intint n, s, r; n, s, r; intint count0 = 0, count1 = 0, count2 = 0, count0 = 0, count1 = 0, count2 = 0, count3 = 0, count4 = 0; count3 = 0, count4 = 0; intint count5 = 0, count6 = 0, count7 = 0, count5 = 0, count6 = 0, count7 = 0, count8 = 0, count9 = 0; count8 = 0, count9 = 0; printfprintf (“input two integer: “); (“input two integer: “); scanfscanf (“% (“%d%dd%d“, “, if (num1 num2) if (num1 num2) printfprintf (“input error!n“); (“input error!n“); exit (-1); exit (-1); for (n = num1; n = num2; n+)for (n = num1; n = num2; n+) s = n; s = n; do do r = s % 10; r = s % 10; switch ( r ) switch ( r ) case 0: count0+; break; case 0: count0+; break; case 1: count1+; break; case 1: count1+; break; case 2: count2+; break; case 2: count2+; break; case 3: count3+; break; case 3: count3+; break; case 4: count4+; break; case 4: count4+; break; case 5: count5+; break; case 5: count5+; break; case 6: count6+; break; case 6: count6+; break; case 7: count7+; break; case 7: count7+; break; case 8: count8+; break; case 8: count8+; break; case 9: count9+; break; case 9: count9+; break; s = s / 10; s = s / 10; while ( s != 0 ); while ( s != 0 ); /for/for printfprintf (“0 - %-4d 1 - %-4d 2 - %-4d 3 - %-4dn“, (“0 - %-4d 1 - %-4d 2 - %-4d 3 - %-4dn“, count0, count1, count2, count3); count0, count1, count2, count3); printfprintf (“4 - %-4d 5 - %-4d 6 - %-4d 7 - %-4dn“, (“4 - %-4d 5 - %-4d 6 - %-4d 7 - %-4dn“, count4, count5, count6, count7); count4, count5, count6, count7); printfprintf (“8 - %

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论