《C语言第五章循环结构.ppt》由会员分享,可在线阅读,更多相关《C语言第五章循环结构.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章 循环结构程序设计简单算法举例S1:S1:求求求求12=212=2S2:S2:求求求求23=623=6S3:S3:求求求求64=2464=24 天啊!共需天啊!共需天啊!共需天啊!共需999999个步骤,太可怕个步骤,太可怕个步骤,太可怕个步骤,太可怕了。了。了。了。案例案例2.1 求求12341000S1:1 p (p:被乘数被乘数)S2:2 i (i:乘数乘数)S3:pi pS4:i+1 iS5:若若I1000,返回返回S3;否则,结束。;否则,结束。只需只需5个步骤,简单。个步骤,简单。循环型程序设计概述C语言可实现循环的语句:用goto 和 if 构成循环while 语句do w
2、hile 语句for 语句goto语句及用goto构成循环goto语句一般格式:goto 语句标号;.标号:语句;while语句v一般形式:while(表达式)循环体语句;v执行流程:expr循环体假(0)真(非0)while例 用while循环求/*ch5_1.c*/#include main()int i,sum=0;i=1;while(1)while(i=100)sum=sum+i;i+;printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体v特点:先判断表达式,后执行循环体v说明:l循环体有可能一次也不执行l循环体可为任意类型语句l下列情况,退出while循环u条件表
3、达式不成立(为零)u循环体内遇break,return,gotol无限循环:while(1)循环体;l为了保了保证循循环正常运行,正常运行,应该特特别注意:注意:循循环控制条件控制条件 控制条件的初始状控制条件的初始状态(初始(初始值)循循环体内部体内部对控制条件的影响控制条件的影响例 显示110的平方/*ch5_21.c*/#include main()int i=1;while(i0)/*判断循环的条件是否满足判断循环的条件是否满足*/sum+=x;/*累加累加*/scanf(%f,&x););printf(和和=%6.2f,sum););/*输出所求一些正数的和输出所求一些正数的和*/【
4、例5.2】从键盘上输入一些数,求所有正数之和。当输入0或负数时,程序结束 dowhile语句v一般形式:do 循环体语句;while(表达式);v执行流程:do循环体expr假(0)真(非0)while例 用dowhile循环求/*ch5_3.c*/#include main()int i,sum=0;i=1;do sum+=i;i+;while(i=100);printf(%d,sum);v特点:先执行循环体,后判断表达式v说明:l至少执行一次循环体ldowhile可转化成while结构expr循环体假(0)真(非0)循环体While循环例 while和dowhile比较/*ch5_4.c*
5、/#include main()int i=1,sum=0;scanf(%d,&i);do sum+=i;i+;while(i=10);printf(%d,sum);main()int i=1,sum=0;scanf(%d,&i);while(i=10)sum+=i;i+;printf(%d,sum);l求求1 1到到100100的之和。的之和。lmain()main()l int sum=0,int sum=0,i=1i=1;whilewhile(;i=100i=100;)sum=sum+i;sum=sum+i;i+;i+;printf(printf(”sum=%dn,sum);sum=%d
6、n,sum);变形形1 1:whilewhile (;i=100i sum+=i;+i=sum+=i;+i 变形形2 2:int i=0;int i=0;l whilewhile(;+i=100+i +i;=+i;判断判断i=100 i=100 sum+=i;sum+=i;变形形3 3:int i=0;int i=0;l whilewhile(;i+100i+=判断判断i100i100;i+i+sum+=i;sum+=i;变形形4 4:int i=0;int i=0;l whilewhile(;i 100i +i;sum+=i=+i;sum+=i例 求n!=?main()int n,i;flo
7、at value;printf(“input n=”);scanf(“%d”,&n);i=1;value=1.0;while(i=n)value*=i;i+;printf(“n!=%fn”,value);do value*=i;i+;while(i=n);l例例:从从键盘输入入1010个整数,求个整数,求这1010个整数的个整数的最大数最大数。l#include#include lmain()main()int count,num,max;int count,num,max;/*count:/*count:计数器数器,num:,num:输入的整数入的整数,max:,max:最大数最大数*/pr
8、intf(Enter the No.1=);scanf(%d,printf(Enter the No.1=);scanf(%d,&max&max););countcount=2;=2;/*/*循循环控制控制变量变量*/whilewhile(count=10count=10)/*/*循循环控制条件控制条件*/printf(Enter the No.%d=,count);printf(Enter the No.%d=,count);/*/*循循环体体*/scanf(%d,&num);scanf(%d,&num);if(maxnum)if(maxnum)max=num;max=num;/*/*比较大
9、小比较大小*/count+;count+;printf(printf(“max=%dn,max);max=%dn,max);l例:例:输入一个正整数,要求以相反的入一个正整数,要求以相反的顺序序输出出该数。例如:数。例如:输入入1234512345,则输出出为5432154321。l基本思路:可以从个位开始,按位基本思路:可以从个位开始,按位输出整数的出整数的每一位每一位 lmain()main()l unsigned int number;unsigned int number;printf(Input the number:);printf(Input the number:);scanf
10、(%d,&number);scanf(%d,&number);do do printf(%d,number%10);printf(%d,number%10);number/=10;number/=10;/*number/*number缩小小1010倍倍*/while while(number!=0);(number!=0);for语句v一般形式:for(expr1;expr2;expr3)循环体语句;v执行流程:expr2循环体假(0)真(非0)forexpr1expr3vfor语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值)循环体语句;v说明:lfor语句中expr1,ex
11、pr2,expr3 类型任意,都可省略,但分号;不可省l无限循环:for(;)lfor语句可以转换成while结构expr1;while(expr2)循环体语句;expr3;例 用for循环求#include main()int i,sum=0;for(i=1;i=100;i+)sum+=i;printf(%d,sum);例:#include main()int i=0;for(i=0;i10;i+)putchar(a+i);运行结果:abcdefghij例:#include main()int i=0;for(;i10;i+)putchar(a+i);例:#include main()int
12、 i=0;for(;i10;)putchar(a+(i+);例:#include main()int i=0;for(;i10;putchar(a+i),i+);【例5.8】求100个数的最小值。#include”stdio.h”main()float x;int i;/*循环控制变量循环控制变量*/float min;/*最小值最小值*/printf(输入第输入第1个数个数:););scanf(%f,&x););min=x;/*最小值初始化最小值初始化*/for(i=2;i=100;i+)printf(输入第输入第%d个数个数:,i););scanf(%f,&x););if(x min)mi
13、n=x;/*将当前数与最小值进行比较将当前数与最小值进行比较*/printf(最小值最小值=%fn,min););#include”stdio.h”main()int m;int i;int flag;printf(请输入要判断的正整数请输入要判断的正整数m:););scanf(%d,&m););flag=1;for(i=2;im;i+)if(m%i=0)flag=0;i=m;/*令令i为为m,使,使im不成立,使不是素数时退出循环不成立,使不是素数时退出循环*/if(flag=1)printf(%d是素数是素数n,m););else printf(%d不是素数不是素数n,m););【例5.9
14、】判断m是否素数循环的嵌套v三种循环可互相嵌套,层数不限v外层循环可包含两个以上内循环,但不能相互交叉v嵌套循环的执行流程(1)while()while().(2)do do while();.while();(3)while()do while();.(4)for(;)do while();while().内循环外循环内循环v嵌套循环的跳转禁止:l从外层跳入内层l跳入同层的另一循环l向上跳转例 循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281.ij/*输出九九表*/#include main(
15、)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);i10printf假(0)真(非0)i=1j+j=1j10真(非0)假(0)i+for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);外循环内循环 4.5 辅助控制语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语
16、句之外的任何其它语句之中exprbreak;假(0)真(非0)whiledobreak;.expr假(0)真(非0)whileexpr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.const 1const 2const ndefaultcase 例 break举例:小写字母转换成大写字母,直至输入非字母字符#include main()int i,j;char c;while(1)c=getchar();if(c=a&c=z)putchar(c-a+A);else break;#i
17、nclude”stdio.h”main()int m;int i;int flag;printf(请输入要判断的正整数请输入要判断的正整数m:););scanf(%d,&m););flag=1;for(i=2;im;i+)if(m%i=0)flag=0;break;/*用用break;代替;代替i=m;退出循环;退出循环*/if(flag=1)printf(%d是素数是素数n,m););else printf(%d不是素数不是素数n,m););【例5.14】判断m是否素数(用break退出循环)continue语句v功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断
18、v仅用于循环语句中exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3例 求输入的十个整数中正数的个数及其平均值/*ch5_12.c*/#include main()int i,num=0,a;/i控制变量控制变量,num计数器计数器,a输入数输入数 float sum=0;for(i=0;i10;i+)scanf(%d,&a);if(a=0)continue;num+;sum+=a;printf(%d plus integers sum:%6.0fn,num
19、,sum);printf(Mean value:%6.2fn,sum/num);【例5.13】把100到150之间的不能被4整除的数输出,并要求一行输出8个数。#include”stdio.h”main()int n,i=0;for(n=100;n=150;n+)if(n%4=0)continue;printf(”%4d”,n);i+;if(i%8=0)printf(”n”);五、常用算法五、常用算法1、枚举法(穷举法)“笨人之法”:把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。【例一】百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。分析:这是个
20、不定方程三元一次方程组问题(三个变量,两个方程)xyz=100 5x3yz/3=100 设公鸡为x只,母鸡为y只,小鸡为z只。百元买百鸡问题分析main()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if (x+y+z=100&5*x+3*y+z/3.0=100)printf(cocks=%d,hens=%d,chickens=%dn,x,y,z);结果:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84【讨论 此为“最笨”之法要进行101101101=10
21、30301次(100多百次)运算。百元买百鸡问题分析main()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)z=100-x-y;if (5*x+3*y+z/3.0=100)printf(“cocks=%d,hens=%d,chickens=%dn,x,y,z);【讨论】令z=100-x-y 只进行101101=10201 次运算(前者的1%)取x=19,y=33 只进行2034=680 次运算(第1种运算的6.7%)【例二】雨水淋湿了算术书的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?(3)2=89分析
22、 设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中A的取值范围为29,其余取值范围为09。条件表达式即为给定算式。main()int A,B,C,D,E;for(A=2;A=9;A+)for(B=0;B=9;B+)for(C=0;C=9;C+)for(D=0;D=9;D+)for(E=0;E=9;E+)if(A*(B*10+3+C)*A*(B*10+3+C)=8009+D*100+E*10)printf(“%2d%2d%2d%2d%2dn”,A,B,C,D,E);结果:3 2 8 6 4【例二】雨水淋湿了算术书的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不
23、是1。编程求其余数字是什么?(3)2=89【例三】求100200之间不能被3整除也不能被7整除的数。分析:求某区间内符合某一要求的数,可用一个变量“穷举”。所以可用一个独立变量x,取值范围100200。for(x=100;x=200;x+)for(x=100;x=200;x+)if(x%3!=0&x%7!=0)if(x%3!=0&x%7!=0)printf(“x=%dn”,x);printf(“x=%dn”,x);如果是求指定条件的奇数呢?如果是求指定条件的偶数呢?x=101;x=200;x=x+2 x=100;x=200;x=x+2 2、归纳法(递推法、迭代法)“智人之法”:通过分析归纳,找
24、出从变量旧值出发求新值的规律。五、常用算法五、常用算法【例一】编程求i=1+2+3+4+99+100 (i=0100)分析 i=0 S0=0(初值)i=1 S1=0+1=S0+1 i=2 S2=1+2=S1+2 i=3 S3=1+2+3=S2+3 i=4 S4=1+2+3+4=S3+4 i=n Sn=1+2+3+4+n=Sn-1+n【例一】编程求i=1+2+3+4+n (n 100)程序:main()int i,n,s=0;printf(n=);scanf(%d,&n);for(i=1;i=n;i+)s=s+i;printf(Sum=%dn,s);运行结果:n=100Sum=5050如果是i=
25、1+1/2+1/3+1/n 呢?算法类型小结:累加型【累加型】类型诸如 +求其前n项之和的编程题。累加型算法 若设i为循环变量,s为前n项累加之和,则程序的基本结构为:s=0;for(i=1;i=n ;i+)s=s+;【例二】编程求11/2+1/31/4+1/5 +1/991/100分母为奇数时,相加分母为偶数时,相减法1:从变化规律分析程序:main()int i;float s=0;for(i=1;i=100;i+)if(i%2)s=s+1/i;else s=s-1/i;printf(Sum=%fn,s);运行结果:Sum=1.000000错在哪里?【例二】编程求11/2+1/31/4+1
26、/5 +1/991/100法2:这是个累加型算法的编程题程序:#include main();int i;float s=0;for(i=1;i=100;i+)s=s+pow(-1,i+1)/i;printf(Sum=%fn,s);程序:#include main()int i,k=1;float s=0;for(i=1;i=100;i+)s=s+k/i;k=-k;printf(Sum=%fn,s);累加型算法程序基本结构为:s=0;for(i=1;i=n;i+)s=s+;错在哪里?(如何检查程序错误?)运行结果:Sum=0.688172 运行结果:Sum=1.000000【例三】编程求n!(
27、n由键盘输入)分析 i=1 S0=1=S0 (初值)i=1 S1=01=S01 i=2 S2=12=S12 i=3 S3=123=S23 i=4 S4=1234=S34 i=n Sn=1 234n=Sn-1n【例三】编程求n!(n由键盘输入)程序:main()int i,n,s=1;printf(n=);scanf(%d,&n);for(i=1;i=n;i+)s=s*i;printf(Sum=%dn,s);运行结果:n=5Sum=120运行结果:n=8Sum=-25216Why?算法类型小结:阶乘型【阶乘型】类型诸如 求其前n项之积的编程题。阶乘型算法 若设i为循环变量,s为前n项相乘之积,则
28、程序的基本结构为:s=1;for(i=1;i=n ;i+)s=s*;【例四】编程求n!=1!+2!+3!+n!外循环为累加型内循环为阶乘型法1:从变化规律分析程序:main()int i,j,n;float s,s1;printf(请输入请输入n=);scanf(%d,&n);s=0;for(i=1;i=n;i+)s1=1;for(j=1;j=i;j+)s1=s1*j;s=s+s1;printf(Sum=%.0fn,s);运行结果:n=5Sum=153/*如果n值较大,可改为printf(“Sum=%en”,s);*/在同一个循环中 先阶乘,后累加法2:通过单循环实现程序:main()int
29、i,n;float s,s1;printf(请输入n=);scanf(%d,&n);s=0,s1=1;for(i=1;i=n;i+)s1=s1*i;s=s+s1;printf(Sum=%.0fn,s);运行结果:n=5Sum=153【例四】改为:编程求n!=1!+3!+5!+(2n-1)!递推法的总结 递推是一个序列U1,U2,U3,Un,后面的每一项都能按公式由前面的一项或连续的几项推算出来。递推初值、递推公式和递推终止条件是递推法的三要素。例:斐波纳契数列。斐波纳契数列是这样一个数列:前两个数都是1,第三个数是前两个数之和,以后的每个数都是其前两个数之和。各数之间的一种递推关系,即:Fn=Fn-1+Fn-2,F1=F2=1本题的三要素是:递推初值:x=1,y=1 递推公式:z=y+x 终止条件:共计算n-2次【例五】斐波那契数列问题:求斐波那契数列前n项的和main()int f1=1,f2=1,f=2,i,s=0,n;printf(Input n=);scanf(%d,&n);for(i=3;i=1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(pi=%10.6fn”,pi);
限制150内