24/05/21(1118) 数组

数组

1.一维数组的创建和初始化

2.一维数组的使用

3.一维数组在内存中的存储

4.二维数组的创建和初始化

5.二维数组的使用

6.二维数组在内存中的存储

7.数组作为函数参数

8.数组的应用实:三子棋 扫雷

一维数组的创建和初始化:

数组是批量创建一组相同类型(C语言里是这么要求)的变量.

type_t  arr_name [const_n];

数组定义的时候,[]中的表达式也不一定非得是常量表达式.

在C89中要求必须是常量.在C99中允许使用变量表达式.

初始化 和 赋值 不一样.

在创建变量的同时设定值 这叫初始化.

变量已经创建完了,再去设定值,这叫赋值.

普通的数组只能使用{}初始化.字符数组处理使用{}还可以使用""的形式初始化,相当于在初始化一个字符串.

int main(){
    int arr1[] = { 'a', 'b', 'c' };
    int arr2[] = "abc";
    printf("%d\n", sizeof(arr1));
    printf("%d\n", sizeof(arr2));
    system("pause");
    return 0;
}

arr1 是3;arr2 是4

像arr1这个数组里面没有 \0 就不是一个字符串.不该对他使用strlen.如果强行使用,最终结果不可预期.这叫做未定义行为.

一维数组在内存中的存储

#include<stdio.h>
#include<stdlib.h>

int main(){

    int arr[] = { 9, 5, 2, 7 };
    for (int i = 0; i < 4; i++){
        //%p专门用来打印地址(指针变量的)
        // 按照十六进制的方式来打印的
        printf("%p\n", &arr[i]);
    }
    system("pause");
    return 0;
}

在内存中是连续的(C语言中是这样的);PHP核心类型就是数组,这里的数组下标不一定非得是整数.

前端:HTML+CSS+JS三剑客基本没变

上古时期 服务器C/C++ (CGI)有网站开发四件套LAMP:

Linux,Apache(HTTP服务器),MySQL,PHP

PHP不太适合开发复杂的大型项目,后来体量增长都被java/Python/ Goqudai 

初创公司,优先考虑 Python,如果达到一定规模之后,Java或者 Go 进行重构.

如果达到一定的非常恐怖的规模,或者对性能要求极高的场景C++.

二维数组

本来就没有二维数组.所谓的二维数组,也是一个一维数组,只不过数组的每个元素,又是一个一维数组.

    //长度为 3 的一堆数组,每个元素长度为 4.
    int arr[3][4];

int main(){
    //长度为 3 的一堆数组,每个元素长度为 4.
    int arr[3][4] = {
        //逗号表达式,值就是最后一个元素的值
        //int a = (1, 2, 3);它的值就是 3
        (1, 2),
        (5, 6),
        
    };


    system("pause");
    return 0;
}

把数组中的{}换成()之后输出的结果变成了{2, 6, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}

我们发现1和5不见了,这是因为出现了逗号表达式.

逗号表达式在C语言中没有用,唯一的作用就是出现在笔试面试中.

Python中逗号表达式就挺有用,交换两个变量.

举例:C语言中交换两个变量

    //交换两个变量
    int a = 10;
    int b = 20;
    int tmp = a;
    a = b;
    b = tmp;

在Python,Go中可以直接这么写

    a = 10;
    b = 20;
    a, b = b, a

无论是几维数组,定义的时候,永远只有第一个[]的数字可以省略,其他的都不能省略.

#include<stdio.h>
#include<stdlib.h>

int main(){
    int arr[3][4] = {
        { 1, 2, 3, 4 },
        { 5, 6, 7, 8 },
        { 9, 10, 11, 12 },
    };

    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 4; j++){
            printf(" %d", arr[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

想要给变量重命名:光标点亮 shift + alt+ r 就可以rename

以后用JetBraint 全家桶

Java:IDEA C++:CLion Python:PyCharm PHP:PHPStorm GO:GoLand 前端:WebStorm

二维数组在内存上依然是连续的.

数组作为函数参数:

#include<stdio.h>
#include<stdlib.h>
void Func(int arr[4]){
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));
}


int main(){
    int arr[4] = { 9, 5, 2, 7 };
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));
    Func(arr);

    system("pause");
    return 0;
}

还是前文中提过的C语言的 bug

数组如果作为函数参数,那就回隐式转成指针变量.(指向数组的首元素)

所以上面的数组输出结果为4和1.而不是4和4.

冒泡排序 重点掌握出场率极高;

快速排序 最常见(这两个就算背也要背下来)

#include<stdio.h>
#include<stdlib.h>

//数组的排序
//冒泡排序

void BubbleSort(int arr[],int size){
    //以每次找最小为例
    //[0,bound)已排序区间
    //[bound, size)待排序区间
    //每次找一个最小值放到前面去,也就意味着已排序区间就多一个元素
    //待排序区间就少一个元素
    for (int bound = 0; bound < size; bound++){
        //还需要一重循环,这个循环就负责找到当前待排序区间中的最小值
        //并放到 bound 位置上
        for (int cur = size - 1; cur > bound; cur--){
            //比较相邻元素.如果不符合升序规则就交换两个元素
            if (arr[cur - 1] > arr[cur]){
                int tmp = arr[cur - 1];
                arr[cur - 1] = arr[cur];
                arr[cur] = tmp;
            }
        }
    }

}

int main(){
    int arr[4] = { 9, 5, 2, 7 };
    BubbleSort(arr, 4);
    for (int i = 0; i < 4; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
    system("pause");
    return 0;
}

数组的应用实例:三子棋

1.控制台程序,用户输入坐标的方式来落子

2.X表示玩家的棋子,O表示电脑的棋子

3.电脑随机落子

(1)表示棋盘(二维数组,char数组X表示玩家O表示电脑空格表示未落子)

初始情况下,二维数组应该全设为空格

(2)先打印一下棋盘(第一次打印的是空的棋盘)

(3)提示玩家先落子

(4)检查游戏是否结束

(5)电脑落子

(6)检查游戏是否结束

回到(2)继续执行

#include<stdio.h>
#include<stdlib.h>

int Menu(){
    printf("=================\n");
    printf("欢迎来到三子棋游戏\n");
    printf("1.开始游戏\n");
    printf("0.退出游戏\n");
    printf("=================\n");
    printf("请输入您的选择");
    int choice = 0;
    scanf("%d",&choice);
    return choice;
}

#define MAX_ROW 3
#define MAX_COL 3

void Init(char chessBoard[MAX_ROW][MAX_COL]){
    for (int row = 0; row < MAX_ROW;row++){
        for (int col = 0; col < MAX_COL; col++){
            chessBoard[row][col] = ' ';
        }
    }
}

void Game(){
    //一局游戏的核心函数
    //1.创建并初始化一个棋盘(字符类型的二维数组)
    //尽量避免使用 magic number
    //最好给这个数字起一个合适的名字
    char chessBoard[MAX_ROW][MAX_ROW] = { 0 };
    Init(chessBoard);
    while (1){
        //2.先打印棋盘
        printf(chessBoard);
        //3.提示玩家落子
        playermove(chessBoard);
        //4.检查游戏是否结束
        if (Check(chessBoard)){
            break;
        }
        //5.电脑进行落子
        ComputerMove(chessBoard);
        //6.检查游戏是否结束
        if (Check(chessBoard)){
            break;
        }
        //7.回到 2 继续执行
    }
}

int main(){
    while (1){
        int choice = Menu();
        if (choice == 1){
            Game();
        }
        else if (choice == 0){
            printf("goodbyd!\n");
            break;
        }
        else{
            printf("您的输入有误!\n");
        }
    }
    system("pause");
    return 0;
}

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值