程序代码阅读与分析

《软件工程综合实践专题》第一次作业。

作业题目:运行别人开发的一个软件或一段程序,简单运行一下他的功能,写下心得体会。

今天从同学那边拿到了她大一小学期编写的代码进行分析。

 

 

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程序测试用例

用例ID

System-Lib-A1

用例名称

图书管理系统

 

用例描述

 

系统登录;

用户名存在、密码正确的情况下,进入系统;

页面信息包含:五项基本功能、退出;

五项功能正常使用;

 

用例入口

打开源.exe文件

 

测试用例ID

场景

测试步骤

预期结果

实际结果

Lib1

初始页面显示

从用例入口处进入

显示“输入用户名”

与预期相符

Lib2

用户名录入-验证

输入已存在的用户,回车

显示“输入密码”

与预期相符

Lib3

密码-密码录入

输入用户对应的密码,回车

显示菜单栏

与预期相符

Lib4

系统登录-成功

Lib2,Lib3,回车

显示“登录成功”

与预期相符

Lib5

系统登录-用户名、密码校验

输入用户名,输入密码与用户名不一致,回车

显示“密码错误!”

与预期相符

Lib6

系统登录-用户名、密码校验

没有输入用户名、回车

显示“未输入用户名”

无结果显示!

Lib7

系统登录-密码校验

输入用户名,没有输入密码,回车

显示“未输入密码”

无结果显示!

Lib8

订购新书

输入书名、书号、数量

显示“添加成功”

显示“文件打开成功”,并显示所有图书

Lib9

订购新书

输入书名、书号、不输入数量

显示“未输入数量”

无结果显示!

Lib10

显示所有图书

显示所有图书

显示所有图书

与预期相符

Lib11

借书

输入已存在书名

显示“借书成功”

与预期相符

Lib12

借书

输入不存在书名

显示“对不起,该书本不存在”

显示“借书成功”

Lib13

借书 – 图书数量校验

输入库存量为0的图书名

显示“对不起,该书本库存量不足”

显示“借书成功”

Lib14

还书

输入已存在书名

显示“归还成功”

与预期相符

Lib15

还书

输入不存在书名

显示“对不起,该书本不存在”

显示“归还成功”

Lib16

图书查询

输入正确书名或书号

显示对应书本信息

与预期相符

Lib17

图书查询

输入错误书名或书号

显示“查询失败”

与预期相符

Lib18

退出

输入0

退出程序

与预期相符

             

 

 

3.出现的问题及改进方案

1)       一个程序最基本的就是“增、删、改、查”,而我发现改程序并没有“改”的要素,这就导致使用者才错误输入,如错误录入书本后,必须删除并重新添加,这样显得有些过于麻烦了,因此我认为应该添加一个修改的功能;

2)       该程序并没有“清屏”操作,因此在一连续的操作后,屏幕上有许多无用内容,影响视觉,因此我认为应该在某些操作后添加system("cls"); 进行“清屏”;

    (因为没有清屏所以很乱)

3)       正如“1.代码解读”中所提到的,“订购新书”易产生误解,因此我认为应该将目录界面的“订购新书”改为“新书入库”;

4)       如“1.代码解读”中所提到的,数组的60个元素可能有些少了,建议使用#define规定一个数量以便于程序维护时修改;

5)       根据“3.测试用例”中的结果,当没有输入用户名或没有输入密码就回车时,不会有结果产生,这算是编写者考虑不周全,因此我认为应该添加两行代码,使得用户没有输入用户名或没有输入密码就回车时,显示“未输入用户名!”或“未输入密码!”

6)       根据“3.测试用例”中的结果,使用者在借书或是还书时,即使输入不存在的图书名或图书号,也能显示“借阅成功/归还成功”,这明显是一个很大的BUG,是编写者在编写时未考虑到的。我认为应该在用户输入图书名或图书号后,检索book.txt文件中的内容进行比对,若不存在与文件中,就会显示“该图书不存在”;

7)       同样的,根据“3.测试用例”中的结果,使用者在借书时,输入库存量为0的图书书号,也能成功借阅。我认为在减少库存并cout借阅成功前,首先应该用if判断图书的库存数是否>=1,当满足条件时才能成功借阅,else则显示“库存量不足”。

  (库存量为0的图书借阅后库存量变为“-1”)

 

4.心得体会

这是第一次做这种类型的作业, 虽然平时也会看别人的代码,但对代码做分析还是第一次。C++编写的“XX管理系统”是很基础的东西,本来会觉得在分析代码时会很轻松,毕竟自己在大学中也写过一些类似的东西,可真正在阅读该同学的代码时,还是出现了一些问题。

该同学的代码编写风格与我不太一样,这也是造成我阅读变得有些困难的原因之一,其次是该同学编写代码时为标注释,因此一些函数我在第一次读时产生了误解,在阅读几次后才理解代码的意思。

关于测试用例方面,该测试方法是上周五刚刚学到的,也是我第一次编写测试用例,可能会出现一些小问题,但这也是一次很好的操练。(编写测试用例是因为PPT上这么写的,虽然后来说不用写,但我已经写完了,就放上来了。)

在阅读代码时,我更注重的是代码的分析解读,因此错过了一些程序上的BUG,这些都是在后期的测试中发现的(比如不存在的图书也能借阅的问题等)。我也认识到了这方面的不足,在分析代码时,应该也要考虑各种方面才行。

总之,虽然这次作业还挺麻烦的,再由于对作业理解上的一些偏差,这个作业还是做了很多天的,我觉得我在这次作业中还是学到了很多的。

最后!我想说:大家写代码的时候!一定要写注释!!!

posted @ 2019-03-05 13:37  丁壹  阅读(511)  评论(0编辑  收藏  举报