效果展示
ATM系统演示
源代码
https://github.com/Wuqingshun123/ATM_system
高级语言程序设计课程设计
1. 课程设计目的与要求
目的:
· 加深对C语言编程的理解
· 提高编程技巧
· 解决实际问题
· 提高思维逻辑的严谨性
· 提高项目实战水平
· 增强对C语言面向过程编程的理解
要求:
· 代码编写规范:代码格式整齐,命名清晰,注释详细。
· 程序健壮性:程序能够正确处理各种输入,避免崩溃和异常。
· 必要的提示信息:程序运行过程中提供必要的提示信息,帮助用户理解和使用。
· 代码逻辑缜密:程序逻辑严谨,功能实现无冗余代码。
· 运用自编写的链表数据结构及其方法:通过自定义链表结构和方法,解决实际问题。
· 程序无bug:确保程序经过充分测试,无明显bug。
· 支持持久运行:程序能够长时间稳定运行,不会因为时间的推移而出现问题。
2. 问题描述
设计并实现一个ATM系统,系统包含以下功能模块:
对于用户登录
- 用户登录
- 查询余额
- 存款
- 取款
- 转账
- 修改密码
- 查询交易记录
- 注销账户
-贷款
-还款
对于管理员登录
-冻结账号
-解冻账号
-查询详细版用户交易记录(包括查询所有和单个查询)
-查询用户(包括查询所有和单个查询)
-注销账户
等下提供
3. 系统总体设计与算法分析
系统设计:
- 系统结构:ATM系统主要由用户管理模块、管理员模块、交易处理模块等组成。
- 模块关系:用户通过登录进入用户管理模块、管理员模块,可以选择不同的功能模块进行操作,所有操作通过交易处理模块记录。
- 系统特色:
1、完善的输入处理(在该输入整数的地方输入字符串,小数?输入3.695元这种比1分还要小的钱?又或者取款一个负数?给自己转账?借完钱,直接注销账户?等等),程序有严密的逻辑体系,对用户的每一个关键输入都会检查,以保证程序运行正确,程序逻辑正确。
2、交易记录严明的时间观念,交易记录的时间是直接获取的执行此操作的本地时间。
3、管理员账户。有了管理员可以解冻账号,查看所有人的交易记录,查询所有用户等。
4、所有数据全部写在文件里面,下次运行直接读取文件,方便重复使用。
5、程序有完善的异常检查机制,保证程序一经运行不会崩溃。
7、自定义list结构体,用于存储用户信息,这样提高了程序运行效率。
关键算法:
-查询用户算法:用自编写的链表方法find()方法,从头结点开始一个一个比对,直到用户的卡号与查询的卡号一致,平均情形o(logn)最差情形o(n)
-添加用户算法(注册):直接尾插法插入,时间复杂度o(1)
-删除用户算法(注销):用自编写的delete()方法直接改变上一个节点的指向,并free掉当前节点,平均情形o(logn)最差情形o(n)
- 登录验证算法:根据输入的用户名和密码与存储的数据进行比对,确保用户合法性。
平均情形o(logn)最差情形o(n)
- 交易处理算法:根据用户输入的操作类型(存款、取款、转账等)更新账户余额,并记录交易明细。o(n),n为交易记录的条数。
4.程序流程图与函数说明
关键函数:
void print_all_users(); //用特定的格式直接显示所有的用户
void adminunfreeze(); //管理员的解冻方法
void regist(); //注册功能入口
void login(); //登录功能入口
void add(struct user* user); //传入一个user结构体指针,将它插入到链表里面
void removeuser(struct user* user); //传入一个user结构体指针,删除链表里面的user
void initial(); /链表初始化(定义头结点,尾节点)
struct user* find(char* card); //传入用户卡号,直接返回对应的用户结构体指针
struct list* getlisthead(); //返回链表的头结点
void wait(char* str); //用于缓冲用户的输入
int getint(); //返回一个整数,目的是异常处理,直到输入合法才返回,否则重新输入
void updata(); //将当前进程里面的数据更新到文件里面
char* gettime(); //以字符串的形式返回当前本地计算机的时间
double getmoney(); //返回一个实数,目的是异常处理,直到输入合法才返回,否则重新输入
void loadusers(); //读取文件里面的数据,加载到进程里面
void printall_record(); //打印所有交易记录
struct user* getuser(char*, int, char*, char*, char*); //user的构造方法
char* creatID(); //随机生成卡号,以字符串的形式返回
void write_single(struct user* user); //传入一个user,将这个user的信息写在文件里面
5. 遇到的问题及解决方法
问题1:
用户密码连续输错误后,账号会冻结,但是初始界面单独增加解冻方法不理想。
解决方法1:
设立管理员账号,里面添加解冻方法,用户账号被冻结后找管理员解冻。
问题2:
用数组存储用户,注销功能运行速度慢(最差0(n*2)),存储空间有限。
解决方法2:
自编写链表存储用户,提高插入和删除的运行速度,且可以动态分配空间。
缺点:
查询速度变慢,但是o(logn)并不会太慢。
问题3:
c语言没有自带的异常处理,如果输入错误,可能导致程序崩溃。
解决方案3:
scanf等函数在输入错误时,会返回特定值,例如sacnf输入错误返回-1,利用这些机制判断输入是否有误,如果有误则提醒重新输入
6. 课程设计小结
ATM系统现在是一个非常强大的系统,功能加起来有25个之多。
在编写过程中,我学到了很多新东西,也对之前所学更加巩固了,更是增强了我的逻辑处理,代码书写能力,更增强了我对c语言的理解。
写这个项目给了我全新的体验,之前我的c语言代码都是20多个函数凑在一起,写了这个项目后我学会了写自定义头文件,用于写变量和函数声明,自定义源文件用来实现声明的函数,这样做,项目也逐渐变得层次鲜明,可读性提高了好几倍,通过不同模块的分工来实现这个项目。
我觉得编写程序需要很大的耐心,当然细心也很需要,在编程的过程中有很多错误都是自己的粗心造成的,。这次的课程设计也是一次很好的对自我的检查,使我受益匪浅!