C++及Windows可视化程序设计第2章结构化编程基础_第1页
C++及Windows可视化程序设计第2章结构化编程基础_第2页
C++及Windows可视化程序设计第2章结构化编程基础_第3页
C++及Windows可视化程序设计第2章结构化编程基础_第4页
C++及Windows可视化程序设计第2章结构化编程基础_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

1、第第2章章 结构化编程基础结构化编程基础 2.1 典型典型c+程序结构程序结构 2.2 关系运算与逻辑运算关系运算与逻辑运算 2.3 结构化程序设计概述结构化程序设计概述 2.4 控制选择结构控制选择结构 2.5 循环控制结构设计循环控制结构设计 实验实验 习题习题 无无论采用何种编程技术,总离不开最基本的结构论采用何种编程技术,总离不开最基本的结构 化程序设计思想。化程序设计思想。 本本章将首先结合实例简要介绍章将首先结合实例简要介绍c+语言的对象在语言的对象在 基于过程设计中的使用方法,然后结合使用对象简基于过程设计中的使用方法,然后结合使用对象简 要介绍结构化程序的基本设计原理,既为基于

2、过程要介绍结构化程序的基本设计原理,既为基于过程 的编程打下基础,也的编程打下基础,也加深使用对象的概念加深使用对象的概念。 本节将通过求圆面积的程序,介绍典型的本节将通过求圆面积的程序,介绍典型的c+程序程序 结构,目的是结合例题复习上一章的内容,并为通结构,目的是结合例题复习上一章的内容,并为通 过编程学习和掌握程序控制结构打下基础。过编程学习和掌握程序控制结构打下基础。 【例例2.1】 编写一个程序,在主函数中输入圆的半编写一个程序,在主函数中输入圆的半 径,调用函数求圆的面积。为了便于介绍,在注释径,调用函数求圆的面积。为了便于介绍,在注释 中给程序语句编上号,空行是为了说明程序风格而

3、中给程序语句编上号,空行是为了说明程序风格而 设的。设的。 #include /1标准库头文件标准库头文件 #include /2数学运算函数数学运算函数pow的头文件的头文件 using namespace std; /3使用命名空间使用命名空间 const double pi=3.14159;/4定义常量定义常量pi 2.1 典型典型c+程序结构程序结构 double area(double); /5函数函数area的原型声明的原型声明 void main() /6无返回值的主程序无返回值的主程序 /7主函数开始主函数开始 double r(0),s=0; /8演示两种初始化方法演示两种初

4、始化方法 coutr; /10将输入值赋给将输入值赋给r s=area(r); /11调用调用area函数函数 cout圆的面积是:圆的面积是: sendl;/12输出结果输出结果 /13主函数结束主函数结束 /本函数计算圆的面积本函数计算圆的面积 14 double area(double r) /15定义定义area函数函数 returnpi*pow(r,2); /16函数体,调用函数体,调用pow求求r的平方的平方 程序运行结果如下:程序运行结果如下: 请输入半径:请输入半径: 10 圆的面积是:圆的面积是: 314.159 c+函数有函数有库函数库函数(标准函数)和(标准函数)和自定义

5、函数自定义函数两类,两类, 本例求圆面积的函数本例求圆面积的函数area就是自定义函数。就是自定义函数。 c+程序使用变量的基本规则是程序使用变量的基本规则是先声明先声明,后使用后使用; 对函数调用也是如此。如果没有语句对函数调用也是如此。如果没有语句5,当编译主函,当编译主函 数数main扫描到语句扫描到语句 s=area(r); 时,尚没有见到时,尚没有见到area函数,这时就会报错。所以在函数,这时就会报错。所以在 主函数之前使用语句主函数之前使用语句5对对area函数进行原型声明,即函数进行原型声明,即 double area(double);/函数函数area的原型声明的原型声明 2

6、.1.1 函数和函数原型函数和函数原型 上上面的语句声明了面的语句声明了area的函数原型,即只列出参数的函数原型,即只列出参数 的数据类型。它向编译系统声明,后面有一个的数据类型。它向编译系统声明,后面有一个area 函数,该函数有一个函数,该函数有一个double类型的参数,函数返回类型的参数,函数返回 值类型也是值类型也是double。编译系统记录下调用这个函数。编译系统记录下调用这个函数 所需要的信息,然后根据函数原型对程序中调用函所需要的信息,然后根据函数原型对程序中调用函 数的合法性进行全面的检查。数的合法性进行全面的检查。 因因为是检查调用函数的类型是否和声明的一致,所为是检查调

7、用函数的类型是否和声明的一致,所 以声明时不需要给出参数的变量名称。如果使用下以声明时不需要给出参数的变量名称。如果使用下 述方式声明:述方式声明: double area(double r); 因为编译系统不检查参数名,所以效果一样。因为编译系统不检查参数名,所以效果一样。 为为了全面严格检查调用函数是否匹配,应该养成使了全面严格检查调用函数是否匹配,应该养成使 用函数原型声明的好习惯。用函数原型声明的好习惯。 在在c+中,每一个函数都有基本相同的形式:中,每一个函数都有基本相同的形式: 函数类型声明函数名(形式参数列表)函数类型声明函数名(形式参数列表) 变量声明变量声明 语句部分语句部分

8、 函函数可按任何顺序出现,且可出现在一个源程序文数可按任何顺序出现,且可出现在一个源程序文 件或多个源程序文件中。件或多个源程序文件中。 函函数定义中不可缺少的部分是:数定义中不可缺少的部分是: 函数类型声明函数类型声明 函数名函数名() 其他部分根据需要来确定有无。其他部分根据需要来确定有无。 分分析函数的定义形式,可以把定义分为两部分析函数的定义形式,可以把定义分为两部分:函:函 数声明部分数声明部分和和函数体函数体。 1. 函数声明部分函数声明部分 函函数类型声明用来定义函数返回值的数据类型,可数类型声明用来定义函数返回值的数据类型,可 使用基本数据类型和自定义类型。使用基本数据类型和自

9、定义类型。 c+编译系统要求必须指定类型,无返回值函数的编译系统要求必须指定类型,无返回值函数的 类型为类型为void。 在在c+程序里,子程序和函数是一个意思,都称为程序里,子程序和函数是一个意思,都称为 函数。函数。 函函数名是识别函数的名字,可用英文字母数名是识别函数的名字,可用英文字母(az, az)、数字及下划线(、数字及下划线(_)组成的字符序列构成,)组成的字符序列构成, 可使用长名字,而且下划线可作为名字的开始,例可使用长名字,而且下划线可作为名字的开始,例 如如_func()。 在在编写程序时,这些书写方法都会碰到,应该熟练编写程序时,这些书写方法都会碰到,应该熟练 地掌握它

10、们。地掌握它们。 形形式参数列表在函数名后的圆括号式参数列表在函数名后的圆括号“()()”内,这内,这 里声明的参数是里声明的参数是形式参数形式参数(例(例abs函数的函数的int a),简),简 称称形参形参(亦称(亦称哑元哑元)。)。 当当调用该函数时,形参将被实际参数(亦称实元)调用该函数时,形参将被实际参数(亦称实元) 所替换,这种替换常叫做所替换,这种替换常叫做哑实结合哑实结合。函数也可没有。函数也可没有 参数,但函数名后的圆括号参数,但函数名后的圆括号“()()”不能省略不能省略。 2. 函数体函数体 函函数体是处理需要完成功能的部分,它从花括号数体是处理需要完成功能的部分,它从花

11、括号 “” 开始,直到与此对应的花括号开始,直到与此对应的花括号 “”为止。为止。 变变量说明通常接在量说明通常接在“”的后面,接在变量说明后的的后面,接在变量说明后的 是语句部分。函数体的最后是是语句部分。函数体的最后是“”,表示该函数到,表示该函数到 此结束。此结束。 c+中也常使用空的函数体函数。例如:中也常使用空的函数体函数。例如: void tmpc() 这里这里tmpc 是函数名。因为是函数名。因为“” 内没有任何可供执内没有任何可供执 行的语句,所以该函数一旦被调用,就什么也不做行的语句,所以该函数一旦被调用,就什么也不做 而立即返回到调用它的函数里去,这就是而立即返回到调用它的

12、函数里去,这就是c+程序程序 的的最小函数最小函数形式。这种函数有两种用途:形式。这种函数有两种用途: 第第1种是种是 用在程序开发时,为给将来要设置的函数事先安排用在程序开发时,为给将来要设置的函数事先安排 一个位置,往往给函数起个暂时的名字,待以后再一个位置,往往给函数起个暂时的名字,待以后再 设计这个函数。当设计正确之后,再将它改为合适设计这个函数。当设计正确之后,再将它改为合适 的名字。第的名字。第2种是用在继承中,基类声明一个函数种是用在继承中,基类声明一个函数 作为接口,由派生类根据需要去定义它的功能。作为接口,由派生类根据需要去定义它的功能。 c+语言仍然可以使用宏定义。无参数的

13、宏作为语言仍然可以使用宏定义。无参数的宏作为 常量,而带参数的宏则可以提供比函数调用更高的常量,而带参数的宏则可以提供比函数调用更高的 效率。效率。 预预处理只是进行简单的文本代替而不进行语法检处理只是进行简单的文本代替而不进行语法检 查,所以会存在一些问题。例如:查,所以会存在一些问题。例如: #define bufsize 100 这里的这里的bufsize 只是一个名字,不占用存储空间只是一个名字,不占用存储空间 并且能被放在一个头文件中。在编译期间编译器将并且能被放在一个头文件中。在编译期间编译器将 用用“100”来代替所有的来代替所有的bufsize。这种简单的置。这种简单的置 换常

14、常会隐藏一些很难发现的错误,并且这种方法换常常会隐藏一些很难发现的错误,并且这种方法 还存在类型问题。比如这个还存在类型问题。比如这个bufsize 究竟是整数究竟是整数 还是浮点数?而使用还是浮点数?而使用const,则把值代入编译过程,则把值代入编译过程 即可即可 2.1.2 const修饰符和预处理程序修饰符和预处理程序 解决这些问题。和上面宏定义等效的语句如下:解决这些问题。和上面宏定义等效的语句如下: const int bufsize=100; 这样就可以在任何编译器需要知道这个值的地方使这样就可以在任何编译器需要知道这个值的地方使 用用bufsize,并且编译器在编译过程中可以通

15、过,并且编译器在编译过程中可以通过 必要的计算,把一个复杂的常量表达式缩减成简单必要的计算,把一个复杂的常量表达式缩减成简单 的。的。 对对于某些更复杂的情况,宏定义往往不如常量来于某些更复杂的情况,宏定义往往不如常量来 得简洁清楚,用得简洁清楚,用const 完全可以代替无参数的宏。完全可以代替无参数的宏。 用用关键字关键字const 修饰的标识符是一类特殊的常量,修饰的标识符是一类特殊的常量, 称为符号常量,或称之为称为符号常量,或称之为const 变量。变量。 const 修饰符的使用也很简单。事实上,对基本数修饰符的使用也很简单。事实上,对基本数 据类型的变量,一旦加上据类型的变量,一

16、旦加上const 修饰符,编译器就修饰符,编译器就 将其视为一个常量,不再为它分配内存,并且每当将其视为一个常量,不再为它分配内存,并且每当 在程序中遇到它时,都用在说明时所给出的初始值在程序中遇到它时,都用在说明时所给出的初始值 取代它。取代它。 使使用用const 可以使编译器对处理内容有更多的了解,可以使编译器对处理内容有更多的了解, 从而对其进行类型检查,同时还能避免对常量的不从而对其进行类型检查,同时还能避免对常量的不 必要的内存分配并可改善程序的可读性。必要的内存分配并可改善程序的可读性。 因因为被为被const 修饰的变量的值在程序中不能被改变,修饰的变量的值在程序中不能被改变,

17、 所以在声明符号常量时,必须对符号常量进行初始所以在声明符号常量时,必须对符号常量进行初始 化,除非这个变量是用化,除非这个变量是用extern 修饰的外部变量。修饰的外部变量。 例例如:如: const int i=8; const int d;/错误!错误! extern const int d;/可以可以 const 的用处不仅仅是在常量表达式中代替宏定义。的用处不仅仅是在常量表达式中代替宏定义。 如果一个变量在生存期中的值不会改变,就应该用如果一个变量在生存期中的值不会改变,就应该用 const 来修饰这个变量,以提高程序的安全性。来修饰这个变量,以提高程序的安全性。 c+语言预处理程

18、序不是语言预处理程序不是c+编译程序的一部分,编译程序的一部分, 它负责分析处理几种特殊的语句,这些语句称为预它负责分析处理几种特殊的语句,这些语句称为预 处理语句。处理语句。 预预处理程序对这几种特殊语句的分析处理是在编译处理程序对这几种特殊语句的分析处理是在编译 程序的其他部分之前进行的。为了与一般的程序的其他部分之前进行的。为了与一般的+程程 序语句相区别,所有预处理语句都以位于行首的符序语句相区别,所有预处理语句都以位于行首的符 号号“”开始。开始。 预预处理语句有处理语句有3种,它们分别是种,它们分别是宏定义宏定义、文件包含文件包含 和和条件编译条件编译。 c+预处理程序和有关语句能

19、够帮助程序员编写易预处理程序和有关语句能够帮助程序员编写易 读、易改、易移植并便于调试的程序,对于模块化读、易改、易移植并便于调试的程序,对于模块化 程序设计也提供了很大的帮助。例如语句程序设计也提供了很大的帮助。例如语句 define pi 3.14159 是用名字是用名字pi来代替数字来代替数字3.14159,又例如:,又例如: define yes 1 define no 0 则定义则定义 yes和和no分别是分别是1和和0。当然,在这些场合。当然,在这些场合 下,最好是使用下,最好是使用const语句。语句。 预预处理程序把所有出现的、被定义的名字全部替换处理程序把所有出现的、被定义的

20、名字全部替换 成对应的成对应的“字符序列字符序列”。define中的名字与中的名字与c+中中 标识符有相同的形式,为了区别,往往用大写字母标识符有相同的形式,为了区别,往往用大写字母 来表示(标识符用小写字母)。这也适合来表示(标识符用小写字母)。这也适合const语句。语句。 【例例2.1】中的语句中的语句1是文件是文件包含语句包含语句,它指的是一,它指的是一 个程序把另一个指定文件的内容包含进来。书写时,个程序把另一个指定文件的内容包含进来。书写时, 可以使用可以使用引号引号也可以用也可以用尖括号尖括号。例如:。例如: include filename或者或者 include 都是在程序中

21、把文件都是在程序中把文件filename的内容(引号或尖括的内容(引号或尖括 号是一定要的)包含进来。号是一定要的)包含进来。 另另外还要注意,文件名是用双引号还是尖括号括外还要注意,文件名是用双引号还是尖括号括 起来,其含义并不一样。使用尖括号时,起来,其含义并不一样。使用尖括号时,c+编译编译 系统将首先在系统将首先在c+语言系统语言系统设定的目录设定的目录中寻找包含中寻找包含 文件,如果没有找到,就到文件,如果没有找到,就到指定的目录指定的目录中去寻找,中去寻找, 这是引用系统提供的包含文件所采用的方法。这是引用系统提供的包含文件所采用的方法。 自自己定义的包含文件一般都放在自己指定的目

22、录己定义的包含文件一般都放在自己指定的目录 中,所以在引用它们时,就采用双引号,以通知中,所以在引用它们时,就采用双引号,以通知 c+编译器在用户当前目录下或指定目录下寻找包编译器在用户当前目录下或指定目录下寻找包 含文件。含文件。 指指定的目录不必在同一个逻辑盘中。例如自己定定的目录不必在同一个逻辑盘中。例如自己定 义的包含文件义的包含文件myfile.h在在e盘的盘的prog目录中,则引用目录中,则引用 形式为形式为 include e:progmyfile.h 在在程序设计中,文件包含语句是非常有用的。一程序设计中,文件包含语句是非常有用的。一 般般c+系统中带有大量的系统中带有大量的.

23、h文件,用户可根据不同文件,用户可根据不同 的需要将相应的的需要将相应的 .h 文件包含起来。文件包含起来。 在在【例例2.1】中,因为要用到中,因为要用到c+语言提供的幂运语言提供的幂运 算函数算函数pow,pow声明在数学运算库头文件声明在数学运算库头文件math.h 中,所以要用中,所以要用 include 语句。标准输入输出是定义在标准库语句。标准输入输出是定义在标准库 iostream.h 中中 的,所以要同时用到如下两条语句:的,所以要同时用到如下两条语句: include using namespace std; 一一般的般的c+程序都离不开这两条语句,初学程序都离不开这两条语句

24、,初学c+语语 言的读者也最容易遗漏这两条语句。言的读者也最容易遗漏这两条语句。 一一个好的程序设计者应该在程序中正确使用注释来个好的程序设计者应该在程序中正确使用注释来 说明整个程序的功能、注意事项及有关算法等。说明整个程序的功能、注意事项及有关算法等。 有有人认为,注释愈多,程序的可读性和可维护性愈人认为,注释愈多,程序的可读性和可维护性愈 好,其实不然,仅需在必要的地方进行注释即可。好,其实不然,仅需在必要的地方进行注释即可。 也也就是说,应该加的是就是说,应该加的是程序的注释程序的注释,不是不是对对程序的程序的 说明说明。行的注释形式是。行的注释形式是“/”,也可使用,也可使用c语言的

25、注语言的注 释方式释方式“/* */”,但一定要,但一定要配对使用配对使用。 2.1.3 程序注释程序注释 c+语言的语句是用来向计算机系统发出操作指语言的语句是用来向计算机系统发出操作指 令的。一条语句经过编译后生成若干条机器指令。令的。一条语句经过编译后生成若干条机器指令。 一个为实现特定目的的程序应包含若干条语句,即一个为实现特定目的的程序应包含若干条语句,即 一个一个c+程序可以由若干个源程序程序可以由若干个源程序文件文件(分别编译(分别编译 的文件模块)组成,一个源文件可以由若干个的文件模块)组成,一个源文件可以由若干个函数函数 和和预编译命令预编译命令组成,一个函数又由组成,一个函

26、数又由数据定义和执行数据定义和执行 语句语句两部分组成。一条完整的语句必须以分号两部分组成。一条完整的语句必须以分号“;” 结束。结束。 可可以把程序语句分成如下几类。以把程序语句分成如下几类。 2.1.4 程序语句程序语句 1. 声明语句声明语句 用用来声明对象的类型和初值。来声明对象的类型和初值。【例例 2.1】 中的第中的第 8 条语句是把对象条语句是把对象r和和s声明为双精度的浮点对象,并声明为双精度的浮点对象,并 赋初值为零。赋初值为零。 最最好养成在声明对象的同时进行初始化。好养成在声明对象的同时进行初始化。 人人们已经习惯于称这些对象为变量,所以在面向们已经习惯于称这些对象为变量

27、,所以在面向 对象设计时,仍然喜欢称其为变量。对象设计时,仍然喜欢称其为变量。 从从现实世界来看,它们确实映射着一个确定的对现实世界来看,它们确实映射着一个确定的对 象。对这些简单而基本的对象,虽然习惯地称其为象。对这些简单而基本的对象,虽然习惯地称其为 “变量变量”,但为了尽快养成使用对象思考问题的习,但为了尽快养成使用对象思考问题的习 惯,建议改称惯,建议改称对象对象。 2. 表达式语句表达式语句 由由一个表达式构成一个一个表达式构成一个语句语句,用以描述算术运算、,用以描述算术运算、 逻辑运算或产生某种特定动作。逻辑运算或产生某种特定动作。 最最典型的用法是由赋值表达式构成一个典型的用法

28、是由赋值表达式构成一个赋值语句赋值语句。 例如:例如:“a=3”是一个赋值表达式,而是一个赋值表达式,而“a=3;”就就 是一条赋值语句。从中可以看到,在一个表达式的是一条赋值语句。从中可以看到,在一个表达式的 最后加一个分号就构成了一条语句。一条语句最后最后加一个分号就构成了一条语句。一条语句最后 必须出现分号,必须出现分号,分号是语句中不可缺少的一部分分号是语句中不可缺少的一部分。 例例如:如: i=i+1 /是表达式,不是语句是表达式,不是语句 i=i+1;/是语句,作用是使是语句,作用是使i的值加的值加1 由此可见由此可见,任何表达式都可以加上分号而成为语句。任何表达式都可以加上分号而

29、成为语句。 例例如:如: x+y; 也是一条语句,作用是完成也是一条语句,作用是完成x+y的操作,它是合法的操作,它是合法 的,但没有实际意义。的,但没有实际意义。 【例例 2.1】中的语句中的语句 s=area(r); 也是表达式语句。也是表达式语句。 3. 程序控制语句程序控制语句 程序控制语句是用来描述语句的执行条件与执行顺程序控制语句是用来描述语句的执行条件与执行顺 序的语句。序的语句。c+语言的控制语句有语言的控制语句有 if()else 条件语句条件语句 for() 循环语句循环语句 while() 循环语句循环语句 dowhile() 循环语句循环语句 continue 结束本次

30、循环语句结束本次循环语句 break 中止循环或中止循环或switch语句语句 switch 多分支选择语句多分支选择语句 goto 转移语句转移语句 return 从函数返回语句从函数返回语句 以上以上9种语句中的括号种语句中的括号()表示其中是一个条件,表示其中是一个条件, 表示内嵌的语句。例如一条表示内嵌的语句。例如一条if()else的具体语句的具体语句 可写成:可写成: if(xy) z=x; else z=y; 详细的使用方法在后续章节叙述。详细的使用方法在后续章节叙述。 4. 复合语句复合语句 c+语句又可分为简单语句和复合语句两种。在语句又可分为简单语句和复合语句两种。在 c+

31、语言中,诸如表达式语言中,诸如表达式 x=1 和和 coutx 等,其后加上分号,即变成等,其后加上分号,即变成 x=1;和;和 cout=0) /1 /2 cout输入为:输入为: a=0的条件成立时,执行的条件成立时,执行if后的复合语句,否则后的复合语句,否则 执行执行else之后的复合语句。之后的复合语句。 结结束一个复合语句的右花括号之后不能带分号束一个复合语句的右花括号之后不能带分号 (语句(语句5和和10),否则有时可能会导致错误;不能),否则有时可能会导致错误;不能 遗漏在复合语句的最后一条语句与右花括号之间的遗漏在复合语句的最后一条语句与右花括号之间的 分号(语句分号(语句4

32、和和9)。)。 复复合语句可由若干语句组成,这些语句可以是简合语句可由若干语句组成,这些语句可以是简 单语句,还可以是复合语句,这样单语句,还可以是复合语句,这样c+语言的语句语言的语句 就形成了一种层次结构,原则上可以不断地扩大这就形成了一种层次结构,原则上可以不断地扩大这 种层次。种层次。 复复合语句在程序中是一种十分重要的结构。合语句在程序中是一种十分重要的结构。 5. 函数调用语句函数调用语句 这是由一次函数调用加一个分号而构成的一条语句。这是由一次函数调用加一个分号而构成的一条语句。 例如:例如: area(r); 6. 空语句空语句 “;”是一条空语句。它只有一个分号,所以什么是一

33、条空语句。它只有一个分号,所以什么 也不做。也不做。 c+语言中严格区分大小写字母,如变量语言中严格区分大小写字母,如变量 b 和和 b 是完全不同的两个变量。是完全不同的两个变量。 c+语言惯用小写字母,而且以下划线语言惯用小写字母,而且以下划线“_”字符字符 开头的标识符一般由系统内部使用,最好不要用它开头的标识符一般由系统内部使用,最好不要用它 作为标识符的第作为标识符的第1个字符。个字符。 习习惯上把使用宏定义的标识符用大写字母表示,惯上把使用宏定义的标识符用大写字母表示, 例如将圆周率定义为例如将圆周率定义为 pi。 2.1.5 大小写字母的使用大小写字母的使用 c+语言语言的的格式

34、格式很很自由自由,一行可以一行可以写几条写几条语句语句。 不过不过,使用适当使用适当的的格式对于充分理解这种语言非常格式对于充分理解这种语言非常 重要重要。一个适当格式一个适当格式的的程序程序和和一个一个不不适当格式适当格式的的程程 序序就像一封打得很就像一封打得很漂亮漂亮的信和一封写得的信和一封写得非常凌乱非常凌乱的的 信,给人的信,给人的印象印象是大是大不一样不一样的。的。应该应该使使源代码易于源代码易于 理解理解,特别是容易特别是容易被被输入这些程序输入这些程序的的程序程序员所员所理解理解, 这这有助于复杂程序有助于复杂程序的的调试调试及及修改以前输入修改以前输入的的代码代码。 上上面的

35、程序就是按此原则书写的。由此可见,应面的程序就是按此原则书写的。由此可见,应 使用缩进格式和必要的空行的书写风格,并使源代使用缩进格式和必要的空行的书写风格,并使源代 码具有层次性和逻辑性,以增加程序的可读性和可码具有层次性和逻辑性,以增加程序的可读性和可 操作性。操作性。 2.1.6 程序的书写格式程序的书写格式 一一般来讲,每次缩进般来讲,每次缩进 5 个字符的位置,按程序特性个字符的位置,按程序特性 设置空行。在本书中,为了节省篇幅,有意识地减设置空行。在本书中,为了节省篇幅,有意识地减 少空行。读者在输入程序时,不要模仿,应注意养少空行。读者在输入程序时,不要模仿,应注意养 成良好的书

36、写风格。成良好的书写风格。 在在书写程序语句时,一般应注意如下规则:书写程序语句时,一般应注意如下规则: 括号紧跟在函数名的后面,但在括号紧跟在函数名的后面,但在for和和while后面,后面, 应用一个空格与左括号隔开以增加可读性。应用一个空格与左括号隔开以增加可读性。 数学运算符的左右各留一个空格,以与表达式区数学运算符的左右各留一个空格,以与表达式区 别。别。 在表示参数时,逗号后面留一个空格。在表示参数时,逗号后面留一个空格。 在在for、dowhile和和while语句中,合理使用缩进、语句中,合理使用缩进、 一对花括号和空行。一对花括号和空行。 c+的的cout和和cin流能流能自

37、动识别自动识别数据类型,根据数数据类型,根据数 据类型进行读写操作,完全不需要用户设置,使用据类型进行读写操作,完全不需要用户设置,使用 非常方便。不过,有时对输入输出仍有一定的要求,非常方便。不过,有时对输入输出仍有一定的要求, 尤其是输出格式。尤其是输出格式。 c+提供了两种格式控制方式,一种是使用提供了两种格式控制方式,一种是使用iso 类类 提供的接口,另一种是使用提供的接口,另一种是使用操纵符操纵符的特殊函数,它的特殊函数,它 的特点是可以直接包含在输入和输出表达式中,因的特点是可以直接包含在输入和输出表达式中,因 此更为方便。此更为方便。 注意,不带形式参数的操纵符定义在注意,不带

38、形式参数的操纵符定义在iostream.h中,中, 带形式参数的操纵符定义在带形式参数的操纵符定义在iomanip.h中。使用它中。使用它 们时,一是要正确包含相应的头部文件,二是只有们时,一是要正确包含相应的头部文件,二是只有 与符号与符号“”连接时才起作用,三是无连接时才起作用,三是无 参数的操纵符函数不能带有参数的操纵符函数不能带有“( )”号。号。 2.1.7 数据的简单输入输出格式数据的简单输入输出格式 这这些操纵符的含义如下:些操纵符的含义如下: 名称名称 含含 义义 输入输入/输出输出 dec 设置转换基数为十进制设置转换基数为十进制 输入输入/输出输出 oct 设置转换基数为八

39、进制设置转换基数为八进制 输入输入/输出输出 hex 设置转换基数为十六进制设置转换基数为十六进制 输入输入/输出输出 showbase(int base) 输出输出 设置设置base为数制的基为数制的基(0,8, 10,16),默认为,默认为0 ws 设置跳过输入中的前导空白字符设置跳过输入中的前导空白字符 输入输入 ends 插入一个空字符插入一个空字符0以结束字符串以结束字符串 输出输出 endl 输出一个换行符并刷新流输出一个换行符并刷新流 输出输出 flush 强制刷新流强制刷新流 输出输出 名称名称 含含 义义 输入输入/输出输出 resetiosflags(long flag)

40、清除清除flag指定的标志位指定的标志位 输出输出 setiosflags(long flag) 设置设置flag指定的标志位指定的标志位 输出输出 setfill(char ch) 设置设置ch为填充字符为填充字符 输出输出 setprecision(int n) 设置浮点数输出精度设置浮点数输出精度n 输出输出 setw(int width) 设置输出数据字段设置输出数据字段 宽度宽度width 输出输出 需需要说明的是要说明的是resetiosflags 和和setiosflags操纵符,它操纵符,它 们的参数们的参数flag是引用是引用c+的类的类ios里定义的枚举常量,里定义的枚举常

41、量, 所以要使用所以要使用限定符限定符 。 下下面是几个常用常量的含义:面是几个常用常量的含义: 常量名常量名 含含 义义 ios left 输出数据按输出域左边对齐输出输出数据按输出域左边对齐输出 ios right 输出数据按输出域右边对齐输出输出数据按输出域右边对齐输出 ios showbase 输出带有一个表示制式的字符输出带有一个表示制式的字符 ios showpoint 浮点输出时必须带有一个小数点浮点输出时必须带有一个小数点 ios showpos 在正数前添加一个在正数前添加一个+号号 ios scientific 使用科学计数法表示浮点数使用科学计数法表示浮点数 ios fi

42、xed 使用定点形式表示浮点数使用定点形式表示浮点数 注意:注意: flag可以是多个常量相可以是多个常量相“与与”,例如,例如 setiosflags(ios showpoint | ios fixed)。 【例例2.2】 使用使用setw设置输出宽度的例子。设置输出宽度的例子。 #include #include using namespace std; void main() int a=29,b=1001; coutasetw(6)bendl; coutabendl; 程序的输出为:程序的输出为: 29 1001 291001 setw(6)使使b按域宽为按域宽为6 输出,即相当于在输

43、出,即相当于在a 和和b 之间之间 加入了加入了2个空格。个空格。setw(6)只对紧接着的那个元素有只对紧接着的那个元素有 效。效。 【例例2.3】 在下面的程序中,当要求输入时,均输在下面的程序中,当要求输入时,均输 入入100,给出程序的输出结果。,给出程序的输出结果。 #include #include using namespace std; const double pi=3.141592; void main() coutpiendl setprecision(0)piendl setprecision(1 )piendl setprecision(2 )piendl setpr

44、ecision(3 )piendl setprecision(7 )piendl ; int b=100; coutdec: decbendl hex: hexbendl oct: octbendl; coutbendl 100endl b; coutbendl; cout decsetiosflags(ios showpos)bendl; coutb; cout bendl; cout resetiosflags(ios showpos); cout bendl; 输出结果如下:输出结果如下: 3.14159 3.14159 3 3.1 3.14 3.141592 dec: 100 hex:

45、 64 oct: 144 144 144 input b=100 144 +100 input b=100 +100 100 setprecision(int n)是设定显示小数位数(小数点也是设定显示小数位数(小数点也 占占1位),位),1代表显示整数数字,代表显示整数数字,2才显示小数点后才显示小数点后 面的一位数。面的一位数。0等于不设,由系统决定。系统只输等于不设,由系统决定。系统只输 出出5位小数,为了将它全部输出,必须设置位小数,为了将它全部输出,必须设置7位。由位。由 此可写出前此可写出前5行输出。行输出。 程序执行程序执行cout oct命令后,将保持八进制格式输命令后,将保持

46、八进制格式输 出,输入出,输入100,但输出仍然按八进制,使用,但输出仍然按八进制,使用 cout dec 命令将它恢复为十进制方式。下面语句命令将它恢复为十进制方式。下面语句 coutdec setiosflags(ios showpos) b endl; 还将输出设置为在正的数字前面显示还将输出设置为在正的数字前面显示“+”号。这个号。这个 设置保持到使用语句设置保持到使用语句 cout resetiosflags(ios showpos); 清除该设置标志为止。如果单独使用语句清除该设置标志为止。如果单独使用语句 resetiosflags(ios showpos); 则不起作用。则不起

47、作用。 【例例2.4】 分析下面程序的输出。分析下面程序的输出。 #include #include using namespace std; void main() coutsetfill(*) setw(0)15endl setw(1)15endl setw(2)15endl setw(3)15endl setw(4)15endl; coutsetw(16)setfill(*) endl; coutsetiosflags(ios right) setw(5)1 setw(5)2 setw(5)3endl; coutresetiosflags(ios right); coutsetiosfl

48、ags(ios left) setw(5)1 setw(5)2 setw(5)3endl; 域宽域宽n比显示位数少时,则不起作用,即不影响显比显示位数少时,则不起作用,即不影响显 示。使用填充字符时,示。使用填充字符时,n比显示位数大比显示位数大1,才发生填,才发生填 充作用。充作用。 如程序所示,要显示如程序所示,要显示15个个“*”号,必须取号,必须取n=16。 setfill后面使用后面使用“ ”才能全部填充为设定字符才能全部填充为设定字符 “*”,否则将全部填充为空格。程序中使用,否则将全部填充为空格。程序中使用15个个 “*”填充,就是用这种方法实现的。清除设置标填充,就是用这种方法

49、实现的。清除设置标 志之后,才能进行新的设置。程序输出如下。志之后,才能进行新的设置。程序输出如下。 15 15 15 *15 *15 * *1*2*3 1*2*3* 【例例2.5】 演示使用转义字符的例子。演示使用转义字符的例子。 #include using namespace std; void main() cout5.0 是一个关系运算式,即是一个关系运算式,即 关系表达式。若关系表达式。若x的值是的值是6,那么此表达式的值为真。,那么此表达式的值为真。 表表2.1是是c+语言提供的语言提供的6种关系运算符及其含义。种关系运算符及其含义。 (见书见书59页页) 4种关系运算符(种关系

50、运算符(,=)的优先级别相同,)的优先级别相同, 后后2种的级别也相同。但前种的级别也相同。但前4种的级别高于后种的级别高于后2种。另种。另 外,算术运算符的优先级高于关系运算符,关系运外,算术运算符的优先级高于关系运算符,关系运 算符的优先级高于赋值运算符。算符的优先级高于赋值运算符。 表表2.1 c+ 语言提供语言提供6种关系运算符及其含义种关系运算符及其含义 关系运算符 含 义实 例 小于xy = 小于等于x 大于xy = 大于等于x=y = = 等于x = = y != 不等于x !=y 2. 关系表达式关系表达式 用用关系运算符将两个表达式关系运算符将两个表达式(可以是算术表达式或可

51、以是算术表达式或 关系表达式、逻辑表达式、赋值表达式、字符表达关系表达式、逻辑表达式、赋值表达式、字符表达 式)连接起来的式子,称为关系表达式。例如:式)连接起来的式子,称为关系表达式。例如: ab a+b=(y=7) d!=c (ab)(bc) 都是关系表达式。关系表达式的值是个逻辑值,即都是关系表达式。关系表达式的值是个逻辑值,即 “true”和和“fasle”。 c+语言有逻辑语言有逻辑(bool)型数据类型,即型数据类型,即ture为为1, false为为0。为兼容。为兼容c,1代表代表“真真”,0代表代表“假假”。 语句语句“bool stop=false;”的含义是的含义是“sto

52、p的逻辑值的逻辑值 为为0”。 假假设设a=4,b=3,c=2,对于如下的表达式,则有,对于如下的表达式,则有 ab的值为的值为“true”,表达式的值为,表达式的值为 1。 (ab)=c-1的值为的值为“true”(因为(因为ab值为值为1,等于,等于c- 1的值),表达式的值为的值),表达式的值为1。 a-bc,d的值为的值为1。 e=abc,e的值为的值为0,因为,因为“”运算符是自左至右运算符是自左至右 运算,所以先算运算,所以先算“ab”的值为的值为1,再执行关系运算:,再执行关系运算: “1c”,得值,得值0赋给赋给 e。 3. 逻辑运算符及其优先顺序逻辑运算符及其优先顺序 用用逻

53、辑运算符将关系表达式或逻辑量(即逻辑运算符将关系表达式或逻辑量(即“true” 或或“false”)连接起来的式子就是逻辑表达式。)连接起来的式子就是逻辑表达式。 c+语言提供如下语言提供如下3种逻辑运算符:种逻辑运算符: & 逻辑与(相当于其他语言中的逻辑与(相当于其他语言中的and) | 逻辑或(相当于其他语言中的逻辑或(相当于其他语言中的or) ! 逻辑非(相当于其他语言中的逻辑非(相当于其他语言中的not) 和和|是双目运算符;是双目运算符; ! 是单目运算符。符号是单目运算符。符号“|” 就是键盘第就是键盘第1排右边的排右边的“|”号,它是上档键,而号,它是上档键,而“” 号是下档键

54、。书上因为排版的字体问题,变成了一号是下档键。书上因为排版的字体问题,变成了一 条线条线“|”,编程时请注意。,编程时请注意。 例例如,对于如,对于a和和b而言,在下面的表达式中:而言,在下面的表达式中: ab 若若a、b都为真(即都为真(即a、b值均不为值均不为0),则),则 ab为真,否则为假。为真,否则为假。 ab 如如a、b都为假,则都为假,则ab为假,否则为真。为假,否则为真。 !a 若若a为真,则为真,则!a为假;若为假;若a为假,则为假,则!a为真。为真。 在在一个逻辑表达式中如果包含多个逻辑运算符,应一个逻辑表达式中如果包含多个逻辑运算符,应 按以下的优先次序进行运算:按以下的

55、优先次序进行运算: !(非)(非)(与)(与)(或),(或),! 级别为最级别为最 高;高; 综合运算时为综合运算时为 !(非)(非)算术运算符算术运算符关系运算符关系运算符和和 赋值运算符。赋值运算符。 4. 逻辑表达式逻辑表达式 如如前所述,逻辑表达式的值应该是一个逻辑量前所述,逻辑表达式的值应该是一个逻辑量 “true”或或“false”。以数值。以数值1代表代表“true”,以,以0代表代表 “false”,但判断一个量是否为,但判断一个量是否为“true”时,以时,以0代代 表表“false”,以非零代表,以非零代表“true”。即把一个非。即把一个非0数数 值认为值认为“true”

56、。 例例如:如: 若若a=2,则,则 !a 的值为的值为0。a为非为非0被认为被认为“true”,对,对 它进行非运算,得它进行非运算,得“false”,以,以0代表。代表。 若若a=3,b=5,则,则 ab 的值为的值为1。a、b为非为非0(即(即 “true”),因此),因此 ab 为为true。 若若 a=3,b=5,则,则 ab 的值为的值为1。 事事实上,逻辑运算符两侧的运算对象不但可以是实上,逻辑运算符两侧的运算对象不但可以是 数值数值0和和1,或者是,或者是0和非和非0的整数,也可以是任何类的整数,也可以是任何类 型的数据,可以是字符型、实型或对象等。不过要型的数据,可以是字符型

57、、实型或对象等。不过要 牢记,系统最终以牢记,系统最终以 0 和非和非 0 来判定它们是属于来判定它们是属于 “true”还是还是“false”。例如:。例如: ab 的值为的值为1 (因为字母(因为字母a和字母和字母b的的asc码值都不为码值都不为 0,都按,都按“true”处理)。处理)。 在在逻辑表达式的求解中,并不是所有的逻辑运算逻辑表达式的求解中,并不是所有的逻辑运算 符都被执行,只是在必须执行下一个逻辑运算符才符都被执行,只是在必须执行下一个逻辑运算符才 能求出表达式的解时,才执行该运算符。能求出表达式的解时,才执行该运算符。 1966年,年,bohm和和jacopini首次证明了

58、只要首次证明了只要3种控制种控制 结构就能表达用一个入口和一个出口的框图(流程结构就能表达用一个入口和一个出口的框图(流程 图)所能表达的任何程序逻辑。这图)所能表达的任何程序逻辑。这3种控制结构是种控制结构是 顺序结构、选择结构和循环结构。顺序结构、选择结构和循环结构。 1968年年dijkstra建议:建议: goto语句太容易把程序弄语句太容易把程序弄 乱,应从一切高级语言中去掉;只用乱,应从一切高级语言中去掉;只用3种基本控制种基本控制 结构就可以写各种程序,而这样的程序可以自顶向结构就可以写各种程序,而这样的程序可以自顶向 下阅读而不会返回。这促进一种新的程序设计思想、下阅读而不会返

59、回。这促进一种新的程序设计思想、 方法和风格的形成,以期显著提高软件生产效率和方法和风格的形成,以期显著提高软件生产效率和 降低软件维护的代价。降低软件维护的代价。 2.3 结构化程序设计概述结构化程序设计概述 1972年,年,mills进一步提出程序只应有一个入口和进一步提出程序只应有一个入口和 出口,进而填补了结构化程序设计的原则。出口,进而填补了结构化程序设计的原则。 结结构化程序设计的概念和方法,以及支持这些方构化程序设计的概念和方法,以及支持这些方 法的一整套软件工具,就构成了所谓的法的一整套软件工具,就构成了所谓的“结构化革结构化革 命命”。这是存储程序计算机问世以来对计算机界影。

60、这是存储程序计算机问世以来对计算机界影 响最大的一个软件概念。响最大的一个软件概念。 顺顺序结构是最简单而基本的结构,它是顺序执行序结构是最简单而基本的结构,它是顺序执行 各个语句,所以不再赘述。各个语句,所以不再赘述。 c+语言的结构化程序设计的语句称为程序控制语言的结构化程序设计的语句称为程序控制 结构,又可分为控制循环和控制选择(选择结构)。结构,又可分为控制循环和控制选择(选择结构)。 1. if语句语句 if语句语句在在c+语言语言里的里的基本形式基本形式有有两种两种,即,即 if(表达式表达式)语句语句1; if(表达式表达式)语句语句1; else 语句语句2; 这两种语句形式均

温馨提示

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

评论

0/150

提交评论