C语言循环结构程序设计.ppt

上传人:罗晋 文档编号:7203160 上传时间:2020-11-05 格式:PPT 页数:62 大小:544KB
返回 下载 相关 举报
C语言循环结构程序设计.ppt_第1页
第1页 / 共62页
C语言循环结构程序设计.ppt_第2页
第2页 / 共62页
C语言循环结构程序设计.ppt_第3页
第3页 / 共62页
C语言循环结构程序设计.ppt_第4页
第4页 / 共62页
C语言循环结构程序设计.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《C语言循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言循环结构程序设计.ppt(62页珍藏版)》请在三一文库上搜索。

1、循环的引入 for循环 while循环 do while循环 循环的比较 循环嵌套 break和continue语句 应用举例,第4章 循环结构程序设计,什么是循环? 为什么要使用循环?,问题1:,问题2:求学生平均成绩 分数相加后除以课数,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,4.1 循环的引入,4.1 循环的引入,循环结构的共同特点是:在给定条件成立的情况下,反复执行某段程序,直到条件不成立为止(结束循环)。我们将给定的条件称为循环条件,被反复执行的代码部分称为循环体。,4.2 for循环,for语

2、句基本形式为: for(表达式1; 表达式2; 表达式3) 循环体语句; ,For循环流程图,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,4.2 for循环,for语句的执行过程: (1) 先求解表达式1。 (2) 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。 (3) 求解表达式3。 (4) 转回上面第(2)步骤继续执行。 (5) 循环结束,执行for语句下面的一个语句,循环初始条件,循

3、环控制条件,循环体,for语句等价于下列语句: 表达式1; while (表达式2) 语句; 表达式3; ,for语句最简单的形式: for(循环变量赋初值;循环条件;循环变量增值),例如: for(i=1;i=100;i+) sum=sum+i;,相当于: i=1; while(i=100) sum=sum+i;i+;,用for语句 简单、方便。,例:用for语句求1100的和。 #include void main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(Sum = %dn,sum); 程序的运行结果: Sum = 5050,设置循环

4、条件,用for 语句实现循环,说明: (1) for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for(;i=100;i+) sum=sum+i; 执行时,跳过“求解表达式1”这一步,其他不变。,用for 语句实现循环,说明: (2) 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。 例如:for(i=1; ;i+) sum=sum+i; 表达式1是一个赋值表达式,表达式2空缺。它相当于: i=1; while(1) sum=sum+1;i+;,用for 语句实现循环,说明:

5、(3) 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如: for(i=1;i=100;) sum=sum+i;i+; 在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。,用for 语句实现循环,说明: (4) 可以省略表达式1和表达式3,只有表达式2,即只 给循环条件。如: for(;i=100;) while(i=100) sum=sum+i; 相当于 sum=sum+i; i+; i+; 在这种情况下,完全等同于while语句。可见for语句 比while语

6、句功能强,除了可以给出循环条件外,还可 以赋初值,使循环变量自动增值等。,用for 语句实现循环,说明: (5) 3个表达式都可省略,如: for(; ;) 语句 相当于 while(1) 语句 即不设初值,不判断条件(认为表达式2为真值), 循环变量不增值。无终止地执行循环体。,用for 语句实现循环,说明: (6) 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如: for (sum=0;i=100;i+) sum=sum+i; 表达式3也可以是与循环控制无关的任意表达式。,用for 语句实现循环,说明: 表达式1和表达式3可以是一个简单的表达式,也可以

7、是逗号表达式,即包含一个以上的简单表达式,中间用 逗号间隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i; 或 for(i=0,j=100;i=j;i+,j-) k=i+j; 表达式1和表达式3都是逗号表达式,各包含两个赋值 表达式,即同时设两个初值,使两个变量增值.,用for 语句实现循环,说明: 在逗号表达式内按自左至右顺序求解,整个逗号表达 式的值为其中最右边的表达式的值。如: for(i=1;i=100;i+,i+) sum=sum+i; 相当于 for(i=1;i=100;i=i+2) sum=sum+i;,用for 语句实现循环,说明: (7) 表达式一

8、般是关系表达式(如i=100)或逻辑表达式 (如ab (c=getchar()!=n;i+=c); 在表达式2中先从终端接收一个字符赋给c,然后判断 此赋值表达式的值是否不等于n(换行符),如果 不等于n,就执行循环体。 注意:此for语句的循环体为空语句,把本来要在循环 体内处理的内容放在表达式3中,作用是一样的。可见 for语句功能强,可以在表达式中完成本来应在循环体 内完成的操作。,用for 语句实现循环,说明: for( ;(c=getchar()!=n;) printf(%c,c); for语句中只有表达式2,而无表达式1和表达式3。 其作用是每读入一个字符后立即输出该字符,直到输入

9、 一个“换行”为止。请注意,从终端键盘向计算机输入 时,是在按Enter键以后才将一批数据一起送到内存缓 冲区中去的。,运行情况: Computer (输入) Computer (输出) 而不是 Ccoommppuutteerr,用for 语句实现循环,注意: C语言中的for语句比其他语言(如BASIC, PASCAL)中的FOR语句功能强得多。可以把循环体 和一些与循环控制无关的操作也作为表达式1或 表达式3出现,这样程序可以短小简洁。但过分 地利用这一特点会使for语句显得杂乱,可读性 降低,最好不要把与循环控制无关的内容放到 for语句中。,4.3 while循环,while语句的一般

10、形式为: while(表达式) 循环体语句; ,while循环流程图,用while语句实现循环,while语句用来实现“当型”循环结构。 一般形式: while (表达式) 语句 当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。,例:用while循环求1100的和。 #include void main() int i=1,sum=0; while(i=100) sum+=i; i+; printf(Sum = %dn,sum); 程序的执行结果: Sum = 5050,设置循环条件,控制循环次数,说明:(1)循环体如果包含一个以上的语句,应该用花括弧括

11、起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。,例:结果不可预知的累加求和。 #include void main() int i,sum=0; while(i=100) sum+=i; i+; printf(Sum = %dn,sum); ,使用while语句时,要确保循环控制变量在循环之前初始化,而在循环体内要有改变循环控制变量的语句,否则容易出现异常的错误或造成死循环。,未初始化循环变量,4.4 dowhile循环,dowhile语句的一般形式为: do 循环体语句; while (表达式);,Dowhile循环流程

12、图,用do-while语句实现循环,do-while语句的特点:先执行循环体,然后判断循环条件是否成立。 一般形式: do 循环体语句 while (表达式);,执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。,例:用dowhile循环计算1100的和。 #include void main() int i=1,sum=0; do sum+=i; i+; while(i=100); printf(Sum = %dn,sum); 程序的执行结果: Sum = 5050,Dowhile

13、表达式之后要加分号,4.5 循环的比较,4.5.1 for语句和while语句,for循环语句比较灵活,可以将循环控制变量初始、循环变量修改和循环控制表达式集中在一个for语句中,比较适合循环次数可预测的情况。while循环适合不通过递增或递减循环控制变量的循环。,标准的for语句 for (表达式1; 表达式2; 表达式3) 循环体语句; 可以替换成下面的while语句 表达式1; while (表达式2) 循环体语句; 表达式3; ,#include void main() int count_even=0,count_odd=0; int number; printf(Input a i

14、nt number(=0) if(number%2=0) count_even+; else count_odd+; printf(Input a int number(=0 to end):n); scanf(%d, ,例:使用while循环统计用户输入的整数中偶数和奇数的个数,判断是否为偶数,Input a int number(=0 to end): 45 Input a int number(=0 to end): 22 Input a int number(=0 to end): 34 Input a int number(=0 to end): 55 Input a int num

15、ber(=0 to end): -2 even number: 2 odd number: 2,运行结果,#include void main() int count_even=0,count_odd=0; int number=1; printf(Input a int number(=0; ) if(number%2=0) count_even+; else count_odd+; printf(Input a int number(=0 to end):n); scanf(%d, ,使用for循环实现奇偶数的统计,#include void main() int count_even=0

16、,count_odd=0; int number; do printf(Input a int number(0) if(number%2=0) count_even+; else count_odd+; while(number=0); printf(even number: %dn,count_even); printf(odd number: %dn,count_odd); ,使用dowhile循环实现奇偶数的统计,4.5.2 while语句和dowhile语句,当while后的条件表达式在第一次循环时就为假的话,while循环的循环体语句一次也不执行。 dowhile语句则不同,即使循

17、环条件不成立,循环体语句也会被执行一次。 在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。,例: while和do-while循环的比较 (1) #include (2) #include void main ( ) void main( ) int sum=0,i; int sum=0,i; scanf(“%d, ,运行结果: 1 sum=55 再运行一次: 11 sum=0,运行结果: 1 sum=55 再运行一次: 11 sum=11,说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二

18、者结果不相同。,4.5.3 数值输入中的问题,在实际编程中,往往要求用户输入一个指定范围内的数值,比如要输入某门课程的考试成绩,则成绩取值范围应该为0100。在程序中要求用户输入成绩时,要考虑到用户有可能会出现误操作,如输入一个负数或大于100的数,在这种情况下应该能够提醒用户重新输入直到用户输入一个正确数据为止。,例:要求用户输入一个0100的数,直到合法为止。 #include void main() int score=-1; printf(Input your score(0100):n); scanf(%d, ,清除缓冲区内容,4.6 循环嵌套,一个循环体内又包含另一个完整的循环结构

19、 称为循环的嵌套。内嵌的循环中还可以嵌套 循环,这就是多层循环。 三种循环(while循环、do-while循环和for循 环)可以互相嵌套。,循环的嵌套,下面几种都是合法的形式: (1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( );,循环的嵌套,(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ),几种循环的比较,(1)三种循环都可以用来处理同一问题,一般情况下它们可以互相代替。 (2)在while循环和do-while循环中

20、,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i+,或i=i+1等)。 for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。,几种循环的比较,(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。 (4)while循环、do-while循环和for循环,可以 用break语句跳出循环,用continue语句结束

21、本 次循环(break语句和continue语句见下节)。而 对用goto语句和if语句构成的循环,不能用 break语句和continue语句进行控制。,4.6 循环嵌套,4.6.1 三重循环求解,例:编程求解马克思手稿中的数学问题 马克思手稿中有下面的一道数学题,共有30个人,其中有男人、女人和小孩,他们在一家饭馆吃饭共花费了50先令,其中每个男人花费3先令,每个女人花费2先令,每个小孩各花1先令,问30个人中男人、女人和小孩各几人?,x+y+z=30 3x+2y+z=50,通过题意可以列出以上方程,#include void main() int x,y,z; printf(Man t

22、Women t Childrenn); for(x=0;x=30;x+) for(y=0;y=30;y+) for(z=0;z=30;z+) if(x+y+z = 30 ,程序运行结果 Man Women Children 0 20 10 1 18 11 2 16 12 3 14 13 4 12 14 5 10 15 6 8 16 7 6 17 8 4 18 9 2 19 10 0 20,4.6.2 缩小穷举范围,#include void main() int x,y,z; printf(Man t Women t Childrenn); for(x=0;x=16;x+) for(y=0;y

23、=25;y+) for(z=0;z=30;z+) if(x+y+z = 30 ,可以通过优化缩小搜索范围,4.6.3 两重循环解决问题,#include void main() int x,y,z; printf(Man t Women t Childrenn); for(x=0;x=16;x+) for(y=0;y=25;y+) z=30-x-y; if( 3*x+2*y+z =50) printf(%3d t %5d t %8dn,x,y,z); ,通过设置条件将三层循环改为两层循环,4.6.4 极限情况:一层循环的求解,#include void main() int x,y,z; pr

24、intf(Man t Women t Childrenn); for(x=0;x=0 ,优化方程式将两重循环缩减为一层循环,4.7 break和continue语句,4.7.1 break语句,break用于结束其所在层的循环,执行该层循环后面的语句,对外层循环没有影响。,break语句 break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句 一般形式: break; 注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。,#include void main() char c; while(1) c=getchar(); if(c=a ,程序

25、运行结果: abcdEFabc ABCD,遇到非小写字母强行跳出循环,例:将用户输入的小写字母转换成小写字母,break语句,例: float pi=3.14159; for(r=1;r100) break; printf(r=%f,area=%fn,r,area); ,程序的作用是计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。,4.7.2 continue语句,continue语句用于跳过本层循环体内continue语句之后的部分循环体,并开始下一轮循环,即只结束

26、本轮循环。,continue语句,作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定. 一般形式: continue;,例:输入十个整数,统计正数个数并计算正数的平均值,#include void main() int i,count=0,num; float sum=0; printf(Input 10 integers:n);,for(i=0;i10;i+) scanf(%d, ,程序运行结果: Input 10 integers: 3 2 5-4 -60 55 3 3 9 The number of plus integer is: 7 Average

27、 value: 11.43,判断是否为正数,4.8 应用举例,例:查找2100之间的所有素数并按每行5个打印输出,#include #include void main() int i,j; int find_num=0; int n; int is_prime;,标志变量,for(i=2;i=100;i+) is_prime=1; n=(int)sqrt(i); for(j=2;j=n;j+) if(i%j=0) is_prime=0; break; if(is_prime) printf(%4d ,i); find_num+; if(find_num%5=0) printf(n); ,设置

28、循环范围,每行数据量的显示限制,若不为素数则设标志位为0,程序运行结果:,break语句和continue语句,continue语句和break语句的区别 continue语句只结束本次循环, 而不是终止整个循环的执行。,while(表达式1) if(表达式2) continue; ,break语句和continue语句,continue和break的区别 break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,while(表达式1) if(表达式2) break; ,例:把100200之间的不能被3整除的数输出。 #include void main() int n; for (n=100;n=200;n+) if (n%3=0) continue; printf(%d ,n); ,说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1