C++初级教程(三)

时间:2023-03-28 21:59:43

一、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表,由行和列组成,其中的每一行就是一个一维数组。所以,可以将二维数组看作是多个一维数组的集合。例如:

1234561 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;
	}
 }