《第06章循环程序设计.ppt》由会员分享,可在线阅读,更多相关《第06章循环程序设计.ppt(41页珍藏版)》请在三一文库上搜索。
1、第六章,循环结构程序设计,概述,循环:规律性的重复,即依据特定条件重复执行 基本操作,表现在程序设计中:算法中含有循环结构,例:在屏幕上输出10个*号,printf(“*n”);,又例:在屏幕上输出100,1000,10000个*号,分析,输出一个*号 putchar(*),输出1000个*号 putchar(*)执行1000次即可,分析,基本操作,为什么使用循环算法呢?,降低解题难度,减少程序代码,提高执行效率。,循环型程序设计解题关键,1、确定循环体,确定哪些操作需反复执行,2、确定循环执行条件,确定什么条件循环执行,例:在屏幕上输出1000个*号,1、确定循环体 putchar(*),2
2、、确定循环条件 i=1000( i初值为1),计数器,i=i+1 (使循环趋向于结束的操作),又如:求1+2+3+4+100的和,分析如下: 1 + 2 + 3 + 4+ +99+100,部分和,部分和,部分和,和,sum=sum+i,1、确定循环体 sum=sum+i; 2、确定循环执行条件 i=100 初值:sum=0;i=1;,i+;,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050,if 和 goto语句,for语句,do while语句,循环语句与洗衣机,循环控制语句的作用: 控制核心语句(循环体)的执行次数,循环控制语句,(
3、用来编制循环结构程序),while语句,if 和 goto语句,无条件转向语句,形式:goto 语句标号; (标识符:) 功能:从goto语句所在处,转向本函数内标号所在处,可用if和goto 语句构成循环,可执行语句,loop: if(p) s; goto loop;,例:编程输出1000个*号(用if和goto),分析问题,描述算法,#include main() int i=1; loop:if(i=1000) putchar(*); i+; goto loop;,main() int sum=0,i=1; loop:if(i=100) sum=sum+i; i+; goto loop;
4、 printf(“sum is %dn”,sum);,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050,while语句 一般形式:,while(表达式) 循环体语句;,执行流程:,简单语句 复合语句 空语句,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto 无限循环: while(1) 循环体;,举例,例:编程输出1000个*号(用while),while(P) s,#include main(
5、) int i=1; while(i=100) putchar(*); i+; ,又如:求1+2+3+4+100的和,/#include void main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum); ,dowhile语句 一般形式:,do 循环体语句; while(表达式);,执行流程:,特点: 先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while 结构,While循环,举例,例:编程输出1000个*号(用dowhile),do s while(p);,#include
6、 main() int i=1; do putchar(*); i+; while(i=1000); ,#include main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(“%d“,sum); ,又如:求1+2+3+4+100的和,while和dowhile比较,main() int i,sum=0; scanf(“%d“, ,main() int i,sum=0; scanf(“%d“, ,for语句 一般形式:,for(expr1 ; expr2 ; expr3) 循环体语句;,执行流程:,说明: for语句中expr
7、1, expr2 ,expr3 类型任意,都可省略,但分号;不可省 无限循环: for(;) ; for语句可以转换成while结构,expr1; while(expr2) 循环体语句; expr3; ,例:编程输出1000个*号(用for),for(i=1 ; i=1000;) putchar(*); i+;,i=1; for( ; i=1000;) putchar(*); i+;,#include main() int i; for(i=1;i=1000;i+) putchar(*); ,for(i=1; i=1000;putchar(*),i+) ;,for(循环变量赋初值;循环条件;循
8、环变量增值) 循环体语句; ,break语句与continue语句(1),break语句 形式: break; 功能: 跳出循环结构,break;,break;,break;,break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,举例,例 break举例:输出半径为110的圆面积, 面积大于100时停止,#define PI 3.14159 main() int r; float area; for(r=1;r100) break; printf(“r=%d,area=%.2fn“,r,area); ,小写字母转换成大写字母,直至输入非小写
9、字母,#include main() int i,j; char c; while(1) c=getchar(); if(c=a ,continue语句 形式: continue; 功能:结束本次循环,break语句与continue语句(2),continue;,break;,区别,例1:,break语句与continue语句(3),求1+2+3+4+5+6+7+8+9+10+的和,直至S1200。,例2:,求键盘输入若干个整数的和,直至输入-1,main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(“%d+%d=%dn“,i,j,
10、k); ,#include main() char c; for(;(c=getchar()!=n;) printf(“%c “,c); ,练习 程序分析,循环语句的使用规则,循环结构问题分析,本讲总结,重点掌握:,打印26个英文字母(三种语句编程),打印26个英文字母,例4:,三种语句编程,作业: 6.2、6.3、6.6,注意点: 1、各种控制结构的形式及功能 2、如何避免死循环 3、break语句和continue语句的功能,循环结构程序设计,程 序 举 例,循环型程序设计的两种典型算法(穷举法,迭代法),穷举法(枚举法),基本思想 对问题的所有可能状态一一测试,直到找到问题的答案或将全部
11、可能状态都测试完为止,例:录取新生,循环体 if(p ) s1,循环结束条件 i10000,计数器,i=i+1,计数法 循环次数已知,设置变量用来描述循环执行的次数,次数达到循环停止,例:打印出100700之间能被2整除不能被6整除的数字,穷举法举例,循环体 1、 if(p ) s1111111111111,循环结束条件 n700,p: n%2=0,2、n+,标志法,达到某一目标后循环结束(设置标志变量),循环结构的两种典型算法(穷举法,迭代法),循环结构的两种典型算法(穷举法,迭代法),穷举法举例,例:对于任意一整数,判断其是否为素数。,分析:m%n=r m:任意整数 n:2m-12 若r均
12、不为0,则m为素数,循环体 1、r=m%n;,3、n+;,2、if(r= =0) break;,循环结束条件 n,或r=0,循环结构的两种典型算法(穷举法,迭代法),迭代法,基本思想 不断用新值取代变量的旧值,或由旧值递归出新值,例:人口增长问题,例:求1*2*3*4*5,例:求1-1/2+1/3-1/4+1/5,例:求1+2+3+4.+100,sum=sum+n,例:人口增长问题,迭代法举例,分析,现有人口: 12亿 1年以后: 12*(1+2%) 2年以后: (12*(1+2%))*(1+2%) n年以后: (12*(1+2%)*.).*(1+2%),现有人口12亿,每年按2%递增, 问十
13、年后将有多少人?,设人口数为m(初值为12亿),则其后每一年的人口数m为m*(1+2%)(注:m为上一年的人口数),m的值不断变化由旧值推出新值,反复执行m=m*(1+2%),循环体 1、 m=m*(1+2%),循环结束条件 i10,计数法,2、i+,迭代问题分析关键要素,1、迭代初值 2、迭代公式3、迭代次数,又例:人口增长问题,现有人口12亿,每年按2%递增, 问多少年后人口数超过23亿?,1、迭代初值 m=12 2、迭代公式 m=m*(1+2%) 3、迭代次数 ?,循环体 1、 m=m*(1+2%) 2、 year+;(year 初值为0),循环结束条件 m23,标志法,循环型程序设计举
14、例,例1:,/4 求的近似值,直到最后一项的绝对值小于10-6为止,1+2+3+4+5+6+7+8+9+10+.,类似问题,解题关键: 1、迭代公式 sum=sum+t; t=. 2、迭代初值 sum= t= 3、迭代次数 循环退出的条件,关键是找每一项的变化规律,迭代公式推导: pi=pi+t;,迭代初值:pi=0;n=1;s=1;t=1,t=s/n;,迭代次数:由t决定,当fabs(t) 10-6 迭代结束,s=-s; n=n+2;,迭代公式: sum=sum+t; n=n+2; s=-s; t=s/n;,具体分析,相一致,分子:1,-1,1,-1 分母:1,3,5,7,.,例2:打印Fi
15、bonacci数列前40个数, 数列具有如下特点:第1,2两个数为1,1从第三个数开始,该数是其前面两个数之和,F1=1 F2=1 Fn=F n-1+F n-2 (n=3),迭代公式推导 F=F1+F2,F代表数列 从第三项起的某一项,F1代表该项的前两项,F2代表该项的前一项,迭代初值:F1=1,F2=1,迭代次数:由题目要求决定(可用标志法或计数法),1,1,2,3,5,8,F1=F2 F2=F,求:打印Fibonacci数列前40个数(方法二),迭代公式推导1 F=F1+F2 F1=F2 F2=F,迭代公式推导2 F1=F1+F2 F2=F1+F2,一次得到两个数,分析F1,F2的含义,
16、思考,例3:判断m是否是素数,算法:m%n=r n: 2sqrt(m) 若r均不为0,则表明m是素数,循环:穷举法,例4:打印100200之间的全部素数,循环的嵌套(自己分析),例5:译密码(输入一行字符,输出其相应密码),算法分析: 1、输入字符为c:(AV或av) 转变为c+4; 2、输入字符为c:(V或v之后) 转变为c-22;,分析程序,例:输入China!转换为Glmre!,void main() char c; while(c=getchar()!=n) if(c=a ,编程练习,1、爱因斯坦的阶梯问题,设有一阶梯,每步跨2级,最后余 1级;每步跨3级,最后余2级;每步跨5级,最后
17、余4级;每步跨6级,最后余5级;每步跨7级,正好到阶梯顶。问 至少有多少阶梯?,穷举法,设m为阶梯数 m%2=1&m%3=2&m%5=4&m%6=5&m%7=0,例 循环嵌套,输出九九表,/#include 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(j=9)?“%4dn“:“%4d“,i*j); ,例 求输入的十个整数中正数的个数及其平均值,/*ch5_12.c*/ #include main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(“%d“, ,例 (f0r)梯形法求数值积分,main() int m,n,gbs,gys; scanf( ); if(mn) t=n;n=m;m=t; for(gbs=m;_;gbs=gbs+m) ; gys=_;_;,“%d,%d”,&m,&n,gbs%n!=0,m*n/gbs,printf(“%d,%d”,gbs,gys),求两个整数的最小公倍数和最大公约数。,
链接地址:https://www.31doc.com/p-2250543.html