ATM系统课程设计报告(c语言)

效果展示

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多个函数凑在一起,写了这个项目后我学会了写自定义头文件,用于写变量和函数声明,自定义源文件用来实现声明的函数,这样做,项目也逐渐变得层次鲜明,可读性提高了好几倍,通过不同模块的分工来实现这个项目。

我觉得编写程序需要很大的耐心,当然细心也很需要,在编程的过程中有很多错误都是自己的粗心造成的,。这次的课程设计也是一次很好的对自我的检查,使我受益匪浅!

 

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值