1、C+程序设计 中国高等院校计算机基础教育课程体系规划教材 谭浩强 编著 总 目 录 第 1篇 基 本 知 识 第 1章 C+的初步知识 第 2章 数据类型与表达式 第 2篇 面向过程的程序设计 第 3章 程序设计初步 第 4章 函数与预处理 第 5章 数组 第 6章 指针 第 7章 自定义数据类型 第 3篇 基于对象的程序设计 第 8章 类和对象 第 9章 关于类和对象的进一步讨论 第 10章 运算符重载 第 4篇 面向对象 的程序设计 第 11 章 继承与派生 第 12章 多态性与虚函数 第 13章 输入输出流 第 14章 C+工具 第 1章 C+的初步知识 第 2章 数据类型与表达式 第
2、1篇 基 本 知 识 第 1章 C+的初步知识 *1.1 从 C到 C+ *1.2 最简单的 C+程序 1.3 C+程序的构成和书写形式 1.4 C+程序的编写和实现 1.5 关于 C+上机实践 *1.1 从 C到 C+ 计算机诞生初期 ,人们要使用计算机必须用机器语言或汇编语言编写程序 世界上第一种 计算机高级语言诞生于 1954年 ,它是 FORTRAN语言 先后出现了多种计算机高级语言 其中使用最广泛 影响最大的当推 BASIC语言和 C语言 BASIC语言是 1964年在 FORTRAN语言的基础上简化而成的 ,它是为初学者设计的小型高级语言 C语言是 1972年由美国贝尔实验室的 D
3、.M.Ritchie研制成功的 它不是为初学者设计的 ,而是为计算机专业人员设计的 大多数系统软件和许多应用软件都是用 C语言编写的 但是随着软件规模的增大 ,用 C语言编写程序渐渐显得有些吃力了 C+是由 AT /使用命名空间 std int main( ) cout,这不是 C+的语句 ,而是 C+的一个预处理命令 ,它以 #开头以与 C+语句相区别 ,行的末尾没有分号 #include 是一个 包含命令 ,它的作用是将文件 iostream的内容包含到该命令所在的程序文件中 ,代替该命令行 文件 iostream的作用是向程序提供输入 或输出时所需要的一些信息 iostream是 i-o
4、-stream 3个词的组合 ,从它的形式就可以知道它代表 输入输出流 的意思 ,由于这类文件都放在程序单元的开头 ,所以称为头文件 (head file) 在程序进行编译时 ,先对所有的预处理命令进行处理 ,将头文件的具体内容代替 #include命令行 ,然后再对该程序单元进行整体编译 程序的 第 2行 using namespace std; 的意思是 使用命名空间 std C+标准库中的类和函数是在命名空间 std中声明的 ,因此程序中如果需要用到 C+标准库 (此时就需要用 #include命令行 ),就需要用 using namespace std; 作声明 ,表示要用到命名空间
5、std中的内容 在初学 C+时 ,对本程序中的第 1,2行可以不必深究 ,只需知道 : 如果程序有输入或输出时 ,必须使用 #include 命令以提供必要的信息 ,同时要用using namespace std; ,使程序能够使用这些信息 ,否则程序编译时将出错 例 1.2 求 a和 b两个数之和 可以写出以下程序 : / 求两数之和 (本行是注释行 ) #include /预处理命令 using namespace std; /使用命名空间 std int main( ) /主函数首部 /函数体开始 int a,b,sum; /定义变量 cinab; /输入语句 sum=a+b;/赋值语句
6、 cout /预处理命令 using namespace std; int max(int x,int y)/定义 max函数 ,函数值为整型 ,形式参数 x,y为整型 /max函数体开始 int z;/变量声明 ,定义本函数中用到的变量 z为整型 if(xy) z=x;/if语句 ,如果 xy,则将 x的值赋给 z else z=y; /否则 ,将 y的值赋给 z return(z);/将 z的值返回 ,通过 max带回调用处 /max函数结束 int main( ) /主函数 /主函数体开始 int a,b,m;/变量声明 cinab;/输入变量 a和 b的值 m=max(a,b); /调
7、用 max函数 ,将得到的值赋给 m cout using namespace std; int main( ) int max(int x,int y);/对 max函数作声明 int a,b,c; cinab; c=max(a,b); /调用 max函数 couty) z=x; else z=y; return(z); 只要在 被调用函数的首部的末尾加一个分号 ,就成为对该函数的函数声明 函数声明的位臵应当在函数调用之前 下面举一个 包含类 (class)和对象 (object)的 C+程序 ,目的是使读者初步了解C+是怎样体现面向对象程序设计方法的 例 1.4 包含类的 C+程序 #in
8、clude / 预处理命令 using namespace std; class Student/ 声明一个类 ,类名为 Student private: / 以下为类中的私有部分 int num; / 私有变量 num int score; / 私有变量 score public: / 以下为类中的公用部分 void setdata( ) / 定义公用函数 setdata cinnum; / 输入 num的值 cinscore; / 输入 score的值 void display( ) / 定义公用函数 display cout using namespace std; int main(
9、) int i,j; /i和 j是整型变量 i=A; /将一个字符常量赋给整型变量 i j=B; /将 一个字符常量赋给整型变量 j cout using namespace std; int main( ) char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; cout 或 #include 变量的值应该是可以变化的 ,怎么值是固定的量也称变量呢 ?其实 ,从计算机实现的角度看 ,变量的特征是存在一个以变量名命名的存储单元 ,在一般情况下 ,存储单元中的内容是可以变化的 对常变量来说 ,无非在此变量的基础上加上一个限定 : 存储单元中的值不允许变化 因此常变
10、量又称为只读变量(read-only-variable) 请区别用 #define命令定义的符号常量和用 const定义的常变量 符号常量只是用一个符号代替一个字符串 ,在预编译时把所有符号常量替换为所指定的字符串 ,它没有类型 ,在内存中并不存在以符号常量命名的存储单元 而 常变量具有变量的特征 ,它具有类型 ,在内存中存在着以它命名的 存储单元 ,可以用 sizeof运算符测出其长度 与一般变量惟一的不同是指定变量的值不能改变 用 #define命令定义符号常量是 C语言所采用的方法 ,C+把它保留下来是为了和 C兼容 C+的程序员一般喜欢用 const定义常变量 虽然二者实现的方法不同
11、,但从使用的角度看 ,都可以认为 用了一个标识符代表了一个常量 有些书上把用const定义的常变量也称为定义常量 ,但读者应该了解它和符号常量的区别 2.4 C+的运算符 C+的运算符十分丰富 ,使得 C+的运算十分灵活方便 例如把赋值号 (=)也作为运算符处理 ,这样 ,a=b=c=4就是合法的表达式 ,这是与其他语言不同的 C+提供了以下运算符 : (1) 算术运算符 +(加 )-(减 ) *(乘 ) /(除 ) %(整除求余 )+(自加 ) -(自减 ) (2) 关系运算符 (大于 )=(大于或等于 )(按位右移 ) 而 i+是先使用 i的值后 ,再执行 i=i+1 正确地使用 +和 -
12、,可以使程序简洁 清晰 高效 请注意 : (1) 自增运算符 (+)和自减运算符 (-)只能用于变量 ,而不能用于常量或表达式 (2) +和 -的结合方向是 “自右至左 ”,见附录 B (3) 自增运算符 (+)和自减运算符 (-)使用十分灵活 ,但在很多情况下可能出现歧义性 ,产生 “意想不到 ”的副作用 (4) 自增 (减 )运算符在 C+程序中是经常见到的 ,常用于 循环语句中 ,使循环变量自动加 1 也用于指针变量 ,使指针指向下一个地址 2.5.5 强制类型转换运算符 在表达式中不同类型的数据会自动地转换类型 ,以进行运算 有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成
13、所需类型 例如 : (double)a (将 a转换成 double类型 ) (int)(x+y) (将 x+y的值转换成整型 ) (float)(5%3) (将 5%3的值转换成 float型 ) 强制类型转换的一般形式为 (类型名 )(表达式 ) 注意 : 如果要进行强制类型转换的对象是一个变量 ,该变量可以不用 括号括起来 如果要进行强制类型转换的对象是一个包含多项的表达式 ,则表达式应该用括号括起来 如果写成 (int)x+y 则只将 x转换成整型 ,然后与 y相加 以上强制类型转换的形式是原来 C语言使用的形式 ,C+把它保留了下来 ,以利于兼容 C+还增加了以下形式 : 类型名 (
14、表达式 ) 如 int(x) 或 int(x+y) 类型名不加括号 ,而变量或表达式用括号括起来 这种形式类似于函数调用 但许多人仍习惯于用第一种形式 ,把类型名包在括号内 ,这样比较清楚 需要说明的是在强制类型转换时 ,得到一个所需类型的中间变量 ,但原来变量的类型未发生变化 例如 : (int)x 如果 x原指定为 float型 ,值为 3.6,进行强制类型运算后得到一个 int型的中间变量 ,它的值等于 3,而 x原来的类型和值都不变 例 2.4 强制类型转换 #include using namespace std; int main( ) float x; int i; x=3.6;
15、 i=(int)x; cout using namespace std; int main( ) unsigned short a; short int b=-1; a=b; cout=, b=a;/ b是左值 c=b;/ b也是右值 赋值表达式中的 “表达式 ”,又可以是一个赋值表达式 如 a=(b=5) 下面是赋值表达式的例子 : a=b=c=5 (赋值表达式值为 5,a,b,c值均为 5) a=5+(c=6)(表达式值为 11,a值为 11,c值为 6) a=(b=4)+(c=6) (表达式值为 10,a值为 10,b等于 4,c等于 6) a=(b=10)/(c=2) (表达式值为 5
16、,a等于 5,b等于 10,c等于 2) 请分析下面的赋值表达式 : (a=3*5)=4*3 赋值表达式作为左值时应加括号 ,如果写成下面这样就会出现语法错误 : a=3*5=4*3 因为 3*5不是左值 ,不能出现在赋值运算符的左侧 赋值表达式也可以包含复合的赋值运算符 如 a+=a-=a*a 也是一个赋值表达式 如果 a的初值为 12,此赋值表达式的求解步骤如下 : 先进行 “a-=a*a”的运算 ,它相当于 a=a-a*a=12-144=-132 再进行 “a+=-132”的运算 ,它相当于 a=a+(-132)=-132-132=-264 2.7 逗号运算符与逗号表达式 C+将赋值表达
17、式作为表达式的一种 ,使赋值操作不仅可以出现在赋值语句中 ,而且可以以表达式形式出现在其他语句 (如输出语句 循环语句等 )中 这是C+语言灵活性的一种表现 请注意 ,用 cout语句输出一个赋值表达式的值时 ,要将该赋值表达式用括号括起来 ,如果写成 “couta=b;”将会出现编译错误 C+提供一种特殊的运算符 逗号运算符 用它将两个表达式连接起来 如 3+5,6+8 称为逗号表达式 ,又称为 “顺序求值运算符 ” 逗号表达式的一般形式为 表达式 1,表达式 2 逗号表达式的求解过程是 :先求解表达式 1,再求解表达式 2 整个逗号表达式的值是表达式 2的值 如 ,逗号表达式 a=3*5,
18、a*4 从附录 B可知 :赋值运算符的优先级别高于逗号运算符 , 因此应先求解a=3*5(也就是把 “a=3*5”作为一个表达式 ) 经计算和赋值后得到 a的值为 15,然后求解 a*4,得 60 整个逗号表达式的值为 60 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式 ,如 (a=3*5,a*4),a+5 逗号表达式的一般形式可以扩展为 表达式 1,表达式 2,表达式 3, 表达式 n 它的值为表达式 n的值 从附录 B可知 ,逗号运算符是所有运算符中级别最低的 因此 ,下面两个表达式的作用是不同的 : x=(a=3,6*3) x=a=3,6*a 其实 ,逗号表达式无非是把若干个
19、表达式 “串联 ”起来 在许多情况下 ,使用逗号表达式的目的只是想分别得到各个表达式的值 ,而并非一定需要得到和使用整个逗号表达式的值 ,逗号表达式最常用于循环语句 (for语句 )中 ,详见第 3章 在用 cout输出一个逗号表达式的值时 ,要将该逗号表达式用括号括起来 ,如 cout(3*5,43-6*5,67/3)endl; C和 C+语言表达能力强 ,其中一个重要方面就在于它的表达式类型丰富 ,运算符功能强 ,因而使用灵活 ,适应性强 第 2篇 面向过程的程序设计 第 3章 程序设计初步 第 4章 函数与预处理 第 5章 数组 第 6章 指针 第 7章 自定义数据类型 第 3章 程序设
20、计初步 3.1 面向过程的程序设计和算法 3.2 C+程序和语句 3.3 赋值语句 3.4 C+的输入与输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑运算 3.7 选择结构和 if语句 3.8 条件运算符和条件表达式 3.9 多分支选择结构和 switch语句 3.10 编写选择结构的程序 3.11 循环结构和循环语句 3.12 循环的嵌套 3.13 break语句和 continue语句 3.14 编写循环结构的程序 3.1 面向过程的程序设计和算法 在面向过程的程序设计中 ,程序设计者必须指定计算机执行的具体步骤 ,程序设计者不仅要考虑程序要 “做什么 ”,还要解决 “怎么做 ”
21、的问题 ,根据程序要 “做什么 ”的要求 ,写出一个个语句 ,安排好它们的执行顺序 怎样设计这些步骤 ,怎样保证它的正确性 和具有较高的效率 ,这就是算法需要解决的问题 3.1.1 算法的概念 一个面向过程的程序应包括以下两方面内容 : (1) 对数据的描述 在程序中要指定数据的类型和数据的组织形式 ,即数据结构 (data structure) (2) 对操作的描述 即操作步骤 ,也就是算法 (algorithm) 对于面向过程的程序 ,可以用下面的公式表示 : 程序 =算法 +数据结构 作为程序设计人员 ,必须认真考虑和设计数据结构和操作步骤 (即算法 ) 算法是处理问题的一系列的步骤 算法必须具体地指出在执行时每一步应当怎样做 不 要认为只有 “计算 ”的问题才有算法 广义地说 ,为解决一个问题而采取的方法和步骤 ,就称为 “算法 ” 计算机算法可分为两大类别 :数值算法和非数值算法 数值算法的目的是求数值解 非数值算法包括的面十分广泛 ,最常见的是用于事务管理领域 目前 ,计算机在非数值方面的应用远远超过了在数值方面的应用 C+既支持面向过程的程序设计 ,又支持面向对象的程序设计 无论面向过程的程序设计还是面向对象的程序设计 ,都离不开算法设计