




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计教程,第五章 循环结构,5.1 while语句 5.2 do-while语句 5.3 for 语句 5.4 break、continue语句 5.5 循环的嵌套 5.6 复合结构程序举例,2,求1100的累计和。 根据已有的知识,可以用“1+2+100”来求解,但显然很繁琐。现在换个思路来考虑: 首先设置一个累计器sum,其初值为0,利用sum += n来计算(n依次取1、2、100),只要解决以下3个问题即可: (1)将n的初值置为1; (2)每执行1次“sum += n”后,n增1; (3)当n增到101时,停止计算。此时,sum的值就是1100的累计和。 根据已有的知识,单
2、独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),C语言提供了3条循环语句来实现,以简化、并规范循环结构程序设计。,3,在语言中,可用以下语句实现循环: (1)用while语句。 (2)用do-while语句。 (3)用for语句。 (4)用goto语句和if语句构成循环。 功能为:使系统转向标号所在的语句行执行。 goto语句格式:goto 标号; 语句标号格式:标号: 语句行 标号命名遵循标识符命名规则。,4,案例5.1使用goto语句实现求解1100累计和的程序 main() int n=1, sum=0; loop: sum += n; n+; if (n=1
3、00) goto loop; printf(“sum=%dn”, sum); 其中“loop:”为语句标号 注意:结构化程序设计方法,主张限制使用goto语句。因为滥用goto语句,将会导致程序结构无规律、可读性差。,5,5.1 while语句,while 语句是通过判断循环控制条件是否满足来决定是否继续循环的语句。 1.一般格式 while(循环继续条件) 循环体语句组; 2.执行过程 执行过程如图所示。 1)求解“循环继续条件”表达式。如果其值为非0,转2);否则转3)。 2)执行循环体语句组,然后转1)。 3)执行while语句的下一条。 如果表达式的值一开始就为0,则语句一次也会被不执
4、行。,6,案例5.2 用while语句求1100的累计和。main() int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/ while( i=100 ) sum += i;/*实现累加*/ i+;/*循环控制变量i增1*/ printf(“sum=%dn”,sum); 程序运行情况如下:sum=5050 从此例中可以看出: 1循环体中若包含一个以上的语句,用括起来形成复合语句;,7,2循环体中不能有死循环,所以循环控制变量值在循环体内必须有所改变,即循环体中必须有循环趋于结束的语句。,例如: i=1; while (i=100) putchar(*); i+;,这个循环永
5、远不会结束,因为循环控制变量i没有在循环体内被改变,i+; 不属于循环语句,i+应该在循环体内改变:,i=1; while (i=100) putchar(*); i+; ,8,案例5.3编程提示用户输入一系列整数,以0为结束标志,统计正、负数个数 void main( ) int a, m, n; m=0;n=0; printf(“Input integer numbers:n”); scanf(“%d”, ,9,5.2 dowhile语句,1一般格式 do 循环体语句组; while(循环继续条件);/*本行的分号不能缺省*/ 当循环体语句组仅由一条语句构成时, 可以不使用复合语句形式。
6、2执行过程 (1)执行循环体语句组。 (2)计算“循环继续条件”表达式。如果“循环继续条件”表达式的值为非 0(真),则转向(1)继续执行;否则,转向(3)。 (3)执行do-while的下一条语句。 do-while循环语句的特点是:先执行循环体语句组,然后再判断循环条件。如果表达式的值一开始就为0,也会执行一次语句。,10,案例5.4 用do-while语句求解1100的累计和。main() int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器*/ do sum += i; /*累加*/ i+; while(i=100);/*循环继续条件:i=100*/ printf(
7、“sum=%dn”,sum); do-while语句比较适用于处理:不论条件是否成立,先执行1次循环体语句组的情况。除此之外,do-while语句能实现的,for语句也能实现,而且更简洁。,11,void main() float p=1; int n; scanf(“%d”, 运行:1 3628800 11 11,void main() float p=1; int n; scanf(“%d”, 运行:1 3628800 11 1,3.do-while和while的比较 案例5.5 do-while和while的比较,while先判断后执行,循环体有可能一次也不执行 do-while先执行后
8、判断,循环体至少被执行一次,12,5.3 for语句,在3条循环语句中,for语句最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况。 1for语句的一般格式 for(表达式1;表达式2;表达式3) 循环体语句组; for(变量赋初值;循环继续条件;循环变量增值) 循环体语句组; 2for语句的执行过程 (1)求解“变量赋初值”表达式。 (2)求解“循环继续条件”表达式。如果其值 非0,执行(3);否则,转至(4)。 (3)执行循环体语句组,并求解“循环变量增 值”表达式,然后转向(2)。 (4)执行for语句的下一条语句。,13,案例5.6 求1
9、100的累计和。main() int i,sum=0; /*将累加器sum初始化为0*/ for(i=1; i=100; i+) sum += i;/*实现累加*/ printf(sum=%dn,sum); 程序运行情况如下: sum=5050,14,案例5.7 求n的阶乘n!(n!=1*2*n)。/main() int i, n; long fact=1; /*将累乘器fact初始化为1*/ printf(“Input n: ”); scanf(“%d”, 程序运行情况如下:Input n: 55 ! = 120,15,3.for循环的变体 for循环中允许使用各种变体,但只有三种主要语句:
10、 for (表达式1;表达式2;表达式3) 语句 (1)初始化总是一个赋值语句,它用来建立循环控制变量 (2)条件是一个关系表达式,它决定什么时候退出循环 (3)增量定义循环控制变量在每次循环时按什么方法变化。 这三个主要语句之间必须用分号隔开。 1)表达式1可省略,但分号不能省。 i=1; for (; i=10;i+) p=p*i;,16,2)省略表达式2,会构成永真循环(无限循环) for (i=1; ;i+) p=p*i; 3)省略表达式3,若在循环体中无循环变量增值表达式,则也会构成无限循环。 for (i=1; i=10; ) p=p*i; i+; 4)省略式1和式3 i=1; f
11、or (; i=10; ) p=p*i; i+; 由此可见,for语句的功能比while语句强,可以赋初值、循环变量自增等。,17,5)三式均省略构成无限循环 由于构成for循环的三个表达式都没有被要求,因此可以运用空的条件表达式而使循环无休止地进行下去。如: for (; ; ) printf(“This loop will run forever!n”); 死循环,但可以使用break语句立即中止循环。 例如:ch=0; for (; ; ) ch=getchar(); if (ch=A ) break; printf(“you typed an A”);,18,4说明 (1)“变量赋初值
12、”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。 (2) for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。 例如, for( i=1, j=10 ;i=j; i+, j-) (3)“循环继续条件”部分是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。 如:for (; (c=getchar( )!=n;) printf(“%c”,c); 注意:for循环的条件检验总是在循环的头部进行的,即当开始时条件为false时,循环不被执行。如:
13、 for (x=2,p=1;x2;+x) p=p*x; 由于x=2,循环不被执行。,19,5.4 break语句与continue语句,为了使循环控制更加灵活,语言提供了break语句和continue语句。 这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。这类语句是非结构化语句。 1一般格式: break; continue; 2功能 (1)break:强行结束循环转向执行循环语句的下一条语句。 (2)continue:该语句不造成强制性的中断循环,而是强行执行下一次循环,跳过continuer后面的语句,结束本次循环,提前进入下一次循环。,20,对于for循环,跳过循环体
14、其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。 案例5-8输出1100间能被7整除的数,若大于50停止输出 void main() int i; for (i=1;i50) break; if (i%7!=0) continue; printf(“%4d”, i); 输出结果:7 14 21 28 35 42 49,21,3说明 (1)break能用于循环语句和switch语句中,continue只能用于循环语句中。 (2)循环嵌套时,break只影响包含它们的最内层循环,与外层循环无关。 for (t=0; t10
15、; t+) count=1; for (; ; ) printf(“%4d”,count); count+; if (count=10) break; 结果:显示10次1到9的值,22,案例5-9 显示输入的字符, 如果按的是Esc键, 则退出循环; 如果按的是Enter键, 则不做任何处理,继续输入下一个字符。,#include “conio.h” main( ) char ch; for (; ;) ch=getch(); /*字符输入函数 */ if (ch=27) /* Esc键的ACSII码为27*/ break; /*退出循环*/ if (ch=13) continue; /*按的
16、是Enter:键,跳过字符输出语句*/ putch(ch); /*显示输入的字符*/ getch( ); /*让程序停一下,拍任意键继续*/ ,23,goto被称为无条件转移语句。它最大的好处就是可以一下子跳出多重循环,而break却不能做到这点。 #include “stdio.h” main( ) float score , average=0; int n=0; scanf(“%f”, while( );,for( ; ; ) for( ; ; ) ,while( ) do while( ); ,for( ; ; ) while( ) ,do for( ; ; ) while( );,2
17、6,循环嵌套举例,案例5-10输出图形 * * * * * * 分析: 一共6行, 每行的 *数目与行号相同,main() int i,j; for ( i=1; i7; i+) printf(n); for (j=1; j=i; j+ ) putchar(*); ,27,案例5-11输出图形 * * * * 分析: 一共4行, 第i行输出的空格数为: 4-i 第i行输出 i*2-1个*, 算法: 当 i = 4 do 输出 4-i个空格 ; 输出i 个 * 换行 ; i+ ; ,main() int i,j; for ( i=1; i=4; i+) printf(“n”); for (j=1
18、;j=4-i ; j+) putchar( ); for (j=1;j=2*i-1;j+ ) putchar(*); getch(); ,28,复合程序结构,C语言允许循环语句与分支结构语句联用,即在循环体包含一个完整的分支结构,这样的程序结构被称为复合程序结构。复合程序结构同样必须做到嵌套层次清楚,决不允许出现嵌套层次之间相互交叉的情况。 案例5-12 输出31000之间的全部素数。 算法设计要点: (1)显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。 (2)判断某数n是否是素数的算法:根据素数的定义,用2(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。 判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现。,29,#include main( ) int i, j ,count,flag; /* 用flag作标志 */ count=0; for(i=3; i=1000; i+) flag = 0; /* 设标志为0 */ for(j=2; j=sqrt(i); j+) if (i % j = =0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 改善方法2025年税务师考试备考试题及答案
- 分析税务师考试多重选择题特点试题及答案
- 深入探讨2025年临床执业医师考试试题及答案
- 2025年公共营养师考试核心知识学习法试题及答案
- 乐成公立寄宿学校2025年高三下学期第三次统练物理试题
- 监理工程师聘用协议书范文
- 分析西医临床考试取得成功试题及答案
- 定制衣柜合同
- 2025年育婴师考试情感教育的意义与方法试题及答案
- 母猪生活习性与饲养管理的认识考核及答案
- 2024-2030年国家甲级资质:中国生物质能源融资商业计划书
- 电动汽车充电桩项目投资商业计划书范本
- 西安市新建住宅供配电设施建设技术导则.修订完整版
- 中国技能大赛-第45届世界技能大赛全国选拔赛“水处理技术”项目技术工作文件
- DBJT45T 040-2022 内河航道整治绿色施工技术指南
- 学校运动会目的
- 讲解员礼仪培训
- 台风知识简介(共29张课件)
- 仓库照明灯具更换施工方案
- 《哮喘患者自我管理影响因素的HAPA模型验证分析及实证研究》
- 第19课+资本主义国家的新变化 说课稿 高一下学期统编版(2019)必修中外历史纲要下
评论
0/150
提交评论