项目3 项目菜单的选择执行ppt课件_第1页
项目3 项目菜单的选择执行ppt课件_第2页
项目3 项目菜单的选择执行ppt课件_第3页
项目3 项目菜单的选择执行ppt课件_第4页
项目3 项目菜单的选择执行ppt课件_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

1、工程3工程菜单的选择执行技艺目的会画程序的流程图或N-S构造图会用if-else实现分支构造和多分支构造的程序设计会用条件运算符进展分支构造的程序设计会用switch语句实现多分支构造的程序设计会用for语句、while语句、do-while语句进展循环构造程序设计会用break语句和continue语句知识目的掌握if-else语句的用法掌握条件运算符的运用掌握switch语句的用法掌握for语句、while语句和do-while语句的运用掌握循环的签套运用掌握break和continue语句的运用工程义务与解析本工程实现班级学生成果管理系统中用if语句实现菜单的选择执行、用switch语句

2、实现菜单的选择执行、用循环语句实现主菜单的选择执行。本工程包含下面几个义务:义务4:用if语句实现菜单的选择执行 义务5:用switch语句实现菜单的选择执行 义务6:用循环语句实现主菜单的选择执行 主要内容3.1 义务4:用if语句实现菜单的选择执行3.2 必备知识与实际3.3 扩展知识与实际3.4 义务5:用switch语句实现菜单的选择执行3.5 必备知识与实际3.6 扩展知识与实际3.7 义务6:用循环语句实现菜单的选择执行3.8 必备知识与实际3.9 扩展知识与实际3.1 义务4:用if语句实现菜单的选择执行1. 问题描画对显示的菜单,选择要执行的菜单序号,并显示要执行的菜单名。2.

3、 详细实现P41程序3. 知识分析在多数情况下顺序构造的程序是很少的,普通还包括分支和循环构造。分支构造还包括if-else构造和switch构造。我们首先来学习分支构造,在学习分支构造前了解一些算法的概念,关系运算符和逻辑运算符的运用。3.2必备知识与实际3.2.1 算法的概念1.算法算法就是程序处置问题的步骤与方法。 1976年瑞士计算机科学家Niklaus Wirth提出了一个著名的公式:算法 + 数据构造 = 程序2. 算法的特性 简单地说,算法就是进展操作的方法和操作步骤。例如,菜谱实践上是做菜肴的算法,乐谱实践上是演奏的算法,计算机程序是用某种程序设计言语描画的解题算法。通常以为算

4、法有如下一些性质:1有穷性 一个算法要在有限的步骤内处理问题(这里所说的步骤是指计算机执行步骤)。计算机程序不能无限地运转下去(甚至不能长时间地运转下去),所以一个无限执行的方法不能成为程序设计中的“算法。2确定性 确定性具有两重意义:一是所描画的操作该当具有明确的意义,不该当有歧义性。例如,不能发出这样的操作指令:“执行一个算术操作。由于它既没有指出算术操作的类型,也没有指出操作数。确定性的另一重意义: 操作作序列只需一个初始动作,序列中每一动作仅有一个后继动作; 序列终止表示问题得到解答或问题没有解答,不能没有任何结论。3有零个或多个输入 输入就是从外界获得必要的信息。一个算法可以有零个或

5、多个输入,例如:输入一个年份,判别其能否是闰年。同时一个算法可以没有输入,例如:计算出5!是多少。(4) 有一个或多个输出 算法的目的就求解,“解就是我们想要得到的最终结果。输出是同输入有着某些特定关系的量。一个算法得到的最终结果就是输出。没有输出的算法是没有意义的。(5) 可执行性一个算法该当是可以由计算机执行的,算法中描画的操作都是可以经过计算机的运转来实现。3.2.2 算法的表示方法 1. 自然言语表示算法 自然言语是相对于计算机言语而言的,是指人们在日常生活中运用的言语,如汉语、英语等。对于某些程序员来说,自然言语通俗易懂。但是,对于规模大、复杂的算法,运用自然言语来描画,往往很冗长,

6、不直观,而且容易发生歧义。比如对于以下这句话:假设A大于B,就给它加1。在了解时就能够出现歧义,是给A加1?还是给B加1。对于以上的一段话,假设我们用C言语进展编程那么为: if(AB) A=A+1; 正是由于自然言语描画算法具有的缺陷,所以在程序设计中很少有人运用。2. 传统流程图表示法 用一些图框表示各种操作,用线表示这些操作的执行顺序。我国国家规范GB 152689中引荐的一套流程图规范化符号,它与国际规范化组织ISO提出的ISO流程图符号是一致的。图3-1为其中常用的一些符号。过程判别数据预定义过程起止流程线衔接注释图3.2 常用的流程图规范化符号 平行四边形表示数据,其中可注明数据称

7、号、来源、用途或其它的文字阐明。处置矩形表示各种处置功能。例如,执行一个或一组特定的操作,从而使信息的值、信息方式或所在位置发生变化。矩形内可注明处置称号或其简要功能。预定义过程带有双竖边线的矩形,表示已命名的处置。该处置为在另外地方已得到详细阐明的一个操作或一组操作。例如库函数或其它已定义的函数等。矩形内可注明特定处置称号或其简要功能。判别菱形表示判别。菱形内可注明判别的条件。它只需一个入口,但可以有假设干个可供选择的出口,在对定义的判别条件求值后,有一个且仅有一个出口被选择。求值结果可在表示出口途径的流线附近写出。流线直线表示执行的流程。当流程自上向下或由左向右时,流程线可不带箭头,其它情

8、况应加箭头表示流程。端点。扁圆形表示转向外部环境或从外部环境转入的端点符。例如,程序流程的起、始点。注解。注解是程序的编写者向阅读者提供的阐明。注解符由纵边线构成,它用虚线衔接到被注解的符号或符号组上。 图3-2(a)、(b)、(c)中的虚线框,分别为用流程图表示的三种根本流程控制构造。S1S2S3PS1S2真假PS2假真a顺序构造 b选择构造 c反复构造 图3-2 用流程图描画的三种根本构造 例3-1 用流程图描画从三个数中取最大数的算法。从三个数中取最大数的算法思绪是:假定这三个数是a,b,c,那么首先可以比较a,b两数,从中选大者;然后再用这个大数与数c比较,从中取大者。这时得到的大数,

9、就是三个数中的最大数。这个算法用流程图描画如图3-3a所示。通常,求解一个问题的算法不是独一的。例如图3-3b也是一个三数中取大的算法。它的根本思绪是,先设max=第一个数,然后依次输入i个数,每输入一个数,与max比较一次,把大的放入max中。当输完i个数时,max中存放的就是这i个数中的最大数。这里,i是一个计数器,用于统计输入数的个数,所以每输入一个数,要执行一次自增操作。这个算法与图3-3a所示算法的不同在于: 算法构造不同:图3-3a所示算法采用了两个选择构造,而图3-3b所示算法采用了一个循环构造和一个选择构造。 算法的灵敏性不同:图3-3b中的算法可以用来求恣意个数中的最大数。a

10、=b输入a,b,cmax=a真假max=bmax=c真假输出max输出c开场终了i=maxmax=na一个三数中取大的算法 b另一个三数中取大的算法 图3-3 三数中取大算法的流程图描画 3. 用N-S流程图表示算法灵敏的流线是程序中隐藏错误的祸根。针对这一弊病,1973年美国学者I. Nassi和B. Shneiderman提出了一种无流线的流程图,称为N-S图。它的三种根本构造如图3-4所示。N-S图的每一种根本构造都是一个矩形框,整个算法可以像堆积木一样堆成。其中,a为三个操作组成的顺序构造;b为二分支的选择构造;c为当型反复构造,即当命题P 为“真时,就反复执行S。S1S2S3PS1S

11、2当PS假真c循环构造a顺序构造 b选择构造图3-4 用N-S图描画三种根本流程构造 图3-5a、b给出了用与图3-3a、b流程图对应的N-S图。a=bmax=amax=b输入a,b,c假真max=c输出max输出c真假当i=maxmax=n真假输入n初始化:max=0,i=1输出maxa采用选择构造 b采用循环构造 图3-5 三数中取大算法的N-S图描画 3. 用伪码表示算法伪代码(pseudo code)是用介于自然言语与计算机言语之间的文字符号算法描画的工具。它无固定的、严厉的语法规那么,通常是借助某种高级言语的控制构造,中间的操作可以用自然言语(如中文或英文),也可以用程序设计言语,或

12、运用自然言语与程序设计言语的混合体。普通专业人员习惯用伪代码进展算法描画。下面是与图3-3相对应的三数中取大算法的伪代码描画。 1与图3-3a相对应的三数中取大算法的伪代码描画:输入a,b,c;if(a=b)max=a;else max=bif(max=c) 输出max;else 输出c;2与图3-3b相对应的三数中取大算法的伪代码描画:初始化:mac=0,i=1;当i=max) max=n;)输出max;3.2.3 构造化程序设计构造化程序设计的根本思绪是:把一个复杂的问题的求解过程分阶段进展,每个阶段处置的问题都控制在人们容易了解的范围之内。采取以下的方法保证得到构造化的程序:自顶向下;逐

13、渐细化(求精);模块化设计;构造化编码。构造化程序具有如下的特征:一个程序单元由顺序、分支和循环这三种根本构造组成;一个大的程序由假设干个不同功能的小模块组成;每一个小模块只需一个入口和一个出口;3.2.4 命题与C言语中的逻辑值对选择构造、循环构造,流程的改动都是由判别决议的,即需求根据判别决议选择,根据判别决议能否循环以及循环的终了。通常,判别是针对命题的“真、“假进展的。例如,下面是一些命题: 行驶中前面的交通讯号灯是红色的。 今天下雨。 ab。 假设a不能被b整除。这些命题的值都只能是一个逻辑布尔值:“真或“假。早期的C言语不提供专门的逻辑布尔类型,规定用非0值表示“真,用0值表示“假

14、。在C99中,添加了_Bool类型,并添加了头文件,在其中定义了宏bool、true和false,用true存储1,用false存储0。3.2.5 关系运算与关系表达式 1. C言语的关系运算符关系运算是指对两个表达式值的大小比较。C言语中提供有如下6个关系运算符: (大于) =(大于或等于)(小于) =(小于或等于) =(等于)!=(不等于)后两个=和!=的优先级小于前4个,但它们都低于算术运算符,高于赋值运算符,并且它们结合方式都是从左向右的。 2. 关系表达式用关系运算符将两个表达式(可以是算术表达式、关系表达式,逻辑表达式,赋值表达式,字符表达式等)衔接起来的表达式,称为关系表达式。关

15、系表达式的值只需两个:关系表达式成立,即为“真通常为1;关系表达式不成立,即为“假(0)。 3.2.6 逻辑运算与逻辑表达式1. 逻辑运算符与优先级 C言语有三个逻辑运算符,它们是: & (逻辑与) |(逻辑或) !(逻辑非) &和|是二元运算符,结合方向为自左至右;!为一元运算符, 结合方向为自右至左。!的优先级高于&,&的优先级高于|。&和|的优先级低于关系运算符,而!的优先级高于关系运算符。 2. 逻辑表达式 用逻辑运算符将关系表达式或逻辑量衔接起来的表达式就 是逻辑表达式,逻辑表达式的值应该是一个逻辑量“真或“假。 逻辑运算中有很多有趣的规律,这种规律称为短路原那么。1. 在一个&表达

16、式中,假设&的一端为0,那么不用再计算另一端,该表达式的值一定为0(在C言语中由于&是从左向右结合的,所以只思索左端,即当&号的左端为0时,不再计算其右端),可以把它记为: 0 & a=02. 在一个|表达式中,假设|的一端为1,那么不用计算另一端,该|表达式的值必为1。现把它记为: 1|a=1 诸如此类关于表达式的值的规律有如下一些: 0|a=a1&a=a1|a=10&a=0 a|!a=1 0&!a=0 以及 a|a=aa&a=a!(a|b)=!a&!b!(a&b)=!a|!b !(!a)=a记住这些规律,能使复杂的逻辑运算简化、明晰。3.3 扩展知识与实际选择型程序描画了求解规那么:在不同

17、的条件下所应进展的相应操作。3.3.1 if(表达式) 语句这种语句的构造是: if (表达式) 语句它的执行流程是,当表达式的值为真时,执行“语句,否那么执行if语句后面的语句。 例3-4 输入三个数a,b,c,要求按由小到大的顺序输出。 我们只需把最小的数放到a上:先将a与b进展比较,假设ab那么将a与b的值进展交换,然后再用a与c进展比较,假设ac那么将a与c的值进展交换,这样能使a最小。对剩下的两个数,从小到大排序就容易了,该程序的N-S构造图如右图所示。3.3.2 ifelse构造 ifelse构造了一种二路分支的选择构造,它的格式如下: if (表达式) 语句1 else 语句2

18、这里,语句1和语句2就是两路分支。执行这个构造,首先对表达式进展判别,假设为“真(非零),就执行if分构造(语句1);否那么(值为0),就执行else分构造(语句2)。例3-5 求一个数的绝对值。 设有恣意数x,它的绝对值为 判别内容:x0能否成立。 两路分支:x=x (当x0) ; x= -x (当x0 ) C函数如下:double abstr (double x) if (x0.0) x=-x; else x=x; return (x);下面是函数abstr被调用执行的情况:#include int main(void) double a, abstr (double a); printf

19、 (Enter real number a please:); scanf (%1f,&a); printf (abstr(%1f)=%1 fn, a, abstr (a); rerurn 0;运转情况如下 Enter real number a please: -98.7654 abstr (-98.765400)=98.765400例3-6 求一元二次方程ax2+bx+c=0的根。 算法设计:一元二次方程式的根有以下情况: 当a=0,b=0时,方程无解; 当a=0,b0时,方程只需一个实根-c/b; 当a0时,方程的根为x=-bb2-4ac1/2/2*a。其中, 当b2-4ac0时有两个实

20、根;当b2-4ac0时,有两个虚根。图3-8为上述算法的N-S图表示,它把上述逻辑关系表示得更为明晰。b=0输出“无解输出单根:x=-c/b假真disc0输出两复数根输出两实根真假a=0真假 disc=b*b - 4*a*c图3-12 求一元二次方程根的算法include void solv_quadr_equa (float a, float b, float c) if (a=0.0) if (b=0.0) printf (no answer due to input errorn); else printf (the single root is %fn, -c/b); else dou

21、ble disc, twoa, term1, term2; disc=b*b-4*a*c; twoa=2*a; term1=-b/twoa; term2=sqrt (fabs (disc)/twoa; if (disc0.0 printf (complex root:n real part=%f,imag part=%fn, term1, term2); else printf (real root:n root1=%f, root2=%fn, term1+term2, term1-term2); 由此N-S图可以编写出以下的函数:3.3.3 if-else if构造if-else if是一种

22、多分支选择构造,用N-S图描画下右图所示,C言语中的格式如下左图所示:if(表达式1) 语句1else if(表达式2) 语句2else if(表达式n) 语句nelse 语句n+1语句1语句2语句3真假表达式1假真表达式2真假表达式3例3-7 根据百分制分数决议成果的等级: 90分以上为A级; 80分及以上,90分以下,B级; 70分及以上,80分以下,C级; 60分及以上,70分以下,D级; 60分以下,E级。以下图为用if-else if构造描画的上述规那么。3.4 义务5:用switch语句实现菜单的选择执行1. 问题描画对显示的菜单,选择要执行的菜单序号,并显示要执行的菜单名。2.

23、详细实现P54程序3. 知识分析分支构造程序设计除if-else构造外,还包括switch构造。Switch构造是一种多路分支的选择构造程序设计。switch是一种多分支选择构造,其方式如以下图左所示,N-S构造图如下右图所示。3.5 必备知识与实际switch(表达式) case 常量表达式1: 语句序列1 case 常量表达式2: 语句序列2 case 常量表达式n: 语句序列n default: 语句序列n+1这里,break语句的作用是中断该switch构造,即将流程转出switch构造。所以,执行switch构造的就相当于只执行与判别表达式相匹配的一个case子构造中的语句。其实,可

24、以将break看作为语句序列中必要的成分(位置在语句序列中的最后)。 switch(表达式) case 常量表达式1: 语句序列1 break; case 常量表达式2: 语句序列2 break; case 常量表达式n: 语句序列n break; default: 语句序列n+1 break;例3-11 根据百分制分数决议成果的等级:90分以上为A级;80分及以上,90分以下,B级;70分及以上,80分以下,C级;60分及以上,70分以下,D级;60分以下,D级。/* 按成果分等 */#include int main(void)float score;int grade;printf(输入

25、一个分数:);scanf(%f,&score);grade=score/10;switch(grade)case 10:case 9:printf(An);break;case 8:printf(Bn);break;case 7:printf(Cn);break;case 6:printf(Dn);break;case 5:case 4:case 3:case 2:case 1:case 0:printf(En);break;return 0;3.6 必备知识与实际 条件运算符是C言语中独一的三目运算符,即有三个参数参与运算。由条件运算符组成条件表达式的普通方式为: 表达式1 ? 表达式2 :

26、 表达式3 其求值规那么为:假设表达式1的值为真,那么把表达式2的值作为该条件表达式的值,否那么把表达式3的值作为该条件表达式的值。 条件运算符的优先级很低,仅仅比赋值操作符的级别高。其结合方式与赋值运算符一样是从右至左的。因此,表达式max=ab? ab相当于: max=(ab?a:b);3.6 扩展知识与实际3.7 义务6:用循环语句实现菜单的选择执行1. 问题描画对显示的菜单,选择要执行的菜单序号,并显示要执行的菜单名。2. 详细实现用for语句实现P60程序用while语句实现P61程序用dowhile语句实现P61-P62程序3. 知识分析循环构造程序设计包括while、do-whi

27、le和for循环三种构造,对知循环次数的循环多采用for循环;对循环次数不确定,循环首先执行一次的循环多采用do-while循环,而需求根据循环条件来确定循环能否要执行的,多采用while循环。3.8 必备知识与实际3.8.1 while构造while语句的普通方式为: while(表达式) 语句其中表达式是循环条件,语句为循环体。while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句;否那么跳过循环体,而执行该构造后面的语句。在进入循环体后,每执行完一次循环体语句后,再对判别表达式进展一次计算和判别。当发现判别表达式的值为0时,便立刻退出循环。 例3-12 兔子繁衍问题

28、。 著名意大利数学家Fibonacci曾提出一个有趣的问题:设有一对新生兔子,从第三个月开场它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子。 人们发现每月的兔子数组成如下数列: 1,1,2,3,5,8,13,21,34, 并把它称为Fibonacci数列。那么,这个数列如何导出呢?察看一下Fibonacci数列可以发现这样一个规律:从第3个数开场,每一个数都是其前面两个相邻数之和。这是由于,在没有兔子死亡的情况下,每个月的兔子数由两部分组成:上一月的老兔子数,这一月刚生下的新兔子数。上一月的老兔子数即其前一个数。这一月刚生下的新兔子数恰好为上上月的兔子数。由于上一月

29、的兔子中还有一部分到这个月还不能生小兔子,只需上上月已有的兔子才干每对生一对小兔子。 上述算法可以描画为 fib1=fib2=1 (1) fibn=fibn-1+fibn-2 (n=3) (2) 式(1)为赋初值,式(2)为迭代公式。用C言语来描画式(2)为:fib=fib1+fib2;fib1=fib2; /* 为下一次迭代作预备*/fib2= fib; 这里,fib1和fib2和不再仅代表第1个月和第2个月的兔子数,而作为中间变量,代表前两个月的兔子数,fib当前月的兔子数。下页图为Fibonacci算法的N-S图。表为迭代过程中fib1、fib2和fib的变化情形。图3.19 计算Fib

30、oonacci数列的N-S图当i=12fib1=fib2fib=fib1+fib2初值:fib1=1,fib2=1,i=3fib2=fib输出fibi+图3-12 计算Fiboonacci数列的N-S图 迭代次数3456789101112fib111235813213455fib2123581321345579fib23581321345579144表 按照迭代算法变量fib1、fib2和fib3的变化情形根据图3-12所示的算法。可以很容易地写出如下程序。/* 计算Fibonacci数 */#include int main(void) int fib1=1,fib2=1,fib,i=3;

31、while(i=12) fib=fib1+fib2; fib1=fib2; fib2=fib; i+; printf(“The Fibonacci number after 1 yer is:%dn,fib); return 0;例3-13 百钱买百鸡问题。 公元前五世纪,我国古代数学家张丘建在一书中提出了“百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几何?(1) 根本解题思绪 这是一个有名的不定方程问题:cocks+hens+chicks=100 (1)5*cocks+3*hens+chicks/3=100 (2) 式中:cocks:鸡翁数hens:鸡母数

32、chicks:鸡雏数 对上述不定方程问题,要先确定一个变量的值,才干对其进展求解。由问题中给出的条件,很容易得到三个变量的取值范围:cocks: 019中的整数(由于每只鸡翁5钱,因此它不能够超越19只)hens: 033中的整数chicks: 0100中的整数 根本的解题思绪是:依次取cocks值域中的一个值,然后求其他两数,看能否符合题意,符合者为解。这个根本解题思绪便是解此题的粗略算法,下面是它的伪代码描画,图3-13(1)为其N- S图。s1: cocks=0; /*赋初值*/s2: 当(cocks=19)s2.1: 找满足题意的hens, chicks;s2.2: cocks+;S3

33、:输出一组cocks,hens和chichs图3-131 百钱买百鸡的粗略算法 当cocks=19找满足题意的hens和chicks输出一组cocks,hens和chichs初始化:cocks=0cocks + (2) 对s2.1细化思绪1:把已确定的cocks代入式(1)与(2)中,求解方程,看能否找到满足题意的解。这种思绪不太适宜计算机求解。思绪2:在每个给定的cocks下,面对hens的取值范围内的各个值依次测试,看能找到哪些hens及chicks满足题意。于是得到如下s2.1细化算法。 用这段算法替代图3-131中的“找满足题意的hens和chicks,得到图3-132所示的百钱买百鸡

34、的N-S图算法。s2.1.1: hens=0;s2.1.2: 当(hens=33)s2.1.2.1: 找满足题意的chicks;s2.1.2.2: hens+; /*即hens=hens+1*/图3-13(2) 百钱买百鸡算法的细化算法 当cocks=19当hens=33初始化:cocks=0输出一组cocks,hens和chichscocks +hens=0找满足题意的chicksHens+(3) 对s2.1.2.1细化 对s2.1.2.1来说,cocks及hens都已确定,这时的chicks可以计算出: chicks=100-cocks-hens 式(1)已满足。只需用式(2)指定的条件测

35、试便可知这一组cocks, hens及chicks能否满足题意。满足那么打印出一组解。于是s2.1.2.1可细化为:图3.13(3)为进一步细化的百钱买百鸡算法。s2.1.2.1:chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0)=100)printf (%d %d %dn, cocks, hens, chicks); 图3-13(3) 百钱买百鸡算法的细化算法 当cocks=19当hens=33cocks=0cocks +hens=0chicks=100-cocks-henshens+(5*cocks+3*hens+chicks/3.0)=

36、100输出一组cocks,hens和chichs空真假/* 百钱买百鸡问题 */#include int main(void) int cocks=0; printf(%8s%8s%8sn,cocks,hens,chicks); while(cocks=19) int hens=0; while(hens=33) int chicks; chicks=100-cocks-hens; if(5*cocks+3*hens+chicks/3.0=100) printf(%8d%8d%8dn, cocks,hens,chicks); hens+; cocks+; return 0;3.8.2 dowh

37、ile构造 dowhile,其方式如下:当流程到达do后,立刻执行循环体一次,然后才对判别表达式进展计算、测试。假设表达式的值为真(非0),那么反复执行一次循环体;否那么退出。与while构造相比,dowhile构造至少要执行一次循环体。这样的构造运用在需求事先执行一次循环体的程序非常容易了解。do 循环体while (表达式);例3-14 用牛顿迭代法计算一个正实数a的平方根,准确到E0=10-5。 (1) 建立迭代关系式,由题意可以写出: x= (a)1/2 或 x2=a 于是得到方程: f(x)=x2-a=0, f(x)=2x 根据牛顿迭代公式 x=x-f(x)/f(x)=x-x2-a/

38、2x=1/2x+a/x 即 x=(x+a/x)*0.5 这就是要建立的迭代关系式。(2) 给定初值。今设a的初值为a(当然也可以为其它值)。(3) 给定精度(误差)为E0。精度是迭代控制的条件,当误差大于E0时,要继续迭代。如何计算误差呢?本来应该用x-a来表示误差,即把求出的x与真正的a相比,计算出其误差,但是如今a并不知道,因此可换一种方法来表示误差,用x*x-a(由于要求x=a,即x2=a,x与a的差距可以经过x2与a的差距反映出来)。于是得到循环构造的控制条件: x2-aE0 即 fabs(x*x-a)=E0/* 计算平方根 */#include #define E0 0.00005d

39、ouble sq_root (double a)/* 计算a的平方根 */ double x; x=a; x=(x+a/x)*0.5; while (fabs (x*x-a)=E0) x=(x+a/x)*0.5; return (x);这里fabs是一个规范数学函数名。E0是误差要求,可以用define命令在程序头部作为一个符号常数进展定义,在不同情况下根据需求可以对它修正。#include int main(void)double f=2.0; printf( The root of %f is %fn,f,sq_root(f); return 0; 用下面的主函数进展测试测试结果如下:Th

40、e root of 2.000000 is 1.4142163.8.3 for构造 为了阐明for构造,先看下面一个程序段:sum=0;for (i=1;i=n;i+)sum=sum+i; 它是下面的控制构造的一个例子。for (表达式1;表达式2;表达式3) 循环体 为了阐明for后面括弧中三个表达式的语句,将它改写为如下while构造:sum=0;i=1;/* 相当于for语句中的表达式1 */while (i=n)/* 相当于for语句中的表达式2*/ sum=sum+i;/* for循环体*/ i+;/* 相当于for语句中的表达式3*/ 显然,这三个表达式的作用是控制循环,故称循环控

41、制表达式。表达式1称为初始化表达式;表达式2称为条件表达式;表达式3称为修正表达式。可以看出:for语句是将初始化、条件判别、循环变量值变化三者组织在一同的循环控制构造。for构造的格式可以表示为:for语句的执行过程如下: (1) 先执行表达式1初始化表达式。留意在整个循环中它只执行一次。 (2) 反复下面的过程:计算表达式2(判别表达式),假设为真(非0),就执行一次循环体语句,然后再执行表达式3修正表达式;再计算表达式2(判别表达式),判别能否为“真,直至表达式2(判别表达式)的值为假(0),就不再执行循环体了。for (初始化表达式;判别表达式;修正表达式) 循环体语句 在某些情况下,

42、用for构造表示循环,显得紧凑而明晰。尤其是它能利用表达式3自动地使循环变量值发生改动,不像while构造那样要在循环体中设置“修正操作。实践上,for语句中的表达式3并不仅限于修正循环变量,而可以是任何操作。例如前面引见的求1+2+n的程序段可以改写为: 构成一个没有循环体的构造,或者说循环体是一个空语句仅一个分号。而表达式3成为一个逗号表达式,它包含两个简单表达式包含了本应由循环体完成的功能,表达式的执行顺序从左到右。表达式1也是一个逗号表达式,它使sum和i都初始化。for sum=0,i=1; i=n; sum=sum+i,i+ ;计算Fibonacci数程序,用for构造修正如下:#

43、include int main(void) int fib1=1,fib2=1,fib,i; for (i=3;i=12;i+) fib=fib1+fib2; fib1=fib2; fib2=fib; printf(“The Fibonacci number after 1 yer is:%dn,fib); return 0;百钱买百鸡问题用for构造编写的程序如下:#include int main(void) int cocks; printf(%8s%8s%8sn,cocks,hens,chicks); for(cocks=0;cocks=19; cocks+) int hens; f

44、or(hens=0; hens=33; hens+) int chicks; chicks=100-cocks-hens; if(5*cocks+3*hens+chicks/3.0=100) printf(%8d%8d%8dn, cocks,hens,chicks); return 0;例3-18 打印九九表。下面用逐渐求精的方法分析本例的解法。表体共九行,所以首先思索一个打印九行的算法s1:下面进一步思索如何“打印第i行。由于每行都有九个数字,故“打印第i行可以写为s1.1: fori=1; i=9;i+ 打印第i行 打印换行符forj=1, j=9; j+ 打印第j个数 “打印第j个数即在

45、第i行的第j列上打印一个数,大小为i*j,占4个字宽。故可写为printf (%4d, i*j); 在写这个语句时,人们自然要思索写不写换行符。显然不能在每个数字后面都换行,而只能在第9个数字后面写换行。实现只在第9个数字后面换行的方法是,打印完一行,即在j循环后写一个语句使换行:printf (n);于是,打印九九表的程序可写为:/* 打印九九乘法表 */#include int main(void) int i,j; for (i=1;i=9; i+) /*实践上将9改为i,更符合数学上的习惯*/ for (j=1; j=9;j+) printf (“%d*%d=%4d,i,j,i*j);

46、 printf (n); return 0;例3-19 用梯形法求数值积分。 定积分的几何意义就是求曲线f(x)与直线y=0,x=a,x=b所围成的曲顶梯形的面积。当能找到f(x)的原函数F(x)时,利用牛顿-莱布尼兹公式:可以准确地求出I值来。当f(x)的原函数不易找到时,便可以借助数值方法近似地求出I的值。用数值方法计算定积分有两个关键:一是将延续的对象分割为容易求解的一些子对象;二是用迭代法对迭代表达式反复操作。下面引见一种容易了解的方法梯形法。由图3-16所示,一个曲顶梯形可以分割为许多小的宽为h的曲顶梯形。bf(x)x0yaa+ha+iha+ih+ha+2h图3-16 用梯形法求定积

47、分当hh=(b-a)/n很小时,每个小的曲顶梯形都可以近似看作是梯形,第i个小曲顶梯形的面积近似为: si=h/2f(a+ih)+f(a+(i+1)h)于是定积分的值(曲线所围成的面积): 当n时,就能准确地求出定积分S。在现实中,只需取相当大的n,使误差小于要求的值,就可以近似地计算出定积分S。用迭代方式描画为: for(i=1;i=n-1;i+) s=0.5*h*(f(a)+f(b) s=s+h*f(a+i*h) 最后计算的结果,就是函数fx的定积分。 下面是一个利用梯形法求函数fx= 4-x的定积分的程序:/* 用梯形法求积分 */#include double f(double x);int main(void) float a,b; double s,h; int n,i; printf (输

温馨提示

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

评论

0/150

提交评论