C语言程序设计教程第4章.ppt_第1页
C语言程序设计教程第4章.ppt_第2页
C语言程序设计教程第4章.ppt_第3页
C语言程序设计教程第4章.ppt_第4页
C语言程序设计教程第4章.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

第4章 循环结构,4.1 当型循环与直到型循环 4.2 for 循 环 4.3 循环的嵌套与其他有关语句 4.4 程序举例,4.1 当型循环与直到型循环,4.1.1 当型循环结构 当型循环结构的流程图如图4.1所示。,图4.1 当型循环结构流程图,返回目录,在图4.1中,条件在程序中一般是一个逻辑表达式,条件满足是指逻辑表达式的值为真。循环体可以是单个语句,也可以是由若干可执行语句组成的复合语句,它们是需要重复执行的操作。 当型循环的执行过程是:当条件满足(即逻辑表达式的值为真)时,执行循环体中所包括的操作,当循环体执行完后,将再次判断条件,直到条件不满足(即逻辑表达式的值为假)为止,从而退出循环结构。,实现当型循环结构的C语句形式为 while (表达式) 循环体语句 功能:当表达式值0时,执行循环体,执行完后继续判断表达式值,只有当表达式值0时才退出循环。,例4.2 从键盘输入各学生成绩,并对90分以上(包括90分)的学生人数进行计数,直到输入的成绩为负为止,最后输出成绩在90分以上的学生人数。,图4.3 例4.2的流程图,其流程图如图4.3所示。其中变量count为整型,用于对90分以上的学生人数进行计数。,相应的C程序如下: #include “stdio.h“ main() int count; float grade; count0; scanf(“%f“,&grade); while (grade0.0) if (grade90.0) countcount1; scanf(“%f“,&grade); printf(“count%dn“,count); ,4.1.2 直到型循环结构 直到型循环结构的流程图如图4.4所示。,图4.4 直到型循环结构流程图,直到型循环的执行过程是,首先执行循环体,然后判断条件(即计算逻辑表达式),如果条件满足(即逻辑表达式值为真),则退出循环结构;如果条件不满足(即逻辑表达式值为假),则继续执行循环体。 实现直到型循环结构的C语句形式为 do 循环体语句 while(表达式); 功能:先执行循环体,然后判断表达式值,若表达式值0,则再次执行循环体,如此循环,直到表达式值0为止。,例4.3 计算并输出下列级数和:,直到某项的绝对值小于 为止。,相应的流程图如图4.5所示。其中f用于改变每一项的符号,因为这是一个各项符号相间的级数。,图4.5 例4.3的流程图,相应的C程序如下: #include “stdio.h“ main() int k; double sum,d,f; sum1.0; k1;f1.0; do kk1;ff;d1.0/(k*(k1);sumsumf*d; while(d1.0e4); printf(“sum%lfn“,sum); ,4.1.3 当型循环结构与直到型循环结构的区别与联系 当型循环结构与直到型循环结构既有共同之处,又有区别。主要体现在以下几个方面。 (1)在当型循环中,其循环体可以一次也不执行(即执行当型循环结构的一开始,其条件就不满足)。 (2)不管是当型循环结构还是直到型循环结构,在循环体内部必须要有能改变条件(即逻辑表达式值)的语句,否则将造成死循环。 (3)对于有些问题既可以用当型循环结构来处理,也可以用直到型循环结构来处理。 (4)不管是当型循环结构还是直到型循环结构,其循环体如果包含一个以上的语句,应以复合语句形式出现。,4.2 for 循 环,C语言提供的for循环属于当型循环结构,其一般形式为 for(表达式1;表达式2;表达式3) 循环体语句(组) 它等价于下列的当型循环结构: 表达式1; while(表达式2) 循环体语句 表达式3; ,返回目录,下面对for循环语句作几点说明: (1)在for语句中,三个表达式中的任何一个表达式均可省略,但其中的两个“;”不能省略。 (2)下列两个循环都是死循环: for(表达式1;表达式3) 循环体 与 for(;) 循环体 因为它们都没有用于判断循环是否结束的条件(即表达式2)。 (3)for循环本质上也是当型循环结构,只不过它对于事先可以确定循环次数的问题特别方便。 (4)在for循环中,循环体也可以是复合语句(即用一对花括号 括起来的语句组)。,4.3 循环的嵌套与其他有关语句,4.3.1 循环的嵌套 所谓循环的嵌套是指一个循环体内又包含了另一个完整的循环结构。C语言允许循环结构嵌套多层。循环的嵌套结构又称为多重循环。,返回目录,例4.6 计算并输出10以内(包括10)所有自然数的阶乘值。即计算1!,2!,3!,4!,5!,6!,7!,8!,9!,10!。,采用的方法是,对于10以内的每一个自然数分别求它们的阶乘值。其流程图如图4.7所示。显然,这是一个二重循环结构。,图4.7 例4.6的流程图,相应的C程序如下: #include “stdio.h“ main() int n,k; double s; for (n1; n10; nn1) s1.0; for (k1; kn; kk1) ss*k; printf(“%2d!%16.7fn “,n,s); ,4.3.2 break 语句 C语言中的break语句有以下两个功能: (1)跳出 switch 结构; (2)退出当前循环结构,包括 while 结构、 dowhile 结构和for循环结构。,4.3.3 continue 语句 continue语句的功能是结束本次循环的执行,但不退出循环结构。 下面举两个例子来说明continue语句的使用。,例4.10 输出100200之间所有能被7或9整除的自然数。 相应的C程序如下: #include “stdio.h“ main() int n; for (n100; n200; nn1) if (n%7!0)&(n%9!0) continue; /*结束本次循环,继续进行下次循环*/ printf(“%d n“,n); ,实际上,上述程序等价于 #include “stdio.h“ main() int n; for (n100; n200; nn1) if (n%70) | | (n%90) printf(“%d n“,n); ,4.4 程序举例,4.4.1 列举算法 所谓列举算法,是指根据提出的问题,列举所有可能的情况,并根据条件检验哪些是需要的,哪些是不需要的。,返回目录,例4.11 某单位要在A,B,C,D,E,F 6人中选派若干人去执行一项任务,选人的条件如下: (1)若C不去,则B也不去; (2)C和D两人中去一个; (3)D和E要么都去,要么都不去; (4)A,B,F 3人中要去两个; (5)C和F不能一起去: (6)E和F两人中至少去一个。 问应该选哪几个人去?,C程序如下: #include “stdio.h“ main() int a,b,c,d,e,f; for (a0; a1; a) for (b0; b1; b) for (c0; c1; c) for (d0; d1; d) for (e0; e1; e) for (f0; f1; f),if (bc0 | | c1) & (cd1) & (de0 | | de2) & (abf2) & (cf!2) & (ef1) printf(“A will %s be assigned.n“,a?“: “not“); printf(“B will %s be assigned.n“,b?“: “not“); printf(“C will %s be assigned.n“,c?“: “not“); printf(“D will %s be assigned.n“,d?“: “not“); printf(“E will %s be assigned.n“,e?“: “not“); printf(“F will %s be assigned.n“,f?“: “not“); ,4.4.2 密码问题 在报文通信中,为使报文保密,发报人往往要按一定规律将其加密,收报人再按约定的规律将其解密(即将其译回原文)。,例4.13 从键盘输入一行字符,将其中的英文字母进行加密输出(非英文字母不用加密)。 C程序如下: #include “stdio.h“ main() char c; int k; printf(“input k:“); scanf(“%d“,&k); scanf(“%c“,&c); /*吃掉上次输入的回车符*/ cgetchar(); while(c!n) if (ca & cz) | | (cA & cZ) cck; if (cz | | (cZ & cZk) cc26; printf(“%c“,c); cgetchar(); ,4.4.3 对分法求方程实根 设非线性方程为 f (x)0 用对分法求在区间a,b上的实根。 具体方法如下: 从区间端点x0a出发,以h为步长,逐步往后进行扫描。 对于每一个被扫描的子区间xi,xi1(其中xi1xih)作如下处理: 若在子区间两个端点上的函数值f (xi)与f (xi1)同号,则说明在该子区间上没有实根,将扫描下一个子区间;否则说明在该子区间上至少有一个实根。此时就可以在该子区间上采用对分法进一步搜索实根。,对分法的基本过程如下: 取子区间xi,xi1的中点 如果f(x)与f(xi)同号,则令xix;否则令xi1x。 然后重复这个过程,直到满足条件 为止。其中为事先给定的精度要求。,图4.9 对分法求方程实根的流程图,对分法求方程实根的流程图如图4.9所示。,例4.15 用对分法求方程 f (x)x26x10 在区间10,10上的实根,即A10,B10。取扫描步长H0.1,精度要求 。,相应的C程序如下: #include “stdio.h“ main() int flag; double a10.0,b10.0,h0.1,x1,y1,x2,y2,x,y; x1a;y1x1*x16*x11.0; x2x1h;y2x2*x26*x21.0; while (x1b) if (y1*y20.0) x1x2;y1y2;x2x1h;y2x2*x26*x21.0; else flag0; while (flag0) x(x1x2)/2; if (fabs(x2x1)0.000001) printf(“x%11.7fn“,x); x1x0.5*h;y1x1*x16*x11.0; x2x1h;y2x2*x26*x21.0; flag1; ,else yx*x6*x1.0; if (y1*y0.0) x2x;y2y; else x1x;y1y; ,4.4.4 迭代法求方程实根 设非线性方程为 f (x)0 用迭代法求一个实根的基本方法如下: 首先将方程 f (x)0 改写成便于迭代的格式 x(x) 然后初步估计方程实根的一个初值x0,作如下迭代: ,n0,1,2, 直到满足条件 | | 或者迭代了足够多的次数还不满足这个条件为止。其中为事先给定的精度要求。,反映上述过程的流程图如图4.10所示。,图4.10 迭代法求方程实根流程图,例4.16 求非线性方程x1arctanx0 的一个实根。取初值x01.0,精度要求0.000001。并改写成如下迭代格式:,相应的C程序如下: #include “stdio.h“ #include “math.h“ main() int m; double x1.0,eps0.000001,x0; printf(“input m:“); scanf(“%d“,&m); /*输入最大迭代次数*/ do x0x;x1.0atan(x0);mm1; while (m!0)&(fabs(xx0)eps); if (m0) printf(“FAIL!n “); else printf(“x%11.fn“,x); ,4.4.5 牛顿法求方程实根 设非线性方程为 f (x)0 在选取一个初值x0后,牛顿迭代格式为 实际上牛顿迭代格式是一种特殊的简单迭代格式,相当于 上述迭代过程一直进行到满足条件 | | 或者迭代了足够多的次数还不满足这个条件为止。其中为事先给定的精度要求。,反映上述过程的流程图如图4.11所示。,图4.11 牛顿法求方程实根流程图,例4.17 求非线性方程x1cosx0的一个实根。取初值x01.0,精度要求0.000001。其牛顿迭代格式为 其中f (xn)xn1cos xn,f (xn)1sin xn。,相应的C程序如下: #include “stdio.h“ #include “math.h“ main() int m; double x1.0,eps0.000001,x0; printf(“input m:“); scanf(“%d“,&m); /*输入最大迭代次数*/ do x0x;xx0(x01cos(x0)/(1.0sin(x0);mm1; while (m!0)&(fabs(xx0)eps); if (m0) printf(“FAIL!n “); else printf(“x%11.fn“,x); ,4.4.6 梯形法求定积分 设定积分为 由微积分的知识可以知道,该积分值的几何意义是在区间a,b内的曲线f (x)下的面积,如图4.12所示。,图4.12 定积分几何意义,梯形法求定积分的基本思想是: 首先将积分区间a,bn等分,得到n个子区间xi, xi1(i0,1,2,n1),每一个子区间的长度为h(ba)/n,如图4.12所示,其中xiaih。 然后在每一个子区间上用梯形的面积 来近似代替该子区间上小长条的面积。 最后将所有小长条的面积近似值Si累加就可得到积分值的近似值。即 S

温馨提示

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

评论

0/150

提交评论