Chapter06循环结构.ppt_第1页
Chapter06循环结构.ppt_第2页
Chapter06循环结构.ppt_第3页
Chapter06循环结构.ppt_第4页
Chapter06循环结构.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第6章 循环控制,6.1 循环结构的程序设计,1. while语句,一般形式:,while (表达式) 循环体语句;,执行流程:,其中: while后面的括号( )不能省。 while后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。 表达式的值是是循环的控制条件。 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。,特点:先判断表达式,再执行循环体,【例】 用while语句求1100的累计和。,#include int main ( ) int i = 1, sum = 0; while ( i = 100 ) sum += i; i+; printf (“sum = %dn“, sum); ,循环初值,循环终值,循环条件,循环体,循环变量增值,运行结果: sum = 5050,(1) 如果while后的表达式的值一开始就为假,循环体将一次也不执行。 (2) 循环体中的语句可为任意类型的C语句。 (3) 遇到下列情况,退出while循环: 表达式为假(为0)。 循环体内遇到break、return或goto语句(break和goto语句将在随后介绍)。,while语句注意事项:,int a = 0, b = 0; while (a 0) /a 0为假,b+不可能执行 b+;,int num = 0; /字符计数 while ( 1 ) if (getchar( ) = n) /如果输入的字符是回车符,则返回 return; num+; ,(4) 在执行while语句之前,循环控制变量必须初始化,否则执行的结果将是不可预知的。 (5) 要在while语句的某处(表达式或循环体内)改变循环控制变量,否则极易构成死循环。 (6) 允许while语句的循环体又是while语句,从而形成双重循环。,while语句注意事项:,例:计算10! #include int main ( ) int i; / i应赋初始值10 long s = 1; while (i = 1) s *= i-; printf (“10! = %ldn“, s); ,i = 1; while (i 100) /死循环,因为i的值没变化,永远小于100 sum += i; printf (“sum = %dn“, sum);,i = 1; while (i = 9) j = 1; while (j = 9) printf (“%d * %d = %dn“, i, j, i * j); j+; i+; ,2. do_while语句,一般形式:,do 循环体语句; while(表达式);,执行流程:,其中: while后面的括号( )不能省。 while最后面的分号;不能省。 while后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。 表达式的值是是循环的控制条件。 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。,特点:先执行循环体,再判断表达式,【例】 用do_while语句求1100的累计和。,#include int main ( ) int i = 1, sum = 0; do sum += i; i+; while ( i = 100 ); printf (“sum = %dn“, sum); ,运行结果: sum = 5050,do_while语句注意事项:,int a = 0, b = 0; do b+; while (a 0) ;,(1) 如果do-while后的表达式的值一开始就为假,循环体还是要执行一次。 (2)在if语句、while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号,否则将产生语法错误。 (3) 循环体中的语句可为任意类型的C语句。 (4) 和while语句一样,在使用do-while语句时,不要忘记初始化循环控制变量,否则执行的结果将是不可预知的。 (5) 要在do-while语句的某处(表达式或循环体内)改变循环控制变量的值,否则极易构成死循环。 (6) do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。,3. for语句,一般形式:,for (表达式1;表达式2;表达式3) 循环体语句;,执行流程:,其中: for后面的括号( )不能省。 表达式1:一般为赋值表达式,给控制变量赋初值。 表达式2:关系表达式或逻辑表达式,循环控制条件。 表达式3:一般为赋值表达式,给控制变量增量或减量。 表达式之间用分号分隔。 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。,for语句很好地体现了正确表达循环结构应注意的三个问题: 控制变量的初始化。 循环的条件。 循环控制变量的更新。,【例】 用for语句求1100的累计和。,#include int main ( ) int i , sum = 0; for (i = 1; i = 100; i+) sum += i; printf (“sum = %dn“, sum); ,运行结果: sum = 5050,for语句注意事项:,例:计算1*2+3*4+5*6+99*100。 int i, j; long sum = 0; for ( i =1, j = 2; i = 99; i = i + 2, j = j + 2 ) sum += i *j; printf (“sum = %ldn“, sum);,(1) 表达式1、表达式2、和表达式3可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。,逗号表达式,逗号表达式,#include int main ( ) int i, sum = 0; i = 1; for ( ; i = 100; i+) sum += i; printf(“sum = %dn“, sum); ,#include int main ( ) int i, sum = 0; i = 1; for ( ; i = 100; ) sum += i+; printf(“sum = %dn“, sum); ,for语句注意事项:,省掉表达式1,3,省掉表达式1,(2) 表达式1、表达式2、和表达式3都是任选项,可以省掉其中的一个、两个或全部,但其用于间隔的分号是一个也不能省的。,#include int main ( ) int i, sum = 0; i = 1; for ( ; ; ) if (i 100) break; sum += i+; printf(“sum = %dn“, sum); ,省掉表达式1,2,3,for语句注意事项:,for (a = 1; ; a+) printf (“,(3) 表达式2如果为空则相当于表达式2的值是真 。,死循环!,(4) 循环体中的语句可为任意类型的C语句。 (5) for语句也可以组成多重循环,而且也可以和while语句和do-while语句相互嵌套。 (6) 循环体可以是空语句。,例:计算用户输入的字符数(当输入是回车符时统计结束)。 #include int 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( ); . ,嵌套循环的跳转 禁止: 从外层跳入内层 跳入同层的另一循环 向上跳转,4. 循环嵌套,【例】循环嵌套,输出九九表,#include int main ( ) int i, j; for (i = 1; i 10; i+) printf (“%4d“, i); printf (“n-n“); for (i = 1; i 10; i+) for (j = 1; j 10; j+) printf(j=9) ? “%4dn“ : “%4d“, i * j); ,for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?“%4dn“:“%4d“,i*j);,5. break与continue语句,break语句 功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明: (1) break不能用于循环语句和switch语句之外的任何其它语句之中。 (2) break只能终止并跳出最近一层的结构。,while (表达式1) if (表达式2) break; 语句,do if (表达式2) break; while (表达式1); 语句,for (; 表达式1; ) if (表达式2) break; 语句,【例】 将用户输入的小写字母转换成大写字母,直到输入非小写字母字符。,#include int main ( ) char c; while ( 1 ) c = getchar ( ); /读取一个字符 if ( c = a /循环退出 ,运行结果: howareyou HOWAREYOU,方法:通过设置一标志变量tag,然后在每层循环后加上一条语句:if (tag) break; 其值为1表示跳出循环体,为0则不跳出。,for () while () if () break; while循环后的第一条语句 ,int tag = 0; for () while () if () tag = 1; break; if ( tag ) break; for循环后的第一条语句,多重循环中,break的使用,问:在嵌套循环的情况下,如何让break语句跳出最外层的的循环体?,continue语句 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。 说明: (1) 仅用于循环语句中。 (2) 在嵌套循环的情况下,continue语句只对包含它的最内层的循环体语句起作用。,for () while () if () continue; while循环后的第一条语句 ,6.2 循环结构类型的选择及转换,1. 循环结构类型的选择原则,如果循环次数在执行循环体之前就已确定,一般用for循环;如果循环次数是由循环体的执行情况确定的,一般用while循环或者do-while循环。 当循环体至少执行一次时,用do-while循环,反之,如果循环体可能一次也不执行,选用while循环。,2. 循环结构类型之间的相互转换,尽管上面对于循环结构的选择给出了原则性指导意见,但是我们应注意到其实这三种循环结构彼此之间可以相互转换,象前面我们分别用while循环、do-while循环、for循环来求1100的累计和的例子就说明了这一点。,【例】求1100之间的所有素数,问题分析: 素数是指除了能被1和它本身整除外,不能被其它任何整数整除的数。例如,17就是一个素数,除了1和17之外,它不能被216之间的任何整数整除。根据素数的这个定义,可得到判断素数的方法: 把m作为被除数,把i = 2 (m-1)依次作为除数,判断被除数m与除数i相除的结果,若都除不尽,即余数都不为0,则说明m是素数,反之,只要有一次能除尽(余数为0),则说明m存在一个1和它本身以外的另一个因子,它不是素数。 事实上,根本用不着除那么多次,用数学的方法可以证明:只需用2 之间(取整数)数去除m,即可得到正确的判定结果。,这一思路的算法如下: 从键盘输入一正整数m。 计算k = i从2变化到k,依次检查m % i是否为0。 若m % i为0,则判定m不是素数,并终止对其余i值的检验;否则,令i = i + 1;并继续对其余i值进行检验,直到全部检验完毕为止,这时判定m是素数。,【例】利用下面的公式求的近似值,要求累加到最后一项小于10-6为止。,问题分析: 这是一个累加求和的问题,但这里的循环次数是预先未知的,而且累加项以正负交替的规律出现,如何解决这类问题呢? 在本例中,累加项的构成规律可用寻找累加项通式的方法得到,具体表示为t = s / n;即累加项由分子和分母两部分组成,分子s按+1,-1,+1,-1,交替变化,可用赋值语句s = -s;实现,s的初始值取为1,分母n按1,3,5,7,变化,用n = n +2;语句实现即可,n的初始值取为1.0。,#include #include int main ( ) int s = 1; float n = 1.0, t = 1, pi = 0; while (fabs(t) = 1e-6) pi += t; n += 2; s = -s; t = s / n; pi *= 4; printf (“pi = %.6fn“, pi); ,【例】打印大小可变的菱形图案(下面菱形的大小是7)。, ,问题分析: 菱形的大小size其实就是中间行中*号的个数,也是整个菱形的行数,其值必须是奇数。 问题的关键之一是如何确定每行中*号的个数。经过分析得知:当行数i(假设最上面的一行为第1行) (size+1)/2时,该行上的*号个数为n = 2*i-1,否则n = 2*( size-i+1)-1。 问题的关键之二是如何确定每行显示的第一个*号的位置,也就是显示第一个*号之前应显示多少个空格。经过分析得知:每行应显示的空格数为m = (size - n) / 2个。,int main() int i, j, k, m, n, size; printf (“input size

温馨提示

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

评论

0/150

提交评论