一、一维数组**
(一)、一维数组的定义
1、定义
数组就是一组相同类型的变量,它们往往都是为了表示同一批对象的统一属性。
在C++中,使用一维数组时,一般是从0开始编号,h[i]就表示第i+1个变量,i称为“下标变量”。
例:读入50个同学的身高,语句就可以这样书写:
for(i = 0; i <= 49; i++)cin >> h[i];
定义一维数组的格式如下
类型标识符 数组名 [常量表达式];
类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义。数组名必须是合法的标识符,常量表达式的值即为数组元素的个数。
2、元素的引用
引用格式为“数组名[下标]”,其中,下标只能为整型常量或整型表达式,值必须在数组定义的下标范围内,否则会出现“下标越界错误”。
注意:不能一次引用整个数组,只能逐个引用数组的单个元素。
3、存储结构
数组在计算机内存单元中是连续存储的。整个数组所占的内存大小等于数组元素类型的大小乘以数组元素的个数。
(二)输入与输出
一维数组的输入、输出等操作,都是采用循环语句结合下标变化逐个元素进行。
例如,输出一个数组可以写成:
int h[100];
for (i = 0; i<100; i++)cout << h[i];
一次性输入批量数据到一维数组中,方法:
(1)键盘读入
(2)直接赋值
C++里还提供了两个函数给数组整体赋值
①memset函数 是给数组按字节进行赋值,一般用在char型数组中,如果是int类型的数组,一般赋值为0和-1。目前需要包含头文件: #Include
②fill函数 是给,数组按元素进行赋值,你是整个数组,也可以是部分连续元素,可以赋任何值。使用前需要包含头文件:#include
例:
#include
#include
using namespace std;
int main () {
int a[10],b[10],c[10],d[10],i;
memset(a,0,sizeof(a));//将a数组所有元素均赋值为0
for(i = 0; i<9;i++) cout << a[i] << " ";
cout << a[9] <<endl;
memset (b,1,sizeof (b));//将b数组所有元素均赋值为二进制数
for (i =0;i < 9 ;i++) cout << b[i] << " ";
cout << b[9] << endl;
memset (c,0,5);
for (i = 0;i < 9;i ++)cout << c[i] << " ";
cout << c[9] << endl;
fill (d,d+5,8);//将d数组前5个字节都赋值为0,所以只能确定出c[0] ==0,其他元素值不确定
for (i=0;i< 9;i++) cout << c[i] << " ";
cout << c[9] <<endl;
fill (d,d+5,8);//将d数组前5个元素都赋值为8,其他元素值不确定
for (i = 0;i < 9;i++)cout <<d[i] << " ";
cout << d[9] <<endl;
return 0;
}
(三)插入和删除
插入一个元素,需要先找到插入的位置,假设下标为x,将这个元素及其之后的所有元素依次往后移一位(要从后往前进行操作),再将给定的元素插入覆盖到位置x。
删除某一个元素也需要先找到删除的位置,假如下标为x,将下标为x+1及其之后的所有元素,依次向前移一位,覆盖原来位置上的元素。
例:
#include
using namespace std;
int main () {
int n,i,x,q[102];
scanf ("%d",&n);
for (i =1;i<=n;i++) scanf("%d",&q[i]);
scanf ("%d",&x);
for (i=n;i >= x; i–) q[i+1] = q[i];
q[x] = q [n+1];
for (i =1;i<n;i++)printf ("%d",q[i]);
printf ("%d\n".q[n]);
return 0;
}
(四)查找统计
常见的查找算法,有顺序查找和二分查找。顺序查找就是按照从前往后的顺序将数组中的元素依次与要查找的数x进行比较。吐组中的元素是有序的,递增或者递减也可以采用二分查找。二分查找又称折半查找其优点是比较次数少,查找速度快。
例:
#include
using namespace std;
int main() [
int n,i,win, f,left,right,mid,g[101];
scanf ("%d",&n) ;
for(i = 1; i<= n; i++) scanf("%d" ,&g[i]) ;
scanf ("%d" , &win) ;
f=0;
left = 1; right = n;
while(left <= right) l
mid = (left + right) /2;
if (g [mid] == win) {f = mid;break;}
if(win < g[mid]) right = mid - 1;
if(g[mid] < win) left=mid+1;}
printf ("%d\n",f);
return 0;
}
(五)元素排序
排序就是按照某个关键字的大小将若干对象从小到大或者从大到小进行重新排列,关键字是对象的某一个属性,它可以是任何基本数据元素,甚至结构体等。
去算法非常多,最基本的三种是选择排序,冒泡排序和插入排序,它们本质上都是通过数组中的元素比较和交换来实现的,所以关键是数组下标的分析。
算法一:选择排序
选择排序的基本思想是每一趟从待排序的数据中通过打擂台比较选出最小元素,放在这些数据的最前面。
算法二:冒泡排序
冒泡排序的基本思想是从第一个数开始,依次不断比较相邻的两个元素,如果逆序就交换这样一趟排序结束后,最大的元素就放在了第n个位置了。
算法三:插入排序
插入排序的基本思想是把所有待排序元素分成前后两段,前一段是已经排好序的,后一段是带排序的,每一趟都是把后一段的第一个数插入到前一段的某一个位置,保证前一段仍然是有序的。
(六)应用举例
桶排序(数据虽然很多,但是数据范围比较小)定义一个int型数组num[1001],num[x]记录整数x出现的次数初始化都为零,每读到一个数x就执行num[x]=num[x]+1。输出时,从1~1000穷举x,每个x输出num[x]次。
举例 素数大酬宾
算法1 穷举法
算法2 筛选法
相比穷举法,筛选法的效率更高
例:
#include
#include
using namespace std;
int main() {
int n,i,j;
bool flag;
cin>> n;
cout <<2 ;
for(i=3; i<= n;i++) {
flag= true;
for(j=2;j<= sqrt(i);j++)
if(i%j==0){
flag = false;
break;
}
if( flag)cout <<" "<< i;
}
cout << endl;
return 0;
}
二、二维数组
(一)定义和操作
1、定义和初始化
如果一维数组的每一个元素,又是一个一维数组,则称这个数组为二维数组。
一般格式:
类型标识符 数组名 [常量表达式1][常量表达式2]; 常量表达1的值是第一维大小,常量表达式2的值表示第二维大小,常量表达式一和常量表达式二的乘积就是二维数组的元素个数。
在定义二维数组时,可以省略第一维的大小,但是第二维的大小不能省略。
2、存储及元素引用
二维数组的存储方式是行优先的,连续存储,先找个存储第零行上的所有元素,再逐个存储第一行上的所有元素,依此类推。
引用二维数组的某一个元素,格式为:
数组名 [下标1][下标2]
3、输入输出
二维数组的输入输出操作,也是针对每一个元素进行,结合两个维度的下标变化,用循环嵌套实现。
(二)应用举例
例:
#include
#include< i omanip>
#include ,
using namespace std;
int main() {
int n,i,j,k,t= 0,a[21] [21] ;
cin>> n;
for(k=1;k<= n;k++)
if(k%2)
for(j=1; j <=k; j++) {
i=k+1-j;
t++ ;
a[i][j] s t;
a[(n+1-il[n+1-j1-n+n+1- t;
}
else
for (j=k;j>1;j–){
i= k+1-j;
t++;
a[i][j]= t;
a[n+1-i1[n+1-j]- n*n+1-t;
for(i = 1; i<=n;i++)[
for(j= 1;j <= n;j++)
cout << setw(5) << a[i] [j] ;
cout << endl ;
}
return 0;
}
三、字符数组
如果数组中的每一个元素都是一个字符,这样的数组称为字符数组。把一维字符数组又称为字符串。
字符数组赋值方法:
①用字符常量逐个初始化:
char letter[5]={‘a’,‘e’,‘i’,‘o’,‘u’};
②用赋值语句逐个元素赋值:letter[0]=‘a’;…
③用scanf读入整个数组:scanf(“%s”,letter);
④用scanf逐个元素读入:scanf(“%c”,&letter[0]);…
⑤用cin输入整个数组:cin>>letter;
⑥用cin逐个元素输入:cin>>letter[0];…
⑦用gets读入整个数组:gets(letter);
⑧用getchar逐个读入:letter[0]=getchar();…
字符数组的输出方法:
①用cout输出整个数组:cout >>letter;
②用cout逐个元素输出:cout>>letter[0];……
③用printf输出整个数组:printf("%s",letter);
④用printf逐个元素输出:printf("%c",letter[0]);……
⑤用puts输出整个数组:puts(letter);
⑥用putchar逐个元素输出:putchar(letter[0]);……
收获:
通过本章学习,学到了关于数组的相关知识,数组可以使冗长繁琐的程序代码变得简单,提高编程效率,并且数组在实际应用中也很广泛,比如,插盾问题查找统计问题以及排序问题等。而且也有很多方法使执行程序的时间缩短,简化过程。由一维数组推出二维数组,二维数组主要解决平面上的问题,如数字方阵。