• C语言二维数组


    上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为一维数组。在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数组中的位置。本节只介绍二维数组,多维数组可由二维数组类推而得到。

    二维数组的定义

    二维数组定义的一般形式是:

    dataType arrayName[length1][length2];

    其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。例如:

    int a[3][4];

    定义了一个3行4列的数组,共有3×4=12个元素,数组名为a,即:
    a[0][0], a[0][1], a[0][2], a[0][3]
    a[1][0], a[1][1], a[1][2], a[1][3]
    a[2][0], a[2][1], a[2][2], a[2][3]

    在二维数组中,要定位一个元素,必须给出一维下标和二维下标,就像在一个平面中确定一个点,要知道x坐标和y坐标。例如,a[3][4] 表示a数组第3行第4列的元素。

    二维数组在概念上是二维的,但在内存中地址是连续的,也就是说各个元素是相互挨着的。那么,如何在线性内存中存放二维数组呢?有两种方式:一种是按行排列, 即放完一行之后再放入第二行。另一种是按列排列, 即放完一列之后再放入第二列。

    在C语言中,二维数组是按行排列的。也就是先存放a[0]行,再存放a[1]行,最后存放a[2]行;每行中的四个元素也是依次存放。数组a为int类型,每个元素占用4个字节,整个数组共占用4×(3×4)=48个字节。

    【示例】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

    -- Math C English
    80 75 92
    61 65 71
    59 63 70
    85 87 90
    76 77 85


    可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:

    1. #include <stdio.h>
    2. int main(){
    3. int i, j; //二维数组下标
    4. int sum=0; //当前科目的总成绩
    5. int average; //总平均分
    6. int v[3]; //各科平均分
    7. int a[5][3]; //用来保存每个同学各科成绩的二维数组
    8. printf("Input score: ");
    9. for(i=0; i<3; i++){
    10. for(j=0; j<5; j++){
    11. scanf("%d", &a[j][i]); //输入每个同学的各科成绩
    12. sum+=a[j][i]; //计算当前科目的总成绩
    13. }
    14. v[i]=sum/5; // 当前科目的平均分
    15. sum=0;
    16. }
    17. average =(v[0]+v[1]+v[2])/3;
    18. printf("Math: %d C Languag: %d English: %d ", v[0], v[1], v[2]);
    19. printf("Total:%d ", average);
    20. return 0;
    21. }

    运行结果:
    Input score:
    80 61 59 85 76 75 65 63 87 77 92 71 70 90 85↙
    Math: 72
    C Languag: 73
    English: 81
    Total:75

    程序使用了一个嵌套循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0]、v[1]、v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。

    二维数组的初始化

    二维数组的初始化可以按行分段赋值,也可按行连续赋值。

    例如对数组a[5][3],按行分段赋值可写为:

    int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

    按行连续赋值可写为:

    int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

    这两种赋初值的结果是完全相同的。

    【示例】求各科平均分和总成绩平均分。

    1. #include <stdio.h>
    2. int main(){
    3. int i, j; //二维数组下标
    4. int sum=0; //当前科目的总成绩
    5. int average; //总平均分
    6. int v[3]; //各科平均分
    7. int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
    8. for(i=0; i<3; i++){
    9. for(j=0; j<5; j++){
    10. sum+=a[j][i]; //计算当前科目的总成绩
    11. }
    12. v[i]=sum/5; // 当前科目的平均分
    13. sum=0;
    14. }
    15. average =(v[0]+v[1]+v[2])/3;
    16. printf("Math: %d C Languag: %d English: %d ", v[0], v[1], v[2]);
    17. printf("Total:%d ", average);
    18. return 0;
    19. }

    运行结果:
    Math: 72
    C Languag: 73
    English: 81
    Total:75

    对于二维数组初始化赋值还有以下说明

    1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:

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

    是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:
    1  0  0
    2  0  0
    3  0  0

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

    赋值后的元素值为:
    0  1  0
    0  0  2
    3  0  0

    2) 如对全部元素赋初值,则第一维的长度可以不给出。例如:

    int a[3][3]={1,2,3,4,5,6,7,8,9};

    可以写为:

    int a[][3]={1,2,3,4,5,6,7,8,9};


    3) 二维数组可以看作是由一维数组嵌套而成的,把一维数组的每个元素看作一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。

    如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0]、a[1]、a[2]。

    对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0], a[0][1], a[0][2], a[0][3]。必须强调的是,a[0], a[1], a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

  • 相关阅读:
    Best Time to Buy and Sell Stock
    Permutations II
    数组中最大和的子数组
    基于Socket.IO的Client封装
    Java中的ThreadLocal功能演示
    基于WebSocket的client封装
    Socket接口开发和测试实践
    自动化测试用例的原子性
    [CF1477C] Nezzar and Nice Beatmap
    [CF1477B] Nezzar and Binary String
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/8533038.html
Copyright © 2020-2023  润新知