写在前言:【版权声明】本作品为作者原创,请勿在未与作者联系的情况下随意盗取、抄录文章;作者水平有限,若阅读时发现错误,欢迎向作者留言提问。在此敬谢全体读者!
程序设计导引
数据结构
程序设计导引概述
有几个重要的概念:程序;算法;高级语言
程序
- 程序的概念:计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求(或为帮助用户解决问题的信息化工具。【程序是一个指令序列(或可理解为文档集合)】
- 程序设计语言的概念:用于书写计算机程序的语言。人与计算机打交道时交流信息的一类媒介和工具,由语句(statement)组成。(注:代码需符合语言规范)
- 大致运行过程:程序以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写作的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。一般的,以英语文本为基础的计算机程序要经过编译、链接而成为人难以解读,但可轻易被计算机所解读的数字格式,然后放入运行。(come from 度娘)
算法
- 概念:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。(百度解释)
(Wby暴力解释:算法即解决问题的方法,其可 以自然语言、流程图、程序(编程语言)等形式展现) - 评判算法好坏的因素:
- 时空复杂度
时空复杂度即为时间复杂度与空间复杂度。
(1)顾名思义,一个为时间上的开销,一个是计算机内存空间的开销(简言之:占字节的多少)。
(2)一般的算法不可兼顾两者,鱼和熊掌不可兼得。
例:递归----时间复杂度低、效率高,但是空间复杂度高(一次又一次地为形参开辟内存空间)。 - 计算机的运行范围
(1)硬件(硬盘容量、CPU性能、内存容量等)是否支持、是否在其承受能力范围内、其性能是否达标等等
(2)软件(如操作系统OS)
高级语言
- 计算机程序设计语言经过了从低级到高级的发展过程。
语言处理程序经历了机器语言、汇编语言、高级语言三个层次。
- 机器语言:计算机直接使用的二进制形式的程序语言或机器代码。
- 汇编语言:一种面向机器的用符号表示的低级程序设计语言(助记符) 。相当于机器指令的助记符号,与机器语言很接近。
【以上两者均受机器的限制,通用性不高】 - 高级语言:易被人们理解,完全符号化的程序设计语言
- 计算机只能识别和执行机器语言,高级语言编写的程序(源代码)必须经过“翻译(都是系统程序----编译器或解释器)”才能被执行。
- 编译(编译系统):编译是指在应用源程序执行之前,就将程序源代码 “翻译” 成目标代码(机器语言)。
(1)利:其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。
(2)弊:应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件才能执行,只有目标文件而没有源代码,修改很不方便。
(通常认为C为编译型语言) - 解释程序(python)解释一句执行一句,不产生目标代码。
执行方式类似于日常生活中的 “同声翻译” ,应用程序源代码一边由相应语言的解释器 “翻译” 成目标代码(机器语言),一边执行。
(1)弊:效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器。
(2)利:这种方式比较灵活,可以动态地调整、修改应用程序。
基本的数据结构
- 逻辑结构分为三种线性结构、图形结构、树形结构,其中线性结构的存储结构(即线性表在内存中的体现形式)有数组(顺序存储)与链表(链式存储)
- 逻辑结构:客体在自然环境下的状态,与计算机无关
- 存储结构:存储于计算机内存中的结构,算法基于存储结构(wby暴力解释)【存储时需注意:存储的不仅有数据元素还有他们之间的关系】
- 用途:必要时可以自己封装程序—>引入概念:数据类型
- 数据类型(Data Type):
(1)确定数据类型后即可确定:
• 分得多大空间
• 表示多大范围
• 能做何种运算
(2)两种数据类型:
- 通用、基本的数据类型:数值类型(整型浮点型)、布尔型类型、字符串类型
- 自定义数据类型(即C中的结构体)
可将多种基本数据类型(数据项)组合为一个数据元素,在内存中以第一个数据地址(即起始地址)代表该元素的地址。【因:数据元素里的每一个数据项是连续且递增的】
全体的数据元素称为数据对象;更大:整体数据集
线性结构(1:1)(基本上=>线性表)
线性表(数组、链表)、栈、队列、串。其中栈与队列为操作受限的线性表
线性表(最常用且最简单的一种数据结构)
- 特点(逻辑结构):四个唯一:
- 存在唯一被称为“第一个”的数据元素
- 存在唯一被称为“最后一个”的数据元素
- 除第一个元素以外,所有的数据元素均只有一个‘前驱’
- 除最后一个元素外,所以的数据元素均只有一个‘后继’
- 应用:花名册,关系型数据库等等
线性表的存储结构(或称为物理结构)(数组与链表)
- 认识基本操作:
- 遍历:对每一个元素进行访问并只访问(print)一次
- 插入
- 删除
- 顺序存储结构(一维数组)
(注:上图中“在内存中的地址”为方便起见,自定义为了十进制,但实际上,真正在计算机内部,地址用二进制表示)
- 概念:用一组地址连续的存储单元(字节为最小的存储单元)(存储单元的唯一标识:地址)依次存放(即存放空间连续)(实现了用物理存储位置体现逻辑关系,无需指针)线性结构中的数据元素【实际计算机工作时:由数据线先从内存中读取数据,后将数据传递给地址线】
- 核心:用物理存储位置的关系体现逻辑关系
所有元素都是同一种数据类型,一个元素代表一个(或多个)字节,所有元素必须连续存放(字节相连)。 - 操作原理:确定数据类型后即可确定:
• 分得多大空间
• 表示多大范围
• 能做何种运算
例: * int型:4B(字节)
* 字符型:1B(字符即a,b,A之类)
因 为顺序结构–>知道第一个数据元素的起始地址
–>知道该元素是第几个元素
–>知道其数据类型(int/字符串型/其他)
便可确定该元素的地址
- 优缺点
(1)优点:随机存取、查找方便、节省存储空间
(2)缺点:一般插入、删除需移动(多次赋值变量实现)元素位置(除末尾)——>插入1:移动时遵循后面先动原则,删除则相反
- 遍历的实现:
用下标(=>索引)按照上述操作原理,从头–>尾
注:下标=>索引,但不能画等号,因:下标仅为正数值,而索引正负皆可(正、逆索引)
- 链式存储(分单向、双向链表、循环链表多种,下面仅详细说明单向链表)(链表=>python中的列表)
注:链表=>python,但不能画等号,因:数据类型----链表中的数据项数据类型一点相同,但列表则可不同(其可包含数值型、字符串型、字典、元组、甚至是列表);列表是python封装好的,但其性能非最佳。
- 几个概念:重点是将以下几个概念连接起来,了解结点的结构
(1)结点:数据域2(前)+指针3域4(后)(如上图中的A、B、P、T)【注:数据域与指针域空间必连续】
(2)首元结点(如上图A)怎么找到?
①头指针:仅存放首元结点的指针域
☆②头结点(比较常用):存放首元结点的位置(有数据域和指针域,但数据域为空[如上图中红色背景区域])【引入目的:方便程序员的操作,减少程序员写代码的复杂度】
(3)“^”空指针域
即null(表尾常用到,即:最后一个元素地址域为空)
(4)单链表两种形式(如上图所示)
①第一个为存放完整的链表
②第二个为空链表----代码表示:
if head==null:
print(“这是一个空链表”) - 核心:用指针域显示的体现逻辑关系
操作受限的线性表
栈与队列
栈
顺序栈、链栈
- 逻辑特性:后进先出(LIFO结构)(出入个数不管)【注:不可说成 先进后出!!】(类似糖葫芦)
- 定义:操作受限的线性表(满足四个唯一)
操作受限:限定在表尾进行插入或删除操作
【注:出栈顺序与入栈顺序不一定相同】 - 应用
- 十进制转二进制:除二取余,倒取余数
- 函数:后调用的先返回
- 输入法:增删改
- 存储:顺序栈、链栈----栈顶指针;栈底指针
队列
循环队列、链队列
- 逻辑特性:先进先出(FIFO结构)
- 定义:操作受限的线性表(同上)
操作受限:只能在表头删除,表尾插入
【注:入栈顺序与出栈顺序一定相同】 - 应用
- 软件在CPU中运行(就绪队列的调度算法:先来先服务算法FCFS)
- 打印机(排队)
- 存储:链式存储----队头指针(front);队尾指针(rear)
概念:假溢出----删一个其空间可循环利用
树形结构(1:n)
- 本质:递归
- 认识几个概念:
- 双亲(仅一个前驱)、祖先(符合自然伦理认知:家族谱)
- 左右孩子、兄弟、堂兄弟(符合自然伦理认知)
- 根节点(图中A或1)、叶子结点(无直接后继的结点)
- 深度:树有几层
- 特点:除了根节点后的其他结点 组成了若干互不相交的子树
- 特例:二叉树
- 定义:每个节点max2个树(2个分支:左、右支)
- 关系:显示地左右指针
- 特殊:满二叉树:左右指针全满
n层有2^n-1个结点 - 完全二叉树:标号位置同
min:2^(n-1)
max:2^n-1满二叉树
- 应用:解压缩文件(哈夫曼)
- 存储:补成完全二叉树后存储或遍历;二叉链表:左孩子|数据|右孩子
- 遍历方式:非完全二叉树与完全二叉树分别的遍历方式
图形结构(n:m)
- 几个概念:
- 顶点(也有数据):v1,v2,v3……
- 边(双行道“——”)【无向图】;弧(单行道“——>”)【有向图】;关系图中仅出现边或弧
- 边或弧上的值:权值(或叫代价time or cost or distance)
- 边的数目:度
- 弧①出度:–>
②入度:<–
度数=出度数+入度数 - 带权值的图叫网(无向网或有向网)(上图中下方的两图)
- 存储
顺序不能存,链式存储 - 应用
- 最小生成树算法
- 最短路径问题(电信公司或银行或景区酒店的选址)
- 图的遍历
软件过程
程序设计方法
四种程序设计方法:模块化方法、结构化程序设计方法、面向对象程序设计方法、面向过程程序设计方法
概念:自上而下
【wby暴力解释:自下而上的分解、自下而上的实现】
模式化方法
概念:模块化方法是一种传统的软件开发方法。该方法通常将待开发软件划分为一些功能相对独立的模块,模块与模块之间定义相应的接口,各个模块可以分别单独开发、调试、运行、测试,最后再将多个模块组合起来,进行整体测试,从而完成整个软件的开发。
【wby暴力解释:大问题分解为小模块(内部独立且有功能)---->整合:接口(合作)---->整体:测试】
结构化程序设计方法
• 采用自上而下、逐步求精的设计方法和单入口、单出口的控制结构(下图为常见的三种控制结构:顺序结构、选择结构、循环结构)
• 模块易于识别,每个模块符合单入口、单出口;
• 应该控制goto语句使用
面向对象程序设计方法
- 概念:面向对象(Object Oriented,OO)方法的出发点和基本原则,是尽可能地模拟现实世界中人类的思维方式,使开发软件的方法和过程尽可能地接近人类解决问题的方法和过程。
- ☆它具备四个要点:
– 对象是组成客观世界的基本元素
– 对象是属于某个类7的
– 继承性8
– 消息传递9
- 基本手段:抽象
- 抽象是人类认识问题的基本手段之一,是选择性忽略。抽象的过程,就是对问题进行分析和认识的过程。
- ☆三大特征:
封装(属性----自然属性与行为属性 为内部不可见的整体,进行分类,分装)
继承(对象—>类,同一类的对象具有相同点)
多态(不同对象反应不同---->模块的个性化)
面向过程程序设计方法
wby暴力解释:主要注意步骤,哪一步要干什么,一步一步解决问题。问题求解的过程有唯一确定的代码(一步到位式)。不需模拟人类思维,不用 因人对功能需求的增加 而做出变化。
软件生命周期(软件过程----软件工程)
众多模型,如瀑布模型、RUP、Scrum、Iconix,在此详细介绍一种模型:瀑布模型
瀑布模型:
定义阶段
计划
进行可行性研究
- 技术可行性
- 资金可行性
- 社会可行性
需求分析
- 概念:软件需求分析就是把软件计划期间建立的软件可行性分析 求精和细化,分析各种可能的解法。是确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。
- 软件需求包括三个不同的层次:
业务需求、用户需求和功能需求(也包括非功能求)。 - 工具:
用例图10、包图、类图、序列图、活动图、功能结构图
开发阶段
设计
画图(UML图11)、数据库设计
编码实现 12
软件测试13:
仿真测试、性能测试、稳定性测试、集成测试、接口测试、白盒异常测试、单元测试
维护阶段
部署14:
将软件(网页)放到服务器上
软件维护15
瀑布模型的优缺点
优点
– 为项目提供了按阶段划分的检查点
– 当前一阶段完成后,您只需要去关注后续阶段
缺点
– 在项目各个阶段之间极少有反馈。
– 只有在项目生命周期的后期才能看到结果。
– 通过过多的强制完成日期和里程碑来跟踪各个项目阶段。
– 不适应用户需求的变化
RUP模型
- RUP模型(Rational Unified Process,统一软件开发过程,统一软件过程)是一个面向对象且基于网络的程序开发方法论。
- 因为软件越发复杂,不可能一次性就能把软件做的完整,而RUP可以用迭代开发来更好的应对变化,使软件的实践更加完整。
Scrum模型
Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发。Scrum包括了一系列实践和预定义角色的过程骨架。
ICONIX模型
- ICONIX是尽早进入编码阶段,缩短分析设计周期的软件开发方法
- ICONIX过程是一种以最少步骤实现从用例到代码OOAD[object-oriented analysis and design]方法学,并覆盖了软件过程中所有关键的环节。
写在最后:本篇文章中的所有图片及个别段落出自于河北师范大学软件学院内部资料
1.最后有个空位,向后推进。2.删除一个数据,再插入。3.移动(实际上为多次赋值操作)例:(以python为例)a[6]=a[5], a[5]=a[4], a[4]=20 ↩︎
数据域:存放数据 ↩︎
指针:①本质:后继元素的地址②用途:描述元素间关系 ↩︎
指针域【或叫后继域】:存放下一个结点的地址,以方便查找 ↩︎
插入:找一个结点(生成空间---->数据域+指针域),先把数据存下防止丢失(数据域中),再存下下一个结点的地址(指针域中)【最后一个元素地址域为空(不连续)】
↩︎删除:改 删除结点 前的一个结点 的指针域 即可(一步赋值) ↩︎
类:具有共性问题的对象的集合
引入目的:使代码修改min化(同一类有相同点,可以根据相同点来归类) ↩︎继承性:继承①方法
②属性:自然属性(不变)与行为属性(变化) ↩︎传递命令---->行为 ↩︎
用例图:
↩︎UML图:↩︎
编码实现:
↩︎软件测试:
↩︎部署
↩︎软件维护
表面:
实际其背后:
↩︎
来源:oschina
链接:https://my.oschina.net/u/4301815/blog/4817326