程序代码阅读与分析 朱雀 2022-01-08 01:29 214阅读 0赞 **《软件工程综合实践专题》第一次作业。** 作业题目:运行别人开发的一个软件或一段程序,简单运行一下他的功能,写下心得体会。 今天从同学那边拿到了她大一小学期编写的代码进行分析。 **1.代码分析** 可以看出该程序是一个由C++语言开发的简易图书馆管理程序,一个功能对应一个函数,还是比较易于理解的,就是编写者在编写代码时,并没有添加注释,虽然是很简单的代码,但我认为也应该标上注释。 在代码编写上,编写者首先创建了类Book,类中包含name(书名)、num(书号)、count(数量)。接着用book类创建了一个包含60个元素的数组,我认为60个元素还是有些太少了,虽然对于这个小程序而言,60各元素是绰绰有余,但如果真要做一个图书管理系统,60是远远不够的,而且对于一个数组的上限而言,可能是会随时更改的,因此我更建议使用\#define。 接着是通过exam()函数判断E:\\\\程序\\\\Project1\\\\ 目录下是否存在book.txt文件,若存在,则读取,不存在,则显示“文件打开失败”。 然后进入程序目录界面,该页面有5个功能组成,分别是订购新书、显示所有图书、借书、还书、图书查询。 1) 订购新书 对应add()函数,用于订购新书,这里的“订购新书”我一开始理解成读者购买图书,看完代码后才发现是图书馆购买新书后的入库登记,“订购新书”易产生误解,因此我认为应该将目录界面的“”“订购新书”改为“新书入库”。该程序在使用者输入“书号”、“书名”、“数量”后,将使用者输入的数据存入先前读取的txt文档中。 2) 显示所有图书 对应search()函数,读取book.txt文件后,将文件中的内容全部显示到屏幕上。 3) 借书 对应borrow()函数,使用者输入书号或是书名后,将库存量减少并储存在book.txt文件中。问题是编写者并没有用if进行比对,使用者输入的书号是否存在于book.txt中就直接将库存量减少了,如果该书本不存在于book.txt中,程序也许就会出现error。 4) 还书 对应back()函数,使用者通过输入书号进行还书,程序将归还图书的数量增加1并存入文件中。 5) 图书查询 对应searchnum()函数,用户输入图书号后,在for循环中不断遍历book.txt文件,直到找到用户输入的书号,如果找到就把flag的值改为1并直接break结束循环,程序读取book.txt中对应图书的数量,并输出在屏幕上;若在for循环中没能找到用户输入的书号,flag的值则不为1,因此进入else,显示“查询错误!”。 **2.测试用例** 该测试用例为黑盒测试用例。假设用户使用的操作系统为win10。 功能描述如下: 1. 用户打开程序后,要求显示登录界面; 2. 用户输入用户名和密码,登录,程序会自动校验,并给出相应提示信息; 3. 如果用户名或者密码任一输入错误,程序会给出给出相应提示信息; 4. 新书订购功能中,输入“书号”、“书名”、“数量”后,程序会给出给出相应提示信息; 5. 显示所有图书功能中,程序会列出全部图书; 6. 借书功能中,使用者借书成功后,图书数量减少; 7. 还书功能中,使用者还书成功后,图书数量增加; 8. 图书查询功能中,输入正确书号,程序会给出给出相应提示信息; 9. 若书号或书名输入有误,程序会给出给出相应提示信息; 表4-1程序测试用例 <table style="width:556px;"> <tbody> <tr> <td> <p>用例ID</p> </td> <td colspan="2"> <p>System-Lib-A1</p> </td> <td colspan="2"> <p>用例名称</p> </td> <td colspan="2"> <p>图书管理系统</p> </td> </tr> <tr> <td> <p> </p> <p>用例描述</p> </td> <td colspan="6"> <p> </p> <p>系统登录;</p> <p>用户名存在、密码正确的情况下,进入系统;</p> <p>页面信息包含:五项基本功能、退出;</p> <p>五项功能正常使用;</p> <p> </p> </td> </tr> <tr> <td> <p>用例入口</p> </td> <td colspan="6"> <p>打开源.exe文件</p> </td> </tr> <tr> <td colspan="7"> <p> </p> </td> </tr> <tr> <td> <p><strong>测试用例ID</strong></p> </td> <td> <p><strong>场景</strong></p> </td> <td colspan="2"> <p><strong>测试步骤</strong></p> </td> <td colspan="2"> <p><strong>预期结果</strong></p> </td> <td> <p><strong>实际结果</strong></p> </td> </tr> <tr> <td> <p>Lib1</p> </td> <td> <p>初始页面显示</p> </td> <td colspan="2"> <p>从用例入口处进入</p> </td> <td colspan="2"> <p>显示“输入用户名”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib2</p> </td> <td> <p>用户名录入-验证</p> </td> <td colspan="2"> <p>输入已存在的用户,回车</p> </td> <td colspan="2"> <p>显示“输入密码”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib3</p> </td> <td> <p>密码-密码录入</p> </td> <td colspan="2"> <p>输入用户对应的密码,回车</p> </td> <td colspan="2"> <p>显示菜单栏</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib4</p> </td> <td> <p>系统登录-成功</p> </td> <td colspan="2"> <p>Lib2,Lib3,回车</p> </td> <td colspan="2"> <p>显示“登录成功”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib5</p> </td> <td> <p>系统登录-用户名、密码校验</p> </td> <td colspan="2"> <p>输入用户名,输入密码与用户名不一致,回车</p> </td> <td colspan="2"> <p>显示“密码错误!”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib6</p> </td> <td> <p>系统登录-用户名、密码校验</p> </td> <td colspan="2"> <p>没有输入用户名、回车</p> </td> <td colspan="2"> <p>显示“未输入用户名”</p> </td> <td> <p><strong><em>无结果显示!</em></strong></p> </td> </tr> <tr> <td> <p>Lib7</p> </td> <td> <p>系统登录-密码校验</p> </td> <td colspan="2"> <p>输入用户名,没有输入密码,回车</p> </td> <td colspan="2"> <p>显示“未输入密码”</p> </td> <td> <p><strong><em>无结果显示!</em></strong></p> </td> </tr> <tr> <td> <p>Lib8</p> </td> <td> <p>订购新书</p> </td> <td colspan="2"> <p>输入书名、书号、数量</p> </td> <td colspan="2"> <p>显示“添加成功”</p> </td> <td> <p><strong><em>显示“文件打开成功”,并显示所有图书</em></strong></p> </td> </tr> <tr> <td> <p>Lib9</p> </td> <td> <p>订购新书</p> </td> <td colspan="2"> <p>输入书名、书号、不输入数量</p> </td> <td colspan="2"> <p>显示“未输入数量”</p> </td> <td> <p><strong><em>无结果显示!</em></strong></p> </td> </tr> <tr> <td> <p>Lib10</p> </td> <td> <p>显示所有图书</p> </td> <td colspan="2"> <p>显示所有图书</p> </td> <td colspan="2"> <p>显示所有图书</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib11</p> </td> <td> <p>借书</p> </td> <td colspan="2"> <p>输入已存在书名</p> </td> <td colspan="2"> <p>显示“借书成功”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib12</p> </td> <td> <p>借书</p> </td> <td colspan="2"> <p>输入不存在书名</p> </td> <td colspan="2"> <p>显示“对不起,该书本不存在”</p> </td> <td> <p><strong><em>显示“借书成功”</em></strong></p> </td> </tr> <tr> <td> <p>Lib13</p> </td> <td> <p>借书 – 图书数量校验</p> </td> <td colspan="2"> <p>输入库存量为0的图书名</p> </td> <td colspan="2"> <p>显示“对不起,该书本库存量不足”</p> </td> <td> <p><strong><em>显示“借书成功”</em></strong></p> </td> </tr> <tr> <td> <p>Lib14</p> </td> <td> <p>还书</p> </td> <td colspan="2"> <p>输入已存在书名</p> </td> <td colspan="2"> <p>显示“归还成功”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib15</p> </td> <td> <p>还书</p> </td> <td colspan="2"> <p>输入不存在书名</p> </td> <td colspan="2"> <p>显示“对不起,该书本不存在”</p> </td> <td> <p><strong><em>显示“归还成功”</em></strong></p> </td> </tr> <tr> <td> <p>Lib16</p> </td> <td> <p>图书查询</p> </td> <td colspan="2"> <p>输入正确书名或书号</p> </td> <td colspan="2"> <p>显示对应书本信息</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib17</p> </td> <td> <p>图书查询</p> </td> <td colspan="2"> <p>输入错误书名或书号</p> </td> <td colspan="2"> <p>显示“查询失败”</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> <p>Lib18</p> </td> <td> <p>退出</p> </td> <td colspan="2"> <p>输入0</p> </td> <td colspan="2"> <p>退出程序</p> </td> <td> <p>与预期相符</p> </td> </tr> <tr> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> </tr> </tbody> </table> **3.出现的问题及改进方案** 1) 一个程序最基本的就是“增、删、改、查”,而我发现改程序并没有“改”的要素,这就导致使用者才错误输入,如错误录入书本后,必须删除并重新添加,这样显得有些过于麻烦了,因此我认为应该添加一个修改的功能; 2) 该程序并没有“清屏”操作,因此在一连续的操作后,屏幕上有许多无用内容,影响视觉,因此我认为应该在某些操作后添加*system("cls");* 进行“清屏”; ![1618330-20190305133121280-1332417208.png][] (因为没有清屏所以很乱) 3) 正如“1.代码解读”中所提到的,“订购新书”易产生误解,因此我认为应该将目录界面的“订购新书”改为“新书入库”; 4) 如“1.代码解读”中所提到的,数组的60个元素可能有些少了,建议使用\#define规定一个数量以便于程序维护时修改; 5) 根据“3.测试用例”中的结果,当没有输入用户名或没有输入密码就回车时,不会有结果产生,这算是编写者考虑不周全,因此我认为应该添加两行代码,使得用户没有输入用户名或没有输入密码就回车时,显示“未输入用户名!”或“未输入密码!” 6) 根据“3.测试用例”中的结果,使用者在借书或是还书时,即使输入不存在的图书名或图书号,也能显示“借阅成功/归还成功”,这明显是一个很大的BUG,是编写者在编写时未考虑到的。我认为应该在用户输入图书名或图书号后,检索book.txt文件中的内容进行比对,若不存在与文件中,就会显示“该图书不存在”; 7) 同样的,根据“3.测试用例”中的结果,使用者在借书时,输入库存量为0的图书书号,也能成功借阅。我认为在减少库存并cout借阅成功前,首先应该用if判断图书的库存数是否>=1,当满足条件时才能成功借阅,else则显示“库存量不足”。 ![1618330-20190305133542314-1837499325.png][] (库存量为0的图书借阅后库存量变为“-1”) **4.心得体会** 这是第一次做这种类型的作业, 虽然平时也会看别人的代码,但对代码做分析还是第一次。C++编写的“XX管理系统”是很基础的东西,本来会觉得在分析代码时会很轻松,毕竟自己在大学中也写过一些类似的东西,可真正在阅读该同学的代码时,还是出现了一些问题。 该同学的代码编写风格与我不太一样,这也是造成我阅读变得有些困难的原因之一,其次是该同学编写代码时为标注释,因此一些函数我在第一次读时产生了误解,在阅读几次后才理解代码的意思。 关于测试用例方面,该测试方法是上周五刚刚学到的,也是我第一次编写测试用例,可能会出现一些小问题,但这也是一次很好的操练。(编写测试用例是因为PPT上这么写的,虽然后来说不用写,但我已经写完了,就放上来了。) 在阅读代码时,我更注重的是代码的分析解读,因此错过了一些程序上的BUG,这些都是在后期的测试中发现的(比如不存在的图书也能借阅的问题等)。我也认识到了这方面的不足,在分析代码时,应该也要考虑各种方面才行。 总之,虽然这次作业还挺麻烦的,再由于对作业理解上的一些偏差,这个作业还是做了很多天的,我觉得我在这次作业中还是学到了很多的。 最后!我想说:大家写代码的时候!一定要写注释!!! 转载于:https://www.cnblogs.com/wenjieding/p/10476166.html [1618330-20190305133121280-1332417208.png]: /images/20211220/c0e5e3b8b2b0439cabfaef20701189aa.png [1618330-20190305133542314-1837499325.png]: /images/20211220/b4012fab350f4e7ea0dd5734c1073a2f.png
还没有评论,来说两句吧...