《C语言与程序设计教程》课件第3章.ppt
- 【下载声明】
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并不遵循这个“就近匹配”,则可用花括号“”来改变匹配关系。例如
展开阅读全文