文章目录
前言
本篇文章简单介绍了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;
}