数据结构实验 - 寻找有向无环图(DAG)中的路径
在一个有向无环图(DAG)中,有节点Vertices,连接两个节点的叫做边Edges,每条边都有权重Weight,指定一个起点,一个终点和X个中间点,用C++编写程序,找出经过所有这些指定点的权重之和的前TopN条路径。需要自己设计图的数据结构,构造相应单元测试用例(可以用GoogleTest),用例要覆盖X为1个或者多个,N为1条或者多条,并能运行通过测试用例。
程序设计
题目已经给出足够多的信息,可以依此直接创建Graph类而无需进行需求分析。类图如下:
图的创建与修改
我希望创建一个尽可能动态的图,这个图可以在任意时候新增或者删除节点,也可以在任意时候增加或者去除某条边,或改变某条边的权重。
使用邻接矩阵来表示图,定义了结构Edge用来表示一条边,定义了结构Path用来表示一条寻得的路径。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849//// graph.hpp// DAG//// Created by 郭帆 on 2023/7/21./ ...
《C++ Primer Plus 第六版》学习笔记3 - 对象和类
系列文章
《C++ Primer Plus 第六版》学习笔记1 - 函数
《C++ Primer Plus 第六版》学习笔记2 - 内存模型和名称空间
-> 《C++ Primer Plus 第六版》学习笔记3 - 对象和类
第十章 - 对象和类
OOP特性:
抽象
封装和数据隐藏
多台
继承
代码的可重用性
过程性编程和面向对象编程
这里课本讲的比较抽象,大象书上讲的统一过程给了我非常大的启发:利用统一过程的思想,逐步提取出分析模型,提炼出对象和类。
抽象和类
结构的默认访问类型是public,而类为private。
其定义位于类声明中的函数都将自动成为内联函数。当然在类声明之外使用inline关键字也可以。
典型的类声明的格式如下:
123456class className {private: data member declarationspublic: member function prototypes};
类的构造函数和析构函数
两种使用构造函数来初始化对象的方式:
显式地调用构造函数:Stock food = Stock(& ...
《C++ Primer Plus 第六版》学习笔记2 - 内存模型和名称空间
系列文章
《C++ Primer Plus 第六版》学习笔记1 - 函数
-> 《C++ Primer Plus 第六版》学习笔记2 - 内存模型和名称空间
《C++ Primer Plus 第六版》学习笔记3 - 对象和类
第九章
单独编译
头文件中常包含的内容:
函数原型
使用#define或const定义的符号常量
结构声明
类声明
模板声明
内联函数
使用如下结构防止头文件被多次编译:
123456#ifndef COORDIN_H_#define COORDIN_H_// place include file content here#endif // COORDIN_H_
不同的编译器,名称修饰可能不一样,所以不同编译器编译的二进制模块可能无法相互链接。
存储持续性、作用域和连接性
自动存储持续性
静态存储持续性
线程存储持续性
动态存储持续性
新的定义隐藏了(hide)以前的定义,新定义可见,旧定义暂时不可见。在程序离开该代码块时,原来的定义又重新可见。
自动变量存储在栈中。
C++11之后register关键字只是显式地指出变量时自动的。
静态存储持续性 ...
《C++ Primer Plus 第六版》学习笔记1 - 函数
系列文章
-> 《C++ Primer Plus 第六版》学习笔记1 - 函数
《C++ Primer Plus 第六版》学习笔记2 - 内存模型和名称空间
《C++ Primer Plus 第六版》学习笔记3 - 对象和类
第七章 - 函数
函数基本知识
在C++的函数原型中,函数括号为空与在括号中使用关键字void是等效的——意味着没有参数。在ANSI C中,括号为空意味着不指出参数——意味着将在后面定义参数列表。如果需要在C++中表达此含义,需要使用...,即void say_bye(...);
函数参数和按值传递
C++通常按值传递。
cin>>会跳过空格和换行,但cin.get()会读取所有的输入字符。
函数和数组
C++将数组名解释为其第一个元素的地址,但该规则也有一些例外:
数组声明使用数组名来标记存储位置
对数组名使用sizeof将得到整个数组的长度(单位字节)
将&作用于数组名时,将返回整个数组的地址(一个内存块)
当且仅当作用于函数头或函数原型中,int *arr和int arr[]的含义是相同的。
传数组给函数集传数组指针,不违反C ...
运筹学 - AHP层次分析法
层次分析法(The analytic hierarchy process)简称AHP,在20世纪70年代中期由美国运筹学家托马斯·塞蒂(T.L.saaty)正式提出。它是一种定性和定量相结合的、系统化、层次化的分析方法。由于它在处理复杂的决策问题上的实用性和有效性,很快在世界范围得到重视。它的应用已遍及经济计划和管理、能源政策和分配、行为科学、军事指挥、运输、农业、教育、人才、医疗和环境等领域。——层次分析法 - MBA智库百科
对于一个复杂的系统来说,直接对比每一套方案的优劣是一件很困难的事情。定性尚且困难,更不用说定量确定“方案一比方案二优秀百分之多少”这样的命题了。
这种场景下层次分析法就能很好派上用场,它的原理是将对于方案的评价分层分解为不同的指标,再利用经验或者求助专家对各个指标进行评分,最终通过计算可以得出不同方案的权重,利用该权重就能对方案有定量的比较了。
疑问有很多,我们带着以下几个主要的问题来学习AHP:
“分层分解为不同的指标”是怎么回事?
“对各个指标进行评分”,一旦指标数量过多,指标与指标之间如何定夺其重要性?是否会导致结果过于主观?
“通过计算得到权重” ...
高德地图API使用 - 定位以及路径(安卓版本)
大四的时候,主要是两个项目在并行:
毕业设计,需要制作一台自动配送快递的小车
如何自动配送呢,我们设计的系统是有一个 APP,快递员在存放快递到小车的储物箱时,可以通过APP设置小车的终点。APP 会自动计算出路径,并上传至服务器。高德地图 API 有足够的能力完成这个工作。
CPS 碳排放监控项目,需要制作一整套施工工地碳排放监控系统
其中有一个功能是需要实时监控运输车的位置,记录其运行路径并换算出碳排放数值。我们设计的系统是制作一款手机 APP,司机将其安装至手机上,手机随着司机和运输车的运动通过高德地图 API 记录好路径数值。
TODO 由于 CPS 项目交付时只交付了源码,没有留下图片,并且 CPS 项目所使用的服务器现在已经没有续费了。等有时间搭起安卓开发环境再完善这篇文章。
API Key
定位
路径规划
在地图上放置图标
在地图上绘制线条
使用 WPF 制作一款带高亮和过滤功能的串口工具
20 年的时候,因为信息安全和软件付费之类的原因,原本部门里面用的串口工具被集团加进了黑名单。尝试了网上可以下载到的一些小串口工具,发现要么是使用习惯不合适,要么就是日志记录功能不能满足要求,降低了组内人员的开发效率。
于是萌生了自己开发一款串口工具的想法,由于我之前有帮部门重构 WiFi 模组串口上位机的经验,我自然是完成此工作的最佳人选。加上自己对于原先的“采集日志”和“分析日志”得用两个软件这种工作模式感到非常不自然,所以花了几天的时间完成了这个软件。
写这篇文章最主要的目的是回忆我在使用 WPF 开发 Windows APP 时的一些小技巧,不会事无巨细地讲解该软件的代码,软件实现较为简单,只是业务代码的堆叠,我的实现并不能作为典型。
项目代码在此链接:https://github.com/DovierQAQ/LogTool
开发时间较短,代码质量可能不够高,又因为我已经不从事嵌入式相关的工作了,使用该工具的频率变低。不过工具的价值是我非常认可的,所以欢迎各位参与改进代码。
可动态调节的界面
由于软件使用时不同时间我们关注的地方不一样,让元素可以被拖拽改变大小是一个不错的 ...
GAMES101笔记 - Shading(着色)
系列文章
GAMES101笔记 - Resterization(光栅化)
-> GAMES101笔记 - Shading(着色)
GAMES101笔记 - Geometry(几何)
Blinn-Phong Reflectance Model
分为三部分:
Specular highlights
Diffuse reflection
Ambient lighting
L=La+Ld+Ls\it{L = L_a + L_d + L_s}
L=La+Ld+Ls
定义如下量(都是单位向量):
l\mathbf{l}l: shading point 指向光源的方向
n\mathbf{n}n: 法线方向
v\mathbf{v}v: shading point 指向观测点方向
Diffuse Reflection
考虑一个 shading point 接收到了多少能量,与法线和光照方向的夹角大小(n⋅l\mathbf{n · l}n⋅l)有关
光线能量有衰减:I′=Ir2I' = {I \over r^2}I′=r2I
不同表面吸收不同颜色的光线能力不同:kdk_ ...
Julia编程语言
TODO 由于Julia非常新,并且一直在更新,所以20年写的代码现在复现时会有环境问题,等有空了再继续写
20年的时候,由于工作需要,有编写一些脚本。包括自动编译脚本、日志分析脚本、证书生成脚本等。其中有些使用SHELL脚本实现,有些用Python编写。
但我都感觉没有完成地很漂亮:
一方面SHELL因为其通用性,对代码文件的处理比较暴力,如果后续修改代码的同事不知道哪些代码被自动编译脚本使用了,擅自修改的话,编译不通过都是小事,文件有可能被自动编译脚本改得乱七八糟。
另一方面Python这边有着Python2和Python3的混乱,导致维护旧的脚本得遵照Python2的规范;而且由于做嵌入式需要在不同平台来回转,Python的缩进式代码被几个编辑器保存过很有可能就乱掉了,非常不优雅。
可以吐槽的点还有很多,不过这篇文章主要是介绍我如何发现Julia语言并且用这个语言做了一些什么好玩的事情。
初识Julia
去了解了一下有哪些之前没有接触过的比较新的编程语言,相中了Rust和Julia。
先去学习的是Rust语言,这个语言很好,主打内存安全,如果学习熟练了用来做一些系统程序会 ...
算法设计与分析 - 实验3 - 二叉查找树、红黑树的基本操作实现
实验3 二叉查找树、红黑树的基本操作实现
实验要求:
实现下列关于二叉查找树、红黑树的判断、构建、删除等操作。并写出这些操作的流程图或伪代码。
请说明二叉查找树和红黑树的区别以及时间、空间性能。
Pro1:Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
Both the left and right subtrees must also be binary search trees.
对应力扣题:98. 验证二叉搜索树
基本思路
由于BST的前两条性质,所以当遍历到某一个节 ...