第五章 数组
一维数组
数组是一个有序数据的集合,每个元素都有同样的类型。
定义方法:
//变量名 数组名[元素个数];
int value[10];
float a[5] = {1, 2, 3, 4, 5};
元素个数是一个常量不是变量
元素下标从0开始
下标可以是表达式,但不能是实型变量
下标可以是变量或常量
- 数组定义了一块连续的内存空间,空间的大小等于每个元素所占的空间大小*元素个数
- 数组名可以看作存储该数组起始地址的常量
- 注意不要下标越界
- 数组的操作主要是对各个数组分别操作。
- 不能对数组名进行赋值
遍历数组的方法:
#include <iostream>
const n = 10;
int main(){
int value[n];
for(i = 0; i < n; ++i){
cout << value[i] << endl;
}
}
例程:输入一串字符,统计每个字母出现的次数,知道输入的不是字母为止
#include <iostream>
int main(){
int count[26], i;
char ch;
for (i = 0; i < 26; i++) count[i] = 0;
ch = toupper (cin.get())
while (ch >= 'A' && ch <= 'Z'){
++count[ch - 'A']; ch = toupper(cin.get());
}
for (i = 0; i < 26; i++) cout << count[i];
return 0;
}
查找
顺序查找
一一遍历数组元素对照,得到结果
二分查找
要求数组已经排序,假设全为升序
过程:
- 设定查找范围的边界:lh,rh;
- 找出中间元素的位置:mid = (lh + rh)/2
- 比较中间元素和查找元素key
- key==中间元素,那么mid就是元素位置
- key>中间元素,那么左边一半就不可能是key,则为mid+1---->rh
- key<中间元素,那么右边一半就不可能是key,则为lh---->mid-1
二者效率不同,顺序查找是(1 + 2 + … + n)/n
而二分查找是log2(N),当数据量大的时候效率较高。
排序
选择排序
在所有元素中找到最小的元素放在数组的第0个位置,在剩余元素中找到最小的放在第1位…
整个过程
例程:
#include <iostream>
int main(){
int array1[8] = {31, 41, 59, 26,53, 58, 97, 93};
int lh, rh, k ,tmp;
for (lh = 0; lh < 9; lh++){
rh = lh;
for (k = lh; k < 9; k++){
if (array1[k] < array[lh]) rh = k;
}
//交换变量
tmp = array1[lh];
array1[lh] = array1[rh];
array1[rh] = tmp;
}
for (lh = 0; lh < 10; lh++) cout << array[lh] << '';
return 0;
}
冒泡排序
将两个带冒泡的数据从头到尾依次处理,比较相邻的两个元素,如果大的在前小的在后,就交换两个元素
第一次冒出最大的气泡,放入最后一个位置,然后第二个,第三个…
整个过程
int main(){
int a[]={0,3,5,1,3,7,9,4,2,10,6};
int i, j, tmp, n=11;
bool flag;
for (i = 1; i < n; ++i) {
flag = false;
for (j = 0; j < n-i; ++j){
if (a[j+1] < a[i])
{tmp = a[j]; a[i] = a[i+1]; a[i+1] = tmp; flag = true;}
}
if (!flag) break;//一趟冒泡中没有发生交换,排序结束
}
cout << endl;
for (i = 0; i < n; ++i) cout << a[i] << '';
return 0;
}
二维数组
二维数组的内存排列:先排第0行,在排第1行…
下标越界就会往后移动一位
- 一维数组:不带[ ]的数组名(如int a[5];中的a)可看做存储该数组起始地址的变量。它可以被输出(如cout << a;得到该地址),但不可被赋值。
- 二维数组:当只指定其中一维的下标i时(如对于int b[4][5]; 使用b[i]),则表示第i行在内存中的起始地址。同样可被输出,不可赋值。
- 二维数组的b和b[0]是相等的,但意义不同。
初始化
//类型说明 数组名[][] = {};
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
遍历按照一维数组遍历
字符串
一系列字符组成的一个单元成为字符串(String)
- 字符串的本质是一系列的有序字符,因此可以用一个字符数组来保存这组字符,用数组名表示这个字符串。
- 由于数组名是数组的起始地址,因此该字符串从该地址开始存储。但到哪里为止?字符串的长度可以小于数组的长度。
c++ 用’\0’表示字符串的结束。- 字符串所需的存储空间比实际的字符串长度大1。
- 如要将字符串“Hello,world”保存在一个数组中,该数组的长度至少为12(10个字母+1个逗号+\0)
初始化
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
char site[7] = "RUNOOB";
char site[7] = {"RUNOOB"};
如定义了一个字符数组ch[]
要输入一个符串放在ch中,可直接用cin >> ch;
用cin>>输入时是以空格、回车或Tab键作为结束符,因此cin>>无法输入包含空白字符的字符串。存人宇符数组后,该结束符被替换为空字符 ‘\0’。
在用cin>>输入时,要注意输人的字符串的长度不能超过数组的长度,最好在提示信息中告知允许的最长字符串长度。
cin.getline()函数
- 从用户输入中读取一个包合任意字符(包括空白字符)的字符串。
- 格式:cin.getline(字符数组起始地址,数组长度,结束标记)
- “结束标记”是个宇符。
- 将结束标记前的宇符串存入宇符数组(结束标记会被删掉)。
- 如果结束标记缺省(即只有前两个参数),则默认回车为结束标记。
- 前两个参数不能缺省。
- 存入宇符数组的宇符串长度不超过参数“数组长度”。
- 如果存入字符串未达到数组长度,则以 '\0’结束。
空白字符等概念的区分