当前课程知识点:基于Linux的C++ >  第六讲 复合数据类型 >  6.4 数组(二) >  LinuxCPP0604

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP0604在线视频

LinuxCPP0604

下一节:LinuxCPP0605

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP0604课程教案、知识点、字幕

现在我们看完整的程序

我们要同学们写一个程序

随机成生8个10到99之间的整数

然后保存到我们的数组里边

然后我们把这些元素给它倒过来

我们怎么实现这段代码呢

定义一个数组操纵库

这个库就叫arrmanip

像这样一个库

它对应一个“.h”、 一个“.cpp”这两个文件

在“.h”里边我们将写的

数组操纵库所提供的这一系列接口

因为我们这里边

没有什么数据类型需要公开

我们只有简单的四个函数原型:

GenerateIntegers、ReverseIntegers、

SwapIntegers、PrintIntegers

第一个我要能够生成8个整数

放到这个数组里

第二个我能够把这个数组

给我逆过来 怎么逆呢

这就要涉及到

其中两个数组元素的颠倒

所以我们有一个SwapIntegers

来颠倒数组里边的a[i]和a[j]这两个元素

还有一个PrintIntegers

要能够把这个数组完全打印出来

GenerateIntegers这个我们就不解释了

ReverseIntegers就是要逆这个数组

这个时候它需要双参数

其它附加参数我们不需要的

就int a[], unsigned int n

然后PrintIntegers一样

也是双参数

SwapIntegers呢

因为我们操作的不是这个数组的整体

其实只操作这个数组的

第i号元和第j号元

所以我要传这个数组

另外呢 我传两个

要操纵的元素的下标

i和j

我还要传这个数组元素个数n吗

其实不需要

这就是arrmanip这个库的头文件

也就是它的接口

有了这个接口

我们其实就可以设计主程序

我们要包含arrmanip

我们包含的是自己的头文件 自己的库

所以使用双引号 而不是使用尖括号

然后我们定义了一个宏NUMBER_OF_ELEMENTS

八个元素 然后是

const int lower_bound, const int upper_bound

初始化成10和99

在main函数里边定义一个数组

int a[NUMBER_OF_ELEMENTS]

然后我们生成这个数组的8个元素

生成以后我们就cout

把这个数组输出出来

看看我们实际生成的那8个元素

是什么样子

然后调用ReverseIntegers

把这个数组逆过来 在此之后

我又继续调用PrintIntegers

把这个数组再输出一遍

看看这个数组是不是真地

被我们逆过来了 然后return 0

我们主程序就结束了

这个程序实际上非常清楚

因为接口已经有了

按照接口的格式调用

就能够完成我们的“main.cpp”的主框架

现在难的问题在哪里呢

难就难在这四个函数

到底应该怎么去实现

第一个函数GenerateIntegers

我们已经介绍过了

第二个函数就是ReverseIntegers

我们把a[i]和a[j]这两个元素逆过来

0号元、7号元逆

1号元、6号元逆

2号元、5号元逆

按照这个方式去操作

那我这个程序应该怎么写呢

我要写一个for循环

我颠倒的这俩元素之间

到底有啥规律呢

0号元和7号元 1号元和6号元……

简单一观察你就知道

我要颠倒是这两个元素下标之和

刚好等于我们的元素个数减1

不是八个元素吗

所以要颠倒0号元和7号元

0加7是7

要颠倒是1号元和6号元

1加6是7

所以如果我们要颠倒a[i]这个元素

那么它的相对应的那个元素就是a[n-1-i]

我们找到这个规律

完成这个颠倒就行了

问题在于什么呢

这个for循环呢 i从0开始没问题

中间那个条件表达式你不能写i

你只能写什么呢 i

你如果真写i

我跟你说你这个程序 压根就没颠倒

它真没颠倒吗 不是

它不仅颠倒了

实际上给你颠倒了两遍

它把0号元和7号元颠倒

1号元和6号元颠倒……

它最终还会把6号元和1号元颠倒

7号元和0号元颠倒

也就是说 它倒腾一遍逆过来了

它又倒腾了一遍又逆回去了

做了两次 整个这个数组压根就没变

所以我们在逆的时候

只要到它的数组的一半的位置就OK了

i

因为这个n/2是整数除法

出来的结果就是一个整数

对于这个八个元素的数组

i

所以它操作下标0、1、2、3

正好是前四个元素

一点问题都没有的

我们这一颠倒

所有元素就全部颠倒完成了

如果这个数组很不幸 它是奇数个数

你比如9个元素数组

你9/2的话结果还是4

也就是说它只能完成0、1、2、3

和对应的8、7、6、5完成对调

中间几号元呢 四号元哪

它就没有被对调 那个少一个

一点关系都没有

因为它正好是正中间那个元素

如果对调的话 也是和它自己对调

所以操不操作它 一点关系都没有

至于这个a[i]和a[j]这两个元素怎么对调

我们就完成这个标准的三步互换就完了嘛

然后PrintIntegers打印数组

还是刚才那个样子 双参数

写一个for循环

输出这个数组每一个元素就完了

接下来一个概念就是多维数组

有了刚才那个单维数组的定义

我们可以很自然地把这个数组

给扩充到多维 数学上来讲

它就相当于一个一维的一个向量

那么我们很自然地

就给它扩充到一个平面

它是二维的一个矩阵

然后你还可以很自然地扩充到三维

那就相当于什么

相当于立体的一个数据

更高维的话 我们就只能凭借想象

在现实生活中就很难对应了

多维数组的定义

在我们C++代码里边它就用了

中括号、中括号、中括号

就按照这个方式来定义就完了

你看int a[2][2]

就表示我定义一个2乘2的

一个二维数组

int b[2][3][4]

就定义2乘3乘4的三维的一个数组

多维数组进行初始化的时候

要特别记得 它有两种初始化的方式

像int a[2][3]

你就认为它就是一个6个元素的数组

两行三列 总共是6个元素

像一维数组一样写它

还有一种呢 就是第二种数组化方案

int a[2][3]

这个数组包含几个元素呢

包含两个元素

每个元素是包含三个元素的整数数组

所以第一个元素写{1,2,3}

第二个元素写{4,5,6}

我建议同学们按照第二种方式写

它有什么好处呢

你事实上可以通过一个巧妙的排版

让这个书写的格式

就像数学上的一个矩阵一样

当在计算机内部

保存我们这个多维数组的时候

同学们一定要记得

它同单维数组一样

前边没有任何控制标志

后边没有任何结束标志 都没有

中间绝不会有空格

它就是一个元素 一个元素顺序放

但是我们这是两维呀

所以它就要先行后列

这是一个数组a[0]

它是两个元素的一个数组

所以是a[0][0]、a[0][1]

放完a[0]行放a[1]行

a[0][0]、a[0][1]、a[1][0]、a[1][1]

就按照这个顺序放

我们看这样一个例子

就是测量湖泊的水深

正常情况下我们要在湖泊上面

等距离地打上网格

分别测量每个网格的这个水深

然后就可以描述这个湖泊真实的情况

你看到02号这个网格

它的水深是一米深

然后03号这个网格 水深是2米

我们知道每一个小网格是25平方米

那么我们就数

这个二维数组里边到底有多少个网格

水深是大于0的

它不是湖岸

数出来乘上25平方米

我们就算出来这个湖泊的面积了

然后我们要算出什么呢

就是它的平均水深是多少米

第一 我要知道这个湖泊的面积

第二个呢 我得要算这个湖泊的水深

也就是我们要算这个总水深

累加总水深 除以网格数

我们就能够算出来它的平均的水深

那么我们怎么去实现这段代码呢

对于这道题啊

我们就要定义这个二维的数组

我们刚才x轴的网格数是9个

y轴的网格数是4个

我们定义这两个宏

然后我们定义了这个浮点数的数组

然后是湖的网格的宽度

一开始初始化的时候

湖的这个网格数是0.0

湖区的面积是0.0

然后是整个的湖的总深度是0.0

平均水深是0.0

我定义两个循环变量i、j

然后写for循环

因为我们是二维数组嘛

我要一个一个网格算

对于多维的数组

一定要用一个多重的for循环

两维数组我们往往要用两重的for循环

有时甚至需要三重的for循环去做处理

我们这里面两重就够了

一个for循环 i下标从0开始

i

我去算网格数

这就是每一行的网格 我要算

y是行 x是列

我们算i这一行所有网格数

我要写一个for循环 看它的每一列

j从0开始

j< NUM_OF_X_GRIDS

如果它的湖区的深度

是大于0的(其实我们这里面应该写大于0.0)

那么网格数累加1

第二 整个湖每一个网格的深度

一个一个地累加上去

这个二重的for循环一做完

我就数出来了

这个湖面总共有多少个网格

第二个

在这些网格中所有的水深之和是多少

每个网格的宽度和长度是固定的

五米乘五米嘛

那么有了这个网格数

我立即乘上25平方米

就能得到湖的面积

然后立即就能够得到湖的平均水深

这个水深就是总水深除以网格数

这个就是二维数组处理的方案

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP0604笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。