C语言多维数组

yizhihongxing

下面是“C语言多维数组”的完整使用攻略。

多维数组的定义与初始化

在C语言中,多维数组可以用来存储表格或矩阵等数据结构,它由一系列一维数组所组成,因此可以说,多维数组其实就是数组的数组。在定义多维数组时,需要确定它的维数和每一维的大小,例如:

int arr[3][4]; //表示一个3行4列,总共12个元素的二维数组

也可以在定义同时初始化,例如:

int arr[2][2] = {{1, 2}, {3, 4}}; //表示一个2行2列的二维数组,初始值分别为1,2,3,4

需要注意的是,在C语言中,多维数组不一定要求每一维的大小相同,比如可以这样定义一个不规则的三维数组:

int arr[2][3][4] = {
    {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
    {{13, 14, 15, 16}, {17, 18, 19, 20}}
};

多维数组的访问

C语言中的多维数组是通过一维数组来实现的,因此在访问多维数组元素时,需要根据每一维的大小计算出在一维数组中的位置,然后通过数组下标访问,例如:

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int a = arr[0][1]; //访问第1行第2列的元素,结果为2
int b = arr[1][2]; //访问第2行第3列的元素,结果为6

下面以一个三维数组为例,访问其中的元素:

int arr[2][3][4] = {
    {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
    {{13, 14, 15, 16}, {17, 18, 19, 20}}
};
int c = arr[0][1][2]; //访问第1个3维数组中第2行第3列的元素,结果为7
int d = arr[1][0][3]; //访问第2个3维数组中第1行第4列的元素,结果为16

多维数组的传递

在C语言中,多维数组作为函数参数时,需要指定每一维的大小,否则会出现编译错误。例如,如果定义一个函数用来打印二维数组,其参数应该如下:

void printArray(int arr[][3], int rows)
{
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

这样,我们就可以将一个二维数组传递给该函数进行打印了,例如:

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
printArray(arr, 2);

示例说明

下面给出两个示例来说明多维数组的使用。

示例1:使用多维数组求矩阵的乘积

给定两个矩阵A和B,分别为3行4列和4行2列,求两个矩阵的乘积C,即:

     |1 2 3 4|   |5 6|   |? ?|
A =  |5 6 7 8|,  |7 8| = |? ?|
     |9 0 1 2|   |9 0|   |? ?|

首先,定义三个二维数组A、B和C用来存储矩阵:

int A[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 0, 1, 2}};
int B[4][2] = {{5, 6}, {7, 8}, {9, 0}, {1, 2}};
int C[3][2] = {};

然后,使用两重循环,分别遍历A和B矩阵中的元素,把它们相乘后累加到C矩阵对应位置上:

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 4; k++) {
            C[i][j] += A[i][k] * B[k][j];
        }
    }
}

最后,输出C矩阵的元素即可:

printf("%d %d\n", C[0][0], C[0][1]);
printf("%d %d\n", C[1][0], C[1][1]);
printf("%d %d\n", C[2][0], C[2][1]);

输出结果为:

38 44
97 114
46 54

示例2:使用多维数组统计成绩并计算平均分

有5名学生,每人分别参加3门课程的考试,分数如下表所示,请使用多维数组统计每门课程的总分和平均分,并分别输出。

   |语文  数学  英语|
李明| 85   92     78|
王华| 76   85     67|
张强| 90   85     88|
赵丽| 88   79     92|
刘洋| 66   79     83|

首先,定义一个二维数组score用来存储每个学生每门课程的成绩,并初始化它:

int score[5][3] = {{85, 92, 78}, {76, 85, 67}, {90, 85, 88}, {88, 79, 92}, {66, 79, 83}};

然后,定义两个一维数组sum和avg分别用来存储每门课程的总分和平均分:

int sum[3] = {}, avg[3] = {};

接着,使用两重循环,分别遍历score中的每个元素,把它们累加到sum中:

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 3; j++) {
        sum[j] += score[i][j];
    }
}

最后,计算平均分并输出:

for (int i = 0; i < 3; i++) {
    avg[i] = sum[i] / 5;
    printf("%s%d%s%d%s%d%s%d\n", "第", i+1, "门课程总分为:", sum[i], ",平均分为:", avg[i], "。");
}

输出结果为:

第1门课程总分为:405,平均分为:81。
第2门课程总分为:420,平均分为:84。
第3门课程总分为:408,平均分为:81。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言多维数组 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C语言和Python语言的区别

    C语言和Python语言的区别 C语言和Python语言是两种非常不同的编程语言。下面将分别从语法、性能、应用场景等方面介绍它们的区别。 语法 C语言的语法相对来说比较严谨和繁琐,需要手动管理内存、声明变量类型等,这意味着需要更多的代码行数和编程经验。而Python语言的语法则更加简单,语言自带垃圾回收机制、动态类型和强大的标准库,这使得开发人员可以更快速地…

    C 2023年5月10日
    00
  • 实例解析iOS应用多线程开发中NSthread类的用法

    实例解析iOS应用多线程开发中NSthread类的用法 简介 在 iOS 应用的多线程开发中,NSthread 是一种常用的线程处理方式。本攻略旨在讲解 iOS 应用中如何使用 NSthread 类,以实现线程处理。在本攻略中,我们将包含以下内容: NSthread 基本用法 线程间通信的实现方法 两个 NSthread 实例示例说明 NSthread 基本…

    C 2023年5月22日
    00
  • C#实现生成所有不重复的组合功能示例

    生成所有不重复的组合是一项常见的算法问题,可以使用C#编程语言轻松实现。下面是一个完整的攻略: 1. 程序实现思路 生成所有不重复的组合功能的实现思路如下: 创建一个长度为n的数组,数组中存储n个不同的元素。 从数组中选出其中的k个元素,形成一个组合。 从数组中选取下一个元素,生成下一个组合。 重复上述步骤,直到所有组合都被生成。 2. 实现代码 下面是使用…

    C 2023年5月22日
    00
  • C语言选择排序算法及实例代码

    C语言选择排序算法及实例代码 算法介绍 选择排序算法是一种简单的排序算法,它的基本思想是依次遍历数组元素,每次找到剩余元素中的最小值,将其放到未排序部分的最前面。它的时间复杂度为O(n²),空间复杂度为O(1),适用于各种数据规模。 选择排序算法的流程如下: 在未排序序列中找到最小元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小元素,然后放到…

    C 2023年5月30日
    00
  • gdb调试命令的使用及总结

    GDB调试命令的使用及总结 简介 GDB是一个功能强大的调试工具,可以用于调试C程序等各种编程语言。 它可以帮助程序员查找程序崩溃、调查内存问题、跟踪函数调用等问题。 本文旨在提供一些GDB常用调试命令的示例及使用方法,以便于程序员快速定位程序的问题。 命令列表 下面是一些常用的GDB调试命令的列表。 常用命令 命令 描述 run 运行程序 break [f…

    C 2023年5月22日
    00
  • C++深入讲解new与deleted关键字的使用

    C++深入讲解new与delete关键字的使用 在C++中,我们可以通过new关键字动态地分配内存,通过delete关键字释放已经分配的内存。new和delete是C++中动态内存管理的必备工具,掌握它们的使用方法对于C++程序员来说至关重要。 本文将详细介绍new和delete的用法以及注意事项。 基本用法 动态分配内存 我们可以使用new关键字从堆中动态…

    C 2023年5月22日
    00
  • C++实现完整功能的通讯录管理系统详解

    C++实现完整功能的通讯录管理系统详解 本文将详细讲解如何使用C++语言实现一个完整功能的通讯录管理系统,包含联系人的增、删、改、查等基础功能,以及文件读写、界面美化等高级功能,以及如何使用编程技巧提高代码的可读性和可维护性。 程序的需求分析 管理员:管理员需要进行登录和注销操作,并对通讯录进行增、删、改、查等管理操作; 通讯录:通讯录需要记录联系人的姓名、…

    C 2023年5月23日
    00
  • OpenSCA技术原理npm依赖示例解析

    OpenSCA技术原理npm依赖示例解析 OpenSCA是一种开放式的SOAP(简单对象访问协议)组件体系结构,可以用于构建SOA(面向服务的架构)应用程序。OpenSCA技术使用了许多依赖关系,其中包括npm依赖。下面是本文的攻略。 安装Node.js 在开始使用OpenSCA和npm依赖之前,需要安装Node.js。如果您没有安装,请前往Node.js官…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部