一、C++的一维数组
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
保存在数组中的值被称为数组元素,数组中存放元素的个数即为数组长度,数组中的元素需要通过索引(即下标)来访问。
1、声明数组
在 C++ 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
数组类型 数组名(数组长度)
以上声明语法用来声明一个一维数组(可以将一个一维数组理解为Excel表格中的一行数据)。数组长度必须是一个大于零的整数常量,但其实还可以将数组初始长度声明为0,即表示数组为空,但并没有实际意义,所以不建议这么做(数组长度不能为负数)。数据类型可以是任意有效的 C++ 数据类型。数组名的命名规则同变量的命名规则一样。例如,要声明一个类型为 int的包含 10 个元素的数组 number,声明语句如下:
int number[10];
2、初始化数组
初始化数组,即给数组元素赋值。在 C++ 中,可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
//声明数组时初始化
int a[5]={1,2,3,4,5};
int b[]={1,2,3,4,5};
//先声明数组,再初始化数组
int n[5];
//通过下标访问数组元素
n[0]=0;
n[1]=1;
n[2]=2;
n[3]=3;
n[4]=4;
在初始化时,大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
数组索引(下标)的规律:数组的下标从0开始,依次递增,最大值为数组长度-1。
3、数组练习题
(1)从键盘输入n个数保存到数组中,使用循环输出数组所有元素,以空格分隔。
实现代码:
#include<iostream>
using namespace std;
int main()
{
//定义变量n表示数组长度
int n;
//输入n的值
cout<<"请输入需要保存元素的数量:";
cin>>n;
//定义数组,长度为n
int arr[n];
//初始化数组
for(int i=0;i<n;i++){
cout<<"请输入第"<<i+1<<"个数:";
cin>>arr[i];
cout<<endl;
}
//打印输出所有元素
cout<<"数组中的元素为:";
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
}
(2)从键盘输入n个整数,计算这些数的和,并输出输入的这些数中的最大值。
解题思路:将输入的数字保存到一个一维数组中,计算数组所有元素的和并求最大值即可。
#include<iostream>
using namespace std;
int main()
{
//定义变量n表示整数的个数
int n;
//定义变量sum保存整数的和,初值为0
int sum=0;
//输入n的值
cout<<"请输入整数的个数:";
cin>>n;
//定义数组,长度为n,保存输入的数字
int arr[n];
//输入整数,保存到数组中
for(int i=0;i<n;i++){
cout<<"请输入第"<<i+1<<"个数:";
cin>>arr[i];
cout<<endl;
}
//定义变量max表示最大值,初值为arr[0]
int max=arr[0];
//遍历数组,计算总和并寻找最大值
for(int i=0;i<n;i++){
//将数组元素一次相加,即为求和
sum += arr[i];
//寻找最大值:以max表示最大值,如果数组元素比max大,则表示这个元素时最大值,
//将元素值赋值给max,当循环结束,max中保存的一定是最大值。
if(arr[i]>max){
max=arr[i];
}
}
//打印输出结果
cout<<"你输入的整数总和为:"<<sum<<",最大值为:"<<max;
}
(3)打印斐波拉契数列的前n项:从键盘输入一个整数n,将斐波拉契数列的前n项保存到数组中,并输出数组中的所有元素。
提示:斐波拉契数列为1 1 2 3 5 8 13 21 34 55 89…
实现代码:
#include<iostream>
using namespace std;
int main()
{
//定义变量n
int n;
//输入n的值
cout<<"请输入n:";
cin>>n;
//定义数组,长度为n
//防止数据溢出,使用long long类型的数组
long long arr[n];
//计算斐波拉契数列前n项,保存到数组中
//斐波拉契数列第一项和第二项都为1,从第三项开始,每项的值=前两项之和
//先保存第一项、第二项
arr[0]=1;
arr[1]=1;
//使用循环计算第三项之后的值
for(int i=2;i<n;i++){
//下标i表示当前项,i-1表示前第一项,i-2表示前第两项
arr[i]=arr[i-1]+arr[i-2];
}
cout<<"斐波拉契数列的前"<<n<<"项为:";
//遍历数组,输出所有元素
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
}
二、C++中的二维数组
二维数组相当于一个Excel表,由行和列组成,其中的每一行就是一个一维数组。所以,可以将二维数组看作是多个一维数组的集合。例如:
列1 列2 列3 列4 列5 列6
行1 a[0] a[1] a[2] a[3] a[4] a[5]
行2 b[0] b[1] b[2] b[3] b[4] b[5]
行2 c[0] c[1] c[2] c[3] c[4] c[5]
行3 d[0] d[1] d[2] d[3] d[4] d[5]
行4 e[0] e[1] e[2] e[3] e[4] e[5]
以上便是一个二维数组,这个二维数组有5行(5个一维数组)6列(每个一维数组的长度都为6)
根据上述内容,如果要代表c[3]这个元素,则可以表示为:(行3,列4),和数学中的坐标类似,需要通过行和列一起来表示它。例如,表示数组n的第三行第四列的元素,则应该写为:
n[2][3]
注意:不论是几维数组,元素的下标都是从0开始的。
1、声明数组
二维数组的声明方式为:
数据类型 数组名[行数][列数];
例如:
//声明一个3行4列的整型数组
int num[3][4];
//声明一个5行5列的字符数组
char ch[5][5];
2、初始化二维数组
二维数组的初始化和一维数组相似,例如:
int n[2][3]={
{1,2,3},
{4,5,6}
}
或者:
int n[][2]={
{1,2},
{3,4},
{5,6}
}
或者:
int n[2][2]={1,2,3,4}
或者:
int n[][2]={1,2,3,4,5,6}
注意:二维数组初始化时,行数可以不用写,但是列数必须要写。
从键盘输入二维数组的值:
#include<iostream>
using namespace std;
int main()
{
//声明二维数组
int num[2][3];
//初始化二维数组需要使用双层循环,外层用于控制行数,内层用于控制列数
for(int i=0;i<2;i++){//二维数组的行
for(int j=0;j<3;j++){//二维数组的列
//数组的元素使用[行号][列号]表示
cin>>num[i][j];
}
}
//输出数组元素时,同样使用双层循环
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
cout<<num[i][j]<<" ";
}
}
}
3、练习题
(1)定义一个4行4列的二维数组并赋值,交换第一行和第四行的数据,并输出。
#include<iostream>
using namespace std;
int main()
{
//定义一个4行4列的数组,交换第一行和第四行的值
int num[4][4];
//定义一维数组,用于交换值
int temp[4];
int n=1;
//初始化二维数组,赋值为1-16
for(int i=0;i<4;i++){//二维数组的行
for(int j=0;j<4;j++){//二维数组的列
//数组的元素
num[i][j]=n++;
}
}
//输出数组元素时,同样使用双层循环
cout<<"交换前:\n";
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
cout<<num[i][j]<<"\t";
}
cout<<endl;
}
//交换
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(i==0){
temp[j]=num[0][j];
num[0][j]=num[3][j];
num[3][j]=temp[j];
}
// if(i==3){
// num[3][j]=temp[j];
// }
}
}
//输出数组元素时,同样使用双层循环
cout<<"交换后:\n";
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
cout<<num[i][j]<<"\t";
}
cout<<endl;
}
}
(2)计算一个4X4矩阵对角线上元素的总和。
#include<iostream>
using namespace std;
int main()
{
//计算4行4列矩阵两条对角线上元素的和
/*
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
*/
//定义二维数组
int num[4][4];
int n=1;
//定义变量sum用于存放和
int sum=0;
//初始化二维数组,赋值为1-16
for(int i=0;i<4;i++){//二维数组的行
for(int j=0;j<4;j++){//二维数组的列
//数组的元素
num[i][j]=n++;
}
}
//打印矩阵
cout<<"矩阵为:\n";
for(int i=0;i<4;i++){
cout<<"\t";
for(int j=0;j<4;j++){
cout<<num[i][j]<<"\t";
}
cout<<endl;
}
cout<<"\n对角线上的元素为:\n";
//计算和:对角线上的元素有一个共同特点,一条对角线上的元素行号和列号相等,另一条上的元素行+列=3
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(i==j||i+j==3){
sum+=num[i][j];
cout<<num[i][j]<<"\t";
}
}
}
//输出总和
cout<<"\n元素总和为:"<<sum;
}
运行结果:
矩阵为:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
对角线上的元素为:
1 4 6 7 10 11 13 16
总和为:68
(3)输入一个n*n的二维数组,找出每行中的最大值存到一维数组中并输出
#include<iostream>
using namespace std;
int main()
{
//输入一个n*n的二维数组,找出每行中的最大值并存到一维数组中,输出
//定义变量n
int n;
cout<<"请输入长度n:";
cin>>n;
//定义二维数组
int num[n][n];
//定义一维数组
int max[n];
//定义变量temp
int temp;
int key=1;
//初始化二维数组,赋值
for(int i=0;i<n;i++){//二维数组的行
for(int j=0;j<n;j++){//二维数组的列
//数组的元素
num[i][j]=key++;
}
}
//打印数组
cout<<"生成的数组为:\n";
for(int i=0;i<n;i++){
cout<<"\t";
for(int j=0;j<n;j++){
cout<<num[i][j]<<"\t";
}
cout<<endl;
}
//找每一行中的最大值
for(int i=0;i<n;i++){
//假设本行的第一个元素为最大值
temp=num[i][0];
for(int j=0;j<n;j++){
//如果有元素值大于最大值,则改变最大值
if(num[i][j]>temp){
temp=num[i][j];
}
}
//内层循环结束,表示比较完了一行数据,得到该行的最大值,存入一维数组中
max[i]=temp;
}
//输出数组中的所有元素
for(int i=0;i<n;i++){
cout<<"第"<<i+1<<"行最大值为:"<<max[i]<<endl;
}
}