数组强化练习2
/*
* 需求:从键盘输入任意3个0-9的数字
* 并打印0-9中没有出现过的数字
*
* 功能实现步骤
* 1. 提示用户如何输入数据
* 2. 定义变量保留用户输入数据
* 3. 接受用户输入的数据
* 4. 通过循环输出0-9的数
* 5. 判断当前拿到的数是否出现过
*/
/**
* 打印输出0-9中没有出现过的数字
*/
void printNotAppearNum(){
// 1. 提示用户如何输入数据
printf("请输入3个0-9的整数,以逗号隔开,以回车结束\n");
// 2. 定义变量保存用户输入的数据
int a,b,c;
// 3. 接收用户输入的数据
scanf("%i,%i,%i",&a,&b,&c);
// 4. 通过循环获得0-9中所有的数
for (int i = 0; i < 10; i++) {
// 5. 判断当前拿到的数是否输出过,没有出现就输出0
if (i == a || i == b || i == c) {
continue;
}
printf("%i",i);
}
}
数组强化练习3
/*
* 需求:从键盘输入5个0-9的数字
* 要求排序后输出
*
* 思路:既然是0-9,所以开辟10个长度的存储空间tmp
* 并且全部初始化为0
* 与所输入数组对比
* 如果存在
* 则在tmp相应位置标记1
*
* 局限:只能输出不重复数字的数组
* 也就是打印排序后的数组,顺便帮你去重了
*/
void sortInputNums() {
// 1.提示用户输入数据
printf("请输入5个0-9的数字,以回车结束\n");
// 2.定义变量保存用户输入的数据,并初始化tmp数组
int inputVal;
int tmp[10] = {0};
// 3.接收用户输入的数据
for (int i = 0; i < 5; i++) {
scanf("%i",&inputVal);
// 4.将用户输入的数据,作为数组的索引操作数组
tmp[inputVal] = 1;
}
// 5.遍历数组,取出所有元素
for (int j = 0; j < 10; j++) {
// 6.判断当前元素有没有存取数据,有的话就取出
if(tmp[j] == 1) {
printf("%i",j);
}
}
}
修改后的代码
void sortInputNums() {
// 1.提示用户输入数据
printf("请输入5个0-9的数字,以回车结束\n");
// 2.定义变量保存用户输入的数据,并初始化tmp数组
int inputVal;
int tmp[10] = {0};
// 3.接收用户输入的数据
for (int i = 0; i < 5; i++) {
scanf("%i",&inputVal);
// 4.将用户输入的数据,作为数组的索引操作数组
tmp[inputVal] = 1 + tmp[inputVal];
}
// 5.遍历数组,取出所有元素
for (int j = 0; j < 10; j++) {
// 6.判断当前元素有没有存取数据,有的话就取出
// if(tmp[j] == 1) {
// printf("%i",j);
// }
for (int i = 0; i < tmp[j]; ++i) {
printf("%i",j);
}
}
}
二维数组的初始化
/*
* 二维数组的初始化
*/
// 1.定义的时候初始化
// 1.1.定义的时候完全初始化
int nums[2][3] = {
{1,2,3},{4,5,6}
};
// 1.2.定义的时候部分初始化
int nums1[2][3] = {
{5,6}
};
// 1.3.定义时初始化的注意点
/*
* 1.一维数组部分可以省略
* 2.一维数组元素的个数不能省略,就是第2个中括号
* 3.一维数组的大括号可以省略,按一维数组存储元素个数进行分割
*/
int num2[][3] = {
{1,2,3},
{4,5,6}
};
int num3[2][3] = {1,3,5,7,9,2};
二维数组的存储细节
/*
* 二维数组的存储细节
* 1.分配存储空间从内存大的开始分配
* 2.数组名对应的是占用存储空间最小的地址
* 3.给元素分配存储空间从占用存储空间内存地址小的开始分配
*/
char str[2][3] = {
{'a','b','c'},
{'d','e','f'}
};
/*
* 按照上面的说法
* &str = &str[0] = &str[0][0]
* 三者都打印 000000000064FDBA
*/
printf("%p\n",&str);
printf("%p\n",&str[0]);
printf("%p\n",&str[0][0]);
二维数组强化练习走迷宫游戏
第1阶段:打印地图
/**
* 用于打印地图
* @param map 地图对应二维数组
* @param row 二维数组的行数
* @param col 二维数组的列数
*/
void printMap(char map[6][6],int row,int col) {
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
printf("%c",map[i][j]);
}
printf("\n");
}
}
int main() {
// 1.定义二维数组保存地图
char map[6][6] = {
{'#','#','#','#','#','#'},
{'#','P',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'},
};
// 技术亮点
int row = sizeof(map) / sizeof(map[1]);
int col = sizeof(map[1]);
printMap(map,row,col);
return 0;
}
第2阶段:获取小人行走方位
/**
* 统一将大写字母转换成小写字母
* @param ch 字母字符串
* @return 小写字母字符串
*/
char getLowerCase(char ch) {
// 判断是否是大写字母
if (ch >= 'A' && ch <= 'Z') {
return ch + ('a' - 'z');
}
return ch;
}
/**
* 获取行走方向
* @return 获取到的方向
*/
char getDirection() {
// 3.提示用户输入数据
printf("请输入w a s d其中1个字符,控制小人走出迷宫\n");
// 4.定义变量存储用户数据并接受用户输入数据
char ch;
scanf("%c",&ch);
ch = getLowerCase(ch);
return ch;
}
int main() {
/*
* 补充:
* 在企业开发中,封装函数有一个单一原则
* 就是一个函数只做1件事情
* 否则就失去了封装的意义了
* 先在主函数里面写上过程,再进行封装
*/
// 1.定义二维数组保存地图
char map[6][6] = {
{'#','#','#','#','#','#'},
{'#','P',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'},
};
// 技术亮点
int row = sizeof(map) / sizeof(map[1]);
int col = sizeof(map[1]);
// 2.打印地图
printMap(map,row,col);
// 3.获取行走的方向
char ch = getDirection();
}
第3阶段:让小人单步行走
/**
* 小人在迷宫行走的方法
* @param ch
* @param map
*/
void personMove(char ch, char map[6][6]) {
// 4.2.判断用户输入的方向
switch (ch) {
case 'w':
if (map[p_row - 1][p_col] != '#') {
map[p_row][p_col] = ' ';
map[p_row - 1][p_col] = 'P';
// 4.3.修改小人现有的位置
map[p_row - 1][p_col] = 'P';
}
break;
case 'a':
if (map[p_row][p_col - 1] != '#') {
map[p_row][p_col] = ' ';
map[p_row][p_col - 1] = 'P';
// 4.3.修改小人现有的位置
map[p_row][p_col - 1] = 'P';
}
break;
case 's':
if (map[p_row + 1][p_col] != '#') {
map[p_row][p_col] = ' ';
map[p_row + 1][p_col] = 'P';
// 4.3.修改小人现有的位置
map[p_row + 1][p_col] = 'P';
}
break;
case 'd':
if (map[p_row][p_col + 1] != '#') {
map[p_row][p_col] = ' ';
map[p_row][p_col + 1] = 'P';
// 4.3.修改小人现有的位置
map[p_row][p_col + 1] = 'P';
}
break;
default:
printf("请输入正确的方向\n");
}
printMap(map, 6,6);
}
完整代码
// 4.1.获取小人当前的位置
int p_row = 1;
int p_col = 1;
// 出口位置
int end_row = 1;
int end_col = 5;
/**
* 用于打印地图
* @param map 地图对应二维数组
* @param row 二维数组的行数
* @param col 二维数组的列数
*/
void printMap(char map[6][6], int row, int col) {
// 清空屏幕
system("cls");
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
printf("%c", map[i][j]);
}
printf("\n");
}
}
/**
* 获取行走方向
* @return 获取到的方向
*/
char getDirection() {
// 3.提示用户输入数据
printf("请输入w a s d其中1个字符,控制小人走出迷宫\n");
// 4.定义变量存储用户数据并接受用户输入数据
char ch;
scanf("%c", &ch);
// 清空缓冲区
setbuf(stdin,NULL);
return ch;
}
void personMove(char ch,char map[6][6]);
int main() {
/*
* 补充:
* 在企业开发中,封装函数有一个单一原则
* 就是一个函数只做1件事情
* 否则就失去了封装的意义了
* 先在主函数里面写上过程,再进行封装
*/
// 1.定义二维数组保存地图
char map[6][6] = {
{'#', '#', '#', '#', '#', '#'},
{'#', 'P', ' ', '#', ' ', ' '},
{'#', ' ', '#', '#', ' ', '#'},
{'#', ' ', ' ', '#', ' ', '#'},
{'#', '#', ' ', ' ', ' ', '#'},
{'#', '#', '#', '#', '#', '#'},
};
// 技术亮点
int row = sizeof(map) / sizeof(map[1]);
int col = sizeof(map[1]);
printMap(map, row, col);
do{
// 3.获取行走的方向
char ch = getDirection();
// 4.让小人动起来
personMove(ch,map);
// 2.打印地图
printMap(map, row, col);
// 判断有没有到出口
if (p_col == end_col && p_row == end_row) {
break;
}
}while(1);
printf("您已经走出迷宫");
return 0;
}
/**
* 小人在迷宫行走的方法
* @param ch
* @param map
*/
void personMove(char ch, char map[6][6]) {
// 4.2.判断用户输入的方向
switch (ch) {
case 'w':
if (map[p_row - 1][p_col] != '#') {
map[p_row][p_col] = ' ';
map[p_row - 1][p_col] = 'P';
// 4.3.修改小人现有的位置
map[p_row - 1][p_col] = 'P';
// 修改现有位置的坐标
p_row = p_row - 1;
}
break;
case 'a':
if (map[p_row][p_col - 1] != '#') {
map[p_row][p_col] = ' ';
map[p_row][p_col - 1] = 'P';
// 4.3.修改小人现有的位置
map[p_row][p_col - 1] = 'P';
p_col = p_col - 1;
}
break;
case 's':
if (map[p_row + 1][p_col] != '#') {
map[p_row][p_col] = ' ';
map[p_row + 1][p_col] = 'P';
// 4.3.修改小人现有的位置
map[p_row + 1][p_col] = 'P';
p_row = p_row + 1;
}
break;
case 'd':
if (map[p_row][p_col + 1] != '#') {
map[p_row][p_col] = ' ';
map[p_row][p_col + 1] = 'P';
// 4.3.修改小人现有的位置
map[p_row][p_col + 1] = 'P';
p_col = p_col + 1;
}
break;
default:
printf("请输入正确的方向\n");
}
}