基于C语言设计的换乘指南打印系统

题目

上海的地铁交通络已经基本成型,建成的地铁多条,站点上百个,现需建个换乘指南打印系统,通过输起点站和终点站,打印出地铁换乘指南,指南内容包括起点站、换乘站、终点站。

  • 图形化显地铁络结构,能动态添加地铁线路和地铁站点。
  • 根据输起点站和终点站,显地铁换乘指南。
  • 通过图形界显乘车路径。

软件功能

在综合应题中,编程语以及开发框架都与算法实现题不同。编程语改为 Swift,开发框架改为 WWDC 2019[7] 中发布的 SwiftUI。

在算法实现题中已经基本实现了图的数据结构以及各种操作,在这经验的基础上第题在算法功能的实现上只需将代码进编程语上的迁移,

Swift 是个极具表达性、现代化、语法优美的静态类型语,因此迁移作很简单,代码量也相应减少。

在迁移代码的基础上,还增加了对最短路径算法的编写,这算法返回系列坐标对来表条真实的最短路径。

整个程序的重点,就是 SwiftUI。

SwiftUI

SwiftUI 是种声明式的 UI 框架,声明式使得代码与界达到了同步,举个例如下,上是代码(很简单),下是界。

VStack 中的 V 代表 Vertical,即垂直。

HStack 中的 H 代表 Horizontal,即平。

Spacer 则代表个很的空区域。

下的代码分别将两组字平显,再将他们组织到垂直区域,其中包含个 Spacer(相应颜的代码与相应颜的框选区域吻合,框选区域为动添加为了演效果)。

struct ContentView: View {
var body:some View {VStack {HStack {Text("我是魏宇翔")Text("我的学号是1750222")}Spacer()HStack {Text("我在同济大学")Text("我的专业是计算机")}}}
}

用户交互

先,该 app 将所有的操作(除了通过势的些操作)都集成在了个悬浮菜单栏中,户可以摸索,简单易懂。悬浮菜单栏可以由显、隐藏,这使屏幕利率增。


由于机的特殊性,势操作对户交互的体验提升很。该 app 包含了地图指捏合缩放势,单拖拽移动地图势。同时,长按个顶点会显或隐藏该顶点代表的站点名。将地图稍微放,指从任意站点开始拖拽,拖拽的的地就是新增的站点的地,新增的站点名在菜单栏中。


设计思想

该 app 的设计思路与算法实现题的设计思路有所差别,并不采 MVC 架构,采的是 MVVM(Model View ViewModel)设计模式。它的数据通信式如下所。

其中 Model 是整个数据模型,作为具。ViewModel 则是整个视图的抽象表,它代表了整个视图,同时通过绑定将其绑定到视图中的组件中。户直接操作视图,视图的改变动改变绑定到的 ViewModel 中的相应数据,ViewModel 的改变则继续对 View 进同步。

SwiftUI 作为声明式 UI 提供了切 MVVM 所需要的具如 @Binding、@State、@ObservedObject 等 attributes。通过声明式语法快速构建 View,并将 ViewModel 通过这些 attributes 绑定到 View 中,个 app 就完成了。为了更好的阐述这理念,下举个例。

struct ContentView: View {@State var toggleIson = falsevar body:some View {VStack {Toggle(isOn: $toggleIson) {Text("显示文字")}.padding()if toggleIson { Text("我真难。。计算机好累")}}}
}


这段代码的 ViewModel 就是 @State var toggleIsOn: Bool 这个布尔变量,它没有 Model。这个变量通过 Toggle 中设计的某个 Binding 绑定到了视图上,视图上切换键(toggle)的改变直接会改变被绑定数据,即 toggleIsOn 这个变量。切换键绿的时候该变量为 true,切换键灰时该变量为 false。这个变量的真假直接影响字是否显,从同步给这个 View。这就是 MVVM 架构的数据流。(SwiftUI 中 @State 与 @ObservedObject 理念相同,但@ObservedObject 更适合于完整的较的 ViewModel, @State 适合于布尔变量等型数据。)

数据结构

与算法实现题相同,仍然采邻接表。采邻接表的理由先是地铁线路属于稀疏图,乎站点之间除前后两站不会直连,同时考虑到机 app 对存储的要求采了邻接表邻接矩阵。

算法设计

算法采了没有优化的 Dijkstra 算法,复杂度为 O(n2)。设计思路他,参考算法导论[4]。

App 设计

整个 app 的 Model 就是邻接表表的图;ViewModel 则是使 Model 并对视图进抽象。在此主要讨论 View 的设计。

SwiftUI 中的切东西都是个 View,更准确的说它们都遵循 View 这个协议,Swift 是个向协议的编程语[8]。这些视图均有着度组合性,定义视图只需要遵循该协议并实现其中 var body: some View { get } 即可。因此整个 app 的设计思路就是不同板块的组合:显界、选择菜单、地铁站、地铁线路……

逻辑结构与物理结构

与算法设计题相同,此处仅讨论 Model 的数据结构。

站点

/// Model for a station struct Station {    var name: String    var position: CGPointstatic func distance(_ lhs: Self, _ rhs: Self) -> Double {let deltaX = lhs.position.x - rhs.position.x       let deltaY = lhs.position.y - rhs.position.yreturn sqrt(Double(deltaX * deltaX + deltaY * deltaY))
}
} extension Station:
Codable {}

个站点有两个信息,名字和位置,因此它有这两个属性。同时,定义了个静态法计算两点间的距离。最后的 extension 使站点遵循 协议,便外部 JSON 数据的导。

地铁图

/// Data model for subway graph struct SubwayGraph: Codable {
/// 邻接边对应的顶点下标和距离
struct ArcNode: Hashable, Codable {
var index:
Int       var distance:Double
}
private(set) var vertices = [Station]()    private(set) var arcs = [Int: Set<ArcNode>]()/// 站点名到它所在下标的 mapprivate(set) var stationToIndex = [String: Int]()/// 起点与终点的坐标对struct StationPair: Codable {var start:CGPoint       var destination:CGPoint}/// 所有线路的起始和终点坐标
private(set) var subwayLines:
[StationPair] = []// ...
}

地铁图的数据结构与算法实现题中图的数据结构相似,不同点在于,先在邻接顶点的属性中增加了 distance 表距离,其次添加了 subwayLines 这个属性来表所有连接好的边的起始与的顶点,便视图显。

开发平台

概述

操作系统:macOS Mojave 10.14.6

编程语:Swift 5.1

开发框架:SwiftUI

编译器:Apple Swift

IDE:Xcode Version 11.0 beta 6 (11M392R) 运行环境。

上述环境可以构建并运该 app,通过 Xcode Simulator。可以模拟出各种Apple 设备。

其它 macOS 环境下能否直接运可执程序 simulator 未知。

发版 iOS 13、发版 Xcode 11 放出后可以直接 build 到 iPhone、iPad 上。

若有 iOS 13 beta 版的设备也可以直接使上述环境 build。

SwiftUI 跨家平台,因此该 app 稍作修改即可变成 macOS、tvOS、 watchOS 的 app,下是源码未经修改直接添加到新的 tvOS 项后的结果。

因为 SwiftUI 的布局系统适应不同的 OS,因此显效果正常(但有些功能如拖动势法使)。

系统运结果分析说明开发具开发具采了 Xcode 的 beta 版本。由于 SwiftUI 的年龄才不到 3 个,正式投产还需要段时间,因此相关具链也只有测试版才持。同时,具链中包含的 Swift 5.1 版本的编译器也未正式发。若对 Swift 感兴趣可以参考 。

总体来说测试版的使还是很不错的,很少发崩溃现象。同时 Swift 5.1 的新特性加上 SwiftUI 也使代码能够更加放飞。

数据获取

整个上海地铁站的数据获取主要通过,经过刻铭的操作

将它转换为 JSON 件。


这个 JSON 件最终的操作于初始化每条地铁线的所有起点到终点的站点数组。

let stationGroups:[[Station]] = load("subwayData.json")

通过这个数组再导到 ViewModel 中。具体可以参照源件DataHandler.swift。

正确性

地铁线路图经过经纬度到平坐标的转换能基本达到预期效果。

现在查询从嘉定校区到四平校区的路线

可以看到图中清晰的红线路,长按顶点显站点名,发现线路符合预期。

动态添加顶点通过滑动势,先在菜单中选择新增的站点名,再拖动到所要添加的位置,可以成功准确添加。

在此基础上添加 YuXiang Road 到昌吉东路的线路(动态添加线路是单向添加)。

添加完线路后再观察 YuXiang Road 到同济学站的最短路线,发现结果正常。

此处的地铁黄线路的显是刻意为之,实际可以通过个 toggle 切换是否显。最短路径也是如此,均有很赞的动画效果。


稳定性

emmm ,还可以。10% 左右的概率 app 会在中途莫名 crash。但总体来说稳定性还是可观的。

容错能

从输选择度避免了异常输。同时若户选择了重名的顶点添加则不会成功,因为采数据结构就是根据站点名来区分站点的 ,若名字相同则站点法区分。还有,如果添加了同样的线路,因为邻接点了集合的形式,所以集合中插同样的值不会改变集合,因此在数据结构的度上就避免了重复添加线路的情况。

版本控制系统

本次开发中使了仍然使了 Git[6] 与 GitHub。

Git 的使同样有两,Terminal、Xcode 集成。


基于C语言设计的换乘指南打印系统相关推荐

  1. 基于C语言设计符号表

    基于C语言设计符号表 c-语言的语法描述 系统设计 符号表的实现 符号表采用了哈希表的形式,可以方便地查找.插入和删除,但是问题也随之而来,就是符号的作用于较难跟踪.很有可能同一名称的变量在不同作用于 ...

  2. 基于C语言设计的小型图形软件系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85648846 资源下载地址:https://download.csdn.net/downl ...

  3. 基于C语言设计的学籍管理系统

    基于C语言设计的学籍管理系统 系统意义以及主要功能: 本系统能对学生学号,姓名,所在系,班级这些基本信息进行管理,并具有以下功能: 具有学生信息输入功能 具有学生信息删除功能 具有学生信息修改功能 具 ...

  4. 基于JAVA游戏论坛设计计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA游戏论坛设计计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA游戏论坛设计计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  5. 基于C语言设计的像素小鸟小游戏

    资源下载地址:https://download.csdn.net/download/sheziqiong/85672935 一.设计目的 掌握定义函数,并熟练使用各函数 实现各函数模块的调用 学会将静 ...

  6. 基于微信小程序的校园自助打印系统小程序

    文末联系获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:ecl ...

  7. 【毕业设计系列】033:基于MATLAB语言的实时变声器系统【含Matlab源码】

    Date:2022.5.5 文章目录 前言 1.算法原理 2.实现效果 2.1.男声变女声 2.2.女声变男声 2.3.男声变大叔声 3.部分matlab代码实现 前言 在大学毕业设计中,要求实现一个 ...

  8. 【毕业设计/Matlab系列】基于MATLAB语言的实时变声器系统

    Date:2022.5.5 文章目录 前言 1.算法原理 2.实现效果 2.1.男声变女声 2.2.女声变男声 2.3.男声变大叔声 3.部分matlab代码实现 前言 在大学毕业设计中,要求实现一个 ...

  9. 基于C语言设计的俄罗斯方块小游戏(VS2017运行)

    (1)俄罗斯方块起源 <俄罗斯方块>(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏.        该游戏曾经被多家公司代理过.经 ...

最新文章

  1. 高可用集群之分布式文件系统
  2. html5添加随机率,HTML5 canvas  绘制随机曲线 并实现放大功能
  3. html电池百分比,显示电池百分比在哪设置
  4. 美团酒店Node全栈开发实践
  5. 28 PP配置-生产车间控制-工序-定义报工屏幕默认值
  6. Linux中如何打开trn文件,如何通过trn日志文件恢复SQL Server
  7. 人力资源社会保障部关于公布国家职业资格目录的通知
  8. 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法
  9. String 将GBK转UTF-8
  10. VMware 虚拟机安装
  11. 重磅!2022年JCR正式发布(附最新影响因子详单)
  12. matlab 保存.fig文件后无法保存的问题
  13. 小程序调用腾讯视频插件
  14. Thinkphp 5.0实战 仿百度糯米开发多商家电商平台
  15. java populate_BeanUtils.populate()的用法
  16. [内网渗透]—GPO批量控制域内主机
  17. kafka文档(3)----0.8.2-kafka API(java版本)
  18. 中国人工智能公司十强排行榜新鲜出炉
  19. MFRC522使用、设计心得及详细教程资料
  20. 【数据结构】复数的建立、求和、求积、求其实部虚部

热门文章

  1. 文档是怎么在线翻译的?
  2. uwp如何建立任何形状的头像,如圆形,方形,六边形等
  3. OCR文字识别在教育行业的贡献
  4. 短线抄底+优化源码指标
  5. 等离子表面处理设备市场调研报告-主要企业、市场规模、份额及发展趋势
  6. 在业务高峰期拔掉服务器电源是一种怎样的体验?
  7. Android开发实战《手机安全卫士》——2.“设置中心”模块实现 自定义组件 Sp工具类 MD5加密
  8. 双十一销量预测_最强预估:几个指标倒推双十一数据
  9. java8新特新学习笔记
  10. 1.平台介绍:FISCO BCOS 区块链