西建大 环境学院C语言PPT5.ppt_第1页
西建大 环境学院C语言PPT5.ppt_第2页
西建大 环境学院C语言PPT5.ppt_第3页
西建大 环境学院C语言PPT5.ppt_第4页
西建大 环境学院C语言PPT5.ppt_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 循环结构程序设计,C 语言程序设计,本章主要内容,为什么需要循环控制 用while语句实现循环 用do-while实现循环 用for语句实现循环 循环的嵌套 几种循环的比较 改变循环执行的状态 循环结构程序设计举例,在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题,5.1 为什么需要循环控制,例如:全班有50个学生,统计各学生三门课的平均成绩。,scanf(“%f,%f,%f”,输入学生1的三门课成绩,并计算平均值后输出,scanf(“%f,%f,%f”,输入学生2的三门课成绩,并计算平均值后输出,要对50个学生进行相同操作,重复50次,使用循环结构:,i=1; whil

2、e(i=50) scanf(“%f,%f,%f”, ,大多数的应用程序都会包含循环结构 循环结构和顺序结构、选择结构是结构化程序设计的三种基本结构,它们是各种复杂程序的基本构造单元,5.2 用while语句实现循环,语句一般格式 while (表达式) 语句,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句 是循环重复执行的部分,功能:,计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。,循环控制条

3、件,循环体,例如:,【例5.1】编写程序,求100个自然数的和 即: s=1+2+3+ +100,思路:寻找加数与求和的规律,加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。 求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。,算法和程序:,main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum); ,程序输出结果: sum=5050,i: 循环控制变量 sum: 累加器,注意:,循环体如果包括一个以上的语句,应该用花括号括起来,作为复合

4、语句。如果不加花括号,while语句的范围只到while后面的第一个分号处。 不要忽略给i和sum赋初值,否则他们的值是不可预测的,结果不正确。 在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。如i+,5.3 用do-while语句实现循环,语句一般格式 do 语句 while (表达式); 功能: 先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。,do-while循环的算法,N-S结构图,main( ) int i=1,sum=0; do sum=sum+i; i+;

5、while (i=100); printf(%dn,sum); ,用do-while语句 求100个自然数的和,说明:,while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构,区别: do- while 语句先执行循环体再判断条件,循环体至少执行一次; while 语句先判断条件再执行循环体,循环体有可能一次也不执行,while和do-while循环的比较。,int i,sum=0; printf(“i=?”); scanf(“%d”,int i,sum=0; printf(“i=?”); scanf(“%d”,当while后面的表达式的第一次的值

6、为“真”时,两种循环得到的结果相同;否则不相同,5.4 用for语句实现循环,语句一般格式 for (表达式1;表达式2;表达式3) 语句,功能: 计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。,循环初始条件,循环控制条件,循环体,for语句的算法,例如: main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(sum=%dn,sum); ,可部分或全部省略,但“;”不可省略,省略for语句的表达式,

7、表达式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),会无限循环(死循环),注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行, 省略表达式1和表达式3,即: for(;表达式2;) 就等同于:while( 表达式2 ) 省略表达式2,即: for(表达式1; ;表达式3) 就等同于:表达式1; while(1)表达式3;,例如:, i=1; for ( ; i100) for (i=1; i100) i+; ,省略表达式1,省略表达式2,省略表达式3,省略表达式1,2,3,表达式1可是是设置循环变量初值的赋值表达式,也可以是逗号表

8、达式。见 P123 表达式1和3可以使一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式。 表达式2一般为关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非0,就执行循环体。 for(i=0;(c=getchar()!=n;i+=c);,说明:,所有用 while 语句实现的循环都可以用for 语句实现。,等价于:,for(表达式1;表达式2 ;表达式3) 语句;,表达式1; while (表达式2) 语句; 表达式3; ,for语句的简单应用,【例5.4】求n! ,即计算p=123n的值。,思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。,设

9、置: 乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入) 累乘器 p ,每次循环令p = p*i,程序:,int main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d, ,思考: 如何输出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,原码、反码和补码,正数:原码、反码、补码相同 符号位为0,数值为对应的二进制数。 109,01101101原 = 01101101反 = 01101101补 负数: 原码符号位为1,数值为绝对值的二进制数。 10911101101原 反码符号位为1,数值为绝对值的

10、二进制数各位变反。 10910010010反 补码符号位为1,数值为绝对值的二进制数各位变反加1。 10910010011补,上次课重点回顾,条件运算符:? : (必须同时使用,相当于if语句) 条件表达式的一般形式 表达式1 ? 表达式2 : 表达式3 先求解表达式1的值如果为真,则求解求解表达式2。 若为假,则求解表达式3的值 条件运算符优先级高于赋值、逗号运算符,低于其他运算符 .条件运算符具有右结合性。当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,Switch实现多分支选择,switch语句的一般形式 switch (表达式) case 常量表达式1:

11、 语句序列1;break; case 常量表达式2: 语句序列2; break; case 常量表达式n: 语句序列n; break; default : 语句序列n+1 ,循环结构程序设计:,while 语句一般格式 while (表达式) 语句 do while语句一般格式 do 语句 while (表达式);,当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则不相同,for语句一般格式 for (表达式1;表达式2;表达式3) 内嵌语句,计算表达式1的值, 判断表达式2,如果其值为非0(逻辑 真),则执行内嵌语句。否则跳出执行后续语句。 计算表达式3; 再去判断

12、表达式 2 for(i=1;i=100;i+) 执行后续语句。 sum=sum+i ;,5.5 循环的嵌套,如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套 (P125) 例如: #include int main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (%4dn,i*j); return 0; ,外循环语句,内循环语句,注意:,while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。 多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。

13、 例如:,for(a=1;a=10;a+) for (b=0;b=5;b+) ,外循环执行了10次,内循环执行6次 循环正常结束时,内循环执行了106=60次,5.6 几种循环语句的比较,3种循环都可以用来处理同一问题。 while和do-while语句的表达式只有一个,for语句有三个。 while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。 do-while语句的while后面需要注意有分号(;)。,while语句多用于循环次数不定的情况 do-while语句多用于至少要运行一次的情况 for语句多用于要赋初值或循环次数固定的情况,5.7 改变循环

14、执行的状态,有如下三种语句实现跳转: continue语句 break语句 在循环语句的循环体中使用,可以进行循环的流程控制,5.7.1 用break语句提前终止循环,功能: 利用break语句能够强迫终止本层循环,转到后续语句执行。,while语句,do-while语句,for语句,例如:, int x,n=0,s=0; while (n10) scanf(%d, int x,n=0,s=0; do scanf(%d, for (n=0,s=0; n10; n+ ) scanf(%d, ,5.7.2 用continue语句提前结束本次循环,功能: 中断循环体的本次执行(即跳过循环体中尚未执行

15、的语句),立即开始执行下一次循环。,while语句,do-while语句,for语句,例如:, int x,n=0,s=0; while (n10) scanf(%d, int x,n=0,s=0; do scanf(%d, for (n=0,s=0; n10; n+) scanf(%d, ,5.7.3 break语句和continue语句的区别,continue语句只结束本次循环,而不是终止整个循环的执行 break语句结束整个循环过程,不再判断执行循环的条件是否成立,while(表达式1) if (表达式2) break; ,while(表达式1) if (表达式2) continue;

16、,例5.6 输出以下4*5的矩阵。 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20,解题思路: 可以用循环的嵌套来处理此问题 用外循环来输出一行数据 用内循环来输出一列数据 按矩阵的格式(每行5个数据)输出,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,控制一行内输出5个数据,#include int main() int i,j

17、,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,双重循环,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,控制输出4行,#include int main() int i,j,n=0; for (i=1;i=4

18、;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,控制每行中输出5个数据,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,i=1时,j由1变到5 i*j的值是1,2,3,4,5,#include int main() int i,j,n=0; fo

19、r (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (n); printf (%dt,i*j); printf(n); return 0; ,i=2时,j也由1变到5 i*j的值是2,4,6,8,10,如何修改程序,不输出第三行?,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,if (i=3 ,遇到第3行第1列,终止内循

20、环,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,if (i=3 ,原来第3行第1个数据3没有输出,5.8 循环程序设计举例,【例1】按每行输出5个数的形式输出Fibonacci数列的前40项 。,思路:Fibonacci数列的前几项是:1、1、2、3、5、8、13、21、34、。此数列的变化规律是:,设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第

21、3项; 将f1f2, f2f3,再求f3=f1+f2得到第4项; 依此类推求第5项、第6项,这是一种递推算法 应采用循环实现,算法和程序,#include int main( ) int i,f1,f2,f3; f1=f2=1; printf(%12dn%12dn,f1,f2); for (i=1; i=38; i+) f3=f1+f2; f1=f2; f2=f3; printf(%12ld,f3); if (i%5=0) printf(n); return 0; ,举例2,【例2】 判断输入一个大于3的整数n,是否为素数。若是素数,输出“YES”,若不是,输出“NO”。,思路:素数是指只能被

22、1和它本身整除的数,如5、7、11、17、等。,分别用2、3、,n-1尝试能否整除整数n。如果n能被某个数整除,则n就不是素数。,设除数为j,从2循环到n-1,算法和程序:,#include “stdio.h int main( ) int j,m,k; printf(Enter an integer number: ); scanf(%d, ,【例3】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。,举例3,算法和程序,#include int main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) co

23、ntinue; printf(%6d,n); j+; if (j%10=0) printf(n); printf(j=%dn,j); return 0; ,for语句一般格式 for (表达式1;表达式2;表达式3) 内嵌语句,计算表达式1的值, 判断表达式2,如果其值为非0(逻辑 真),则执行内嵌语句。否则跳出执行后续语句。 计算表达式3; 再去判断表达式 2 for(i=1;i=100;i+) 执行后续语句。 sum=sum+i ;,上次课重点回顾,while(表达式1) if (表达式2) break; ,while(表达式1) if (表达式2) continue; ,【例4】编程序求

24、210000以内的完全数。,完全数:一个数的因子(除了这个数本身)之和等于该数本身。,思路: 设定i从2变到10000,对每个i找到其因子和s; 判定 is?若相等,则i为完全数,否则不是。,例如:6的因子是1、2、3,因子和 1+2+36 因此 6 是完全数,用双层循环实现,举例4,算法和程序:,int main( ) int i,j,s; for (i=2; i=10000; i+) s=0; for (j=1; ji; j+) if (i%j=0) s+=j; if (i=s) printf(%6dn,s); return 0; ,举例5,【例5】编程序,输出以下图形。,* * * *,

25、一共有4 行,每行由空格和星号组成:空格数按行增加,星号按行减少 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的空格和星号: j 从1变化到 i,每次输出一个空格 j 从1变化到 8-2*i1,每次输出一个星号,使用双重循环实现,思路:,算法和程序:,#include int main( ) int i,j; for (i=1; i=4; i+) for (j=1; j=i; j+) printf( ); for (j=1;j=8-(2*i-1);j+) printf(*); printf(n); return 0; ,“水仙花数”-narcissus numbers 输出所有的水仙花数,三位数(大于等于100小于1000). 例如:153 各位数字立方和等于该数本身。 13+53+33=153 百位数:153/100=1 十位数: 153/10-1*10=5 个位数:153%10=3 (求余数),举例6,例5.7用 公式求 的近似值,直到发现某一项的绝对值小于10-6 为止(该项不累计加)。,举例7,解题思路: 求 近似值的方法很多,本题是一种 其他方法:,每项的

温馨提示

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

评论

0/150

提交评论