引言
小伙伴们,这又是一个有关数组的专项,上次的有关指针的反响不错,大家对专项题材的文章还是更喜欢一些,因为知识更汇总更全面,同时也更详细,虽然在之前的笔记里写过有关数组的知识,但是为了全面性和专题性,在这里我再次把数组专项给大家总结一遍,很多知识已经重复过了,对此小伙伴们可以持续关注后续有关函数的专项,学完这些之后,大家就可以独立去一些刷题网站去刷题,提高自己的代码灵敏度,还有编程思想。
好了,还是废话不多说,让我们开始今天的学习吧!!!
!!!!!!冲冲冲!!!!!!!!
数组与字符串
目录
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;
}
结语
终于又来到了打鸡血环节,小伙伴们这章也是干货满满的一节课,小伙伴们一定要好好研读,加油。