基本概念
int number[100];
元素数量必须是整数
- 容器
- 一个数组内所有的数据类型都是相同的
- 长度固定的数据结构,一旦创建不能改变大小
- 元素在内存中连续依次排列
数组初始化
1. 直接用括号给出数组的所有元素的初始值(不需要给出数组的大小)
int amount[] = {1, 5, 10, 25, 50};
2.通过循环为数组里的每个数初始化
int count[number];
int i;
for (i = 0; i < number; i++) {
count[i] = 0;
}
3.集成初始化时的定位
int c[] = {[1] = 2, 4, [5] = 6};
- 用[n]在初始化数据中给出定位
- 没有定位的数据接在前面的位置后面
- 其他位置的值补零
- 可以不给出数组的大小
- 适合数组稀疏的数组
数组的大小
- sizeof给出整个数组所占据的内容的大小,单位是字节
sizeof(c);
数组的赋值
- 数组本身不能赋值
- 要把一个数组的所有元素交给另一个数组,必须采用遍历
for (i = 0; i < cnt; i++) {
if (number[i] > sum / cnt) {
printf("%d\n", number[i]);
}
}
遍历数组
- 通常使用for循环,让循环变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标
- 数组作为函数参数时,往往必须用另外一个参数来传入数组的大小
int search(int key, int a[], int length)
{
int ret = -1;
int i;
for (i = 0; i < length; i++)
{
if (a[i] == key)
{
ret = i;
break;
}
}
return ret;
}
二维数组 int a[3][5]; 通常理解为a是一个3行5列的矩阵
int main(void) {
int a[][5] = {
{0, 1, 2, 3, 4},
{2, 3, 4, 5, 6},
};
int a[3][5];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
a[i][j];
}
}
return 0;
}
示例代码
用数组做散列计算
#include <stdio.h>
int main(void) {
const int number = 10;
int x;
int count[number];
int i;
for (i = 0; i < number; i++) {
count[i] = 0;
}
scanf("%d", &x);
while (x != -1) {
if (x >= 0 && x <= 9) {
count[x] ++;
}
scanf("%d", &x);
}
for (i = 0; i < number; i++) {
printf("%d:%d\n", i, count[i]);
}
return 0;
}
tic-tac-toe游戏
#include <stdio.h>
int main(void) {
const int size = 3;
int board[size][size];
int i, j;
int numOfX;
int numOfO;
int result = -1;
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
scanf("%d", &board[i][j]);
}
}
void checkRow(int i, int j, int mode) {
int m = i;
int n = j;
int x, y;
if (mode == 0) {
x = m;
y = n;
} else if (mode == 1) {
x = n;
y = m;
}
for (m = 0; m < size && result == -1; m++) {
numOfO = numOfX = 0;
for (n = 0; n < size; n++) {
if (board[x][y] == 1) {
numOfX++;
} else {
numOfO++;
}
if (numOfO == size) {
result = 0;
} else if (numOfX == size) {
result = 1;
}
}
}
}
checkRow(i, j, 0);
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++;
}
if (numOfO == size) {
result = 0;
} else if (numOfX == size) {
result = 1;
}
}
}
checkRow(j, i, 1);
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;
}
}
}
}
numOfO = numOfX = 0;
for (i = 0; i < size; i++) {
if (board[i][i] == 1) {
numOfX ++;
} else {
numOfO++;
}
}
if (numOfO == size) {
result = 0;
} else if (numOfX = size) {
result = 1;
}
numOfO = numOfX = 0;
for (i = 0; i < size; i++) {
if (board[i][size - i - 1] == 1) {
numOfX ++;
} else {
numOfO++;
}
}
if (numOfO == size) {
result = 0;
} else if (numOfX = size) {
result = 1;
}
return 0;
}
isPrime
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const int MaxNumber = 25;
int isPrime[MaxNumber];
int i;
int x;
for (i = 0; i < MaxNumber; i++)
{
isPrime[i] = 1;
}
for (x = 2; x < MaxNumber; x++)
{
if (isPrime[x])
{
for (i = 2; i * x < MaxNumber; i++)
{
isPrime[i * x] = 0;
}
}
}
for (i = 2; i < MaxNumber; i++)
{
if (isPrime[i] == 1)
{
printf("%d\t", i);
}
}
printf("\n");
system("pause");
return 0;
}
脑图总结
|