C语言程序设计(5循环结构)_第1页
C语言程序设计(5循环结构)_第2页
C语言程序设计(5循环结构)_第3页
C语言程序设计(5循环结构)_第4页
C语言程序设计(5循环结构)_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计语言程序设计第五章第五章 循循 环环 结结 构构Page 2本章目标o 了解循环结构、循环语句o 重点掌握for语句、 while语句和dowhile语句的语法形式、执行顺序及用法o 掌握循环结构的嵌套使用方法Page 3循环结构概述o 为什么用循环结构?o 循环的基本步骤是什么?o 循环结构的定义?Page 4循环结构概述o 为什么用循环结构?o 循环的基本步骤是什么?o 循环结构的定义?Page 5为什么用循环结构?o 在程序设计中经常会遇到在某一条件成立时,重复执行某些操作。o 例如,求: sum=1+2+3+4+nPage 6循环的基本步骤(1)给sum赋值0,i赋值1;

2、(2)令sum=sum+i,i=i+1;(3)若i=n,则重复执行(2)(4)输出sum的值Page 7循环结构的定义o循环结构:就是在给定条件成立的情况下,重复执行一个程序段;当给定条件不成立时,退出循环,再执行循环下面的程序。o循环语句:实现循环结构的语句称为循环语句。o在C中,循环语句有以下三种:n for语句n while语句n dowhile语句whilefordo-while循环是指使用一定条件对同一个程序段重复执行若干次。循环结构又称重复结构,可以完成重复性、规律性的操作。v一般形式:while() v执行流程:while语句循环体:被重复执行的部分表达式循环体假(0)真(非0)

3、whilev 特点:先判断表达式,后执行循环体v 说明:l 循环体有可能一次也不执行l 循环体可为任意类型语句l循环体中必须出现使循环趋于结束的语句,否则会出现“死循环”的现象。l 下列情况,可退出while循环u 条件表达式不成立(为零)u 循环体内遇break while语句特点和说明while() o 执行过程:o 根据条件,若为真,则执行循环体(只有一句),然后返回条件,再判定真假,若为真,则继续执行循环体,且又返回条件处再判定,从而形成一个循环圈。若条件为假,则从条件处跳到循环体之后继续运行程序。while语句o 例4-2:o main()o o int count=1;o whil

4、e(count5) o o printf(”good morning!n”);o count+ +;o o good morning!good morning!good morning!good morning!#includemain() int n=9; while(n6) n-; printf(“%d”,n); 876main( ) int n=9; while(n6)n-; printf(“%dn”,n);6广西工学院计算机系理论教研室 例例2: 显示显示110的平方。的平方。#include main() int i=1; while(i=10) printf(%d*%d=%dn,i

5、,i,i*i); i+; 运行运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=1003.23.13.3例例3:输入:输入10个数,求其和个数,求其和#include main() int i=1,s=0,a; while(i=10) printf(“请输入请输入10数数”); scanf(“%d”,&a); s+=a; i+; printf(“输入的输入的10个数的和是个数的和是%dn,s);例例4:求:求1*2*3*4*5*6*10的积的积#include main() long s=1,n=1; while(n=1

6、0) s*=n; n+; printf(“1到到10的积为的积为%ldn,s);例例4-3:用用while循环求循环求sum=1+2+3+100 #include main() int sum=0; int i=1; while(i=100) sum+=i; i+; printf(“sum=%d,sum);循环初值循环终值循环变量增值循环条件循环体如何求sum=1*2*3*100 ?【例例5-13】猴子吃桃问题。猴子吃桃问题。猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以

7、后每个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉前一天剩下的一半零一个。到第天早上都吃掉前一天剩下的一半零一个。到第1010天早上再想吃时,天早上再想吃时,就只剩一个桃子了。问第一天共摘了多少个桃子?就只剩一个桃子了。问第一天共摘了多少个桃子?迭代法迭代法设第设第n天为天为xn个,第个,第n+1天为天为xn+1则:则:xn+1= xn/2-1可得递推公式:可得递推公式: xn=(xn+1+1)*2 1n9 x10=1 n=10即:即: x10=1 x9=(x10+1)*2=4 x8=(x9+1)*2 =10 x1=(x2+1)*2=1534算法分析:算法分析:倒推倒推

8、#include main()int p2=1,p1;intn=9;while(n0) p1=2*(p2+1); p2=p1; n-;printf(“the total is %dn”,p1);#include main() int n=0; long t=1; printf(“ n n! n”); while(n8) n+; t*=n; printf(%d %ld n,n,t); 运行结果:n n! 1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 求n!(n=18)do-while语句v一般形式:do while();v执行流程:do循环体expr假(

9、0)真(非0)while“ ; ”不能少表达式循环体假(0)真(非0)循环体while循环v 特点:先执行循环体,后判断表达式v 说明:l 至少执行一次循环体l dowhile可转化成while结构dowhile语句特点和说明do while();o main()o int x=3;o doo o printf(“%d”,x-=2);o while(x=0);o 1-1x=x-2;printf(“%d”,x);o 执行过程: 首先执行循环体,然后判断条件,若为真再执行循环体,再判断条件,若条件为假,执行下一条语句。p 注意:在if语句、while语句中,表达式后面都不能加分号,而在do-whi

10、le语句的表达式后面则必须加分号。do-while语句求1+2+3+100#include main() int sum=0,i; i=1; do sum=sum+i; i+; while(i=100);printf(”sum=%dn”,sum);#include main() int sum=0; int i=1; while(i=100) sum=sum+i; i+; printf(“sum=%d,sum);o While循环的特点是:先判断,后执行;do-while循环的特点是:先执行,后判断。因此do-while循环中,循环体至少执行一次。在一般情况下,使用while循环和do-whi

11、le循环处理同样问题,二者的循环体是一样的;但是,当while循环的表达式一开始就是“假”的,就不会执行循环体,而此时do-while循环会先执行循环体,再退出循环,所以两者的结果会产生差异。do-while与与while的区别的区别main( ) int i=1,s=0; while(i1) s=s+i; i=i+1; printf(s=%dn,s);s=0main() int i=1,s=0;do s=s+i; i=i+1; while(i1); printf(s=%dn,s);s=1do-while与与while的区别的区别v 一般形式:for(表达1 ;表达式2 ;表达式3) v 执行

12、流程:expr2循环体假(0)真(非0)forexpr1expr3for语句v 一般应用形式:for(初始化表达式;条件表达式;循环变量增值) v 说明:l for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省l for语句可以转换成while结构 执行过程:首先赋初值(表达式1),然后判断条件(表达式2),若为真,执行单语句,再执行表达式(表达式3),又判断条件。若条件为假,退出循环,执行下一条语句。表达式1;while(表达式2) 表达式3;for语句for(for(表达表达1 ;1 ;表达式表达式2 ;2 ;表达式表达式3)3) 形式:形式:#inclu

13、demain( ) int i=0; for(i=0;i10;i+) putchar(a+i);运行结果:abcdefghij形式:形式:#includemain( ) int i=0; for(;i10;i+) putchar(a+i);形式:形式:#includemain( ) int i=0; for(;i10;) putchar(a+(i+);形式:形式:#includemain( ) int i=0; for(;i10;putchar(a+i),i+) ;例: for语句形式的多样性o main()o int i;o for(i=0;i10;i+)o i+;o printf(“%d”

14、,i);o o main() int i; for(i=1;i5;i+) ; printf(“%d”,i);513579空语句求1+2+3+100main() int sum=0,i;for(i=1;i=100;i+)sum=sum+i;printf(”sum=%dn”,sum);几种循环的比较o o while(表达式) o 语句;oodo 语句while(表达式);循环控制条件循环控制条件循环条件初始化循环条件初始化循环修改条件循环修改条件也可在也可在forfor前前也可在循环体内也可在循环体内for(表达式1;表达式2;表达式3) 语句 几种循环的比较123循环体的执行:先判断条件,循先

15、判断条件,循环体可能一次也环体可能一次也不执行。不执行。while(表达式表达式) 语句语句;后判断条件,后判断条件,循环体至少执循环体至少执行一次行一次.do 语句语句while(表达式表达式);for循环功能强,循环功能强,两者界限不清,两者界限不清,使用较随意。使用较随意。for(表达式表达式1;表达式表达式2;表达式表达式3) 语句语句界限不清界限不清界限不清界限不清小结小结v 循环控制有两种方法:循环控制有两种方法:计数法计数法和和标志法标志法。 能确定循环次数时,采用计数法,用能确定循环次数时,采用计数法,用for语句比较清晰;语句比较清晰; 不能确定循环次数时,采用标志法,设法找

16、出循环终不能确定循环次数时,采用标志法,设法找出循环终止条件,用止条件,用while或或do-while语句来实现。语句来实现。v 用用while与与do-while语句能实现的程序,用语句能实现的程序,用for语句未必可以语句未必可以实现。实现。v while语句是先判断后执行,语句是先判断后执行,do-while语句是先执行后判断。语句是先执行后判断。在循环体至少执行一次的情况下两者等价。在循环体至少执行一次的情况下两者等价。#include main( ) int i ,s; s=0; i=1;while(i=100) s = s + i; i+; printf(s=%dn,s);计算计

17、算s=1+2+3+s=1+2+3+100+100#include main( ) int i,s; s=0; i=1; do s = s + i; i+; while(i=100); printf(s=%dn,s);#include main( ) int i, s=0; for(i=1; i=100;i+) s = s + i; printf(s=%dn,s); i=1; i=1;for( ;i=100; )for( ;i=100; ) s=s+i; s=s+i; i+; i+; o main( )o int i;o for(i=1;i=0);去掉分号,结果是?例例:求:求Fibonacci

18、数列第数列第40项。又叫项。又叫兔子繁殖问题(兔子繁殖问题(Fibonacci提出的)提出的)main( ) int n,m; long f1=1,f2=1,f3; printf(“%ld %ld ”,f1,f2); for (m=3;m=40;m+) f3=f1+f2; f1=f2; f2=f3; printf(“%d ”,f3); p r i n t f ( “ n ” ) ; 设有一对新生兔子,从第设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多少对兔子?规律,若所有兔子都不死,问一年后共有多少对兔子?迭代

19、法迭代法算法分析:算法分析:月月:1 2 3 4 5 6 7 8:1 2 3 4 5 6 7 8 1 1-1 11 11 11 11 11-11-1 1 1 1 1-1 1 1 11 1-1 1 1 1 1 11 11 1-1 1 1 1 1 1-1 1 1 11 11 11 11 1 1 1 1 1-1 1 1 11 11 1 1 1兔兔: 1 1 2 3 5 8 13 21f1 f21 1 f3=f1+f2 2 f1 f2 f3=f1+f2 3 f1 f2 f3=f1+f2 5 f1 f2 f3=初始条件初始条件终止条件终止条件迭代公式迭代公式思考:思考:f1=f2和和f2=f3能否对换能

20、否对换位置?不位置?不例例:打印出所有的水仙花数。一个打印出所有的水仙花数。一个3位数,其各位数字的位数,其各位数字的立方和等于它本身。立方和等于它本身。分析:百位数i=m/100;十位数:j=m/10%10;个位数k=m%10;判断m=i3+j3+k3main() int i,j,k,m;for(m=100;m1000;m+)i=m/100;j=m/10%10; k=m%10; if(m= =i*i*i+j*j*j+k*k*k)printf(%5d,m); 穷举法穷举法计数法计数法统计从键盘输入一行字符的个数.o main()o o int count=0;o while( getchar(

21、)!=n ) o count+;o printf(%d,count);o 标志法:标志法:循环终止条件循环终止条件main( ) int x,max,i; scanf(“%d”,&x); max=x; for (i=2;imax) max=x; printf(“max=%dn”,max);依次输入依次输入10个数,找出最大数。个数,找出最大数。分析:分析:输入输入x1x1 max输入输入x2若若x2max则则x2 max输入输入x3若若x3mx则则x3 max输入输入x4打擂方式打擂方式有一个分数序列有一个分数序列2/1,3/2,5/3,8/5,21/13求该数例前求该数例前20项之和项之和m

22、ain()int n,t;float a=2,b=1,s=0;for(n=1;n=a&c=A&c=0&c=9)digit+;elseothers+;printf(all in all:char=%d space=%d digit=%d others=%dn,letters,space,digit,others);v 循环的嵌套:循环体本身包含循环语句v 三种循环可互相嵌套,层数不限v 外层循环可包含两个以上内循环,但不能相互交叉(1) while() while() . (2) do do while( ); . while( );(3) while() do while( ); . (4)

23、for( ; ;) do while(); while() .内循环外循环内循环循环的嵌套for(i=1;i5;i+) j=1; while(j4) printf(i=%d,j=%dn,i,j); j+; for(j=1;j4:j+)printf(i=%d,j=%dn,i,j);i=1,j=1i=1,j=2i=1,j=3i=2,j=1i=2,j=2i=2,j=3i=3,j=1i=3,j=2i=3,j=3i=4,j=1i=4,j=2i=4,j=3注意:多重循环程序执行时,外层循环每执行一次,内层循环的循环注意:多重循环程序执行时,外层循环每执行一次,内层循环的循环体都需要执行多次体都需要执行多次

24、例:编写程序,输出以下图形。*思路:思路:一共有3行,每行由星号组成,星号按行减少;变量i控制输出行数,从1变化到3;变量j控制输出每行的星号;1. j从5变化到i,每次输出一个星号。#include stdio.hmain() int i,j; for(i=1;i=2*i-1;j-) printf(“*,); printf(n); 例:编写程序,输出以下图形。*思路:思路:一共有3行,每行由星号组成,星号按行减少;变量i控制输出行数,从1变化到3;变量j控制输出每行的星号;1. j从5变化到2*i-1,每次输出一个星号。#include stdio.hmain() int i,j; for(

25、i=1;i= 2*i-1;j-) printf(*); printf(n); 形状形状 形状形状main( ) int i,j; for (i=1;i=9;i+) printf(“%4d”,i); printf(“n”); for (i= 1;i=9;i+) printf(“%c”,-); printf(“n”); for (i=1;i=9;i+) for (j=1;j=9;j+)printf(“%d*%d=%4d”,i,j,i*j); printf(“n”); 例:打印九九乘法表例:打印九九乘法表 形状形状1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 92 4 6 8 1

26、0 12 14 16 183 6 9 12 打印表头打印表头9个数字个数字打印虚线打印虚线打印打印表体表体for (i=1;i=9;i+) for (j=1; j=i; j+) printf(“%d*%d=%4d”,i,j,i*j); printf(“n”); 打印打印表体表体for (i=1;i=9;i+) for (j=0;j=i-1;j+) printf(“%4c”, ); for (j=i; j=9; j+)printf(“%d*%d=%4d”,i,j,i*j); printf(“n”); 打印打印表体表体打印打印空格空格例:百马百担例:百马百担有有100匹马,驮匹马,驮100担货,大

27、马驮担货,大马驮3担,中马驮担,中马驮2担,两匹小担,两匹小马驮马驮1担。问有大、中、小马各多少?担。问有大、中、小马各多少?算法分析:算法分析:main( ) int a,b,c; for (a=0;a33;a+) for (b=0;b50;b+) c=100-a-b; if (3*a+2*b+c/2.0=100) printf(“a=%d ”,a); printf(“b=%d ”,b); printf(“c=%dn”,c); 设大、中、小马各为设大、中、小马各为a a、b b、c c,则:,则: 3a+2b+c/2=100 a+b+c=100可得:可得: 0a33 0b50 0c200穷举

28、法穷举法若问有几种解决方法,若问有几种解决方法,则应如何修改程序?则应如何修改程序?用变量用变量k作为计数作为计数器,在器,在if语句中增语句中增加加“k+;”语句语句例例:打印图形。打印图形。1 23 456789 0 1* * * * * * * * * * *算法分析:算法分析:第第1行:行:1个个*,6个个空格空格,换行,换行第第2行:行:3个个*,4个个空格空格,换行,换行第第3行:行:5个个*,1个个空格空格,换行,换行第第4行:行:7个个*,0个个空格空格,换行,换行第第i(14)行:行:2i-1个个*,8-2i个个空格空格,换行换行main( ) int i,j; for (i

29、=1;i=4;i+) for (j=1;j=2*i-1;j+) printf(“*”); for (k=1;k=8-2*i;k+) printf(“ ”); printf(“n”); 2i-1个个*8-2i个个空格空格换行换行补充举例:打印图形。补充举例:打印图形。12345678910 11*算法分析:算法分析:第第1行:行:1个空格,个空格,5个个*号,换行号,换行第第2行:行:2个空格,个空格,5个个*号,换行号,换行第第3行:行:3个空格,个空格,5个个*号,换行号,换行第第4行:行:4个空格,个空格,5个个*号,换行号,换行第第5行:行:5个空格,个空格,5个个*号,换行号,换行第第

30、i(15)行:行:i个空格,个空格,5个个*号,换行号,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=i;j+) printf(“ ”); for (j=1;j=5;j+) printf(“*”); printf(“n”); i个空格个空格5个个*号号换行换行循环语句嵌套时,当外层循环语句嵌套时,当外层循环变量取循环变量取1个值时,内个值时,内层循环变量要取遍所有值层循环变量要取遍所有值补充举例(续):打印图形。补充举例(续):打印图形。1 23 45678 90 1*1 23 45 6 78 90 11223334444555551 23 45

31、 6 78 901*算法分析:算法分析:第第1行:行:5个空格,个空格,1个个*_,换行,换行第第2行:行:4个空格,个空格,2个个*_,换行,换行第第3行:行:3个空格,个空格,3个个*_,换行,换行第第4行:行:2个空格,个空格,4个个*_,换行,换行第第5行:行:1个空格,个空格,5个个*_,换行,换行第第i(15)行:行:6-i个空格,个空格,i个个*_,换行,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=6-i;j+) printf(“ ”); for (j=1;j=i;j+) printf(“*_”); printf(“n”); 6-

32、i个空格个空格i个个*_换行换行算法分析:算法分析:第第1行:行:5个空格,个空格,1个个1_,换行,换行第第2行:行:4个空格,个空格,2个个2_,换行,换行第第3行:行:3个空格,个空格,3个个3_,换行,换行第第4行:行:2个空格,个空格,4个个4_,换行,换行第第5行:行:1个空格,个空格,5个个5_,换行,换行第第i(15)行:行:6-i个空格,个空格,i个个i_,换行,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=6-i;j+) printf(“ ”); for (j=1;j=i;j+) printf(“%d_”,i); printf

33、(“n”); 6-i个空格个空格i个个i_换行换行算法分析:算法分析:第第1行:行:1个空格,个空格,5个个*_,换行,换行第第2行:行:2个空格,个空格,4个个*_,换行,换行第第3行:行:3个空格,个空格,3个个*_,换行,换行第第4行:行:4个空格,个空格,2个个*_,换行,换行第第5行:行:5个空格,个空格,1个个*_,换行,换行第第i(15)行:行:i个空格,个空格,6-i个个*_,换行,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=i;j+) printf(“ ”); for (j=1;j3是否是否为素数为素数main( ) int

34、n,m; scanf(%d,&m); for (n=2;nm-1) printf(the %d is a primern,m); else printf(the %d is not a primern,m); 例:验证素数例:验证素数 素数是除了素数是除了1 1和它自身外,和它自身外,再也找不到能被它整除的数。再也找不到能被它整除的数。 即:若即:若m m不能被不能被2 2到到m-1m-1中中所有整数整除,则所有整数整除,则n n为素数。为素数。 已证明只要从已证明只要从2 2判断到判断到m/2m/2或或 即可。即可。算法分析:算法分析:m求求100200间的全部素数间的全部素数?也可用也可用m/2或或sqrt(m)与break语句退出循环不同的是,continue语句只结束本次循环,忽略循环体中剩下的语句,接着进行下一次循环的判断,如果满足循环条件,继续循环,否则退出循环。 例:输出100以内的偶数main()int i; for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论