c++基础入门day5
工具:vs2026
课程:【黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难】
5 数组
- 数组,是一个存放了相同类型数据元素的集合
- 数组中的每个数据元素都是相同的数据类型
- 数组是由连续的内存位置组成的
5.1 一维数组
5.1.1 一维数组的定义方式
- 数据类型 数组名[ 数组长度 ];
**数组元素的下标是从0开始索引的。 - 数据类型 数组名[ 数组长度 ] = {值1, 值2, …};
**如果在初始化数据时没有全部填写,会用0来填补剩余数据。 - 数据类型 数组名[ ] = {值1, 值2, …};
**总结而言,数组的定义必须明确数组的长度(第三种方法也属于明确了数组的长度)。
5.1.2 一维数组数组名的作用
- 可以用于统计整个数组在内存中的长度
(1)**sizeof(arr)
(2)获取数组中某个元素在内存中占的空间:sizeof(arr[下标])
(3)统计数组中元素个数:sizeof(arr)/sizeof(arr[0]) - 可以获取数组在内存中的首地址
(1)cout << arr << endl;
(2)访问某个元素的地址时需要用到取址符& - 注意:数组名是一个常量,不可以进行赋值操作。
- 程序示例:
#include<iostream>usingnamespacestd;intmain(){// 数组// 统计整个数组在内存中的长度intarr[]={0,1,2,3,4,5,6,7,8,9};cout<<"整个数组占用的内存空间为:"<<sizeof(arr)<<endl;cout<<"每个元素占用的内存空间为:"<<sizeof(arr[0])<<endl;cout<<"数组中元素个数为:"<<sizeof(arr)/sizeof(arr[0])<<endl;// 获取数组在内存中的首地址cout<<"数组的首地址为:"<<(int)arr<<endl;//(int)将十六进制地址转为十进制地址cout<<"数组中第一个元素地址为:"<<(int)&arr[0]<<endl;//& 取址符号// 数组的首地址即数组第一个元素的地址cout<<"数组中第二个元素地址为:"<<(int)&arr[1]<<endl;//相差单个元素占用的内存空间system("pause");return0;}5.1.3 练习案例
- 练习案例1:五只小猪称体重
在一个数组中记录了五只小猪的体重,如int arr[5]={300,350,200,400,250};
找出并打印最重的小猪体重
#include<iostream>usingnamespacestd;intmain(){// 练习案例1:五只小猪称体重// 在一个数组中记录五只小猪的体重intarr[5]={300,350,200,400,250};intmax=0;// 找出并打印最重的小猪体重for(inti=0;i<5;i++){if(arr[i]>max){max=arr[i];}}cout<<"最重的小猪体重为:"<<max<<endl;system("pause");return0;}- 练习案例2:数组元素逆置
请声明一个5个元素的数组,并且将元素逆置。(如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1)
#include<iostream>usingnamespacestd;intmain(){// 练习案例2:数组元素逆置// 声明一个5个元素的数组intarr[]={1,3,2,5,4};cout<<"原数组元素为:"<<endl;;for(inti=0;i<sizeof(arr)/sizeof(arr[0]);i++){cout<<arr[i]<<" ";}cout<<endl;intstart=0;// 起始元素下标intend=sizeof(arr)/sizeof(arr[0])-1;// 末尾元素下标inttemp=0;// 临时存放元素// 将元素逆置while(start<end){temp=arr[start];arr[start]=arr[end];arr[end]=temp;start++;end--;}cout<<"逆置后数组元素为:"<<endl;;for(intk=0;k<sizeof(arr)/sizeof(arr[0]);k++){cout<<arr[k]<<" ";}cout<<endl;system("pause");return0;}5.1.4 冒泡排序
- 冒泡排序最常用的排序算法,用于对数组内的元素进行排序
- 步骤:
(1) 比较相邻的元素,如果第一个元素比第二个大,交换;
(2) 对每一对相邻元素做相同的工作,执行完毕后,找到第一个最大值;
(3) 重复上述步骤,每次比较次数-1,直到不需要比较 - 排序总轮数 = 元素个数 - 1;
- 每轮对比次数 = 元素个数 - 排序轮数 - 1;
- n个元素需要进行n(n-1)/2次
- 程序示例:
#include<iostream>usingnamespacestd;intmain(){// 冒泡排序intarr[9]={4,2,8,0,5,7,1,3,9};cout<<"排序前:"<<endl;for(inti=0;i<9;i++){cout<<arr[i]<<" ";}cout<<endl;// 排序总轮数 = 元素个数 - 1;for(intj=0;j<9-1;j++){// 内层循环对比// 每轮对比次数 = 元素个数 - 排序轮数 - 1;for(intk=0;k<9-j-1;k++){if(arr[k]>arr[k+1]){inttemp=arr[k];arr[k]=arr[k+1];arr[k+1]=temp;}}}cout<<"排序后:"<<endl;for(inti=0;i<9;i++){cout<<arr[i]<<" ";}cout<<endl;system("pause");return0;}5.2 二维数组
5.2.1 二维数组定义方式
- 数据类型 数组名[ 行数 ][ 列数 ];
- 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1, 数据2 …} , {数据3, 数据4 …} …};
- 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1, 数据2, 数据3, 数据4…};
- 数据类型 数组名[ ][ 列数 ] = { 数据1, 数据2, 数据3, 数据4…};
- 程序示例:
#include<iostream>usingnamespacestd;intmain(){// 二维数组intarr[2][3]={{1,2,3},{4,5,6}};for(inti=0;i<2;i++){for(intj=0;j<3;j++){cout<<arr[i][j]<<" ";}cout<<endl;}system("pause");return0;}5.2.2 二维数组数组名用途
- 查看二维数组所占内存空间
(1)**sizeof(arr)
(2)计算列数:sizeof(arr)/sizeof(arr[0])
(3)计算元素个数:sizeof(arr)/sizeof(arr[0][0]) - 获取二维数组首地址
(1)cout << arr << endl;
(2)访问某个元素的地址时需要用到取址符& - 程序示例:
#include<iostream>usingnamespacestd;intmain(){// 二维数组数组名doublearr[2][3]={{1,2,3},{4,5,6}};for(inti=0;i<2;i++){for(intj=0;j<3;j++){cout<<arr[i][j]<<" ";}cout<<endl;}// 1. 查看二维数组所占内存空间cout<<"二维数组占用内存空间大小为:"<<sizeof(arr)<<endl;cout<<"二维数组第一行占用内存空间大小为:"<<sizeof(arr[0])<<endl;//计算列数sizeof(arr)/sizeof(arr[0])cout<<"二维数组第一个元素占用内存空间大小为:"<<sizeof(arr[0][0])<<endl;//计算元素个数sizeof(arr)/sizeof(arr[0][0])// 2. 获取二维数组首地址cout<<"二维数组首地址为:"<<(int)arr<<endl;cout<<"二维数组第一行地址为:"<<(int)arr[0]<<endl;cout<<"二维数组第一行第一个元素地址为:"<<(int)&arr[0][0]<<endl;//访问某个元素的地址时需要用到取址符&cout<<"二维数组第二行地址为:"<<(int)arr[1]<<endl;system("pause");return0;}- 练习案例:考试成绩统计
案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
| 姓名 | 语文 | 数学 | 英语 |
|---|---|---|---|
| 张三 | 100 | 100 | 100 |
| 李四 | 90 | 50 | 100 |
| 王五 | 60 | 70 | 80 |
#include<iostream>#include<string>usingnamespacestd;intmain(){// 二维数组练习案例:考试成绩统计// 1. 创建二维数组intscores[3][3]={{100,100,100},{90,50,100},{60,70,80}};string names[3]={"张三","李四","王五"};// 2. 统计每个人的总和分数for(inti=0;i<3;i++){intsum=0;for(intj=0;j<3;j++){sum+=scores[i][j];}cout<<names[i]<<"的总成绩为:"<<sum<<endl;}system("pause");return0;}