5 数组
5.1 概述
数组就是一个集合,里面存放了相同类型的数据元素
- **特点1:**数组中每个数据元素都是相同的数据类型
- **特点2:**数组是连续的内存位置组成的
5.2 一维数组
5.2.1 一维数组的定义方式:
一维数组有三种定义方式:
数据类型 数组名[ 数组长度 ]
数据类型 数组名[ 数组长度 ]={ 值1,值2,…}
数据类型 数组名[]={ 值1,值2,…}
示例1:
int main()
{
// 1. `数据类型 数组名[ 数组长度 ]`
int arr[5];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
int a = 3;
cout << arr[3] << endl;//这个访问的是 40
cout << arr[ a ] << endl; //数组的下标可以通过变量来索引
system("pause");
return(0);
}
示例2:
int main()
{
//2.数据类型 数组名[ 数组长度 ]={ 值1,值2,…}
int arr2[5] = {10,20,30,40,50};
for (int i = 0; i < 5; i++) // i < 5 中,5表示数组长度
{
cout << arr2[i] << endl;
}
//若初始没有补齐数据,会用0来填充空余数据
system("pause");
return(0);
}
示例3:
int main()
{
//3.数据类型 数组名[]={ 值1,值2,…}
//定义数组时必须要给定初始长度
int arr3[] = {1,1,4,5,1,4};
for (int i = 0; i < 6; i++)
{
cout << arr3[i]<<endl;
}
system("pause");
return(0);
}
- 数组中的数据是从0开始标记(索引)下标
- 我们可以通过下标来访问数组中的元素
5.2.2 一维数组数组名
用途:
- 可以统计整个数组在内存中所占的长度
- 可以获取数组在内存中的首地址
对1:
sizeof(数组名)
我们可以用 `sizeof(arr)/sizeof(arr[0])来获取内存的长度
对2:
cout << arr <<endl;
一般该地址为16进制地址
int main()
{
//1。查询数组所占内存大小
int arr[6]={1,1,4,5,1,4};
cout << "数组大小为"<< sizeof(arr)<<endl;
cout << "数组长度为"<< sizeof(arr)/sizeof(arr[0])<<endl;
//2.查看首地址
cout <<"内存地址"<< arr << endl;//16进制
cout << (long long)arr <<endl;//强转10进制
cout << &arr[0]<<endl;//数组中某个元素的内存地址
cout << (long long)&arr[0] <<endl;//数组中某个元素的10进制内存地址
//使用 long long 包容16进制精度问题
cout << &arr[1]<<endl;//第二个元素位置
cout << (long long)&arr[1] <<endl;//10进制
//第二个与第一个相差4字节
//数组名是常量,不能修改赋值
system("pause");
return(0);
}
练习案例1:
-
在一个数组中记录了5个数据,arr[5] ={10,30,20,70,60}
-
找出这个数组中最大数
int main()
{
int arr[5]= {10,30,60,40,20};
int max = 0; //假设某一最大值
for (int i = 0; i < 5; i++)//访问数组中的每一个数
{
if (arr[i] > arr[max]) //比较假设值和访问值大小
{
max = i ; //若大于,则替换假设最大值
}
}
//循环结束时,最大值以确定
cout << "最大的数是" << arr[max]<<endl; //输出
system("pause");
return(0);
}
Note
在上面代码中,for循环内部也可以使用三目运算来找最大值
max = (arr[max] > arr[i] ? max : i ); //使用三目运算符
**练习案例2:**数组元素逆置
- 声明一个5个元素的数组,并将其逆置
- 示例 : 原数组 {1,3,4,2,3} ⇒ 输出{3,2,4,3,1}
- 输出逆置
int main()
{
int arr[5] = {1,3,4,2,3};
for (int i = 0; i < 5; i++)
{
cout << arr[4-i] ;
}
cout << endl;
system("pause");
return(0);
}
- 创立逆置数组
int main()
{
int arr[5] = {1,3,4,2,3};
int arrt[5];
int t; //建立逆置变量
for (int i = 0; i < 5; i++)
{
t = (sizeof(arr)/sizeof(arr[0]))-1-i; //实现逆置变量
arrt[i] = arr[t]; //实现原数组向逆置数组的赋值
}
//逆置数组建立完成,以下为检查
for (int i2 = 0; i2 < 5; i2++)
{
cout << arrt[i2] <<endl;
}
system("pause");
return(0);
}
- 原数组的逆置
int main()
{
int arr[5] = {1,3,4,2,3};
int sta = 0;
int end = sizeof(arr)/sizeof(arr[0])-1;
int temp = 0;
//核心
for ( ; sta < end ; ) //当起始值位置大于末尾值位置时停止
{
temp = arr[sta]; //初始值赋值至临时内存
arr[sta] = arr[end]; //末尾值赋值至初始值
arr[end] = temp; //初始值(临时)赋值至末尾值
sta++; //初始值后移一位
end--; //末尾值前移一位
}
//数组倒置结束
for (int i2 = 0; i2 < 5; i2++)
{
cout << arr[i2]<<endl;
}
system("pause");
return(0);
}
5.2.3 冒泡排序
**作用:**最常用的排序算法,对数组内的元素进行排序
- 比较相邻的元素,如果第一个比第二个大,就交换他们
- 对每一对相邻元素做同样工作,执行完毕后,找到第一个最大值
- 重复以上步骤,每次比较次数-1,直到不需要比较
示例: 将数组{4,2,3,0,5,7,1,3,9}升序排列
int main()
{
int arr[9] = {4,2,3,0,5,7,1,3,9};
for (int i = 0; i < (sizeof(arr)/sizeof(arr[0])-1); i++)//排序的总轮数=元素个数-1
{
for (int j = 0; j <(sizeof(arr)/sizeof(arr[0])-1)-i ; j++) //每轮排序的次数 = 元素个数 -1 -当前轮数
{
if (arr[j] > arr[j+1] ) //判断相邻的两个数的大小
{
//实现交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//输出验证
for (int i2 = 0; i2 < 9; i2++)
{
cout << arr[i2]<<endl;
}
system("pause");
return(0);
}
- 利用遍历实现数据筛查
- 题目来源洛谷P1085 [NOIP2004 普及组] 不高兴的津津
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,t;
int m =0;
int arr[7];
for (int i = 0; i < 7; i++)
{
cin >> a >> b;
int k =a +b;
arr[i] = k; //将获得的数据记入数组
}
//对数组遍历,找出最大的那个数
for (int j = 0; j < 7; j++) //假设一个最大值 arr[0],让arr[0]和下一个数比较,若大于,则将m赋值为j
{
if (arr[m] < arr[j])
{
m = j;
t = arr[j];
}
}
if ( t > 8)
{
cout << m+1 <<endl;
}
else
{
cout << 0 <<endl;
}
system("pause");
return(0);
}
5.3 二维数组
5.3.1 二维数组的定义方式:
数据类型 + 数组名[行数][列数];
数据类型 + 数组名[行数][列数] = {数据1,数据2},{数据3,数据4};
[^2]数据类型 + 数组名[行数][列数] = {数据1,数据2,数据3,数据4};
数据类型 + 数组名[][列数] = {数据1,数据2,数据3,数据4};
- 第三和第四组会自动区分行列数(即从第一个数据开始计数,记到列数自动换行)
5.3.2 二维数组的赋值方式
- arr[0][0] = 元素;
- arr[0][1] = 元素;
- ……
如何输出一个二维数组?
写一个嵌套循环,外层打印行数,内层打印列数
for (int i = 0;i < count ; i++)
{
for(int j = 0;j < count ; j++)
{
cout << arr[i][j];
}
cout << endl;
}
Note
- 直观表示一个二维数组 :
int arr[3][3];
列\行 0列 1列 2列 0行 arr[0][0] arr[0][1] arr[0][2] 1行 arr[1][0] arr[1][1] arr[1][2] 2行 arr[2][0] arr[2][1] arr[2][2] 行列式行列式,先行后列
5.3.3 二维数组数组名
- 查看二维数组所占内存空间
- 获取二维数组首地址
- 具体如下
int main()
{
int arr[3][3] =
{
{1,1,4},
{5,1,4}
};
//1.查看占用内存空间大小
cout << sizeof(arr) <<endl; // out : 36 (6*6)
cout << sizeof(arr[0][0]) <<" "<<sizeof(arr[0])<<endl; //out : 4 12(单个元素 第一行)
//我们可以通过以上数据获得行数与列数
sizeof(arr)/sizeof(arr[0]); //列数
sizeof(arr[0])/sizeof(arr[0][0]); //列数
//2.查看首地址
cout << (long long)arr <<endl; //out : 6422000
cout << (long long)arr[0] <<endl; //二维数组地址与arr[0][0]首地址重合
cout << (long long)arr[1] <<endl; //out : 6422012 差12(3*4)
cout << (long long)&arr[0][0] <<endl; //二维数组地址与arr[0][0]首地址重合
cout << (long long)&arr[0][1] <<endl; //out : 6422004 与[0][0]差4
system("pause");
return(0);
}
5.3.3 二维数组应用案例
考试成绩统计
- 有三名同学(A,B,C),在一次考试中成绩分别如下,请输出三名同学的总成绩
语文 | 数学 | 英语 | |
---|---|---|---|
A | 100 | 100 | 100 |
B | 90 | 50 | 100 |
C | 60 | 70 | 80 |
int main()
{
int arr[3][3] =
{
{100,100,100},
{90,50,100},
{60,70,80}
};
for (int i = 0; i < 3; i++)
{
int temp = 0;
for (int j = 0; j < 3; j++)
{
temp += arr[i][j];
}
cout << temp <<endl;
}
system("pause");
return(0);
}
5.3.4 二维数组排序
- 核心思路:冒泡排序
int main()
{
int l,m;
cin >> l >> m;
int arr[m][2];
for (size_t i = 0; i < m; i++)
{
for (size_t j= 0; j < 2; j++)
{
cin >> arr[i][j];
}
}
for (size_t i2 = 0; i2 < m-1; i2++)
{
for (size_t j = 0; j < m-i2-1; j++)
{
if (arr[j][0] > arr[j+1][0])
{
int temp1 = arr[j][0];
int temp2 = arr[j][1];
arr[j][0] = arr[j+1][0];
arr[j][1] = arr[j+1][1];
arr[j+1][0] = temp1;
arr[j+1][1] = temp2;
}
}
}
for (size_t i = 0; i < m; i++)
{
for (size_t ij = 0; ij < 2; ij++)
{
cout << arr[i][ij]<<" ";
}
cout <<endl;
}
return 0;
}