第3章顺序结构程序设计优秀课件.ppt
第第第第3 3章顺序结构程序章顺序结构程序章顺序结构程序章顺序结构程序设计设计设计设计第1页,本讲稿共110页3.1 算法简介算法简介3.1.1 算法的概念算法的概念3.1.2 算法的特性算法的特性3.1.3 算法的表示算法的表示第2页,本讲稿共110页3.1.1 算法的概念算法的概念做任何事情都有一定的方法步骤。做任何事情都有一定的方法步骤。菜谱是做菜的算法;空调说明书是空调菜谱是做菜的算法;空调说明书是空调使用的算法;太极拳动作图解是一个太使用的算法;太极拳动作图解是一个太极拳的算法。极拳的算法。一个工作计划、生产流程、乐谱、珠算一个工作计划、生产流程、乐谱、珠算口诀等都可称为是口诀等都可称为是“算法算法”。第3页,本讲稿共110页3.1.1 算法的概念算法的概念例例:古希腊数学家欧几里德曾在他的著作中古希腊数学家欧几里德曾在他的著作中描述过求两个数最大公因子的过程,他所描述过求两个数最大公因子的过程,他所描述的这个过程,被称为欧几里德算法描述的这个过程,被称为欧几里德算法(辗转相除法)。(辗转相除法)。第4页,本讲稿共110页3.1.1 算法的概念算法的概念下面是欧几里德算法的一种描述。下面是欧几里德算法的一种描述。输入:正整数输入:正整数m,n输出:输出:m,n的最大公因子的最大公因子之前应该比较一下两个数的大小,大数在之前应该比较一下两个数的大小,大数在m中,小数在中,小数在n中中,使,使m n,则本题的算法为:,则本题的算法为:求求m/n的余数的余数r;若若r=0,则,则n为最大公约数,若为最大公约数,若r 0,执,执行第行第步;步;将将n m,将,将r n中;中;返回重新执行第返回重新执行第步,直到余数步,直到余数r=0,则,则n为为最大公约数。最大公约数。第5页,本讲稿共110页用用C语言来描述求最大公因子的求解过程。语言来描述求最大公因子的求解过程。输入:正整数输入:正整数m,n输出:输出:m,n的最大公因子的最大公因子 int euclid(int m,int n)/*第第1行行*/*第第2行行*/int r;/*第第3行行*/r=m%n;/*第第4行行*/while(r)/*第第5行行*/m=n;/*第第6行行*/n=r;/*第第7行行*/r=m%n;/*第第8行行*/*第第9行行*/return n;/*第第10行行*/*第第11行行*/3.1.1 算法的概念算法的概念第4行,把m除以n的余数赋予r 第5行判断r是否为0,若为0,就转到第10行处理,返回n,算法结束。若r非0,第6行把n的值赋予m,第7行把r的值赋予n,第8行把m除以n的余数赋予r,第9行,判断r是否为0,若非0,继续转到第6行进行处理若为0,就转到第10行处理,返回n值,算法结束第6页,本讲稿共110页3.1.1 算法的概念算法的概念根据上面这个例子,可以知道算法是指在根据上面这个例子,可以知道算法是指在有限步骤内求解某一问题所使用的一组定有限步骤内求解某一问题所使用的一组定义明确的规则。简单的说,就是为解决一义明确的规则。简单的说,就是为解决一个问题而采取的方法和步骤。个问题而采取的方法和步骤。无论是解题思路还是编写程序都是在实施无论是解题思路还是编写程序都是在实施某种算法,不过前者是推理实现,后者是某种算法,不过前者是推理实现,后者是操作实现。操作实现。第7页,本讲稿共110页3.1.1 算法的概念算法的概念求解一个给定的可计算或可解的问题,不同求解一个给定的可计算或可解的问题,不同的人可以编写出不同的程序,来解决同一个的人可以编写出不同的程序,来解决同一个问题。问题。算法算法+数据结构数据结构=程序,算法和程序之间存在程序,算法和程序之间存在密切的关系,算法是解决密切的关系,算法是解决“做什么做什么”和和“怎怎么做么做”的问题,在程序设计中起着重要的作的问题,在程序设计中起着重要的作用。用。在计算机科学中,算法要用计算机算法语言在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机求解一类问题的精描述,算法代表用计算机求解一类问题的精确、有效的方法。确、有效的方法。第8页,本讲稿共110页3.1.2 算法的特性算法的特性算法是一组有穷的规则,它们规定了解决算法是一组有穷的规则,它们规定了解决某一特定类型问题的一系列运算,是对解某一特定类型问题的一系列运算,是对解题方案的准确与完整的描述。算法具有以题方案的准确与完整的描述。算法具有以下的特性:下的特性:(1)有穷性有穷性。一个算法应包含有限的操作步骤,。一个算法应包含有限的操作步骤,而不能是无限的。而不能是无限的。(2)确定性确定性。算法中的每一个步骤都应当是确。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。定的,而不应当是含糊的、模棱两可的。第9页,本讲稿共110页3.1.2 算法的特性算法的特性一个算法具有以下一个算法具有以下特点特点:(3)可行性可行性。算法中的每一个步骤都应当能有效地执行,并得到确定。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。的结果。(4)有零个或多个输入有零个或多个输入。所谓输入是指在执行算法时需要从外界。所谓输入是指在执行算法时需要从外界取得必要的信息。算法的过程可以无数据输入,也可以有多取得必要的信息。算法的过程可以无数据输入,也可以有多种类型的多个数据输入,需根据具体的问题加以分析。种类型的多个数据输入,需根据具体的问题加以分析。(5)有一个或多个输出有一个或多个输出。算法的目的是为解决一个具体问题,。算法的目的是为解决一个具体问题,而结果的输出正是验证这一目的的最好方式,没有输出的而结果的输出正是验证这一目的的最好方式,没有输出的算法是没有意义的。算法是没有意义的。第10页,本讲稿共110页3.1.3 算法的表示算法的表示对于同一算法,允许在算法的描述和实对于同一算法,允许在算法的描述和实现方法上有所不同。常用的算法描述方现方法上有所不同。常用的算法描述方法可以归纳为以下几种:法可以归纳为以下几种:u自然语言自然语言u传统流程图传统流程图u结构化流程图结构化流程图u伪代码伪代码u第11页,本讲稿共110页1.用自然语言表示算法用自然语言表示算法用自然语言表示通俗易懂,易于掌握,一用自然语言表示通俗易懂,易于掌握,一般人都会用,但文字冗长繁琐,容易出现般人都会用,但文字冗长繁琐,容易出现歧义性。歧义性。特别是对有些复杂的算法表示起来很不方特别是对有些复杂的算法表示起来很不方便。除了有些很简单的问题,一般不用自便。除了有些很简单的问题,一般不用自然语言描述算法。然语言描述算法。第12页,本讲稿共110页2.用流程图表示算法用流程图表示算法流程图是使用一些图框表示各种类型的操流程图是使用一些图框表示各种类型的操作,用线表示操作的执行顺序。使用起来作,用线表示操作的执行顺序。使用起来更简洁直观,易于理解。更简洁直观,易于理解。流程图中常用的符号有规范的画法。流程图中常用的符号有规范的画法。第13页,本讲稿共110页2.用流程图表示算法用流程图表示算法起止框起止框输入输出框输入输出框处理框处理框判断框判断框流程线流程线连接点连接点注释框注释框x 0YN一个入口两个出口第14页,本讲稿共110页2.4.2用流程图表示算法用流程图表示算法流程图流程图是用一些图框来表示各种操作是用一些图框来表示各种操作用图形表示算法,直观形象,易于理解用图形表示算法,直观形象,易于理解起止框输入输出框处理框判断框流程线连接点连接点注释框位置不够防止交叉连接点是用于将画在不同地方的流程线连接起来,避免流程线的交叉或过长,使流程图清晰。第15页,本讲稿共110页 例:将欧几里德算例:将欧几里德算法用流程图的形法用流程图的形式表示。式表示。输入输入m,nr=0开始开始m%nirnnm结束结束NY输出输出n第16页,本讲稿共110页通过上面的例子可以看出流程图是表示算通过上面的例子可以看出流程图是表示算法的较好的工具法的较好的工具一个流程图包括以下几部分:一个流程图包括以下几部分:(1)表示相应操作的框表示相应操作的框(2)带箭头的流程线带箭头的流程线(3)框内外必要的文字说明框内外必要的文字说明流程线不要忘记画箭头,否则难以判定各流程线不要忘记画箭头,否则难以判定各框的执行次序框的执行次序第17页,本讲稿共110页3.用用N-S流程图表示算法流程图表示算法N-S流程图省掉了流程图中的流程线,使流程图省掉了流程图中的流程线,使得图形更紧凑。得图形更紧凑。能直观地用图形表示算法,但是修改不方能直观地用图形表示算法,但是修改不方便。便。第18页,本讲稿共110页3.用用N-S流程图表示算法流程图表示算法N-S流程图用以下的流程图符号:流程图用以下的流程图符号:ABABYNpA当p1成立A直到p2成立顺序结构顺序结构选择结构选择结构循环结构循环结构(当型)(当型)循环结构循环结构(直到型)(直到型)第19页,本讲稿共110页例例:将欧几里德算法用将欧几里德算法用N-S流程图的形式表示流程图的形式表示输入输入m,n直到r=0m%nrnmrnr=0?是是否否输出输出n第20页,本讲稿共110页4.用伪代码表示算法用伪代码表示算法伪代码是用介于自然语言和计算机语言之间伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。的文字和符号来描述算法。用伪代码写算法并无固定的、严格的语法规用伪代码写算法并无固定的、严格的语法规则,可以用英文,也可以中英文混用。则,可以用英文,也可以中英文混用。通常是借助某种高级语言的控制结构,中间通常是借助某种高级语言的控制结构,中间的操作可以用自然语言,也可以用程序设计的操作可以用自然语言,也可以用程序设计语言描述。比较容易最终转换成程序。语言描述。比较容易最终转换成程序。第21页,本讲稿共110页例:欧几里德算法用循环结构伪代码表示:例:欧几里德算法用循环结构伪代码表示:begin read m,n m%n r while r0 n m r n m%n r print nend第22页,本讲稿共110页5.用计算机语言表示算法用计算机语言表示算法计算机是无法识别流程图和伪代码的,只计算机是无法识别流程图和伪代码的,只有用计算机语言编写的程序才能被计算机有用计算机语言编写的程序才能被计算机执行。执行。设计算法的目的是为了实现算法。设计算法的目的是为了实现算法。在用流程图或伪代码描述出一个算法后,在用流程图或伪代码描述出一个算法后,还要将它转换成计算机语言程序。还要将它转换成计算机语言程序。第23页,本讲稿共110页例:用计算机语言(例:用计算机语言(C语言)表示欧几里德算法:语言)表示欧几里德算法:#include void main()int m,n,r,t;scanf(%d%d,&m,&n);if(mn)t=m;m=n;n=t;/*若若m中的数小于中的数小于n中的数,交换中的数,交换m和和n中的数中的数*/r=m%n;while(r)m=n;n=r;r=m%n;printf(%dn,n);第24页,本讲稿共110页3.2 基本语句基本语句3.2.1 程序的结构程序的结构3.2.2 C语言的基本语句语言的基本语句3.2.3 赋值语句赋值语句第25页,本讲稿共110页3.2.1 程序的结构程序的结构结构化程序设计强调程序设计风格和程序结构的结构化程序设计强调程序设计风格和程序结构的规范化,规定了几种具有良好特性的基本结构,规范化,规定了几种具有良好特性的基本结构,用它们作为构成程序的基本单元,每一种基本结用它们作为构成程序的基本单元,每一种基本结构可以包含一个或多个语句。构可以包含一个或多个语句。结构化程序设计方法的结构化程序设计方法的基本思路基本思路是:把一个复杂问是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。在人们容易理解和处理的范围内。第26页,本讲稿共110页3.2.1 程序的结构程序的结构这些基本结构具有以下特点:这些基本结构具有以下特点:(1)只有一个入口。)只有一个入口。(2)只有一个出口。)只有一个出口。(3)结构内的每一部分都有机会被执行)结构内的每一部分都有机会被执行到。到。(4)结构内不存在)结构内不存在“死循环死循环”。第27页,本讲稿共110页一个结构化的算法是由一些基本结构顺序组一个结构化的算法是由一些基本结构顺序组成的。成的。在基本结构之间不存在向前或向后的跳转,在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本结构范围之内流程的转移只存在于一个基本结构范围之内如果一个算法不能分解为若干个基本结构,如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。则它必然不是一个结构化的算法。第28页,本讲稿共110页3.2.1 程序的结构程序的结构(1)顺序结构顺序结构AB在执行完在执行完A框所指定的操作后,接着执行框所指定的操作后,接着执行B框所指定的操作。框所指定的操作。第29页,本讲稿共110页3.2.1 程序的结构程序的结构(2)选择结构选择结构ABYpNAYpN 结构中必包含一个判断框,根据给定的条件结构中必包含一个判断框,根据给定的条件结构中必包含一个判断框,根据给定的条件结构中必包含一个判断框,根据给定的条件p p是否成立而选择执是否成立而选择执是否成立而选择执是否成立而选择执行行行行A A框或框或框或框或B B框,框,框,框,无论条件无论条件无论条件无论条件p p是否成立,只能执行是否成立,只能执行是否成立,只能执行是否成立,只能执行A A框或框或框或框或B B框里的操作之一框里的操作之一框里的操作之一框里的操作之一第30页,本讲稿共110页3.2.1 程序的结构程序的结构(3)循环结构循环结构 当型循环结构当型循环结构AYpN当给定的条件当给定的条件当给定的条件当给定的条件p p成立时,反复成立时,反复成立时,反复成立时,反复执行执行执行执行A A框的操作,直到框的操作,直到框的操作,直到框的操作,直到p p条件条件条件条件不成立为止,此时不再执行不成立为止,此时不再执行不成立为止,此时不再执行不成立为止,此时不再执行A A框的操作,而跳出循环结构。框的操作,而跳出循环结构。框的操作,而跳出循环结构。框的操作,而跳出循环结构。第31页,本讲稿共110页3.2.1 程序的结构程序的结构(3)循环结构循环结构 直到型循环结构直到型循环结构ANpY先执行先执行先执行先执行A A框的操作,再判断框的操作,再判断框的操作,再判断框的操作,再判断给定的条件给定的条件给定的条件给定的条件p p是否成立,若成是否成立,若成是否成立,若成是否成立,若成立,重复执行立,重复执行立,重复执行立,重复执行A A框的操作,直框的操作,直框的操作,直框的操作,直到到到到p p条件不成立为止,结束条件不成立为止,结束条件不成立为止,结束条件不成立为止,结束循环结构。循环结构。循环结构。循环结构。第32页,本讲稿共110页3.2.2 C语言的基本语句语言的基本语句 一个实际的程序应当包含若干语句,一个语句一个实际的程序应当包含若干语句,一个语句经过编译后会产生若干条机器指令。经过编译后会产生若干条机器指令。C语言的语句用来向计算机系统发出操作指令,语言的语句用来向计算机系统发出操作指令,通常通常C语言的语句可以分为以下语言的语句可以分为以下5类。类。第33页,本讲稿共110页3.2.2 C语言的基本语句语言的基本语句语句分为以下语句分为以下5类:类:(1)控制语句:控制语句:C语言有语言有9种控制语句:种控制语句:if、switch、for、while、dowhile、continue、break、return、goto等等(2)函数调用语句:在函数调用时使用的语句函数调用语句:在函数调用时使用的语句例:例:y=7-sqrt(12);printf(y=%dn,y);第34页,本讲稿共110页3.2.2 C语言的基本语句语言的基本语句语句分为以下语句分为以下5类:类:(3)表达式语句:表达式语句是由一个表达式加一个分号组成,表达式语句:表达式语句是由一个表达式加一个分号组成,最常用的是赋值表达式语句。如:最常用的是赋值表达式语句。如:area=3.14159*r*r;j=j-1;(4)空语句:单独由空语句:单独由;构成的语句,该语句不执行任何操作,构成的语句,该语句不执行任何操作,可以用来作为循环语句中的循环体,表示循环体什么都不可以用来作为循环语句中的循环体,表示循环体什么都不做。做。(5)复合语句:将若干语句用复合语句:将若干语句用 括起,使其在语法上相当于一个语括起,使其在语法上相当于一个语句。句。第35页,本讲稿共110页3.2.3 赋值语句赋值语句赋值语句是由赋值表达式加上一个分号组成,它赋值语句是由赋值表达式加上一个分号组成,它是是C语言中使用最频繁的语句。语言中使用最频繁的语句。C语言中,通常使用赋值语句来完成主要的语言中,通常使用赋值语句来完成主要的计算功能以及对变量赋初值。计算功能以及对变量赋初值。例如:例如:float r=2.25;area=3.1415*r*r;第36页,本讲稿共110页3.2.3 赋值语句赋值语句在程序中用赋值语句,定义变量的同时对变量进行初始化,不同变量在程序中用赋值语句,定义变量的同时对变量进行初始化,不同变量具有相同的值时要分别赋值,注意下面的写法。具有相同的值时要分别赋值,注意下面的写法。int a=2,b=2,c=3;int a=b=2,c=3;对变量的初始化是在程序运行时执行的,语句对变量的初始化是在程序运行时执行的,语句float r=2.25,相当于下面的两个语句:相当于下面的两个语句:float r;r=2.25;错误错误正确正确第37页,本讲稿共110页3.3 预处理命令预处理命令3.3.1 不带参数的宏定义不带参数的宏定义3.3.2 带参数的宏定义带参数的宏定义3.3.3 文件包含文件包含3.3.4 条件编译条件编译第38页,本讲稿共110页3.3 预处理命令预处理命令预处理命令可以改进程序设计环境,提高编预处理命令可以改进程序设计环境,提高编程效率和程序的通用性。在对程序进行通常程效率和程序的通用性。在对程序进行通常的编译前,对预处理命令进行的编译前,对预处理命令进行“处理处理”。预处理命令前加预处理命令前加“#”予以说明,并且预处予以说明,并且预处理命令不加分号结束。理命令不加分号结束。C语言预处理功能主要有三种:宏定义、文语言预处理功能主要有三种:宏定义、文件包含和条件编译。件包含和条件编译。第39页,本讲稿共110页3.3.1 不带参数的宏定义不带参数的宏定义格式如下:格式如下:#define 标识符标识符 字符串字符串define是关键字,标识符也称为是关键字,标识符也称为“宏名宏名”,在预编译时将宏名替换成字符串。,在预编译时将宏名替换成字符串。第40页,本讲稿共110页【例例3-1】利用宏表示圆周率,求圆面积。利用宏表示圆周率,求圆面积。#include#define PI 3.14159void main()float area,r;printf(input r:);scanf(%f,&r);area=PI*r*r;printf(The result is:%fn,area);程序在编译时,先将宏定义的程序在编译时,先将宏定义的程序在编译时,先将宏定义的程序在编译时,先将宏定义的字符串进行替换,再进行编译。字符串进行替换,再进行编译。字符串进行替换,再进行编译。字符串进行替换,再进行编译。实际编译过程是对实际编译过程是对area=3.14159*r*rarea=3.14159*r*r进行编译进行编译运行结果:运行结果:运行结果:运行结果:第41页,本讲稿共110页3.3.1 不带参数的宏定义不带参数的宏定义说明:说明:(1)宏名通常用大写字母定义。宏名通常用大写字母定义。(2)在定义宏时,宏名和字符串之间要用空格分开。字符串中在定义宏时,宏名和字符串之间要用空格分开。字符串中的内容不要有空格。的内容不要有空格。(3)宏定义只做简单的字符串置换,不进行正确性的检查。对程序宏定义只做简单的字符串置换,不进行正确性的检查。对程序中用双引号括起来的字符串,如果其中有与宏名相同的部分,是中用双引号括起来的字符串,如果其中有与宏名相同的部分,是不进行文本替换的。不进行文本替换的。(4)宏定义后,它的有效范围是在定义命令之后,当前文件中的宏定义后,它的有效范围是在定义命令之后,当前文件中的各个函数都可以使用,直到文件结束。也可以使用各个函数都可以使用,直到文件结束。也可以使用#undef取取消宏的定义。消宏的定义。(5)宏定义可以嵌套,已被定义的宏可以用来定义新的宏。宏定义可以嵌套,已被定义的宏可以用来定义新的宏。第42页,本讲稿共110页【例例3-2】宏定义的取消。宏定义的取消。#include#define PI 3.14159void main()float area,p,r;printf(input r:);scanf(%f,&r);area=PI*r*r;printf(The result is:%fn,area);#undef PI p=2*PI*r;printf(The result is:%fn,p);P PI宏定义的有效范宏定义的有效范围在此之前围在此之前不知道不知道PIPI是宏或变是宏或变量,编译时出错量,编译时出错第43页,本讲稿共110页【例例3-3】宏定义嵌套定义。宏定义嵌套定义。#include#define M 4#define N M*3#define L 4+N/2void main()printf(L=%dn,L);运行结果运行结果运行结果运行结果:编译时经过宏替换之后输出的L被替换为4+M*3/2=4+4*3/2=10 第44页,本讲稿共110页3.3.2 带参数的宏定义带参数的宏定义格式如下:格式如下:#define 宏名宏名(参数列表参数列表)字符串字符串带参数宏定义不仅是简单的文本替换,还要带参数宏定义不仅是简单的文本替换,还要进行参数替换。进行参数替换。第45页,本讲稿共110页【例例3-4】利用带参数的宏求圆面积。利用带参数的宏求圆面积。#include#define PI 3.14159#define S(r)PI*r*rvoid main()float x,area;x=2.0;area=S(x);printf(The result is:%fn,area);运行结果:运行结果:宏定义的使用area=S(2)=3.14159*2*2第46页,本讲稿共110页3.3.2 带参数的宏定义带参数的宏定义说明:说明:(1)在宏名和在宏名和(参数列表参数列表)之间不能有空格出现,否则空格右边的之间不能有空格出现,否则空格右边的部分都作为宏体。部分都作为宏体。例如:例如:#define S (r)PI*r*r 将将(r)PI*r*r作为宏作为宏s的替换文本,是没有参数的宏,它代表的替换文本,是没有参数的宏,它代表了了(r)PI*r*r。(2)定义带参数宏定义时,字符串中的参数要适当地加上括号,否定义带参数宏定义时,字符串中的参数要适当地加上括号,否则有可能出现优先级不符的问题。则有可能出现优先级不符的问题。(3)宏名无类型,它的参数也是无类型的,只是一个符号表示,展宏名无类型,它的参数也是无类型的,只是一个符号表示,展开时代入指定的字符串得到相应的结果。开时代入指定的字符串得到相应的结果。第47页,本讲稿共110页【例例3-5】利用宏定义计算圆周长、圆面积和圆的体积。利用宏定义计算圆周长、圆面积和圆的体积。#include#define PI 3.14159#define L(R)2*PI*R#define S(R)PI*R*R#define V(R)4.0/3.0*PI*R*R*Rvoid main()float r,l,s,v;scanf(%f,&r);l=L(r);s=S(r);v=V(r);printf(r=%5.2f,l=%5.2f,s=%5.2f,v=%5.2fn,r,l,s,v);运行结果为:运行结果为:带参数的宏定义带参数的宏定义宏定义的使用宏定义的使用第48页,本讲稿共110页3.3.3 文件包含文件包含命令格式如下:命令格式如下:格式格式1:#include 格式格式2:#include 文件名文件名文件名是指存放在磁盘上的待包含的文件名。文件名是指存放在磁盘上的待包含的文件名。将指定路径中一个文件的全部内容包含到当前的源文将指定路径中一个文件的全部内容包含到当前的源文件中。文件包含可以将源文件或头文件包含到当前源件中。文件包含可以将源文件或头文件包含到当前源文件中。文件中。文件包含可以节省程序设计中的重复劳动,方便对文件包含可以节省程序设计中的重复劳动,方便对程序中公共数据的修改。程序中公共数据的修改。第49页,本讲稿共110页【例例3-6】修改上面的例修改上面的例3-5,将自行定义的,将自行定义的头文件头文件myhead.h加到加到file1.c中。中。myhead.h文件中:文件中:head()#define PI 3.14159#define L(R)2*PI*R#define S(R)PI*R*R#define V(R)4.0/3.0*PI*R*R*R第50页,本讲稿共110页file1.c文件中:文件中:#include#include“myhead.h”void main()float r,l,s,v;scanf(%f,&r);l=L(r);s=S(r);v=V(r);printf(r=%5.2f,l=%5.2f,s=%5.2f,v=%5.2fn,r,l,s,v);编译前系统会将文件编译前系统会将文件编译前系统会将文件编译前系统会将文件myhead.hmyhead.h中的所用内容复制到文件中的所用内容复制到文件中的所用内容复制到文件中的所用内容复制到文件file1.cfile1.c中,然后进行编译。结果与例题中,然后进行编译。结果与例题中,然后进行编译。结果与例题中,然后进行编译。结果与例题3-53-5的程序相同。的程序相同。的程序相同。的程序相同。将定义的头文件myhead.h加到file1.c中直接使用头文件myhead.h中的宏定义第51页,本讲稿共110页3.3.3 文件包含文件包含说明:说明:(1)一个一个#include文件包含命令只能包含一个文件,若文件包含命令只能包含一个文件,若想包含多个文件必须用多个文件包含命令。想包含多个文件必须用多个文件包含命令。(2)在一个包含文件中可以包含另一个被包含文件,即文在一个包含文件中可以包含另一个被包含文件,即文件包含可以相互嵌套的。件包含可以相互嵌套的。(3)被包含文件和其所在的文件,在预编译后将成为同一个文被包含文件和其所在的文件,在预编译后将成为同一个文件,生成一个目标文件。件,生成一个目标文件。(4)头文件中一般存储变量和函数的声明和定义。用户可头文件中一般存储变量和函数的声明和定义。用户可以将程序中常用的函数或变量定义在自己的头文件中。以将程序中常用的函数或变量定义在自己的头文件中。第52页,本讲稿共110页3.3.4 条件编译条件编译一般情况下,源程序中所有的行都参加编一般情况下,源程序中所有的行都参加编译。译。如果希望在满足一定条件下编译某些行,如果希望在满足一定条件下编译某些行,条件不满足时编译其它一些行,则需要使条件不满足时编译其它一些行,则需要使用条件编译。用条件编译。第53页,本讲稿共110页3.3.4 条件编译条件编译条件编译有以下几种格式条件编译有以下几种格式1格式一格式一#ifdef 标识符标识符程序段程序段1#else程序段程序段2#endif或或#ifdef 标识符标识符程序段程序段1#endif当标识符被定义过,则程当标识符被定义过,则程序段序段1参与编译,否则程序参与编译,否则程序段段2参与编译。参与编译。省略省略#else时,当标识时,当标识符没被定义过,则去编译符没被定义过,则去编译#endif后面的程序。后面的程序。ifdef、else和和endif都是都是关键字。关键字。第54页,本讲稿共110页【例例3-7】如果如果K被声明过,编译被声明过,编译printf(K is definedn),否则,否则编译编译printf(K is not definedn)。#include#define K 20void main()#ifdef K printf(K is definedn);#else printf(K is not definedn);#endif 运行结果:运行结果:第55页,本讲稿共110页3.3.4 条件编译条件编译2格式二格式二#ifndef 标识符标识符程序段程序段1#else程序段程序段2#endif或或#ifndef 标识符标识符程序段程序段#endif 当标识符没有被定义过,当标识符没有被定义过,则程序段则程序段1参与编译,否则程序参与编译,否则程序段段2参与编译。参与编译。省略省略#else时,当标识符已经时,当标识符已经被定义过,则去编译被定义过,则去编译#endif后面后面的程序。的程序。第56页,本讲稿共110页3.3.4 条件编译条件编译3格式三格式三#if 表达式表达式程序段程序段1#else程序段程序段2#endif 当表达式的值为真,当表达式的值为真,则编译相应的程序段则编译相应的程序段1,否则编译程序段否则编译程序段2。可以根据给定的条件,可以根据给定的条件,执行不同的功能,增加执行不同的功能,增加了程序的灵活性。了程序的灵活性。第57页,本讲稿共110页定义了L为5,对条件编译命令进行预编译时,满足if语句的条件,原样输出该字母。【例例3-8】从键盘输入一个字母,根据需要,编译输出该字母,或是从键盘输入一个字母,根据需要,编译输出该字母,或是编译输出该字母的前一个字母。编译输出该字母的前一个字母。#include#define L 5void main()char c;printf(input a letter:);scanf(%c,&c);#if L printf(%cn,c);#else printf(%cn,c-1);#endif 程序运行结果:程序运行结果:删除#define L 5,则在预处理时,不满足if语句的条件,程序的运行结果为:input a letter:ts第58页,本讲稿共110页3.4 输入与输出输入与输出 3.4.1 格式输入与输出函数格式输入与输出函数 3.4.2 字符输入与输出函数字符输入与输出函数第59页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数1.格式输入函数格式输入函数scanf()一般格式:一般格式:scanf(格式控制,地址表列)(格式控制,地址表列)格式声明第60页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数1.格式输入函数格式输入函数scanf()一般格式:一般格式:scanf(格式控制,地址表列)(格式控制,地址表列)可以是变量的地址,或字符串的首地址功能:按格式控制指定的格式从键盘上输入数据到地址功能:按格式控制指定的格式从键盘上输入数据到地址表所指定的变量地址中,地址表由若干个输入变量的地表所指定的变量地址中,地址表由若干个输入变量的地址组成。址组成。第61页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数%d表示以十进制形式输入数据,输入数据时,数表示以十进制形式输入数据,输入数据时,数据之间可以空格、回车键或跳格键据之间可以空格、回车键或跳格键分隔,分隔,不能用逗号或其它符号作为分隔符。不能用逗号或其它符号作为分隔符。&被称为取地址运算符被称为取地址运算符,&a指指a在内存中的地址,在内存中的地址,变量变量a,b,c的地址在编译连接时进行分配的。的地址在编译连接时进行分配的。1.格式输入函数格式输入函数scanf()例:例:scanf(%d%d%d,&a,&b,&c);格式声明变量的地址第62页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数在使用在使用scanf时,用时,用%加上不同的格式加上不同的格式字符,可以完成对不同变量的数据输入。字符,可以完成对不同变量的数据输入。常用的常用的scanf函数的格式控制字符见表。函数的格式控制字符见表。第63页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数第64页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数(1)可以指定输入数据所占的宽度,系统自动按照)可以指定输入数据所占的宽度,系统自动按照给定的长度截取相应的数据。例如:给定的长度截取相应的数据。例如:scanf(%4d,&x);输入:输入:123456 变量变量x将得到的数值为将得到的数值为1234,后面的数字系统将会,后面的数字系统将会自动的舍去。对于字符型数据的输入同样的处理。自动的舍去。对于字符型数据的输入同样的处理。第65页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数(2)若在)若在%后面有一个后面有一个*,则表示它指定的宽度数值无效,则表示它指定的宽度数值无效,不赋值给任何变量。例如:不赋值给任何变量。例如:scanf(%3d%*2d%3d,&a,&b);输入如下数据:输入如下数据:24613567 系统将系统将246赋值给变量赋值给变量a。%*2d对应输入的对应输入的2位数不赋给任何变量,直接跳过,位数不赋给任何变量,直接跳过,后面的后面的567赋给变量赋给变量b。第66页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数(3)如果在如果在“格式控制格式控制”字符串中包含有其它字符,则输字符串中包含有其它字符,则输入数据时在相应的位置上必须输入与此相同的字符。例入数据时在相应的位置上必须输入与此相同的字符。例如:如:scanf(%d:%d,&a,&b);scanf(%d,%d,%d,&x,&y,&z);scanf(m=%d,n=%d,&m,&n);输入数据时用如下的形式:输入数据时用如下的形式:4:5 1,2,3 m=10,n=20 第67页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数(4)使用使用%c格式输入字符时,空格符也作为有效字符输入。格式输入字符时,空格符也作为有效字符输入。例如:例如:scanf(%c%c,&ch1,&ch2);输入数据:输入数据:ab 字符字符a赋给了赋给了ch1,字符,字符赋给了赋给了ch2。%c只接受一个字符,空格也作为字符输入送给了只接受一个字符,空格也作为字符输入送给了ch2,应该连续的输入两个字符,应该连续的输入两个字符ab。第68页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数(5)在调用在调用scanf()和和printf()库函数时,库函数时,文件开头应写上以下命令:文件开头应写上以下命令:#include 或或#include stdio.h第69页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数使用使用scanf函数时应注意的问题函数时应注意的问题scanf(”%f%f%f”,a,b,c);错错scanf(”%f%f%f”,&a,&b,&c);对对对于对于scanf(a=%f,b=%f,c=%f,&a,&b,&c);1 3 2 错错 a=1,b=3,c=2 对对 a=1 b=3 c=2 错错第70页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数使用使用scanf函数时应注意的问题:函数时应注意的问题:对于对于scanf(”%c%c%c”,&c1,&c2,&c3);abc 对对 a b c 错错对于对于scanf(”%d%c%f”,&a,&b,&c);若输入若输入 1234a123o.26 第71页,本讲稿共110页3.4.1 格式输入与输出函数格式输入与输出函数使