目录
一、一维数组的创建和初始化
1、数组的创建
●数组是一组相同类型元素的集合。
●创建方式:
type_t arr_name [const_n] //type_t是指数组的元素类型 //const_n是一个常量表达式,用来指定数组的大小
●创建实例:[]中要给一个常量才可以,不能使用变量。
//1 int arr[10]; //2 int count=10; int arr2[count]; //报错! //3 char arr3[10]; float arr4[1]; double arr5[20];
2、数组的初始化
●数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
●例:
int arr1[10]={1,2,3,4,5,6,7,8,9,10}; //完全初始化 int arr2[10]={1,2,3,4,5}; //不完全初始化 char ch1[3]={'a','b','c'}; char ch2[3]="bit";
二、一维数组的使用
●下标引用操作符:[]。下标从0开始。
●数组的大小可以通过计算得到:
int arr[10]; int sz=sizeof(arr)/sizeof(arr[0]);
三、一维数组在内存中的存储
1、一维数组在内存中是连续存放的。
2、随着数组下标的增长,地址由低到高变化。
证明:
//1
int main()
{
int arr[10]={0};
int i=0;
for(i=0;i<10;1++)
{
printf("&arr[%d]=%p\n",i,&arr[i]); //%p:打印地址
}
return 0;
}
//2
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int* p=arr;
int i=0;
for(i=0;i<10;i++)
{
printf("%d ",*p);
p++;
}
return 0;
}
四、二维数组的创建和初始化
1、二维数组的创建
int arr1[3][4];
char arr2[3][5];
double arr3[2][4];
2、二维数组的初始化
int arr[3][4]={1,2,3,4}; //不完全初始化,后面补0
int arr[3][4]={{1,2},{4,5}};
int arr[][4]={{2,3},{4,5}}; //行可以省略,列数不可以省略
五、二维数组的使用
二维数组的使用也是通过下标的方式。
//打印一个二维数组的所有元素
int main()
{
int arr[][4]={{1,2},{3,4},{4,5}};
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
六、二维数组在内存中的存储
二维数组在内存中也是连续存放的。
一行内部连续,跨行也是连续的。
证明:
int main()
{
int arr[][4]={{1,2},{3,4},{4,5}};
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]); //将每个元素的地址打印出来
}
printf("\n");
}
}
七、数组作为函数参数:冒泡排序为例
数组名是首元素的地址。
两个特例:
●sizeof(数组名):数组名表示整个数组,计算的是整个数组的大小,单位是字节
●&数组名:数组名表示整个数组,取出的是整个数组的地址
void bubble_sort(int arr[],int sz) //这里的形参arr实际上是一个指针
{
int i=0;
for(i=0;i<sz-1;i++)
{
int j=0;
for(j=0;j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz);
return 0;
}
八、数组的应用实例1:三子棋
test.c:测试游戏的逻辑
game.h:关于游戏相关的函数声明,符号声明,头文件的包含
game.c:游戏相关函数的实现
//game.h头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//符号的定义
#define ROW 3
#define COL 3
//函数的声明
void InitBoard(char board[ROW][COL],int row,int col); //初始化棋盘
void DisplayBoard(char board[ROW][COL],int row,int col); //打印棋盘
void PlayerMove(char board[ROW][COL],int row,int col); //玩家下棋
void ComputerMove(char board[ROW][COL],int row,int col); //电脑下棋
char IsWin(char board[ROW][COL],int row,int col); //判断游戏输赢 //玩家赢了:*,电脑赢了:#,平局:Q,游戏继续:C
//test.c
#include<stdio.h>
#include"game.h"
void menu()
{
printf("*****************************\n");
printf("******* 1.play ********\n");
printf("******* 2.exit ********\n");
printf("*****************************\n");
}
void game()
{
//用二维数组存储数据
char board[ROW][COL];
//初始化棋盘
Initboard(board,ROW,COL);
//打印棋盘
DisplayBoard(board,ROW,COL);
char ret=0;
//下棋
while(1)
{
//玩家下棋
PlayerMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断玩家是否赢得游戏
ret=IsWin(board,ROW,COL);
if(ret!='C')
{
break;
}
//电脑下棋
ComputerMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断电脑是否赢得游戏
ret=IsWin(board,ROW,COL);
if(ret!='C')
{
break;
}
}
if(ret='*')
{
printf("玩家赢了\n");
}
else if(ret='#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
DisplayBoard(board,ROW,COL);
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 0:
printf("三子棋游戏!\n");
game();
break;
case 1:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}while(input);
return 0;
}
//game.c
#include "game.h"
void InitBoard(char board[ROW][COL],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
board[i][j]=' ';
}
}
}
void DisplayBoard(char board[ROW][COL],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf(" %c ",board[i][j]);
printf("|");
}
if(i<row-1)
{
for(int k=0;k<col;k++)
{
printf("---");
if(j<col-1)
{
printf("|");
}
}
printf("\n")
}
}
}
void PlayerMove(char board[ROW][COL],int row,int col)
{
int x=0,y=0;
printf("玩家走:>\n");
while(1)
{
printf("请输入下棋的坐标:>\n");
scanf("%d %d",&x,&y);
if(x>=1&&x<row&&y>=1&&y<=col)
{
//下棋
if(board[x-1][y-1]==' ') //判断坐标是否被占用
{
board[x-1][y-1]='*';
break;
}
else
{
printf("坐标被占用,请重新输入!\n");
}
}
else
{
printf("坐标非法,请重新输入!\n");
}
}
}
void ComputerMove(char board[ROW][COL],int row,int col);
{
printf("电脑走:>);
while(1)
{
int x=rand()%row;
int y=rand()%col;
if(board[x][y]==' ') //判断占用
{
board[x][y]='#';
break;
}
}
}
int IsFull(char board[ROW][COL],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(board[i][j]==' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL],int row,int col)
{
int i=0;
//判断三行
for(i=0;i<row;i++)
{
if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}
}
//判断三列
for(i=0;i<col;i++)
{
if(board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[0][i]!=' ')
{
return board[0][i];
}
}
//判断对角线
if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')
{
return board[1][1];
}
if(board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[1][1]!=' ')
{
return board[1][1];
}
//判断平局
int ret=IsFull(board,row,col);
if(ret==1) return 'Q';
return 'C';
}
九、数组的应用实例2:扫雷游戏
test.c:扫雷游戏的测试
game.c:游戏的函数实现
game.h:头文件,游戏的函数声明
●写两个数组:1个char数组存放布置好雷的信息,1个char数组存放排查出的雷的信息
●如果想实现9*9的棋盘,数组的大小设计成11*11比较好
//game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define EASY_COUNT 10
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col);
//布置雷
void SetMine(char board[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS],char shwo[ROWS][COLS],int row,int col);
//test.c
#include"game.h"
void menu()
{
printf("*****************************\n");
printf("******* 1.play ********\n");
printf("******* 2.exit ********\n");
printf("*****************************\n");
}
void game()
{
char mine[11][11]; //存放布置好的雷的信息
char show[11][11]; //存放排查出来的雷的信息
//初始化棋盘
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//打印棋盘
DisplayBoard(show,ROW,COL);
//布置雷
SetMine(mine,ROW,COL);
//排查雷
FindMine(mine,show,ROW,COL);
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game(); //扫雷游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}while();
return 0;
}
//game.c
#include"game.h"
int get_mine_count(char board[ROWS][COLS],int x,int y)
{
return mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+mine[x][y-1]+mine[x][y+1]+mine[x+1][y+1]+mine[x+1][y]+mine[x+1][y-1]-8*'0';
}
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
board[i][j]=set;
}
}
}
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
printf("----------扫雷游戏----------");
int i=0;
//打印列号
for(i=0;i<=col;i++)
{
printf("%d ",i);
}
printf("\n");
for(i=0;i<row;i++)
{
printf("%d ",i);
for(int j=0;j<col;j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
printf("----------扫雷游戏----------");
}
void SetMine(char board[ROWS][COLS],int row,int col)
{
int count=EASY_COUNT;
while(count)
{
int x=rand()%row+1;
int y=rand()%col+1;
if(mine[x][y]=='0')
{
mine[x][y]='1';
count--;
}
}
}
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
//1、输入要排查的坐标
//2、检查坐标是不是雷
int x=0;
int y=0;
int win=0;
while(win<row*col-EASY_COUNT)
{
printf("请输入要排查的坐标:>\n");
scanf("%d %d",&x,&y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if(mine[x][y]=='1')
{
printf("很遗憾,你被炸死了");
DisplayBoard(mine,row,col);
break;
}
else
{
int count=get_mine_count(mine,x,y);
show[x][y]=count+'0';
DisplayBoard(show,row,col);
win++;
}
}
else
{
printf("坐标不合法,请重新输入\n");
}
}
}