数组

        学生的学籍号码,棒球选手背后的号码,学生的成绩······在生活中我们经常会遇到相同类型的事物聚集在一起的情况,与其逐一叫出他们的名字,还不如统一使用“号码”更加简单明了。

        下面将介绍为了提高处理效率而把具有相同类型的数据有序地组织起来的一种形式——数组。

一维数组

        下面我们来依次输入5名同学的分数,显示出他们的总分和平均分。

//输入5名同学的分数并显示出他们的总分和平均分
#include <stdio.>
int main()
{
    int a,b,c,d,e;
    int sum=0;
    printf("请输入5名同学的分数。\n");
    printf("1号:");    scanf("%d",&a);    sum+=a;
    printf("2号:");    scanf("%d",&b);    sum+=b;
    printf("3号:");    scanf("%d",&c);    sum+=c;
    printf("4号:");    scanf("%d",&d);    sum+=d;
    printf("5号:");    scanf("%d",&e);    sum+=e;
    printf("总分:"%5d\n,sum);
    printf("平均分:"5.1f\n,sum/5.0);
    return 0;
}

        当然,如果同学的人数不是5而是50的话会怎么样呢?为了保存分数,需要创建50个变量,而且还必须管理50个变量名。编写程序的时候光是注意不键入错误的变量名就已经很麻烦了。除此之外还有一个问题,那就是虽说变量名,号码不同,但是每次执行的都是几乎相同的处理。

        擅长处理这类数据的就是数组,它能通过“号码”把相同数据类型的变量集中起来进行管理。

        同一类型的变量——元素集中在一起,在内存上排列成一条直线,这就是数组。元素的类型既可以是int型,也可以是double型等。因为学生的分数都是整数,所以下面以元素为int类型的数组为例来介绍。

数组的声明

        首先是声明。数组的声明通过指定元素类型,变量名,元素个数来进行。另外,[ ]中俄的元素个数必须是常量。例如:int a[5],声明的数组a,是一个元素类型为int型,元素个数为5个的数组。

访问数组

        数组a的各个元素,都是int类型的对象。不允许一些元素是int型,一些元素是double型。

        当然,对数组内各个元素的访问都是自由的。访问元素使用下标运算符。[ ]中的操作数为下标。下标表示该元素是首个元素之后的第几元素,而不是数组中的第几个元素。比如数组元素a[2],其下标为2,表示a[2]是首个元素之后的第二个元素,而不是数组的第二个元素。

数组的遍历

        创建一个元素类型为int,包含5个元素的数组,依次把1,2,3,4,5赋给它们并显示。

//依次把1,2,3,4,5赋值给数组的每个元素并显示
#include <stdio.h>
in main()
{
    int a[5];
    a[0]=1;    printf("a[0]=%d\n",a[0]);
    a[1]=2;    printf("a[1]=%d\n",a[1]);
    a[2]=3;    printf("a[2]=%d\n",a[2]);
    a[3]=4;    printf("a[3]=%d\n",a[3]);
    a[4]=5;    printf("a[4]=%d\n",a[4]);
    return 0;
}

        使用for语句对上述代码进行修改后,数组的优势就十分明显了。

        先来看一下为数组元素赋值的第一个for语句。这个for语句中的i从0开始递增,一共进行了5此循环操作。因此可以分解为下面的步骤。

\\把1,2,3,4,5赋值给数组的每一个元素并显示
#include <stdio.h>
int main()
{
    int i;
    int a[5];
    for(i=0;i<5;i++)
        {
            a[i]=i+1;
        }
    for(i=0;i<5;i++)
        {
            printf("%d",a[i]);
        }
    return 0;
}

         这样原本5行的赋值处理,就被替换称为了单一的for语句,程序就简洁了。第二for语句一样,打印出这5个数。

        像这样,按顺序逐个查看数组的元素,就称为遍历。

        一般情况下,元素类型为Type的数组,称为Type数组。我们在前面看到的数组,都是“int 数组”。

        另外,元素类型为Type类型,元素个数为n 的数组,写作Type[n]型。本代码中数组a的类型,就是int [5]型。

        接下来考虑double型数组。为double[7]的数组的全部元素赋值为0.0的代码如下。

#include <stido.h>
int main()
{
    int i;
    double a[7];
    for(i=0;i<7;i++)
        {
            a[i]=0.0;
        }
    for(i=0;i<7;i++)
        {
            printf("a[%d]=%.1f\n",i,a[i]);
        }
    return 0;
}

        这样一来,数组a[7]里全都是0.0。

数组的初始化

        之前我们已经提到,在声明变量的时候,除了的确没有必要的情况,都需要对变量进行初始化。下面我们就对上面的代码进行修改,加入对数组元素进行初始化的处理。

#include <stdio.h>
int main()
{
    int i;
    int a[5]={1,2,3,4,5};   \\初始化
    for(i=0;i<5;i++)
        {
            printf("a[%d]=%d\n",i,a[i]);
        }
    return 0;
}

        数组的初始值就是那些在大括号中的,用逗号分隔并逐一赋给各个元素的值。在上述程序中,分别使用1,2,3,4,5对数组a的各个元素进行初始化。

        int a[5]={1,2,3,4,5};

        最后一个初始值后面可以不用加逗号。

        还有一点需要注意,不能通过赋值语句进行初始化。

        int a[3];

        a={1,2,3};

        这就是一个典型的错误例子,我们在刚学的时候需要注意一下。

数组的复制

        我们先来看看下面这一串代码。

//把数组中的全部元素复制到另一个数组中
#include <stido.h>
int main()
{
    int i;
    int a[5]={17,23,36};
    int b[5];
    for(i=0;i<5;i++)
        {
            b[i]=a[i];
        }
    puts("a    b");
    for(i=0;i<5;i++)
        printf("%4d%4d\n",a[i],b[i]);
    return 0;
}

        程序中的第一个for语句,其作用是把a中的全部元素的值依次赋给b中的元素。

        同时遍历两个数组,从b[0]=a[0];执行到b[4]=a[4];。

        C语言不支持使用基本赋值运算符=为数组赋值。也就是说,下面这样的语句是错误的。

        b=a;          //错误:不能为数组赋值

        因此,应该像上面的程序那样,使用for语句等对数组的元素逐一赋值。

        注意:不能使用赋值运算符为数组赋值。数组的复制,必须通过使用循环语句等对所有的元素逐一赋值来进行。

输入数组元素的值

        下面我们从键盘输入数组元素的值。

//输入数组元素并显示
#include <stdio.h>
#int main()
{
    int a[5];
    for(int i=0;i<5;i++)
        {    
            scanf("%d",&a[i]);    //输入元素的值
        }
    for(int i=0;i<5;i++)
        {
            printf("%d",a[i]);    //显示元素的值
        }
    return 0;
}
   

   对数组的元素进行倒序排列

        如果仅仅是输入并显示元素的值,那或许很简单,这次我们来对数组的元素进行倒序排列。

//对数组的全部元素进行倒序排列
#include <stdio.h>
int main()
{
    int a[7];
    for(int i=0;i<7;i++)
        scanf("%d",&a[i];
    for(int i=0;i<3;i++);
        {
            int tmp=a[i];
            a[i]=a[6-i];
            a[6-i]=tmp;
        }
    printf("倒序排列后:");
    for(int i=0;i<7;i++)
        printf("%d",a[i]);
    return 0;
}

         如果想交换a和b的值,必须使用一个额外的变量tmp;和我们生活中一样,如果想要把两瓶不同的水交换一下,就必须借助第三个瓶子来达到目的,这里也一样。当然交换两个变量的值不止这一中方法。还可以用异或法,这里我们先不说,后面我们再了解。

        不可以像下面这样进行两个值的交换。

                  a=b;b=a;

        这样是不行的,初学者一定要注意。

使用数组进行成绩处理     

//输入5名学生的成绩并显示出他们的总分和平均分
#include <stido.h>
int main()
{
    int i;
    tensu[5];
    int sum=0;
    printf("请输入5名学生的成绩。\n");
    for(i=0;i<5;i++)
        {
            scanf("%d",&tensu[i]);
            sum+=tensu[i];
        }
    printf("总分:%d\n",sum);
    printf("平均分:%.2f\n",sum/5.0);
    return 0;
}

        数组tensu用来保存学生的分数。同时,由于数组的下标是从0-4,因此在提示输入学生分数的时候,要使用下标值加1来显示。

        但是,如果跟让我们把学生的人数从5人加到8人的话。就要把所有的需要改变的地方改变,这将会是个非常麻烦的事情。我们想要解决这样的问题就要学习一下对象式宏

对象式宏

        可以解决上述问题的就是对象式宏。下面我们来修改一下上面的代码,让程序变得更加的完善。本程序的关键部分就是#define指令。指令的形式如下。

  #define a b

        它的原理和文字处理机或者编译器的替换是一样的,在将该指令之后的a替换为b的基础上,再进行编译与执行处理。

//输入5名学生的成绩并显示出他们的总分和平均分
#include <stido.h>
#define NUMBER 5 //学生的人数
int main()
{
    int i;
    tensu[NUMBER];
    int sum=0;
    printf("请输入5名学生的成绩。\n");
    for(i=0;i<NUMBER;i++)
        {
            scanf("%d",&tensu[NUMBER]);
            sum+=tensu[NUMBER];
        }
    printf("总分:%d\n",sum);
    printf("平均分:%.2f\n",sum/5.0);
    return 0;
}

        在这里,a为宏名。为了易于和通常的变量名进行区分,宏名一般使用大写来表示。

        刚才我们提到了要考虑改变学生的人数。改变人数其实很容易,只需要将宏定义改为8就星了。

        在程序中使用宏,不仅能够在一个地方同意管理,而且通过为常量定义名称,可以让程序阅读起来更容易。

数组元素的最大值和最小值

        接下来我们来求最高分和最低分,即数组袁术的最大值和最小值。

//输入学生的分数并显示出其中的最高分和最低分
#include <stdio.>
#define NUMBER 5
int main()
{
    int i;
    int tensu[NUMBER];
    int max,min;
    for(i=0;i<NUMBER;i++)
        scanf("%d",&tensu[i];
    min=max=tensu[0];
    for(i=1;i<NUMBER;i++)
    {
        if(tensu[i]>max)
            max=tensu[i];
        if(min<tensu[i])
            min=tensu[i];
     }
    printf("最高分:%d\n",max);
    printf("最低分: %d\n",min);
    return 0;
}

        截至目前,我们看到的所有成绩处理程序中的学生人数都是5。虽然通过定义宏来改变学生人数非常简单,但是每次都需要对程序进行修改,然后重新编译执行。因此,我们可以定义一个比较大的数组,然后从头开始仅使用其中需要的部分。

多维数组

        所谓多维数组,就是多个数组集合在一起形成的数组,即元素本身是数组的数组。下面我们来学习多维数组的基础知识。

多维数组

        上面学习的数组,其元素都int型或double型等单一类型。实际上,数组的元素也可以是数组本身。

        以数组作为元素的数组是二维数组,以二维数组为元素的数组就是三维数组。当然也可以生成维数更高的数组。二维数组以上的数组,统称为多维数组

     注意:多维数组是以数组为元素的数组。

        二维数组就像是一个由“行”和“列”构成的表单,其中各元素纵横排列。 

           注意,在书写数组时,行可以省略而列不能省略。如a[ ][3];

        和一维数组一样,多维数组的所有元素在内存上是排列成一条直线的。构成元素排列时,首先是末尾的下标按照0,1,······的顺序递增,然后是开头的下标按照0,1,······的顺序递增,如下所示。

a[0][0]  a[0][1]   a[0][2]   a[1][0]    a[1][1]     a[1][2]     ···     a[3][1]  a[3][2]

        这样就保证了a[0][2]的后面是a[1][0],a[2][2]的后面是a[3][0]。

        下面我们就来用一下二维数组吧。

//求4名学生在两次考试中3门课程的总分并显示
#include <stdio.h>
int main()
{
    int i,j;
    int tensu1[4][3]={{91,63,78},{67,72,46},{89,34,53},{32,54,34}};
    int tensu2[4][3]={{97,67,82},{73,43,46},{97,56,21},{85,46,35}};
    int sum[4][3];    //总分
    for(i=0;i<4;i++)    //显示第一次考试的分数
        {
            for(i=0;j<3;j++)
                sum[i][j]=tensu1[i][j]+[tensu2[i][j];
        }
    puts("第一次考试的分数");
    for(i=0;i<4;i++)    //显示第二次考试的分数
        {
            for(j=0;j<3;j++)
                printf("%4d",tensu1[i][j];
            printf("\n");
        }
    
    puts("第二次考试的分数");
        for(i=0;i<4;i++)
        {
            for(j=0;j<3;j++)
                printf("%4d",tensu2[i][j];
            printf("\n");
        }
    puts("总分");
        for(i=0;i<4;i++)    //显示总分
        {
            for(j=0;j<3;j++)
                printf("%4d",sum[i][j];
            printf("\n");
        }
    return 0;
}

        tensu1和tensu2分别是存放第一次考试和第二次考试的分数的数组,sum是存放总分的数组,它们都是以12个分数构成元素的4行3列的二维数组。

        例如,tensu1[2][1]表示第3个学生第一次英语考试的分数,tensu2[3][2]表示第4个学生第二次数学考试的分数。

        另外,二维数组tensu1和tensu2的各构成元素都用初始值进行了初始化。另一方面,数组sum因为没有初始值,所以它的所有元素都是不定值。该程序中,因为进行了两次考试,所以使用了两个二维数组。如果进行了15此考试,则就不要使用15个二维数组了,那种情况下使用由15个二维数组组成的三维数组会更加方便。

总结

同一类型的对象集中在一起,在内存上排列成一条直线,这就是数组。数组通过指定元素类型,元素个数以及数组名来表明。

元素类型维Type的数组,称为Type数组。元素个数为n的Type数组,写作Type[n];

对象式宏由#define指令进行定义。

        #define a b

数组声明时,元素个数必须使用常量表达式。

按顺序逐个查看数组的元素,称为遍历

(我们只是对上述内容进行一个简单的了解,想要更深入的学习数组,还需要学习更多知识)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值