电梯V2.1

GitHub仓库地址

Problem

为程序添加命令行参数(自行利用搜索引擎进行学习)。
写成 .cpp .h 文件分离的形式(大多数同学已经达到)。
继续完善函数分离、模块化思想。
要求程序能够接收命令行输入的参数有如下两种格式:

D:>Elevators.exe D:\input.txt
D:>Elevators.exe D:\input.txt D:\output1.txt D:\output2.txt D:\output3.txt

Elevators.exe是程序编译得到的可执行文件;input.txt是输入文件。在第一种格式中,程序会在输入文件input.txt的目录下创建三个输出文件,文件名分别为output1.txt、output2.txt和output3.txt并存放输出。

在第二种格式中,程序接受更多的命令行参数,从头至尾指定了输入文件的路径和三个输出文件的路径。

以上是基础要求,以下是额外挑战(对自己要求高一点能进步更多哦!)

bonus1:设计错误处理逻辑。用户输入的命令行可能会有错误,例如:参数格式不正确、参数过多或过少、输入文件 input.txt 不存在等等……针对(各种你能想到的)错误情况设计一下合理的错误处理逻辑(提示:例如在返回值中返回指示出现错误的代码,输出提示信息等)。

bonus2:发挥你的想象力,设计更多的命令行参数。


思考过程

这次的电梯题居然如此简单(而且据说是电梯题的终结??),这几天事情又多,作业简单确实开心,感谢助教老师能手下留情让我的鸡儿放天假。
好了废话不多说,直入正题。首先我们知道,main函数里是可以有参数的,即
int main(int argc, char* argv[]);
argc记录参数的个数,而argv[]则存储参数字符串。这样,我们调用程序时就可以让程序知道我要做的事情,使程序运行更加面向用户(最简单的UI界面)。
由于平时使用bush更多,我在设置参数上更加接近Unix参数风格,即

程序 一级命令 (一级命令规则) 一级命令参数 二级命令。。。
注:一级命令规则一般以‘-’符号区分,且一般有默认值,如果用户没有输入或者输入指令不存在则使用默认参数

往我的程序中加入了以下命令:

"-help":查看使用帮助
"run":(一级命令)运行电梯
"view":(一级命令)查看文件
"-c":(二级命令)自定义输出位置
"-d":(一级命令规则)使用分配型DFS算法
"-v":(一级命令规则)使用全局型DFS算法

1、当我输入

./elevator run input.txt

电梯便会从input.txt中获取用户信息并运行电梯

2、然而,用户是至高无上(非常调皮)的,你让他输入小写,但是它有的时候就是喜欢大写。为了避免这种情况导致程序无法正确判断字符串,直接将命令转化为小写即可(暴力出奇迹)。而对于有些用户不小心输错文件名导致文件打不开,也需要判断一下,提醒用户文件不存在。而如果用户没来得及看使用方法,输入了根本不存在的指令,则要输出用户的指令,告诉他这个指令不存在,并且提醒他输入"-help"即可查看简略的使用方法。
有的用户自然不希望文件输出这么刻板(固定文件名,固定生成地址),因此设置了一个二级命令,这个二级命令也用'-'号隔开,即当我输入

./eevator run input.txt -c E:\output1.txt E:\output2.txt E:\output3.txt

程序收到"-c"指令后,先判断参数个数,如果参数个数不满足则返回文件太少,太多同样返回太多(不过好像大多数bush命令都不会管只管前几个)

3、有的时候,面对复杂的文件系统,用户可能不确定要打开的文件是不是他想要的,那么就让文件内容直接打印到终端不是非常方便吗,所以便设置了"view"的指令,直接查看。

4、上篇博客我提到了由于我的疏忽不小心多写了一个算法,我不想浪费它,于是阴差阳错的它成为了一级指令的运行规则。当用户输入

./elevator run -d input.txt
./elevator run -v input.txt

分别会运行分配型DFS算法和全局型DFS算法。而默认情况下则会运行满足上题题意的分配型DFS算法。

收获和总结

在git后发现我貌似把所有参数都小写化了,我发现这个bug后一惊,如果文件名存在大写怎么办。但是在百度和测试后发现了一个惊人的大秘密,NTFS文件系统下的文件名居然不区分大小写。。。好吧这bug看来没必要修。
参数设置的准则应遵循用户为主,将自己看成用户,以用户的眼光去发现问题并尝试解决。任何程序的设计都应以此准则为基础,设计出更加人性化的程序。

End

让程序运行更加面向用户——电梯V2.1的更多相关文章

  1. 电梯V2.0

    电梯V2.0 GitHub仓库地址 Problem 一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层.其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停 ...

  2. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

      BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...

  3. golang获取程序运行路径

    golang获取程序运行路径: /* 获取程序运行路径 */ func getCurrentDirectory() string { dir, err := filepath.Abs(filepath ...

  4. linux下实现在程序运行时的函数替换(热补丁)

    声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享. 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的. ...

  5. 放在NSArray、NSDictionary等容器内的对象Item,Item中的property在程序运行过程中被无故释放

    可能是被释放的property本身是OC对象而它的属性被误写成assign,例如: @interface MyItem : Object @property (nonatomic, assign) N ...

  6. ABAP程序运行锁定

    转自http://www.cnblogs.com/aBaoRong/archive/2012/06/15/2550458.html ABAP 程序运行锁 1. create a Table ZRUNN ...

  7. 孙鑫MFC学习笔记3:MFC程序运行过程

    1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...

  8. Java中内存中的Heap、Stack与程序运行的关系

    堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题:堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动 ...

  9. java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)

    JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: ...

随机推荐

  1. 数据结构08——Trie

    一.什么是Trie? Trie树,一般被称为字典树.前缀树等等,Trie是一种多叉树,这个和二分搜索树.堆.线段树这些数据结构不一样,因为这些都是二叉树.,Trie树除了是一种多叉树,它是一种哈希树的 ...

  2. anaconda安装包找不到

    Anaconda作为一个工具包集成管理工具,下载python工具包是很方便的,直接敲: conda install package_name 1 但是有时候安装一个工具包(如skimage)的时候,在 ...

  3. 20155213 2016-2017-2《Java程序设计》课程总结

    20155213 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我所期望的师生关系 预备作业2:C语言的学习的回忆 预备作业3:小议linux 第一周作 ...

  4. 20155307 2017-2018-3 《Java程序设计》第3周学习总结

    20155307 2017-2018-3 <Java程序设计>第3周学习总结 教材学习内容总结 类相当于是设计图,对象是根据类设计出来的.用class定义,名字叫clothes.可以用ne ...

  5. 2017-2018-1 20155308&20155321&20155330《信息安全技术》实验三——数字证书应用1

    2017-2018-1 20155308&20155321&20155330<信息安全技术>实验三--数字证书应用1 实验目的 了解PKI体系 了解用户进行证书申请和CA颁 ...

  6. U盘装系统流程_U启动

    步骤 (已有装机U盘的前提下,没有则参考U启动制作U盘启动盘详细教程) (这里默认已设置了相关开机设置,若没设置则参考怎么用u盘装win7系统(推荐看)中步骤11-13) 按开机键后,不断按F12(有 ...

  7. 2017-2018-1 20155318《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155318<信息安全技术>实验二--Windows口令破解 一.实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对 ...

  8. 20155321 《Java程序设计》实验五 网络编程与安全

    实验内容 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对 ...

  9. .NET Core单元测试之搞死开发的覆盖率统计(coverlet + ReportGenerator )

    .NET Core单元测试之搞死开发的覆盖率统计 这两天在给项目补单元测试,dalao们要求要看一下测试覆盖率 翻了一波官方test命令覆盖率倒是有支持了,然而某个更新日志里面写着 ["Su ...

  10. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...