3. 数组与记录的结合
现代程序设计语言的一大特点是,当拥有一个类型时,就可以利用它来创建更复杂的新类型。
为了达到这一目的,通常可以定义记录数组,或者包含数组的记录。
例如, 在前文定义了一个名为employeeT的类型。一旦定义了该类型,就可以用它来声明数组,而数组的元素的类型就是employeeT。代码:
employeeT staff[10];
就声明staff是具有10个雇员的数组。
可以选取staff的任意元素,就如从其他数组中选取元素一样。
例如,可以用staff[1]来选取Bob Cratchit的整个记录:
对于这条记录,可以进一步选取其中的字段,例如:
staff[1].name
就选取了Bob Cratchit的名字:
其中,Name字段的值是一个字符串,因此可以继续对其中的元素进行选取。
如果想知道staff数组中第一个雇员的名字的首字母,就可以用下面的语句:
staff[1].name[0];
声明一个记录数组的方法与声明其他数组的方法相同,即按照最大长度分配存储空间,再追踪由一个整型变量表示的实际长度。
例如,如果用下列语句定义了常量Max Employees:
#define MaxEmployees 100
就可用下列语句定义变量staff和nEmployees:
employeeT staff[MaxEmployees];
int nEmployees;
该程序最多可以处理100个雇员,大多数情况下,员工数量要小于这个最大值,且存储在变量nEmployees中的值为当前员工数量。
为了要表示如下的两条记录,需要存储前两个记录的相关数据,并指明nEmployees的值:
定义了存储雇员信息的数组staff后,就可以编写过程和函数对其进行操作。
例如,下面的函数可以列出所有雇员的名字和职位:
static void ListEmployees(employeeT staff[], int nEmployees) {
int i;
for (i=0; i<nEmployees; i++) {
printf("%s(%s)\n", staff[i].name, staff[i].title);
}
}
又如,下述函数返回所有员工的平均薪水:
static double AverageSalary(employeeT staff[], int nEmployees) {
int i, total;
total=0;
for (i=0; i<nEmployees; i++) {
total += staff[i].salary;
}
return total / nEmployees;
}
参考
《C语言的科学和艺术》 —— 16 记录