文档名称: | 详细设计说明书 |
项目名称: | ATM自动取款机系统 |
编写: | 张恒友 |
审核: | 王旭 |
日期: | 2016年6月5日 |
院系: | 计算机学院 |
专业: | 计算机科学与技术 |
一.引言
1.1 编写目的
根据《需求规格说明书》,在仔细考虑讨论之后,我们又进一步对《ATM自动取款机系统》软件的功能划分、数据结构、软件总体结构进行设计,从而完成概要设计,作为软件详细设计的基础。
1.2 项目背景
项目委托单位:计算机学院软件工程实验。
开发单位:班ATM自动取款机系统项目组。
由于柜台常常会拥挤,排队的人很多,而且大多数的客户都是取款,存款等,而有些办理业务的需要一定的时间,这会使得一些只需要取款等的客户会有较长时间的等待。所以银行希望设计一个系统,能让客户在系统上进行简单的操作,比如存款、取款、查询余额、转账等。
1.3 定义
ATM: Automatic Teller Machine,自动柜员机。
1.4 参考资料
《计算机软件需求说明编制指南》
《计算机软件产品开发文件指南》
《ATM系统可行性分析报告》。
《软件设计与体系结构》
《软件工程——实践者的研究方法》
二. 任务概述
2.1目标
现如今,ATM在一定程度上存在很大的安全隐患,给用户造成很大的经济损失。为了解决这样的问题,我们小组提出了改进ATM自动取款机系统,使用户在操作过程中更加安全,放心,更便捷。
2.2运行环境
硬件环境:
CPU:1GHZ及以上
内存:1G以上
硬盘:20G以上
软件环境:
操作系统:Microsoft Windows XP或更高版本
数 据 库:Microsoft SQL Server 2005
Web服务器:Tomcat5.0以上
支持浏览器:Internet Explorer 7.0及其以上版本
开发环境:MyEclipse,jdk,Microsoft SQL Server 2005
2.3条件与限制
随着科技的发展,人们生活水平的不断提高,高性能高效率高安全的产品越来越受到人们的欢迎。 ATM自动取款机是一种非常智能的机器,人们可以直接和它交互,代替以前的手工操作,大大提高了银行的工作效率。同时也给广大用户带来了非常大的方便。由于ATM自动取款机是和服务器是连网的,这就涉及到安全的问题本系统能够有效地解决这个问题。但是本程序也使用户操作时间增加,在一定程度上增加了用户的抱怨率。
三.总体设计
3.1 处理流程
主流程图:
用户流程:
存款流程:
取款流程:
转账流程:
查询流程
:
改密:
3.2 具体模块及代码实现
1. 主菜单模块(含:存款、取款、转账、密码修改、查询余额)
存款:个人账户上的金额加上。
取款:个人账户上的金额减去。
转账:涉及到两个账户 其实就是下标的不同 金额一个减去一个加上。
密码修改:输入新密码、再次输入新密码 判断两次密码是否相同
在用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
#include
#include
#include
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
{
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
{
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
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机管理系统的单体测试计划;
用例 | 被测试的功能 | 初始系统状态 | 测试输入 | 期望的结果 |
会话用例 | 系统读取顾客的银行卡 | 系统处于ON状态,并没有为顾客提供服务 | 插入可读的银行卡 | 银行卡被接收,系统请求输入密码 |
会话用例 | 系统弹出不可读取的银行卡 | 系统处于ON状态,当前没有为顾客提供服务 | 插入不可读取的银行卡 | 银行卡被弹出,系统显示错误信息,准备启动一个新的会话 |
会话用例 | 系统接收顾客的密码 | 系统请求顾客输入密码 | 输入密码 | 系统显示一个事务类型菜单 |
会话用例 | 系统允许顾客执行事务 | 系统显示事务类型菜单 | 执行事务 | 系统询问顾客是否希望执行其它事务 |
会话用例 | 系统允许在一个会话中执行多个事务 | 系统询问是否执行其它事务 | 回答“是” | 系统显示事务类型菜单 |
会话用例 | 当顾客选择不执行其它事务时,会话结束 | 系统询问是否执行其它事务 | 回答“否” | 系统弹出银行卡,准备启动一个新的会话 |
事务用例 | 系统处理一个不合法的密码 | 插入了可读取的卡 | 输入不正确的密码尝试某个事务 | 执行非法密码 |
取款用例 | 系统提示顾客选择需要提取的现金的账户 | 正在显示事务类型菜单 | 选择取款事务 | 系统显示账户类型菜单 |
取款用例 | 系统正确执行合法取款事务 | 系统显示取款金额菜单 | 选择系统当前拥有单小于账户余额的取款金额 | 系统弹出现金,打印收据,更新账户余额 |
取款用例 | 系统验证是否有足够的现金,完成用户的请求 | 系统现有的现金数量小于顾客请求的数量 | 选择大于当前系统拥有现金数量的取款金额 | 系统将显示一个信息,提示现金不足,请重新选择取款金额 |
取款用例 | 系统验证顾客账户余额是否能够满足请求的金额 | 系统正在请求取款金额 | 选择一个取款金额使得该金额小于当前系统中的现金余额但是大于用户账户余额 | 系统将显示一个信息位顾客提供是否执行其它事务的选项 |
取款用例 | 取款事务在选择金额之前可以被顾客取消 | 系统显示账户类型菜单 | 按下“CANCEL”键 | 系统显示信息为顾客执行其它事务提供相关选项 |
取款用例 | 取款事务在顾客请求取款金额之前的任何时候可以被取消 | 系统显示请求取款金额菜单 | 按下“CANCEL”键 | 系统显示信息为顾客执行之前事务的选项 |
六.详细设计小结和相关说明
由于本系统最终将会运行于取款机之上,而取款机是一个典型的嵌入式设备,内存容量有限,运行速度比较缓慢,故在进行系统设计的时候不仅得考虑普通取款机系统设计的一般问题,还得额外考虑相关设备的一些特性。本详细设计有如下几个特点:
及时释放内存,提高内存资源利用率。
利用主菜单控制,进行功能选取,使程序简单化,模块化,清晰化。
正确合理使用多模块进行系统设计。
使用人工选择进行界面切换。
本文来源:https://www.2haoxitong.net/k/doc/2cf6157dc7da50e2524de518964bcf84b8d52d52.html
文档为doc格式