第二次实验
一:作业信息
博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11548 |
作业目标 | 掌握结构化的需求分析方法和设计 |
学号 | 3180701323 |
二.实验目的
(1)掌握结构化的需求分析方法;
(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;
(3)掌握数据流图映射为软件结构图的方法;
(4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;
(5)掌握测试的基本方法。
三.实验内容
(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;
答:以ATM自动取款机系统为例,用户需求:客户可以通过登录账户取款,银行可以对取款机添加金钱。
系统需求:
(1)客户将银行卡插入读卡器,读卡器识别卡的真伪,并在显示器上提示输入密码。
(2)客户通过键盘输入密码,取款机验证密码是否有效。如果密码错误提示错误信息,如果正确,提示客户进行选择操作的业务。
(3)客户根据自己的需要可进行存款、取款、查询账户、转账、修改密码的操作。
(4)在客户选择后显示器进行交互提示和操作确认等信息。
(5) 操作完毕后,客户可自由选择打印或不打印凭条。
(6)银行职员可进行对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.客户
def __init__(self,name,idCard,phone,card):
self.name = name #用户名字
self.idCard = idCard #用户身份证
self.phone = phone #用户电话
self.card = card #用户的信用卡
2.ATM机
from Card import Card
from Person import Person
class ATM(object):
def __init__(self, allusers):
# 存储所有用户的信息,用字典
self.allUsers = allusers
# 创建用户
def CreatUser(self):
# 目标:向用户字典中添加一对键值对(卡号-用户)
name = input("请输入您的姓名:")
idCard = input("请输入您的身份证号:")
phone = input("请输入您的电话号码:")
preMoney = int(input("请输入您的预存款金额:"))
if preMoney < 0:
print("预存款输入有误,开户失败......")
return -1
# 设置密码
onePasswd = input("请输入密码:")
# 验证密码
if not self.checkPasswd(onePasswd):
print("密码输入有误,开户失败......")
return -1
# 信息收集完成
# 生成卡号
cardId = self.creatCardId()
card = Card(cardId, onePasswd, preMoney)
user = Person(name, idCard, phone, card)
# user存到字典
self.allUsers[cardId] = user
print("开户成功,请牢记卡号(%s)......" % cardId)
# 查询余额
def searchUserInfo(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
# 查询成功,输出结果
print("账户:%s 余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
# 取款
def getMoney(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
getmoney = int(input("请输入您取款金额:"))
nowmoney = int(user.card.cardmoney)
if getmoney > nowmoney:
print("余额不足,取款失败......")
return -1
nowmoney -= getmoney
user.card.cardmoney = nowmoney
print("取款成功,您目前余额为:%d" % user.card.cardmoney)
# 存款
def saveMoney(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
savemoney = int(input("请输入您存款金额:"))
nowmoney = int(user.card.cardmoney)
nowmoney += savemoney
user.card.cardmoney = nowmoney
print("取款成功,您目前余额为:%d" % user.card.cardmoney)
# 转账
def transferMoney(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
# 查询成功,输出结果
print("账户:%s 余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
tocardid = input("请输入您希望转账的账户:")
# 验证是否存在该卡号
usertoid = self.allUsers.get(tocardid)
if not usertoid:
print("该卡号不存在,查询失败......")
return -1
tomoney = int(input("请输入您希望转账的金额:"))
nowmoney = int(user.card.cardmoney)
tonowmoney = int(usertoid.card.cardmoney)
if tomoney > nowmoney:
print("余额不足,转账失败......")
return -1
nowmoney -= tomoney
tonowmoney += tomoney
user.card.cardmoney = nowmoney
usertoid.card.cardmoney = tonowmoney
print("转账成功,您目前余额为:%d" % user.card.cardmoney)
# 改密码
def changePasswd(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
newpasswd = input("请输入新密码:")
newpasswd2 = input("请确认新密码:")
if newpasswd != newpasswd2:
print("两次密码输入不一致,密码修改失败")
return -1
user.card.cardpasswd = newpasswd
print("密码修改成功......")
# 锁定
def lockUser(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
if user.card.cardlock:
print("该卡已经被锁定,请结束后再使用其他功能")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误......")
return -1
# 锁定
user.card.cardlock = True
print("锁定成功......")
# 解锁
def unlockUser(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,解锁失败......")
return -1
if not user.card.cardlock:
print("该卡没有锁定,无需解锁......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,解锁失败......")
return -1
temid = input("请输入您的身份证号:")
if temid != user.idCard:
print("身份证号输入错误,解锁失败......")
return -1
# 解锁
user.card.cardlock = False
print("解锁成功......")
# 补卡
def newCard(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误......")
return -1
# 重新生成卡号
newcard = self.creatCardId()
user.card.cardid = newcard
print("补卡办理成功,这是您的新卡号:%s" % user.card.cardid)
# 销户
def killUser(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,销户失败......")
return -1
self.allUsers.pop(cardnum)
print("该账户已经被销户......")
# 验证密码,循环三次没有正确就输出错误
def checkPasswd(self, realPasswd):
for i in range(3):
temPasswd = input("请确认密码:")
if temPasswd == realPasswd:
return True
return False
# 随机生成卡号
def creatCardId(self):
# 验证密码是否重复
while True:
str = ""
for i in range(6):
ch = chr(random.randrange(ord('0'), ord('9') + 1))
str += ch
# 判断是否重复
if not self.allUsers.get(str):
return str
3.银行卡
def __init__(self,cardid,cardpasswd,cardmoney):
self.cardid = cardid #信用卡号
self.cardpasswd = cardpasswd #信用卡密码
self.cardmoney = cardmoney #卡内余额
self.cardlock = False #是否被锁定
4.管理员
class Admin(object):
admin = 'admin'
passwd = '123456'
# 管理员界面
def AdminView(self):
print("**********************************************")
print("* *")
print("* *")
print("* 欢迎使用ATM自动取款机 *")
print("* *")
print("* *")
print("**********************************************")
# 功能界面
def FunctionView(self):
print("**********************************************")
print("* 开户(1) 查询(2) *")
print("* 取款(3) 存款(4) *")
print("* 转账(5) 改密码(6) *")
print("* 锁定(7) 解锁(8) *")
print("* 补卡(9) 销户(10) *")
print("* 退出(0) *")
print("**********************************************")
# 管理员验证
def Check(self):
inputAdmin = input("请输入管理员账户: ")
if self.admin != inputAdmin:
print("账号输入错误!")
return -1
inputPasswd = input("请输入管理员密码: ")
if self.passwd != inputPasswd:
print("密码输入错误!")
return -1
# 能执行到这里说明账号密码输入正确
print("操作成功,请稍后...")
# time.sleep(2)
return 0
```
6.主函数
```import time
from Admin import Admin
import pickle
from ATM import ATM
import os
def main():
# 界面对象
admin = Admin()
# 管理员开机
admin.AdminView()
if admin.Check():
return -1
#存储信息的文件是否存在
if os.path.exists("userinfo.txt"):
filepath = "userinfo.txt"
else:
open("userinfo.txt", "wb")
filepath = "userinfo.txt"
# 提款机对象
#如果存储信息的文件非空
if os.path.getsize(filepath):
f = open(filepath, "rb")
# print(f)
allusers = pickle.load(f)
else:
# print("*****")
allusers = {}
print((allusers))
atm = ATM(allusers)
while True:
admin.FunctionView()
# 等待用户操作
option = input("请输入您的操作:")
if option == '1':
# 开户
atm.CreatUser()
elif option == '2':
# 查询
atm.searchUserInfo()
elif option == '3':
# 取款
atm.getMoney()
elif option == '4':
# 存款
atm.saveMoney()
elif option == '5':
# 转账
atm.transferMoney()
elif option == '6':
# 改密码
atm.changePasswd()
elif option == '7':
# 锁定
atm.lockUser()
elif option == '8':
# 解锁
atm.unlockUser()
elif option == '9':
# 补卡
atm.newCard()
elif option == '10':
# 销户
atm.killUser()
elif option == '0':
# 退出
if not admin.Check():
# 将当前系统中的用户信息保存到文件中
f = open(filepath, "wb")
pickle.dump(atm.allUsers, f)
f.close()
return -1
time.sleep(2)
if __name__ == "__main__":
main()
```
六:思考题
(1)简述需求说明书,概要设计,详细设计说明书的主要内容。
答:需求说明书是指在研究用户要求的基础上,完成可行性分析和投资效益分析以后,由软件工程师或分析员编写的说明书。它详细定义了信息流和界面,功能需求,设计要求和限制,测试准则和质量保证要求。
概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。编制的目的是说明对程序 系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、安全设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。
详细设计说明书又可称程序设计说明书。编制目的是说明一个软件系统各个层次中的每一个程序的设计考虑,如果一个软件系统比较简单,层次很少,本文件可以不单独编写,有关内容合并入概要设计说明书。
(2)结构化分析方法与面向对象分析方法有无本质上的不同?
答:早期的程序分析,如C语言,都是用结构化分析方法。结构化分析又叫做面向过程分析,具体原理是将一个软件分为多个过程(函数)进行分析,用结构体(struct)管理数据。面向对象开发最大的成功之处在于添加了“对象”的概念。比较两种开发方式,面向对象分析更加接近于现实生活,可以使人的思路更加明确,而面向结构分析更注重思维逻辑,具有一定难度。所以面向对象分析是当前更好的开发方式。
(3)对数据流图进行审查有何意义?
答:确保数据流图的准确性和易理解性,
(4)给出一次完整的会议讨论纪要,包括议题,最终结果
七:实验小结
这次实验的主要目的就是让我了解一个软件在编程前就需要做好概要设计、详细设计等一系列准备,而在这次实验中,我也充分了解到了提前准备的繁杂与麻烦,但当这些提前的准备做完后,发现一切都变得有条理起来。这次的例子我选择了ATM自动取款机系统,根据以往的经验与网络查询了解了更加具体的功能设计,让报告更加充实。而通过这次实验,我也对结构化的需求分析方法和设计有了更深的了解。
PSP:
| psp3.1 |任务内容 |计划完成需要的时间(min)|实际完成需要的时间(min)|
| ---- | ---- | ---- | ---- |
|Planning|计划|15|12|
|Estimate|估计这个任务需要多少时间,并规划大致工作步骤|8|12|
|Development|开发|120|110|
|Analysis|需求分析(包括学习新技术)|13|22|
|Design Spec|生成设计文档|5|6|
|Design Review|设计复审|5|7|
|Coding Standard|代码规范|3|5|
|Design|具体设计|16|16|
|Coding|具体编码|35|30|
|Code Review|代码复审|5|6|
|Test|测试(自我测试,修改代码,提交修改)|10|18|
|Reporting|报告|10|20|
|Test Report|测试报告|6|12|
|Size Measurement|计算工作量|20|25|
|Postmortem & Process Improvement Plan|事后总结,并提出过程改进计划|5|8|