第3单元基本数据类型 -44 第3单元基本数据类型 本单元教学目标 介绍C++的基本数据类型以及常数、变量和数组的使用方法。 学习要求 通过本单元的学习,掌握几种基本数据类型,包括字符型、整型、长整型、浮点和双精 度数据类型的基本概念,以及常数、变量和数组的使用方法 授课内容 31数据类型 程序处理的对象是数据。数据有许多形式,如数值数据、文字数据、图象数据以及声音 数据等,但其中最基本的、也是最常用的是数值数据和文字数据 无论什么数据,计算机在对其进行处理时都要先存放在内存中。显然,不同类型的数据 在存储器中存放的格式也不相同,甚至同一类数据,为了处理方便起见也可以使用不同的存 储格式。例如数值数据,其存储格式又可以分为整型、长整型、浮点型和双精度型等几种类 型;文字数据也可以分为单个字符和字符串。因此在程序中在对各种数据进行处理之前都要 对其类型(也就是存储格式)预先加以说明,这样做一是便于为这些数据分配相应的存储空 间,二是说明了程序处理数据时应采用何种具体运算方法。 C++的数据有两种基本形式,一是常数,一是变量。常数的用法比较简单,通过本身的 书写格式就说明了该常数的类型;而在程序中使用变量之前必须先声明其类型,否则程序无 法为该变量分配存储。也就是说,变量要“先声明,后使用”。这条原则不仅适合于变量,同 样适合于C++程序的其他成分,如函数、类型和宏等 C艹的一个主要特点就是它的数据类型相当丰富,不但有字符型、短整型、整型、长整 型、浮点型和双精度型等基本数据类型以及由它们构成的数组,还可以通过类的概念描述较 复杂的数据对象。在本单元中,我们主要介绍几种基本数据类型的声明和使用方法 311整数数据的表示方法 在C艹中,存放一个整数数据可以使用字符型、短整型、整型和长整型等4种类型。这 4种类型的格式相似,其最高位均为符号位,0表示正值,1表示负值。字符型数据占用一个字
第 3 单元 基本数据类型 - 44 - 第 3 单元 基本数据类型 本单元教学目标 介绍C++的基本数据类型以及常数、变量和数组的使用方法。 学习要求 通过本单元的学习, 掌握几种基本数据类型, 包括字符型、整型、长整型、浮点和双精 度数据类型的基本概念, 以及常数、变量和数组的使用方法。 授课内容 3.1 数据类型 程序处理的对象是数据。数据有许多形式, 如数值数据、文字数据、图象数据以及声音 数据等, 但其中最基本的、也是最常用的是数值数据和文字数据。 无论什么数据, 计算机在对其进行处理时都要先存放在内存中。显然, 不同类型的数据 在存储器中存放的格式也不相同, 甚至同一类数据, 为了处理方便起见也可以使用不同的存 储格式。例如数值数据, 其存储格式又可以分为整型、长整型、浮点型和双精度型等几种类 型; 文字数据也可以分为单个字符和字符串。因此在程序中在对各种数据进行处理之前都要 对其类型 (也就是存储格式) 预先加以说明, 这样做一是便于为这些数据分配相应的存储空 间, 二是说明了程序处理数据时应采用何种具体运算方法。 C++的数据有两种基本形式, 一是常数, 一是变量。常数的用法比较简单, 通过本身的 书写格式就说明了该常数的类型; 而在程序中使用变量之前必须先声明其类型, 否则程序无 法为该变量分配存储。也就是说, 变量要“先声明, 后使用”。这条原则不仅适合于变量, 同 样适合于C++程序的其他成分, 如函数、类型和宏等。 C++的一个主要特点就是它的数据类型相当丰富, 不但有字符型、短整型、整型、长整 型、浮点型和双精度型等基本数据类型以及由它们构成的数组, 还可以通过类的概念描述较 复杂的数据对象。在本单元中, 我们主要介绍几种基本数据类型的声明和使用方法。 3.1.1 整数数据的表示方法 在C++中, 存放一个整数数据可以使用字符型、短整型、整型和长整型等 4 种类型。这 4 种类型的格式相似, 其最高位均为符号位, 0 表示正值, 1 表示负值。字符型数据占用一个字
第3单元基本数据类型 节存储空间ψ,短整型数据占用两个字节,整型和长整型数据要占用4个字节的存储空间,见 图3-1 字符型数据占用一个字 0 节,共8个2进制位;其中第7 位是符号位,因此数值部分可 7符号位 用7个2进制位表示,即字符 (a)字符型数据的存储格式 型可以表现的数值范围为-27 2-1(138-127同理短口工口□ 整型数据占用2个字节,可以符 表示的数值范围为-215 215-1(-32768-32767而整 (b)整型数据的存储格式 型和长整型数据占用4个字节,31 2423 87 可以表示的数值范围为2到口[[ (c)长整型数据的存储格式 在编写程序时应根据数 据的实际情况选用相应的数 图3-1三种整型数据的存储格式 据类型。一般的整数数据,大 多选用整型表示。至于字符型,因其表示范围太小,通常很少用其存放整型数据,而是用来 存放字符的代码(ASCI码)。 整型常数的表示方法比较简单,直接写出其数值即可。例如 0.1.-2.637,32767,-32768 如果要指明一个整数数值使用长整型格式存放,可以在数值之后写一个字母1或L。由 于小写1很容易和数字1相混,我们建议使用大写字母L表示长整形常数。例如 0L,L,-2L,637L,32767L,-32768L, 如果要为一个整型变量分配存储空间,则要使用变量声明语句。C++的数据变量声明语 句的格式为 <类型说明符><变量名1>[<变量名2>,……,<变量名n>] 4种C++整数数据类型的说明符分别为 char<字符类型变量表> short<短整型变量表> <整型变量表> long <长整型变量表> 本单元介绍的各种数据类型的实际存储字节数均以 Visual c++为准。在其他版本的C++中情况可能有所 不同。因此在使用某个版本的C艹+编译器之前,应该仔细阅读其用户手册,弄清其数据长度等基本参数 2 Visual c+的整型类型的长度与硬件的字长相同。因此,在DOS系统和16位 Windows中int类型的长度 为16位(与 short类型相同),在32位 Windows中为32位(与long类型相同)
第 3 单元 基本数据类型 - 45 - 节存储空间1,短整型数据占用两个字节, 整型和长整型数据要占用 4 个字节的存储空间2 , 见 图 3-1。 字符型数据占用一个字 节, 共8个2进制位; 其中第7 位是符号位,因此数值部分可 用 7 个 2 进制位表示, 即字符 型可以表现的数值范围为−2 7 ~ 27−1 (−128 ~ 127); 同理, 短 整型数据占用 2 个字节, 可以 表 示 的 数 值 范 围 为 −2 15 ~ 2 15−1 (−32768~32767); 而 整 型和长整型数据占用 4 个字节, 可以表示的数值范围为−2 31 到 2 31−1。 在编写程序时应根据数 据的实际情况选用相应的数 据类型。一般的整数数据, 大 多选用整型表示。至于字符型, 因其表示范围太小, 通常很少用其存放整型数据, 而是用来 存放字符的代码(ASCII 码)。 整型常数的表示方法比较简单, 直接写出其数值即可。例如: 0, 1, −2, 637, 32767, −32768, ... 如果要指明一个整数数值使用长整型格式存放, 可以在数值之后写一个字母 l 或 L。由 于小写 l 很容易和数字 1 相混, 我们建议使用大写字母 L 表示长整形常数。例如: 0L, 1L, −2L, 637L, 32767L, −32768L, ... 如果要为一个整型变量分配存储空间, 则要使用变量声明语句。C++的数据变量声明语 句的格式为: <类型说明符> <变量名 1> [, <变量名 2>, ... ..., <变量名 n>]; 4 种C++整数数据类型的说明符分别为: char <字符类型变量表>; short <短整型变量表> int <整型变量表>; long <长整型变量表>; 1 本单元介绍的各种数据类型的实际存储字节数均以 Visual C++为准。在其他版本的C++中情况可能有所 不同。因此在使用某个版本的C++编译器之前, 应该仔细阅读其用户手册, 弄清其数据长度等基本参数。 2 Visual C++的整型类型的长度与硬件的字长相同。因此,在 DOS 系统和 16 位 Windows 中 int 类型的长度 为 16 位(与 short 类型相同),在 32 位 Windows 中为 32 位(与 long 类型相同)。 7 0 符 号 位 (a)字符型数据的存储格式 15 8 符 号 位 (b)整型数据的存储格式 7 0 31 24 23 16 15 8 7 0 (c)长整型数据的存储格式 图3-1 三种整型数据的存储格式
第3单元基本数据类型 -46 下面列出几个变量声明语句的例子 charal c2 ∥声明了2个字符型变量 ∥声明了3个整型变量 ∥声明了1个长整型变量 312一般数值数据的表示方法 在日常生活或工程实践中,大多数数据既可以取整数数值,也可以取带有小数部分的非 整数数值,例如物体的尺寸、重量,货物的金额等。在C++中,可以使用浮点类型表示这类 数据。浮点数据类型使用科学记数法表示数值:将数值分为尾数部分和指数部分,前者是一 个纯小数,且小数点后第1位不为0,后者是一个整数值。这两部分均可以为正或为负。实 际数值等于尾数部分乘上10的指数部分的幂次。例如,圆周率π可以写成 0.3141593×101 C++的浮点类型常数可以使用两种方式书写,一种是小数形式,例如 0.0,1.0,-2.68,3.141593,637.312,32767.0,-32768 这时应注意即使浮点类型的常数没有小数部分也应补上“.0”,否则会与整型常数混淆。另 种是科学记数形式,其中用字母e或者E表示10的幂次,例如: 0.0E0,6226c-4,-6226E-4,1,267E20, 由于浮点类型仅使用了4个字节存放数据,所以其精度有限,一般只有6~7位有效数 字。有时可能需要进行精度特别高的计算,这时可以使用双精度类型。双精度类型数据共占 用8个字节,其有效数字可达16~17位。 当然,在程序中也可声明浮点类型和双精度类型的变量。这两种数据类型的说明符分别 foat<浮点类型变量名表> double<双精度类型变量名表>; 举出两个变量声明语句的例子 float average, sum /声明了两个浮点类型的变量 double distance, weight;//声明了两个双精度类型的变量 例3-利用牛顿迭代公式求平方根。设x 则迭代公式为 (x +alx) 迭代结束条件取相对误差 <E
第 3 单元 基本数据类型 - 46 - 下面列出几个变量声明语句的例子: char c1, c2; // 声明了 2 个字符型变量 int i, j, k; // 声明了 3 个整型变量 long len; // 声明了 1 个长整型变量 3.1.2 一般数值数据的表示方法 在日常生活或工程实践中, 大多数数据既可以取整数数值, 也可以取带有小数部分的非 整数数值, 例如物体的尺寸、重量, 货物的金额等。在C++中, 可以使用浮点类型表示这类 数据。浮点数据类型使用科学记数法表示数值: 将数值分为尾数部分和指数部分, 前者是一 个纯小数, 且小数点后第 1 位不为 0; 后者是一个整数值。这两部分均可以为正或为负。实 际数值等于尾数部分乘上 10 的指数部分的幂次。例如, 圆周率π可以写成: 0.3141593×101 C++的浮点类型常数可以使用两种方式书写, 一种是小数形式, 例如 0.0, 1.0, −2.68, 3.141593, 637.312, 32767.0, −32768.0, ... 这时应注意即使浮点类型的常数没有小数部分也应补上“.0”, 否则会与整型常数混淆。另 一种是科学记数形式, 其中用字母 e 或者 E 表示 10 的幂次, 例如: 0.0E0, 6.226e−4, −6.226E−4, 1.267E20, ... 由于浮点类型仅使用了 4 个字节存放数据, 所以其精度有限, 一般只有 6~7 位有效数 字。有时可能需要进行精度特别高的计算, 这时可以使用双精度类型。双精度类型数据共占 用 8 个字节, 其有效数字可达 16~17 位。 当然, 在程序中也可声明浮点类型和双精度类型的变量。这两种数据类型的说明符分别 为: float <浮点类型变量名表>; double <双精度类型变量名表>; 举出两个变量声明语句的例子: float average, sum; // 声明了两个浮点类型的变量 double distance, weight; // 声明了两个双精度类型的变量 [例 3-1] 利用牛顿迭代公式求平方根。设 x = a , 则迭代公式为 2 ( / ) 1 n n n x a x x + + = 迭代结束条件取相对误差 − + + 1 1 n n n x x x 。 算 法:
第3单元基本数据类型 声明两个工作变量x和x /迭代初值取1 } while(x与x的相对误差大于控制参数e) 程序 / Example3-1:用牛顿迭代公式求平方根 #include < iostream. h> #include <math. h #define eps 1. 0e-10 /函数 newton sart o:用牛顿迭代法求平方根 double newton sart(double x) double xo, xl 1=1.0 if(x>0.0) 0=x1 fwhile(fabs((x0-x1)/x1)>=EPS) return x Is //用于计算平方根的主函数 cout < Please input the value: y newton sgrt(x) if(y<o cout < Negative Value have not square root !< endl
第 3 单元 基本数据类型 - 47 - 声明两个工作变量 x0 和 x1; x1 = 1; // 迭代初值取 1 do { x0 = x1; = + 0 1 0 2 1 x q x x ; }while(x1 与 x0 的相对误差大于控制参数ε); 程 序: // Example 3-1:用牛顿迭代公式求平方根 #include <iostream.h> #include <math.h> #define EPS 1.0e-10 // 函数 newton_sqrt(): 用牛顿迭代法求平方根 double newton_sqrt(double x) { double x0, x1; x1 = 1.0; if(x>0.0) { do { x0 = x1; x1 = (x0+x/x0)/2; }while(fabs((x0-x1)/x1)>=EPS); return x1; } else return x; } // 用于计算平方根的主函数 void main() { double x, y; cout << "Please input the value : "; cin >> x; y = newton_sqrt(x); if(y<0) cout << "Negative Value have not square root !" << endl;
第3单元基本数据类型 else cout << The square root of<<x<< is<< y endl 输入: Please input the value:2.0 输出: The square root of2is14142 分析:我们将求平方根的工作编为一个子程序,并在其中加上了简单的数据检验 当参数x的值小于或等于0时,不再进入迭代,直接返回x。这样就可以避免对负数迭代可 能引起的溢出错误。在编写程序时加上完善的数据检测功能,是程序应用的基本保证 313文字数据的表示方法 在C++中,文字数据有两种:一是单个的字符,一是字符串。对于字符数据来说,实际 上存储的是其编码。由于英语中的基本符号较少,只有52个大小写字母、10个数字、空格 和若干标点符号,再加上一些控制字符,如回车、换行、蜂鸣器等,总共不过100多个。因 此,可以使用一个整数表示某个字符的代码。目前最常用的代码标准是ASCI码, ASCII码 共使用了128个符号,分别使用整数0~127表示,可以参看附录1:“ASCⅡl码表”。一般来说, 在用C艹+编写程序时,单个的字符变量多选用整型变量存放,因为其数目有限,占用存储不 多,而现在计算机的CPU中的数据字长多为16位以上,使用整型的运算速度比较快。但是 对于字符串数据,由于占用的存储比较多,所以均选用字符型数组存放,一个数组元素(字 符类型的变量)正好存放一个字符的ASCI码。 字符型常数实际上就是单个字符的ASCI码。但是在程序中直接使用码值很不直观, 例如从码值48和97很难看出它们实际上代表的是字符“0”和“a”。因此在C语言中引入 了一套助记符号表表示 ASCIL码。对于字母、数字和标点符号等可见字符来说,其助记码 就是在该符号两边加上单引号。例如 a'.A'."l.'!"" 而那些控制字符和单、双引号、反斜杠符等可以使用由一个反斜杠符和一个符号组成的 转义字符表示 n(换行),"r(回车),t(横向跳格),(单引号) 常用的转义字符可以参看附录2“常用转义字符 注意上述助记符实际上仍是一个整数,因此也可以参加运算。例如 ∥lc被赋值为字母C f(x>=0&&x<=9)∥如果x是一数字的 ASCII码 X=x-0 ∥将其转换为相应的数值 例3-2]编制一个函数 mylower(),将大写字母转换为小写字母。 算法:我们知道,在ASCⅡ表中,所有的大写字母从A到Z是连续排列的,所有的 小写字母从a到z也是连续排列的,但大写字母和小写字母并没有排在一起。因此,如果 个字符是大写字母,我们可以通过对其 ASCIi码作如下运算将其转换为对应的小写字母的 ASCII码
第 3 单元 基本数据类型 - 48 - else cout << "The square root of " << x << " is " << y << endl; } 输 入: Please input the value : 2.0 输 出: The square root of 2 is 1.41421 分 析: 我们将求平方根的工作编为一个子程序, 并在其中加上了简单的数据检验: 当参数 x 的值小于或等于 0 时, 不再进入迭代, 直接返回 x。这样就可以避免对负数迭代可 能引起的溢出错误。在编写程序时加上完善的数据检测功能, 是程序应用的基本保证。 3.1.3 文字数据的表示方法 在C++中, 文字数据有两种: 一是单个的字符, 一是字符串。对于字符数据来说, 实际 上存储的是其编码。由于英语中的基本符号较少, 只有 52 个大小写字母、10 个数字、空格 和若干标点符号, 再加上一些控制字符, 如回车、换行、蜂鸣器等, 总共不过 100 多个。因 此, 可以使用一个整数表示某个字符的代码。目前最常用的代码标准是 ASCII 码, ASCII 码 共使用了 128 个符号, 分别使用整数 0~127 表示, 可以参看附录 1:“ASCII 码表”。一般来说, 在用C++编写程序时, 单个的字符变量多选用整型变量存放, 因为其数目有限, 占用存储不 多, 而现在计算机的 CPU 中的数据字长多为 16 位以上, 使用整型的运算速度比较快。但是 对于字符串数据, 由于占用的存储比较多, 所以均选用字符型数组存放, 一个数组元素 (字 符类型的变量) 正好存放一个字符的 ASCII 码。 字符型常数实际上就是单个字符的 ASCII 码。 但是在程序中直接使用码值很不直观, 例如从码值 48 和 97 很难看出它们实际上代表的是字符“0”和“a”。因此在C语言中引入 了一套助记符号表表示 ASCII 码。 对于字母、数字和标点符号等可见字符来说, 其助记码 就是在该符号两边加上单引号。例如: 'a', 'A', '1', ' ', '+', ... 而那些控制字符和单、双引号、反斜杠符等可以使用由一个反斜杠符和一个符号组成的 转义字符表示: '\n'(换行), '\r'(回车), '\t'(横向跳格), '\''(单引号), ... 常用的转义字符可以参看附录 2 “常用转义字符”。 注意上述助记符实际上仍是一个整数, 因此也可以参加运算。例如: c = 'A'+2; // c 被赋值为字母 C; if(x>='0' && x<='9') // 如果 x 是一数字的 ASCII 码 x = x−'0'; // 将其转换为相应的数值 [例 3-2] 编制一个函数 mylower(), 将大写字母转换为小写字母。 算 法: 我们知道, 在 ASCII 表中, 所有的大写字母从 A 到 Z 是连续排列的,所有的 小写字母从 a 到 z 也是连续排列的, 但大写字母和小写字母并没有排在一起。因此, 如果一 个字符是大写字母, 我们可以通过对其 ASCII 码作如下运算将其转换为对应的小写字母的 ASCII 码: