书签 分享 收藏 举报 版权申诉 / 275
上传文档赚钱

类型《C语言与程序设计教程》课件第3章.ppt

  • 上传人(卖家):momomo
  • 文档编号:8095441
  • 上传时间:2024-11-26
  • 格式:PPT
  • 页数:275
  • 大小:885.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《C语言与程序设计教程》课件第3章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C语言与程序设计教程 语言 程序设计 教程 课件
    资源描述:

    1、第第3章章 三种基本结构的程序设计三种基本结构的程序设计 3.1 程序基本结构及C程序语句分类 3.2 顺序结构程序设计 3.3 选择结构程序设计 3.4 循环结构程序设计 3.5 典型例题精讲3.1 程序基本结构及程序基本结构及C程序语句分类程序语句分类3.1.1 程序的基本结构程序的基本结构计算机程序的一个重要方面就是描述问题求解的计算过程,即对计算步骤的描述。在程序设计语言中,一个计算步骤或者用一个基本语句实现,或者用一个控制结构实现。控制结构主要由控制条件和被控制的语句组成,不同的控制结构用于描述不同的控制方式,实现对程序中各种成分语句的顺序、选择和循环等方式的控制。1966年,Boh

    2、m和Jacopini的研究表明,只需要采用顺序结构、选择结构和循环结构这三种控制结构就能够编写所有的程序。对于一些规模较大而又比较复杂的问题,解决的方法往往是把它们分解成若干个较为简单和基本问题进行求解;这在程序设计中则表现为:将一个大程序分解为若干个相对独立且较为简单的子程序,这些子程序就是过程与函数。大程序通过调用这些子程序来完成预定的任务。过程与函数的引入不仅可以较容易地解决一些复杂问题,而且更重要的是使程序有了一个层次分明的结构,这就是结构化程序设计“自顶向下、逐步求精、模块化”的基本思想。因此一个结构化程序是由顺序、选择和循环三种基本结构和过程(函数)结构组成的。结构化程序的开创者N

    3、.Wirth就曾这样说过:“在程序设计技巧中,过程是很少几种基本工具中的一种,掌握了这种工具,就能对程序员工作的质量和风格产生决定性的影响”。N.Wirth所说的过程就是C语言中的函数,我们将在第5章介绍,下面只对三种基本结构进行介绍。1)顺序结构顺序结构是按照语句的书写顺序依次执行各语句序列。图3-1(a)给出了顺序结构的流程图。图3-1(a)中A框和B框表示基本的操作处理,可以是一条语句也可以是多条语句,它表示程序在执行完A框操作后,将顺序去执行B框的操作,即严格按照语句的书写顺序进行。因此,顺序结构是一种最基本的程序结构。2)选择结构选择结构是按照条件判断选择执行某段语句序列。图3-1(

    4、b)给出了选择结构的流程图。需要指出的是,在选择结构程序中A框和B框的操作只能二选一;即执行了A框操作,就不能再执行B框操作;而执行了B框操作,就不能再执行A框操作。无论是执行了A框操作还是执行了B框操作,接下来都会继续向下顺序执行后继的操作。3)循环结构循环结构能够通过条件判断控制循环执行某段语句序列。按照条件和循环执行的语句段之间的关系,可以细分为当型循环结构和直到型循环结构。图3-1(c)和图3-1(d)分别给出了当型循环结构和直到型循环结构的流程图。在当型循环结构中,需要先判断条件P,然后执行A框操作;若一开始P就不成立,则A框操作一次也不执行。直到型循环与当型循环的区别是这种循环要先

    5、执行A框操作,然后再判断条件P;也即在直到型循环中,无论P条件成立与否,A框操作至少会被执行一次。图3-1 结构化程序设计的三种基本结构关于三种基本结构有以下几点说明:(1)无论是顺序结构、选择结构还是循环结构,它们的共同特点是只有一个入口并且只有一个出口,整个程序就是由若干个这样的基本结构组合而成。(2)三种基本结构中的A、B操作是广义的,它们可以是一个操作,也可以是另一个基本结构或者几种基本结构的组合。(3)在选择结构和循环结构中都会出现判断框。但选择结构会根据条件P的成立与否决定执行A、B中的哪一个操作,且执行后就会脱离该选择结构而顺序执行下面的其他结构,也即选择结构中的A、B只能选择一

    6、个且只能执行一次。循环结构则是在条件P成立时反复执行A操作,直到条件P不成时才跳出该循环结构而顺序执行下面的其他结构。3.1.2 C程序中的语句分类程序中的语句分类C语言中的语句分为简单语句和结构语句两类。简单语句是指那些不包含其他语句成分的基本语句;结构语句则指那些“句中有句”的语句,它是由简单语句或结构语句根据某种规则构成的。C语言的语句分类情况如图3-2所示。图3-2 C语言的语句分类1)表达式语句在C语言中,由一个表达式加上一个分号“;”就构成了一个表达式语句。最典型的是由赋值表达式加上分号“;”,就构成了赋值语句。表达式语句的一般形式为:表达式;例如:i+;k=k+2;m=n=j=3

    7、;a=1;按照C语言的语法,任何表达式后面加上分号“;”都可构成表达式语句,例如:“x+y;”也是一个C语言的语句,但这种语句没有实际意义。一般来说,语句的执行能使某些变量的值被赋予或改变,或者表达式能产生某种效果才能成为有意义的表达式语句。2)函数调用语句由一个函数调用加一个分号“;”构成函数调用语句,其作用主要是完成该函数指定的操作。函数调用语句的一般形式为:函数名(实际参数表);例如:printf(s=%dn,s);该语句是由一个printf格式输出函数加上一个分号“;”构成了一个函数调用语句。3)空语句仅由一个分号“;”构成的语句就是空语句,其一般形式为:;空语句是什么也不执行的语句。

    8、C语言引入空语句出于以下考虑:为了构造特殊控制结构的需要。例如,循环控制结构的语法上需要一个语句作为该循环语句的循环体(这种结构语句必须“句中有句”);当要循环执行的动作已经由循环控制部分完成时,就不再需要循环体语句了,但是为了满足结构语句这种“句中有句”的要求,就必须用一个空语句作为循环体。在复合语句的末尾设置一个空语句来作为转向的目标位置,以便goto语句能够将控制转移到复合语句的末尾。4)复合语句用一对花括号“”括起来的若干条语句称为复合语句,复合语句在语法上相当于一条语句(即从外部看一个复合语句就相当于一个语句)。复合语句的一般形式为:语句1;语句n;需要注意的是,复合语句内的各条语句

    9、都必须以分号结束,并且在复合语句的标识“”外不能加分号“;”。5)控制语句控制语句用来规定语句的执行顺序。C语言有如下9种控制语句:ifelse (条件语句)switch (多分支选择语句又称开关语句)while (循环语句)dowhile (循环语句)for (循环语句)continue (结束本次循环)break (退出循环或switch语句)goto (转移语句)return (返回语句)这些语句的使用方法将在以后的章节中介绍。3.2 顺序结构程序设计顺序结构程序设计 3.2.1 赋值语句赋值语句顺序结构的程序在第2章中已多次出现,顺序结构中出现的函数调用语句如printf和scanf也

    10、已在第2章介绍。下面,我们介绍顺序结构中出现的赋值语句。赋值语句就是由赋值表达式与分号“;”构成的,赋值语句的功能和特点都与赋值表达式相同,它是程序中使用最多的语句之一。赋值语句的一般形式为:变量=表达式;例如:a=b+3;与赋值表达式相同,赋值运算符“=”左边是变量而不能是常量或表达式。并且,赋值语句可以写成下面的形式:变量=变量=变量=表达式;它表示将最右边的表达式逐一赋给赋值运算符左边的每一个变量。例如:a=b=c=d=10;C语言中有赋值表达式和赋值语句的概念,两者只差一个分号“;”,而其他大多数高级语言没有“赋值表达式”这一概念。因此,赋值表达式可以包含在其他表达式之中。例如:if(

    11、a=b)0)x=a;按大多数语言的语法规定,if后面的括号内是一个条件,例如“if(x0)”而C语言中,这个x的位置可以是一个赋值表达式,如“a=b”;其作用是:先进行赋值运算(即先将b的值赋给a)然后再判断a是否大于0,如果大于0,则执行x=a(if语句见选择结构程序设计一节),但是在C语言中,像if、while和do语句的圆括号“()”中一定是表达式,而不能是一个语句,如写成下面形式的语句就错了:if(a=b;)0)x=a;C语言把赋值语句和赋值表达式区别开来,增加了表达式的种类,因此能够实现其他高级语言难以实现的功能。例如:if(ch=getchar()=n);这条语句的作用是:先从键盘

    12、输入一个字符赋给变量ch,然后判断ch是否等于换行符n,如果等于换行符n,则什么也不做。此外要注意的是,必须清楚在变量定义中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,即必须一个变量一个变量的定义,且定义赋初值的变量与其后定义的其他同类变量之间必须用逗号“,”间隔。例如:int a=10,b;但不允许在变量定义时连续用赋值号给多个变量赋初值。如下面的变量定义方式是错误的:int a=b=c=10;应该写成:int a=10,b=10,c=10;而赋值语句则允许连续赋值。例如:int a,b,c;a=b=c=10;3.2.2 顺序结构程序顺序结构程序顺序结构的程序基本上是由函数

    13、调用语句和表达式语句构成的,这种结构的程序在执行中的特点是:一个操作执行完成后就接着执行紧随其后的下一操作。由于顺序结构非常简单,因此其求解的问题是有限的。例3.1 输入三角形的三条边长,求三角形的面积。解 已知三角形的三条边长a、b、c,则求三角形的面积可用下面的公式求出:程序如下:#include#includevoid main()float a,b,c,p,s;printf(Input a,b,c=);scanf(%f,%f,%f,&a,&b,&c);p=1.0/2*(a+b+c);s=sqrt(p*(p-a)*(p-b)*(p-c);printf(s=%6.2fn,s);运行结果:I

    14、nput a,b,c=3,4,5s=6.00该程序要注意如下两点:(1)程序中使用了C语言的库函数sqrt来求平方根,因此,必须在程序开始处用include命令给出所使用库函数的说明。include命令必须以“#”开头,所说明的库函数文件名以“.h”作为其后缀,且该文件名用一对尖括号“”或一对双引号“”括起来;由于以#include开头的命令行不是语句,因此其末尾不加分号“;”,在此使用的库函数为数学函数math.h。(2)求p值时的“”在程序中必须写成“1.0/2”,如果写为“1/2”则因两个整数相除后将舍去结果的小数部分而仅保留结果的整数部分,这样“1/2”的结果为0,而“1.0/2”则是

    15、一个单精度数和一个整数相除,其结果为单精度数,故不受影响;这一点在编写程序中要尤为注意,否则会产生很大的误差。21例3.2 从键盘上输入a和b的值,然后交换它们的值并输出交换后的a、b值。解 在计算机中进行数据交换,如交换变量a和b的值,则不能简单地通过下面两条赋值语句实现:a=b;b=a;因为当执行第一条赋值语句“a=b;”后,将变量b的值送入变量a的内存单元而覆盖掉变量a原有的值,即a的原值已经丢失,此时已具有变量b的值(即a和b中都保存着b值);接下来再执行第二条赋值语句“b=a;”,则是将a中所保存的b值又送入变量b的内存单元,这样就无法实现将两个变量值相互交换的目的。因此,必须借助于

    16、一个中间变量t的过渡才能实现a、b值交换的目的,其实现过程是用连续的三个赋值语句实现的:t=a;a=b;b=t;图3-3 按、步实现a与b之间数据的交换即执行“t=a;”后将a值保存于t中,再执行“a=b;”将b值赋给a(此时a中已为b值),最后执行“b=t;”将t中所保存的原a值赋给b,即实现了a与b值的交换。我们用图3-3给出变量a、b值的交换示意。图3-3 按、步实现a与b之间数据的交换程序如下:#includevoid main()int a,b,t;printf(Input a,b=);scanf(%d,%d,&a,&b);printf(old data:a=%d,b=%dn,a,b

    17、);/*输出变量a和b的原值*/t=a;a=b;b=t;/*实现变量a和b值的交换*/printf(new data:a=%d,b=%dn,a,b);/*输出交换后a和b的新值*/运行结果:Input a,b=5,10old data:a=5,b=10new data:a=10,b=53.3 选择结构程序设计选择结构程序设计 选择结构通过选择语句实现。选择语句是根据条件满足与否来选择所应执行的语句,从而控制程序的执行顺序。选择语句共有两个:一个是if语句,一个是switch语句;这两个语句用来实现程序的选择结构。3.3.1 if语句语句if语句是C语言中用来实现选择结构的重要语句,它根据给定的

    18、条件进行判断来决定执行某个分支语句(可以是复合语句)。C语言的if语句有三种基本形式。1.单分支单分支if语句语句单分支if语句的一般形式为:if(表达式)语句;单分支if语句的功能首先是计算表达式的值,如果表达式的值为非0(即为真)则执行语句;若表达式的值为0(即为假)则该if语句不起作用(相当于一个空语句),继续执行其后继的其他语句。单分支if语句的执行流程如图3-4所示。图3-4 单分支if语句执行流程例如:int a=5,b=3;if(a=b)printf(a=b);if(3)printf(OK!);if(a)printf(%d,a);都是合法的。第1个if语句因表达式“a=b”的值为

    19、“假”而相当于一个空语句;第2个if语句因表达式的值为3(即非0)按“真”处理,即输出:OK!;第3个if语句的表达式为字符a(非0)也按“真”处理,即输出a的ASCII码值97。例3.3 输入任意两个整数,并按由大到小的次序输出。解 程序如下:#includevoid main()int a,b,t;printf(Input a,b=);scanf(%d,%d,&a,&b);if(ab)/*如果ab则交换a、b的值*/t=a;a=b;b=t;printf(%d,%dn,a,b);运行结果:Input a,b=5,1010,52.双分支if语句双分支if语句的一般形式:if(表达式)语句1;e

    20、lse语句2;双分支if语句的功能是:如果表达式的值为非0(即为真)则执行语句1,否则执行语句2。双分支if语句的执行流程如图3-5所示。图3-5 双分支if语句执行流程例3.4 输入任意两个整数,并按由大到小的次序输出。解 程序如下:#includevoid main()int a,b;printf(Input a,b=);scanf(%d,%d,&a,&b);if(a0&b0)a=a+b;if(a=0&b0&b0)a=a+b;else b=a-b;解 当a0并且b0时(1)和(2)等效,因为二者都执行的是“a=a+b;”语句,而其余语句均不执行。但是,当a0或b0这两个条件中有一个不满足时

    21、,(1)和(2)就不等效了,这是因为(1)中的第二个if语句是在a0 和b0同时满足的条件下执行“b=a-b;”语句,而(2)的else则是当a0和b0中有一个满足时就执行“b=a-b;”语句。也即,(2)中else后面语句执行的条件范围比(1)中第二个if语句的要宽,所以(1)、(2)不等效。3.多分支if语句多分支if语句是通过多个双分支if语句的复合来实现多分支的功能。多分支if语句的一般形式为:if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else if(表达式n)语句n;else语句n+1;多分支if语句的功能是:依次判断每一个表达式的值

    22、,当某个表达式i的值为真(非0)时,则执行语句i,然后结束整个多分支if语句的执行,接下来执行后继的其他语句;如果所有表达式的值都为假(即为0),则执行语句n+1。多分支if语句的执行流程如图3-6所示。图3-6 多分支if语句执行流程例3.6 判断由键盘输入的字符类型。解 判断键盘输入的字符类型,可根据附录1的ASCII码表来判别,即ASCII码值小于32时为控制字符,在09之间为数字字符,在AZ之间为大写字母,在az之间为小写字母,其余则为其他字符。这是一个多分支的选择问题,因此用多分支if语句实现。程序如下:#includevoid main()char c;printf(Input a

    23、 character:);c=getchar();if(c=0&c=A&c=a&cb)printf(ab)elseprintf(ab);(3)分支语句可以是一条语句,也可以是由多条语句复合而成的一条语句。当条件成立或不成立所需执行的不止一条语句时,则必须使用复合语句。例如,当ab)t=a;a=b;b=t;是错误的。因为属于if语句范围的仅是一条“t=a;”语句,而“a=b;b=t;”则是if语句之后的后继语句。交换要求当条件“ab”为真时,“t=a;a=b;b=t;”三条语句都应执行,当条件“ab”为假时,“t=a;a=b;b=t;”三条语句都不执行。而实际执行则是:当条件“ab”为真时,“t

    24、=a;a=b;b=t;”三条语句都将执行,但后两条语句“a=b;b=t;”是作为if语句的后继语句来执行的;当条件“ab”为假时,if语句相当于一个空语句,即语句“t=a;”并不执行,这时仅执行if语句之后的后继语句“a=b;b=t;”,这两条本不该执行的语句其执行将造成了程序执行的混乱。因此,正确的写法应是:if(ab);printf(ab);是错误的。因为当表达式“ab”为真时执行的语句为空语句“;”,而“printf(ab);”语句则是if语句之后的后继语句,即无论“ab”为真或为假都将执行该语句,所以该if语句失去了判断的意义,即无论“ab”是否为真,最终都输出同一个结果:ab。3.3

    25、.2 if语句的嵌套语句的嵌套当if语句中的内嵌语句又是一个或多个if语句时,就形成了if语句的嵌套。下面就给出了三种不同的if语句嵌套形式:(1)if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;(2)if(表达式1)if(表达式2)语句1;else 语句2;else 语句3;(3)if(表达式1)语句1;else if(表达式2)语句2;else 语句3;注意:else总是与它之前最近的尚未与else匹配的那个if配对,这就是else的“就近匹配”原则。如果要求else并不遵循这个“就近匹配”,则可用花括号“”来改变匹配关系。例如

    26、:if(表达式1)if(表达式2)语句1;else 语句2;此时,else就改为与第一个if匹配,如果没有花括号“”,则这个else则与第二个if匹配。例3.7 有以下程序:#includevoid main()int x=1,y=2,z=3;if(xy)if(yy”,由于x等于1而y等于2即其结果为假,所以跳过内嵌的第二个if-else语句而直接执行最后一个输出语句“printf(%dn,x+)”,即先输出x的值,然后x再增1,故输出的结果为1,即选D。例3.8 闰年判断方法是:如果某年(以公元历表示)是4的倍数而不是100的倍数,或者是400的倍数,那么这一年是闰年。试编写闰年判别程序。解

    27、 由题意可知,闰年首先能够被4整除(即用4取余为0);在被4整除的年份中显然含有被100整除的年份,但也不能将这些被100整除的年份统统排除于闰年之外,因为其中能够被400整除的仍然是闰年,所以在能被4整除同时又能被100整除的年份中,找出能被400整除的那些闰年来。程序编制如下:#includevoid main()int y,b;printf(Input year:);scanf(%d,&y);if(y%4=0)if(y%100=0)if(y%400=0)b=1;/*能被4整除、能被100整除又能被400整除*/elseb=0;/*能被4整除、能被100整除但不能被400整除*/elseb

    28、=1;/*能被4整除但不能被100整除*/elseb=0;/*不能被4整除*/if(b)printf(%d is a leapyear.n,y);elseprintf(%d is not a leapyear.n,y);此题也可将题设条件用一个布尔表达式来描述:能够被4整除且不能被100整除或者能够被400整除的年份是闰年。由此得到程序如下:#includevoid main()int y;printf(Input year:);scanf(%d,&y);if(y%4=0&y%100!=0)|y%400=0)printf(%d is a leapyear.n,y);elseprintf(%d

    29、is not a leapyear.n,y);运行结果:Input year:20102010 is not a leapyear.3.3.3 条件运算符与条件表达式条件运算符与条件表达式如果条件语句if中只执行单个的赋值语句时,则可以用条件表达式来取代if语句。条件表达式是包含条件运算符的表达式;条件运算符是C语言中唯一的三目运算符,即有3个参与运算的量。条件表达式的一般形式为:表达式1?表达式2:表达式3其求值规则为:先求解表达式1的值,若表达式1的值为真(非0),则表达式2的值即为整个条件表达式的值,否则表达式3的值即为整个条件表达式的值。例如:108?5:15的值是5而10b)max=

    30、a;else max=b;则可用条件表达式语句(条件表达式后加分号“;”即构成条件表达式语句)写为:max=(ab)?a:b;使用条件表达式应注意以下几点:(1)条件运算符的优先级高于赋值运算符,低于关系运算符和算术运算符。例如:max=(ab)?a:b+1;可以去掉括号而写为:max=ab?a:b+1;(2)条件运算符的结合方向为“自右向左”。例如:ab?a:cd?c:d;相当于:ab?a:(cd?c:d);这也是条件表达式嵌套的情况,即其中的表达式3又是一个条件表达式(当然表达式2也可以是一个条件表达式)。(3)条件表达式不能取代一般的if语句,只有if语句内嵌的语句为赋值语句且2个分支都

    31、给同一个变量赋值时才能代替if语句。(4)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不一致。例如:a?x:y(5)条件运算符“?”和“:”是一对运算符,不能拆开单独使用。例3.9 输入一个字符,如果是小写字母,则转换成对应的大写字母,如果是大写字母则不变。#includevoid main()char ch;printf(Input one char:);ch=getchar();ch=ch=a&ch=z?ch-32:ch;putchar(ch);putchar(n);运行结果:Input one char:hH3.3.4 switch语句语句if语句本质上是两路分支的选择结构

    32、;要用于多路分支时,if语句就得采用嵌套形式,这使程序的可读性降低。对于多路分支问题,C语言提供了更加简练的语句,即可直接使用多分支选择语句即switch语句来实现多种情况的选择。switch语句的一般形式如下:switch(表达式)case 常量表达式1:语句1;case 常量表达式2:语句2;case 常量表达式n:语句n;default:语句n+1;switch语句的执行过程是:首先计算表达式的值,并逐个与case后面的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,执行该常量表达式后面的语句,此后遇到下面其他case后的语句则不再判断(包括default后面的语句),即顺

    33、序往下执行直到遇到break语句跳出switch语句为止,或执行到switch语句的结束标志“”处为止,然后继续执行switch语句之后的其他语句。如果表达式的值与所有case后面的常量表达式值均不相等,则执行default后面的语句(如果没有default部分,则此时的switch语句相当于一个空语句)。例如:switch(class)case A:printf(GREAT!n);case B:printf(GOOD!n);case C:printf(OK!n);case D:printf(NO!n);default:printf(ERROR!n);若class的值为B,则输出结果是:GOO

    34、D!OK!NO!ERROR!若class的值为D,则输出结果是:NO!ERROR!因此,switch语句的功能是:根据switch后面表达式的值找到匹配的入口处,然后由这个入口处开始执行而不再进行判断。因此,为了保证只执行一条分支上的语句,就要在每一个分支语句结束处增加一个break语句来强制终止继续往下执行,即跳出switch语句。例如:switch(class)case A:printf(GREAT!n);break;case B:printf(GOOD!n);break;case C:printf(OK!n);break;case D:printf(NO!n);break;default

    35、:printf(ERROR!n);这样,若class的值为B,则输出结果是:GOOD!注意,在switch语句“”之前的语句后可不加break语句。使用switch语句应该注意以下几点:(1)switch后面常量表达式的类型可以是整型、字符型或枚举型,但不能是其他类型。如单、双精度型的值由于计算误差而难以进行相等比较(但可以强制转换为整型后再比较)。(2)常量表达式的类型应与switch后面的表达式类型一致。(3)case后面常量表达式的值必须互不相同。例如,下面的switch语句是错误的:switch(x)case 2+3:语句i;case 8-3:语句j;(4)多个case可以共享一组执行

    36、语句。例如:switch(ch)case A:case B:case C:case D:printf(Pass!n);则到当ch值为A、B、C、D时都会执行“printf(Pass!n);”语句。(5)switch结构可以嵌套,即在一个switch语句中可以嵌套另一个switch语句,但要注意break语句只能跳出当前层的switch语句。例如:int x=1,y=0;switch(x)case 1:switch(y)case 0:printf(x=1,y=0n);break;case 1:printf(x=1,y=1n);case 2:printf(x=2n);程序运行结果如下:x=1,y=

    37、0 x=2本来不应该再输出“x=2”,这是因为break语句仅结束了内层switch语句,由于外层的“case 1”的语句后无“break”语句,则继续执行“case 2”后的语句,正确的写法如下:int x=1,y=0;switch(x)case 1:switch(y)case 0:printf(x=1,y=0n);break;case 1:printf(x=1,y=1n);break;case 2:printf(x=2n);例3.10 用数字17代表周一周日,根据键盘上输入的数字,输出星期几的英文单词。解 程序如下:#includevoid main()int a;printf(Input

    38、 data:);scanf(%d,&a);switch(a)case 1:printf(Mondayn);break;case 2:printf(Tuesdayn);break;case 3:printf(Wednesdayn);break;case 4:printf(Thursdayn);break;case 5:printf(Fridayn);break;case 6:printf(Saturdayn);break;case 7:printf(Sundayn);break;default:printf(Input error!n);运行结果:Input data:4Thursday例3.1

    39、1 输入两个运算量及一个运算符,如5+3,用程序实现四则运算并输出运算结果。解 首先输入参加运算的2个数和1个运算符,然后根据运算符来做相应的运算。但是在做除法运算时应先判别除数是否为0,如果为0则运算非法,给出错误提示;如果运算符号不是“+”、“-”、“*”、“/”则同样非法,也给出错误提示,对其他情况则输出运算结果。程序如下:#include void main()float a,b,result;int flag=0;/*0为合法,1为非法*/char ch;printf(Input expression:a+(-、*、/)b:n);scanf(%f%c%f,&a,&ch,&b);swi

    40、tch(ch)/*根据运算符进行相关运算*/case+:result=a+b;break;case-:result=a-b;break;case*:result=a*b;break;case/:if(!b)printf(divisor is zero!n);/*显示除数为0*/flag=1;/*置非法标志*/else result=a/b;break;default:printf(Input error!n);/*显示输入错误*/flag=1;/*置非法标志*/if(!flag)/*如果合法则输出计算结果*/printf(%f%c%f=%fn,a,ch,b,result);运行结果:Input

    41、 expression:a+(-、*、/)b:8+38.000000+3.000000=11.000000 3.4 循环结构程序设计循环结构程序设计 程序的循环结构是用循环语句实现的。程序中有时需要反复执行某一段语句序列,这一语句序列我们称之为循环体。并且,每次循环体执行都要作出是继续循环还是退出循环的判定,这个循环终止条件的判定是由表达式来完成的。所以,循环语句至少要包含循环体和判定循环终止条件的表达式这两部分。循环语句分为两种类型:一种是条件循环语句,它包括当型(while)循环型和直到型(dowhile)循环两种形式的语句;另一种是计数(for)循环语句。如果能预先确定循环的次数则使用f

    42、or循环语句,否则应使用while或dowhile语句。当然,C语言已经将for语句的功能扩展到足以取代while和dowhile循环语句的地步,但是从易读性方面考虑,还是针对不同的循环使用不同的循环语句为好。3.4.1 while语句语句while语句用来实现当型循环,其一般形式为:图3-7 while语句的执行流程while(表达式)语句;其中:表达式是循环条件,语句为循环体。在执行while语句时,先对表达式的循环条件进行计算,若其值为真(非0),则执行循环体中的语句;然后继续重复刚才表达式值的计算并判断,是真则再次执行循环体语句;直到表达式的值为假(为0)时循环结束,程序转而执行该wh

    43、ile循环语句后的下一条语句,while语句的执行流程如图3-7所示。图3-7 while语句的执行流程使用while语句时应注意以下几点:(1)循环体是一条语句。当循环体由多条语句组成时,则必须用花括号“”括起来的复合语句来表示。(2)循环体(或表达式)内一定要有使循环条件表达式的值变为假(即0)的操作,否则循环将永远进行下去而形成“死循环”。(3)while语句中的表达式一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非0就执行循环体语句。(4)while语句的特点是“先判断,后执行”,如果表达式的值一开始就为0,则循环体语句一次也不执行(相当于一空语句)。但是要注

    44、意的是:由于要先判断,所以表达式至少要执行一次。例3.12 分析下面程序的运行结果。解 程序(1)中的,“x-”是x先参与操作然后再减1。因此,while语句中的表达式“x-”就是先判断x值是否为0,非0则执行循环体语句printf,为0则结束while语句的循环。但是在判断后且在执行循环体语句printf或者结束while循环语句之前,还应执行x的自减1操作。也即,该while语句的执行步骤如下:对x值进行判断;x自减1;根据的判断结果:如果非0则执行循环体语句printf然后转,否则结束while循环。因此每次判断x不等于0时都要执行这个printf(当然在执行printf语句之前x先减1

    45、);当x等于0(判断后x仍要减1)时则不再执行printf语句而结束循环。因此,程序的执行结果如下:10程序(2)中while语句的表达式与程序(1)相同,而循环体语句是一空语句(即分号“;”),即什么也不执行。因此x每判断(判断后再减1)一次只要其值非0则执行一次循环体,即空语句;当x为0时,先判断再减1,因判断时x值为0而意味着要结束循环,并且判断后x减1则使x值为-1。所以,结束循环后的printf语句(它不属于循环体语句)输出值为-1。程序(3)中while语句的表达式为x,循环体语句与程序(1)相同,即每此判断x不等于0时都要执行这个printf语句,由于表达式中及循环体语句中都没有

    46、对x值进行修改,也即x值始终为2,因此每次判断x值都为非0,所以该程序的while循环是一个死循环,即无休止的输出2。程序(4)中,x初值为0,也即while语句的表达式在判断x值时已为0,即不执行循环体语句“x-;”,并结束循环;但表达式“x-”则是先判断后减1,因此循环结束后由printf语句输出-1。例3.13 利用下面公式求值,要求n=10000。解 本题为求累加和问题,因此可用while语句实现;但是在循环体语句中应分解为两步实现求累加和任务:计算出通项(n=1,2,10000)的值存于m;用语句“sum=sum+m;”求累加和。程序编写如下:#includevoid main()i

    47、nt n=1;float m,sum=0;while(n=10000)m=1.0/(4*n-3)-1.0/(4*n-1);/*求通项的值*/sum=sum+m;/*求累加和*/n+;printf(PI=%fn,4*sum);运行结果:PI=3.141384该程序要注意两点:(1)变量sum和n的初始值:sum必须先置0,否则是一随机数,如不置0则结果必然出错;n初始值为1是求通项的需要。(2)在求通项的语句中,不能写成:“m=1/(4*n-3)-1/(4*n-1);”,这样,两个整数相除则所得结果舍去小数部分,那么在求通项中除了第一次所求通项值为1外,其后所有的通项值都为0,也即无法得到正确的

    48、结果。例3.14 求自然对数e的近似值;其中:10-7解 这也是求累加和问题,循环结束的条件是:10-7。程序如下:#includevoid main()int i=1;float e=1,n=1;while(1/n=1e-7)n=n*i;/*形成n!*/e=e+1/n;/*求累加和*/i+;printf(e=%fn,e);运行结果:e=2.718282编写程序时,若对循环结束的条件搞不清楚,往往会写成“1/n1e-7”,这样当n值为1时该条件为假,即根本不执行循环体,也就得不到正确的e值了。此外,由公式可以看出,有规律的计算是 ,而第一项这个1不属于这个有规律范围,所以将这个1作为初值先赋给

    49、了e。另一点是要形成n!,所以必须先给n赋初值1,而i值则从1开始每次加1,这样每次循环相应得到1!、2!、3!。最后要说明的是,由于1/n两个除数一个是整型一个是实型,故结果为实型,即不会产生两个整数相除其结果的小数部分被舍去的问题。3.4.2 dowhile语句语句dowhile语句用来实现直到型循环,其一般形式为:do语句;while(表达式);其中:表达式是循环条件,语句为循环体。dowhile语句的执行过程是:先执行do后的循环体语句,然后对表达式的循环条件进行计算,若其值为真(非0)则继续循环重复上述过程;如果表达式值为假(即0)则结束循环,程序控制转至dowhile语句之后的下一

    50、条语句执行。dowhile语句的执行流程如图3-8所示。图3-8 dowhile语句执行流程使用dowhile语句时应注意以下几点:(1)循环体是一条语句。当循环体由多条语句组成时,则必须用花括号“”括起来的复合语句表示。(2)循环体(或表达式)内一定要有使表达式的值变为假(即0)的操作,否则循环将永不停止。(3)do和while都是关键字,缺一不可;while(表达式)后面的分号“;”不能缺少。(4)dowhile循环是表达式的值为真时继续循环,否则结束循环;这一点与当型循环的while语句是一样的。(5)dowhile语句是先执行,后判断,因此循环体至少要执行一次。从概念上讲,while语

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《C语言与程序设计教程》课件第3章.ppt
    链接地址:https://www.163wenku.com/p-8095441.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库