二维数组
- 二维数组格式
/*
* 二维数组
*
* 格式: 数组类型 数组名称[二位数组中一维数组的个数][一维数组中元素的个数]
*
* 数组类型: 一维数组中存储数据的类型
* 注意点: 二维数组也是一个数组,只是二维数组中每个元素是一维数组
*
*/
int score[2][2] = {{50, 80},{60, 70}};
printf("score[0][0] = %i\n", score[0][0]); //50
- 二维数组初始化
int main()
{
//1. 定义同时初始化
int nums[2][2] = {{1,3},{5,7}};
//2. 先定义后初始化
int nums1[2][2];
nums1[0][0] = 888;
nums1[0][1] = 22;
nums1[1][0] = 33;
nums1[1][1] = 44;
//3. 特殊方式
// 如果在定义的同时初始化,那么二维数组的个数可以省略
int num3[][2] = {{1,3},{5,7}};
//如果定义的同时初始化,那么初始化中每个一维数组的{}也可以省略,会依次从前面往后面存入
- 二维数组的遍历
/*
* 二维数组的遍历
*
*/
int score[2][3] = {{50,60,70},{26,48,37}};
//遍历数组
for(int i = 0; i< 2; i++){
for(int j = 0; j < 3; j++){
printf("score[%i][%i] = %i\n", i,j,score[i][j]);
}
}
-
二维数组内存存储细节
/*
* 二维数组存储细节
*/
char chs[2][3] = {{'a','b','c'},{'e','f','g'}};
//chs[0]和chs[1]都代表的是数据的地址
printf("%p\n", chs); //0028FBEA
printf("%p\n", &chs); //0028FBEA
printf("%p\n", &chs[0]);//0028FBEA
printf("%p\n", &chs[1]);
printf("%p\n", &chs[0][0]);//0028FBEA
- 二维数组与函数
注意点: 主要是看函数的参数是基本数据类型还是数组,基本数据类型就不会改变实参,数组就会改变实参
- 二维数组练习题
#include <stdio.h>
char input();
char lowerCase(char ch);
void printMap(char map[6][6], int row, int col);
void move(char map[6][6],char ch);
//定义全部变量
//小人当前位置
int currentRow = 1; //行
int currnetCol = 1; //列
//小人结束的位置
int endRow = 1;
int endCol = 5;
int main()
{
/*
* 需求: 要求用户输入w a s d控制小人走出迷宫
w 向上走
s 向下走
a 向左走
d 向右走
######
#R #
# ## #
# # #
## #
######
补充:
1.以后翻转函数, 一定要编写说明的注释
2.封装函数的时候, 一定要遵守单一原则
什么是单一原则?
一个函数只做一件事情
*/
//1. 定义一个二维数组保存地图
char map[6][6] = {
{'#','#','#','#','#','#'},
{'#','R',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'},
};
// 计算数组的长度
int row = sizeof(map)/sizeof(map[1]);
int col = sizeof(map[1]);
while(currentRow != endRow || currnetCol != endCol){
//2. 接收用户的指令,考虑用户输入大写字母的情况
char ch = input();
//3. 让小人根据指令运动
move(map,ch);
//4. 打印地图
printMap(map,row,col);
}
printf("恭喜您已经通关");
return 0;
}
/**
接收用户输入的指令
* @brief input
* @param ch
* @return
*/
char input(){
printf("请输入w,s,a,d控制小人行走\n");
char ch;
scanf("%c", &ch);
setbuf(stdin,NULL); //清除缓冲区
lowerCase(ch);
}
/**大写字母转小写字母
* @brief lowerCase
* @param ch
* @return
*/
char lowerCase(char ch){
if(ch >='a' && ch <='z'){
return ch;
}else if(ch >='A' && ch <='Z'){
return ch + ('a' - 'A');
}else {
return printf("输入内容不合法,请重新输入\n");
}
}
/**
* @brief move 移动小人
* @param ch
*/
void move(char map[6][6],char ch){
switch (ch) {
//向上走
case 'w':
if(map[currentRow - 1][currnetCol] != '#'){
map[currentRow][currnetCol] = ' ';
currentRow--;
map[currentRow][currnetCol] = 'R';
}
break;
//向下走
case 's':
if(map[currentRow + 1][currnetCol] != '#'){
map[currentRow][currnetCol] = ' ';
currentRow++;
map[currentRow][currnetCol] = 'R';
}
break;
//向左走
case 'a':
if(map[currentRow][currnetCol - 1] != '#'){
map[currentRow][currnetCol] = ' ';
currnetCol--;
map[currentRow][currnetCol] = 'R';
}
break;
//向右走
case 'd':
if(map[currentRow][currnetCol + 1] != '#'){
map[currentRow][currnetCol] = ' ';
currnetCol++;
map[currentRow][currnetCol] = 'R';
}
break;
}
}
/**
* @brief printMap 打印地图函数
* @param ch
* @param row
* @param col
*/
void printMap(char map[6][6], int row, int col){
// 在Windows中清空上一次输出的内容
system("cls");
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
printf("%c",map[i][j]);
}
printf("\n");
}
}
网友评论