Week06-项目7-二维数组


前言

本篇文章简单介绍了C/C++二维数组


1.二维数组的定义和初始化

  

#include <iostream>
#include <Windows.h>

using namespace std;

int main() {

	/*
		如果只是定义数组,要指定行和列;
		如果定义时初始化,只能省略最高维的个数
	
	*/
	//(1)普通初始化,定义时指定每行每列的值
	
	int a1[3][4] = {
		{1, 2, 3, 4},
		{5, 6, 7, 8},
		{9, 10, 11, 12}
	};
	
	//这里没有初始化的部分会自动填充0
	int a2[3][4] = {
		{1, 2, 3, 4},
		{4, },
		{9, 10}
	};

	//(2)从头开始初始化
	int a3[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	
	int a4[3][4] = { 1 };//这里只初始化第一个元素为1,其他默认是0
	int a5[3][4] = { 0 };//这里默认初始化全是0

	system("pause");
	return 0;
}

2.二维数组的访问

2.1 单循环访问

#include <iostream>
#include <Windows.h>

using namespace std;

int main0102(void) {
	int a[3][4];

	//给二维数组赋值,单循环赋值
	for (int i = 0; i < 12; i++)
	{
		a[i / 4][i % 4] = i + 1;
	}
	//打印
	for (int i = 0; i < 12; i++) {
		cout << setw(2) << left << a[i / 4][i % 4] << " ";
		if (i%4 == 3) {
			cout << endl;
		}
	}
	system("pause");
	return 0;
}

2.2 双循环访问

//双循环赋值
#include <iostream>
#include <Windows.h>
#include <iomanip>

using namespace std;

int main(void) {
	int a[3][4];
	//双循环赋值
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			a[i][j] = 4 * i + j + 1;
			cout << setw(2) << left << a[i][j] << " ";
		}
		cout << endl;
	}

	system("pause");
	return 0;
}


3. 二维数组作为函数参数

/*
	二维数组跟一维数组一样,形参和实参指向同一空间
*/
#include <iostream>
#include <Windows.h>

using namespace std;

//1.指明参数
void print_arr(int arr[3][4]) { //这里arr实际上是一个指针,sizeof(arr)的值为sizeof(int *)的值(指针类型在x86中占4个字节,在x86中占8个字节)
	//cout << sizeof(arr) << endl;
	for (int i = 0; i < 3; i++) 
	{
		for (int j = 0; j < sizeof(arr[0]) / sizeof(arr[0][0]); j++)
		{
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
}
//2.省略一个高维参数
void printArr(int arr[][4], int line) {
	for (int i = 0; i < line; i++)
	{
		for (int j = 0; j < sizeof(arr[0])/sizeof(arr[0][0]); j++)
		{
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
}

int main(void) {
	int arr[3][4];

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			arr[i][j] = i * 3 + j + 1;
		}
	}
	print_arr(arr);
	cout << "-------" << endl;
	printArr(arr,3);

	system("pause");
	return 0;
}



4. 二维数组的存储方式

二维数组同一维数组一样都是按顺序存储的,我们可以通过设置断点(F9)-》调试-》窗口-》局部变量,在底部观察内存地址
在这里插入图片描述
或者在此处拷贝局部变量首地址-》调试-》窗口-》内存-》内存1-》粘贴 (观察地址)
在这里插入图片描述

#include <iostream>
#include <Windows.h>

using namespace std;

int main(void) {
	int a[3][4] = {};
	for (int i = 0; i < 12; i++)
	{
		a[i / 4][i % 4] = i + 1;
	}

	system("pause");
	return 0;
}

5. 高维数组

二维数组的规则都适用与三维数组及更高维度的数组

#include <iostream>
#include <Windows.h>

using namespace std;

int main0104(void) {

	int girl[3][4][5] = {
		{
			{1,2,3,4,5},
			{6,7,8,9,10},
			{11,12,13,14,15},
			{16,17,18,19,20},
		},
		{
			{21,2,3,4,5},
			{6,7,8,9,10},
			{11,12,13,14,15},
			{16,17,18,19,20},
		},
		{
			{1,2,3,4,5},
			{6,7,8,9,10},
			{11,12,13,14,15},
			{16,17,18,19,20},
		}
	};

	int length = sizeof(girl)/sizeof(girl[0][0][0]);
	int x = sizeof(girl) / sizeof(girl[1]);
	int y = sizeof(girl[0]) / sizeof(girl[0][0]);
	int z = sizeof(girl[0][0]) / sizeof(girl[0][0][0]);

	/*for (int i = 0; i < length; i++)
	{
		girl[i / y / z][i / y % z][i % y % z] = i + 1;
	}*/
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			for (int k = 0; k < z; k++)
			{
				girl[i][j][k] = i * y * z + j * z + k + 1;
				cout << girl[i][j][k] << " ";
			}
			cout << endl;
		}
		cout << endl;
		
	}
	system("pause");
	return 0;
}


6. 项目练习

6.1 项目需求

判断地形数据中的峰点数目及位置

6.2 项目分析

1.地形数据保存在文件中,使用文件操作将数据读入二维数组
2.逐行遍历二维数组的每个元素,确定是否峰值并打印结果。

6.3 项目实现

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define N 64
bool isPeak(const double grid[][N], int r, int c);
int main(){
int nrows, ncols;
double map[N][N];
string filename;
ifstream file;
cout <<"请输入文件名.\n";
cin >> filename;
file.open(filename.c_str());
if(file.fail()){
cerr<<"打开输入文件出错.\n";
exit(1);
}
file>>nrows>>ncols;
if(nrows > N || ncols > N){
cerr<<"网格太大,调整程序.\n";
exit(1);
}
//从数据文件读数据到数组
for(int i=0; i<nrows; ++i){
for(int j=0; j<ncols; ++j){
file>>map[i][j];
}
}
//判断并打印峰值位置
for(int i=1;i<nrows-1; ++i){
for(int j=1;j<ncols-1; ++j){
if(isPeak(map, i, j)){
cout<<"峰值出现在行: "<<i<<" 列:"<<j<<endl;
}
}
}


7.练习

7.1 杨辉三角

1.项目需求:用二维数组存储杨辉三角的数值,并在控制台实现打印

在这里插入图片描述
2.项目分析:
我们定义一个二维数组,所有元素先初始化为 0;
给数组的第 1 列和对角线元素赋值为 1;
其余元素 a[i][j]=a[i-1][j-1]+a[i-1][j];

在这里插入图片描述

3.项目实现

#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
#define N 10
int main(void){
int a[N][N] = {0}; //二维数组所有元素清零
for(int i=0; i<N; i++){
for(int j=0; j<=i; j++){//j<=i,第 i 行,仅有 i 个数字
if(j==0 || i==j){//第一列和对角线置为 1
a[i][j] = 1;
}else {
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
for(int i=0; i<N; i++){
cout<<setw((N-i)*4)<<a[i][0];
for(int j=1; j<=i; j++){
cout<<setw(8)<<a[i][j];
}
cout<<endl;
}
system("pause");
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值