C++基础知识(五)
- 1. 一维数组
- 1.1 定义方式
- 1.2 数组名用途
- 1.3 案例分析
- 2. 二维数组
- 2.1 定义方式
- 2.2 数组名用途
- 2.3 案例分析
- 3. 多维数组
1. 一维数组
数组就是一个集合,里面存放了相同类型的数据元素。
特点:
1、数组中每个元素的数据类型都是一样的;
2、数组是由连续的内存位置组成的,最低的地址对应第一个元素,最高的位置对应最后一个元素;
3、C++中数组元素的下标是从0开始索引的与Python一样。
1.1 定义方式
1. 数据类型 数组名[数组长度]
- 代码演示
#include <iostream>
using namespace std;
int main() {
//1、数据类型 数组名[数组长度]
int arr1[5];
for (int i = 0; i < 5; i++)
{
arr1[i] = i + 1;
cout << arr1[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
- 输出结果
2. 数据类型 数组名[数组长度] = {值1,值2,…,值n}
- 代码演示
#include <iostream>
using namespace std;
int main() {
//2、数据类型 数组名[数组长度] = {值1、值2、...、值n} 告诉数组长度的定义方式可以不说明每一值,未说明的值将会用0代替。
int arr2[5] = {1, 2, 3};
for (int j = 0; j < 5; j++)
{
cout << arr2[j] << " ";
}
cout << endl;
system("pause");
return 0;
}
- 输出结果
3. 数据类型 数组名[ ] = {值1,值2,…,值n}
- 代码演示
#include <iostream>
using namespace std;
int main() {
//3、数据类型 数组名[] = {值1、值2、...、值n} 未告诉数组长度的定义方式必须说明每一个值,不然就无法知道数组的长度
int arr3[] = { 5, 4, 3, 2, 1 };
for (int k = 0; k < 5; k++)
{
cout << arr3[k] << " ";
}
cout << endl;
system("pause");
return 0;
}
- 输出结果
1.2 数组名用途
1. 统计整个数组在内存中的长度
2. 获取数组在内存中的首地址
- 代码演示
#include <iostream>
using namespace std;
int main() {
int arr1[10];
for (int i = 0; i < 10; i++)
{
arr1[i] = i + 1;
cout << arr1[i] << " ";
}
cout << endl;
//1、统计整个数组在内存中的长度
cout << "整个数组在内存中的长度为:" << sizeof(arr1) << endl;
cout << "每个元素在内存中的长度为:" << sizeof(arr1[0]) << endl;
cout << "统计数组中元素的个数为:" << sizeof(arr1) / sizeof(arr1[0]) << endl;
//2、获取数组在内存中的首地址
cout << "数组在内存中的首地址为:" << (int)arr1 << endl;
cout << "数组中第1个元素的地址为:" << (int) &arr1[0] << endl;
cout << "数组中第2个元素的地址为:" << (int) &arr1[1] << endl;
cout << "数组中最后一个元素的地址为:" << (int) &arr1[9] << endl;
system("pause");
return 0;
}
- 输出结果
注意:
(int)arr1、(int)&arr1[0]
采用了一个类型强制转换,本身地址应该是指针类型的数据(16进制的),但是在此将其强制转化为了整型数据(10进制),便于我们直观的理解。
在使用类型强制转换时,将会出现警告
1.3 案例分析
1. 找5个数中的最大值
- 案例描述
一个一维数组int arr[ ] = {188, 290, 555, 493, 618};
输出数组中最大的数
- 思路分析
访问数组中的每个元素,设定一个初始最大值,让数组中的每一个元素与当前最大值比较,如果大于当前最大值则更新最大值,否则继续往后比较,直到找到整个数组中的最大值
- 代码实现
#include <iostream>
using namespace std;
int main() {
int arr1[] = {188, 290, 555, 493, 618};
int max = 0;
for (int i = 0; i < 5; i++)
{
if (arr1[i] > max)
{
max = arr1[i];
}
}
cout << "五个数中最大的数为:" << max << endl;
system("pause");
return 0;
}
- 输出结果
2. 数组元素逆置
- 案例描述
一个一维数组int arr[ ] = {3, 5, 2, 4, 1, 6};
将数组中的元素进行逆置,再输出
- 思路分析
1、记录起始位置下标start;
2、记录末尾位置下标end;
3、起始位置与末尾位置进行互换temp = start;start = end;end = temp;
4、更新起始与末尾位置元素,start++;end- -;
5、进行循环更新,直到start >= end;
- 代码实现
#include <iostream>
using namespace std;
int main() {
int arr1[] = {3, 5, 2, 4, 1, 6}; //初始化数组
int lon = sizeof(arr1) / sizeof(arr1[0]); //得到数组的长度
//打印逆置前的数组
cout << "逆置前数组为:" << endl;
for (int i = 0; i < lon; i++)
{
cout << arr1[i] << " ";
}
cout << endl;
//对数组进行逆置
for (int start = 0; start < lon; start++)
{
int end = lon - start - 1;
if (end > start)
{
int temp = arr1[start];
arr1[start] = arr1[end];
arr1[end] = temp;
}
}
//打印逆置后的数组
cout << "逆置后数组为:" << endl;
for (int k = 0; k < lon; k++)
{
cout << arr1[k] << " ";
}
cout << endl;
system("pause");
return 0;
}
- 输出结果
3. 冒泡排序
最常用的排序算法,对数组内元素进行排序
- 案例描述
一个一维数组int arr[ ] = {4, 2, 8, 0, 5, 7, 1, 3, 9, 6};
将数组中的元素进行从小到大的顺序依次排序
- 思路分析
1、比较两个相邻元素,若第一个大于第二个,则交换它们两个的位置;
2、对每一对相邻元素做相同的工作,执行完毕后,找到第一个最大值;
3、重复以上的步骤,每次比较次数减1,直到不需要再进行比较;
- 代码实现
#include <iostream>
using namespace std;
int main() {
int arr1[] = {4, 2, 8, 0, 5, 7, 1, 3, 9, 6}; //初始化数组
int lon = sizeof(arr1) / sizeof(arr1[0]) - 1; //得到数组末尾元素的下标
//打印排序前的数组
cout << "冒泡排序前数组为:" << endl;
for (int i = 0; i <= lon; i++)
{
cout << arr1[i] << " ";
}
cout << endl;
//对数组进行冒泡排序
for (int m = 0; m <= lon - 1; m++) //比较轮数 = 数组长度-1
{
for (int n = 0; n <= lon - m - 1; n++) //每一轮比较次数 = 数组长度-当前比较轮数-1
{
if (arr1[n] > arr1[n + 1]) //第一个元素大于第二个元素则进行位置交换
{
int temp = arr1[n];
arr1[n] = arr1[n + 1];
arr1[n + 1] = temp;
}
}
}
//打印冒泡排序后的数组
cout << "冒泡排序后数组为:" << endl;
for (int j = 0; j <= lon; j++)
{
cout << arr1[j] << " ";
}
cout << endl;
system("pause");
return 0;
}
- 输出结果
2. 二维数组
2.1 定义方式
1. 数据类型 数组名[行数][列数]
- 代码演示
#include <iostream>
using namespace std;
int main() {
//1、数据类型 数组名[行数][列数];
int arr1[2][3];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
arr1[i][j] = j + 1;
cout << arr1[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
- 输出结果
2. 数据类型 数组名[行数][列数] = {{数据1,数据2,…,数据n},{数据1,数据2,…,数据n},…,{数据1,数据2,…,数据n}}
- 代码演示
#include <iostream>
using namespace std;
int main() {
//2、数据类型 数组名[行数][列数] = {{数据1,数据2,...,数据n},{数据1,数据2,...,数据n},...,{数据1,数据2,...,数据n}};
int arr2[2][3] =
{
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr2[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
- 输出结果
3. 数据类型 数组名[行数][列数] = {数据1,数据2,…,数据n}
- 代码演示
#include <iostream>
using namespace std;
int main() {
//3、数据类型 数组名[行数][列数] = {数据1,数据2,...,数据n};
int arr3[2][3] = { 5,5,5,5,5,5 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr3[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
- 输出结果
4. 数据类型 数组名[ ][列数] = {数据1,数据2,…,数据n}
- 代码演示
#include <iostream>
using namespace std;
int main() {
//4、数据类型 数组名[][列数] = { 数据1,数据2,...,数据n };
int arr4[][3] = {6,6,6,6,6,6};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr4[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
- 输出结果
2.2 数组名用途
1. 统计整个数组在内存中的长度
2. 获取数组在内存中的首地址
- 代码演示
#include <iostream>
using namespace std;
int main() {
int arr1[2][4] =
{
{2,0,2,2},
{1,9,9,8}
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 4; j++)
{
cout << arr1[i][j] << " ";
}
cout << endl;
}
//1、统计整个数组在内存中的长度
cout << "整个二维数组在内存中的长度为:" << sizeof(arr1) << endl;
cout << "二维数组某一行在内存中的长度为:" << sizeof(arr1[0]) << endl;
cout << "二维数组每一个元素在内存中的长度为:" << sizeof(arr1[0][0]) << endl;
cout << "统计二维数组中行的数目为:" << sizeof(arr1) / sizeof(arr1[0]) << endl;
cout << "统计二维数组中列的数目为:" << sizeof(arr1[0]) / sizeof(arr1[0][0]) << endl;
cout << "统计二维数组中元素的数目为:" << sizeof(arr1) / sizeof(arr1[0][0]) << endl;
//2、获取数组在内存中的首地址
cout << "数组在内存中的首地址为:" << arr1 << endl;
cout << "数组中第1行元素的地址为:" << arr1[0] << endl;
cout << "数组中第2行元素的地址为:" << arr1[1] << endl;
cout << "数组中第1个元素的地址为:" << &arr1[0][0] << endl;
cout << "数组中第2个元素的地址为:" << &arr1[0][1] << endl;
cout << "数组中最后一个元素的地址为:" << &arr1[1][3] << endl;
system("pause");
return 0;
}
- 输出结果
注意:为了方便更好的查看内存地址,只需要进行一个类型强制转换,将其从16进制转化为10进制数,如操作:(int)arr1、(int)&arr1[0][0]、(int)arr1[0]
2.3 案例分析
- 案例描述
某班级三位学生甲乙丙,他们的语数外分数分别为:[100,100,100],[98,88,92],[77,98,87]
求甲乙丙三者的总分,并在屏幕上输出
- 代码实现
#include <iostream>
using namespace std;
#include <string>
int main() {
int arr1[3][3] =
{
{100,100,100},
{98,88,92},
{77,98,87}
};
string arr2[3] = { "甲", "乙", "丙" };
for (int i = 0; i < 3; i++)
{
int scores_sum = 0;
for (int j = 0; j < 3; j++)
{
scores_sum += arr1[i][j];
}
cout << arr2[i] << "的语数外总分为: " << scores_sum << endl;
}
system("pause");
return 0;
}
- 输出结果
3. 多维数组
在二维数组的基础上进行推广