长 沙 学 院
课程设计说明书
题系
(
部
目 )
程序设计基础课程设计 计算机科学与技术系 2012级计科1班
刘江惠 2012021102
黄娟
2013.9.2-2013.9.6
专业(班级) 姓学指起
名 号
导止
教日
师 期
课程设计任务书
课程名称:程序设计基础课程设计 课程编码:JX020139 课程类别:集中性实践教学环节 学分数:1 学时数:1周 开课学期:3
设计题目:银行ATM存取款系统、个人通信录系统(任选一题)
已知技术参数和设计要求:
需求说明及要求
题目一:银行ATM存取款系统
银行ATM存取款系统业务描述如下:
银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。本系统各个业务有如下注意点:
(1) 登陆系统
用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。
(2) 开户业务
要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。
(3) 存款业务 客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。
(4) 取款业务 客户登陆系统后,选择取款业务,即可以将输入的取款金额从相应的银行账户取出,但是取款金额必须大于目前的账户余额。
(5) 查询业务 客户登陆系统后,可以选择查询业务,查询账户余额。
(6) 转账业务
客户登陆系统后,可以选择转账业务,进行转账。注意的是转账的目的账户必须是本系统已经存在的银行账户。
(7) 修改密码
客户登陆系统后,可以选择修改密码业务,进行密码修改。
各阶段具体要求: 1、需求分析阶段
熟悉系统业务,从业务中抽取出系统的需求,形成完善的需求说明书。
2、系统设计阶段
根据需求,进行程序设计,包括定义系统的界面、定义系统数据的存储方式等,形成完善的设计说明书。
3、编码实现阶段 (1)完成代码编写 (2)要求代码编写规范
4、系统测试阶段 (1)完成功能调试
(2)要求完成必要的测试工作
5、交付实施阶段
(1)提交可正常执行的系统
(2)提交系统需求说明书、设计说明书、程序代码 (3)撰写课程设计报告书 (4)要求规范地书写文档
设计工作量:
(1)软件设计:完成问题陈述中所提到的所有需求功能。
(2)论文:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。
工作计划:
软件开发进度如下,论文同步进行; 1. 选定题目(2课时) 2. 需求分析(2课时) 3. 概要设计(2课时) 4. 详细设计(2课时)
5. 6. 7. 8. 编码实现(8课时) 系统测试(1课时) 模拟实施(1课时) 答辩(2课时)
班级 周次 1周周一 1周周一 节次 3-4 5-8 3-4 5-8 5-8 5-8 教室 致远楼1403 致远楼1403 致远楼1403 致远楼1403 致远楼1403 致远楼1408 内容 布置任务 上机调试 上机调试 答疑 上机调试 答辩 黄娟 指导教师 12计科1班 1周周二 1周周三 1周周四 1周周五
注意事项 提交文档
长沙学院课程设计任务书 长沙学院课程设计论文 长沙学院课程设计鉴定表
(每学生1份) (每学生1份) (每学生1份)
指导教师签名: 日期: 教研室主任签名: 日期: 系主任签名: 日期:
长沙学院课程设计鉴定表
姓名 刘江惠 学号 2012021102 专业 银行ATM存取款系统 计算机科学与技术 班级 12计科1 黄娟 设计题目 指导教师 指导教师意见: 评定等级: 教师签名: 日期: 答辩小组意见: 评定等级: 答辩小组长签名: 日期: 教研室意见: 教研室主任签名: 日期: 系(部)意见: 系主任签名: 日期: 说明 课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
目 录
第1章 问题描述 .................................................................... 2
1.1 设计内容 ................................................................... 2 1.2 设计要求 ................................................................... 2
1.2.1 功能要求.............................................................. 2 1.2.2 界面要求.............................................................. 3 1.2.3 技术要求.............................................................. 3
第2章 系统设计与实现............................................................... 4
2.1 系统总体设计................................................................ 4
2.1.1 数据结构设计 ......................................................... 4 2.1.2 各功能模块间的关系 ................................................... 5 2.2 系统详细设计与实现 .......................................................... 5
2.2.1 主函数................................................................ 7 2.2.2 注册函数.............................................................. 7 2.2.3 登陆函数.............................................................. 9 2.2.4 存款函数..............................................................11 2.2.5 取款函数............................................................. 12 2.2.6 转账函数............................................................. 15 2.2.7查询函数 ............................................................. 17 2.2.8 修改密码............................................................. 18
第3章 系统测试 .................................................................. 22
3.1 主菜单界面 ................................................................ 22 3.2 开户界面 .................................................................. 22 3.3 登陆界面 .................................................................. 23
3.3.1 存款 ................................................................ 23 3.3.2 取款 ................................................................ 24 3.3.3 转账 ................................................................ 24 3.3.4 修改密码............................................................. 25 3.3.5 查询 ................................................................ 26
总结 .............................................................................. 27
第一章 问题描述
1.1 设计内容
本次实训设计了一个银行ATM存取款模拟管理系统,具有注册、登陆功能。用户登陆该系统后能为用户提供存款、取款、查询、转账和修改密码的功能。在这个过程中,利用到了文件等技术。
1.1.1设计要求
1.菜单设计:要有两个菜单,登陆之前有一个登陆和注册菜单,然后登陆进去后要有一个可以进入各个功能的菜单。
2.注册设计:要求输入用户的一些个人信息。能够自己设置密码。并且给予客户账号。 3.登陆设计:要求要验证用户的账号和密码。 4.存款设计:要能输入金额并且能够与余额累加。 5.取款设计:要能验证余额并且能够与余额相减。
6转账设计:要能验证转入账号并且能够验证转出金额不大于余额。 7账户查询设计:要能打印出账户的余额。
1.2.1 功能要求
开户功能
客户需要提供姓名、身份证号等信息,经过系统处理后,将产生的用户账号及客户信息写入账户文件中。 2. 登录功能
用户登陆时,必须在登陆界面输入其银行账户和密码,通过其正确输入的银行账户登陆系统,进入登陆界面后即可进行以下操作:
(8) 取款
要求客户输入取款金额,经过系统处理后,更新该账户所对应的账户余额。 (9) 存款
要求客户输入存款金额,经过系统处理后,更新该账户所对应的账户余额。 (10) 转账
要求客户输入目标账号,再经过确认其账号输入是否有误来判断转账是否继续,在余额充足的条件下进行转账程序,否则提示余额不足。 (11) 查询
系统根据该客户的账户信息查询其信息文件,将查询结果显示出来。 (12) 修改密码
客户登陆系统后,可以选择密码修改业务,进行修改。
1.2.2 界面要求
① 界面设计要清晰合理; ② 排版要整洁易于看懂; ③ 给出相关的注释。
1.2.3 技术要求
① ② ③ ④ ⑤ ⑥ ⑦
函数的定义和调用; 循环语句的应用
Switch语句的多分支选择;
If 条件语句使用:包括if 语句类型的选择,及嵌套使用; 熟悉结构体的应用及如何定义; 函数跳转需求的实现; 熟悉对文件的使用;
第2章 系统设计与实现
2.1 系统总体设计
2.1.1 数据结构设计
在整个程序中,有结构体类型的数据构成了一个链表,这里所用到的数据,有账户、姓名、密码、账户余额。具体类型定义如表2.1所示。
表2.1 数据类型定义 数据 姓名 账户号码 密码 账户余额 定义类型 char char char double 长度 20 8 10 - 注:
1) 账户号码、客户名称、客户密码通常是一行字符串,所以将其设计成字符数组,再规定其字符串的长度。
2) 账户余额通常是带小数的,在C语言中可以用float、double等数据类型定义。在这里将账户余额定义为double类型的变量。
2.1.2 各功能模块间的关系
该ATM银行管理系统的主界面由七个主要功能构成,在登陆界面中又由五个功能构成,其大致结构图如图所示。
存 款
ATM管理系统 注册 登录 退出 取款 转账 修改查询 退出 图1.1功能流程图 2.2 系统详细设计与实现 2.2.1 主函数
在打开的主界面中,通过switch语句来选择各项操作,在进入各函数的算法过程。其流程图如2.1所示。
开始 注册 登录 是
在判断用户是否已经存在? 否
注册信息
结束 图2.1主函数流程图
主要代码:
int main() // 1 主函数 {
int flog=0;
char a[4]; //登录的初始页面 printf(\"==============欢迎使用ATM系统================\\n\"); printf(\" || ★1 开户 \\n\"); printf(\" || ★2 登陆 \\n\");
printf(\"=============================================\\n\"); while (flog==0) {
printf(\"请输入您的选项:\");
scanf(\"%s\或者用gets(a);也可以 switch(a[0]) {
case '1':kh();flog=1;break; //跳转致开户函数 case '2':dl(),flog=1;break; //跳转致登陆函数
default:printf(\"输入错误,请从新输入!\\n\"); flog=0;break; } }
system(\"pause\"); return 0; }
2.2.2功能模块:注册
对应函数:zc()
输入:姓名,账号,密码,存款金额 函数跳转:跳转到main;
实现功能:为客户注册开户 流程图:
开始 按照提示选择注册
主要代码:
void kh() {
输入姓名、身份证号、密码。 注册成功,生成账号 回到主函数 结束 图2.2注册函数流程图 // 2 新用户注册 FILE *fp; int i,s,flog=1; double money;
char name[20],password[7],count[20];
printf(\"请输入你的姓名,账号,密码及存款数目\\n\"); //新用户信息输入 scanf(\"%s %s %s %lf\ i=strlen(password); //计算字符串数组长度函数 if(i>6) {
printf(\"密码应小于六位!请重新输入!\\n\"); kh(); //跳转致开户函数界面 }
fp=fopen(\"text.txt\ //打开一个文本文件 text(只读) for(i=0;i if(strcmp(count,user[i].count)==0)flog=0; //标记为已经注册用户 } fclose(fp); if(flog!=0) { fp=fopen(\"text.txt\ //打开一个文件文本text(读写) fprintf(fp,\"%s %s %s %.2lf\\n\ //新用户信息收集 fclose(fp); number+=1; //标记已经注册的用户数量 printf(\"恭喜您注册成功\\n\"); printf (\"返回按 1\\n\"); scanf(\"%d\ if(s==1) { system(\"cls\"); main();//清屏并且跳转致主函数界面 } } else { printf(\"该用户已存在,您不能使用!\\n\"); kh(); } } //磁 2.2.3功能模块:登录 对应函数:dl() 输入:账号,密码 函数跳转:跳转到存款、取款、转账、查询修改密码相应功能项的函数; 实现功能:登录进入功能选项; 流程图: 开始 请输入账号和密码 主要代码: 否 判断用户账号和密码是否相同? 是 进入主页面进行下面操作 结束 图2.3登陆函数流程 void dl() // 已注册用户 { FILE *fp; printf(\"请输入您的账号及密码!\\n\"); int flog=0,i,a=100; char temp_name[20],temp_password[7],temp_count[20],k[2]; // 用户登录 while(flog==0) { scanf(\"%s %s\ //调试时空格分别输入 fp=fopen(\"text.txt\ //打开一个文本文件 text(只读) for(i=0;i fclose(fp); if(a menu(user[a].count); //跳转至选择函数界面 flog=1; //标记为已经登陆用户 } else printf(\"输入错误,请重新输入!\\n\"); dl();break; //跳转至登陆函数界面,结束循环 break; } system(\"pause\"); } 2.2.4功能模块:存款 对应函数:ck() 输入:金额; 函数跳转:存款后返回到登录函数; 实现功能:向账户存入一定金额; 流程图: 开始 按照提示选择存款选项 输入要本次存入的金额。 显示存款成功 结束 图2.4存款函数流程图 主要代码: void ck(char x[20]) // 1 存款功能 {FILE *fp; int i,a=0; double t; printf(\"请输入存储金额:\\n\"); scanf(\"%lf\ //记录存款金额 fp=fopen(\"text.txt\ for(i=0;i fclose(fp); user[a].money+=t; //资金累加 fp=fopen(\"text.txt\ //打开一个文本文件(只写) for(i=0;i fclose(fp); printf(\"存储成功!\\n\"); printf(\"返回请按 1\\n\"); //返回主函数 scanf(\"%d\ if(i==1) { system(\"cls\"); menu(user[a].count); //清屏并且跳转至选择函数界面 } 2.2.5功能模块:取款 对应函数:qc() 输入:账户,密码; 函数跳转:取款成功后返回登陆函数,不成功则返回主函数; 实现功能:从账户中取出一定金额,并保存剩余金额数; 流程图: 主要代码: void qk(char x[20]) { 开始 否 是否进入取款业务 还回主界面 是 请输入取款金额 否 判断取款金额是否小于存款金额 是 取出现金,结算余额并保存 结束 图2.5取款函数流程图 // 2 取款功能 FILE *fp; int i,a=0; double t; //定义一个提取资金变量 printf(\"请输入提取金额:\\n\"); scanf(\"%lf\ fp=fopen(\"text.txt\ //打开一个文件文本text(只读) for(i=0;i if(user[a].money>=t) //判断提取资金是否超出用户资金 { user[a].money-=t; fp=fopen(\"text.txt\ //打开一个文件文本text(只写) for(i=0;i printf(\"取款成功!\\n\"); //返回主函数 } else printf(\"取款失败!\\n\"); printf(\"返回请按 1\\n\"); scanf(\"%d\ if(i==1) { system(\"cls\"); menu(user[a].count); } //清屏并且跳转至选择函数界面 } 2.2.6功能模块:转账 对应函数:zhuanz() 输入:账户,密码; 函数跳转:转账成功跳转到登录函数,否则回到主函数main; 实现功能:实现用户间的转账; 流程图: 开始 输入要转入的账号 否 判断该账号是否 存在 是 输入转账金额 是 否 判断转账金额 是否大于余额 结束 图2.6转账函数流程图 主要代码: void zhuanz(char x[20]) // 3 转账功能 { FILE *fp; double t; int a=100,i,b=100; char z[20]; //定义一个被转账用户名字符数组 printf(\"请输入对方账号!\\n\"); scanf(\"%s\ //或者用gets(z);也可 printf(\"请输入转账金额\\n\"); scanf(\"%lf\ fp=fopen(\"text.txt\ //打开一个文件文本text(只读) for(i=0;i if(strcmp(z,user[i].count)==0)b=i; } fclose(fp); fp=fopen(\"text.txt\ for(i=0;i if(strcmp(x,user[i].count)==0)a=i; } if(b fclose(fp); user[a].money-=t; user[b].money+=t; fp=fopen(\"text.txt\ for(i=0;i fclose(fp); printf(\"转账成功!\\n\"); } else printf(\"账号或金额错误,转账失败\\n\"); printf(\"返回请按 1\\n\"); // 返回主函数 scanf(\"%d\ if(i==1) { system(\"cls\"); menu(user[a].count); } } 2.2.7功能模块:查询 对应函数:cx() 输入:账户,密码; 输出:账户余额; 函数跳转;查询完毕后返回登录函数; 实现功能:输出账户余额; 流程图: 开始 选择查询余额 显示余额 结束 图2.7查询函数流程图 主要代码: void cx(char x[20]) // 4 查询功能 {FILE *fp; printf(\"您的信息如下:\\n\"); int i,a=0; fp=fopen(\"text.txt\ for(i=0;i printf(\"姓名:%s 账号:%s 密码 : %s 额%.2lf\\n\ fclose(fp); printf(\"返回请按 1\\n\"); scanf(\"%d\ if(i==1) { system(\"cls\"); menu(user[a].count); } } 2.2.8功能模块:修改密码 对应函数:xg() 输入:账户,密码; 余 函数跳转:改密成功后返回到登录函数; 实现功能:输出账户余额; 流程图: 开始 输入原密码 否 结束 判断原密码是否正确 否 是 输入新密码 返回主菜单 再次输入 新密码 是 判断两次新密码是否相同 修改密码成功 图2.8修改密码函数流程图 主要代码: void xg(char x[20]) // 5 修改密码 {FILE *fp; int i,a; char password_1[7],password_2[7]; printf(\"请输入密码\\n\"); fp=fopen(\"text.txt\ for(i=0;i if(strcmp(x,user[i].password)==0)a=i; } fclose(fp); scanf(\"%s\ printf(\"请再输入密码\\n\"); //两次输入密码 scanf(\"%s\ if(strcmp(password_1,password_2)==0) { strcpy(user[a].password,password_1); //把改过后的密码复制到原来密码函数 fp=fopen(\"text.txt\ for(i=0;i printf(\"修改成功\\n\"); } fclose(fp); printf(\"返回请按 1\\n\"); scanf(\"%d\ // 返回主函数 if(i==1) { system(\"cls\"); menu(user[a].count); } //清屏并且跳转至选择函数界面 } 第3章 系统测试 3.1 主菜单界面 进入该银行管理系统时,弹出主菜单如图3.1所示,在主菜单上选择相应操作。输入相应操作选项,跳入开户注册界面或登录界面。 图3.1 主菜单界面 3.2 注册界面 输入姓名,账号,密码以及存款金额,注册成功后提示注册成功;完成后返回按1。 图3.2 注册界面 3.3登录界面 开户后选择登陆界面,提示输入账号和密码,如密码或账号错误,提示重新输入;如正确,进入登录后的五个功能界面选项;返回按1。 图3.3登录界面 3.4 存款界面 选择存款业务后,提示输入存款金额,成功后提醒返回;完成后返回按1。 图3.4 存款界面 3.5 取款界面 选择存款功能时,存款成功提醒成功;如金额不足则显示取款失败;提醒返回按1。 图3.5 取款界面 3.6转账界面; 选择转账业务后,提醒输入转账金额及转入账户账号;账号及密码,提示转账成功;如密码或账号错误则提示失败;完成后返回按1。 图3.6转账界面 3.7修改密码界面 选择修改密码功能界面后,共需要俩次输入密码,作用是对修改的密码进行确认,完毕后提示修改 成功;完成后返回按1。 图3.7修改密码界面 3.8查询界面 选择查询业务后,输出姓名,账号,密码,及用户的余额;完成后返回按1。 图3.8 查询界面 总 结 1. 感谢黄娟老师的细致的讲解,并且能够给予我们适当的参考意见,还能耐心的讲解一些程序错误的地方!这些帮助给了我们一些新的思路和鼓励,对于我来说十分重要! 2. 通过本次,学习首先懂得了如何正确去对待写程序这项枯燥而繁琐的工程,如何去建立函数模块,然后对上学期的学习有了深入的了解与巩固,这次写文档也让我多了一次练习文档的机会,对于以后下文档有了一定的经验。这次做ATM让我看到,只掌握简单的函数知识而不去加深和运用时行不通的。 因为之前的学习不够到位,很多与函数的跳转问题、数据存储问题相关的函数语句都不会使用!在反复地向老师提问和求解和同学的帮忙修改后,才勉强完成这次实训。不过这次在黄娟老师的带领下,通过编写ATM的过程,反复使用这些东西,增加了熟练度,对于循环的应用更加熟练。我真正的发现了自己一直以来的欠缺与不足: 自己对结构体数组定义这部分内容不够深入,真正动手编写的时候才发现很难正确定义完整,更不知道怎样使其自如的参与到程序的使用中。 我对于文件这块还是不太了解,也不会自己使用。这次代码中的读取文件和写文件函数都是在同学和老师的帮助下完成的!缺少了这些知识的补充与衔接,自己写的程序很难完整运行。 在写程序时的调理不够清晰,所以编译的时候经常出现符号不匹配、丢失等问题。 编程序的时候缺乏耐心。 基础编程知识掌握不牢固,一知半解,导致程序有很多漏洞,特别是文件那部分,如果缺少老师和同学的帮助与指导,很多功能根本无法实现。 程序部分问题尚未解决:如账户余额不足时的处理;修改密码方面考虑不周全等问题;这次实训让我发现了自身存在的问题,我也会以此为纠正的基础,时刻提醒自己,戒骄戒躁,我还有很多事情需要去探索学习! 因篇幅问题不能全部显示,请点此查看更多更全内容