最长英文单词串题目分析

题目来源:

这是题目来源

序:

简述一下事情的经过

一天邹欣老师在群里向我提出了一个问题:

“把这个题目分析一下,主要是从工程上考虑,假如50个学生提交了程序,你如何写一个测试的系统,判断对错,和测量学生程序的对错”

一、首先分析一下这道题的核心

最长的能首尾相连的英语单词链,每个单词最多只能使用一次”

这里题目的描述有一点不明确,关于最长题目并没有给出详细定义。

因此可能有两种情况。

单词链中单词数最多

单词链中字符数最多

 

(看到这里我似乎想起了自己一年前是怎么解决北京地铁网络中最短距离与最少换乘的。)

但是不管怎么样,这道题是可以转化成“图”来做的:

  1. 26个字母(不区分大小写),是这个图可能的节点
  2. 每一个单词,实际上相当于一条连接首位字母代表的节点与末位字母代表的节点的边,边的权重即为单词的长度

例:单词“apple”实际上相当于一条连接a点与e点的权重为5(单词长度)的边。

所以,这道题就变成了这样:

  1. 有向图G,可能多重图,可能存在环,无负权边
  2. 每条边有且只能经过一次,求出这个图的“边数最长的路径”或是“边权和最大的路径”

二、这题我会怎么做

从设计的角度来说,程序可以分为以下几个模块

1. 处理命令行参数(命令处理)

2. 读取文件并构建成图 (数据输入与数据转化)

3. 根据一定的算法处理图,得到目标解 (核心代码)

4. 将解按照一定格式写入文件 (输出)

由于这篇博客不是主要谈这个的,所以这里不细说

三、工程化角度的考虑

假如50个学生提交了程序,你如何写一个测试的系统,判断对错,和测量学生程序的对错”

0. 规范化处理

任务:

  • 完成一个输出首尾相接的字母数量最长的英文单词串的命令行程序

需求:

  • 用一个.txt文件存储N个不同的英语单词,一行一个,行内无空格制表符
  • 单词内无英文字母以外的符号如数字、汉字或其他特殊字符
  • 程序在读取输入文件信息时要求能够处理各种异常的情况
  • 使用命令行参数执行程序如:

Wordlist.exe /i input1.txt /o output1.txt

  • 程序最终将得到的结果按序输出到文件,格式与输入文件相同

统一(这里是动词)要求:

  • 开发要求:
  1. 采用统一的IDE开发,采用统一的编程语言实现,并统一运行环境为64-bit Windows 10
  2. 使用Github来管理源码与测试用例
  3. 使用性能分析工具来找出代码中的性能瓶颈并进行改进
  4. (这里罗老师提出考虑是否可以统一接口以保证所有人设计的单元测试可以通用,这里考虑到大家实现的方法可能稍有区别因此不做限制)
  • 博客要求:
  1. 要求写出实现的思路,记录下来遇到的困难与解决的方式
  2. 写出至少10个测试用例确保你的程序能够正确处理各种情况
  • 提交要求:
  1. 提交完整工程的Github链接,便于下载与运行
  2. Github工程中要求包含有可编译运行的代码与编译后生成的.exe文件(github默认不同步.exe文件,应该如何修改?
  • 对批改者的评判要求:
  1. 使用统一的正确测试用例进行正确性测试
  2. 使用统一的错误测试用例进行鲁棒性测试
  3. 正确测试用例通过的程序将进行性能测试
  4. 设立合理的baseline

以表现最优秀的程序作为满分参考线,或

以表现最普通的程序作为及格基础线,或

以平均表现作为85分线

          最终还将综合博客的情况与Github中的提交记录进行评估

          开发时是否将代码的功能进行细分,并按照模块化方式进行开发与提交

        (关于评判标准还有待进一步学习

 

1. 测试用例设计

由于我的想法是模拟成图,因此测试用例就用图的方式描述

  • 测试功能

是否是连通图,图中是否有环,图的规模分别在10条边、50条边、100条边

  • 测试性能

是否是连通图,图中是否有环,图的规模在500条边、1000条边、5000条边、10000条边

  • 测试鲁棒性
  1. 文件为空或只存在空白字符
  2. 文件不为空,出现英文字母以外的字符
  3. 文件不为空,出现一行有多个单词用空格或制表符连接
  4. 错误的命令行参数或增加或缺少参数
  5. 输入文件不存在

(假设我有以上的所有测试用例的.txt文件&&正确用例&&用例对应的答案的.txt文件。。。)

2. 测试方法

使用PowerShell批处理进行文件的批量下载、解压、运行、结果比对

最终目标应该是将以下的功能集成在一起,但由于时间和个人能力所限,暂时只能做成这样。

(假设我有一个这样的.exe测试程序,能够验证运行结果的正确性)

文件的下载:

提交的github链接为一个字符串,在字符串后追加"/archive/master.zip"即为下载链接。

使用如下的命令可下载工程压缩包。

代码来自:代码来自这里

$src = 'https://github.com/ChildishChange/C0-compile/archive/master.zip'
$des = "C:\User\desktop\14061195.zip"
Invoke-WebRequest -uri $src -OutFile $des
Unblock-File $des

 

文件的解压:

代码来自:代码来自这里

Function Unzip-File()
{
    param([string]$ZipFile,[string]$TargetFolder)
    #确保目标文件夹必须存在
    if(!(Test-Path $TargetFolder))
    {
        mkdir $TargetFolder
    }
    $shellApp = New-Object -ComObject Shell.Application
    $files = $shellApp.NameSpace($ZipFile).Items()
    $shellApp.NameSpace($TargetFolder).CopyHere($files)
}
#将zip文件E:\a.zip解压到e:\test,目录
Unzip-File -ZipFile E:\a.zip -TargetFolder e:\test

#其实我觉得可以直接全选右键解压。。。

 

使用批处理指令依次运行所有程序

获得所有程序对正确用例的输出:

for /f "delims=;" %%i in ('dir /b *.exe') do (%%i /i input1.txt /o %%i.txt)

将上一步输出的文件用作测试程序的输入并进行结果比对:

for /f "delims=;" %%i in ('dir /b *.txt') do (judge.exe %%i)

将错误用例的控制台输出重定向到文件分别人工查看:

for /f "delims=;" %%i in ('dir /b *.exe') do ( %%i >> %%i.txt)

 

对性能进行评估:

可以使用命令行工具简单分析程序运行的时间,邹欣老师在博客中给出了一些链接

ECHO Start Measure %Time% >> timer.txt
YOUR COMMAND
ECHO Stop Measure %Time% >> timer.txt

最终决定采用上述方式简单估计程序运行的时间,但是不好之处是只精确到0.01秒

(由于timer.exe与ptime在64位系统上运行会存在较大误差,因此不选用)

因为个人能力问题,没有找到命令行适用的内存占用分析工具,如果以后找到了,将补全博客。

同时个人认为,由于VS2015中提供了十分强大的性能分析工具,因此在性能分析时,可以直接使用而不是自己实现一个。同时也是个人能力问题,只能想到手工运行性能分析工具来对性能进行评估,如果以后能有更好的方法,将补全博客。

其实关于这个问题我有偷懒的想法,由于提交的程序的特殊性,我似乎可以通过一些渠道,联系到管理我校C语言作业的测评网站的老师,申请使用学校的测评系统,完成整个测评流程(我真懒)

 

三、个人感想

  • 需要尽快完成角色的转变,从学生->助教
    • 其实在邹欣老师提出“从工程的角度考虑”之前,我想的更多的还是我将如何实现这个软件,而不是把重心放在考虑设计一个标准的体系,这里需要反思
  • 感谢@罗杰老师与@乾神在我完成这篇博客的期间对我的指点与帮助
  • 恳请批评与指正,谢谢!
  • 微信截图_20170602190334

posted on 2017-07-13 17:47  ChildishChange  阅读(623)  评论(3编辑  收藏  举报

导航