(十一)数组 -- 1. 数组

1. 数组

数组(array)是一些独立数值的集合,具有两个显著的特征:
(1) 数组是有序的。必须能把数组中的每个分量按顺序排列。
(2) 数组是同质的。数组中的每个数值必须有同样的类型。

数组中的每一个数值称为一个元素(element)。

在C语言中,每个数组有两个基本特性:
(1) **元素类型(**elementtype):存储在数组元素中的数值的类型。
(2) 数组大小(arraysize):数组所包含的元素个数。


1.1 数组声明

和C语言中其他的变量一样,数组在使用前必须声明。

数组声明的一般形式。例如:

int intArray[10];

声明了一个名为intArray,且拥有十个元素的数组,每个元素的类型都是int型的。

数组中的每一个元素都由对应的一个叫做下标(index)的数值确定。在C语言中,数组的下标从0开始。

在大多数情况下,应该用一个符号化的常量而不是一个具体的数值来指定数组的大小,以便将来可以容易地修改数组的大小。

例如,定义数组应该将大小定义成常量:

#define NElements 10

然后把声明写为:

int intArray[NElements];

1.2 数组选择

要指定数组中的一个元素,既需要指定数组的名字,又要指定对应于元素在数组中的下标。

在数组中指定特定元素的过程叫选择(selection)。

在C语言中,选择通过在数组的名字后面加上方括号,然后在方括号中加上下标来表示。

结果是一个选择表达式(selection expression),形式如下:

array-name[index]

在程序中,选择表达式的作用和一个变量的作用相似。可以把它用在一个表达式中,特别是,可以给它赋值。

用下列语句对scores数组中的元素赋初值0.0:

#define NJudges 5
double scores[NJudges];
int i;
for (i = 0; i < NJudges; i++) {
    scores[i] = 0.0;
}

1.3 一个简单的数组实例

数组操作的实例gymjudge.c,要求用户输入每个裁判员给出的分数,然后显示平均分数。

具体实现如下:

#include <stdio.h>

main() {
    #define NJudges 5
    double scores[NJudges], score, average;
    double total = 0.0;
    int i;

    printf("Please enter a score for each judge.\n");
    for (i = 0; i < NJudges; i++) {
        printf("Score for judge #%d: ", i);
        scanf("%lf", &score);
        scores[i] = score;
    }
    for (i = 0; i < NJudges; i++) {
        total += scores[i];
    }
    average = total / NJudges;
    printf("The average score is %.2lf\n", average);
}

运行后,可得如下结果:


1.4 改变下标值的范围

在C语言中,每个数组的第一个元素的下标值是0。在现实生活中,习惯从1开始给元素编码。

因此,程序改为要求用户输入编号为1~5的裁判给出的分数。


解决该问题存在两种标准方法:

(1) 在内部使用的下标值从0~4,但当从用户处得到数据或是在屏幕上显示数据时,下标值加1。

由此,上述程序gymjudge.c中唯一需要改动的,是为每个输入值显示提示信息的printf语句。

具体改动如下:

printf("Score for judge #%d:", i+1);

(2) 声明一个有额外元素的数组,数组元素的下标值从0~5,然后完全忽略0元素。

由此,主程序改为:

#include <stdio.h>

main() {
    #define NJudges 5
    double scores[NJudges+1], score, average;
    double total = 0.0;
    int i;

    printf("Please enter a score for each judge.\n");
    for (i = 1; i <= NJudges; i++) {
        printf("Score for judge #%d: ", i);
        scanf("%lf", &score);
        scores[i] = score;
    }
    for (i = 1; i <= NJudges; i++) {
        total += scores[i];
    }
    average = total / NJudges;
    printf("The average score is %.2lf\n", average);
}

第一种方法:
优点是,可以方便地使用现有的基于此机制的程序;
缺点是,程序需要两种不同的下标表示方法,考虑两种下标表示方法会增加程序处理的复杂性。

第二种方法:
优点是,内部的下标表示方法与和用户进行交流的方法是一致的。





参考
《C语言的科学和艺术》 —— 第11章 数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值