Day08

作者: 喝酸奶要舔盖__ | 来源:发表于2018-09-06 10:47 被阅读0次

    二维数组

    • 二维数组格式
        /*
         * 二维数组
         *
         * 格式: 数组类型 数组名称[二位数组中一维数组的个数][一维数组中元素的个数]
         *
         * 数组类型: 一维数组中存储数据的类型
         * 注意点: 二维数组也是一个数组,只是二维数组中每个元素是一维数组
         *
         */
        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");
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Day08

          本文链接:https://www.haomeiwen.com/subject/zjbtgftx.html