You are on page 1of 29

第六章 数组

本章起将 陆续 介绍 C++ 中的 导出 (自定义 )数 据


类型 ,包 括数组 、结 构体、 类等 。

6.1 数组的定义 及其应用

6.2 字符数组的 定义及其应



6.3 字符串处理 函数
6.1 数组的定义及应用
数组的引 入
请看两例 :
1 输入 3 个整数 ,将其 按从 大到小 的顺 序排 序,
并输 出。cin>>x>>y>>z;
if(y>x) 交换 x,y ;
if(z>x) 交换 x,z ;
if(z>y) 交换 y,z ;
2 输入 100 个整数 ,将其 按从 大到小 的顺 序排 序
,并 输出 。
一批数据 —— 数组 。

在 C++ 中,数组 是同类型 数据的集合。 其中 每个


数据 称为 数组的 元素 。

数组的存 储方 式— 连续存储

下标变量 的概 念— 数组 的元 素

按照下标 的个 数,数 组分 为一维 数组和 多维 数组

6.1.1 一维 数组 的定 义及使
用1 一维数组 的定 义和初 始化
一维数 组只 有一个 下标 ,可 用来表 示数列 、向 量。
举例 说明 定义及 初始 化方法 :
元素个数
int a[20]; // 20 个整数 元素 的数组 正整数常
# define N 50 //const int N=50; 数

double x[ N ];
char s[10]; // 包含 10 个字 符的 字符串 定义 时不确 知
元素 个数 :
static int st[40]; // 静态整数 数组 大开小 用
int b [6]={2, 6, 2, 7 ,8, 9} // 定义 并初 始化
int c[10]={1, 6 } 定义时 元素 个

int d[ ]={1, 2, 3, 4 ,5} 必须 明确
2 一维数 组的 使用
( 1 ) 使用 数组名 —— 作函 数参数 。例 如:
void main(){
int a[10]; …;
sort(a); …; // 对数 组排 序
}
void sort(int a[10]){…} // 排序 函数

( 2 ) 使用 下标变 量——数 组的输 入、 输出、 同


类数 组赋 值等所 有对 数组的 直接 运算, 都要通 过循 环
结构 对数 组元素 进行 操作。 下标 从 0 开始。
例【 6.1 】输 入 5 个整数, 输出 他们及 他们的 平均
值。
( 3 ) 使用 数组有 一点 需要 注意, 就是 系统不 作
下标 检查 ,用户 必须 在程序 中注 意下标 不越界 。
【 6.1 】程序 分析

定义数组 :
int a[5];

读入数组 元素值 :
for(int i=0; i<5; i++) cin>>a[i];

求数组元 素和:
for(i=0, s=0; i<5; i++) s+=a[i];

输出元素 及平均 值:
for(int i=0; i<5; i++) cout<<a[i];
cout<<s/10;
3 一维数 组的 应用举 例

【例 6.3 】用筛 选法 求 3 - 100 之间的 素数 。


算法 :
定义 数组 a ,保存 3 - 100 的所有 整数

筛选 :
for(i=3; i<=100; i++){
以 a[i] 为基础 ,剔除 数组 中 a[i] 的倍
数(清 0 )
}
输出 数组 a 中所有 非 0 元素

6.1.1
结束
补充: 数组 和函 数
——数 组的 查找和 排序
算法
本节介绍 数组 作为函 数参 数的使 用方法

1 数组的 查找

2 数组的 排序
1 数组的查 找
查找功能 的使 用举例 :

int a[100];
int key, k;
k=search(a,key); // 在数组 a 中查找关键字 key, 返回
下标
if(k==-1) cout<<“no”<<key<<endl;
else cout<<“a[”<<k<<“]=”<<key;

如何定义 查找 函数
— — 在数 组中 查找某 关键 字,返 回其
下标
无序数组 —— 简单查 找

函数头:
int search (int a[n], int key)
改造 为: int search(int a[ ], int n, int key)

排序数组 —— 折半查 找(二分查 找)


折半 查找 算法思 想:
确定 查找 区间, 找出 区间中 点元 素,该
元素 与关 键字比 较, 比较有 三种 结果:
1 相等: 找到;
2 关键字 小于该 元素 ,查找 区间变 为前半,重
复上 述查 找过程 ;
3 关键字 大于该 元素 ,查找 区间变 为后半,重
复上 述查 找过程 ;
查找重 复至 找到或 查找 区间 缩短为 0 。
bisearch(int a[ ], int n, int key){
int low=0,high=n-1;
while(low<=high){
mid=(low+high)/2;
if(a[mid]==key) break;
else if(a[mid]<key) low=mid+1;
else high=mid-1;
}
if(low>high) return –1;
else return mid;
}

调用语句 例: bisearch(a,8,5);
演示例程 序 bisearch 。
2 数组的排 序

数组排序 的目 的是为 了查 找方便 。排序 有很 多算


法, 本节 介绍 选择排 序和冒泡排 序两种算 法。
1 选择排序
选择排序 算法 思想:
第 0 次:从 a0 - an-1 中找出 最小值 ,与 a0 交换;
第 1 次:从 a1 - an-1 中找出 最小值 ,与 a1 交换;
…… ……
第 i 次: 从 ai - an-1 中找出 最小值 ,与 ai 交换;
…… ……
第 n-2 次:从 an-2 - an-1 中找 出最 小值, 与 an-2 交
换;
顶层算法 描述 :
for(i=0;i<n-1;i++){
从 a[i] - a[n-1] 中找出最 小值 ,与 ai
交换;
}
“ 从 ai - an-1 中找 出最 小值与 ai 交换” 的算 法描述 :

min=a[i]; pos=i;
for(j=i+1;j<n;j++)
if(a[j]<min) { min=a[j]; pos=j; }
if(pos!=i){ 交换 a[i] 和 [pos]; }
选择排序 函数 描述:
void selectsort(int a[],int n){
for(int i=0;i<n-1;i++) {
int min=a[i], pos=i;
for(int j=i+1;j<n;j++)
if(a[j]<min) { min=a[j]; pos=j; }
if(pos!=i) { int t=a[i];a[i]=a[pos]; a[pos]=t;}
}
}

调用语句 例: selectsort(a,10);

演示例程 序 selectsort 。
2 冒泡排序
冒泡 排序 算法思 想:
第 0 次:在 a0 - an-1 中,从 an-1 开始 ,两 两比较 ,将
小的 排在 前面, 大的 排在后 面, 将最小 值冒到 a0 处;
第 1 次:在 a1 - an-1 中,将 最小值 冒到 a1 处;
…… ……
第 i 次:在 ai - an-1 中,将最 小值 冒到 ai 处;
…… ……
第 n-2 次:在 an-2 - an-1 中,将 最小 值冒到 an-2 处;
顶层 算法 描述:
for(i=0;i<n-1;i++){
在 a[i] - a[n-1] 中,从 a[n-1] 开始 两
两比 较,
将最小 值冒 到 a[i] 处;
“ 在 ai - an-1 中,从 an-1 开始两两 比较 ,将最 小值 冒
到 ai 处”的 算法 描述:

for(j=n-1; j>i; j--)


if(a[j]<a[j-1]) { 交换 a[j] 和 a[j-1]; }
冒泡排序 函数 描述:
void bublesort(int a[],int n){
for(int i=0;i<n-1;i++)
for(int j=n-1;j>0;j--)
if(a[j]<a[j-1]){
int t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}

如果原始 数组 已排好 序, 或在排 序过程 中数 组已


成为 排序 数组, 可以 从算法 上增 加一定 的判断 来提 高
排序 效率 。
改进的冒 泡排 序函数 描述 :
void bublesort(int a[],int n){
for(int i=0;i<n-1;i++){
int change=0; // 没有 交换 发生
for(int j=n-1;j>0;j--)
if(a[j]<a[j-1]){
int t=a[j];a[j]=a[j-1];a[j-1]=t;
change=1; // 有交换发 生
}
if(!change) break;
}
}
调用语句 例: selectsort(a,10);

演示例程 序 bubblesort 。 6.1


结束
6.1.2 多维 数组 的定 义及使

描述一个 矩阵 (行列 式) 或表, 需要两 个下 标的
数组 ;描 述空间 点的 集合, 则需 要三个 下标的 数组 。
带有多个 下标 的数组 称为 多维数 组。我们以 二维
数组 为例 说明多 维数 组的定 义和 使用方 法。
1 二维数 组的 定义及 初始 化
举例说明 :
int a[3][4];
int arr[2][3]={{1,2,3},{4,5,6}};
double x[3][5]={{2,4,6},{5},{0,3}}; 只能省 略
第一维
int arr[ ][3]= {{1,2,3},{4,5,6}};

二维数组 被看 作元素 为数 组的数 组,在 内存 中按


行存 储。

2 二维数 组的 使用
二维数组 的使 用方法 与一 维数组 完全类 似, 除了
作为 函数 参数, 必须 使用到 下标 变量。 二维数 组的 下
标变 量一 定带有 两个 下标。
3 二维数 组的 应用举 例

请注意二 维数 组下标 变量 的使用 方法。

【例 6.5 】求 一个 三行四 列数 组中元 素的最 大值 和


最小 值, 以及最 大最 小元素 的位 置。

【例 6.6 】将 一个 4×4 矩阵转 置。

6.1.2
结束
6.2 字符数组的定义及应

字符数组 是元 素为字 符类 型的一 维数 组
,其 定义 、初始 化及 操作方 法与 一般一 维数
组的 原则 一样。

字符数组 —— 串变量 ,其 操作又 具特 殊


性, 体现 在初始 化和数组的 使用 上。
6.2.1 字符数组的初始化
请看 以下 两种方 法:

char s1[ ]={‘g’, ‘o ’, ‘o’, ‘d };


char s2[ ]=“I am a student!”;

s1 和 s2 存储的 内容 是不完 全相 同的 , s2 的长度 比


s1 长一个字 符, 就是‘ \0’ ,称为 串结束 标志 。
6.2.2 字符数组的使用
字符串的 输入 输出
更常用 方法 是直接输入 或输 出字符 串
变量名 。例如 :
char s1[50],s2[60];
cin>>s1>>s2;
cout<<s1<<endl;
cout<<s2<<endl;
若在执 行时输 入 strings is abc ,则 输出 为:
strings
is

注意串 结束标 志‘ \0’ 的作用 。


如果要 将一个 整行 输入到 一个 串中 ,可使 用库 函
数:
cin.getline(s,n); // 将当前行 中前 n-1 个字符 读到
如果当 前行中 字符 数少于 n-1 个,则 在最 后一个
串 s中
字符 后面 加上‘ \0’ 字符。例 如:
cin.getline(s1,7);
cin.getline(s2,60);
cout<<s1<<“ “<<s2;
若输 入:
abcdefg
good
则输出 :
abcdef
g 6.2
结束
6.3 字符串处理函数
strcpy(s1,s2); // 将串 s2 拷贝 到串 s1 中
strcat(s1,s2); // 串 s2 拼接到 串 s1 后,成为 新的
串 s1
strcmp(s1,s2); // 两个串 按字 典序比 较大 小
strlen(s); // 求串 的有 效字符 长度
【例 6.12 】输入三 个字符 串, 按从小 到大 的顺序 输
出。

第六章
结束
cha r s1[ 40] ,c ha r s 2[ 40] , c ha r s3[ 40 ];
cin >> s1> >s2 >> s3 ;
if( st rcm p(s 1, s2 )>0 ){
cha r t[4 0];
str cp y(t ,s1 );
str cp y(s 1,s 2) ;
str cp y(s 2,t );
}
if( st rcm p(s 1, s3 )>0 ){
cha r t[4 0];
str cp y(t ,s1 );
str cp y(s 1,s 3) ;
str cp y(s 3,t );
}
if( st rcm p(s 2, s3 )>0 ){
cha r t[4 0];
str cp y(t ,s2 );
str cp y(s 2,s 3) ;
str cp y(s 3,t );
}
cou t< <s1 <<' \t '< <s2 << '\t '<< s3 << end l;
}

You might also like