float debts[20];
声明debts是一个具有20个元素的数组,其中每一个元素都是一个float类型的值。这个数组的每一个元素称为debts[0],第二个元素称为debts[1],这样直到debts[9]。注意元素编号是从0而不是从1开始的。每个元素都可以被赋予一个float类型的值。如:
debts[0]=32.54; debts[1]=1.2e+21;
实际上您可以像使用相同类型的变量那样使用一个数组元素。例如,您可以把一个值读入一个特定的元素:scanf("%f",&debts[4]);为第5个元素读入一个值。
一个潜在的易犯的错误是:出于执行速度的考虑,C并不检查您是否使用了正确的下标。例如,以下都是错误的代码:debts[20]=88.32; //没有这个数组元素;
但是编译器不会发现这样的错误。当程序运行时,这些语句把数据放在可能由其他数据使用的位置上,因而可能破坏程序的结果甚至使程序崩溃。
数组可以是任意数据类型的数组。
例如,我们先前提到过的字符串就是一个特别的例子,它被存储在一个字符数组中。一般说来,字符数组就是元素都被赋于字符值的数组。如果字符数组包含了空字符\0,那么字符数组的内容就构成了一个字符串,其中空字符标志着字符串的结尾。
用于标识数组元素的数字称为下标、索引、或偏移量。必须是整数。从0开始。数组中的元素在内存中是顺序存储的。
在for循环中使用数组
程序清单 6.19 scores_in.c
//scores_in.c -- 使用循环进行数组处理
#include <stdio.h>
#define SIZE 10
#define PAR 72
int main (void)
{
int index,scores[SIZE];
int sum=0;
float arerage;
printf("Enter %d golf scores: \n",SIZE);
for (index=0;index<SIZE;index++)
scanf("%d",&scores[index]);
printf("The scores read in are follows: \n")
for (index=0;index<SIZE;index++)
printf("%5d",scores[index]);
printf("\n");
for(index=0;index<SIZE;index++)
sun+=scores[index];
average=(float)sum/SIZE;
printf("Sum of scores = %d,average = %.2f \n",sum,average);
printf("That's a hanicap of %.0f.\n",average-PAR);
return 0;
}
/*下面是输出:
Enter 10 scores:
Enter 10 golf scores:
102 98 112 108 105 103
99 101 96 102 100
The scores read in are as follows:
102 98 112 108 105 103 99 101 96 102
Sum of scores = 1026,average=102.60
That's a handicap of 31
*/
我们来看一些细节。首先,注意到尽管这个例子显示您输入了11个数,但是只有10个被读入了,因为读取循环只读入10个值。因为scanf()跳过空白字符,所以您可以一行之内 输入 所有的10个数,也可以在每一行只输入一个数,或者您也可以像这个例子一样混合 使用新行与空格 来分隔输入。
其次,使用数组和循环要比使用10个单独的xcanf()语句和10个单独的printf()语句来读入并验证这10个分数更方便。
这个例子说明了一些风格的问题。首先,使用#define指令创建一个指定数组 大小 的明显常量(SIZE)是一个好主意,您可以在定义数组和设置循环限制时使用这个常量 。如果您以后需要 把程序扩展为处理20个分数,简单地把SIZE重新定义为20就可以了。
其次,下面的代码可以很方便地处理一个大小 为SIZE的数组:
for(index=0;index<SIZE;index++)
获取正确的数组边界是很重要的。使用判断条件index<SIZE可使最后一个index的值为SIZE-1。
第三,一个好的编程习惯是使程序重复输出或“回显”刚刚读入的值。这有助于确保程序处理了您所期望的值。
最后,程序使用了三个独立的for循环,当然也可以合并操作。但您应该根据模块化的原则进行调整。这个术语所蕴含的思想是程序应该被分为一些单独的单元,每个单元执行一个任务,这会使程序更易读。可以使程序更易升级或修改。