




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 循环结构程序设计,主要内容,5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do-while语句实现循环 5.4 用for 语句实现循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行的状态 5.8 循环程序举例 练习5,要点: 循环的基本概念 不同形式的循环控制 多重循环问题,5.1为什么需要循环控制,什么是循环? 为什么要使用循环?,问题1:,在许多问题中需要用到循环控制。循环结 构是结构化程序设计的基本结构之一,它和顺 序结构、选择结构共同作为各种复杂程序的基 本构造单元。,循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反
2、复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 语言提供了多种循环语句,可以组成各种不同形式的循环结构。,问题2: 求学生平均成绩,分数相加后除以课数,执行过程 先计算条件中表达式的值,当为非0时,执行循环体语句 再计算条件中表达式的值,当为非0时,再执行循环体语句 再计算条件中表达式的值,直到为0时,退出该循环体,while循环语句(当型循环) 格式 while(条件) 循环体语句,注意:循环体有若干个语句,则用“”括起来。,5.2 用while语句实现循环,特点:先判断表达式,后执行循环体 说明 当条件中表达式的值 是一个非0常数时,在循环体内又
3、无退出循环的语句,则该循环为无限循环,又称“死”循环 循环体可为任意类型语句 循环体有可能一次也不执行, while(1) printf(“Hello”); , scanf(%d, ,#include int main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum); return 0;,例5.1 用while语句编写程序求 sum =1+2+3+ +100,注意!,#include int main() int x=0; while(x+=5); printf(“%d, ”,x); printf(“%dn”,x);
4、 return 0;,运行结果: 7,7,例A5.1 写出下列程序的运行结果,#include int main() int x=0; while(x+=5) printf(“%d, ”,x); printf(“%dn”,x); return 0;,运行结果: 1,2,3,4,5,6,7,比较,5.3用do-while语句实现循环,dowhile语句 格式,do 循环体语句 while(条件);,执行过程,While循环,特点:先执行循环体,后判断表达式 说明 至少执行一次循环体,与While循环区别,循环体可以是一条语句,也可以是复合语句。当为一条语句时,也建议加上花括号。 记住while后
5、面有一个分号(;) dowhile可转化成while结构,例5.2 用dowhile循环 求 sum=1+2+3+ +100,#include int main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(“sum=%dn,sum); return 0;,注意书写格式,#include int main() int i=6; do printf(%4d,i); while(i-3); printf(%4d,i); return 0;,例A5.2 写出下列程序的运行结果,6 5 4 3 2,运行结果:,例5.3 while和do
6、while比较, 考虑 i=1, i=11 两种情况,#include int main() int i,sum=0; scanf(%d,#include int main() int i,sum=0; scanf(%d,当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。 否则,两者结果不相同(指二者具有相同的循环体的情况)。,5.4 用for 语句实现循环,for语句 格式,for(expr1 ; expr2 ; expr3) 循环体语句,各表达式的作用: expr1设置初始条件,只执行一次。可以为零个、一个 或多个变量设置初值执行 expr2循环条件表达式,用来判定是
7、否继续循环。在每 次执行循环体前先执行此表达式,决定是否继续 执行循环 expr3步长(改变循环变量的值),作为循环的调整器, 例如使循环变量增值,它是在执行完循环体后才 进行的,sum=0; for(i=1;i=100;i+) sum=sum+i;,执行过程,for语句的执行过程: (1) 先求解表达式1 (2) 求解表达式2,若其值为真,执行循环体,然后执行下面第(3)步。若为假,则结束循环,转到第(5)步 (3) 求解表达式3 (4) 转回上面步骤(2)继续执行 (5) 循环结束,执行for语句下面的一个语句,for语句一般应用形式,for(循环变量赋初值;循环条件;循环变量增值) 循环
8、体语句; ,说明: for语句中expr1, expr2, expr3 类型任意,都可省略,但分号;不可省 无限循环: for(;) for语句可以转换成while结构,#include int main( ) int i; for(i=0;i10;i+) putchar(a+i); return 0;,运行结果:abcdefghij,#include int main( ) int i=0; for(;i10;i+) putchar(a+i); return 0;,2) “表达式1”可以省略,此时应在for语句之前给循环变量赋初值,for语句的各种形式,1) 一般形式,4)表达式3可以是与循
9、环控制无关的任意表达式,#include int main( ) int i=0; for(;i10;putchar(a+i),i+) ; return 0;,#include int main( ) int i=0; for(;i10;) putchar(a+(i+); return 0;,3)表达式3可省略,但在循环体中应另外设法保证循环能正常结束,逗号表达式,5)表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体,#include int main() char c;int i; for(i=0;(c=getchar()!=n;) i+=
10、c; printf(%d ,i); return 0;,for(i=0;(c=getchar()!=n; i+=c);,for (sum=0 ; i=100; i+) sum=sum+i;,与循环变量无关 合法,注意:从终端键盘向计算机输入时,是在按Enter键以后才将一批数据一起送到内存缓冲区中去,#include int main() char c; int i; for(i=0;(c=getchar()!=n;) printf(%c,c); return 0;,运行程序:tom (输入)tom (输出) 注意:输出结果不是ttoomm,#include int main( ) char
11、c; int count=0; for(;(c=getchar()!=n;) if (c=a ,例A5.3 输入一串字符,统计其中英文字母的个数,运行结果:,5.5 循环的嵌套,循环的嵌套 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程,for( ; ;) do while(); while() . ,5.6 几种循环的比较,一般情况下,3种循环可以互相代替 在while和do-while循环中,循环体应包含使循环趋于结束的语句 用while和do
12、-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化 都可以用break语句跳出循环,用continue语句结束本次循环,例A5.4 循环嵌套,输出九九表,#include int main() int i,j; for(i=1;i10;i+) printf(%4d,i); printf(n-n); for(i=1;i10;i+) for(j=1;j10;j+) printf(%4d,i*j); printf(n); return 0;,循环的嵌套 外层对行进行循环 内层对列进行循环 不同层次的循环一般采用不同的
13、循环控制变量 一定采用缩进的书写格式,#include int main() int i, j; for(i=1; i=6; i+) for(j=1; j=6-i; j+) printf( ); for(j=1; j=2*i-1; j+) printf(*); printf(n); return 0;,例A5.5 分析程序执行后的输出结果,#include int main() int i,j; for(i=1;i=6;i+) for(j=1;j=i-1;j+) printf( ); for(j=1;j=13-2*i;j+) printf(*); printf(n); return 0;,fo
14、r(j=1;j=i-1;j+) printf( );,for(j=1;j=i;j+) printf( );,for(j=1;j=30+i;j+) printf( );,例A5.6 分析程序执行后的输出结果 分三种情况讨论,#include int main() int i, j; char ch; for(i=1; i=6; i+) ch=A+i-1; for(j=1; j=6-i; j+) printf( ); for(j=1; j=2*i-1; j+) printf(%c,ch); printf(n); return 0;,例A5.7 使用循环语句,编程实现下述图案,#include in
15、t main() int i,j; char ch; for(i=1;i=6;i+) ch=F-i+1; for(j=1;j=i-1;j+) printf( ); for(j=1;j=13-2*i;j+) printf(%c,ch); printf(n); return 0;,例A5.8 使用循环语句,编程实现下述图案,5.7 改变循环执行的状态,5.7.1 用break语句提前终止循环 5.7.2 用continue语句提前结束本次循环 5.7.3 break语句和continue语句的区别,5.7.1 用break语句提前终止循环 功能 在循环语句和switch语句中,终止并跳出循环体或开
16、关体 说明 break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,#include int main() int i=1,sum=0,x; printf(“Enter:); if(x=0) break; printf(“sum=%dn“,sum); return 0;,例A5.9 编程求出从键盘上输入的不多于10个整型数的总和。如果不足10个数,则以输入0为结束,scanf(“%d”,for(;i=10;i+),sum+=x;,5.7.2 用continue语句提前结束本次循环 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否
17、执行循环体的判断 仅用于循环语句中,编程思路: 对100到200之间的每一个整数进行检查 如果不能被3整除,输出,否则不输出 无论是否输出此数,都要接着检查下一个数(直到200为止)。,例5.5 要求输出100200之间的不能被3整除的数,N,n=100,n200,Y,n能被3整除,N,n=n+1,输出n,Y,for(n=100;n=200;n+) if (n%3=0) continue; printf(%d ,n); ,5.7.3 break语句和continue语句的区别 continue语句只结束本次循环,而不是终止整个循环的执行 break语句结束整个循环过程,不再判断执行循环的条件是
18、否成立,N,表达式1,Y,表达式2,N,Y,N,表达式1,Y,表达式2,N,Y,break语句,continue语句,强行退出循环,只结束本次循环,例5.6 输出以下4*5的矩阵,解题思路: 可以用循环的嵌套来处理此问题 用外循环来输出一行数据 用内循环来输出一列数据 按矩阵的格式(每行5个数据)输出,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,双重循环,控制输出4行,控
19、制每行中输出5个数据,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,累计输出数据的个数,控制一行内输出5个数据,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0
20、; ,i=1时,j由1变到5 i*j的值是1,2,3,4,5,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,i=2时,j也由1变到5 i*j的值是2,4,6,8,10,如何修改程序,不输出第一行的空行?,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) print
21、f (“n”); printf (%dt,i*j); printf(n); return 0; ,if (i=3 ,遇到第3行第1列,终止内循环,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,if (i=3 ,原来第3行第1个数据3没有输出,思考: 如何修改程序,输出下列图形?,算法1(伪代码) 输入a,b,c if abcmcb if bca ,3 7 1,3 7 1,1
22、 7 3,1 3 7,例4.3 输入三个数a,b,c,要求按由小到大的顺序输出。(P88),算法2 输入a,b,c 若a b将a和b对换(a是a、b中的小者) 若a c将a和c对换(a是a、c中的小者,故a是三者中最小者) 若b c将b和c对换(b是b、c中的小者,也是三者中次小者) 顺序输出,算法 输入a,b,c,d 若a b将a和b对换(a是a、b中的小者) 若a c将a和c对换(a是a、c中的小者,故a是a,b,c中最小者) 若a d将a和d对换(a是a、d中的小者,故a是四者中最小者) 若b c将b和c对换(b是b、c中的小者) 若b d将b和d对换(b是b、d中的小者,也是四者中次小
23、者) 若c d将c和d对换(c是c、d中的小者,也是四者中第三小者) 顺序输出,练习4.11 输入4个整数, 要求按由小到大的顺序输出。(P113),思考:n个数的排序?,#include int main() int a,b; a=3; b=!+a?a*2:a*3; printf(%d,%dn,a,b); a=a?+a:+b; printf(%d,%dn,a,b); printf(%dn,a=a?a+5:b-1?a+1:b+2); return 0;,例A5.10 填空题: 分析下面程序段的输出结果是_,问题与程序设计 分析问题 问题: 树上有十只鸟,开枪打死一只,树上还剩几只鸟?,数学家反
24、问:是无声手枪或别的无声的枪吗? 不是。 枪声有多大? 会震得耳朵疼。 那就是说有80100分贝? 是。 在这个城市里打鸟犯不犯法? 不犯。 您确定那只鸟真的被打死啦? “确定。”提问的人已经不耐烦了,“拜托,你告诉我还剩几只就行了,OK?” 0K,树上的鸟中有没有聋子? 没有。 有没有关在笼子里的? 没有。,5.8循环程序举例,边上还有没有其他的树,树上还有没有其他的鸟? 没有。 有没有残疾或饿得飞不动的鸟? 没有。 算不算还在肚子里和孵在鸟窝里的? 不算。 打鸟的人眼有没有花?保证是十只? 没有花,就十只。 提问的人已经满脑门是汗。 但数学家继续问: 有没有傻得不怕死的? 都怕死。 会不会
25、一枪打死两只? 不会。 所有的鸟都可以自由活动吗? 完全可以。 “如果您的回答没有骗人,”数学家满怀信心地说,“打死的鸟要是挂在树上没有掉下来,那么就剩一只,如果掉下就一只不剩。” 提问的人当即晕倒!,例5.7用 公式求 的近似值,直到发现某一项的绝对值小于10-6 为止(该项不累计加)。,解题思路: 求 近似值的方法很多,本题是一种 其他方法:,南北朝的时候,祖冲之为了计算圆周率,他在自己书房的地面画了一个直径1丈的大圆,从这个圆的内接正六边形一直作到12288边形,然后一个一个算出这些多边形的周长。那时候的数学计算,不是用现在的阿拉伯数字,而是用竹片作的筹码计算。他夜以继日、成年累月,终于
26、算出了圆的内接正24576边形的周长等于3丈1尺4寸1分5厘9毫2丝6忽,还有余。因而得出圆周率的值就在3.1415926与3.1415927之间,准确到小数点后7位,创造了当时世界上的最高水平。,每项的分子都是1 后一项的分母是前一项的分母加2 第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反,本题方法:,#include #include int main() int sign=1; double pi=0,n=1,term=1; while(fabs(term)=1e-6) pi=pi+term; n=n+2; sign=-sign; term=sign/n; pi=pi*4
27、; printf(pi=%10.8fn,pi); return 0; ,求绝对值的函数 还有:abs(x),只保证前5位小数是准确的,#include #include int main() int sign=1; double pi=0,n=1,term=1; while(fabs(term)=1e-6) pi=pi+term; n=n+2; sign=-sign; term=sign/n; pi=pi*4; printf(pi=%10.8fn,pi); return 0; ,改为1e-8,50万次 5000万次,例5.8 求费波那西(Fibonacci)数列的前40个数。这个数列有如下特点
28、:第1、2两个数为1、1。从第3个数开始,该数是其前面两个数之和。即:,这是一个有趣的古典数学问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子。 小兔子长到第3个月后每个月又生一对兔子。 假设所有兔子都不死,问每个月的兔子总数为多少?,#include int main() int f1=1,f2=1,f3; int i; printf(%12dn%12dn,f1,f2); for(i=1; i=38; i+) f3=f1+f2; printf(%12dn,f3); f1=f2; f2=f3; return 0; ,代码可改进,#include int main() int f1=1,f2=1; int i; for(i=1; i=20; i+) printf(%12d %12d ,f1,f2); if(i%2=0) printf(n); f1=f1+f2; f2=f2+f1; return 0; ,例5.11 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第1单元 4 古代诗歌四首2024-2025学年新教材七年级语文上册同步教学设计(统编版2024)河北专版
- 工程合同外包合同范本
- 数字产品交易合同范本
- 自助水饺供货合同范本
- 数学建模 建立函数模型解决实际问题:探究茶水温度与时间的关系 教学设计-2024-2025学年高一上学期数学人教A版(2019)必修第一册
- 销售佣金合同范本
- 餐具租赁合同
- Unit 2 Healthy Lifestyle Using Language(教学设计)高二英语同步高效课堂(人教版2019选择性必修第三册)
- 浙江省历史与社会七年级人教版下册 6.1 沟壑纵横的黄土高原 教学设计
- 第15课 两次鸦片战争 教学设计-2023-2024学年高中历史统编版2019必修中外历史纲要上册
- 轮状病毒性肠炎
- 世界社会主义五百年
- 加氢裂化操作工题库(合并版)
- 正大集团大猪场开发流程
- 高中政治必修四知识体系每单元的总体框架
- 房地产金融创新与风险防范的理论演进
- GB/T 41255-2022智能工厂通用技术要求
- GB/T 41029-2021石油天然气钻井海洋弃井作业规程
- 深入推进依法行政
- GB/T 4026-1992电器设备接线端子和特定导线线端的识别及应用字母数字系统的通则
- 马工程教材《公共财政概论》PPT-第二章 公共财政职能
评论
0/150
提交评论