250 likes | 428 Views
第 6 章 循环控制. 本章教学重点 循环的概念 while 语句 for 语句 多重循环. 本章教学内容: 6 . 1 概述 6 . 2 goto 语句及用 goto 语句构成循环 6 . 3 用 while 语句实现循环 6 .4 用 do…while 语句实现循环 6.5 用 for 语句实现循环 6.6 循环的嵌套 6.7 几种循环的比较 6.8 break 语句和 continue 语句 6.9 程序举例. 6.1 概述. 循环是结构化程序设计的基本结构之一,有着非常重要的应用。 问题 1 :
E N D
第6章 循环控制 • 本章教学重点 • 循环的概念 • while语句 • for语句 • 多重循环 • 本章教学内容: • 6.1 概述 • 6.2goto语句及用goto语句构成循环 • 6.3 用while语句实现循环 • 6.4 用do…while语句实现循环 • 6.5 用for语句实现循环 • 6.6 循环的嵌套 • 6.7 几种循环的比较 • 6.8 break语句和continue语句 • 6.9 程序举例 计算机工程学院 伍俊明
6.1 概述 • 循环是结构化程序设计的基本结构之一,有着非常重要的应用。 • 问题1: • 问题2:计算班级80名同学C语言课程的平均成绩 计算机工程学院 伍俊明
6.2 goto语句及用goto语句实现循环 一、无条件转向语句——goto语句 • 形式: goto 语句标号; 二、标号语句 • 形式: 标号:语句; 三、说明 • goto语句常与if语句一起构成循环 • goto语句可从循环体内跳到循环体外,反之不行。 • goto语句因其破坏结构化原则,很少使用。 四、例6.1: 计算机工程学院 伍俊明
6.2 goto语句及用goto语句实现循环 • 例:编程计算 6!=1*2*3*4*5*6 /*文件名:jsjc.cpp*/ /*计算 6!=1*2*3*4*5*6*/ #include <stdio.h> void main() { int t=1, i=1; loop:t=t*i; i++; if (i<=6) goto loop; printf("%d!=%d\n", i-1, t); } 计算机工程学院 伍俊明
6.3 用while语句实现循环 • while语句的一般形式 while (表达式) 语句; • 称为内嵌语句或循环体,可以是基本语句、控制语句,必要时用复合语句 • 是循环重复执行的部分 • 一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 • 用来控制循环体是否执行 计算机工程学院 伍俊明
表达式? 假 真 内嵌语句 6.3 用while语句实现循环 • while语句的执行过程 循环控制条件 循环体 计算机工程学院 伍俊明
6.3 用while语句实现循环 • 例6.2 编程计算 sum=1+2+3+ … +100 • 思路:寻找加数(通项)与累加和sum的规律 • 一般累加和形式: sum = sum +通项; • 通项ai= i,不同题目差异较大 累加和——存于变量sum中 ,累加形式:sum=sum+i, 非通项部分作为sum初值,故 sum的初值设为1—初始化。 通项ai——加数i,通项ai=i从1变到100, 每循环一次,使i增1,直到i的值超过100。 i的初值设为1—初始化。 程序: 计算机工程学院 伍俊明
6.3 用while语句实现循环 • 说明: • while语句是循环语句,循环的初始化工作必须放在while语句之前完成,切不可放在循环体的开头 • while语句是“先判断、后执行”,如果条件一开始就不满足,循环体则一次都不执行; • while语句中的条件是循环执行的条件,即条件为假时循环就停止; • 循环体中至少有一条语句能够影响循环条件,防止产生死循环; • while语句适用于循环次数无法预知的情形。 • 一 计算机工程学院 伍俊明
循环体 假 真 表达式 6.4 用do…while语句实现循环 • do…while语句的一般形式 do 语句; while (表达式); • 执行过程: • 例6.3计算 • 程序: 计算机工程学院 伍俊明
6.4 用do…while语句实现循环 • 说明 • do…while语句能够实现循环控制,可与while语句等价转换; • do…while语句的循环初始化工作也必须安排在do…while语句之前,不可设置在循环体内; • do…while语句是“先执行、后判断”,所以,循环体至少执行一次,这与while语句不同。 • 循环体同样必须能够影响和控制循环条件,避免发生死循环。 • do…while语句适用于循环次数无法预知的情形。 计算机工程学院 伍俊明
(-1)i x(2i+1) x3 x5 x7 (2i+1)! 3! 5! 7! 6.4 用do…while语句实现循环 • 例编程利用台劳公式计算sinx,误差<10-6: x - + - + …… + sin(x) = #include <stdio.h> #include <math.h> void main() { int i; float s, t, x; printf(“x=”); scanf(“%f”, &x); i=1; s=x; t=x; do { t=t*(-1)*x*x/(2*i*(2*i+1)); s=s+t; i++; } while (fabs(t)>1e-6); printf(“sin(%f)=%f\n”, x, s) } 思路:连乘+累加 T0=x Ti=Ti-1* , i>0 Si =Si-1 +Ti 注意初始化与循环体的设置 (-1)* x2 2i*(2i+1) 计算机工程学院 伍俊明
6.5 用for语句实现循环 • for语句的一般形式 for (表达式1;表达式2;表达式3) 语句; • 执行过程 循环初始条件 循环控制条件 条件修正式 计算机工程学院 伍俊明
计算表达式1 表达式2 为真? 假 真 语句 计算表达式3 6.5 用for语句实现循环 • 执行过程 • 例:计算1+2+…+100 sum=0; for ( i=1; i<=100; i++) sum=sum+i; • for语句等价于下列语句: • 表达式1; • while (表达式2) • { 语句; • 表达式3; • } 计算机工程学院 伍俊明
6.5 用for语句实现循环 • 例:输入10个数,找出其中最大者和最小者 #include <stdio.h> void main( ) { int i, min, max, n; printf(“请输入10个整数:”); scanf(“%d”,&n); max=min=n; for (i=2; i<=10; i++) { scanf ("%d",&n); if (n<min) min=n; if (n>max) max=n; } printf(“最大数=%d,最小数=%d\n",max, min) ; } 计算机工程学院 伍俊明
6.5 用for语句实现循环 • 说明 • 表达式1中可以完成初始化工作,如果缺省,则初始化工作必须在for语句之前完成。 • 表达式2实际上是循环控制条件,应通过循环体或表达式3中必须能改变其值,防止出现死循环。如要实现无限循环,可以缺省。 • 表达式3常设置有影响循环条件的语句,如果缺省,必须在循环体中进行设置。 • for语句特别适用于可预知或事先计算出循环次数的情形 • 表达式1、表达式2和表达式3均可采用逗号表达式,实现较为复杂的功能。 计算机工程学院 伍俊明
6.5 用for语句实现循环 • for语句的应用方式 • for (; i<=100; i++) sum+=i; • for (i=1;; i++) sum+=i; • for (i=1; i<=100; ) {sum+=i; i++; } • for ( ; i<=100; ) {sum+=i; i++; } • for (sum=0, i=1; i<=100; i++) sum+=i; • For ( ; ; ) 语句; /*可能出现死循环*/ 计算机工程学院 伍俊明
6.6 循环的嵌套 • 循环嵌套:在一个循环语句的循环体中包含了其他的循环语句。内循环中还可以嵌套循环,构成多层循环。 • while语句、do…while语句、for语句可以相互嵌套。 • while语句、for语句嵌套其他循环语句: while (…) { … while (…) {…} … } while (…) { … for(…; …; …) {…} … } while (…) { … do while (…) {…} … } for (…; …; …) { … do while (…) {…} … } for (…; …; …) { … while (…) {…} … } for (…; …; …) { … for(…; …; …) {…} … } 计算机工程学院 伍俊明
6.6 循环的嵌套 • 循环嵌套应用举例 s=1!+2!+…+20! #include <stdio.h> void main() { int i, j; long sum, factor; for (sum=0, i=1; i<=20; i++) { factor=1; for (j=1; j<=i; j++) factor=factor*j; sum=sum+factor; } printf(“sum=%ld\n”, sum); } 计算机工程学院 伍俊明
6.8 break语句和continue语句 #include <stdio.h> void main(){int n,i;for(n=2; n<=100; n++){for(i=2; i<n; i++)if(n % i==0) break;if(i>=n) printf("\t%d", n);} /*for n*/} /*main*/ 计算机工程学院 伍俊明
6.8 break语句和continue语句 6.8.2 continue语句——循环的短路 • 形式 continue; • 功能:结束循环体的执行,直接进入下一轮循环 • 例6.5 输出100~200之间不能被3整除的数 #include <stdio.h> void main(){int n;for(n=100; n<=200; n++){if (n % 3 == 0)continue;printf(“%5d”, n);} /*for n*/} /*main*/ 计算机工程学院 伍俊明
6.9 程序举例 • 例6.6 计算π的值,要求误差小于10-6。 π/4≈1-1/3+1/5-1/7+… • 解题思路 • 累加和形式:pi=pi+通项 • 通项:(-1)i+1/(2*i-1)——正负相间! • 公式只计算了π/4,所得和需乘以4! • 程序: 计算机工程学院 伍俊明
6.9 程序举例 • 例6.7 求Fibonacci数列的前40项——迭代法 • F1=F2=1 • Fn=Fn-2+Fn-1,n≥2 • 解题思路 • 前两项直接赋值,以后各项为前两项之和 • 一行输出4个数 if (个数 % 4 == 0) printf(“\n”); • 程序: 计算机工程学院 伍俊明
6.9 程序举例 • 例6.10 字母加密:输入 一行明文,输出其密文。 • 密码方案:A变成E,a变成e,以后每个字母变成其后的第4个字母,但W、X、Y、Z分别变成A、B、C、D,w、x、y、z、分别变成a、b、c、d • 解题思路 • 对于明文字母c:‘A’~‘Z’以及‘a’~‘z’,将其ASCII码加4 • 加4后若ASCII码在‘Z’~‘Z’+4以及‘z’~‘z’+4之间,将c减去26 • 程序 计算机工程学院 伍俊明
6.9 程序举例 • 例:输出几何图形 ABCDEFGHIJKLM*NOPQRSTUVWXYZ BCDEFGHIJKLM*NOPQRSTUVWXY CDEFGHIJKLM*NOPQRSTUVWX DEFGHIJKLM*NOPQRSTUVW EFGHIJKLM*NOPQRSTUV FGHIJKLM*NOPQRSTU GHIJKLM*NOPQRST HIJKLM*NOPQRS IJKLM*NOPQR JKLM*NOPQ KLM*NOP LM*NO M*N * #include <stdio.h> void main(){char c; int i; for(i=0;i<13;i++) { for(c=i; c<13; c++) printf(“%c”, c+65); /*每行左半部分*/ printf(“*”); /*中间的星号*/ for(; c<26-i; c++) printf(“%c”, c+65); /*每行右半部分*/ printf(“\n”); /*一行结束后换行*/ } /*for i*/ printf(“*\n”); /*最后一行星号*/} • 解题思路 • 英文字母共26个,图形中字母共26/2行 • 第i行: • 左边从第i个字母开始一直到M • 中间一个* • 右边从N到27-i个字母 计算机工程学院 伍俊明
第6章 循环控制 • 作业(P129) • 6.1 • 6.5 • 6.6(上机) • 6.7 • 6.8(上机) • 6.11 • 6.14(上机) 计算机工程学院 伍俊明