【黑马程序员】C++学习笔记--入门篇(下)

第一阶段  基础语法入门(上)

【黑马程序员】C++学习笔记--入门篇(上)-CSDN博客

第一阶段  基础语法入门(下)

5 数组

5.1 概述

所谓数组,就是一个集合,里面存放了相同类型的数据元素

特点1:数组中的每个数据元素都是相同的数据类型

特点2:数组是由连续的内存位置组成的

5.2 一维数组
5.2.1 一维数组定义方式

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

1. 数据类型  数组名[ 数组长度 ];

2. 数据类型  数组名[ 数组长度 ] = { 值1, 值2 ... };

3. 数据类型  数组名[ ] = { 值1, 值2 ... };

示例

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	//定义方式
	//1. 数据类型 数组名[数组长度]
	int arr[5];
	
	//利用下标赋值
	//数组元素下标从0开始 
	arr[0] = 10;
	arr[1] = 20;
	arr[2] = 30;
	arr[3] = 40;
	arr[4] = 50;
	
	//访问数组元素 
	cout << arr[0] << endl;
	cout << arr[1] << endl;
	cout << arr[2] << endl;
	cout << arr[3] << endl;
	cout << arr[4] << endl;
	
	cout << "-------" << endl;
	
	//2. 数据类型  数组名[ 数组长度 ] = { 值1, 值2 ... };
//	int arr2 = { 50, 40, 30, 20, 10 }; //错误,[Error] scalar object 'arr2' requires one element in initializer
	int arr2[5] = { 50, 40, 30, 20, 10 };
	//如果在初始化时没有全部填写完,会用0来填补 数据 
	int arr21[5] = { 50, 40, 30 }; //正确,空缺值arr2[3]、arr2[4]均用0补齐 
	
	//访问数据元素 利用循环 输出数组中的元素 
	for(int i = 0; i < 5; i++)
	{
		cout << arr2[i] << endl;
	}
	
	cout << "\narr21[5] = { 50, 40, 30 };结果:" << endl;  
	for(int i = 0; i < 5; i++)
	{
		cout << arr2[i] << endl;
	}
	
	cout << "-------" << endl;
	
	//3. 数据类型  数组名[ ] = { 值1, 值2 ... }; 
	//定义数组的时候,必须有初始长度 
	int arr3[ ] = { 70, 80, 90, 100, 110, 130 };
	for(int i = 0; i < 6; i++)
	{
		cout << arr3[i] << endl;
	} 
	 
	return 0;
	
}

常见错误类型:

int arr2 = { 50, 40, 30, 20, 10 };

错误:[Error] scalar object 'arr2' requires one element in initializer

原因:数组名后没加数组长度,加上数组长度即可

修正:int arr2[ 5 ] = { 50, 40, 30, 20, 10 };

总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名


总结2:数组中下标是从0开始索引

5.2.2 一维数组数组名

一维数组名称的用途:

1. 可以统计整个数组在内存中的长度

2. 可以获取数组在内存中的首地址

示例

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	//数组名用途
	//1. 可以统计整个数组在内存中的长度
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	cout << "整个数组占用内存空间为:" << sizeof(arr) << endl; 
	cout << "每个元素占用内存空间为:" << sizeof(arr[0]) << endl; 
	cout << "数组中元素个数长度为:" << sizeof(arr)/sizeof(arr[0]) << endl; 
	
	
	//2. 可以获取数组在内存中的首地址 
	//(int)arr:将16进制地址转换为10进制,但是此处会出现精确度错误问题,故将其改为(long long)arr; 后同 
	cout << "数组在内存中的首地址为:" << (long long)arr << endl;
	cout << "数组中第一个元素地址为:" << (long long)&arr[0] << endl;
	cout << "数组中第二个元素地址为:" << (long long)&arr[1] << endl;
	
	//数组名是一个常量,不可以进行赋值操作 
//	arr = 100; //错误,[Error] incompatible types in assignment of 'int' to 'int [10]' 
	return 0;
	
}

数组名是一个常量,不可以进行赋值操作

案例练习1 -- 五只小猪称体重

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

访问数组中每个元素,如果这个元素比我认定的最大值要大,更新最大值

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	//1. 创建5只小猪体重的数组 
	int arr[5] = { 300, 350, 200, 400, 250};
	//2. 从数组中找到最大值 
	int maxflag = 0; //先认定一个最大值为0 
	
	for(int i = 1; i < 5; i++)
	{
		if(arr[i] > arr[maxflag])
		{
			maxflag = i;
		}
	} 
	
	//3. 打印最大值 
	cout << "最重的小猪体重为:" << arr[maxflag] << endl;
	
	return 0;
	
}

案例练习2 -- 数组元素逆置

请声明一个5个元素的数组,并且将元素逆置

(如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	//1. 创建数组 
	int arr[5] = { 1, 3, 2, 5, 4 };
	
	
	cout << "逆置前的元素为:" << endl;
	for(int i = 0; i < 5; i++)
	{
		cout << arr[i] << "  ";
	}
	
	//2.  实现逆置
	//2.1记录起始下标位置 
	//2.2记录结束下标位置
	//2.3起始下标与结束下标的元素互换
	//2.4起始位置++, 结束位置--
	//2.5循环执行2.1操作,直到起始位置 >= 结束位置 
	int start = 0; //起始下标 
	int end = sizeof(arr)/sizeof(arr[0]) - 1; //结束下标 
	int temp; 
	while(start < end)
	{
		//实现元素互换 
		temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		
		//下标更新 
		start ++;
		end --;
	}
	
	//3. 打印逆置后的数组 
	cout << "\n逆置后的元素为:" << endl;
	for(int i = 0; i < 5; i++)
	{
		cout << arr[i] << "  ";
	}
	
	return 0;
	
}
5.2.3 冒泡排序

作用:最常用的排序算法,对数组内元素进行排序

1. 比较相邻的元素,如果第一个比第二个大,就交换他们两个。

2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。

3. 重复以上的步骤,每次比较次数-1,直到不需要比较

排序的总轮数 = 元素个数 - 1

每轮对比次数 = 元素个数 - 排序轮数 - 1

示例:将数组{ 4,2,8,0,5,7,1,3,9 }进行升序排序

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	int arr[9] = { 4, 2, 8, 0, 5, 7, 1, 3, 9 };
	
	cout << "冒泡排序前的结果为:"  << endl;
	for(int i = 0; i < 9; i++)
	{
		cout << arr[i] << "  ";
	} 
	cout << endl;
		
	//开始冒泡排序 
	//总共排序的轮数为 元素个数 - 1 
	for(int i = 0; i < 9 - 1; i++)
	{
		//内层循环对比
		for(int j = 0; j < 9 - i - 1; j++)
		{
			//如果第一个数字,比第二个数字大,交换两个数字 
			if(arr[j] > arr[ j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[ j + 1];
				arr[ j + 1 ] = temp; 
			}
		} 
	}
	
	cout << "\n冒泡排序后的结果为:"  << endl;
	for(int i = 0; i < 9; i++)
	{
		cout << arr[i] << "  ";
	} 
	
	return 0;
	
}

个人排序思路:

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	int arr[9] = { 4, 2, 8, 0, 5, 7, 1, 3, 9 };
	int end = sizeof(arr)/sizeof(arr[0]) - 1;
	
	cout << "排序前的结果为:"  << endl;
	for(int i = 0; i < end + 1; i++)
	{
		cout << arr[i] << "  ";
	} 
		
	//flag判断是否进行换位操作,
    //如果在本次遍历数组中,没有进行循环操作,则代表排序结束,跳出while 
	int flag = 1;
	while(flag)
	{
		flag = 0;
		int temp = arr[0];
		for(int l = 0; l < end; l++)
		{
			if(arr[l] < arr[ l + 1])
			{
				temp = arr[l];
				arr[l] = arr[ l + 1];
				arr[ l + 1 ] = temp; 
				flag = 1;
			}
		}
	}
	
	cout << "\n排序后的结果为:"  << endl;
	for(int i = 0; i < end + 1; i++)
	{
		cout << arr[i] << "  ";
	} 
	
	return 0;
	
}

5.3 二维数组
5.3.1 二维数组定义方式

二维数组定义的四种方式:

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

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

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

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

建议:以上4中定义方式,利用第二种更加直观,提高代码的可读性。

示例

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	//二维数组定义方式
	/* 
		1. 数据类型 数组名[ 行数 ][ 列数 ];
		
		2. 数据类型 数组名[ 行数 ][ 列数 ] = { { 数据1, 数据2 }, {数据3, 数据4} };
		
		3. 数据类型 数组名[ 行数 ][ 列数 ]= { 数据1, 数据2, 数据3, 数据4 };
		
		4. 数据类型 数组名[ ][ 列数 ]= { 数据1, 数据2, 数据3, 数据4};
	*/	
	
	//1. 数据类型 数组名[ 行数 ][ 列数 ];
	int arr[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;
	//外层循环打印行数,内层循环打印列数 
	for(int i = 0; i < 2; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			cout << arr[i][j] << endl;
		}
	}
	
	cout << "第二种定义方式" << 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;
	}
	
	cout << "第三种定义方式" << endl;
	//3. 数据类型 数组名[ 行数 ][ 列数 ]= { 数据1, 数据2, 数据3, 数据4 };
	int arr3[2][3] = { 1,2,3,4,5,6 };
	for(int i = 0; i < 2; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			cout << arr3[i][j] << "  ";
		}
		cout << endl;
	}
	
	cout << "第四种定义方式" << endl;
	//4. 数据类型 数组名[ ][ 列数 ]= { 数据1, 数据2, 数据3, 数据4};
	int arr4[][3] = { 1,2,3,4,5,6 };
	for(int i = 0; i < 2; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			cout << arr4[i][j] << "  ";
		}
		cout << endl;
	}
	return 0;
	
}

5.3.2 二维数组数组名
  • 查看二维数组所占内存空间
  • 获取二维数组首地址

示例

#include <iostream>
using namespace std;
#include <cstdlib>
//time系统时间头文件包含 
#include <ctime> 

int main()
{
	int arr[2][3] = 
	{
		{1,2,3},
		{4,5,6}
	};
	
	//1.可以查看占用内存空间大小
	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 << "二维数组首地址:" << (long long)arr << endl; 
	cout << "二维数组第一行首地址:" << (long long)&arr[0] << endl; 
	cout << "二维数组第二行首地址:" << (long long)&arr[1] << endl; 
	cout << "二维数组第一个元素首地址:" << (long long)&arr[0][0] << endl; 
	
	return 0;
	
}
5.3.3 二维数组应用案例

考试成绩统计:

案例描述:有三名同学(张三、李四、王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩

#include <iostream>
using n
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山楂橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值