实验二 结构化分析与设计
博客班级 | 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】图书管理系统
三.实验步骤
(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:代码的设计
最终结果:部分人查找资料,个人画图。