<1>二维数组的基本内容
(1)基本了解
-
举例:int a[3][5];
-
概念:可以将a理解为一个三行五列的矩阵;(由此证明3代表行,5代表列)
(2)二维数组的遍历
-
代码:for(i=0;i<3;i++){
for(j=0;j<5;j++){
a[i][j]=i*j;
}
} -
a[i][j]是一个int;
-
表示第i行和第j列上的单元;
-
提出问题:a[i,j]表示的含义
1)在数学中:a[i,j]表示a的i行j列;
2)但是在C中:a[i,j]是一个表达式,逗号是一个运算符,这个表达式的结果为a[i,j]=a[j]
————2)相关知识:逗号运算符是把后面的值赋给前面
(3)二维数组的初始化
int a[][5]={
{0,1,2,3,4},
{2,3,4,5,6},
};
-
列数是必须给出的,行数可以由编译器来数;
-
每行一个{},用逗号分隔;
-
最后的逗号可以存在;
-
省略可以补0;
-
也可以用定位仅适用于C99;
(4)二维数组典例——tic-tac-toe游戏
-
1)题目信息:读入一个3×3的矩阵,矩阵上的数字为1表示该位置上有一个X,矩阵上的数字为0表示该位置上有一个O;
-
2)题目要求:程序判断这个矩阵中是否有获胜的一方(三个相同符号连成一条线),输出表示获胜的一方的字符X或O,或输出无人获胜
1.读入矩阵
const int size=3;
int board[size][size];
int i,j;
int numOfX;
int numOfO;
int result=-1;//-1:没人赢;1:X赢;0:O赢
//读入矩阵
for(i=0;i<size;i++){
for(j=0;j<size;j++){
scanf("%d",&board[i][j]);
}
}
2.检查行
//检查行
for(i=0;i<size && result= =-1;i++){
numOfO=numofX=0;
for(j=0;j<size;j++){
if(board[i][j]= =1){
numofX++;
}else{
numOfO++;}
}
//在同一行中,行号不变,列数不断加一;在同一行中随着列数的累加如果O的数量不增加,则X的数量增加,反之一样;
if(numOfO= =size){
result=0;
}else if(numOfX==size){
result=1;
}
//如果O的数量与size相同,则O取胜;反之X取胜;
}
3.检查列
if(result= =-1){
for(j=0;j<size && result= =-1;j++){
numOfO=numOfX=0;
for(i=0;i<size;i++){
if(board[i][j]= =1){
numofX++;
}else{
numOfO++;
}
}
if(numOfO= =size){
result=0;
}else if(numOfX= =size){
result=1;
}
}
}
4.检查对角线
numOfO = numOfx = 0;
for ( i=0; i<size; i++ ){
if ( board[il[i] == 1 ) {
numOfX ++;
}else {
numOfO ++;
}
}
if ( num0fO == size ) {
result = 0;
} else if (numOfX == size ) {
result = 1;
——————正对角线——————————
numofo = num0fX = 0;
for ( i=0;i<size; i++ ) {
if ( board[il[size-i-l] == 1 ) {
num0fX ++;
} else {
numOfO ++;
}
}