C语言-第五章-数组

1 数组

1.1 什么是数组

数组是一组数目固定、类型相同的数据项,数组中的数据项称为元素。如:

1
int numbers[10];

数组从0开始索,也就是numbers[0]是数组中的第一个元素,最后一个元素是numbers[9]。因为int占4个字节,所以上例总占用了40个字节的空间。
利用数组求平均数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
int i=1,num[5],sum=0; //num[]包含5个元素
float ave = 0.0f;
printf("输入5个数:\n");
for(;i<=5;i++)
{
printf("%d : ", i); //第一次循环i=1
scanf("%d", &num[i-1]); //将每次读入的值写到num[]对应的元素中
sum+=num[i-1]; //将每个元素加到sum中
}
ave = (float)sum/5; //求平均数
printf("平均数为:%5f", ave);
return 0;
}

1.2 再谈内存

第二章提到内存里含一个个连续的字节,每个字节有个位,每个位只有0和1两种状态。要辨识每个字节,以访问其内容,用数字来标记字节,0表示内存中的第一个字节,以此类推。字节的标记称为地址。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
long a=1L, b=2L, c=3L;
double d=4.0, e=5.0, f=6.0;
printf("一个Long类型的值占用 %d byte\n", sizeof(long));
printf("a,b,c的地址分别是%12p %12p %12p\n", &a, &b, &c); //&是取址符,%p显示地址,以16进制方式显示,地址值逐小,成等差排列。16进制占用4个位,本机测试时有8个16进制数,因此本机内存是4*8=32位,最大取址值是4GB(2^32B)。
printf("一个Double类型的值占用 %d byte\n", sizeof(double));
printf("d,e,f的地址分别是%12p %12p %12p\n", &d, &e, &f);
return 0;
}

1.3 数组和内存

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
int num[5];
int i=0;
for(; i<5; i++)
printf("%p\t", &num[i]);
return 0;
}

2 数组的计算

2.1 数组初始化

1
double values[5] = {1.5, 2.0, 3, 4.66, 77.7};   //如果只初始了前几个元素,后面的自动初始化为0。如果[]内不填数字,直接在{}写元素,编译器会根据元素数确定数组的大小。

2.2 计算数组大小

1
2
3
4
5
6
7
8
#include <stdio.h>

int main()
{
int num[]={1,3,3,3,3,4};
printf("%d", sizeof(num)/sizeof(num[0])); //数组总大小除元素大小即得元素数。
return 0;
}

3 多维数组

3.1 二维数组

1
float carrots[3][8];    //3行8列

查看二元数组元素地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
int i=0,num[3][8];
for(; i<3; i++)
{
int j=0;
for(; j<8; j++)
printf("num[%d][%d]'address: %p\n", i,j,&num[i][j]);
}
return 0;
}

3.2 多维数组的初始化

1
2
3
4
5
int numbers[3][4] = {
{ 1, 2, 3, 4},
{ 11, 22, 33, 44},
{ 111, 222, 333, 444} //这一行后面不管有没有逗号,整个数组大小都是48。
};

4 井字游戏

4.1 问题

编写一个程序,让两个人在计算机上玩井字游戏。

4.2 分析

井字游戏是一个3*3的方格游戏。两个轮流在方格中输入X或O。谁先在水平、竖直或对角线上连成3个标记,就赢。

  • 一个3*3的方格,存储两个人交替输入的标记。
  • 用1-9的数字来标识要在哪个方格里写入标记。
  • 从1-9记数,1号玩家在奇数号时输入,2号在偶数时输入。
  • 检查输入是否有效及游戏是否结束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>

int main(void)
{
int player = 0; //玩家12
int winner = 0; /* 赢家 */
int choice = 0; /* 对应方格中1-9 */
int row = 0; /* 方格的行 */
int column = 0; /* 方格的列 */
int line=0; /* 行或者列 */

char board[3][3] = { /* 方格 */
{'1','2','3'}, /* Initial values are reference numbers */
{'4','5','6'}, /* used to select a vacant square for */
{'7','8','9'} /* a turn. */
};
int i = 0;
for( ;i<9 && winner==0; i++)
{
/* 显示方格 */
printf("\n\n");
printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]);

player = i%2 + 1; /* 选择玩家 */

/* Get valid player square selection */
do
{
printf("\nPlayer %d, please enter the number of the square "
"where you want to place your %c: ",
player,(player==1)?'X':'O');
scanf("%d", &choice);

row = --choice/3; /* Get row index of square */
column = choice%3; /* Get column index of square */
}while(choice<0 || choice>9 || board[row][column]>'9');

/* Insert player symbol */
board[row][column] = (player == 1) ? 'X' : 'O';

/* Check for a winning line - diagonals first */
if((board[0][0]==board[1][1] && board[0][0]==board[2][2]) ||
(board[0][2]==board[1][1] && board[0][2]==board[2][0]))
winner = player;
else
/* Check rows and columns for a winning line */
for(line = 0; line <= 2; line ++)
if((board[line][0]==board[line][1] &&
board[line][0]==board[line][2])||
(board[0][line]==board[1][line] &&
board[0][line]==board[2][line]))
winner = player;
}
/* Game is over so display the final board */
printf("\n\n");
printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]);

/* Display result message */
if(winner == 0)
printf("\nHow boring, it is a draw\n");
else
printf("\nCongratulations, player %d, YOU ARE THE WINNER!\n",
winner);
return 0;
}