Visual Studio2017C++学习笔记(五)-数组

前言

软件为visual studio2017,内容为C++学习笔记,以及相关的问题处理方法,目的是方便回顾和复习。
笔记来自于:黑马程序员C++教程。


一、概述

所谓数组,就是一个集合,里面存放了相同类型数据元素
特点1:数组中的每个数组元素都是相同的类型
特点2:数组是由连续的内存位置组成的

二、一维数组

1.一维数组的定义方式

一维数组定义的三种方式:

(1)数据类型 数组名 [数组长度];//告知内存大小

(2)数据类型 数组名[数组长度] = {值1,值2,...};//直接赋值

(3)数据类型 数组名[] = {值1,值2...};//内存大小可由赋值个数进行推断

/*
	数组的3种定义形式:
		1、数据类型 数组名[数组长度];
		2、数据类型 数组名[数组长度] = {值1,值2,值3,...}
		3、数据类型 数组名[]={值1,值2,...}
	*/

	//1、数据类型 数组名[数组长度]
	int arr[5];
	//给数组中共的元素进行赋值
	arr[0] = 10;
	arr[1] = 15;
	arr[2] = 16;
	arr[3] = 13;
	arr[4] = 12;
	
	//访问素组元素
	cout << arr[3] << endl;
	
	//2、数据类型 数组名[数组长度] = {值1,值2,值3,...}
	//如果在初始化数据时候,没有全部填写完,会用0来填补剩余数据
	int arr2[5] = { 10,20,30,40,50 };
	cout << arr2[0] << endl;
	cout << arr2[1] << endl;
	cout << arr2[2] << endl;
	cout << arr2[3] << endl;
	cout << arr2[4] << endl;
	cout << "利用for循环来循环语句,如下所示:" << endl;
	//使用for循环来循环下标
	for (int i=0; i < 5; i++) {
		cout << arr2[i] << endl;
	}
	
	//3、数据类型 数组名[] = {值1,值2,值3...}
	//定义数组的时候,必须有初始长度。
	int arr3[] = { 90,80,70,60,50,40,30,20,10};
	for (int i = 0; i < 9; i++) {
		cout <<arr3[i] <<endl;
	}

2.注意

(1)数组的命名规范与变量名命名规范一致,不要和变量名重名。

(2)数组中的下标是从0开始索引。

3.一维数组数组名

(1)一维数组名称的用途

  • 可以统计整个数组在内存中的长度
  • 可以获取数组在内存中的首地址
    示例:
//一维数组的数组名
	//1、可以用来统计数组所占的内存空间
	
	int arr5[] = { 1,2,3,4,5 };
	cout << "数组所占的内存空间大小为:" <<sizeof(arr5)<< endl;
	cout << "数组中的首元素所占的内存空间为:" << sizeof(arr5[0]) << endl;
	cout <<"数组中的元素个数为:"<<sizeof(arr5)/sizeof(arr5[0])<<endl;
	
	//2、可以获取数组在内存空间中的首地址,数组名直接代表首地址
	cout << "数组的首地址为:" << (int)arr5 << endl;//一般返回的地址为十六进制,加上(int)获取的为十进制数
	cout << "数组中的第1个元素地址为:" << (int)&arr5[0] << endl;
	cout << "数组中的第2个元素地址为:" << (int)&arr5[1] << endl;

Visual Studio2017C++学习笔记(五)-数组_第1张图片

(2)注意

  • 数组名是一个常量,因此不可以赋值。arr = 100;//错误

4.一维数组练习案例:5只小猪称体重和数组元素逆置

(1)案例描述

  • 在一个数组中记录了五只小猪的体重,如:int arr[5] = {300,350,200,400,250};找出并打印最重的小猪体重。

(2)小猪称重解决方案

//五只小猪称重
	int arr6[5] = {300,350,200,400,500};
	int zhuzhu_max = 0;//先认定一个最大值为0
	for (int i = 0; i < 4; i++) {
		//相邻元素比较法,比较麻烦
		/*if (arr6[i] <= arr6[i+1]) {
			zhuzhu_max = arr6[i + 1];
		}
		else if (arr6[i] >= arr6[i + 1]) {
			zhuzhu_max = arr6[i];
		}*/

		//使用zhuzhu_max = 0;一个元素不断比较即可。
		//访问数组中的每个元素,如果这个元素比我认定的最大值要大,更新最大值
		if (arr6[i] > zhuzhu_max) {
			zhuzhu_max = arr6[i];//更新最大值
		}
	}
	cout << zhuzhu_max << endl;

(3)数组元素逆置

//数组元素逆置 
	//法1:创建新数组,实现数组元素逆置
	int arr7[5] = { 1,2,3,4,5 };
	int len = sizeof(arr7)/sizeof(arr7[0]);
	cout << "数组长度为:"<< len << endl;
	int res[5] = {};
	for (int i=0; i<5; i++) {
		res[i] = arr7[4 - i];
		cout << res[i] << endl;
	}
	
	//法2:不创建新数组,而是在原有的数组基础上进行排序
	int arr[5] = { 1,3,2,5,4 };
	cout << "数组逆置前:" << endl;
	for (int i = 0; i < 5; i++) {
		cout << arr[i]<<endl;
	}
	//2、实现逆置(开头结尾开始处的双指针)
	//2.1记录起始下标位置
	//2.2记录结束下标位置
	//2.3起始下标语与结束下标的元素互换
	//2.4起始位置++ 结束位置-
	//2.5循环执行2.1操作,直到起始位置>=结束位置
	int start = 0;
	int end = sizeof(arr) / sizeof(arr[0])-1;//结束时的下标为,长度减1
	int temp = 0;
	while(start<end) {
		//实现元素互换
		temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;

		//下标更新
		start++;
		end--;
	}
	cout << "数组逆置后:" << endl;
	for (int i = 0; i < 5; i++) {
		cout << arr[i] << endl;
	}

5.一维数组练习:冒泡排序

(1)作用

  • 作用:最常用的排序算法,对数组内元素进行排序
  • 原理:
  • 1、2个数比较大小,直接比较即可
  • 2、3个数比较大小找出最大值或最小值,比较完前两个再和第三个数进行比较即可。
  • 3、4个数比较大小找出最大或最小值,比较完前3个再和第4个数进行比较即可。
  • 4、同理,多个数排序,即可以找出前n个数中最大或最小值,然后找出前n-1个数中的最大或最小值,以此类推即可。
  • 做法:
  • n个元素相邻元素进行比较,得到最大值或者最大小值
  • n-1个元素的相邻元素进行比较,入农户得到最大或者最小值。

(2) 代码

//4、进行数组排序
	int arr[] = { 3,5,2,1,4,6 };
	//方式1:
	for (int i = 5; i >=0; i--) {//找出前n个树中的最值,通过两两比较得到的
		for (int j = 0; j < i; j++) {
			if (arr[j] > arr[j + 1]) {
				//对元素进行交换
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j + 1] = temp;
			}
		}
	}

	//方式2:
	for (int i = 0; i < 6 - 1; i++) {//总排序个数为 元素个数-1
		//内层循环对比 次数 = 元素个数-当前轮数 -1
		for (int j = 0; j < 6 - i - 1; j++) {
			//如果第一个数字,比第二个数字大,交换两个数字
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	cout << "升序后的元素序列为:" << endl;
	for (int k = 0; k < 6; k++) {
		cout << arr[k] << endl;
	}
	

三、二维数组

1.定义

  • 二维数组就是在一维数组的基础上,多加一个维度

2.二维数组的定义方式

(1) 数据类型 数组名[ 行数 ][ 列数 ];

(2)数据类型 数组名[ 行数 ][ 列数 ] = {{数据1,数据2},{数据3,数据4}};

(3)数据类型 数组名[ 行数 ][ 列数 ] = {数据1,数据2,数据3,数据4};

(4)数据类型 数组名[ 行数 ][ 列数 ] = {数据1,数据2,数据3,数据4}

3.示例

(1)数据类型 数组名[行数][列数]

//1、数据类型 数组名[行数][列数];
	int arr[2][3];//定义一个2行3列的二维数组
	arr[0][0] = 1;
	arr[0][1] = 2;
	arr[0][2] = 3;
	arr[1][0] = 4;
	arr[1][1] = 5;
	arr[1][2] = 6;

	/*cout << arr[0][0] << endl;
	cout << arr[0][1] << endl;
	cout << arr[0][2] << endl;
	cout << arr[1][0] << endl;
	cout << arr[1][1] << endl;
	cout << arr[1][2] << endl;*/
	for (int i = 0; i < 2; i++) {//按行打印
		for (int j = 0; j < 3; j++) {
			cout << arr[i][j] << endl;
		}
	}

(2)数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}}

示例:

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;//换行
	}

(3)数据类型 数组名[行数][列数] = {数据1,数据2,数据3,数据4}

  • 示例:
int arr3[2][3] = { 7,8,9,10,11,12 };// 根据元素个数进行处理为2行3列
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			cout << arr3[i][j] <<" ";
		}
		cout << endl;
	}

(4)数据类型 数组名[][列数] = {数据1,数据2,数据3,数据4}

  • 示例
//4、数据类型 数组名[][列数] = {数据1,数据2,数据3,数据4};
	int arr4[][3] = { 1,2,3,4,5,6 };//[][3]行数虽然空着,但是可以通过数据进行仅计算数组的行数
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			cout << arr4[i][j] << endl;
		}
	}

小结

  • 在定义二维数组时,如果初始化了数据,可以省略行数
  • 建议第二种方式更加直观,可提高代码的可读性

4.二维数组的数组名

(1)查看二维数组所占的内存空间

(2) 获取二维数组首地址

(3) 示例

//1、可以查看占用内存空间大小
	int arr[2][3] = {
		{1,2,3},
		{4,5,6}
	};
	cout << "二维数组空间的大小为:"<<sizeof(arr)<<endl;
	cout << "二维数组第一行占用内存为:" << sizeof(arr[0]) << endl;
	cout << "二维数组第一行元素占用内存为"<<sizeof(arr[0][0]) << endl;

	cout<<"二维数组行数为"<<sizeof(arr)/sizeof(arr[0])<<endl;
	cout << "二维数组列数为" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
	//2、可以查看二维数组的首地址
	cout << "二维数组的首地址:" << (int)arr<<endl;
	cout << "二维数组第1行数据的首地址:" << (int)arr[0] << endl;
	cout << "二维数组第一个元素的首地址:" << (int)&arr[0][0]<< endl;
	cout << "二维数组第2行数据的首地址:" << (int)arr[1] << endl;
	cout<<"二维数组第2个元素的地址"<<(int)&arr[0][1] << endl;//&为取址符

Visual Studio2017C++学习笔记(五)-数组_第2张图片

5.二维数组的应用案例

(1)案例描述

  • 考试成绩统计:
    案例描述:有三名同学(张三、李四、王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
语文 数学 英语
张三 100 100 100
李四 90 50 100
王五 60 70 80

(2)代码

//二位数组案例-考试成绩统计
	//1、创建二维数组
	int scores[3][3]={
		{100,100,100},
		{90,50,100},
		{60,70,80}
	};
	//2、统计每个人的总和分数
	string name[3] = { "张三","李四","王五" };
	//前面设置include 
	for (int i = 0; i < 3; i++) {
		int sum = 0;//统计分数综合变量
		for (int j = 0; j<3; j++) {
			sum += scores[i][j];
		};
		cout << name[i] << "的总分为:" << sum << endl;
	};

总结

对一维数组和二维数组的定义方式进行了介绍,并通过案例对数组的使用进行了介绍。

你可能感兴趣的:(c++,visual,studio,学习)