zoukankan      html  css  js  c++  java
  • 让程序运行更加面向用户——电梯V2.1

    #电梯V2.1 >[GitHub仓库地址](https://github.com/Ace-Monster/elevator)

    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

  • 相关阅读:
    C语言scanf函数转换说明表及其修饰符表
    C语言printf函数转换说明表及其修饰符表
    JAVA中this和super用法
    JAVA构造器,重载与重写
    初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明
    webpack4.0报WARNING in configuration警告
    chrome开发者工具--使用 Network 面板测量您的网站网络性能。
    随笔记录--Array类型
    PXC(percona xtradb cluster)新加节点避免SST的方法
    pt-online-schema-change原理解析
  • 原文地址:https://www.cnblogs.com/Ace-Monster/p/9094421.html
Copyright © 2011-2022 走看看