10.19学习记录

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

1.1 数组的创建

数组是一组相同类型元素的集合。

type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小

数组创建的实例:

//代码1
int arr1[10];
//代码2
int count = 10;
int arr2[count];//数组时候可以正常创建?
//代码3
char arr3[10];
float arr4[1];
double arr5[20];

注:数组创建,在C99标准之前, [ ] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数

组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

最好不要用变量

就算用常变量也不可以C99中引入了变长数组的概念,允许数组的大小用变量来指定,如果编译器不支持C99中的变长数组,那就不能使用// //VS2019是不支持变长数组的

1.2 数组的初始化

注意点

1:字符数组不完全初始化,必须指定数组大小,但是整型数组不需要

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

2.内存如何分配

char arr1[] = "abc";//a,b,c\0 char arr2[3] = {'a','b','c'};a,b,c

1.3 一维数组的使用

数组大小的计算 :

        

int main()
{
int arr[200] = { 1,2,3,4,5,6 };
printf("%d\n", sizeof(arr));//400跟位数有关系
printf("%d\n", sizeof(arr[0]));//4
int sz = sizeof(arr) / sizeof(arr[0]);
}

1.4 一维数组在内存中的存储

1.数组元素的储存是连续的

一个内存单位存放多少字节.他们的地址就相隔多少位

int main()
{
    int arr[] = { 0,1,2,3,4,5 };
    int n = 0;
    for (n;n < sizeof(arr) / sizeof(arr[0]);n++)
    {
        printf("%p\n", &arr[n]);
    }
    return 0;
}

结论:数组在内存中是连续存放的

%p---打印地址(16进制)

%d--打印整数(10进制)

p是指针,内容是arr[]的地址,进一位就往下读一个元素

数组名就是数组首元素的地址

有两个意外

1.sizeof(arr)中.arr不是数组首元素的地址,数组名代表正规数组,计算是整个数组大小;

2.&arr,数组名不是数组首元素的地址,而代表的是整个数组,取出的是整个数组的地址;

这里很明显看出.对数组名取地址往后进一位,相隔地址位有1c也就是1*16^1+12*16^0=28换算成10进制就是40正好是

数组大小.这里可以看出对&arr就是取整个地址.

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

1.二维数组的初始化

int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略

二维数组存放也是连续的

3.冒泡函数的设计

数组中两个相邻的元素进行比较,如果不满足顺序就交换(升序)

bubble_soft(int arr[], int sz)
{
    int i = 0;
    int n = 0;
    int flag = 1;
    int tmp = 0;
    for (i = 1;i <= sz - 1;i++)
    {
        for (n = 0;n < sz - i;n++)
        {
            if (arr[n] > arr[n + 1])
            {
                flag = 0;
                tmp = arr[n+1];
                arr[n + 1] = arr[n];
                arr[n] = tmp;
            }
        }
        if (flag == 1)
        {
            break;
        }
    }
}
int main()//冒泡函数
{
    int arr[] = { 1,5,7,8,9,4,9,8 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_soft(arr, sz);
    int n = 0;
    for (n = 0;n < sz;n++)
    {
        printf("%d ", arr[n]);
    }
    return 0;
}

4.三子棋

1.构建逻辑,确保用户输入值进入游戏,如果输入非法会报错并构成循环使用户重新输入

2.构建游戏头文件game.h与源文件game .h并在主函数引用

3.在源文件里建立游戏主体

1.建立一个字符型二维数组

因为游戏是填入空格'*' '#'这种字符型,并且要构建一个棋盘当然用一个二维

2.初始化棋盘为全空格

1.建立函数

并在游戏头文件声明

在游戏源文件进行实现

这里注意,我们构建了行,列两个参数,后期我们如果需要改变,只要在头文件去修改即可.

3.打印棋盘

步骤与上述相同

不再赘述.这里直接阐明如何实现

思路就是先打印数组元素以及列的分割线,但是注意到最后一列没有出现分割线,所以要判定一下

然后再打印分割的行,思路跟上述类似.但是要注意分割行也要打印分割线,不然会没办法对齐

4.玩家回合

思路:构建两个临时变量来存储玩家输入的坐标,但是注意数组是从0开始的,所以判定的时候要减去1;并提前要防止玩家输入溢出又或者是输入有棋子的格子要进行判定,并构成循环直到玩家输入正确再放入数组中

5.电脑回合

电脑回合思路与玩家类似,但是需要输入两个随机数,这里我们就需要用到rand()函数,并在主函数调用srand((unsigned int)(time(NULL)),并注意头文件在游戏头文件引用.

6.判断是否满了

没进行一步都要判断棋盘是否满,就要构建is_full函数

1.is_full()

static 只是为了is_win函数服务.没办法在其他文件调用

不满继续循环

2.is_win()

当判断是否满的时候同时也要判断是否赢了,最好的做法就是先判断输赢再判断是否满了,然后同时用返回值来判定

根据赢的三种情况分别判断然后直接返回值.根据返回值判断输赢这样节省变量空间

7.判断是否输赢


版权声明:本文为m0_72618437原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。