从变量到数组
在没有学习数组时,我们如果希望存储三个圆的半径,我们可能会声明 radius1, radius2, radius3 这三个整数型变量。
在 C++ 语言中,radius 数组就是用来简化这种场景的 int radius[3];
我们可以通过 radius[0]
, radius[1]
, radius[2]
这样的方式对其中的元素进行使用。
int radius[3];
cin >> radius[0] >> radius[1] >> radius[2];
cout << radius[0] << radius[1] << radius[2] << endl;
一维数组
int radius[3];
这样的方式声明一个数组,数组名为radius
,数组中包含 33 个 int
类型的元素。我们可以通过 radius[0]
,radius[1]
,radius[2]
这样的方式对其中的元素进行使用。
请注意,在声明数组时,我们在方括号内写的数字表示了数组中的元素数,也可以称为 数组长度(array length),而我们在访问数组元素时方括号内写的数字则表示了数组中的元素编号,也可以称为 数组元素索引(index of array element)。
数组声明:数据类型+数组名[数组长度]
注意:数组在声明的时候只能使用(1.常量 2.常变量 3.被预处理后的变量)
数组的第一个元素的索引是 0 而不是 1,相应的,一个长度为 n 的数组,它的最后一个元素的索引是 n−1。
int a[3];
long long b[4];
double c[5];
char d[6];
数组的初始化
如果想要将一个数组全部清零,可以使用如下办法:
#include<iostream>
using namespace std;
int main(){
int a[5]={0};
return 0;
}
数组的使用
对于一个长度为 �n 的数组,可以使用的下标应该是 [0]∼[�−1][0]∼[n−1]。
#include<iostream>
using namespace std;
int main(){
int a[3]={0};
// 可以使用的: a[0], a[1], a[2]
// 注意这个数组中并不存在 a[3]
return 0;
}
例题:数组逆序重放
将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。
输入格式:
输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两个整数之间用空格分隔。
输出格式:
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[101]={0},n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=n-1;i>=0;i--) cout<<a[i]<<" ";
return 0;
}
字符数组
字符串
我们先来介绍一个新的概念,叫作 字符串
。我们称一个由字符构成的连续的串为 字符串
。
这里请注意区分字符 'a'
和字符串 "a"
。
字符是单引号,字符串是双引号。字符是指单个字符,字符串是由任意数量的字符组成,比如 "abc"
、"a oA"
。
如果我们将一个字符串拆开
"hello"
'h', 'e', 'l', 'l', 'o', '\0'
这里一定要注意,所有字符串末尾,都会由系统自动添加一个 '\0'
作为结尾, 也就是说一个长度为 5 的字符串,实际需要占用 6 个单元。
字符串的初始化:char a[6]={"hello"};
字符数组
我们已经学习过一维数组了,但是我们使用的最多的都是 int
类型的数组,而今天我们要来学习一种特殊的数组 —— 字符数组。
首先,定义一个字符数组和定义一个整数数组是一样的,字符数组需要用char类型
例如:char a[10]
字符串的输入
1.cin>>数组名;
2.scanf("%s",数组名);
3.gets(数组名);
4.cin.getline(数组名,数组长度);
前两个输入遇到空格或回车时结束输入
输入过程中不能将空格当成字符存入数组中
字符串的输出
1.cout<<数组名;
2.puts(数组名);
任意一种方法都能将空格输出
字符数组的长度
我们可以使用别人库函数 strlen(数组名)
完成上面的计算,需使用头文件#include <cstring>
字典序
在 C 语言中,我们通常遵循的是一种特殊的定义——字典序(lexicographical order)。
通过这种方法,我们可以给本来不相关的单词强行规定出一个顺序。“单词”可以看作是“字母”的字符串,而把这一点推而广之就可以认为是给对应位置元素所属集合分别相同的各个有序多元组规定顺序。例如数组的字典序比大小:
数组 {1, 2, 3} < 数组 {2, 3, 4}
注意:
1.&a[0]表示第一个元素的地址
2.字符串存入字符数组中不能通过=赋值
3.也不能通过>,<,>=,<=,!=,==作比较
主要字符串函数
1.复制函数:strcpy(字符数组,字符串)
作用:将字符串拷贝一份给字符数组
升级版:strncpy(字符数组,字符串,数值如n)
作用:将字符串前n个字母拷贝一份给字符数组
2.比较函数:strcmp(字符串1,字符串2)
作用:将两个字符串进行大小比较
使用:if(strcmp(字符串1,字符串2>0)){ } 表示字符串1大于字符串2
升级版1:strncmp(字符串1,字符串2,数值如n)
作用:将两个字符串前n个字符进行大小比较
升级版2:strnicmp(字符串1,字符串2,数值如n)
作用:将两个字符串前n个字符不区分大小写进行大小比较
3.拼接方法:strcat(字符数组,字符串)
strlwr(字符串名)将字符串大写字母换成小写字母
strupr(字符串名)将字符串小写字母换成大写字母
strstr(字符串1,字符串2) 在字符串1中查找字符串2的第一次出现
二维数组
二维数组是一维数组的扩展,又称为矩阵,行列数相等的矩阵称为方阵。
声明:与一维数组相似
数组声明:数据类型+数组名[数组长度][数组长度]
例如:int a[101][101]={0};
二维数组a[i][j]中,i表示行,j表示列,因此输入时需要用2层循环
a[2][2]={1,2,3,4}可表示为:
1 2
3 4
二维数组的遍历
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,a[101][101]={};//声明
cin>>n>>m;
for(int i=1;i<=n;i++){//行
for(int j=1;j<=m;j++){//列
cin>>a[i][j];//输入
}
}
for(int i=1;i<=n;i++){//行
for(int j=1;j<=m;j++){//列
cout<<a[i][j]<<" ";//输出
}cout<<endl;
}
return 0;
}