数组
在本节中,我们将创建一个小型 C 程序,它能生成 10 个随机数并对其进行排序。为此,我们将使用一种新的变量排列方式,称为数组。
数组允许你声明并处理同一类型的多个值集合。例如,你可能想创建一个包含五个整数的集合。一种方法是直接声明五个整数
广告
int a, b, c, d, e;
这没问题,但如果你需要一千个整数呢?一个更简单的方法是声明一个包含五个整数的数组
int a[5];
此数组中的五个独立整数通过索引进行访问。在 C 语言中,所有数组都从索引零开始,到 n-1 结束。因此,int a[5]; 包含五个元素。例如
int a[5]; a[0] = 12; a[1] = 9; a[2] = 14; a[3] = 5; a[4] = 1;
数组索引的一个优点是你可以使用循环来操作索引。例如,以下代码将数组中的所有值初始化为 0
int a[5]; int i; for (i=0; i<5; i++) a[i] = 0;
以下代码按顺序初始化数组中的值,然后将其打印出来
#include <stdio.h> int main() { int a[5]; int i; for (i=0; i<5; i++) a[i] = i; for (i=0; i<5; i++) printf("a[%d] = %d\n", i, a[i]); }
数组在 C 语言中一直被使用。要了解其常见用法,请启动编辑器并输入以下代码
#include <stdio.h> #define MAX 10 int a[MAX]; int rand_seed=10; /* from K&R - returns random number between 0 and 32767.*/ int rand() { rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main() { int i,t,x,y; /* fill array */ for (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } /* more stuff will go here in a minute */ return 0; }
此代码包含几个新概念。#define 行声明了一个名为 MAX 的常量,并将其设置为 10。常量名称通常以全大写形式书写,以使其在代码中显而易见。行 int a[MAX]; 展示了如何在 C 语言中声明一个整数数组。请注意,由于数组声明的位置,它对整个程序是全局的。
行 int rand_seed=10 也声明了一个全局变量,这次名为 rand_seed,每次程序启动时都会将其初始化为 10。此值是后面随机数代码的起始种子。在真实的随机数生成器中,种子应初始化为一个随机值,例如系统时间。在这里,rand 函数每次运行程序时都会产生相同的值。
行 int rand() 是一个函数声明。rand 函数不接受任何参数并返回一个整数值。我们将在稍后学习更多关于函数的内容。接下来的四行实现了 rand 函数。我们现在将忽略它们。
main 函数是正常的。声明了四个局部整数,并使用 for 循环将数组填充了 10 个随机值。请注意,数组 a 包含 10 个独立整数。你可以使用方括号指向数组中的特定整数。因此,a[0] 指的是数组中的第一个整数,a[1] 指的是第二个,依此类推。以 /* 开头并以 */ 结尾的行称为注释。编译器完全忽略该行。你可以在注释中放置给自己或其他程序员的备注。
现在,将以下代码添加到 more stuff ... 注释的位置
/* bubble sort the array */ for (x=0; x < MAX-1; x++) for (y=0; y < MAX-x-1; y++) if (a[y] > a[y+1]) { t=a[y]; a[y]=a[y+1]; a[y+1]=t; } /* print sorted array */ printf("--------------------\n"); for (i=0; i < MAX; i++) printf("%d\n",a[i]);
此代码会排序随机值并按排序顺序打印它们。每次运行它时,你都将获得相同的值。如果你想更改排序的值,请每次运行程序时更改 rand_seed 的值。
真正理解这段代码在做什么的唯一简单方法是“手动”执行它。也就是说,假设 MAX 为 4 以使其更易于管理,拿出一张纸,假装你是计算机。在纸上画出数组,并放入四个随机的、未排序的值。执行代码排序部分的每一行,并准确画出发生的情况。你会发现,每次内循环运行时,数组中较大的值会被推向数组底部,而较小的值会冒泡到顶部。