C语言新教材PPT课堂课件-第6章循环结构程序设计

上传人:cn****1 文档编号:568223950 上传时间:2024-07-23 格式:PDF 页数:90 大小:665.34KB
返回 下载 相关 举报
C语言新教材PPT课堂课件-第6章循环结构程序设计_第1页
第1页 / 共90页
C语言新教材PPT课堂课件-第6章循环结构程序设计_第2页
第2页 / 共90页
C语言新教材PPT课堂课件-第6章循环结构程序设计_第3页
第3页 / 共90页
C语言新教材PPT课堂课件-第6章循环结构程序设计_第4页
第4页 / 共90页
C语言新教材PPT课堂课件-第6章循环结构程序设计_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《C语言新教材PPT课堂课件-第6章循环结构程序设计》由会员分享,可在线阅读,更多相关《C语言新教材PPT课堂课件-第6章循环结构程序设计(90页珍藏版)》请在金锄头文库上搜索。

1、第第第第 六六六六 章章章章 循循循循 环环环环 结结结结 构构构构 程程程程 序序序序 设设设设 计计计计6.1 6.1 6.1 6.1 概概概概述述述述 前面已介绍了顺序结构,选择结构,本章介绍循环结构。如: sum=1+2+3+100;实际问题: 一组重复执行的语句。则用循环结构解决。C语言用四种形式循环2. do-while 语句 3. For 语句4. break、continue和goto语句1. While 语句 6 6. .2 2 w wh hi il le e6 6. .2 2 w wh hi il le e语语语语 句句句句 while语句在C语言中用得比较多,它是通过判断

2、循环控制条件是否满足来决定是否继续循环,又称“当型”循环 。1.形式: while (表达式)循环体语句2. 执行过程: 先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。专门的当型循环语句while语句3. 流程图:表达式语句0=0下一语句将上述例子用while语句写出 while (i=100) sum+ =i; i+; 语句中应有使表达式=0的语句。 否则会出现无限循环死循环。注: while后面的语句一般为复合语句, 即:加 我们来看下面的例子例6.1 写一个程序,输入一个班学生的成绩,求全班的平均成绩。分析:输入成绩、计算平均成绩都是一个重复性过程,因此可以用循环语

3、句来实现。在这里,我们并不知有多少个学生,也就是说不知循环到底有多少次,但考虑到成绩没有负数,这样就可以把循环条件定为:每当输入的分数大于等于0时就继续输入成绩;输入的分数小于0时就停止输入。解题步骤如下:(1)输入一个分数(2)当“分数=0”时,做下列工作:累计总分;人数加一;输入下一分数;(3)重复第(2)步,直到“分数0”。程序:#include main() float score, average=0;/*average存放平均成绩,初值为0*/int n=0;/*n用来存放学生数,初值为0*/scanf(%f,&score);/*输入第一个学生的分数*/while(score=0)

4、 average+=score;/*average先用来放总分*/n+;/*学生数增一*/scanf(%f,&score); /*输入下一个学生的分数*/ if (n!=0) average=average/n;/*求平均成绩,average*/printf(%6.2f,average);/*输出平均成绩average,保留两位小数*/在使用while语句的时候,我们要注意以下两个问题:(1)循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句的形式出现。如果不加花括号,则while语句的范围只到while后面的第一个分号处。比如上例中,while语句中如无花括号,则while语句范围

5、只到“average+=score;”。(2)在循环体中应有使循环趋向于结束的语句。比如上例中,循环结束的条件是“score=0”,那么当我们把这个班的成绩全部输入完后,一定要输入一个负数,才能使程序往下执行。(3)循环体语句有可能一次也不执行。比如说上例中,当第一次输入的分数就为负数时,则循环体一次也不执行。6.3 do 6.3 do 6.3 do 6.3 do whilewhilewhilewhile语语语语句句句句do-while语句的特点是:先执行循环体中的语句,再通过判断表达式的值来决定是否继续循环,循环条件的测试是在循环的尾部进行的。它是一种专门的“ 直到型” 循环语句。它的一般形

6、式为: do循环体语句while(表达式);语句表达式0=03. 流程:对于例6.1用do-while语句编写程序如下:#include main() float score,average=0;int n=0;do /*不进行判断,先进入循环*/ scanf(%f,&score);/*输入学生的分数*/ if (score=0) average+=score; n+;while (score=0);/*表达式为非0,则继续*/if(n!=0) average/=n; /*求平均成绩,average*/printf(%6.2f,average);/*输出平均成绩average,保留两位小数*/

7、例6.2 编程序求1+3+5+7+9+这样的数之和。如果累加数大于750时, 则程序终止并输出结果。main() int i=1,sum=0; while(sum=750) sum=sum+i; i=i+2; printf(n%d,sum);例6.3 用do-while语句求1至1000之间满足“用3除余2,用5除余3,用7除余2”的数,且一行只打印五个数。分析:判断一个数被另一个数除,用取模运算%。三个条件是“与”的关系。一行打印五个数,可以通过计数到5再回车换行。程序代码如下:#include main()int i=1,j=0;doif (i%3=2&i%5=3&i%7=2)printf

8、(%4d,i); j=j+1;if(j%5=0) printf(n);i=i+1;while(i1000);注意:1、do-while语句的循环体语句至少要被执行一次,因为它是进入循环后再判别表达式。而while语句却是首先判别表达式,如果表达式值为0,则一次循环也不执行。2、循环控制变量必须在循环体内有所改变,才能使while和do-while语句的循环控制条件表达式的值不断改变,直至循环结束。否则会造成死循环。例如:i=1;while(i=100) putchar(*);i+;这个循环永远不会结束,因为“i+;”语句不属于循环体中的语句,循环控制变量i没有在循环体内被改变。程序应该作如下改

9、变:i=1;while(i=100) putchar(*); i+; 这条循环语句执行的结果是输出100个“*”。还可以将它改成do-while语句:i=1;doputchar(*);i+; while(i=100);大家可以看到,对于同一个问题,既可以用while语句处理,也可以用do-while语句处理。那么,它们到底有什么区别呢?while语句与dowhile语句的区别: 当第一次执行时,若表达式=0时,则while语句与do while有所不同,do while 执行一次后面的语句,而while不执行。6.3 for6.3 for6.3 for6.3 for语语语语句句句句1. 一般形

10、式 首先计算表达式1,接着执行表达式2,若表达式2的值0,则执行语句,接着计算表达式3,再判断表达式2的值.依此重复下去,直到表达式2的值=0(假)。for语句是C语言中最有特色的循环语句,使用最为灵活方便。for(表达式1; 表达式2; 表达式3)循环体语句2. 流程:计算表达式1求表达式2值语句计算表达式3=0(假)0(真)2.执行过程(1)先求解表达式1。(2)求解表达式2,若其值为真(值非0),则执行for语句中指定的循环体语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步继续执行。(5)循环结束,执行for语句下面

11、的一个语句。用for语句写出上述例子for用while代替的流程 表达式1; while(表达式2) 语句 表达式3; for ( i=1; i=100; i+) sum+=i;for语句完全可以用while代替,但for直观、简单、方便for语句中的各表达式含义(1)表达式1:初值表达式,用于在循环开始前,为循环变量设置初始值。(2) 表达式2:循环控制逻辑表达式,它控制循环执行的条件,决定循环次数。(3)表达式3:循环控制变量修改表达式,定义了循环一次,循环控制变量的变化情况。注意:表达式1,表达式2,表达式3必须用分号隔开只要条件为真,for循环就一直执行,一旦条件变为假,程序就从紧跟在

12、for循环后面的语句重新开始执行。循环体语句:被重复执行的语句。下面通过一个例子来看for语句的执行过程。例6.4 在屏幕上打印1到100的数字。当然解决这个问题我们可以用100个printf语句实现,但当要打印的数字量很大时,采用这种方式显然是不合适的,我们可以用for循环语句来实现。程序如下:#include main()int x;for (x=1;x=100;x+) printf(%d,x);在这个程序中,x经初始化置为1,因为x小于100,调用printf语句x+1,并且测试x,看其是否仍然小于或等于100。重复进行这个过程,直到x大于100,循环结束。在这个例子中,x是循环控制变量

13、:循环每重复一次x发生变化 ,并对x进行检查。例6.5 写程序计算s=1+2+3+100分析:此题可用循环语句来编写程序,循环控制变量i从1增加到100。设s的初值为0,则循环体为:s=s+i; /*i=l,2,,100*/程序:#include main() int s0, i;for(il; i100; i+) s=s+i;/*循环体语句*/printf(s%d, s); 上面程序中,for语句的执行过程为:计算表达式1“il;”,得到循环控制变量的初值;求解表达式2,若表达式2的值为零(当x100),则结束for循环;执行循环体语句“ss+i;”;求解表达式3,“i+;”,然后转向步骤。

14、对于for循环,有一点非常重要,即条件测试永远是在循环开始时进行,如果在循环开始时条件为假,那么循环体语句就不会被执行。如:int i=10;for (k=10;k!=i;k+) printf(%d,k);printf(%d,k);在这个循环程序段中,循环开始时,由于i=k,所以根本不会执行,正是由于条件表达式取值为假,循环体语句和循环的增量部分都不执行,因此,k一直为10,最后屏幕上输出的数字也是10。例6.6 写程序计算s=1-3+5-7-99+101。这个例子也可看成是数的累加,但与上面的例子稍有差别,就是相加的数一个为正数,一个为负数。程序代码如下:#include main()int

15、 i,t=1,s=0;for (i=1;i=101;i+=2) t=t*i;s=s+t;t=(-t); /*正1,负1交叉*/printf(%dn,s); for语句与while语句的比较for语句等价于下列语句序列:表表达达式式1;while(表表达达式式2) 语语句句;表表达达式式3;相比之下,for语句显得结构整齐、紧凑、清晰。 for语语句句的的变变形形1.表达式的省略如果在for语句之前给循环变量赋了初值,则表达式1可以省略,但其后的分号不可省略。对于例5.2,其循环语句可以写成如下形式:i=1; /*在for语句之前给循环变量赋初值*/for( ; i100; i+)s=s+i;如

16、果省略表达式3,则应在for语句的循环体内修改循环控制变量。例如:for(i1;i100; )ss+i; i+;/*修改循环控制变量*/如果表达式1和表达式3都省略,则for语句就相当于while语句。例如:il;/*for语句之前给循环变量赋初值*/for(; i100 ; )ss+i;i+;/*修改循环控制变量*/就相当于:i=1;while(i100) break ;/*如果i100,则退出循环*/2. for语句中的逗号表达式逗号运算符的主要应用就是在for语句中。for语句中的表达式l和表达式3可以是逗号表达式,特别是在有两个循环变量参与对循环控制的情况下。若表达式1和表达式3为逗号

17、表达式,将使程序显得非常清晰。例如:#include main() int i,j;for(i1,j10;ij; i+,j-) printf(i=%d,j=%dn,i,j); 运行结果是:i1,jl0i2,j9i3,j8i4,j7i5,j6以上程序中,i和j都是循环控制变量,for语句的表达式l是逗号表达式,它为两个循环变量赋初值:il,j10;表达式3也是逗号表达式,它们的作用是修正两个循环控制变量的值:i+,j-。3. 循环体为空语句C语言的句法允许一个语句为空,这就意味着上述类型的for 循环(或其它循环)的循环体也可以为空。对for语句,循环体为空语句的一般形式为:for(表达式1;表

18、达式2;表达式3);例如:求s1+2+3+100可以用如下循环语句完成:for(sum0,i1; i100) break; /*如果i100,则退出循环*/ printf(s%d,s); 在本程序执行中,当i100时,强行终止for循环,继续执行for语句的下一条语句printf(s=%d,s); 再比如: main() int i;for (i=0;i100;i+) printf(%d,i);if (i=10) break; 这段程序将在屏幕上显示010的数字。虽然循环条件是i=0)sum+=x; else break;/*输入负数,循环结束*/ printf(sum=%101d,sum);

19、在一个switch()语句中使用break,只会影响switch,而不会影响它所在的循环。另外,一个break只能跳出最内层的循环。例如:for(i=0;i100;i+)count=1;for( ; ; )printf(%d,count);count+;if (count=10) break;这个程序将在屏幕上显示数字1到10共100次,每当编译程序碰到break语句,控制就回到for循环的外层。continue语句continue语句的形式为:continue;continue语句被称为继续语句。该语句的功能是使本次循环提前结束,即跳过循环体中continue语句后面尚未执行的循环体语句,继

20、续进行下一次循环的条件判别。例6.9 输出100以内能被9整除的数。 #include main()int n;for(n=9;n=100;n+)if (n%9!=0) continue;printf(%d,n); 在本例中,对9100的每一个数进行测试,如该数不能被9整除,即模运算不为0,则由continue语句转去下一次循环,只有模运算为0时,才能执行后面的printf语句,输出能被9整除的数。例6.10 显示输入的字符,如果按的是Esc键,则退出循环;如果按的是Enter键,则不做任何处理,继续输入下一个字符。#include conio.hmain() char ch; for (;)

21、ch=getch();*字符输入函数*/ if (ch= =27) break; /*Esc键的ASCII码为27*/ if (ch= =13) continue; /*按的是Enter键,跳过字符输出语句*/ putch(ch);/*显示输入的字符*/ getch();/*让程序停一下,按任意键继续*/ 说明:getch()和putch()的作用与getchar()和putchar()相似。不同的是:(1)getch()不显示键盘输入的字符。(2)getchar()输入字符时,要按Enter键,计算机才会响应。而用getch()时,输入字符不需要回车。goto语句goto语句被称为无条件转移

22、语句.它的一般形式为:goto标标号号;执行goto语句使流程转移到相应标号所在的语句,并从该语句继续执行。语句标号用标识符表示,即以字母或下划线开头,由字母、数字和下划线组成。标号语句的形式是:标标号号:语语句句下面我们用goto语句来实现求平均成绩的任务。#includestdio.hmain() float score, average=0;int n=0;scanf(%f,&score);/*输入第一个学生的分数*/if (score=0)/*表示式为非0,转移到loop标号处*/ goto loop;average=average/n;/*求平均成绩average*/end: pri

23、ntf(%6.2f,average);/*输出平均成绩average,保留两位小数*/if (score=0)/*表示式为非0,转移到loop标号处*/ goto loop;average=average/n;/*求平均成绩average*/end: printf(%6.2f,average); /*输出平均成绩average,保留两位小数*/goto语句只能使流程在函数内转移,不得转移到该函数外。break语句只能终止循环层,需要从多重循环的内层一下转移到最外层时,可以使用goto语句。从上面使用goto语句进行循环的程序可以看出,goto语句使程序的结构性和可读性都变差,要尽量避免使用go

24、to语句。 6.56.5 循循循循环环环环的的的的嵌嵌嵌嵌套套套套在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环体称为内循环,外面的循环体称为外循环。如果内循环体中又有嵌套的循环语句,则构成多重循环。While、do-while、for三种循环都可以互相嵌套。例6.11 输出nn个字符*。分析:(1)n行*的输出,可用下列循环控制:for (i=1; i=n;i+)(2)每行n个*的输出,可用下列循环语句实现:for (j=1; j=n;j+)putchar(*);putchar(n);所以输出n*n行“*”可用双重循环语句实现如下: for(i=1,

25、i=n;i+) for (j=1;j=n;j+)putchar(*);/*输出一行*/ putchar(n);/*换行*/ 这是循环控制变量之间没有依赖关系的多重循环。许多情况下,内循环的循环控制变量的初值或终值依赖于外循环控制变量 例6.12编写程序输出如下图形。* * * * * * * * * * *分析:用循环控制变量i(1i5)控制输出行,for(i=1, i=5,i+)(2)每行上的*个数是随着行控制变量i的值变化而变化的。i=1时,执行1次putchar(*);i=2时,执行2次putchar(*);i=5时,执行5次putchar(*);输出第i行时执行i次“putchar(*

26、);”,所以内循环体语句应如下:for(j=1,j=i;j+)putchar(*);/*输出一行*/输出该图形的完整的二重循环结构如下: for (i=1;i=5;i+) for (j=1;j=i;j+)putchar(*);/*输出第i行*/ putchar(n);以上两个例子都是两重for循环嵌套。另外,三种循环语句也可以互相嵌套。例如:(1) while() for(;) (2) do while() while();循环嵌套的程序中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。如图6.5所图6.5 循环交叉为非法结构在do-while循环体内开始whil

27、e()循环,但是do-while循环结束在while()循环体内,它们互相交叉,这是非法结构。图6.5 循环交叉为非法结构do while (); while(); 6.66.6程程程程序序序序举举举举例例例例实际问题是复杂的,解决实际问题的程序需要多种结构复合。复合结构指的是在循环体包含选择结构,或在选择结构中含有循环结构,含有复合结构的程序称为复合结构程序。复合结构程序必须做到嵌套层次清楚,嵌套层次之间不能相互交叉。例6.13 下面的程序计算100至1000之间有多少个数其各位数字之和是5。程序:#include main()int i,s,k,count=0;for(i=100;i0)/

28、*循环结构*/switch(score/10)/*循环体嵌套选择结构*/case 10:case 9: printf(%d:An, score); break;case 8: case 7: printf(%d:Bn,score); break;case 6: printf(%d:Cn,score); break;default: printf(%d:Dn,score);scanf(%d,&score); /*输入下一个学生的成绩*/ 例6.15 找出31000中的全部素数。分析:(1)素数是除1和它本身之外不能被任何个整数所整除的自然数(1除外)。如2,3,5,7是素数。1,4,6,8,10

29、不是素数。(2)判断某数i是否为素数的一个简单办法是用2,3,4,i-1这些数据逐个去除i,只要被其中的一个数整除了,则i就不是素数。数学上已证明,对于自然数i只需用2,3,4,i1/2测试。(3)外层循环控制。for(i3; i1000; i+)(4)用j2,i1/2测试i。如果i能被这些数中的某一个整除,i就不是素数;否则i就是素数。测试过程如下:flag0; /*设标志*/; for(j2;j=sqrt(i);j+) if(i%j=0) /*被j整除,i不是素数*/ flag1; break;/*标志设为1,停止测试*/*内循环*/程序流程图如图5.6。图5.6 例5.15 程序流程图#

30、include main() unsigned int i, j, count, flag;/*用flag作标志*/count=0;/*计数器清0*/for(i3; i1000 ; i+)flag0;for(j2;jsqrt(i); j+)if(i%j0) /*能整除,不是素数,标志设为1*/flagl; break; /*内循环结束*/if(flag0) /*若flag为0,i是素数*/ printf(%4d, i); count+;if(count%80)printf(n); /*每行输出8个素数*/*外循环*/)例6.16 用公式,求的近似值,直到最后一项的绝对值小于10-6为止。图6.

31、7 例6.16程序流程图图6.7 例5.16程序流程图图6.7 例6.16程序流程图分析:这是一个累加求和问题,显然可用循环语句来实现。在这里由于循环的次数首先并不确定,所以我们可以用while循环语句。定义变量pi存放结果。最初pi0;定义变量t存放当前项。最初t1;循环控制:while(fabs(t)1e-6)循环累加:pi=pi+t;t由分子和分母两部分组成。分子用f表示,f的初值为1,每次符号交替f=-f;分母用v表示,初值为1,每次v的值增加2。即v+=2。程序流程图如图6.7所示 图6.7 例6.16程序流程图程序代码:#include void main()int f1;floa

32、t pi0, t1, v1; while(fabs(t)1e-6)pipi+t;v+2;/*准备下一个累加的数据*/f-f;tf/v; pi*=4;printf(n pi=%10.8f, pi);例6.17 电文加密问题。已知电文加密规律为:将字母变成其后面的第4个字母,其他字符保持不变。例如,ae,AE,WA。编写一个程序,输入行字符,要求转换成加密电文输出。分析:输入字符ch,如果ch是字母,则进行加密处理ch+4;判断加密后ch是否超出字母的范围,如果超过,则ch-26;循环控制条件:ch!n。程序流程图如图6.8所示。 图6.8 例6.17程序流程图程序:#include void main()char ch;while(chgetchar()!n) if(cha& chA & chZ&chz) /* ch在加密后越界*/ch-26; printf(%c, ch); /*输出电文*/运行时,输入:student123输出结果:wxyhirx123

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号