预处理与流程控制语句.ppt
1,第3章 预处理与语句,教学内容 算法设计 C+的标准输入/输出流对象cin/cout C+程序的构成 顺序结构 选择结构 循环结构,2,第3章 预处理与语句,重点、难点算法设计 顺序结构选择结构循环结构,3,第3章 预处理与语句,教学目标掌握算法设计了解预处理熟练掌握C+的标准输入输出流对象熟练掌握C+程序的构成熟练掌握C+的3种基本结构会用C+解决实际问题,4,第3章 预处理与语句,3.1 预处理3.2 程序的三种基本结构及流程图3.3 顺序结构及语句实现3.4 分支结构及语句实现3.5 循环结构及语句实现3.6 辅助控制语句3.7 程序实例,5,3.1 预处理,预处理命令不是C+语言本身的组成部分,不能直接对它们进行编译,他们是在程序被正常编译之前执行的,故称为预处理命令。预处理命令都是以“#”开头,末尾不加分号的命令行。C+提供了3种预处理命令:()宏定义()文件包含()条件编译,6,3.1.1 宏定义,1.不带参数宏定义【格式】#define 标识符 字符序列 功能:用指定标识符(宏名)代替字符序列(宏体)在编译预处理时,将宏名用字符串替换。宏名通常用大写以区别于变量名。例如:#define PI 3.1415926,7,8,2.有参宏,在编译预处理时,将宏名用字符串中与参数表相同的字符序列替换。【实例3-2】求圆面积。,【格式】#define(),#define PI 3.1415926#define AREA(r)r*r*PI#include void main()float r=2;coutAREA(r);,9,(1)带参数的宏只给出参数名,不能指定参数的类型;与函数的区别;(2)要注意宏替换所代来的副作用;解决的方法:加()#define PI 3.1415926#define AREA(a,b)a*b 改为:(a)*(b)#include void main()float c;c=AREA(2+3,3+10);coutcendl;(3)宏名与()之间不能有空格;函数可以有。,【说明】有参宏,10,(1)定义形式不一样。带参数的宏只给出参数名,不能指定参数的类型;(2)处理程序不一样。宏:编译预处理程序处理;函数:编译程序处理;(3)处理方式不一样。宏:不进行语法检查;函数:检查语法;(4)函数可以有返回值,宏没有返回值的概念;(5)多次调用同一个宏,会增加程序的长度;函数调用不会增加程序的长度。,宏与函数的区别,11,3.1.2 文件包含,所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。,12,3.1.2 文件包含,在C+中被包含文件可以是:源文件(*.c)头文件(*.h),【格式】#include/只在系统的include子目录下搜索文件#include“文件名”/先在当前目录下搜索文件,然后在系统的include子目录下搜索,13,3.1.2 文件包含,所谓“头文件”是指存放与标准函数有关的信息,或存放符号常量、类型定义、类定义及其与程序环境相关的信息的文件。头文件一般包含以下几类内容:(1)对类型的声明。(2)函数声明。(3)内置(inline)函数的定义。(4)宏定义。用#define定义的符号常量和用const声明的常变量。(5)全局变量定义。(6)外部变量声明。如extern int a;(7)还可以根据需要包含其他头文件。,14,15,3.1.3 条件编译,当标识符已被#define定义过时,编译程序段1,否则编译程序段2。,1.宏名作为编译条件【格式1】#ifdef#else#endif,16,当标识符未被#define定义过时,编译程序段1,否则编译程序段2。,条件编译,【格式2】#ifndef#else#endif,17,条件编译,2.表达式作为编译条件【格式3】#if#else#endif,当表达式的值为真,则编译程序段1,否则编译程序段2。,18,19,20,21,3.2 程序的三种基本结构及流程图,3.2.1 C+语句概述C+语句可以分为以下4种:1.表达式语句 sum=sum+n;2.流程控制语句3.复合语句 4.其他语句,22,C+语句概述,复合语句 复合语句也称为块语句,是由一对括起来的零个或多个语句组成。在语法上,复合语句被视为一条语句。例如:z=x+y;if(z100)z=z-100;coutz;,【注意】复合语句中最后一个语句中最后的分号不能省略。,23,C+语句概述,复合语句可以嵌套使用。复合语句一般用于下列两种情况:(1)当语句上要求一条语句,但又难于用一条简单语句表达时,用复合语句。(2)当声明的名字仅在某一范围内使用时,使用块语句使其形成局部化的块结构。,24,25,3.2.2 程序的三种基本结构,图3-2 三种基本结构,26,三种基本结构共同的特点,(1)只有一个入口点,一个出口点。(2)对于每个操作都有一条路径,即从入口到出口要通过每个操作。,27,3.2.3 流程图,28,3.2.4 程序的组成,程序一般由3部分组成:输入/已知处理/求解输出(必须的)/答,29,3.3 顺序结构及语句实现,【功能】顺序执行 A、B操作。,30,3.3.1 标准输出流对象cout,C+的输出和输入是用“流”(stream)的方式实现的。流是指来自设备或传送给设备的数据流。C+的输入输出流库中提供了标准输入cin和标准输出cout流对象。iostream.h,31,cout是标准输出流对象,用于向标准输出设备-显示器输出数据。数据的输出是通过插入运算符将字符插入到输出流中的。,标准输出流对象cout,32,标准输出流对象cout,【格式】cout表达式1表达式2;,【说明】(1)在一个cout中,可以连续使用多个插入运算符输出多个数据。(2)输出多个表达式时,各表达式之间无空格输出。(3)cout可以输出任何基本类型的数据。,33,【例3-3-1】标准输出流cout示例,#include void main()char ch1,ch2;int x,y;coutch1ch2;x=ch2-ch1;y=ch1+ch2;coutx=xendl;couty=yendl;,结果:input ch1,ch2=h tx=12y=220,34,【例3-3-2】标准输出流cout示例,#include void main()int i=3;float r=2.0,p;cout2*-i=2*-iendl;i=r/i;couti=r/i=i n;r/=(i+3);coutr=r/(i+3)=rendl;i=2%3;couti=2%3=iendl;,r=6/3;coutr=rends;p=6.0/3;coutp=pendl;,结果:2*-i=-6i=r/i=0r=r/(i+3)=0.666667i=2%3=2r=2 p=2,35,标准输出流cout,【说明】(1)操纵符ends作用于输出流时,输出一个空字符0。(2)操纵符endl作用于输出流时,输出一个回车换行符n,并刷新流。(3)输出浮点型数据时,插入运算符试图输出占最小空间的值,所以输出6.0/3的值是2,而不是2.0。,36,【例3-3-3】标准输出流cout(oct,hex)示例,#include void main()int a=3,m,k;m=(a=3*5,4*6,a*5);int i=5;k=(i+,i=2);couti=iendl;coutk=kendl;couta=aendl;coutm=mendl;coutoct;couti=iendl;coutk=kendl;,couta=aendl;coutm=mendl;couthex;couti=iendl;coutk=kendl;couta=aendl;coutm=mendl;,dec:i=6 k=0a=15 m=75oct:i=6 k=0,a=17 m=113hex:i=6 k=0a=f m=4b,37,iomanip库中常用的操纵符及其功能,在C+的iomanip库中定义了一些输出流操纵符(manipulator),用于控制提取字符的行为。这些操纵符可以作为右操作对象出现在提取运算符的右边。当程序中使用这些操纵符时,要包含iomanip.h头函数。,38,iomanip库中常用的操纵符及其功能,表中的操纵符具有持续性,即对于所输出的数据都按其指定方式显示,直到指定了另外的显示方式为止。,39,【例3-3-4】iomanip库中常用的操纵符示例,#include#include void main()float x,y;float fx;coutxy;fx=x/y;cout123622569.32564-65980000.32 0.0000001235647endl;coutauto:fx=fx y=yendl;coutscientific:setiosflags(ios:scientific);coutfx=fx y=yendl;coutfixed:setiosflags(ios:fixed);coutfx=fx y=yendl;,40,【例3-3-5】示例结果,结果:input x,y=31 61.23623e+008-6.598e+007 1.23565e-007auto:fx=5.16667 y=6scientific:fx=5.166667e+000 y=6.000000e+000fixed:fx=5.16667 y=6,41,标准输出流cout,【说明】(1)浮点数默认的输出方式是自动方式,即输出6位有效位数字,超过6位的按四舍五入截断。(2)自动方式下,如果输出比较大、比较小或接近于0的数时,系统会自动按科学法表示。(3)对于浮点数,操纵符setiosflags(ios:scientific)和setiosflags(ios:fixed)分别设置其输出方式为科学表示法或定点表示法。,42,3.3.2 标准输入流对象cin,cin是标准输入流对象,用于从标准输入设备键盘上读取数据。当用户在键盘上输入字符时,输入的字符顺序形成了输入流。数据的输入是通过提取运算符从输入流中提取的。,43,标准输入流对象cin,【说明】(1)在一个cin中,可以连续使用多个提取符输入多个数据。(2)提取符后面的表达式可以是获得数据的变量或对象。(3)cin可以输入任何基本类型的数据。,【格式】cin表达式1表达式2;,44,45,标准输入流对象cin,【说明】(1)输入多个数据时,每两个数据之间用空格、制表符或换行符隔开。(2)提取符从流中提取字符时,只提取除空格、制表符或换行符之外的字符,而空格、制表符或换行符被跳过。(3)提取字符时,整数的首字符可以是符号字符(+或-)或整数字符;浮点数的首字符可以是小数点或整数字符。(4)输入字符型数据时,不要用单引号括起来。,46,47,iostream库中常用的操纵符及其功能,iostream库中定义了一些输入输出流操纵符(manipulator),用于控制流的格式。这些操纵符可以作为右操作对象出现在提取运算符和插入运算符的右边。,48,iostream库中常用的操纵符及其功能,49,【说明】(1)从键盘输入十六进制或八进制数据时,不需要加前缀0 x或0。(2)操纵符dec、hex和oct具有持续性,即对于所输入的数据都按其指定的基数表示,直到指定了另外的基数为止。例如:cinoctxy;/输入两个八进制数cinhexab;/输入两个十六进制数,iostream库中常用的操纵符及其功能,50,3.3.3 scanf和printf函数,在C语言中是用printf函数进行输出,用scanf函数进行输入的。C+保留了C语言的这一用法。scanf函数一般格式是:,scanf(格式控制,输入表列),printf函数的一般格式是:,printf(格式控制,输出表列),51,【例3-3-7】scanf和printf函数示例,#include/包含的头文件是stdio.hint main()int a;float b;char c;/注意在变量名前要加地址运算符,52,算法:输入a,b,c的值求b2-4ac求x的值输出,【例3-3-8】求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac0。,53,【例3-3-9】程序,#include#include void main()float a,b,c,x1,x2;cinabc;x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);coutx1=x1endl;coutx2=x2endl;注意:这里用到求平方根的函数,所以在文件包含里面要用到math.h的数学公式头文件。,54,【例3-3-10】已知三角形的3边长,求三角形的面积,#include#include void main()float a,b,c,l,area;/variable define coutabc;/input a,b,c l=(a+b+c)/2;area=sqrt(l*(l-a)*(l-b)*(l-c);/calculate area cout“area=”areaendl;,55,问题,a,b,c不能构成三角形,怎么办?,