数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。
数组的定义
类型说明符 数组名[常量表达式] [常量表达式]…;
数组名的构成方法与一般变量名相同。
例如:int a[10];
表示a为整型数组,有10个元素:a[0]…a[9]
例如:int a[5] [3]
表示a为整型二维数组,其中第一维有5个下标(04),第二维有3个下表(02),数组的元素个数为15,可以用于存放5行3列的整型数据表格。
数组元素的使用
数组必须定义,后使用。可以逐个引用数组元素
例如:
a[0]=a[5]+a[7]-a[2*3]
b[1][2]=a[2][3]/2
例:
#include
using namespace std;
int main() {
int a[10], b[10];
for (int i = 0; i < 10; i++) {
a[i] = i * 2 - 1;
b[10 - i - 1] = a[i];
}
for (int i = 0; i < 10; i++) {
cout << "a[" << i << "]=" << a[i] << " ";
cout << "b[" << i << "]=" << b[i] << endl;
}
return 0;
}
一维数组的存储
数组元素在内存中顺序存放,它们的地址是连续的。元素间物理地址上相邻,对应着逻辑次序上的相邻。
一维数组的初始化
列出全部元素的初始值
例如:static int a[10]={0,1,2,3,4,5,6,7,8,9};
只给一部分元素值定初值、
例如:static int a[10]={0,1,2,3,4};
二维数组的存储
按行存放
例如:float a[3][4];
a00 a01 a02 a03
可以理解为:a a10 a11 a12 a13
a20 a21 a22 a23
二维数组的初始化
将所有值写在一个{},内按顺序初始化
例如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}:
分行列出二维数组的初值
例如:static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
可以只对部分元素初始化
例如:static int a[3][4]={{1},{0,6},{0,0,11}};
列出全部初始值,第1维下标个数可以省略
例如:static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
或者 static int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
#include"iostream"
using namespace std;
int main() {
int i;
int f[20] = { 1,1 };//初始化第0、1个数
for (int i = 2; i < 20; i++)//求第2~19个数
f[i] = f[i - 2] + f[i - 1];
for (i = 0; i < 20; i++) {
if (i % 5 == 0)cout << endl;
cout.width(12); //设置输出宽度为12
cout << f[i];
}
return 0;
}
运行结果:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctal+z为止
每组连续输入5个答案,每个答案可以是‘a’...‘d’.
#include
using namespace std;
int main() {
const char key[] = { 'a','c','b','a','d' };
const int NUM_QUES = 5;
char c;
int ques = 0, numCorrect = 0;
cout << "enter the" << NUM_QUES << "question tests:" << endl;
while (cin.get(c)) {
if (c != '\n') {
if (c == key[ques]) {
numCorrect++; cout << " ";
}
else
cout << "*";
ques++;
}else{
cout << "Score" << static_cast<float>(numCorrect) / NUM_QUES * 100 << "%";
ques = 0; numCorrect = 0; cout << endl;
}
}
return 0;
}
运行结果:
enter the 5 question tests:
acbba
**Score60%
acbad
Score100%
abbda
* **Score40%
bbacb
*****Score0%
数组元素作为实参,与单个变量一样。
数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。
主函数中初始化一个二维数组,表示一个矩阵,矩阵,并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。
#include"iostream"
using namespace std;
void rowSum(int a[][4], int nRow) {//计算二维数组A每行元素的值的和,
for (int i = 0; i < nRow; i++) {
for (int j = 1; j < 4; j++)
a[i][0] += a[i][j];
}
}
int main() {
int table[3][4] = { {1,2,3,4,},
{2,3,4,5},{3,4,5,6,} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << table[i][j] << " ";
cout << endl;
}
rowSum(table, 3);//调用子函数,计算各行和
for (int i = 0; i < 3; i++)
cout << "Sum for row" << i << "is" << table[i][0] << endl;
}
运行结果:
1 2 3 4
2 3 4 5
3 4 5 6
Sum for row0is10
Sum for row1is14
Sum for row2is18
对象数组的定义与访问
定义对象数组
类名 数组名[元素个数];
访问对象数组元素
通过下标访问:数组名[下标].成员名
对象数组初始化
数组中每一个元素被对象创建时,系统都会调用类构造函数初始化该对象。
通过初始化列表赋值。
例:Point a[2]={Point(1,2),Point(3,4)};
如果没有为数组元素指定显示式初始值,数组元素便使用默认初始化(调用默认构造函数)。
数组元素的构造和析构
构造数组时,元素所属的类未声明构造函数,则采用默认构造函数。
各元素对象的初始值要求为相同的值时,可以声明具有默认形参值的构造函数。
各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
当数组中的每一个对象被删除时,系统都要调用一次析构函数。