ATM自动取款机系统-软件设计说明书
发布时间:2024-10-23
发布时间:2024-10-23
文档名称: 项目名称:
软件设计说明书 ATM自动取款机系统
编写: 校对: 审核: 日期: 院系: 专业:
2013年10月31日
软件学院 软件工程
一.引言
1.1 编写目的
根据《需求规格说明书》,在仔细考虑讨论之后,我们又进一步对《ATM自动取款机系统》软件的功能划分、数据结构、软件总体结构进行设计,从而完成概要设计,作为软件详细设计的基础。
1.2 项目背景
项目委托单位:计算机学院软件工程系。 开发单位:班ATM自动取款机系统项目组。
由于柜台常常会拥挤,排队的人很多,而且大多数的客户都是取款,存款等,而有些办理业务的需要一定的时间,这会使得一些只需要取款等的客户会有较长时间的等待。所以银行希望设计一个系统,能让客户在系统上进行简单的操作,比如存款、取款、查询余额、转账等。
1.3 定义
ATM: Automatic Teller Machine,自动柜员机。
1.4 参考资料
《计算机软件需求说明编制指南》 《计算机软件产品开发文件指南》 《ATM系统可行性分析报告》。 《软件设计与体系结构》
《软件工程——实践者的研究方法》
二. 任务概述
2.1目标
现如今,ATM在一定程度上存在很大的安全隐患,给用户造成很大的经济损失。为了解决这样的问题,我们小组提出了改进ATM自动取款机系统,使用户在操作过程中更加安全,放心,更便捷。
2.2运行环境
操作系统:Windows xp SP3以上(不支持win8及win8.1) 数 据 库:Microsoft SQL Server 2005 硬件环境(建议): CPU:主频2.0GHZ以上 内存:1G以上
硬盘:剩余空间20G以上
2.3条件与限制
随着科技的发展,人们生活水平的不断提高,高性能高效率高安全的产品越来越受到人们的欢迎。 ATM自动取款机是一种非常智能的机器,人们可以直接和它交互,代替以前的手工操作,大大提高了银行的工作效率。同时也给广大用户带来了非常大的方便。由于ATM自动取款机是和服务器是连网的,这就涉及到安全的问题本系统能够有效地解决这个问题。但是本程序也使用户操作时间增加,在一定程度上增加了用户的抱怨率。
三.总体设计 3.1
处理流程
主流程图:
取款流程:
转账流程:
3.2
具体模块及代码实现
1. 用户服务模块(含:开户、登陆、退出)
开户:输入姓名、密码、再次密码、开户金额(不低于1块钱) 填写完没问题后分配账号。
(姓名、密码、开户金额、账号 存入结构体数组里面)
登陆:输入 账户、密码
判断账户是否存在,密码是否正确。 登陆后进入到个人服务界面。 退出:退出ATM 就是退出程序
2. 主菜单模块(含:存款、取款、转账、密码修改、查询余额) 存款:个人账户上的金额加上。 取款:个人账户上的金额减去。
转账:涉及到两个账户 其实就是下标的不同 金额一个减去一个加上。 密码修改:输入新密码、再次输入新密码 判断两次密码是否相同 在用strcpy()函数 将新密码 当前账户下标元素密码成员 并且判断是否修改成功。
查询余额:就是从结构体数组里面调用存金额那个成员
欢迎模块:
定义一个函数void huanying(),利用for循环进行字符的输出。
void huanying() //定义函数 {
int i;
for(i=0;i<10;i++) //for循环 {
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t --------------------------\n"); printf("\t\t\t 欢迎使用 \n");
printf("\t\t\t --------------------------\n");
printf("\n\n\t\t希望此ATM系统可以给您带来方便!"); printf("\n\n\n\n\t\t\t\t正在进入");
shaohou(); //等待系统响应 system("cls");
printf("\n\n\n\n\n\n\n\n"); } }
用户模块:
在此模块,从A,B,C中选择出执行的操作服务,然后进入下一个模块。利用while语句,定义的选择函数char xuanze,实现输出。 伪代码:
void main() //主函数 {
huanying(); system("cls"); while(1) {
char xuanze; //定义函数 system("cls");
printf("\n\n\t欢迎使用\n"); printf("\n\n\t请选择:\n"); printf("\n\n\tA.开户服务\n"); printf("\n\n\tB.登录服务\n"); printf("\n\n\tC.退出。\n"); printf("\n\n\t请选择:"); scanf("%c",&xuanze); switch(xuanze) {
case'a':
case'A':kaihu();break; case'b':
case'B':denglu();break; case'c':
case'C':exit(0);
default:printf("\n\t您的选择错误!");break; }
} }
开户服务: struct kaihu {
char name[10]; char mima[10]; double zong; int zhanghao; }guke[20];
int renshu=0; int xianzai;*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> struct {
int jin_e,zong; int zhanghao; char name[20]; char mima[20]; }guke[20]; int renshu=0; int xianzai; void shaohou() {
int i,j;
for(i=0;i<3;i++) {
printf(".");
for(j=0;j<40000000;j++) { ; } } }
void dedaomima(char mima[]) {
int i=0;
while(1) { char ch;
ch=getch(); if(ch=='\r') {
mima[i]='\0'; printf("\n"); break; } else {
if(ch=='\b') {
if(i>0) {
printf("\b \b"); i--; } } else {
if(i<16) {
mima[i]=ch; printf("*"); i++; } } } } }
void kaihu() {
int k;
for(k=0;k<5;k++) {
printf("\n\n\t正在进入注册页面,请稍后"); shaohou(); system("cls"); }
while(1) {
printf("\n\n\t【开户服务】"); printf("\n\n\t请输入您的姓名:"); char xingming[16]; char yanzheng[20];
scanf("%s",xingming);
printf("\n\n\t请输入密码:"); dedaomima(guke[renshu].mima);
printf("\n\n\t请再次确认您的密码:"); dedaomima(yanzheng);
if(strcmp(guke[renshu].mima,yanzheng)==0) {
printf("\n\n\t密码验证通过:"); break; } else {
printf("两次密码不相同。请重新输入。"); system("cls"); }
}while(1) {
printf("\n\n\t请输入开户金额:"); scanf("%d",&guke[renshu].jin_e); if(guke[renshu].jin_e>0)
{ printf("\n\n\t开户成功,您的可用余额为:%d",guke[renshu].jin_e); break; } else {
printf("\n\n\t开户金额不能低于壹圆!\n\n"); system("cls"); } }
guke[renshu].zhanghao=518518+renshu;
printf("\n\n\t您的账号是:%d请牢记!\n",guke[renshu].zhanghao); printf("\n\n\t开户成功,是否继续?继续请按任意键。\n"); renshu++; getch(); }
登录服务: void denglu() {
int q;
for(q=0;q<8;q++) {
printf("\n\n\t正在进入,请稍后"); shaohou(); system("cls"); }
/*while(1) {
printf("\n\n\t\t【登录服务】"); printf("\n\n\t\t请输入账号:"); int zh;
scanf("%d",&zh); int i;
for(i=0;i<renshu;i++) {
if(zh!=guke[i].zhanghao) {
printf("\n\n\t账号错误,请重新输入。"); continue; } else {
xianzai=i;
printf("\n\n\t账号正确:"); }
}break; }*/
printf("\n\n\t\t【登录服务】"); printf("\n\n\t\t请输入账号:"); int zh;
scanf("%d",&zh);
for(int i=0;i<renshu;i++) {
if(zh!=guke[i].zhanghao) { i++;
if(i==renshu) {
printf("\n\n\t账号错误,请重新输入。"); }
continue; } else {
xianzai=i;
printf("\n\n\t账号正确:"); break; } }
for(i=0;i<3;i++) {
printf("\n\t请输入密码:"); char password[10]; dedaomima(password);
if(strcmp(password,guke[xianzai].mima)==0) {
printf("\n\t密码正确!"); break; }else {
printf("密码输入错误,请重新输入。"); return; getch(); } }
fuwu(); getch(); }
主菜单模块:
此模块主要用于用户进行各种操作服务的选择,实现相关功能,如存款,取款,转账,密码修改,余额查询等等。 void fuwu() {
int i=0;
for(i;i<8;i++) {
printf("\n\n\n\n\n\n\n");
printf("\n\n\n\n\t\t\t正在进入服务,请稍后"); shaohou(); system("cls"); }while(1) {
char shuru; system("cls");
printf("\n\n\t【服务】\n");
printf("\n\n\t%d欢迎使用!\n",guke[i].name); printf("\n\t(请选择:)\n");
printf("\n\ta.存款服务\n"); printf("\n\tb.取款服务\n"); printf("\n\tc.转账服务\n"); printf("\n\td.余额查询\n"); printf("\n\te.密码修改\n"); printf("\n\tf.退出\n");
printf("\n\t请选择服务:"); scanf("%c",&shuru); switch(shuru) {
case 'a':
case 'A':cunkuan();break; case 'b':
case 'B':qukuan();break; // case 'c':
// case 'C':zhuanzhang();break; case 'd':
case 'D':chaxun();break; // case 'e':
// case 'E':xiougai();break; case 'f':
case 'F':printf("返回上级菜单,请按任意键");return; default:printf("\n\t您的选择错误!");break; } } }
存款服务: void cunkuan() {
for(int i=0;i<5;i++) {
printf("\n\n\t正在进入,请稍等"); shaohou(); system("cls"); }
printf("\n\n\n\n\n\n\n");
printf("\n\n\t【存款服务】");
printf("\n\n\t请输入您的存款金额:"); int xincun;
scanf("%d",&xincun);
guke[renshu].zong=guke[renshu].jin_e+xincun;
printf("\n\n\t您现在的可用余额为:%d",guke[renshu].zong); printf("\n\n\t是否继续?继续请按任意键。");
getch(); }
取款服务: void qukuan() {
for(int i=0;i<5;i++) {
printf("\n\n\t正在进入,请稍等"); shaohou(); system("cls"); }
printf("\n\n\t【取款服务】"); printf("\n\n\t请输入取款金额:"); int xinqu;
scanf("%d",&xinqu);
guke[xianzai].zong=guke[renshu].zong-xinqu; if(xinqu<guke[renshu].zong)
printf("\n\n\t取款成功:%d,您现在的可用余额为:%d",xinqu,guke[xianzai].zong);
printf("\n\n\t是否继续?继续请按任意键:"); getch(); }
查询服务: void chaxun() {
for(int i=0;i<5;i++) {
printf("\n\n\t正在进入,请稍等"); shaohou(); system("cls"); }
printf("\n\t【查询服务】");
printf("\n\t您的可用余额为:%d",guke[renshu].jin_e); printf("\n\t是否继续?继续请按任意键."); getch(); }
四.接口设计
4.1 外部接口 硬件接口:
包括和打印机的接口(控制打印机打发票及存款凭证等),和银行数据库主机的接口,和出钞机的接口。对硬件的处理主要由操作系统完成,本软件只调用操作系统提供的打印,出钞等指令。 软件接口:
按照银行指定的格式与银行数据库通信,并需要预留可能在ATM上安装的其他软件的接口以便于扩充功能。 4.2 内部接口
1.前后台程序通信接口,包括配款提醒和维护提醒。 2.系统与数据库接口。
五.测试计划
测试日期、测试人员安排请参考测试计划;测试用例的具体内容,详见测试用例说明。现在本小组仅以会话用例与取款用例进行对ATM机管理系统的单体测试计划;
会话用例
系统允许在一 个会话中执行 多个事务
系统询问是否 执行其它事务
回答“是”
系统显示事务 类型菜单
会话用例
当顾客选择不 执行其它事务 时,会话结束
系统询问是否 执行其它事务
回答“否”
系统弹出银行 卡,准备启动一 个新的会话
事务用例
系统处理一个 不合法的密码
插入了可读取 的卡
输入不正确的 密码尝试某个 事务
执行非法密码
取款用例
系统提示顾客 选择需要提取 的现金的账户
正在显示事务 类型菜单
选择取款事务
系统显示账户 类型菜单
取款用例
系统正确执行 合法取款事务
系统显示取款 金额菜单
选择系统当前 拥有单小于账 户余额的取款 金
额
系统弹出现金, 打印收据,更新 账户余额
取款用例
系统验证是否 有足够的现金, 系统现有的现 完成用户的请 金数量小于顾 求 客请求的数量
选择大于当前 系统拥有现金 数量的取款金 额
系统将显示一 个信息,提示现 金不足,请重新 选择取款金额
取款用例
系统验证顾客 账户余额是否 能够满足请求 的金额
系统正在请求 取款金额
选择一个取款 金额使得该金 额小于当前系 统中的现金余 额但是大于用 户账户余额
系统将显示一 个信息位顾客 提供是否执行 其它事务的选 项
取款用例
取款事务在选 择金额之前可 以被顾客取消
系统显示账户 类型菜单
按下“CANCEL” 系统显示信息为 顾客执行其它事 键务提供相关选项