第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++的数据变量声明语 句的格式为 [,……,] 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++的数据变量声明语 句的格式为: [, , ... ..., ]; 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 #include 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 #include #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 > x; y = newton_sqrt(x); if(y<0) cout << "Negative Value have not square root !" << endl;
第3单元基本数据类型 else cout =0&&x<=9)∥如果x是一数字的 ASCII码 X=x-0 ∥将其转换为相应的数值 例3-2]编制一个函数 mylower(),将大写字母转换为小写字母。 算法:我们知道,在ASCⅡ表中,所有的大写字母从A到Z是连续排列的,所有的 小写字母从a到z也是连续排列的,但大写字母和小写字母并没有排在一起。因此,如果 个字符是大写字母,我们可以通过对其 ASCIi码作如下运算将其转换为对应的小写字母的 ASCII码
第 3 单元 基本数据类型 - 48 - else cout ='0' && x<='9') // 如果 x 是一数字的 ASCII 码 x = x−'0'; // 将其转换为相应的数值 [例 3-2] 编制一个函数 mylower(), 将大写字母转换为小写字母。 算 法: 我们知道, 在 ASCII 表中, 所有的大写字母从 A 到 Z 是连续排列的,所有的 小写字母从 a 到 z 也是连续排列的, 但大写字母和小写字母并没有排在一起。因此, 如果一 个字符是大写字母, 我们可以通过对其 ASCII 码作如下运算将其转换为对应的小写字母的 ASCII 码:
第3单元基本数据类型 大写字母的 ASCII码值-A+a=对应的小写字母的ASCI码值 程序 ∥/ Example3-2:将大写字母转换为小写字母 int my lower (int cl if(ch>='A’&&ch<=Z') return ch 分析:字符数据以整型或字符型格式存放实际存放的是字符的ASCⅡ码。从而可 以使用数值数据的运算方法来处理字符数据。在函数 mylower()中,如果一个字符不是大 写字母,则不进行转换 字符串常数即用双引号括起来的一串字符,例如 Visual C++""12 34"."This is a string. \n 字符串常数在内存占用的实际存储字节数要比字符串中的字符个数多1个,即在字符串 的尾部还要添加一个数值为0的字符,用以表示字符串的结束。该字符也可以使用转义序列 0表示。以字符串" MONDAY"为例,其实际存储形式见图3-2。 因此,B与"B"是有区别的,前者是 个字符型常量,而后者是字符串常量,MNDA'Y|10 由两个字符B和0组成。 图3-2字符串的存储方式 32数组 变量和常数只能用来表示少量互相之间没有内在联系的数据,大量的成批数据要使用 数组来存放。所谓数组是一组相同类型的变量,用一个数组名标识其中每个变量(称为数组 元素)通过该变量在数组中的相对位置(称为下标)来引用。数组可以是一维的,也可以是二维 或者更高维的。图3-3分别给出了一维、二维和三维数组中的数组元素排列方法 数组的声明方法与变量相同,只是要在数组名后面加上用方括号括起来的各维维长。例 int array1[10] //声明了一个有10个元素的整型数组 float matrix[20][20];∥/声明了一个20行20列的浮点型矩阵 数组元素的下标从0开始编号。例如,aray1[0是数组 array l中的第一个数组元素 atrix[oI[o]是矩阵matrⅸx中的第1行第1列元素,位于矩阵的左上角 同一个数组的所有数组元素在存储器中占用一片连续的存储单元。 对于数组来说,最常用的处理方法是在通过循环处理数组中的元素。例如 //将数组中的所有元素置零 for (int i=0: i<N
第 3 单元 基本数据类型 - 49 - 大写字母的 ASCII 码值−'A'+'a' = 对应的小写字母的 ASCII 码值 程 序: // Example 3-2:将大写字母转换为小写字母 int mylower(int ch) { if(ch>='A' && ch<='Z') ch = ch−'A'+'a'; return ch; } 分 析: 字符数据以整型或字符型格式存放, 实际存放的是字符的 ASCII 码。从而可 以使用数值数据的运算方法来处理字符数据。在函数 mylower()中, 如果一个字符不是大 写字母, 则不进行转换。 字符串常数即用双引号括起来的一串字符, 例如: "Visual C++", "12.34", "This is a string.\n", ... 字符串常数在内存占用的实际存储字节数要比字符串中的字符个数多1个, 即在字符串 的尾部还要添加一个数值为 0 的字符, 用以表示字符串的结束。该字符也可以使用转义序列 '\0'表示。以字符串"MONDAY"为例, 其实际存储形式见图 3-2。 因此, 'B'与"B"是有区别的, 前者是 一个字符型常量, 而后者是字符串常量, 由两个字符'B'和'\0'组成。 3.2 数组 变量和常数只能用来表示少量互相之间没有内在联系的数据, 大量的成批数据要使用 数组来存放。所谓数组是一组相同类型的变量, 用一个数组名标识, 其中每个变量(称为数组 元素)通过该变量在数组中的相对位置(称为下标)来引用。数组可以是一维的,也可以是二维 或者更高维的。图 3-3 分别给出了一维、二维和三维数组中的数组元素排列方法。 数组的声明方法与变量相同, 只是要在数组名后面加上用方括号括起来的各维维长。例 如: int array1[10]; // 声明了一个有 10 个元素的整型数组 float matrix[20][20]; // 声明了一个 20 行 20 列的浮点型矩阵 数组元素的下标从 0 开始编号。例如, array1[0]是数组 array1 中的第一个数组元素; matrix[0][0]是矩阵 matrix 中的第 1 行第 1 列元素, 位于矩阵的左上角。 同一个数组的所有数组元素在存储器中占用一片连续的存储单元。 对于数组来说, 最常用的处理方法是在通过循环处理数组中的元素。例如 // 将数组中的所有元素置零 for(int i = 0; i < N; i = i+1) 'M' 'O' 'N' 'D' 'A' 'Y' '\0' 图3-2 字符串的存储方式
第3单元基本数据类型 //将矩阵 matrix置成单位矩阵 for(int i=0: ibig big array[il return big 33字符型数组和字符串处理库函数 C+使用字符型数组存放字符串数据。由前述字符串常数的存储格式可知,字符串包括 一个结束符0,所以在计算用于存放字符串的数组的大小时要考虑到这一点。例如,如果要
第 3 单元 基本数据类型 - 50 - array1[i] = 0; // 将矩阵 matrix 置成单位矩阵 for(int i = 0; i big) big = array[i]; return big; } 3.3 字符型数组和字符串处理库函数 C++使用字符型数组存放字符串数据。由前述字符串常数的存储格式可知, 字符串包括 一个结束符'\0', 所以在计算用于存放字符串的数组的大小时要考虑到这一点。例如, 如果要 a0 a1 a2 b00 b01 b02 b10 b11 b12 b20 b21 b22 c000 c001 c002 c010 c011 c012 c020 c021 c022 c 100 c 101 c 102 (a)一维数组 (b)二维数组 (c)三维数组 图3-3 数组元素的排列方式
第3单元基本数据类型 设计一个能够存放最大长度为80个字符的字符串的数组,其长度应为81 字符型数组的用法和普通数组相同。例如,我们设计一个字符型数组 weekday用于存放 星期的名称,并将字符串 MONDAY"存入其中,可以这样设计 char weekday [11] eday [o]='M weekday[1]=’0 weekday[3]='D eday[5]=’Y weekday [6]='\0 其中最后一句也可以直接写成 weekday [6]=0 可以看出,这样操作相当烦琐。因此,C++提供了一批用于字符串处理的库函数,可以 完成许多常用的字符串操作 strcpy(:字符串拷贝 strcat(:字符串连接; strchr(:在字符串中查找字符; strcmp(:字符串比较; strlen:求字符串长度 strlwr(:将字符串中的大写字母转换为小写字母; strrev(:反转字符串 strstr(:在字符串中查找另一个字符串 struer(:将字符串中的小写字母转换为大写字母 因为这些库函数的声明存放在头文件 string. h中,所以如果我们要在程序中调用这些函 数,还应该在源程序的最前面加上一个文件包含的编译预处理命令 #include 下面我们介绍其中几个常用的字符串操作函数的用法 (1)求字符串的长度 int strlen(char *s) 其中的参数说明char*s意为s是一个指向字符类型的指针。指针类型在第6单元中有介绍 目前我们只需知道该参数既可以使用字符串常数,也可以使用字符型数组就可以了。该函数 的返回值即为字符串中字符的个数(不包括字符串结束符)。例如语句 len strlen" This is a sample.
第 3 单元 基本数据类型 - 51 - 设计一个能够存放最大长度为 80 个字符的字符串的数组, 其长度应为 81。 字符型数组的用法和普通数组相同。例如, 我们设计一个字符型数组 weekday 用于存放 星期的名称, 并将字符串"MONDAY"存入其中, 可以这样设计: char weekday[11]; weekday[0] = 'M'; weekday[1] = 'O'; weekday[2] = 'N'; weekday[3] = 'D'; weekday[4] = 'A'; weekday[5] = 'Y'; weekday[6] = '\0'; 其中最后一句也可以直接写成 weekday[6] = 0; 可以看出, 这样操作相当烦琐。因此, C++提供了一批用于字符串处理的库函数, 可以 完成许多常用的字符串操作: strcpy(): 字符串拷贝; strcat(): 字符串连接; strchr(): 在字符串中查找字符; strcmp(): 字符串比较; strlen(): 求字符串长度; strlwr(): 将字符串中的大写字母转换为小写字母; strrev(): 反转字符串; strstr(): 在字符串中查找另一个字符串; strupr(): 将字符串中的小写字母转换为大写字母; ... ... 因为这些库函数的声明存放在头文件 string.h 中, 所以如果我们要在程序中调用这些函 数, 还应该在源程序的最前面加上一个文件包含的编译预处理命令: #include 下面我们介绍其中几个常用的字符串操作函数的用法: (1)求字符串的长度: int strlen(char *s); 其中的参数说明 char *s 意为 s 是一个指向字符类型的指针。指针类型在第 6 单元中有介绍, 目前我们只需知道该参数既可以使用字符串常数, 也可以使用字符型数组就可以了。该函数 的返回值即为字符串中字符的个数 (不包括字符串结束符)。例如语句 len = strlen("This is a sample.");
第3单元基本数据类型 执行后,变量len会被赋值17 (2)复制字符串 strcpy (char *destin, char *source) 该函数的功能为将字符串 source的内容复制到字符型数组 destin中。注意, destin的长度一 定要比字符串 source的实际长度大,否则会引起严重的运行错误。例如: char weekday [11] strcpy(weekday , "MONDAY") (3)连接字符串 strcat(char * destin, char *source) 该函数的功能为将字符串 source的内容复制到字符型数组 destin中原来的字符串的后面,使 两个字符串合并成一个字符串。使用该函数时特别要注意保证字符型数组 destin的长度一定 能够放得下合并后的整个字符串(包括最后的字符串结束符)。否则也会引起严重的运行错 (4)字符串比较 int strcmp(char *stringl, char *string2) 该函数的功能为对两个字符串进行比较。比较是按字典序进行的,即在字典中排在前面的单 词小于排在其后的单词。当然,一般的字符串中不但可以有英文字母,还可能有其他符号 这时各个符号之间的比较按ASCI码的顺序进行 如果字符串 stringl小于字符串 string2,该函数返回一个负整数值;如果字符串 stringl 等于字符串 string2,该函数返回0;如果字符串 string1大于字符串 string2,该函数返回 个正整数值。例如 if(strcmp (weekday, " SUNDAY")==0) cout<< Today we have a party. <<endl (5)将字符串中的小写字母转换为大写字母或者将大写字母转换为小写字母 strlwr(char *string) trupr (char *string 这两个函数的功能类似,都是转换字符串中的英文字母,对字符串中的其他符号没有影响 例如 strlwr(weekday) 如果转换前字符型数组中存放着字符串 MONDAY",则转换后其内容变为" monday 其实,这些标准库函数并不神秘,我们也完全可以编写出同样功能的程序来。 例3-4自己编写一个函数 mystrleno,用来计算字符串的长度。 程序: / Example3-4:求字符串的长度
第 3 单元 基本数据类型 - 52 - 执行后, 变量 len 会被赋值 17。 (2)复制字符串: strcpy(char *destin, char *source); 该函数的功能为将字符串 source 的内容复制到字符型数组 destin 中。注意, destin 的长度一 定要比字符串 source 的实际长度大, 否则会引起严重的运行错误。例如: char weekday[11]; strcpy(weekday, "MONDAY"); (3)连接字符串: strcat(char *destin, char *source); 该函数的功能为将字符串 source 的内容复制到字符型数组 destin 中原来的字符串的后面, 使 两个字符串合并成一个字符串。使用该函数时特别要注意保证字符型数组 destin 的长度一定 能够放得下合并后的整个字符串(包括最后的字符串结束符)。否则也会引起严重的运行错 误。 (4)字符串比较: int strcmp(char *string1, char *string2); 该函数的功能为对两个字符串进行比较。比较是按字典序进行的, 即在字典中排在前面的单 词小于排在其后的单词。当然, 一般的字符串中不但可以有英文字母, 还可能有其他符号, 这时各个符号之间的比较按 ASCII 码的顺序进行。 如果字符串 string1 小于字符串 string2, 该函数返回一个负整数值; 如果字符串 string1 等于字符串 string2, 该函数返回 0; 如果字符串 string1 大于字符串 string2, 该函数返回一 个正整数值。例如 if(strcmp(weekday,"SUNDAY")==0) cout<<"Today we have a party."<<endl; (5)将字符串中的小写字母转换为大写字母或者将大写字母转换为小写字母: strlwr(char *string); strupr(char *string); 这两个函数的功能类似, 都是转换字符串中的英文字母, 对字符串中的其他符号没有影响。 例如 strlwr(weekday); 如果转换前字符型数组中存放着字符串"MONDAY", 则转换后其内容变为"monday"。 其实, 这些标准库函数并不神秘, 我们也完全可以编写出同样功能的程序来。 [例 3-4] 自己编写一个函数 mystrlen(), 用来计算字符串的长度。 程 序: // Example 3-4:求字符串的长度
第3单元基本数据类型 -53- int mystrlen(char string[) nt len =0: hile(string[len]! =\0 len len+1 return len 分析:该函数的构造非常简单。值得注意的有两点:一是作为参数的一维数组可以 不写明数组元素的个数。但C++规定,2维以上的数组,除了第1维以外均应注明维长。例 oid set empty (double matrix[[1o]) 另外,要注意区别字符串的长度和存放字符串的字符型数组的长度两个不同的概念。字符串 靠结束符"0表示字符串的结束,字符丰的长度是到字符串结束符之前的字符个数(不包括 字符串结束符)。因此,字符串的长度要小于字符型数组的大小 自学内容 34变量的初始化 C++允许在声明变量的同时对变量赋一个初值,例如 int count =0: double pi=3.141592658979D0 int upper =A 另一种初始化变量的方法如下 () 例如 char ch(a’+ count) 35类型修饰符和常量修饰符 基本类型声明语句的前面还可以加上各种修饰符。修饰符用来改变基本类型的意义,以
第 3 单元 基本数据类型 - 53 - int mystrlen(char string[]) { int len = 0; while(string[len]!='\0') len = len+1; return len; } 分 析: 该函数的构造非常简单。值得注意的有两点: 一是作为参数的一维数组可以 不写明数组元素的个数。但C++规定, 2 维以上的数组, 除了第 1 维以外均应注明维长。例 如: void set_empty(double matrix[][10]) { ... ... } 另外, 要注意区别字符串的长度和存放字符串的字符型数组的长度两个不同的概念。字符串 靠结束符'\0'表示字符串的结束, 字符串的长度是到字符串结束符之前的字符个数 (不包括 字符串结束符)。因此, 字符串的长度要小于字符型数组的大小。 自学内容 3.4 变量的初始化 C++允许在声明变量的同时对变量赋一个初值, 例如: int count = 0; double pi = 3.141592658979D0; int upper = 'A'; 另一种初始化变量的方法如下: () 例如 int i(5); char ch(‘a’+count); 3.5 类型修饰符和常量修饰符 基本类型声明语句的前面还可以加上各种修饰符。修饰符用来改变基本类型的意义, 以