⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c++6.dat

📁 这是一个包含多个语言的指令集
💻 DAT
字号:
第六章 数组与字符串

第一节 一维数组

在C++中,数组是一种集合数据类型,它由许多元素组成,每一个元素都有相同的数据类型,在内存中占用相同大小的存储单元,且在内存中连续存放.每一个数组有一个名字,数组中的每一个元素有一个序号(或称下标)表示元素在数组中的位置,我们正是通过下标来识别数组中的每一个元素.
  数组有一维的,也有多维的,数组也有大小,数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变.
  数组适合于表示由许多相似项组成的组合数据,例如,人名表、世界城市和它们的温度表、银行每月的帐目处理等.
  本章中,我们将介绍一维数组、二维数组和字符数组的定义、引用和它们的初始化.
  数组主要有以下特点:
  (1) 每个数组元素的数据类型相同,且可以是任何合法的数据类型;
  (2) 数组可以是一维的、二维的,甚至更高维的,例如,下面的语句就定义了一个三维数组ARRAY:
  INT ARRAY[3][3][3];
  (3) 数组同其它变量一样,在使用前必须定义;
  (4) 数组各个元素按顺序排列,其位置由下标确定;
  (5) 数组元素可以同其它变量一样使用.
  注意:数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变.

1.1 一维数组的定义
  数组的定义与变量的定义类似,一维数组的一般定义形式为:
  类型说明符 数组名[常量表达式];
  "类型说明符"指定数组元素的类型,"数组名"的命名规则与变量一样,方括号中的"常量表达式"的值表示数组元素的个数,它必须是一个整数.例如,北京最近一百年来每年的平均温度值可保存在一个数组中,该数组可定义为:
  float annual_temp[100];
  这个定义会使得编译器分配100个连续的float变量的内存空间.数组元素的个数在编译时就必须固定,且最好定义为一个常量.这样,当数组元素的个数需要改变时,只要改变那个常量即可:
  const int NE = 100;
  float annual_temp[NE]; 
  数组元素的下标从零开始计数,在annual_temp数组中,第一个元素是annual_temp[0],第二个元素是annual_temp[1],余类推,最后一个元素是annual_temp[NE-1]. 

1.2 一维数组的使用
  C++中,数组元素的下标总是从0开始,如果一个数组有n个元素,则第一个元素的下标是0,最后一个元素的下标是n-1.
  访问数组元素的方法是通过数组名及数组名后的方括号中的下标.例如,假定我们要设置上面定义的数组annual_temp的第15个元素值为11.5,则代码为:
  annual_temp[14] = 11.5;
  如果,企图访问一个不存在的数组元素,会导致一个严重的错误.例如:
  annual_temp[100]= 12.3; //错误,该数组的最大下标为99! 
  能使用标识符的地方,就能引用数组元素.下面是引用数组元素的一些例子,并假定在引用前已有如下的一些定义:
  const int NE = 100,
  N = 50;
  int i, j, count[N];
  float annual_temp[NE];
  float sum, av1, av2; 
  能够用cin函数将一个值直接读到数个数组元素中:
  cin >> count[i]; 
  数组元素能够进行算术运算:
  count[i] = count[i] + 5; 
  count[i] += 5; 
  数组元素可以用在逻辑表达式中:
  if (annual_temp[j] < 10.0)
  cout << "It was cold this year "
  << endl;
  处理数组元素时,通常使用循环语句.例如annual_temp的数组元素的值可用下面的语句获得:
  for (i = 0; i < NE; i++)
  cin >> annual_temp[i];
  下面的代码可以算出数组前10个元素均值:
  sum = 0.0;
  for (i = 0; i <10; i++)
  sum += annual_temp[i];
  av1 = sum / 10;
  假定k是一个整型变量或常量,但k<=NE.假定要计算数组中最后k个元素的平均值,代码如下:
  sum = 0.0;
  for (i = NE - k; i < NE; i++)
  sum += annual_temp[i];
  av2 = sum / k;

第二节 多维数组

2.1 二维数组的定义
  二维数组相当于一个矩阵,它的定义方法与一维数组的定义类似.二维数组定义的一般形式为:
  类型说明符 数组名[常量表达式1][常量表达式2]; 
  "类型说明符"指定数组元素的类型,"数组名"是C++允许的标识符,"常量表达式1"指定数组元素的行数,"常量表达式2" 指定数组元素的列数.例如,我们要表示北京、天津、上海三个城市一年四季的平均气温,参见表6-5. 
可以定义一个二维数组来保存气温值:
  float seasonTemp[3][4];
这个数组在内存中占用12个连续的float元素的存储单元,如图6-2. 
  我们可以看到:C++中,二维数组在内存中的存放仍然是一维的,且各个元素按行顺序存放. 

2.2 二维数组的初始化
  二维数组的初始化是分行进行的.例如:
    float seasonTemp[3][4] = {
   {11.3, 28.2, 16.5, -7.1},
   {12.4, 27.1, 17.6, -5.7},
   {23.2, 33.5, 25.8, -1.3}
  }; 
  我们已经知道,二维数组在内存中是一维的,且由各行元素顺序存放得到.所以,seasonTemp也可以采用下面的语句初始化:
  int seasonTemp[3][4] = {
   11.3, 28.2, 16.5, -7.1, 12.4, 27.1, 17.6, -5.7, 23.2, 33.5, 25.8, -1.3
  }; 
  但是,按行初始化更直观、更通用,它能够初始化某一行中的部分元素.例如:
  int seasonTemp[3][4] = {{26}, {24}, {28}}; 
  上面的语句仅初始化数组每一行的第一个元素,而其它元素未给初值.
  我们定义并初始化一个二维数组时,可以省略"常量表达式1",例如:
  int seasonTemp[][4] = {
   {26, 34, 22, 17},
   {24, 32, 19, 13},
   {28, 38, 25, 20}
  }; 
  如果省略"常量表达式1"最好采用按行初始化的方式,否则,容易出错.编译器根据初值的行数来确定数组的行数.
  注意:"常量表达式2"一定不能省略,否则程序编译时会出错.因为二维数组元素在存取时,需要在一维和二维之间转换,如果省略"常量表达式2",则编译器无法计算出它们之间的对应关系. 
    
2.3 二维数组的使用
  类似于一维数组的访问,访问二维数组元素可通过两个[]运算符,第一个[]运算符指定元素的行下标,第二个[]运算符指定元素的列下标.二维数组的行下标和列下标均是从0开始的.如果有一个有m行、n列的二维数组,它的第一行第一列元素的行和列下标分别是0和0,最后一行最后一列元素的行和列下标分别是m-1和n-1.


第三节 字符数组

当数组中的元素都是由一个个字符组成时,便称之为字符数组.字符数组并无什么特别之处,它的的重要性在于: C++中,用一个一维的字符数组表示字符串.数组的每一个元素保存字符串的一个字符,并附加一个空字符,表示为`\0',添加在字符串的末尾,以识别字符的结束.所以,如果一个字符串有n个字符,则至少需要有n+1个元素的字符数组来保存它.例如,一个字符`a'仅需要一个字符变量就可以保存,而字符串"a"需要有两个元素的字符数组来保存,一个元素存字符`a',另一个元素存空字符`\0'.

3.1 字符数组的输出 
  字符串可以用printf或cout函数输出,例如: 
  cout << "The string s1 is " << s1 << endl;
  printf("The string s1 is %s\n", s1) ; 
  上面两个语句的输出结果相同,均为:
  The string s1 is example

3.2 字符数组的输入
  字符串(字符数组)通常用scanf和cin函数输入,下面分别介绍.
    一、用scanf函数输入字符串
  scanf可以一次输入一个或多个字符串,如果一次输入多个字符串,字符串之间用逗号隔开,    用"ENTER"结束输入. 
    char s1[10], s2[10];
  执行语句:
  scanf("%s", s1);
    二、用cin输入字符串
  用cin输入字符串的作用与scanf类似,但更方便.例如,假定s1定义还与前面一样,执行下面的语句:
  cin << s1;
  输入输入字符串"Learn C++",s1的值与用scanf的结果是一样的.如果一个字符串中有空格,我们就需要在空格的地方将字符串分成二个或多个字符串输入.例如,某人名字为"Ian Aitchison",我们可以用下面的语句输入: 
  char firstname [12], surname[12];
  cout << "Enter name ";
  cin >> firstname;
  cin >> surname;
  cout << "The name entered was "
  << firstname << " "
  << surname;
  执行上面的语句,输入"Ian Aitchison",输出结果如下:
  The name entered was Ian Aitchison
  上面的程序段我们也可以修改为,效果是一样的:
  char firstname [12], surname[12];
  cout << "Enter name ";
  cin >> firstname >> surname;
  cout << "The name entered was "
  << firstname << " "
  << surname;
字符数组应用举例:
 1. 求字符串的长度 
 2. 从键盘上读一个输入行并输出 
 3. 把两个字符串连接起来
 4. 把一个数字字符串转换为相应的整数


第四节 数组做函数参数

  同其它变量一样,数组也可以作函数的参数.数组元素只能作函数实参,且同其它变量的用法没有区别.
数组元素要通过数组名和相应的下标一个个地引用,而数组名可以作函数的实参和形参.当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址,即调用函数通知被调函数在内存中的什么地方找到该数组.在前面我们已经知道了函数参数的值传递方式,调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递. 
  对于函数参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素.所以,有数组参数的函数原型的一般形式为:
  类型说明符 函数名(数组参数, 数组元素个数)
数组参数并不指定数组元素的个数,即[]中是空的,没有数字.例如:
#include <iostream.h>
int add(int x, int n)
{
 return (x + n);
}
void main()
{
 int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
 int i;
 for( i = 0; i<10; i++)
  a[i]=add(a[i], i); //数组元素作函数参数
 for(i = 0; i<10; i++)
  cout << a[i] << endl; 
} 
函数参数的引用传递不同于值传递.值传递时是把实参的值复制到形参,实参和形参占用不同的存储单元,形参值的改变不会影响到实参.而数组作为函数参数传递时,是引用传递方式,即把实参数组在内存中的首地址传给了形参,被调函数可以通过该地址,找到实参数组中的各个元素.这就意味着:在被调函数中,如果改变了形参数组某元素的值,在被调函数中,实参数组对应元素的值也会发生相应的改变. 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -