X606C语言程序设计部分03

这篇博客介绍了C语言中数组的强化练习,包括打印未出现的数字、排序输入数字,以及二维数组的初始化和存储细节。接着,通过一个走迷宫的游戏,展示了如何使用二维数组来模拟地图,获取用户输入的行走方向,并让小人根据方向移动。整个过程涉及到了数组操作、用户输入处理和条件判断等基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组强化练习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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muskfans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值