软件工程第二次实验
一.作业信息
所属课程 | 软件工程 |
---|---|
作业要求 | 作业要求 |
作业目标 | 实验二 |
学号 | 3180701327 |
二.实验目的
1、掌握结构化的分析方法
2、掌握分层数据流图的绘制、数据字典和加工说明的编制
3、掌握数据流图映射为软件结构图的方法
4、掌握需求说明书和设计说明书的主要内容,学习软件需求说明书和设计说明书的编写
5、掌握测试的基本方法
三.实验内容
1、为机票预定系统或其他系统绘制分层数据流图并编制数据字典。
2、将机票预定系统或其他系统分层数据流图映射为软件结构图,绘制软件结构图。
3、为关键模块进行详细设计,如绘制流程图。
4、实现系统部分功能并测试。
4.1person.py
class Person(object):
def __init__(self,name,idCard,phone,card):
self.name = name #用户名字
self.idCard = idCard #用户身份证
self.phone = phone #用户电话
self.card = card #用户的信用卡
4.2atm.py
import random
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
5.3card.py
class Card(object):
def __init__(self,cardid,cardpasswd,cardmoney):
self.cardid = cardid #信用卡号
self.cardpasswd = cardpasswd #信用卡密码
self.cardmoney = cardmoney #卡内余额
self.cardlock = False #是否被锁定
4.4admin.py
import time
class Admin(object):
admin = 'admin'
passwd = '123456'
# 管理员界面
def AdminView(self):
print("**********************************************")
print("* *")
print("* *")
print("* 欢迎使用CCC银行 *")
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
4.5main.py
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、参照实验指导书实验七绘制分层的数据流图与编制数据字典。
3、参照实验指导书实验八、九绘制系统的功能结构图及关键模块的流程图或其他图。
4、为选择的系统绘制数据流图、数据字典、功能结构图及关键模块的流程图。
5、实现并测试部分功能模块。
五.思考题
(1)简述需求说明书,概要设计,详细设计说明书的主要内容。
需求说明书是指在研究用户要求的基础上,完成可行性分析和投资效益分析以后,由软件工程师或分析员编写的说明书。它详细定义了信息流和界面,功能需求,设计要求和限制,测试准则和质量保证要求。它的作用是作为用户和软件开发人员达成的技术协议书,作为着手进行设计工作的基础和依据,系统开发完成以后,为产品的验收提供了依据。
概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。编制的目的是说明对程序 系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、安全设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。
详细设计说明书又可称程序设计说明书。编制目的是说明一个软件系统各个层次中的每一个程序 (每个模块或子程序)的设计考虑,如果一个软件系统比较简单,层次很少,本文件可以不单独编写,有关 内容合并入概要设计说明书。
(2)结构化分析方法与面向对象分析方法有无本质上的不同?
面向对象的方法将对象作为实体,对其操作的函数对其依赖性很强,也就是对象更重要,例如C++语言,而结构化方法更关注的是程序自己的运行状态,以及函数的执行效率,例如C语言。
(3)对数据流图进行审查有何意义?
便于用户表达功能需求和数据需求及其联系;
便于两类人员共同理解现行系统和规划系统的框架;
清晰表达数据流的情况;
有利于系统建模。
(4)给出一次完整的会议讨论纪要,包括议题,最终结果。
一篇会议纪包含以下内容:标题、会议概述、主要议题、会议内容和后续工作。
标题:建议格式为会议名称+纪要。比如:大客户营销项目会议纪要。
会议概述:说明会议主题,会议时间,地点,参会人员。建议用表格的形式列出。
主要议题:先概括性的说明会议的主要议题,用尽量简短的语言概括会议主题。可增加解释性语句。比如:会议主要议题:大客户营销系统总体需求讨论。
会议内容:根据会议流程,记录与会者的主要观点以及在讨论后各方达成了什么共识,制定了什么方案等等。建议给会议内容分类、分点的记录,让读者更直观的了解会议内容。
后续工作:这部分需记录会后各方的工作,包括会议敲定事情的工作计划、时间节点、负责人、汇报人等信息;还需记录经过会议尚未结局的事情,记录后续跟进的各事项。