基于C语言实现的人机交互软件

任务综述

在数据结构理论课的基础上,进复杂、功能全、有友好交互界的程序设计,分别完成算法实现题以及综合应题。

内容实现概述

使 C++ Qt 框架完成算法实现题中对相关图算法的图形演。

使声明式 UI 框架 SwiftUI 完成综合应题:地铁换乘系统。



算法实现设计说明

题目

  • 邻接矩阵的式确定个图,完成:
  • 建并显出它的邻接链表;
  • 以递归和递归的式进深度优先遍历,显遍历结果,并随时显栈的出、情况;
  • 对该图进度优先遍历,显遍历结果,并随时显队列的出、情况。

软件功能

软件功能分为两部分,交互与算法功能。交互体现了使该软件时能进的操作;算法功能则体现了该软件的实价值。交互采用

C++ Qt 框架,算法功能采 C++14,使量 C++ 特性。

用户交互

先,软件有灵活的界,画上的乎所有显的元素都可由户标拖动,使户根据需求改变画。


其次,该软件有菜单项供户操作,切操作都在菜单项中,没有更多多余的选项,使户乎不需要任何学习成本。

最后,菜单中有丰富的快捷键,使软件的操作简化。(放与缩的操作还能使 Ctrl/Command + 滚轮进,体验然。)

算法功能

该软件在功能实现上完成了题要求,实时显个有向图对应的邻接链表,并完成了深度(递归与递归)、度优先遍历的结果显,同时显结

果以及栈、队列信息。显过程中包含动画效果,对所显的图进实时渲染。

设计思想

该程序的设计体分为三个块。先是算法本的设计实现,包括题所有要求的内部算法实现,以及内部的数据结构,不包含任何图形界;其次是图形显的设计,它代表了图形显,不包含任何算法;最后是者的整

合,实现图形与内部数据结构的同步。该设计思路遵循了种设计模式

(Design Pattern): MVC(Model View Controller)[1]。

Model

数据结构与算法模型采 C++ 编写,量使 C++ 特性如模板

(template),auto,范围 for 循环、C++11 引的智能指针,基本标准库数据结构如 std::vector,级标准库数据结构如 std::deque、 std::unordered_set。

图的定义,它是个顶点存放 Value 类型值的模板:

template<typename Value> struct Graph;
代码简单易懂、有详细注释,思路较为清晰,切 C++ 相关的知识均参
  • 考《C++ Primer》[2] 以及官[3]。算法的设计参考《算法导论》[4]。整个模型分为两个件:
  • Graph.h:图的数据结构,
  • GraphAlgorithms.h:深度优先遍历等图算法。

图的数据结构中包含了所有的图操作,例如添加顶点等操作。图算法通过图操作返回遍历结果、栈或队列的每次更新后的结果,供视图显。结果类型为 SearchResult,是定义类型,能够表达所有视图所需要的信息:

struct SearchResult {// 记录了某种遍历时的下标顺序。std::vector<int> indexOrder;    // 记录了栈、队列的实时信息。std::vector<std::deque<int>> containerCondition;
};

通过下标顺序以及栈、队列的实时信息,返回给视图层进渲染就分容易。

View

视图层使 Qt 作为开发框架,主要运了 Qt 的 Graphics View

Framework[5],该框架能够做到对组件的组合。程序中,图形显的思路就是组合。邻接表是由上到下关于每个顶点的链接显,这样就可以将整个视图作为许多个顶点的链的组合,达到了从到搭建视图的效果。


同样对于栈以及队列,可以看成许多个顶点的组合,并添加外框。

整个程序采组合思路的好处在于组件的重复利,该程序中的顶点在 4 个模块中达到复:图的显、邻接表的显、遍历结果、栈或队列的实时更新。如此来,的图形就可以拆分为个个的部分,降低思维与编写代码的负担。

Controller

控制器是协调视图和模型的枢纽,有了控制器即能达到视图与模型的分离和同步。它的主要任务有两点。先是使 Qt 中的类对模型进再封装,组织接提供给视图层显。其次是对模型与视图的同步,例如户选择清空顶点后,控制器要负责将视图层的顶点清除,同时将模型层的顶点清除。

void clearGraph() {if (isAnimating) {QMessageBox::warning(this, "操作失败", "请等待动画结束后操作");return;}model.reset();graphObject.reset();adjointListGraph.resetFromRaw({});
}

当户点击清空顶点时上述代码触发。代码中进了 3 处 reset,model.reset() 将模型中的顶点全部删除,

graphObject.reset() 将显图中的顶点删除,更新视图,最后代码则清空邻接表视图。如此达到模型与视图同步。

逻辑结构与物理结构

下将讨论 Model 中图模型的数据结构,关于 View 和 Controller 的结果表可参考源代码。

顶点

template<typename Value> struct Graph<Value>::Vertex {
private:friend struct Graph<Value>;Value value;// 邻接表,不会产生循环引用,用智能指针自动销毁,// `std::unordered_set<int>`代表顶点在图中所处的下标而非值    std::shared_ptr<std::unordered_set<int>> adjointList;// ...
}

每个顶点包含了它所需存储的值,这将它定义为模板类型Value。同时,由于整个图采了邻接矩阵的式来存储,每个顶点都会有衍出去的邻接表,在这将邻接表定义为指向序集合的智能指针。

智能指针的作是根据引计数动销毁堆中创建的变量[2],避免内存泄漏。序集合采了散列存储的式使元素唯且插删除达到 O(1)。(可参考 cppreference 中对 std::unordered_set 的介绍[2])该集合的作是存储所邻接顶点在图结构中顶点的下标。(见下)

/// Value should be hashable template<typename Value>
struct Graph {
private:// `Graph<Value>::Vertex`,定义在下方。struct Vertex;std::vector<Vertex> vertices;// 每个顶点值到其所在下标的映射。std::unordered_map<Value, int> valueToIndex;// ...
}

图是个模板类型,它可以任何类型 hashable 的顶点值来实例化。其中存储了两个部分。先是顶点的 vector[2],是个顺序存储的线性表,可以动态插删除元素。其次是个序映射,它从给定的顶点值映射到它在 vector 中的下标,以优化直接通过值(下标)来对图进操作的情况(该应的操作全部基于下标)。

通过顶点形成的动态数组以及每个顶点链接出去的邻接表,个向图的数据结构可以完整表。

开发平台

概述

操作系统:macOS Mojave 10.14.6

编程语:C++14

开发框架:Qt 5.13.0

编译器:clang-1001.0.46.4

IDE:CLion 2019.2(Build with CMake) 运环境上述环境可以直接运可执件。若上述环境则或需重新编译整个项目,需要装有 Qt 环境以及持 C++14 且能够编译 Qt 库的编译器如 MinGW、Clang。系统的运结果分析说明开发具起初我使 Qt Creator 作为开发具,它的好处在于环境已配置,打开即可使,且整合了 Qt Designer 便制作界。然它的代码提以及界友好度都不如 Jetbrains 开发的 CLion。CLion 的代码提功能使我可以根据提目猜测代码功能,在开发过程中减少了阅读档的频率。

配置 CLion 也只需 CMake 代码连接 Qt 类库,分便。唯的不在于对外部具 Qt Designer 等的使会较为烦,但总体体验分良好。

调试

调试段有两种,种是通过设置断点查看变量信息,第种是通过 std::cout、qDebug 语句在 CLion 集成的控制台输出结果。

版本控制系统

本次开发中使了版本控制系统 Git[6] 来保存代码的历史记录。同时使代码托管平台 GitHub 将整个 Git 仓库存储到该络平台中,使代码“有迹可循”。

Git 的使有两,最传统的式是通过 Mac 带的 Terminal,同时CLion 也集成了 Git 和控制台可以便使。


基于C语言实现的人机交互软件相关推荐

  1. C语言五子棋禁手算法的编写,基于C语言的五子棋辅助软件的设计与实现.doc

    基于C语言的五子棋辅助软件的设计与实现 广东工业大学 本科毕业设计(论文) 基于C语言的五子棋辅助软件的设计与实现 系 部 专 业 年 级 班级名称 学 号 学生姓名 指导教师 2012 年 5 月 ...

  2. Auto CAD二次开发:基于VBA语言的画圆软件开发

    本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎关注! 不仅是CATIA软件具有VBA二次开发接口,很多机械设计软件也都具有VBA二次开发接口.本期,就来为大家介 ...

  3. c# 无法加载oraops.dll_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础

    Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发.开发语言同样是基于.NET框架的C#语言或VB语言.Smart组件是Robotstudio软件中实现 ...

  4. 基于C语言的软件,基于C语言的计算机软件编程分析

    摘 要 C语言是在B语言的基础上发展而来,其功能强大,使用便利,是目前计算机软件编程最基础的语言.C语言有着特殊的编程技巧,他的函数库中包含了编程所需的大部分函数,因此不需要程序员再另外定义:C语言中 ...

  5. python软件开发电子产品测试方向_基于Python语言的自动测试系统通用软件平台实现...

    期 No.5 2019 年 3 月 Mar. 2019 收稿日期: 2018-05-06 稿件编号: 201805027 基金项目: 中国电科第十研究所发展基金 ( SSJ-1784 ) 作者简介: ...

  6. linux系统最好的c类语言开发软件,Linux下基于C 语言开发即时通信软件.doc

    Linux下基于C 语言开发即时通信软件 Linux下基于C++语言开发即时通信软件 关键词:聊天软件 文字聊天 Linux平台 C/S架构ICE中间件 Linux-based instant mes ...

  7. c#获取autocad安装位置_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础

    Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发. 开发语言同样是基于 .NET框架的C#语言或VB语言. Smart组件是Robotstudio软件 ...

  8. 基于Web技术的监控组态软件设计

    王文玺, 肖世德, 孟 文, 孟祥印 <script src="http://www.chinaaet.com/cns/templates/activeinc/hits.jsp?inf ...

  9. 基于Erlang语言的视频相似推荐系统 | 深度

    作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) [导语]:作者在上一篇文章<基于内容的推荐算法>中介绍了基于内容的推荐算法的实现原理.在本篇文 ...

最新文章

  1. Oracle根据符合条件的数据循环批量更新
  2. Oracle去除表中重复记录
  3. python文本去重_Python做文本按行去重的实现方法
  4. None用法+连接字符串优先使用join +用format而不是%+区别可变对象和不可变对象(list的深拷贝和浅拷贝)
  5. IT围城,你是想挤进来还是想离开
  6. UVA 11401 - Triangle Counting
  7. C++Primer学习之一引用和指针
  8. 2021电商618生态洞察报告
  9. C#中各种数组的性能比较
  10. CSU-ACM集训-模板-主席树
  11. TCPIP协议详解----TCP/IP基础知识
  12. VBScript教程之一(Hello VBScriopt)
  13. 华尔街持续唱多美股市场,微美全息发布VR设备领涨科技股
  14. 建筑CAD基础设计【2】
  15. 二级计算机合格,计算机二级考试合格的分数线
  16. NBS-Predict:基于脑网络的机器学习预测
  17. C语言——矩阵计算(转置、加法、减法、数乘、乘法)
  18. No matching provisioning profiles found 真机测试问题
  19. 计算机丢失client,FsPiscesClient.dll
  20. TensorFlow ImportError: initialization failed

热门文章

  1. Udesk5.2.7-iOS引入
  2. 百度数据仓库palo使用总结
  3. ios怎么引入masonry_iOS自动布局——Masonry详解
  4. docker加速器添加启动参数报错
  5. Multiple comparison
  6. 股票连续缩量涨停是好是坏?不懂这个问题,你炒股就炒了个寂寞了!
  7. 三个变量存在一个协整方程_Johansen结果显示三个协整关系是什么意思呢?
  8. 仿薄荷健康的滑动卷尺效果
  9. Win10 不识别 SATA 固态硬盘
  10. Qt 如何新建一个弹出式窗口