二维数组集合

二维数组的定义和引用

1.定义:类型说明符  数组名 【常量表达式】【常量表达式】

    int a[3][[4](元素类型,数组名,行数,列数)

(1)其行列的序号均从0开始,数组元素是以行序顺序存放的,在内存中,多维数组依然是直线顺序排放的,第一个元素位于最低地址处。

假设:int a[M][N];且数组首地址为Adress0,那么a[i][j]的地址?

     Adress0+(i*N+j)*sizeof(int)

可以知道根据下标计算某个元素的地址,必须知道该数组的列数,即N。

2.引用:与一维数组一样,二维数组必须先定义,其维数必须是常量,具体引用时(赋值,运算,输出)每个元素等同于一个变量。

#include<iostream>
using namespace std;
int main()
{
	int i,j;
	int a[3][4];
	for(i=0;i<3;i++)
	for(j=0;j<4;j++)
	cin>>a[i][j];
		for(i=0;i<3;i++)
	for(j=0;j<4;j++)
	cout<<a[i][j];
	return 0;
}

二维数组的初始化

在定义数组的同时给数组元素赋值。

1.顺序赋值

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

2.分行赋值

int a[3][4]={{,2,3,4},{5,6,7,8},{9,10,11,12}};

3.部分赋值

int a[3][4]={{1},{5},{9}];                  //a[0][0]=1;a[1][0]=5;a[2][0]=9;其余元素都为0;

inta[3][4]={{1,2},{3}};                    //a[0][0]=1;a[0][1]=2;a[1][0]=3;其余元素为0;

4.分行或全部赋值时,可以省略第一维,不可以省略第二维。

int a[][4];

5不能给数组整体赋值,只能一个一个赋值。

int a[3][4];                //数组名代表数组首地址。

a={1,2,3,4,5,6};                ❌

a[3][4]={1,2,3,4,5,6};                ❌

6.用static或者是全局定义的数组如果不赋初值,系统均默认为0.

7.二维数组可以看成是特殊的一维数组:它的元素可以看成是一个一个的一维数组。

例如:int a[3][4];可以看成3个一维数组int a[0],int a[1],int a[2],每个一维数组中又有4个元素。

二维数组基本应用

假设创建如下的二维数组int a[3][4];

使用输入值初始化数组

{
int i,j;
for(i=0;i<3;i++)
   for(j=0;j<4;j++)
    cin>>a[i][j];
return 0;
}

显示数组中的每个元素

{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cout<<a[i][j];
return 0;
}

对所有元素求和

{
int i,j,sum=0;
for(i=0;i<3;i++)
   for(j=0;j<4;j++)
      sum+=a[i][j];
return 0;
}

对数组按列求和

for (i = 0; i < 3; i++) {
	sum = 0;
	for (j = 0; j < 4; j++)
		sum += a[i][j];
	cout << "第" << i << "列的和为" << sum;
}

找出数组中最大的数

int max = a[0][0];
for (i = 0; i < 3; i++)
	for (j = 0; j < 4; j++) {
		if (max < a[i][j])
		max=a[i][j];
	}
cout << "最大值为" << max;

将数组行列互换

{
	int i, j,t=0;
	int a[3][3] = {1,2,3,4,5,6,7,8,9};
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 3; j++)
			cout << a[i][j];
		cout << endl;
	}
	for (i = 0; i < 3; i++) {
		for (j = 0; j < i; j++) {
			t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}
	}
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 3; j++)
			cout << a[i][j];
		cout << endl;
	}
	return 0;
}

1        2        3                                                        1        4        7

4        5        6                                                        2        5        8

7        8        9                                                        3        6        9

将一个二行三列的二维数组转存到一个一维数组中

{
	int i, j, k = 0;
	int b[6];
	int a[2][3] = { 1,2,3,4,5,6 };
	for(i=0;i<2;i++)
		for (j = 0; j < 3; j++) {
			b[k] = a[i][j];
			k++;
		}
	for (k = 0; k< 6; k++)
		cout << b[k];
	return 0;
}

用数组做函数参数

1.用数组元素做函数参数,用法与一般变量作参数完全一样,是“值传递”。

例子:假设有2个已知的数组a和b,然后要求c中数组是a和b中对应数的最大公约数。

#include<iostream>
using namespace std;
int gys(int n,int m) {
	int t = 1, q = 2;
	while (n>=q&&m>=q) {
		if (n % q == 0 && m % q == 0) 
			t = q;
			q++;
	}
	return t;
}
int main()
{
	int a[3] = { 26,42,12 }; int b[3] = { 15,12,9 };
	int c[3];
	for (int i = 0; i < 3; i++) {
		c[i] = gys(a[i], b[i]);
		cout << c[i]<<'\t';
	}
	cout <<  endl;
	return 0;
}

2.用数组名做函数的参数(重点

(1)在C++中,数组名是数组在内存中存放的首地址。

(2)用数组名做函数参数,实参和形参都要用数组名。

(3)这时,函数传递的是数组在内存中的首地址。

(4)实参中的数组地址传到形参中,实参和形参共用同一段内存。

例子:将数组内各元素加倍输出

#include<iostream>
using namespace std;
int jp(int a[2]) {
	for (int i = 0; i < 2; i++)
		a[i] = a[i] * a[i];
	return 0;
}
int main() {
	int b[2] = { 2,4 };
	cout << b[0] << '\t' << b[1] << endl;
	jp(b);
	cout << b[0] << '\t' << b[1] << endl;
	return 0;
}

一维形参数组大小可不指定

例子:将数组内元素排顺序。

int pdx(int x[]) {
	int i, j,t;
	for (i = 0; i < 5; i++)
		for (j = 0; j < 4 - i; j++)
			if (x[j] > x[j + 1]) {
				t = x[j];
				x[j] = x[j + 1];
				x[j + 1] = t;
			}
	return 0;
}
int main() {
	int q[5] = { 5,1,6,4,7 };
	for (int i = 0; i < 5; i++)
		cout << q[i] << '\t';
	return 0;
}

3.用多维数组名做函数参数

(1)同样的,实参向形参传递的是数组首地址。

(2)如果,实参和形参是二维数组,则形参可以省略第一维,不能省略第二维,且第二维必须与实参中的维度相同。

实参          int  a[3][8]

形参           int a[][8]                           √                              int a[2][8]                               √           

                   int a[][6]            ×(二维不一致)                  int a[][]                 × (二维不可以是空)

例子:有一个3*4的矩阵,求其中的最大元素。

int qzd(int p[3][4]) {
	int i, j,max;
	max = p[0][0];
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 4; j++)
			if (p[i][j] > max)
				max = p[i][j];
	}
	return max;
}
int main() {
	int n[3][4] = { {1,2,35,4},{4,5,69,8}, {0,5,1} };
	cout<<qzd(n)<<endl;
	return 0;
}

注意:(1)用数组名做函数参数,应将主调函数和被调函数中分别定义数组,且类型一致。 

(2)一维形参数组的大小可不指定;二维形参数组的第一维可不指定,但第二维必须指定,且与实参一致。

(3)数组名做实参实际上是传递数组的首地址

(4)在C++语言规定,数组名代表数组在内存中存储的首地址,这样,数组名做函数实参,实际上传递的是数组在内存的首地址。实参和形参共占一段内存单元,形参数组中的值发生变化,也相当于实参数组中的值发生变化。

(5)C++语言对数组边界不进行检查,在使用中要引起注意。

比如:int a[3];程序中出现a[11];                  合法!

int a[3][4];程序中出现a[4][6];                         合法!

例子:只能排5个,不通用。

int pdx(int x[]) {
	int i, j,t;
	for (i = 0; i < 5; i++)
		for (j = 0; j < 5- i-1; j++)
			if (x[j] > x[j + 1]) {
				t = x[j];
				x[j] = x[j + 1];
				x[j + 1] = t;
			}
	return 0;
}

改进:能排序任意数量的数,通用。 

int pdx(int x[],int n) {
	int i, j,t;
	for (i = 0; i < n; i++)
		for (j = 0; j < n - i-1; j++)
			if (x[j] > x[j + 1]) {
				t = x[j];
				x[j] = x[j + 1];
				x[j + 1] = t;
			}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值