跟我从零开始学C++(⭐数组专项⭐)超超详细版plus

引言

  小伙伴们,这又是一个有关数组的专项,上次的有关指针的反响不错,大家对专项题材的文章还是更喜欢一些,因为知识更汇总更全面,同时也更详细,虽然在之前的笔记里写过有关数组的知识,但是为了全面性和专题性,在这里我再次把数组专项给大家总结一遍,很多知识已经重复过了,对此小伙伴们可以持续关注后续有关函数的专项,学完这些之后,大家就可以独立去一些刷题网站去刷题,提高自己的代码灵敏度,还有编程思想。
  好了,还是废话不多说,让我们开始今天的学习吧!!!
  !!!!!!冲冲冲!!!!!!!!

数组与字符串

目录

1.数组的定义和使用
2.初始化数组
3.小练习
4.二维数组的定义和使用
5.二维数组初始化
6.字符数组
7.字符串
8.拷贝字符串
9.拼接字符串
10.转换大小写
11.比较字符串
12.练习题

1.数组的定义和使用

  数组是一种数据结构,可以存储固定数量的元素,这些元素都是相同类型的,这些元素可以是变量,也可以是另一个数组。在C++中,数组通过指定元素类型和数组的大小来定义。例如,int numbers[10]; 定义了一个包含10个整数的数组。我们也可以通过numbers[0],来调取和运用数组内元素

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	//  定义整型数组a,长度为10。定义数组时长度只能是常量。
	//	数组是标识符,必须遵守标识符命名规则。
	int a[10];  //	数组类型指数组元素的类型,可以是任意类型。

	/*
		定义数组时,数组长度不能使用变量
		int m = 10;
		int c1[m];
	*/

	a[0] = 100;	//	数组下标从0开始
	a[1] = 200;
	a[4] = 500;

	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << ", "; // 通过 数组名[下标] 使用数组中的元素
	}
	cout << endl;

	return 0;
}

回到目录

2.初始化数组

  数组也和变量一样,在我们定义后,需要初始化,例如,int numbers[5] = {1, 2, 3, 4, 5}; 定义并初始化了一个包含5个整数的数组。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{

	//	定义五个元素的整型数组并初始化
	int a[5] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < 5; i++)
	{
		cout << a[i] << ", ";
	}
	cout << endl;

	//	定义数组时不给下标值,根据元素的个数决定数组长度。
	int a1[] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < 5; i++)
	{
		cout << a1[i] << ", ";
	}
	cout << endl;

	//	定义5个元素的数组,初始化前三个元素,后面两个元素默认值为0。
	int a2[5] = { 1, 2, 3 };
	for (int i = 0; i < 5; i++)
	{
		cout << a2[i] << ", ";
	}
	cout << endl;

	//	定义5个元素的数组,初始化所有元素为0。
	int a3[5] = { };
	for (int i = 0; i < 5; i++)
	{
		cout << a3[i] << ", ";
	}
	cout << endl;

	return 0;
}

回到目录

3.小练习

  我们知道如何定义和使用数组后,我们一起来做个小练习,计算一下五个同学的平均成绩。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	//	输入5个同学的成绩,计算平均成绩。要求先使用数组存储成绩,再进行计算。
	float a[5], sum = 0;
	for (int i = 0; i < 5; i++)
	{
		cin >> a[i];
	}

	for (int i = 0; i < 5; i++)
	{
		sum += a[i];
	}

	cout << "平均成绩:" << sum / 5 << endl;

	return 0;
}

回到目录

4.二维数组的定义和使用

  二维数组是数组的数组,或者可以看作是表格形式的元素集合。在C++中,二维数组可以通过指定行数和列数来定义。例如,int matrix[3][4]; 定义了一个3行4列的二维整数数组。二维数组可以帮助我们做到一些一维数组做不到事情。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	/*
		定义二维数组a。
		二维数组有有两个下标,第一个称为行下标,第二个称为列下标。
		二维数据在内存中是连续存放的。
	*/
	int a[3][4];

	for (int i = 0; i < 3; i++) // i对应行下标
	{
		for (int j = 0; j < 4; j++) // j对应列下标
		{
			a[i][j] = i * 10 + j;
		}
	}

	for (int i = 0; i < 3; i++) // i对应行下标
	{
		for (int j = 0; j < 4; j++) // j对应列下标
		{
			cout << a[i][j] << '\t';
		}
		cout << endl;
	}


	return 0;
}

回到目录

5.二维数组的初始化

  二维数组在定义后也需要初始化,而且初始化的方式和一维数组不同,它可以有很多种初始化的方式

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	//	分行初始化,每一行初值用大括号括起来,每一个大括号代表1行元素。
	cout << "分行初始化:" << endl;
	int a1[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << a1[i][j] << '\t';
		}
		cout << endl;
	}

	//	顺序初始化,按照二维数组元素在内存中排列的顺序初始化
	cout << "顺序初始化: " << endl;
	int a2[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << a2[i][j] << '\t';
		}
		cout << endl;
	}

	//	分行初始化部分元素
	cout << "分行初始化部分元素:" << endl;
	int a3[3][4] = { {1, 2, 3, 4}, {5, 6}, {9, 10, 11, 12} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << a3[i][j] << '\t';
		}
		cout << endl;
	}

	cout << "顺序初始化部分元素: " << endl;
	int a4[3][4] = { 1, 2, 3, 4, 5, 6,  9, 10, 11, 12 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << a4[i][j] << '\t';
		}
		cout << endl;
	}

	return 0;
}

回到目录

6.字符数组

  字符数组是用于存储字符的数组。在C++中,字符串实际上是字符数组。是存储元素都是字符型的数组,并且,有关字符数有很多的知识点需要我们知道了解。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	int a[5] = {};
	//	定义并初始化字符数组
	char c[10] = { 'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm'};
	
	//	字符数组的整体引用。
	cout << c << endl;
	//	cout 遇到字符型数组名会输出字符型数组的内容,其他类型的数组名会输出地址
	cout << a << endl;

	c[9] = '!';
	//	cout 输出字符数组时,遇到 '\0' 空字符结束,如果数组中没有'\0'则会出现乱码。
	//	'\0' 空字符,也被称为字符串结束标志。
	cout << c << endl;

	//	字符数组的初始化
	//	如果初值的个数小于数组长度,不足的部分会被初始化为空字符'\0'
	char c1[10] = { 'a', 'b' };
	
	//	初值个数不能大于字符数组的长度
	//	char c2[3] = { 'a', 'b', 'c', 'd'};

	//	字符数组可以使用字符串初始化
	//	使用字符串初始化字符数组时,字符串长度必须小于字符数组长度。
	char c2[5] = "abcd";

	//	省略长度初始化时,字符数组的长度=字符串长度+1。最后一位是空字符。
	char c3[] = "abcd";
	cout << "sizeof(c3):" << sizeof(c3) << endl;

	return 0;
}

回到目录

7.字符串

  字符串是C++中用于表示文本的数据类型。由于C++没有专门的字符串类型,所以通常使用字符数组来表示字符串。这里呢有一些需要我们掌握的有关字符串知识点。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	//	字符数组字符串
	char c1[] = "Hello C++";
	cout << "c1: " << c1 << endl;

	//	字符指针的字符串
	char* p = c1;
	cout << "p: " << p << endl;

	//	string类型的字符串
	string s = "Hello !";
	cout << s << endl;

	//	字符数组字符串是一个包含字符串结束标志的字符数组
	char c3[10] = "abc";
	cout << "c3: " << c3 << endl;
	c3[8] = 'x';
	c3[9] = '\0';
	cout << "c3: " << c3 << endl;

	//	strlen计算字符串长度
	cout << "strlen(c3): " << strlen(c3) << endl;

	//	计算字符串长度
	int len = 0;
	while (c3[len] != '\0')
	{
		len++;
	}
	cout << "len: " << len << endl;

	return 0;
}

回到目录

8.拷贝字符串

  字符串拷贝是指将一个字符串的内容复制到另一个字符串中。在C++中,这通常使用strcpy函数来完成。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	char c1[4] = "C++";
	char c2[] = "abcde"; // c2的长度是6
	char c3[10] = "abcde"; // c3的长度是10
	/*
		strcpy_s(目标字符串,缓冲区大小,源字符串)
		缓冲区的大小,大于源字符串的长度,小于等于目标字符串所在数组的长度。
		目标字符串所在数组的长度要大于原字符串的长度。
	*/
	strcpy_s(c2, 4, c1);
	cout << "c2: " << c2 << endl;
	cout << "c2[4]: " << c2[4] << endl;

	strcpy_s(c3, 10, c1);
	cout << "c3: " << c3 << endl;
	
	//	常用形式
	strcpy_s(c3, strlen(c1) + 1, c1);
	cout << "c3: " << c3 << endl;

	return 0;
}

回到目录

9.拼接字符串

   字符串拼接是指将两个或多个字符串连接起来形成一个新字符串。在C++中,这通常使用strcat函数来完成。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	char c1[20] = "C++ ";
	char c2[20] = "program";
	/*
		strcat(目标字符串,缓冲区,源字符串)
		缓冲区 小于等于 目标字符数组的长度,大于 (目标字符串的长度 + 源字符串的长度)。
	*/
	strcat_s(c1, 12, c2);
	cout << "c1: " << c1 << endl;

	strcat_s(c1, strlen(c1) + strlen(c2) + 1, c2);
	cout << "c1: " << c1 << endl;

	return 0;
}

回到目录

10.转换大小写

  字符串的大小写转换是指将字符串中的所有字符从大写转换为小写,或者从小写转换为大写。在C++中,这可以通过遍历字符串并对每个字符应用_strupr_s或_strupr_s函数来实现。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	char c1[] = "Hello C++ 1@#!";
	char c2[] = "Hello C++ 1@#!";

	
	//	转换小写
	_strlwr_s(c1);
	cout << "c1: " << c1 << endl;

	//	转换大写
	_strupr_s(c2);
	cout << "c2: " << c2 << endl;
	
	return 0;
}

回到目录

11.比较字符串

  字符串比较是指比较两个字符串是否相等。在C++中,这通常使用strcmp函数来完成。

  • 代码示例:
#include <iostream>

using namespace std;

int main()
{
	char c1[10] = "abcd";
	char c2[20] = "abcd";
	char c3[15] = "abce";
	/*
		strcmp(字符串1,字符串2)
		字符串1 == 字符串2 返回0
		字符串1 > 字符串2 返回  1
		字符串1 < 字符串2 返回 -1
	*/
	//	字符数组中,字符串结束标志之后的元素不影响比较结果
	c1[6] = 'a';
	c2[6] = 'b';
	int r = strcmp(, c2);
	cout << "r: " << r << endl;

	r = strcp((, c3);
	cout << "r: " << r << endl;

	r = strcp, c1);
	cout << "r: " << r << endl;

	return 0;
}

回到目录

12.练习题

  有关数组的相关知识都已经说到了,我们一起来做一些小练习吧!!!
  1.实现矩阵相加
  2.求矩阵对角线最大值
  3.反转字符串

  • 代码示例:
  • 练习1:
#include <iostream>

using namespace std;

int main()
{
	//	矩阵相加
	int a1[2][3] = { 1, 2, 3, 4, 5, 6 };
	int a2[2][3] = { 7, 8, 9, 10, 11, 12 };
	int a3[2][3];
	//	计算a1,a2的合并存储在a3中
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			a3[i][j] = a1[i][j] + a2[i][j];
		}
	}
	//	输出a3
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << a3[i][j] << '\t';
		}
		cout << endl;
	}

}
  • 练习2:
#include <iostream>

using namespace std;

int main()
{
	//	求4*4矩阵对角线上的最大值
	int a[4][4] = { -12, 13, 14, 15, 16, -1, 2, 3, 4, 5, -6, 7, 8, 9, 10, -11 };

	int max = a[0][0];
	for (int i = 0; i < 4; i++)
	{
		//cout << a[i][i] << ", ";
		if (max < a[i][i])
		{
			max = a[i][i];
		}
	}
	cout << "max: " << max << endl;

	return 0;
}
  • 练习3:
#include <iostream>

using namespace std;

int main()
{
	//	翻转字符串,"abcABC1234"翻转后为"4321CBAcba"
	char c[] = "abcABC1234";
	int len = strlen(c);
	int n = len / 2;
	for (int i = 0; i < n; i++)
	{
		char tmp = c[i];
		c[i] = c[len - 1 - i];
		c[len - 1 - i] = tmp;
	}
	cout << c << endl;

	//	判断是否是回文, 例如,abccba, 1234321
	char c1[] = "abccba";	
	len = strlen(c1);
	n = len / 2;
	bool b = true;
	for (int i = 0; i < n; i++)
	{		
		if (c1[i] != c1[len - 1 - i])
		{
			b = false;
		}		
	}
	if(b)
	{ 
		cout << "是回文" << endl;
	}
	else
	{
		cout << "不是回文" << endl;
	}
	
	return 0;
}

回到目录

结语

  终于又来到了打鸡血环节,小伙伴们这章也是干货满满的一节课,小伙伴们一定要好好研读,加油。

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值