《软件工程》课程四个实验的实验报告(《可行性研究与项目计划》《需求分析》《系统设计》《系统实现》)

实验1《可行性研究与项目计划

实验学时:   2      实验地点:      任意         实验日期:  12月15日        

一、实验目的

  1. 了解:软件项目可行性研究及项目计划的基本原理与方法;
  2. 掌握:Visio等工具进行可行性研究和制定项目计划。

二、实验内容

图书管管理系统更便于对图书进行分类和管理,对借阅者进行时间限定,使得借书的效益更高更安全。提高工作效益,便于操作,能有效地对数据进行更新、查询,并能在一定程度上实现了自动化。图书管管理系统的主要功能为:书目管理、借阅证管理、借还图书、查询、缴费。书目管理主要是针对管理员身份而言的(比如新增书目,删除书目等等);借阅证管理分为五部分:注册、补发、挂失、暂停、注销;借还图书:借书、还书;查询:图书查询、借阅时间缴费主要是计算超期罚款并交纳费用。

图书管管理系统的系统流程图如图1所示。

系统流程图

试对系统进行可行性研究,用Visio绘制图书管管理系统的系统流程图,同时制定系统的开发计划,用Gantt图和时间线图描述进度计划安排。

三、实验方法

  1. 运行快速应用开发模型(RAD)对图书馆管理系统进行开发分析;
  2. 根据实验内容即项目需要对项目进行建模分析;
  3. 使用Visio工具对图书管理系统进行建立系统流程图、Gantt图、时间线图;
  4. 使用第3步绘制的各个模型对项目进行进一步的开发可行性分析和计划分析。

四、实验步骤Visio2003

绘制时间线图的基本步骤:

  1. 在Visio主菜单中选择[文件]/[新建]/[项目计划图]/[时间线],选择一个时间线拖入绘图页。
  2. 在形状模板中选择一个里程碑拖入绘图页;
  3. 在配置里程碑对话框中设置里程碑日期和日期格式;
  4. 在形状模板中选择一个间隔块拖入绘图页;
  5. 在配置间隔块对话框中设置间隔块的起始与结束日期和日期格式;
  6. 设置标题;
  7. 设置今日时间;
  8. 设置背景;
  9. 设置消耗的时间。

绘制Gantt图的基本步骤:

1. 设置Gantt图选项;

2. 设置配置工作时间;

3.设置任务名称、起始时间、终止时间或任务持续时间;

4.设置标题等其它信息。

五、实验结果

绘制了图书馆管理系统系统流程图

图书馆管理系统流程图

 

图书馆管理系统流程图——学生模块

图书馆管理系统流程图——管理员模块

绘制了图书馆管理系统的Gantt图

 

图书馆管理系统之Gantt图

绘制了图书馆管理系统开发计划的时间线图

图书馆管理系统开发计划之时间线图

六、实验结论

本次实验主要是对图书馆管理系统进行开发计划分析,通过绘制模型进行更加高效开发,成果主要为第五点所示的图书馆管理系统流程图、Gantt图、时间线图。

通过对绘制的五个模型加以分析,更加确定了图书馆管理系统的开发可行性以及具体的开发流程。将项目开发中许多的不可预估的事情转化为了可预估事情,有利于项目的具体实施开展。

七、实验小结

通过本次实验,主要是学会了对于项目进行建模分析,比如系统流程图、Gantt图、时间线图等等,以各个模型为基础,进一步有利于项目的开发进行与实际落实。

在本次实验过程中,遇到的问题主要是对Visio工具的使用不太熟悉,有许多模型的各个组件不知如何设计,所以模型存在一定不足。

解决方式主要为利用老师上传的PPT、视频进行自主学习,或者通过谷歌进行搜索然后多次尝试解决。

实验的不足之处主要是各个模型可能不全面,缺少某个部件,还有就是部分设计可能未完全规划好。问题原因在于对Visio绘图工具的使用过少,后续将继续学习,加强锻炼,进而对各个模型进行完善。

初次使用visio,感受到这个工具的强大之处。之前一直使用的是亿图图示,保存图片要使用截图的方式,非常的不方便,且达不到效果。Visio就比较方便,可以保存各种格式。而且可以绘制各种图,包括熟知的流程图,还有软件工程专业的图表比如甘特图。

实验2需求分析

实验学时:   2      实验地点:      任意         实验日期:  12月18日     

一、实验目的

  1. 了解:软件项目需求分析的基本原理与方法;
  2. 掌握:用例建模方法、数据流建模方法和IDEF1X数据建模方法;
  3. 掌握:Visio/EA等工具绘制模型图。

二、实验内容

1、请从下面的描述中找出绘制数据流图的四种成分并用Visio绘制数据流图。

某培训中心要研制一个计算机管理系统。它的业务是:将学员发来的信件收集分类后,按几种不同的情况处理。

(1) 如果是报名的,则将报名数据送给负责报名事务的职员,他们将查阅课程文件,检查该课程是否额满,然后在学生文件、课程文件上登记,并开出报告单交财务部门,财务人员开出发票给学生。

(2) 如果是想注销原来已选修的课程,则由注销人员在课程文件、学生文件和帐目文件上做相应的修改,并给学生注销单。

(3)如果是付款的,则由财务人员在帐目文件上登记,也给学生一张收费收据。

2、 有一简单选课系统,用文字描述如下,试用IDEF1X图和UML类图描述该系统的信息模型,并用Visio或EA绘制该IDEF1X图和UML类图。

1)基本描述:在该系统中,有学院、教师、课程、学生等实体,他们的属性分别是:

学院:学院编号、学院名称、地址、联系电话、院长等基本属性;

教师:教师编号、姓名、性别、年龄、职称、所在学院等属性;

课程:课程编号、课程名称、课程性质(必修/选修)、学分、开课学院等属性;

学生:学号、姓名、性别、年龄、入学时间、学院等属性。

教学班实体:教学班号、上课教师、课程、上课学期、上课时间、上课周次。

2)功能需求如下

(1)能完成基本信息的维护:即各实体的基本信息的增、删、改、查。

(2)排课:为教师安排一学期所上的课程。一位教师在一学期可以上一门课或多门课,也可以不上课;一门课可以有多个教师上,但是不同的教师上的课应该属于不同的教学班。

(3)学生选课:学生根据教学要求进行选课。在学生选课之前检查该学生是否有选课资格(比如是否欠费、前期课程是否修完并通过);一个学生可以选多门课、一门课可以被多个学生选修,但是一个学生不能选择同一门课的不同教学班;如果学生选了一门课的某个教学班后再选该门课的其他教学班系统应做出出错提示;统计已选教学班的学生人数;一个教学班的选课名额有限;学生选课后,如果发现选课不合理可以退选、重选;选课结束后应提供打印课程表的功能。

3、请用Visio或EA绘制如图2所示的用例图。

图2 用例图

三、实验方法

运用Visio2016工具进行数据流图、UML图和IDEF1X图设计。

四、实验步骤(visio2016)

建立数据流图的基本步骤:

  1. 打开Visio,进入“文件/新建/软件和数据库/数据流模型图”;
  2. 先在模型资源管理器中建立进程、数据存储和接口;
  3. 再将有关元素拖入绘图页;
  4. 最后添加所需的数据流;
  5. 重复上述步骤,完成数据流建模。

建立IDEF1X图的基本步骤:

  1. 选择主菜单:“新建/数据库/数据库模型图”;
  2. 打开数据库模型图;
  3. 数据库菜单上,指向选项,然后单击文档;
  4. 单击常规选项卡,在符号集旁边,单击 IDEF1X 或关系,然后单击确定

建立用例图的基本步骤:

  1. 打开Visio,进入“文件/新建/软件和数据库/UML模型图”;
  2. 用鼠标右键单击用例模型的顶层包;
  3. 选择[创建]à[用例图];
  4. 将“模型资源管理器”中的空白用例图改名;
  5. 将形状中的用例形状集中的系统边界拖到用例图中;
  6. 将“模型资源管理器”中的参与者拖到用例图中;
  7. 将“模型资源管理器”中的用例拖到用例图中;
  8. 在用例图中建立参与者、用例之间的关系。

五、实验结果

记录实验输出数据和结果。

1.实验1数据流图如下所示:

2.实验2的UML图如下所示

 

3.实验2的IDEF1X图如下所示:

4.实验3的用例图如下所示:

 

采购人员可以登录系统、形成订单、取消订单、填写订单、检查报价、提交需求表;

  顾客可以形成订单;

  部门主管可以签写报表;

  财务人员可以查询财务数据、检查基本价格表、核实预售表、核实预售单;

  开单员可以把自己所能查看到的信息打印出来,比如单据和提货单;

  仓库员维护着整个仓库的入库出库状况,负责开出库单,审核入库单,打印导出数据等功能;

  物流员可以把自己所能查看到的信息打印出来,比如加工单、运输单、入库单等;

六、实验结论

本次实验主要是对项目进行需求分析建模,有数据流图、UML图和IDEF1X图等,通过一系列建模从而对需求更加了解,也更加有利于项目计划开展。

由大变小,由难变易,这是工程化的思维。尤其是在需求而分析的时候更要贯穿始终。要把用户的需求想明白,要把想明白的东西表达清楚且简练,这是不易的,但是是非常重要的。不清楚的用户需求,不明白的表达形式,必将导致不适合的产品开发,这是要避免的,从根源、从需求分析开始避免。

七、实验小结

通过本次实验主要学会了绘制一些项目中常见的模型,比如数据流图、UML图、IDEF1X和用例图等,通过模型进而对需求进行抽象,得到自己所关心得部分,从而有利于项目的开发进行。

实验中遇到的主要问题是模型绘制的注意事项不是很了解,比如IDEF1X的实体如何分类、如何定义实体间的联系等,解决方式主要是通过对书本的反复阅读以及案例分析,其次就是一部分关系无法确定如何将在模型中展示,这个主要是与同学交流解决,如果还不能解决的话,我就会去请教老师。

待改进的主要是有部分要求无法在规定的模型中展示,后续考虑通过其他模型进行展示,还有就是用例图中关系没有充分的完全展示出来,有待进一步优化。无法在一个图中彰显所有的用户需求,这是必然的。可以用另外的一个或一组图片来辅助说明,但是这种说明的作用的是有限的,如果你用了100张图,1000个字来说明一个东西,然后再用其他的东西说明你的说明,并将导致冗杂。在需求说明的时候讲究干练,用精准的说明形式来准确的说明自己想表达的问题、以及用户的真实需求。软件工程中的数据流图、UML图、IDEF1X和用例图就是这样凝练的表达形式。


实验3系统设计

实验学时:   2      实验地点:      任意       实验日期:  12月20日     

一、实验目的

  1. 掌握:结构化数据流设计技术、面向对象设计技术;
  2. 掌握:Visio工具绘制软件结构图;
  3. 掌握:EA或Visio工具绘制UML模型图。

二、实验内容

1.试针对实验二的培训中心管理系统,试用结构化设计方法对其进行设计,并用Visio绘制其对应的软件结构图。(选做)

2.某室内保温系统的描述如下:

如果主开关置于加热状态,保温系统的控制器负责开关锅炉,监视锅炉系统的燃油流量和燃烧状态,进而调节进入房间的热流量。当室内温度降至(Tr-2)度以下,控制器启动锅炉。这里Tr 是用户设定的理想室温。锅炉启动过程如下:

1)控制器向锅炉的马达发送信号;

2)控制器监视马达速度。马达达到正常操作速度时,启动点火并打开油阀;

3)控制器监视水温, 一旦水温达到预定值, 发信号打开水流循环阀。热水开始在室内循环。

4)如果发生异常情况,燃油流量指示器和光感器向控制器发信号。此时控制器发信号关闭系统。

5)一旦室内温度达到(Tr-2)度,控制器首先关闭油阀,延迟5秒钟后关闭锅炉马达。

系统须满足以下限制:

(1)锅炉停机后重启必须延迟5秒钟;

(2)在主开关关闭或油阀关闭5秒钟内应指示锅炉停机。

试据此对系统进行设计,采用Rational Rose绘制控制器的状态图,同时用顺序图描述锅炉启动过程。

三、实验方法

  1. 本次实验方法主要是利用Visio工具绘制软件结构图、状态图和顺序图;
  2. 实验原理是根据题目要求及图形要求进行绘制;
  3. 实验技术是Visio绘制;
  4. 实验方案是先根据题目要求将题目中的要求标志出来,然后记录所要绘制的图形的注意事项,再进行初稿绘制,初稿绘制完成后进行图形要点检查,最后进行图形展示优化。

四、实验步骤

建立软件结构图的基本步骤:

1. 先添加函数/子例程;

2. 再添加有条件调用;

3. 然后添加调用连线;

4. 最后为调用线添加数据流或标志流。

EA建立UML图的基本步骤:

1. 启动EA,建立新模型,保存模型;

2. 在某视图下建立模型。

五、实验结果

记录实验输出数据和结果。

实验二中的培训中心管理系统的软件结构图如下所示:

控制器的状态图如下所示:

 

锅炉启动过程的顺序图如下所示:

六、实验结论

对实验数据和结果进行分析描述,给出实验取得的成果和结论。

本次实验主要是对项目进行系统设计,有软件结构图、状态图和顺序图等,通过一系列建模从而对项目实施路程更加了解,更加有利于项目计划开展。

    实验结果的截图见第五点。对于“如果主开关置于加热状态,保温系统的控制器负责开关锅炉,监视锅炉系统的燃油流量和燃烧状态,进而调节进入房间的热流量。当室内温度降至(Tr-2)度以下,控制器启动锅炉”这一过程进行了清楚的说明。同时,也给予了实现形式,实现步骤。让人一目了然,方便后续步骤的实现,和后续人员的开发利用。对接上下游是一个工程师或者一个设计者必须要面对的命题。处理好这个命题才能做到靠谱,才能称得上负责。

七、实验小结

通过本次实验我主要学会了如何对项目进行系统设计,对系统整体进行抽象,提取出自己所关心的内容,从而有利于项目后续开发。软件架构图主要是展示项目的主要框架,有利于对项目的总体进行分析规划,活动图和顺序图主要是对系统的进一步解析,有利于系统的实际开发。总之,就是受益匪浅。

实验中遇到的问题主要是对图形的组件不够清楚,通过查阅书籍和网络资料解决,还有就是有一部分内容不能清晰表示,与同学课后交流解决。

实验存在的不足主要是图形中的关系不够了解,有一些地方可能存在错误。


实验4系统实现

实验学时:   2      实验地点:      任意         实验日期:  12月25日     

一、实验目的

  1. 掌握:系统实现的有关技术及其相关工具。

二、实验内容

1、试对图3所示的课程管理对象类图,采用Java在Eclipse下编码实现,并用JUnit框架对某Java类进行测试。

图3  类图

2、针对某网站,采用selenium或SilkTest或SilkPerformer分别进行功能测试和性能测试。(选做)

三、实验方法要求:

  1. 学生在完成预习报告、熟悉实验内容后才能进入实验室进行上机实验。实验1人一组,由学生独立操作完成实验。
  2. 学生分析问题,熟悉解决问题的过程描述。要求记录上机实验过程,且得到指导教师认可后,学生方可离开实验室。
  3. 实验完成后提交实验报告。
  4. 实验过程由指导老师监督,听从老师安排和督导。
  5. 利用pycharm工具,python代码实现该课程管理系统;
  6. 利用python中的doctest和unittest等测试工具对系统中的代码进行测试。

四、实验步骤

1. 进入:[Window]菜单下的[Preferences],选择Java支:

    1. 检测已安装的JRE;
    2. 设置工作台选项;
    3. 设置新建项目选项;
    4. 设置Java编辑器。

2. 选择[File]->[New]->[Project],从弹出的窗口中选[Java]->[Java Project],单击下一步;

3. 输入项目名,并确定项目保存的文件目录,单击完成即可,在Java透视图中的“资源管理器”中便可看到创建的项目。

4. 选择新建的项目;

5. 在工具栏中单击“创建Java类”按钮(带有一个C标记);

6. 在弹出的窗口中输入类名称,并设置有关属性(如选中public static void main(String[] args)),单击完成,则Java编辑窗口会自动打开。

7. 在Window主菜单下选择Preferences;

8. 从弹出的菜单中打开Java菜单,单击Classpath Variables;

9. 单击New,在弹出的对话框中设置junit.jar的路径信息,单击确定即可。

五、实验结果

记录实验输出数据和结果。

老师的类:

课程的类:

管理员的类:

学生的类:

六、实验结论

对实验数据和结果进行分析描述,给出实验取得的成果和结论。

注:有程序的要求附上程序源代码,有图表的要有截图并有相应的文字说明和分析

代码如下:

#include <iostream>

using namespace std;



class Teacher

{

    /*

    封装老师的相关信息

     */

public:

    void __init__(struct self,int name,int age,char admin)

    {

        self.name = name;

        self.age = age;

        self.__assets = 0;

        self.create_time = time.strftime('%Y-%m-%d %H:%M:%S');

        self.create_admin = admin;

    }



    void gain(struct self,int cost)

    {

        /*

        增加资产

        :param cost: 增加的数量

        :return:

         */

        self.__assets += cost;

    }

    void decrease(struct self,int cost)

    {



        /*

        减少资产

        :param cost: 减少的数量

        :return:

         */

        self.__assets -= cost;

    }

} ;



class Course

{

    /*

    课程相关信息

     */

public:

    void __init__(struct self,char course_name,int cost,int teacher_obj,char admin)

    {



        self.course_name = course_name;

        self.cost = cost;

        self.teacher = teacher_obj;

        self.create_time = time.strftime('%Y-%m-%d %H:%M:%S');

        self.create_admin = admin;

    }



    string have_lesson(struct self)

    {

        /*

        课程上课,自动给相关联的任课老师增加课时费

        :return: 课程内容返回给上课者

         */

        self.teacher.gain(self.cost);



        int content = random.randrange(10, 100);

        char r = time.strftime('%Y-%m-%d %H:%M:%S');

        string temp = "课程:%s;老师:%s;内容:%d;时间:%f" % (self.course_name, self.teacher, content, r);

        return temp;

    }

    void absence(self)

    {

        /*

        教学事故

        :return:

         */

        self.teacher.decrease(self.cost * 2);

    }

} ;



class Admin

{



    void __init__(struct self)

    {



        self.username = None;

        self.password = None;

    }

    int login(struct self,char user,char pwd)

    {

        /*

        管理员登陆

        :param user:

        :param pwd:

        :return:

         */

        if (self.username == user && self.password == pwd)

            return 1;

        else

            return 0;

    }



    void register(struct self,char user,char pwd)

    {

        /*

        管理员注册

        :param user:

        :param pwd:

        :return:

         */

        self.username = user;

        self.password = pwd;



        path = os.path.join(settings.BASE_ADMIN_DIR, self.username); //管理员目录

        pickle.dump(self, open(path, 'xb'));     //将管理员对象写入文件

    }

} ;



class Student

{

    /*

    学生相关信息

     */

    void __init__(struct self)

    {

        self.username = None;

        self.password = None;



        self.course_list = [];

        self.study_dict = {};

    }

    void select_course(struct self,char course_obj)

    {

        /*

        学生选课

        :param course_obj:

        :return:

         */

        self.course_list.append(course_obj) ;//将课程对象添加进课程列表

    }



    void study(self, course_obj)

    {

        /*

        学生上课

        :param course_obj:

        :return:

         */

        class_result = course_obj.have_lesson();  //获取学生上课信息



        if( course_obj in self.study_dict.keys())  //key:课程对象 value:上课信息列表,是列表格式



            self.study_dict[course_obj].append(class_result) ; //将上课信息列表添加进上一次的列表中

        else

            self.study_dict[course_obj] = [class_result, ] ;  //创建该课程对象的键值对

    }



    void login(struct self,char user,char pwd)

    {

        /*

        学生登陆

        :param user:

        :param pwd:

        :return:

         */

        if( self.username == user && self.password == pwd)

            return 1;

        else

        return 0;

    }



    void register(struct self,char user,char pwd)

    {

        /*

        学生注册

        :param user:

        :param pwd:

        :return:

         */

        self.username = user;

        self.password = pwd;



        path = os.path.join(settings.BASE_STUDENTS_DIR, self.username);  //学生目录

        pickle.dump(self, open(path, 'xb')); //将学生对象写入学生目录

    }

};

以上用C++进行了定义类,并对代码进行了排查,尽早排除尽可能出现的bug,可以减少在后续阶段解决bug的成本(包括时间成本、人力成本等)。

七、实验小结

通过本次实验主要是学会了利用C++的相关技术对类的定义,实验时最开始遇到的问题是对于实验内容中给出的UML图不知如何进行代码实现,毫无头绪,后来是在独立思考一段时间后以及与同学互相讨论从而进行实验开展。

原来我们每天用的教务系统是这样建立起来的,非常的受益。我获得了不一样的眼光,在教务系统,我的每一次点击或者滑动都对应一个个函数的执行。

程序不理解人,但是程序可以为人服务。程序一条又一条堆起了这样一个庞杂的系统。反过来说,这样一个庞大结构复杂的的系统,是由程序员一条一条代码建成的。就像盖房子一样。

实验中有待改进的地方主要是该项目的代码有待优化,虽然进行了类的定义,但是没有把系统实现出来,这点是比较遗憾的。

从可行性研究、需求设计、系统设计到系统实现,四个实验承前启后,相互紧密结合,但又相互区别,层层递进。整套做下来,学会了各种图表的绘制和表现,也对系统的设计和实现有了精准的把握和理解。这对今后的学习和生活来说都是有助力的,虽然以后不再从事软件工程行业,但这一个学期的邂逅和相遇,会让我终生受益的。感谢老师,感谢软件工程科学家门对于软件工程这个体系的贡献,让我深受触动和震撼。

源文档,
私聊,有偿。

欢迎赞赏 icon-default.png?t=MBR7https://nyzhhd.github.io/zsm

猜你喜欢

转载自blog.csdn.net/m0_51738372/article/details/128678963
今日推荐