实验二 结构化分析与设计

博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11540
作业的目标 熟悉数据流图的画法,了解工作流
学号 3190704105

一.实验目的

(1)掌握结构化的需求分析方法;

(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;

(3)掌握数据流图映射为软件结构图的方法;

(4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;

(5)掌握测试的基本方法。

二.实验内容

(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;

(2)绘制系统的分层数据流图,并给出数据字典;

(3)将系统的分层数据流图映射为软件结构图,绘制软件结构图;

(4)为关键模块进行详细设计,如绘制关键模块的流程图;

(5)实现系统部分功能并测试。

【实例1】机票预订系统

参考:

(1)携程网:https://flights.ctrip.com/international/search/domestic

(2)去哪儿:https://www.qunar.com/?ex_track=auto_4e0d874a

为了方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行

时间、旅行目的地等)输入该系统,系统为旅客安排航班,旅客在飞机起飞前一天凭取票通知和账单交款取票,系统核对无误即印出

机票给顾客

【实例2】教材订购系统

销售系统的工作过程为:首先由教师或学生提交购书单,经教材发行人员审核是有效购书单后,开发票、登记并返给教师或学生领

书单,教师或学生即可去书库领书。

采购系统的主要工作过程为:若是脱销教材,则登记缺书,发缺书单给书库采购人员;一旦新书入库后,即发进书单通知给教材发

行人员。

【实例3】图书管理系统

参考:http://lib.ahpu.edu.cn/

三.实验步骤

(1)复习结构化的分析与设计方法的主要过程;

(2)讨论系统存在的用户角色、工作流等;

(3)对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性;

(4)对应数据流图,设计系统的功能结构图,关键模块的流程图;

(5)选择对应的结构化程序设计语言,实现并测试部分功能模块

作答

一.讨论其用户需求、系统需求和业务需求

1.用户需求:获取航班信息,能够完成机票的预订及改签、退票处理,及时获取相关信息通知。

2.系统需求

   **①环境需求**:设备服务器的硬件要求;客户机CPU,内存的要求;

             旅行社的计算机配置;旅客的软硬件环境。

   **②可靠性需求**:要考虑到系统用户的数量的增长;网络相关超时,错误问题;

               还有就是用户操作后对数据信息的准确性,及时性的保证。

   **③安全性需求**:首先对于用户来说,要保证用户信息的保密性,密码验证问题,防止被别人肆意破坏,造成用户的经济等影响;其次,对于航空公司系统的管理员来说,同样需要安全性的保证,对于航                                                      
                   班信息的准确保障。

   **④资源使用需求**:要考虑到系统运行时对软、硬件,数据库,人力物力的资源消耗。

3.业务需求

   **①需求来源**:对于该系统来说,可能因为网络信息化的飞速发展,旅客对机票预订的便捷操作的需要及航空公司运营的需要。

   **②需求目的**:对于旅客来说,便是方便查看航班信息,完成机票的预订,节省经济和时间。对于航空公司来说,改系统的实现能够方便其运营,管理带来一定的经济效益。

   **③需求描述**:----

   **④业务数据**:航班信息列表,包括起\终地点、时间,价格,航班号,剩余票数。

              用户信息列表,包括旅客姓名,身份证信息,旅行时间、起点及终点,舱位等级要求。

              航空公司管理员列表,管理员身份验证信息。

二.讨论系统存在的用户角色、工作流等

角色:旅客:姓名、性别、工作单位、身份证、手机号、旅行出发地,终点。
旅行社:名称,地点,电话,相关管理人员的身份验证信息。
航空公司:名称,地点,电话,相关管理人员的身份验证信息。

工作流:生成取票凭证,打印机票,生成账单,航班信息,退票(改票)申请,信息通知

三.对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性

顶层图

一层数据流图

加工1的子图

加工2的子图

加工3的子图

加工4的子图

数据字典

四.对应数据流图,设计系统的功能结构图,关键模块的流程图

最初上层框架

售票初始图

打印初始图

五.选择对应的结构化程序设计语言,实现并测试部分功能模块

代码

点击查看代码

import time
import random

plane = {} #储存航班信息
planes_list = []
passenger = {} #储存乘客信息
passengers_list =[]
ticket = {} #储存机票信息
ticket_list = []
noA,noB,noC = 0,0,0 #ABC等级舱位座位号
cost = {}
cost_list = [] #储存账单信息

设置航班信息

def setPlanes():
plane["航班号"] = input("航班号:")
plane["起点站"] = input("起点站:")
plane["终点站"] = input("终点站:")
plane["出发日期"] = input("年+月+日+时+分:")
plane["登机口"] = input("登机口:")
plane["票号"] = input("票号:")
for i in range(3):
plane["舱位等级%d"%(i+1)] = input("舱位等级:")
plane["座位数%d"%(i+1)] = eval(input("座位数:"))
plane["票价%d"%(i+1)] = eval(input("票价:"))
print(plane)
planes_list.append(plane.copy())
return planes_list

设置乘客信息

def setPassengers():
passenger["姓名"] = input("姓名:")
passenger["性别"] = input("性别:")
passenger["工作单位"] = input("工作单位:")
passenger["身份证"] = eval(input("身份证:"))
passenger["手机号"] = input("手机号:")
passenger["出发地"] = input("出发地:")
passenger["目的地"] = input("目的地:")
passenger["时间"] = input("年+月+日+时+分:")
#passenger["舱位等级"] = input("选择舱位等级(ABC):")
passengers_list.append(passenger.copy())

设置机票信息

def set_tickets(a, b, i, noA,noB,noC,level):
ticket["航班号"] = a["航班号"]
ticket["起点站"] = a["起点站"]
ticket["终点站"] = a["终点站"]
ticket["出发日期"] = a["出发日期"]
ticket["登机口"] = a["登机口"]
ticket["票号"] = a["票号"]
ticket["身份证"] = b["身份证"]
ticket["姓名"] = b["姓名"]
ticket["舱位等级"] = level
if i == 1:
noA += 1
ticket["座位号"] = noA
elif i == 2:
noB = noB + 1
ticket["座位号"] = noB
else:
noC = noC + 1
ticket["座位号"] = noC
ticket_list.append(ticket.copy())
print("-------------取票通知----------")
print("| 航班号:{} ".format(ticket["航班号"]))
print("| 起点站:{} ".format(ticket["起点站"]))
print("| 终点站:{} ".format(ticket["终点站"]))
print("| 出发日期:{} ".format(ticket["出发日期"]))
print("| 登机口:{} ".format(ticket["登机口"]))
print("| 票号:{} ".format(ticket["票号"]))
print("| 姓名:{} ".format(ticket["姓名"]))
print("| 舱位等级:{} ".format(ticket["舱位等级"]))
print("| 座位号:{} ".format(ticket["座位号"]))
print("------------------------------")

设置账单信息

def set_cost(a,b,i,time):
cost["付款人姓名"] = b["姓名"]
cost["付款编号"] = "1000" + str(random.randint(10, 99))
cost["付款金额"] = a["票价%d" % (i)]
cost["交易日期"] = time
cost_list.append(cost.copy())
print("-------------账单-------------")
print("| 付款人姓名:{} ".format(cost["付款人姓名"]))
print("| 付款编号:{} ".format(cost["付款编号"]))
print("| 付款金额:{} ".format(cost["付款金额"]))
print("| 交易日期:{} ".format(cost["交易日期"]))
print("------------------------------")

订票

def selectPlanes():
label = 1
print("请填写旅行信息:")
setPassengers()

print("请选择航班:")
print("{:<7}{:<7}{:<7}{:<9}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}".format("航班号","出发地","目的地","出发日期","舱位等级","票数","票价","舱位等级","票数","票价","舱位等级","票数","票价"))
for item in planes_list:
    if item["起点站"] == passenger["出发地"] and item["终点站"] == passenger["目的地"]:
        print("{:<9}{:<8}{:<7}{:<13}{:<6}{:<7}{:<6}{:<8}{:<7}{:<6}{:<8}{:<7}{:<6}".format(item["航班号"],
                item["起点站"],item["终点站"],item["出发日期"],
                item["舱位等级1"],item["座位数1"],item["票价1"],
                item["舱位等级2"],item["座位数2"],item["票价2"],
                item["舱位等级3"],item["座位数3"],item["票价3"]))
        break
    else:
        pass
else:
    print("暂无相关航班信息!")

no = input("航班号:")
level = input("舱位等级:")
for item in planes_list:
     for j in range(1,4):
        if item["航班号"] == no and item["舱位等级%d"%(j)] == level:
            while label:
                money = eval(input("请支付:"))
                if money >= item["票价%d" % (j)]:
                    local_time = time.asctime(time.localtime(time.time()) )
                    print("支付成功!实付:{}  找零:{}".format(money, money - item["票价%d" % (j)]))
                    label = 0
                    item["座位数%d" % (j)] -= 1
                    set_tickets(item,passenger,j,noA,noB,noC,level)
                    set_cost(item,passenger,j,local_time)
                else:
                    print("金额不足,请重新支付!")

'''
setPlanes()
setPlanes()
selectPlanes()
selectPlanes()
'''
def changePassengers():

print("请填写要修改的信息:")
passenger["出发地"] = input("出发地:")
passenger["目的地"] = input("目的地:")
passenger["时间"] = input("年+月+日+时+分:")
passenger["舱位等级"] = input("选择舱位等级(ABC):")
return passenger

def deletePassengers():
no = input("请输入付款编号:")
name = input("请输入付款人姓名:")
id = input("请输入身份证号:")
for item in cost_list:
if no == item["付款编号"] and name == item["付款人姓名"]:
del (item)
for item in passengers_list:
if name == item["姓名"] and id == item["身份证"]:
del (item)
break
else:
pass
else:
print("姓名或身份证有误!")

        for item in ticket_list:
            if name == item["姓名"] and id == item["身份证"]:
                for i in planes_list:
                    for j in range(0,4):
                        if item["舱位等级"] == i["舱位等级%d"%(j)]:
                            i["座位数%d"%(j)] += 1
                del (item)
                break
            else:
                pass
    else:
        print("没有相关信息!")

def show():
print("{:<7}{:<7}{:<7}{:<9}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}{:<5}".format("航班号", "出发地", "目的地", "出发日期", "舱位等级", "票数", "票价", "舱位等级", "票数","票价","舱位等级", "票数", "票价"))
if len(planes_list) == 0:
print("暂无航班信息!")
else:
for item in planes_list:
print("{:<9}{:<8}{:<7}{:<13}{:<6}{:<7}{:<6}{:<8}{:<7}{:<6}{:<8}{:<7}{:<6}".format(item["航班号"],
item["起点站"], item["终点站"],item["出发日期"],item["舱位等级1"],item["座位数1"], item["票价1"],
item["舱位等级2"],item["座位数2"], item["票价2"],item["舱位等级3"],item["座位数3"],item["票价3"]))

def main():
print("---------------欢迎使用机票预订系统---------------")
print("| 1.增添航班 |")
print("| 2.预订机票 |")
print("| 3.退订机票 |")
print("| 4.显示航班 |")
print("| 5.退出 |")
print("-----------------------------------------------")

while True:
    num = int(input("请选择要进行的操作:"))
    if num == 1:
        setPlanes()
    elif num == 2:
        selectPlanes()
    elif num == 3:
        deletePassengers()
    elif num == 4:
        show()
    elif num == 5:
        print("已退出,欢迎下次使用!")
        break
    else:
        print("输入有误,请选择(1-4)!")

main()

运行图

1.设置两个航班

2.订票

成功显示机票通知和账单信息

3.发生相应变化

四.思考题

(1)简述需求说明书,概要设计,详细设计说明书的主要内容。

答: 需求说明:

1.概述

·说明开发软件系统的目的、意义和背景

·说明用户的特点、约束

2.需求说明

·功能说明,逐项列出各功能需求的序号、名称和简要说明

·性能说明,说明处理速度、响应时间、精度等

·输入输出要求·数据管理要求·故障处理要求

3.数据描述

·数据流图·数据字典·接口说明

4.运行环境规定

·说明软件运行所需的硬件设备

·说明软件运行所需的系统软件和软件工具

5.限制

·说明软件开发在成本、进度、设计和实现方面的限制。

概要设计

1总体设计

2接口设计

3运行设计

4系统数据结构设计

5系统出错处理设计

详细设计

主要是对算法的设计,编码。

(2)结构化分析方法与面向对象分析方法有无本质上的不同?

答:当软件项目较小、系统分析员能力足够高的时候,结构化方法能快速的找到最简洁、高效率的逻辑模型,结构化方法对复杂问题的帮助有限,而面向对象的分析方法提供了一种方便的、可持续观测和扩展系统的机制,通过信息隐藏和封装等手段屏蔽了对象内部的执行细节,控制了错误的蔓延,对于需求变化频繁的系统,可以用面向对象软件系统的方法。

(3)对数据流图进行审查有何意义?

答:保证数据流流入流出的准确性,合理性,方便小组其他人阅读。

(4)给出一次完整的会议讨论纪要,包括议题,最终结果。

时间:2020.12.6 14.00-16.00

地点:宿舍

人员:宿舍全体成员

主要议题:A:流程图的绘制,B:代码的设计

最终结果:部分人查找资料,个人画图。

posted @ 2020-12-09 00:25  D~~D  阅读(281)  评论(0编辑  收藏  举报