C语言基础知识(二)——二维数组
二维数组本质
二维数组本质就是一维数组,只不过**形式是二维**,类似矩阵,使用二维数组表示会更加形象。
二维数组实例
float rain[5][12]; //内含5个数组元素的数组,每个数组元素内含12个float类型的元素,形如5行12列的表格
形式如表1-1所示:
| 第一列 | 第二列 | 第三列 | 第四列 | 第五列 | 第六列 | 第七列 | 第八列 | 第九列 | 第十列 | 第十一列 | 第十二列 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 第一行 | rain[0][0] |
rain[0][1] |
rain[0][2] |
rain[0][3] |
rain[0][4] |
rain[0][5] |
rain[0][6] |
rain[0][7] |
rain[0][8] |
rain[0][9] |
rain[0][10] |
rain[0][11] |
| 第二行 | rain[1][0] |
rain[1][1] |
rain[1][2] |
rain[1][3] |
rain[1][4] |
rain[1][5] |
rain[1][6] |
rain[1][7] |
rain[1][8] |
rain[1][9] |
rain[1][10] |
rain[1][11] |
| 第三行 | rain[2][0] |
rain[2][1] |
rain[2][2] |
rain[2][3] |
rain[2][4] |
rain[2][5] |
rain[2][6] |
rain[2][7] |
rain[2][8] |
rain[2][9] |
rain[2][10] |
rain[2][11] |
| 第四行 | rain[3][0] |
rain[3][1] |
rain[3][2] |
rain[3][3] |
rain[3][4] |
rain[3][5] |
rain[3][6] |
rain[3][7] |
rain[3][8] |
rain[3][9] |
rain[3][10] |
rain[3][11] |
| 第五行 | rain[4][0] |
rain[4][1] |
rain[4][2] |
rain[4][3] |
rain[4][4] |
rain[4][5] |
rain[4][6] |
rain[4][7] |
rain[4][8] |
rain[4][9] |
rain[4][10] |
rain[4][11] |
注:表1-1中每个单元格代表一个元素
示例代码如下:
/***********************************
* @file rain.c
* @author bijiaqin
* @date 2019年12月1日
* @note 二维数组示例,计算每年降水量、平均降水量和五年中每月的平均降水量
* *********************************
*/
#include "stdio.h"
#include "stdint.h"
#define MONTHS 12
#define YEARS 5
int main(void)
{
const float rain[YEARS][MONTHS] = {
{4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
{9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
{7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
{7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}
};
int year, month;
float subtot, total;
for(year = 0, total = 0; year < YEARS; year ++)
{
for(month = 0, subtot = 0; month < MONTHS; month ++)
{
subtot += rain[year][month]; /**< 每一年各月的降水量总和 */
}
printf("%5d %12.1f\n", 2010 + year, subtot);
total += subtot; /*< 5年总降水量 */
}
printf("\n");
printf("The yearly average is %.1f inches. \n\n", total / subtot);
printf("Monthly avergaes: \n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
for(month = 0; month < MONTHS; month ++)
{
for(year = 0; year < YEARS; year ++)
{
subtot += rain[year][month]; /**< 每年总降水量 */
}
printf("%4.1f", subtot / YEARS);
}
printf("\n");
return 0;
}
处理二维数组常用方法
嵌套循环,如示例代码连续两个两层for循环用来计算总降水量和每个月的总降水量。
关于初始化
二维数组初始化通常习惯用**花括号套花括号**,中间用','隔开,如上面代码所示,当然也可以省略里面的花括号,只要保证元素个数正确、按行初始化即可,如:
const float rain[YEARS][MONTHS] = {
4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6,
8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3,
9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4,
7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2,
7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2,
};
有嵌套花括号时,可按照一维数组的初始化规范,某行数组初始化元素不足时其它位为0,不影响当前行其它数组元素;某行数组初始化元素越界则会出错,但同样不会影响其它行数组的初始化。
二维数组延申——多维数组
如三维数组
int triArrays[2][3][4] = {
{
{2, [1] = 8, 4}, /**< 第四个元素位初始化,则默认为0,第二个元素使用下标进行初始化
{1, 2, 3, 4},
{1, 2, 3, 4}
},
{
{2, 3, 4, 5},
{2, 3, 4, 5},
{2, 3, 4, 5}
}
};
多维数组处理方法:
二维数组采用两层嵌套循环,三层采用三层循环,以此类推。
C语言基础知识(二)——二维数组的更多相关文章
- C语言基础知识-数组和字符串
C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
- LeetCode刷题191130 --基础知识篇 二叉搜索树
休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...
- C语言基础知识-运算符与表达式
C语言基础知识-运算符与表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用运算符分类 1>.算术运算符 用于处理四则运算. 2>.赋值运算符 用于将表达式的 ...
- OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- 李洪强iOS开发之OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- C语言基础知识-程序流程结构
C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...
- C语言基础知识-数据类型
C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个. >.数据类型关键字(12个) char,s ...
- C语言中指针和多维数组
指针和多维数组 数组名是特殊的指针 数组是一个特殊的指针,多维数组也是更为复杂的数组,它们的关系是什么样的呢? 我们通过一个简单的例子来比较形象的了解指针和多维数组: int a[2][3]; 这是一 ...
- Golang 入门系列(三)Go语言基础知识汇总
前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...
随机推荐
- Uber是一部无所不在的数字出行物联网
"Uber化"是整合服务产业与智能车联网的知识经济,是数字时代展现个人化生活态度无可逆转的趋势,是新兴数字族群运用数字工具集体分享出行资源的平台. 搭过Uber的消费者,对其服务质 ...
- 谈谈你对vuex的理解
vuex创建公有仓库的插件 1.储存公共状态 2.能够根据事件来修改状态 3.多个组件都需要变化,有机制把这个新的状态通知给所有的组件 vuex中的四个类 1.state 定义需要共享的状态 2 ...
- Bind+DLZ+MySQL智能DNS的正向解析和反向解析实现方法
使用文本配置文件的配置方式结合bind的最新的acl和view特性来实现智能DNS想必很多人已经很熟悉了,使用MySQL数据库来存放zone文件的方式可能也不少.对于两者都熟悉的,实现 Bind+DL ...
- 无向图双连通分量BCC(全网最好理解)
不是标题党,之前我也写过一篇比较全的,但是对于初学者不友好.传送门? 双连通分量(Biconnected component): 1.边双联通 E-BCC 2.点双连通 V-BCC 双 ...
- muduo网络库源码学习————条件变量
muduo里的CountDownLatch类实际上是对条件变量condition进行的封装,既可以用于所有子线程等待主线程发起 "起跑" ,也可以用于主线程等待子线程初始化完毕才开 ...
- 线程池(Java中有哪些方法获取多线程)
线程池(Java中有哪些方法获取多线程) 前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线 ...
- MES系统的模型结构和主要功能(二)
上一节,我们主要说了Mes系统是什么,以及它的特点和难点,本节,再来讨论一下一个合格的MES系统的模型结构和基本功能. 现代工厂的快速发展,对MES系统提出了更高的要求,其必须满足范围广泛的任务要求, ...
- strut2运行流程的详解
虽然现在struts2已经慢慢淡出了视野,但是作为一个老框架,在我看来,学习价值还是有的,多阅读框架源码帮助很大,大家有空的话也可以尝试看看,好了,话不多说,今天的主题就像标题写的那样,主要探究str ...
- 常用中文分词工具分词&词性标注简单应用(jieba、pyhanlp、pkuseg、foolnltk、thulac、snownlp、nlpir)
1.jieba分词&词性标注 import jieba import jieba.posseg as posseg txt1 =''' 文本一: 人民网华盛顿3月28日电(记者郑琪)据美国约翰 ...
- C#MVC通过AJAX调用API方法进行上传下载
//这是写的一个类,具体是上传图片的上传和下载 public class FileResult { public int Code { get; set; } pub ...