xin6 第六章 循环控制结构程序设计_第1页
xin6 第六章 循环控制结构程序设计_第2页
xin6 第六章 循环控制结构程序设计_第3页
xin6 第六章 循环控制结构程序设计_第4页
xin6 第六章 循环控制结构程序设计_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1、2020/7/5,1,第 六 章 循环控制结构程序设计,李 书 涛 ,2020/7/5,2,目录,1 while语句 2 do-while语句 3 for语句 4 break和continue语句 5 循环嵌套 6 几种循环结构比较 7 循环结构综合实例 8 本章小结,第六章 循环控制结构程序设计,2020/7/5,3,什么是循环? 为什么要使用循环?,循环是有规律的重复操作。将复杂问题分解为简单的操作过程,程序只对简单过程描述,对过程的多次重复就可完成对问题的求解。,问题2:求学生平均成绩,分数相加后除以课数。,做99次加法。,问题3:找出x以内能同时被3和7整除的数找数。,ifgoto 循

2、环 while循环 for循环 do-while循环,先判断后循环 (当型循环),先循环后判断 (直到型循环),循环嵌套,?,问题1:,1 while语句,1 while语句 5.1.1 循环的基本概念,2020/7/5,4,循环的初始条件 循环进入条件 循环体 循环变量的修订,循环变量的初值,满足条件则执行循环体,重复执行的语句,循环变量的改变,进一步测试条件,二、循环结构 1. 当型循环,区别?,先循环后判断,先判断后循环,一、循环的基本要素,2. 直到型循环,2020/7/5,5,while语句,1. 格式:while(表达式) 循环体 2. 功能:先判断表达式的值,若为非零,重复执行循

3、环体语句,再判断.直到表达式的值为零,退出循环体,条件,即:测试-执行-测试-执行-,while (条件) 语句组,5.1.2 while循环结构程序设计,2020/7/5,6,while (条件) 语句组,main ( ) 说明对象 输入数据 运算处理 输出结果 ,100,求: s=1+2+3+100,main ( ) int s,n ; s=0 ; n=1; while(n=100) s=s+n ; n+; printf(“%dn”, s); ,课堂作业,2020/7/5,7,(1)当循环体语句多于一条时,用 ,否则,循环只对 一个语句 起作用。 (2)循环体内部必须有对循环变量的修正语句

4、,否则,易出现“死循环”。 (3)条件表达式要有括号,后面不加分号。 (4)注意边界值。,例题:求 (课堂作业) 1+2+3+n=10000的最大的n。,main( ) int a,k; a=k=0; while(a=10000) +k; a+=k; printf(“1+2+3.+%d=%dn”,k-1,a-k); ,注意事项,main( ) int number=0; while(number+=1) printf(“*%dn”,number); printf(“*%dn”,number); ,循环进行了多少次? 输出的值?,结果 : *1 *2 *3,条件表达式执行次数 1 2 3,条件表

5、达式中变量的值 0 1 2,执行哪个printf语句 #,#,输出的number的值 1 2 3,口头课堂作业,利用while语句实现:从键盘输入n个数(n0),求其和。,main() int i, n, k, sum; i=1; sum=0; printf(Input n: ); scanf(%d, 运行结果: Input n: 6 12 34 2 11 9 5 sum is: 73,2020/7/5,10,1. 格式:do 循环体 while(表达式); 2. 功能:先执行循环体,再判断表达式的值,若为非零,重复执行循环体语句,再判断.直到表达式的值为零, 退出循环体,do while语句

6、,条件,即:执行-测试-执行-测试-,2 do-while循环结构程序设计,2 do - while循环结构程序设计,(,b,N-S流程图,流程图,main() int n=1,s=0,x; scanf(%d, ,条件表达式后有分号,求: s=1+2+3+100,do 语句 while (条件);,2020/7/5,12,main() int s=0,x; scanf(%d, ,main() int s=0,x; scanf(%d, ,输入:12 输出: s=12,循环至少 执行一次,循环没有 被执行,输入:12 输出: s=0,while与do-while的比较,2020/7/5,13,先计

7、算e1初值;计算e2并判断,0 时跳出循环,非0 时执行循环;当e2非0,执行循环体语句,计算e3增量;自动转到第二步(计算e2).继续执行。,for语句,初值e1 条件e2 增量e3,for (表达式1;表达式2;表达式3) 语句组 ,1. 格式 :,2. 功能 :,3 for循环结构程序设计,3 for循环结构程序设计,2020/7/5,14,for 语句流程图,2020/7/5,15,main( ) int n, s=0; for(n=1 ; n=100 ;n+) s=s+n; printf(“%dn”,s); ,变量的增量,循环体,变量的初值,循环条件,求: s=1+2+3+100,2

8、020/7/5,16,for工作流程可用while语句来表达,表达式1; while (表达式2) 语句 ; 表达式3 ; ,for 语句同 while语句相似,与do-while语句不同。,for(n=1 ; n=100 ;n+) s=s+n; 可用下述while语句来表达,n=1; while(n=100 ) s=s+n; n+; ,2020/7/5,17,例:输入a,b两个整数,计算从a到b的整数之和。,main( ) int a,b,sum; printf(input a ,本例for语句的执行过程是:先使用赋值语句sum=0,使存放和数的变量sum置成0,接着判别ab为止(即a=b为

9、假)。,2020/7/5,18,for (;n100;n+) 缺省e1, n 应在循环之前赋初值 for (n=0;n+) 缺省e2, 造成死循环,不可使用! for (n=0;n100;) 缺省e3, n增量应在循环体内进行 for (; ;) 缺省e1,e2,e3 死循环 for (;n100;) 缺省e1,e3,分号始终不能缺省!,说明,1. 表达式1,表达式2和表达式3均可缺省,2020/7/5,19,for(初值;判断;增量) 语句; for(初值;判断;增量) 复合语句; for(初值;判断;增量);,for (s=0,n=1;n=100;s=s+n, printf(“ %d” ,

10、s) n+; for (s=0;n100;s=s+n,n+) printf(“ %d” ,s); ,求累加和,n的初值在 for之前完成,增量在for 之外完成,for语句的形式,2. 表达式1和3可以是与初值,增量无关的逗号表达式,2020/7/5,20,间断语句格式: break;,break语句的功能 1. break语句只能用于switch结构或循环结构 2.在switch语句中结束case子句,使控制转到 switch语句之外。 3.在循环结构中,break语句使流程转向该循环体的外层继续运行。向外退出一层循环,循环的退出,4 break与continue语句,4 break与con

11、tinue语句 一. 间断语句,define PI 3.1415926 main() int r; float area; for (r=1; r100) break; printf(r: %d area is: %fn, r, area); ,计算r=110的圆面积,直到面积area大于100为止。,2020/7/5,22,r: 1 area is: 3.1415930 r: 2 area is: 12.566370 r: 3 area is: 28.274334 r: 4 area is: 50.265480 r: 5 area is: 78.539818,运行结果,2020/7/5,23

12、,例题:求100以下的整数中为13的倍数的最大数。,main( ) int i; for (i=100; i=0; i-) if(i%13)=0) break; printf(“%dn”,i); ,如何求100以下 所有13的倍数,程序举例,2020/7/5,24,例题:阅读下述程序,写出执行结果 (5分),main ( ) int a=10, y=0; do a+=2; y+=a; if (y50) break ; while (a=14); printf(a=%d, y=%dn, a,y); 执行结果为: . .,程序举例,a=16 , y=60,2020/7/5,25,继续语句格式:co

13、ntinue;,continue语句的功能: 1. continue语句仅能在循环语句中使用。 2. 它的作用不是结束循环,而是结束当前一次循环,开始一次新的循环。即终止当前这一轮循环,跳过循环体中位于continue后面的语句,立即开始下一轮循环。 3. 对于for语句,将控制转到执行增量和条件测试部分。 4. 对于while和do-while语句,将控制转到条件测试部分。,循环的退出,二. 继续语句,2020/7/5,26,main() int x,y,z; for(x=1;x=20;x+) for(y=1;y=34-x;y+) z=100-x-y; if(5*x+3*y+z/3=100)

14、 if(z%3!=0) continue; printf(“%d,%d,%dn”,x,y,z); ,将前面例题中,小鸡的数z中不能被3整除的解筛除?,结束一次循环,程序举例,2020/7/5,27,把100到150之间的不能被3整除的数输出,要求一行输出10 个数。,main() int n, i=0; for (n=100; n=150; n+) if (n%3=0) continue; printf(%4d, n); i+; if (i%10=0) printf (n); ,程序举例,运行结果: 100 101 103 104 106 107 109 110 112 113 115 116

15、 118 119 121 122 124 125 127 128 130 131 133 134 136 137 139 140 142 143 145 146 148 149,2020/7/5,28,例题:阅读下述程序,写出执行结果 (5分),main( ) int a,b; for(a=1,b=1; a=20) break; if (b%3=1) b+=3; continue; b - = 5; printf(a=%d, b=%dn, a, b); 执行结果为: .,程序举例,a=8 , b=22,2020/7/5,29,二、标号语句 格式:标号标识符:语句 功能:指示语句在程序中的位置,

16、作为转移语句的转移目标 。,一、转移语句(无条件转向语句) 格式:goto 标号标识符; 功能:将程序流程无条件地转向指定标号所在的语句继续执行。,标号由数字,字母,下划线组成,goto,三. 无条件转向语句,2020/7/5,30,main( ) int k, sum=0; k=1; loop: if(k=100) sum=sum+k; k+; goto loop; printf(“%d”,sum); ,说明:goto可以从较深的多重循环中转移到外层,或从函数内,转移到函数外,但不能从函数外转到函数内。,goto,冒号,程序举例,2020/7/5,31,main() int n=1,s=0,

17、x; scanf(%d, ,10 s=55 100 s=5050 255 s=32640,while(n=x),for(;n=x;),if-goto,while(n=x),for(;n=x;),循环结束,区别?, 5 循环嵌套, 5 循环嵌套,2020/7/5,32,1. C中的三种循环语句while(),do-while(), for() 都可由表达式控制重复执行一个循环体,都可以用来解决同一个问题,一般情况下,可以相互代替。,2. 三种循环各有特点:,( 1 ) 当循环次数及条件在程序运行中才能确定时,选用while( )或do-while( )语句 两者区别:while( ) 顶部测试,

18、可能一次也不执行 do-while( ) 底部测试,至少执行一次,5.5.1 三种循环语句的区别,2020/7/5,33,( 2 ) 如果初值,条件明显,循环次数已给出,选用for()语句,功能最强,( 3 ) 出现“死循环”的几种情况 for( ; ; ) for( ; 非零常数表达式;) while(非零常数表达式) do_while(非零常数表达式),三种循环各有特点,2020/7/5,34,在循环体中,又包含有循环结构。例如:,main() int i,j,k; k=0; for ( i=1;i=10;i+ ) for ( j=1;j=10;j+ ) k+; printf(“k=%dn

19、n”,k); getch(); ,5.5.2 循环语句的嵌套 一、循环嵌套的概念,循环嵌套的运行过程:外层循环取一个值,内层循环取遍所有的值。故上述程序的输出结果为: k=100,2020/7/5,35,1 2 3 4 5 6 7 8 9 - 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81,在循环体中,又包含有循环结构。,行循环中包含了列循环。,双重循环,外层循环 i 控制打印9行,内层循环 j 控制

20、每行打印i列。,例如打印九九表,2020/7/5,36,外循环,内循环,交叉循环,外循环 入口,内循环出口,内循环出口,外循环出口,例:,百钱百鸡问题:每只公鸡5个钱,每只母鸡3个钱,每3只小鸡1个钱,用100个钱,买100只鸡,问公鸡、母鸡和小鸡各买几只?,二、嵌套结构的规则及应用,内外循环不能交叉,2020/7/5,37,分 析,定义变量x,y,z ,表示公鸡、母鸡和小鸡的只数,main( ) int x,y,z; for( x=1;x=100;x+) for( y=1;y=100;y+) for( z=1;z=100;z+) if(5*x+3*y+z/3=100 ,程序运算100万次,百

21、钱百鸡问题程序,2020/7/5,38,x最多为20,y最多为34,当x,y已确定时,z的值为100-x-y,main() int x,y,z; for(x=1;x20;x+) for(y=1;y34;y+) z=100-x-y; if(5*x+3*y+z/3=100) printf(“%d,%d,%dn”,x,y,z); ,共六组解: x y z 3 20 77 4 18 78 7 13 80 8 11 81 11 6 83 12 4 84,所求的z不能被3整除如何解决?,注意括号,百钱百鸡程序的改进,2020/7/5,39,解决所求的z不能被3整除用z%3=0,main() int x,y

22、,z; for(x=1;x20;x+) for(y=1;y34;y+) z=100-x-y; if(5*x+3*y+z/3=100) ,共三组解: x y z 3 20 77 4 18 78 7 13 80 8 11 81 11 6 83 12 4 84,注意括号,百钱百鸡程序的进一步改进,2020/7/5,40,根据问题的部分条件预估答案的范围,然后在此范围内对所有可能的情况逐一验证(穷举) ,直到全部情况都通过了验证为止。,三、穷举法,穷举法步骤: 预估出答案的大致范围; 用循环语句对范围内所有可能情况进行穷举; 在穷举中逐一验证,将满足条件的情况输出,即为所解。,凡是求解有多少种方案或可

23、能等一类非数值问题都可以用穷举法来求解。如:百钱百鸡问题、换硬币问题、水仙花问题、完数问题、素数问题等。,2020/7/5,41,main( ) int a,b,c,k=0; for(a=0;a=20;a+) for(b=0;b=50;b+) for(c=0;c=100;c+) if (5*a+2*b+c=100) k+; printf(k=%dnn, k) ; getch(); 运行结果: k=541,将一元钱换成一分,二分和五分的硬币,共有多少种换法?,定义变量a, b, c分别作为三种硬币的个数,定义变量 k作计数器。,计数器,例:换硬币,2020/7/5,42,从键盘输入 n值,输出n

24、行每行n个*号。 例:输入 n=4,输出的图形如下:,1. 输入n; 2. 重复打印n行,每行打印n个*;,* * * * * * * * * * * * * * * *,思路:,1. scanf(“%d”, ,对每行打印n 个 *,对列循环从1-n次,循环语句的嵌套,四. 打印图形,2020/7/5,43,for ( i=1; i=n; i+) for ( j=1; j=n; j+) printf (“*”); printf(“n”) ; ,main ( ) int i, j, n; scanf ( “%d”, ,1. 打印正方图形程序,规律:打印平面二维图形,要用双重循环,外循环控制行数,

25、内循环控制列数。,2020/7/5,44,思考:,* * * *,输入n=4, 如何输出以下图形?,* * * *,* * * *,* * * * * *,打印其它图形程序,* * * * * * *,2020/7/5,45,输入n=4, 输出以下图形,* * * *,2. 打印三角形,寻找规律: 1. 外循环控制行数, for(i=1;i=n;i+) 外循环内包含两个内循环 2. 内循环1控制每行空格数 for(j=1;j=40-2*i;j+) printf(“%c”. ); 3. 内循环2控制每数行*数(列数) for(j=1;j=2*i-1;j+) printf(“%2c”. *); 4

26、. 每行结束时有一个换行n,2020/7/5,46,输入n=4, 输出以下图形,* * * * * * * * * * * * * * * *,打印三角形程序,main( ) int i, j, n; printf(“nInput n : ”); scanf(“%d”, ,可将*换成64+i,2020/7/5,47,输入n=4, 输出以下图形,3. 打印菱形程序,main( ) int i, j, n; printf(“nInput n : ”); scanf(“%d”, ,* * * * * * *,1jk-4.c,2020/7/5,48,4. 打印九九表,打印表头,外循环控制9行 内循环控

27、制9列,2020/7/5,49,九九表输出结果,2020/7/5,50,6 几种循环结构比较,6 几种循环结构比较,在使用循环结构时应注意: 1. 三种循环结构可以相互嵌套组成多重循环。循环之间可以并列,但不能交叉。 2. 可以用无条件转移语句goto使程序流程从循环体内跳转出循环体外,但不能从循环体外转向循环体内。 3. 在循环程序中应避免出现死循环,即应保证循环变量的值在运行过程中得到修改,以便循环条件最终为假,以结束循环。,2020/7/5,51,辗转相除法 已知两个数m和n,假定mn,则求m%n,若余数r 为0,则n即为是所求,若余数r不为0,用r除n,再求 其余数直到余数为0,则除数

28、就是最大公约数。,如求76 与 64的最大公约数,r=76%64 , r 的值为12 r不为0,r=64%12 , r 的值为4 r不为0,r=12%4 , r 的值为 0,76与64的最大公约数为4,7 应用实例,7 应用实例 1. 程序举例: 求两个数的最大公约数,2020/7/5,52,程序如下,main( ) int x,y,t,r; scanf(“%d,%d”, ,输入64,76,交换x,y,条件是:余数不为0,除数做被除数,余数做除数,2020/7/5,53,因为循环次数及条件在程序运行中才能确定,故 选用while( )或do-while( )语句,while(fabs(t)=1

29、e-6),2. 程序举例:求的近似值,其中, fabs(t)为绝对值函数, fabs(t)=1e-6为判断当前项t的绝对值是否大于1e-6。,include main() int s; float n, t, pi; t=1;pi=0;n=1.0;s=1; while(fabs(t)=1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(“pi=%10.6fn”,pi); ,运行结果: pi= 3.14159,/*准备好第一项t =1,其它初始化*/ /*判断当前项t绝对值是否大于1e-6*/ /*将当前项值加到结果近似值上*/ /*准备处理下一

30、项分母*/ /*处理符号*/ /*计算新的当前项值*/,程序如下,2020/7/5,55,例 : 从键盘输入一个大于2的整数n,判断n是不是素数。,问题分析与算法设计:,3. 程序举例 判断n是不是素数,素数是仅能被1和它自身整除的整数。 判断一个整数n是否为素数的方法:判断整数n能否被除1和自身之外的任意整数整除,若都不能整除,即n为素数,否则,不是素数。 可以让i从2开始,到该整数的n-1为止,用i依次去除需要判断的整数,只要有一个数能整除该数,即可确定该整数不是素数。,2020/7/5,56,算法如下,k=n-1; flag=1; /* flag=1 ,假定n 是素数 */ for (i

31、=2; i=k; i+) if (n%i=0) flag=0; break; /* 有一数能整除就不是素数, 不再循环 */ ,include include main() int n, k, i, flag; do printf(Input a number: ); scanf(%d, ,运行结果: Input a number: 35 35 is not a prime number.,程序如下,2020/7/5,58,4. 程序举例 求斐波那契数列1,1,2,3,5,8,13 的前40项值。,分析: 斐波那契数列第一、二项为1,第三项开始,每一项为前两项之和,由于数值上升很快,到第40项

32、将远远超过32767。因此每一项不应该用int类型而用long int型。同理,在输出时也不能用“%d”形式,而应用“%ld”形式。此外在输出时一行不可能输出40个值,我们采用if语句,使它打印出四个数据之后换行。,第四章(数组)还需涉及斐波那契数列,main( ) long int f1=1, f2=1,f; int i; printf(%12ld%12ld,f1,f2); for (i=3; i=40; i+) f=f2+f1; printf(%12ld, f); if(i%4=0) printf(n); f1=f2; f2=f; ,程序如下(FEBO0.C),2020/7/5,60,8

33、本章小结,8 本章小结,1. 语言提供了三种循环控制结构,for、while和do-while循环结构,各有自己的使用特点。三种循环语句可以相互嵌套组成多重循环。 2. 循环之间可以并列但不能交叉。可用转移语句把流程转出循环体外,但不能从外面转向循环体内。,2020/7/5,61,一. 循环的概念:满足条件重复执行一条语句。,二. 循环结构的表达方法:四种语句 if-goto, while( ), do -while( ), for( ) 。,三. 边界条件的处理(自增,自减在循环条件 中的使用),四. break与continue 的作用和区别。,循环要点,2020/7/5,62,上机与作业

34、,第六章 循环控制结构程序设计必做题 1. 求1-3+5-7+ -99+101的值。 2. 输入10个数,输出正、负数的和及10个数的总和。 3. 输入n,输出x数列的前n项。 4. 编写程序,输入n,输出2n-1行菱形, 如n=4图形如右: 5. 用40元买苹果、西瓜和梨共100个,已知苹果0.4元一个,西瓜 4元一个,梨0.2元一个,各可以买多少个?,a,2020/7/5,63,上机与作业三选做题,第六章 循环控制结构程序设计选做题 1. 水仙花问题 输出所有的“水仙花数”。 所谓“水仙花数”是一个3位数,其各位数字的立方和等于该数本身。例如,153是 “水仙花数”,因为153=13+53

35、+33。 2. 完全数问题 编程输出1000以内的所有 “完全数”。 所谓“完全数”是该数恰好等于它的全部因子之和。例如,6的因子是1,2,3,恰好6 =1+2+3 ,因此 6是“完全数” 。,2020/7/5,64,E N D,交作业注意事项,1. 只收word文件,其它如txt文件或文件夹均退回重做。 2. word文件名格式:如: 090104011001-自动化1班-段均波(作业3).doc 3. 作业内容,每道题都要有:题目、程序和运行结果。 4.,学号-班号-姓名(作业号).doc,先将程序编写在稿纸上,第5周上机调试运行得到正确结果。,作业三习题解答 1. 求1-3+5-7+ -

36、99+101的值。,程序如下: main( ) int n,k,sum; k=1; sum=0; for(n=1;n=101;n+=2) sum=sum+k*n; k=-k; printf(sum=%dnn,sum); getch( ); ,程序执行输出结果如下: sum=51,2. 输入10个数,输出正负数的和及10个数的总和。,程序如下: main( ) int i,n,s1,s2,sum; s1=s2=0; printf(Input 10 number :n); for(i=1;i0) s1+=n; else s2+=n; sum=s1+s2; printf(s1=%d,s2=%d,sum=%dnn,s1,s2,sum); getch( ); ,程序执行输出结果如下: Input 10 number : 1 2 3 4 5 -9 -8 -7 -6 -5 s1=16, s2=-35, sum=-19,7. 输入n,输出x数列 的前n项。,main( ) long x,x1=1,x2=2,x3=3;int n,i,j; printf(Input n : ); scanf(%d, ,程序执行输出结果如下: Input n : 15 1 2 3 6 11 20 37 68 125 230 423 778 1431 2632 4841,9. 用40

温馨提示

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

评论

0/150

提交评论