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.判断是否输赢

