好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第06章循环程序设计.ppt

41页
  • 卖家[上传人]:人***
  • 文档编号:590024769
  • 上传时间:2024-09-12
  • 文档格式:PPT
  • 文档大小:684.52KB
  • / 41 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第六章第六章循环结构程序设计循环结构程序设计 概概述述我必须跑我必须跑12圈圈我举我举12次次我举我举24次次循环循环:规律性的重复,即依据规律性的重复,即依据特定条件特定条件重复重复执行执行 基本操作基本操作 表现在程序设计中:算法中含有循环结构表现在程序设计中:算法中含有循环结构 例:在屏幕上输出例:在屏幕上输出10个个*号号printf(“**********\n”); 又例:在屏幕上输出又例:在屏幕上输出100,,1000,,10000个个*号号分分析析输出一个输出一个*号号 putchar(‘*’)输出输出1000个个*号号 putchar(‘*’)执行执行1000次即可次即可分分析析基本操作基本操作为什么使用循环算法呢为什么使用循环算法呢? ? 降低解题难度,减少程序代码,提高执行效率降低解题难度,减少程序代码,提高执行效率 循环型程序设计解题关键循环型程序设计解题关键1、确定循环体、确定循环体确定哪些操作需反复执行确定哪些操作需反复执行2、确定循环执行条件、确定循环执行条件确定什么条件循环执行确定什么条件循环执行例:在屏幕上输出例:在屏幕上输出1000个个*号号1、确定循环体、确定循环体 putchar((’*’)2、确定循环条件、确定循环条件 i<=1000( i初值为初值为1)) 计数器计数器i=i+1((使循环趋向于结束的操作)使循环趋向于结束的操作) 又又如:求如:求1+2+3+4+…..100的和的和分析如下: 1 + 2 + 3 + 4+….. +99+100部分和部分和部分和部分和部分和部分和和和sum=0,,i=1;;i<=100sum=sum+i; i++;输出输出sumsum=sum+i1、确定循环体、确定循环体 sum=sum+i;2、、确定循环执行条件确定循环执行条件 i<=100初值:初值:sum=0;i=1;i++;sum=0+1sum==1+2=3sum=3+3=6sum=6+4……sum=4950+100=5050 if 和和 goto语句语句for语句语句do~ while语句语句循环语句与洗衣机循环语句与洗衣机循环控制语句的作用:循环控制语句的作用: 控制核心语句(循环体)的执行次数控制核心语句(循环体)的执行次数循环控制语句循环控制语句(用来编制循环结构程序)(用来编制循环结构程序)while语句语句 if 和和 goto语句语句无条件转向语句无条件转向语句形式:形式:goto 语句标号语句标号; (标识符标识符::))功能:从功能:从goto语句所在处,转向语句所在处,转向本函数本函数内标号所在处内标号所在处goto er; er: s; 可用可用if和和goto 语句构成循环语句构成循环可执行语句psgotoynloop: if(p)) {s; goto loop;} 例:编程输出例:编程输出1000个个*号(用号(用if和和goto)分析问题,描述算法分析问题,描述算法i=1Putchar(‘*’)i++;i<=1000#include main(){int i=1; loop:if(i<=1000) {putchar(‘*’);); i++; goto loop;}}又又如:求如:求1+2+3+4+…..100的和的和sum=0,,i=1;;i<=100sum=sum+i; i++;输出输出summain(){int sum=0,i=1;loop:if(i<=100){sum=sum+i;i++;goto loop;}printf(“sum is %d\n”,sum);}sum=0+1sum==1+2=3sum=3+3=6sum=6+4……sum=4950+100=5050 «while语句v一般形式:while(表达式表达式) 循环体语句;循环体语句;v执行流程::p循环体假(0)真(非0)whiles P简单语句简单语句复合语句复合语句空语句空语句v特点:先判断表达式,后执行循环体特点:先判断表达式,后执行循环体v说明:说明:l循环体有可能一次也不执行循环体有可能一次也不执行l循环体可为任意类型语句循环体可为任意类型语句l下列情况,退出下列情况,退出whilewhile循环循环u条件表达式不成立(为零)条件表达式不成立(为零)u循环体内遇循环体内遇break,return,gotobreak,return,gotol无限循环无限循环: while(1): while(1) 循环体循环体; ;举例 例:编程输出例:编程输出1000个个*号(用号(用while)while(P) s#include main(){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);}循环初值循环终值循环变量增值循环条件循环体 «do~while语句v一般形式:do 循环体语句; while(表达式);v执行流程:do循环体p假(0)真(非0)whiles!pv特点:先执行循环体,后判断表达式v说明:l至少执行一次循环体ldo~while可转化成while 结构expr循环体假(0)真(非0)循环体While循环循环举例 例:编程输出例:编程输出1000个个*号(用号(用do~while)do swhile(p);;#include 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和和do~while比较比较main(){ int i,sum=0; scanf("%d",&i); do { sum+=i;i++; }while(i<=10); printf("%d",sum);}main(){ int i,sum=0; scanf("%d",&i); while(i<=10) { sum+=i;i++; } printf("%d",sum);} «for语句v一般形式:for([expr1] ;[ expr2] ;[ expr3]) 循环体语句;循环体语句;v执行流程:expr2循环体假(0)真(非0)forexpr1expr3expr1sexpr3expr2v说明:lfor语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省l无限循环: for(;;) ;lfor语句可以转换成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(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值){循环体语句;循环体语句;} break语句与语句与continue语句语句(1)break语句语句•形式:形式: break; 功能:功能: 跳出循环结构跳出循环结构break;while(p){ } break;do{ }while(p);break;for(e1;e2;e3){ }lbreak只能只能终止并跳出最近一层的结构终止并跳出最近一层的结构lbreak不能用于循环语句和不能用于循环语句和switch语句之外的任语句之外的任何其它语句之中何其它语句之中p……break;……假(0)真(非0)whiledo……break;…...p假(0)真(非0)whilee2……break;…...假(0)真(非0)fore1e3举举例例 例 break举例:输出半径为1~10的圆面积,面积大于100时停止#define PI 3.14159main(){ int r; float area; for(r=1;r<=10;r++) { area=PI*r*r; if(area>100) break; printf("r=%d,area=%.2f\n",r,area); }}小写字母转换成大写字母,直至输入非小写字母#include main(){ int i,j; char c; while(1) { c=getchar(); if(c>='a' && c<='z') putchar(c-'a'+'A'); else break; }} continue语句语句•形式:形式: continue; 功能:结束本次循环功能:结束本次循环break语句与语句与continue语句语句(2)while(p){ } continue;break;while(p){ } 区区别别p……break;……假(0)真(非0)whilep……continue;……假(0)真(非0)while 例例1:1:break语句与语句与continue语句语句(3)求1+2+3+4+5+6+7+8+9+10+……的和,直至S>1200。

      例例2:2:求键盘输入若干个整数的和,直至输入-1 main(){ int i,j,k; for(i=0,j=100;i<=j;i++,j--) { k=i+j; printf("%d+%d=%d\n",i,j,k); }}#includemain(){ char c; for(;(c=getchar())!='\n';) printf("%c ",c);}练习练习程序分析程序分析 循环语句的使用规则循环结构问题分析本讲总结本讲总结重点掌握:□□打印打印2626个英文字母个英文字母((三种语句编程) □□打印打印2626个英文字母个英文字母例例4:4:三种语句编程 作业: 6.2、6.3、6.6注意点:注意点:1、各种控制结构的形式及功能、各种控制结构的形式及功能2、如何避免死循环、如何避免死循环3、、break语句和语句和continue语句的功能语句的功能 循环结构程序设计循环结构程序设计程程 序序 举举 例例 循环型程序设计的两种典型算法循环型程序设计的两种典型算法(穷举法,迭代法)(穷举法,迭代法)穷举法(枚举法)穷举法(枚举法)基本思想基本思想对问题的所有可能状态一一测试,直到找到问题对问题的所有可能状态一一测试,直到找到问题的答案或将全部可能状态都测试完为止的答案或将全部可能状态都测试完为止例:录取新生例:录取新生循环体循环体 if(p ) s1 循环结束条件循环结束条件 i>10000计数器计数器i=i+1计数法计数法循环次数已知,设置变量用来描述循循环次数已知,设置变量用来描述循环执行的次数,次数达到循环停止环执行的次数,次数达到循环停止 例:打印出例:打印出100~700之间能被之间能被2整除不能被整除不能被6整除的数字整除的数字穷穷举举法法举举例例循环体循环体 1、、 if(p ) s1111111111111 循环结束条件循环结束条件 n>700p: n%2==0&&n%6!=0 (n初值为初值为100))s1:printf(“%d”,n);2、n++标志法标志法达到某一目标后循环结束(设置标志变量)达到某一目标后循环结束(设置标志变量)循环结构的两种典型算法(穷举法,迭代法)循环结构的两种典型算法(穷举法,迭代法) 循环结构的两种典型算法(穷举法,迭代法)循环结构的两种典型算法(穷举法,迭代法)穷穷举举法法举举例例 例:对于任意一整数,判断其是否为素数。

      例:对于任意一整数,判断其是否为素数分析:分析:m%n==rm:任意整数任意整数 n:2~m-12~ 若若r均不为均不为0,则,则m为为素数素数循环体循环体 1、、r=m%n;3、n++;2、if(r= =0) break;循环结束条件循环结束条件 n>或或r=0读入mk=mi=2当ikm被i整除真假用break结束循环i=i+1ik+1真假输出:m”是素数”输出:m”不是素数” 循环结构的两种典型算法(穷举法,迭代法)循环结构的两种典型算法(穷举法,迭代法)迭代法迭代法 基本思想基本思想不断用新值取代变量的旧值,或由旧值递归出新值不断用新值取代变量的旧值,或由旧值递归出新值例:人口增长问题例:人口增长问题例:求例:求1*2*3*4*5例:求例:求1-1/2+1/3-1/4+1/5例:求例:求1+2+3+4…….+100sum=sum+n 例:人口增长问题例:人口增长问题迭迭代代法法举举例例分析分析现有人口:现有人口: 12亿亿1年以后:年以后: 12*((1+2%)2年以后:年以后: (12*((1+2%)))*((1+2%)) n年以后:年以后: (12*((1+2%))*……….).*((1+2%))现有人口现有人口12亿,每年按亿,每年按2%递增,递增, 问十年后问十年后将有多少人将有多少人?n-1年的人口数 设人口数为设人口数为m(初值为初值为12亿),则其后每一年亿),则其后每一年的人口数的人口数m为为m*(1+2%)(注:注:m为上一年的人口为上一年的人口数),数),m的值不断变化由旧值推出新值,反复执的值不断变化由旧值推出新值,反复执行行m=m*(1+2%)循环体循环体 1、、 m=m*(1+2%)循环结束条件循环结束条件 i>10计数法计数法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))循环结束条件循环结束条件 m>23标志法标志法 循环型程序设计举例循环型程序设计举例例例1: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,...t=1,pi=0,n=1.0,s=1当|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出pi 例例2:打印:打印Fibonacci数列前数列前40个数,个数,数列具有如下特点:第数列具有如下特点:第1,,2两个数为两个数为1,,1从第三从第三个数开始,该数是其前面两个数之和个数开始,该数是其前面两个数之和F1=1F2=1Fn=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=F2F2=F1534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155 求:打印求:打印Fibonacci数列前数列前40个数(方法二)个数(方法二)迭代公式推导迭代公式推导1 F=F1+F2 F1=F2 F2=F迭代公式推导迭代公式推导2 F1=F1+F2 F2=F1+F2 一次得到两一次得到两个数,分析个数,分析F1,F2的含的含义义思考思考f1=1,f2=1for i=1 to 20输出f1,f2f1=f1+f2f2=f2+f1 例例3:判断:判断m是否是素数是否是素数算法:算法:m%n=>r n: 2~sqrt(m) 若若r均不为均不为0,则表明,则表明m是素数是素数循环:穷举法循环:穷举法例例4:打印:打印100~200之间的全部素数之间的全部素数循环的嵌套(自己分析)循环的嵌套(自己分析) 例例5:译密码(输入一行字符,输出其相应密码):译密码(输入一行字符,输出其相应密码)算法分析:算法分析:1、输入字符为、输入字符为c:(A~V或或a~v) 转变为转变为c+4; 2、、输入字符为输入字符为c:(V或或v之后之后) 转变为转变为c-22;分析程序分析程序例:输入例:输入China!转换为转换为Glmre! lvoid main()l{char c;lwhile((c=getchar())!=‘\n’)l{if(c>=‘a’&&c<=‘v’|| if(c>=‘A’&&c<=‘V’) c+=4;if(c>=‘w’&&c<=‘z’|| if(c>=‘W’&&c<=‘Z’)c-=22;lprintf(“%c”,c);}l} 编编程程练练习习1、爱因斯坦的阶梯问题、爱因斯坦的阶梯问题设有一阶梯,每步跨设有一阶梯,每步跨2级,最后余级,最后余 1级;级;每步跨每步跨3级,最后余级,最后余2级;每步跨级;每步跨5级,级,最后余最后余4级;每步跨级;每步跨6级,最后余级,最后余5级;级;每步跨每步跨7级,正好到阶梯顶。

      问级,正好到阶梯顶问 至少有至少有多少阶梯?多少阶梯?穷举法穷举法设设m为阶梯数为阶梯数 m%2==1&&m%3==2&&m%5==4&&m%6==5&&m%7==0 例例 循环嵌套,输出九九表循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij/#include main(){ int i,j; for(i=1;i<10;i++) printf("%4d",i); printf("\n---------------------------------------\n"); for(i=1;i<10;i++) for(j=1;j<10;j++) printf((j==9)?"%4d\n":"%4d",i*j);} 例例 求输入的十个整数中正数的个数及其平均值求输入的十个整数中正数的个数及其平均值/*ch5_12.c*/#include main(){ int i,num=0,a; float sum=0; for(i=0;i<10;i++) { scanf("%d",&a);if(a<=0) continue;num++;sum+=a; } printf("%d plus integer's sum :%6.0f\n",num,sum); printf("Mean value:%6.2f\n",sum/num);} 例 (f0r)梯形法求数值积分0yxa a+ha+ih a+(i+1)hbf(x) main(){int m,n,gbs,gys; scanf( ); if(m>n) {t=n;n=m;m=t;} for(gbs=m;______;gbs=gbs+m) ; gys=______;__________;}“%d,%d”,&m,&ngbs%n!=0m*n/gbsprintf(“%d,%d”,gbs,gys)求两个整数的最小公倍数和最大公约数。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.