C语言中 循环结构_第1页
C语言中 循环结构_第2页
C语言中 循环结构_第3页
C语言中 循环结构_第4页
C语言中 循环结构_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章 循环控制结构,1,本章知识点,while语句的一般形式及应用 for语句的一般形式及应用 do.while语句的一般形式及应用 多重循环结构的使用 break语句和continue语句,2,5.1 while语句,语句的一般形式如下: while (表达式) 循环体语句 说明:while语句属于“当型”循环,图5.1 while语句流程图,说明: (1)while是关键字。while后圆括号内的表达式一般是关系表达式或逻辑表达式,但也可以是c 语言中任意合法的表达式。 (2)循环体语句可以是一条语句,也可以是多条语句,如果循环体语句包含多条语句,则需要用一对花括号“”把循环体语句括起来

2、,采用复合语句的形式,while (表达式) 循环体语句,例5.1】 求前100个自然数的和,include int main() int n,sum; n=1;sum=0; /*变量赋初值*/ while (n=100) sum=sum+n; /*累加求和*/ n+; /*修改基本数据项n*/ printf(sum=%dn,sum); return 0;,5,需要注意的几个问题: (1)累加求和算法。这个程序采用的算法思想称为累加求和,即:不断用新累加的值取代变量的旧值,最终得到求和结果,变量sum也叫“累加器”,初值一般为0。 (2)必须给变量赋初值。 (3)正确判断条件的边界值。 (4)

3、 避免出现“死循环”。 (5)可能出现循环体不执行。 (6)while后面圆括号内的表达式一般为关系表达式或逻辑表达式,但也可以是其它类型的表达式,例5.2】 使用while语句求n,include int main() int n,i=1; double sum=1; printf(请输入一个正整数:); scanf(%d,7,循环三要素之间的关系。 循环变量赋初值、判断控制表达式和修改循环变量是所谓的“循环三要素”。 一般来说,进入循环之前,应该给循环变量赋初值,确保循环能够正常开始;在控制表达式中判断循环变量是否达到循环的终止值;在循环体中对循环变量进行修改,以使循环正常的趋向终止。在编

4、写程序时要注意他们的位置关系,例5.3】编写程序,输入一个字符序列,直至换行为止,统计出大写字母、小写字母、数字、空格和其他字符的个数,int main() char ch; int a,b,c,d,e; a=b=c=d=e=0; while(ch=getchar()!=n) if(ch=a,9,5.2 for语句,for语句的一般形式如下: for(表达式1;表达式2;表达式3) 循环体语句 说明:for语句属于“计数”型循环,11,for语句流程图,for语句最常用、最简单的形式,for(循环变量赋初值;循环条件;循环变量增值,12,例5.1】 求前100个自然数的和,include in

5、t main() int n,sum=0; for (n=1;n=100;n+) sum=sum+n; printf(sum=%dn,sum); return 0;,例5.4】设n=30,编写程序,计算并输出s(n)的值。 s(n)=(1*2)/(3*4)-(3*4)/(5*6)+(5*6)/(7*8)+(-1)(n-1)*(2n-1)*2n/(2n+1)*(2n+2),include #include int main() int n; float s=0; for(n=1;n=30;n+) s=s+pow(-1),(n-1)*(2*n-1)*2*n)/(2*n+1)*(2*n+2); pr

6、intf(s(n)=%f,s); return 0;,13,关于for语句的几点说明: (1)循环体语句可以是简单语句也可以是使用一对花括号括起来的复合语句。如果是一个语句,也可以和for写在一行上,这样使程序看起来更加简洁;如果循环体包含多条语句,最好是另起一行,采用一对花括号括起来的复合语句形式,增加程序的可读性。 (2)表达式的省略。for语句中的三个表达式均可以省略,但是两个分号不能省略,for(循环变量赋初值;循环条件;循环变量增值,for(表达式1;表达式2;表达式3) 循环体语句,例5.5】编写程序,输出所有的水仙花数。水仙花数是指一个3位数,其各位数字的立方和等于该数本身。例如

7、:153=13+53+33=153,所以153就是水仙花数,int main() int a,b,c,i; for(i=100;i=999;i+) a=i/100; b=i/10%10; c=i%10; if(i=a*a*a+b*b*b+c*c*c) printf(%dn,i); printf(n,15,例5.11】判断m是否为素数。程序分析:所谓素数,就是一个正整数,除了本身和1 以外并没有任何其他因子。例如 2,3,5,7 就是素数,int main() int m,i,k,flag; /*定义标志变量*/ scanf(%d,16,5.3 dowhile语句,for语句的一般形式如下: d

8、o 循环体语句 while表达式; 说明:do while语句属于“直到型”循环,1)dowhile语句中“while表达式;”后面的分号是不能省略的,这一点是和while语句不一样的。 (2)dowhile语句是先执行循环体语句,后判断表达式,因此无论条件是否成立,将至少执行一次循环体。而while语句是先判断表达式,后执行循环体语句,因此,如果表达式在第一次判断时就不成立,则循环体一次也不执行,注意: (1)在计算机解决实际问题时,常常会用到类似本程序的“穷举法”。“穷举法”解决的问题一般具有这种特点:如果问题有解,一组或多组,必定全在某个集合中;如果这个集合内无解,集合外也肯定无解。这样

9、,在解决问题时,就可以将集合中的元素一一列举出来,验证是否为问题的解。本题就是一一验证100999之间所有的数,最终找出答案。 (2)程序中在做是否相等关系判断(“i=a*a*a+b*b*b+c*c*c)使用到了关系运算符“=”,而不是“=”,后者是赋值运算符,在c语言中这两种运算符形式是不一样的,要注意区别,20,图5.5 dowhile语句流程图,while语句和dowhile语句的比较,一般来说,对于同一个问题,使用while语句或dowhile语句结果是一样的,但有时并不一样,比较以下两段程序,21,include int main() int n,sum=0; scanf(%d,in

10、clude int main() int n,sum=0; scanf(%d,int main() char c; do c=getchar(); while(c!=a); printf(校验成功n); return 0;,例5.6】编写程序,实现对用户输入口令的校验。用户输入的口令如果与预设口令不一致,则需要重新输入,直到与预设口令一致为止,void main() double n=1.0,d=1.0,pi=0.0; int sign=1; do pi=pi+d; n=n+2; sign=-sign; /*改变数据项的符号*/ d=sign/n; /*求出数据项*/ while (fabs(

11、d)=1.0e-6); pi=4.0*pi; printf(pi=%10.7lfn,pi);,23,三种循环的比较: (1)while 和dowhile语句一般实现标志式循环,即无法预知循环的次数,循环只是在一定条件下进行;而for语句大多实现计数式循环。 (2)一般来说,while 和dowhile语句的循环变量赋初值在循环语句之前,循环结束条件是while后面圆括号内的表达式,循环体中包含循环变量修改语句;一般for循环则是循环三要素集于一行。因此,for循环语句功能更强大,形式更简洁,使用更灵活。 (3)while和for是先测试循环条件,后执行循环体语句,循环体可能一次也不执行。而do

12、while语句是先执行循环体语句,后测试循环条件,所以循环体至少被执行一次,5.4 多重循环结构,嵌套循环,并列循环,交叉循环(错误,循环的嵌套是指一个循环语句的循环体内完整的包含另一个完整的循环结构。前述三种循环结构(while循环、for循环、do-while循环)可以任意组合嵌套。循环的嵌套有双重循环嵌套和多重循环嵌套。但一般使用两重或三重的比较多,若嵌套层数太多,就降低了程序的可读性和执行效率。如果是多重循环,外循环和内循环应选用不同的循环控制变量,26,双重循环嵌套:嵌套层次数为2层的循环嵌套 执行过程是:首先进行外层循环的条件判断,当外层循环条件成立时顺序执行外层循环体语句,遇到内

13、层循环,则进行内层循环条件判断,并在内层循环条件成立的情况下反复执行内层循环体语句,当内层循环因循环条件不成立而退出后重新返回到外层循环并顺序执行外层循环体的其它语句,外层循环体执行一次后,重新进行下一次的外层循环条件判断,若条件依然成立,则重复上述过程,直到外层循环条件不成立时,退出双重循环嵌套,执行后面其它语句,例5.8】编写程序,输出1000以内所有的完数。如果一个整数的因子之和等于这个数本身,这个数就被称为完数。例如:1、2、3是6的因子,并且6=1+2+3,所以6是完数,程序分析:此题应该分成两步来做。 第一步:判断一个数n是否为完数。可以定义一个变量s作为“累加器”,此问题仍然需要

14、用前面讲过的 “穷举法”,从1n-1逐一去除n,如果能除尽,就说明是n的因子,把它累加到s上。可以选用for循环。 第二步:外层循环对1000以内的所有正整数一一进行判断,利用第一步的方法,逐个判断n的因子之和s是否等于n。若相等,则显示输出。同样选用for循环,28,include int main() int i,n,s; for(n=2;n=1000;n+) /*外循环*/ s=0; for(i=1;in;i+)/*内循环求出n的所有因子之和*/ if(n%i=0) s+=i; if(n=s) /*判断a是否等于所有因子之和*/ printf(%dn,n); return 0,例5.9】

15、打印九九乘法口诀表。 程序分析:乘法口诀表的形式如下: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=124*4=16 1*9=9 2*9=18 3*9=274*9=36 5*9=45 6*9=54 7*9=638*9=729*9=81,include int main() int i,j; for(i=1;i=9;i+) /*外循环控制输出行*/ for(j=1;j=i;j+) /*输出该行的内容*/ printf(%2d*%d=%2d,j,i,i*j); printf(n); /*每行结束后输出换行*/ return 0;,5.5

16、break语句和continue语句,5.5.1 break语句 break语句可以使流程跳出switch结构,它也可以用在while语句、for语句和dowhile语句中。可使程序跳出本层循环结构,接着执行循环体下面的语句。 其一般形式如下: break,33,例子:int r; float area,pi=3.14159; for(r=1;r100) break; printf(r=%d,area=%fn,r,area);,说明: (1)break语句只能用于while、for和dowhile循环语句以及switch语句中,不能用于其他语句。 (2)如果break语句用在多重循环结构体中,

17、使用break语句只能使程序退出break语句所在的最内层循环,5.5.2 continue语句 continue语句的作用是 结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环体的判断。 其一般形式如下: continue; continue语句只能用于循环结构中,int i,n,score; float sum=0,aver; printf(请输入学生的个数:); scanf(%d,35,例5.10】输入若干学生的成绩,求平均值,5.5 break语句和continue语句,continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是

18、否执行循环体的判断。其一般形式如下: continue; 注意:continue语句只能用于循环结构中,对于while和dowhile语句,continue语句使程序结束本次循环,跳转到循环条件的判断部分,根据条件判断是否进行下一次循环;对于for语句,continue语句使程序不再执行循环体中下面尚未执行的语句,直接跳转去执行“表达式3”,然后再对循环条件“表达式2进行判断”,根据条件判断是否进行下一次循环,5.6 应用程序举例,37,例5.12】从键盘输入两个正整数m和n,求它们的最大公约数和最小公倍数,方法一:根据最大公约数的数学定义,使用for循环查找即能整除m又能整除n的最大的数就是m、n的最大公约数。 int m,n,k,max,x,y,z; printf(input m and n:n); scanf(%d,方法二:辗转相除法。首先定义一个变量r,用来存储m除以n的余数。 step1:将两个数中的大者放在m中,小者放在n

温馨提示

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

最新文档

评论

0/150

提交评论