第五单元 数组 总结

时光总嘲笑我的痴心妄想 提交于 2019-12-24 19:07:00

第一课  一维数组的定义

cin >> h0 >> h1 >> h2 >>...>> h49;//程序中是不能用省略号来表示的。

显然这样的程序代码冗长繁琐,编程效率差,因此引入数组的概念。

数组  数组就是一组相同类型的变量。他们往往都是为了表示同一批对象的统一属性。

例如,for (i=0;i<=49;i++) cin>>h[i];

数组本身是变量,数组经常应用在大批量同一类型的数据处理任务中。以减少代码的长度。

1.一维数组的定义

格式如下  类型标识符(原数据) 数组名(变量类型) [常量表达式];

其中类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义。

数组名必须是合法的标识符。

常量表达式的值即为数组元素的个数。

int d[50],g[100];

int  a[5*10];

#define N 50;

int  b[N];

以上几个定义也是允许的。

2.一维数组的元素引用

数组定义好后,就可以引用数组中的任意元素,引用格式为   数组名[下标]  例如,h[5]  数组的下标从0开始,h为数组名,[5]表示的是第六个元素。

下标只能为整型常量或整型表达式值必须在数组定义的下标范围内,否则会出现下标越界错误。

需要特别注意,不能一次引用整个数组,只能逐个引用数组中的单个元素。

3.一维数组的存储结构

数组在计算机内存单元中是连续储存的。程序一旦执行到数组的定义语句,就会开辟出若干字节的内存单元。整个数组所占的内存大小等于数组元素类型的大小乘以数组元素的个数。是C++还提供了一个sizeof函数,可以直接求出一个数组所占的内存空间。

根据数组在内存单元中的首地址和数组类型,可以计算出该数组中任意第i个元素的起始地址。

第二课   一维数组的输入与输出

由于数组的操作只能逐个引用单个元素,所以一维数组的输入输出等操作都是采用循环语句结合下标变化逐个元素进行。

批量数据一次性输入到一维数组中的方法

1.键盘读入

int  h[100];

for (i=0;i<100;i++)  cin>>h[i];

2.直接赋值

int  h[100],;

for(i=0;i<100;i++)  h[i]=0;

C++里还提供了两个函数给数组整体赋值

1.memset 函数  给数组按字节进行赋值,一般用在char型数组中。如果是int类型的数组,一般赋值为0和-1。使用前需要包头文件 #include<cstring>。

2.fill函数  给数组按元素进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任意值。使用前需要包头文件 #include<algorithm>。

此外,睡觉觉还支持在定义数组的同时给所有或部分元素赋值。

int  a[10]={0,1,2,3,4,5,6,7,8,9};

int a[10]={0,1,2,3,4};//部分赋初值,后面的元素自动初始化为零。

int  a[ ]={1,2,3,4,5};//不定义数组长度,直接根据赋值个数定。

第三课   一维数组的插入删除

需要在数组中插入一个元素或删除数组中的某一个元素,称为数组的插入操作,或者删除操作,插入或者删除一个元素需要先找到插入或者删除的位置,将该位置以后的元素依次往后以或者是依次往前移一位注意要依次进行操作,覆盖原来位置上的元素。

第四课 一维数组的查找统计

一维数组的查找操作就是在一维数组中查找有没有某个元素,它的值等于指定的值x。

查找操作的结果可能是一个没找到,找到一个或者多个。

常见的查找算法有  顺序查找   按照从前往后的顺序,将数组中的元素依次于要找的数x进行比较,如果数组中的元素是有序的,递增或者递减,也可以采用二分查找。

二分查找    又称折半查找,其优点是比较次数较少,查找速度较快。

while (left <= right){  划分查找范围

ans全局统计,,针对整个问题,循环体外赋初值。

t1=t2=0 注意为易错点。

局部统计在循环体内赋初值,i不断变化,循环内部针对某个变量。

第五课  一维数组的元素排序

排序就是按照某个关键字的大小将若干对象从小到大或者是从大到小进行重新排列。

算法一  选择排序

基本思想为,每一次从待排序的数据中,通过比较选出最小元素放在这些数据的最前面。把数据从小到大依次放到第一个到第n个位置。#include<algorithm>默认sort函数是按升序排列。

算法二   冒泡排序

基本思想是从第一个数开始,依次不断比较相邻的两个元素,如果逆序就交换这样一趟排序结束后最大的元素就放在了第n个位置。冒泡排序可以做算法优化,如果一次排序下来都没有任何逆序数对,即没有发生交换操作说明已经排好序,可以立刻退出循环。

算法三  插入排序

基本思想是把所有待排序元素分成前后两段,前一段是已经排好序的,后一段是有待排序的,每一次都是把后一段的第一个数插入到前一段的某一个位置,保证前一段仍然是有序的开始时把第一个数作为前一段肯定是有序的,第二次把第二个数插入禁区保证前两个是有序的,以此类推,第n减一次,把第n个数插入进去,保证前n个数都有序。

第六课  一维数组的应用举例

桶排序  定义一个int型数组num[1001],num[x]记录整数x出现的次数,初始化都为零,每读到一个数x就执行num[x]=num[x]+1.输出时从零到100穷举x,每个x输出num[x]次。

进行排序时可使用穷举法,筛选法  bool  p[100001]占用一个字节,而整型int占用字节多。

第七课   二维数组的定义和操作

一维数组中的每一个元素又是一个一维数组则称这种数组为二维数组。

类型标识符  数组名[常量表达式一][常量表达式二];

常量表达式一的值表示第一维大小,常量表达式二的值表示第二维大小,常量表达式一和常量表达式二的成绩就是二维数组的元素的个数。

int a[2][3]={{1,2,3},{4,5,6}};//分行初始化

int  a[2][3]={1,2,3,4,5,6};// 部分行初始化

二维数组的存储及元素引用

数组名[下标1][下标2]

二维数组的输入与输出   

二维数组的输入输出操作也是针对每个元素进行,结合两个维度的下标变化,用循环嵌套实现。

第九课  数字方阵

数字方阵就是一个行列数相等的二维数组,其中每个元素都是数字解决数字方阵问题一般有两种方法,解析法和模拟法。

解析法就是找出每个方阵元素f[i][j]与i,j和数组规模n的通项公式,然后直接用两重循环给数组元素赋值比较容易,一般用在初始化等场合。  

模拟法就是把数字方阵看成一个动态的天数过程,把n平方个数依次填入数组中,每填好一个数就定位好下一个数的位置i和j。

第十课   字符数组

数组中每个元素都是一个字符,这样的数组称为字符数组,一维字符数组又称为字符串。

用cin煮个元素输入 cin >> letter[0]不含空格

需要注意的是在使用scanf的%格式或gets读入字符串时,会在字符串末尾自动添加一个空字符'\0',使用getchar等方法读入字符串时,则要在字符串后手工加'\0'。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!