ATM管理系统
名称 | 内容 |
---|---|
课程班级 | 班级连接 |
作业要求 | ATM管理系统 |
学号 | 3180701313 |
作业要求
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写
源代码
导入函数和数据结构设置
全系统使用单链表进行数据的存储操作,对于ATM系统的操作中,用户使用自己的卡号以及密码登录系统。进入系统后用户选择要进行的操作,对于开户操作用户可以帮助其他人进行开户,也可以增加自己的账户,但是在进行其他操作的时候用户只可以对自己的账户进行操作,基于这样的思考,之后的其他操作系统不再要求用户输入卡号,直接读入用户登入系统时的卡号进行操作。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 6 //密码六位
/*
1、文件读写出现有用户信息
2、开户,销户
3、余额查询
4、存款,取款,转账
*/
struct user{
int card; //卡号 2020 04 06 001
char name[6]; //姓名
int person_num; //身份证号 3610 2000 0919
float money; //余额
char passward[N]; //密码
struct user *next; //指向下一个结点
};
主函数设置
int main() {
struct user *p=NULL;
int card=2001,count1=0,count2=0;
char passward[N],c;
int flag;
struct user *r=NULL;
int flag1=1;
p=readfile(p); //从文件里读取用户信息
printf("***************************************\n");
printf("** **\n");
printf("** 欢迎使用ATM系统 **\n");
printf("** **\n");
printf("***************************************\n");
printf("请输入用户账号:");
scanf("%d",&card);
printf("\n请输入密码:");
scanf("%s",&passward);
for(r=p->next;r!=NULL;r=r->next){
count2++;
if(card==r->card && strcmp(r->passward,passward)==0){
printf("\n登录成功\n");
break;
}else{
count1++;
}
}
if(count1==count2){
printf("\n登录失败\n");
exit(0);
}
while(flag1){
menu();
printf("选择相应操作:");
scanf("%d",&flag);
switch(flag){
case 1:{ //开户
p=add_user(p);
break;
}
case 2:{ //查询账号余额
search_user(p,card);
break;
}
case 3:{ //取款
get_money(p,card);
break;
}
case 4:{ //存款
put_money(p,card);
break;
}
case 5:{ //转账
turn_money(p,card);
break;
}
case 6:{ //销户
p=delete_user(p,card);
break;
}
default :exit(0);break;
}
printf("\n继续操作(1)\n");
printf("\n退出系统(0)\n");
scanf("%d",&flag1);
system("cls");
}
savefile(p); //重新将新增的信息写入事先编好的text文件里
return 0;
}
目录导航界面
//菜单
void menu(){
system("cls");
printf("************************************************\n");
printf("** 1、开户 2、查询 **\n");
printf("** 3、取款 4、存款 **\n");
printf("** 5、转账 6、销户 **\n");
printf("** 退出(任意键) **\n");
printf("************************************************\n");
}
用户信息文件读入
//读入现有用户数据
struct user * readfile(struct user *p){
struct user * r=NULL;
FILE *fp; //定义文件指针
p=(struct user*)malloc(sizeof(struct user));
p->next=NULL;
if ((fp = fopen("user.txt", "r")) == NULL){ //读入失败
printf("***************************************\n");
printf("** **\n");
printf("** ERROR:无法正常读入用户数据!! **\n");
printf("** (系统退出) **\n");
printf("** **\n");
printf("***************************************\n");
exit(0);
}else{ //读入成功
while (!feof(fp))
{
r=(struct user*)malloc(sizeof(struct user));
fscanf(fp,"%d%d%f%s%s",&r->card,&r->person_num,&r->money,&r->passward,&r->name);
r->next=p->next;
p->next=r;
}
}
fclose(fp);
return p;
}
用户信息写入文档
//写入用户信息
void savefile(struct user *p)
{
struct user *r=NULL;
FILE *fp;
r=p->next;
fp=fopen("user.txt","w+");
while(r!=NULL)
{
fprintf(fp,"%d\t%d\t%f\t%s\t%s\n",r->card,r->person_num,r->money,r->passward,r->name);
r=r->next;
}
fclose(fp);
}
开户
//开户
struct user *add_user(struct user *p){
struct user *r;
struct user *q;
char c;
r=(struct user*)malloc(sizeof(struct user));
printf("请输入身份证号,密码,姓名(回车键隔开):\n");
scanf("%d",&r->person_num);
scanf("%s%s",&r->passward,&r->name);
r->card=2000+rand()%100;
for(q=p;q!=NULL;q=q->next){
if(q->card==r->card){
r->card=r->card+1;
}else{
continue;
}
}
r->money=0;
r->next=p->next;
p->next=r;
printf("\n开户成功\n");
printf("新增用户:卡号:%d\t身份证:%d\t余额:%f\t姓名:%s\n",r->card,r->person_num,r->money,r->name);
return p;
}
查询账号余额
//查询
void search_user(struct user* p,int card){
for(;p!=NULL;p=p->next){
if(card==p->card){
printf("您当前的余额为:%.2f\n",p->money);
break;
}
}
}
取款
//取款
void get_money(struct user* p,int card){
for(;p!=NULL;p=p->next){
if(card==p->card){
printf("您当前的余额为:%.2f\n",p->money);
break;
}
}
printf("请输入您想要取出的金额:");
float money;
scanf("%f",&money);
if(money<=p->money){
p->money=p->money-money;
printf("\n操作成功,当前余额:%.2f\n",p->money);
} else{
printf("操作失败,账户余额不足\n");
}
}
存款
//存款
void put_money(struct user* p,int card){
for(;p!=NULL;p=p->next){
if(card==p->card){
printf("您当前的余额为:%.2f\n",p->money);
break;
}
}
printf("请输入您想要存储的金额:");
float money;
scanf("%f",&money);
p->money=p->money+money;
printf("操作成功,您当前的余额为:%.2f\n",p->money);
}
转账
//转账
void turn_money(struct user* p,int card){
struct user * r;
struct user * q;
int con=0;
for(r=p;r!=NULL;r=r->next){
if(card==r->card){
int money;
money=r->money;
break;
}
}
label: printf("请输入您想要的转账对象的卡号:");
int tcard;
scanf("%d",&tcard);
con++;
int count=0; //0表示账号不存在,1表示账号存在
for(q=p;q!=NULL;q=q->next){
if(tcard==q->card){
count=1;
break;
}
}
if(count==0){ //判断转账用户是否存在
if(con<2){
printf("\n转账用户不存在,请检查账号输入是否有误。\n");
printf("\n当前您还有一次操作机会\n");
goto label;
}else{
printf("\n本次转账操作强行结束\n");
return;
}
}
printf("请输入您想要转账的金额:");
float tmoney;
scanf("%f",&tmoney);
if(tmoney<=r->money){
r->money=r->money-tmoney; //您的用户减钱
q->money=q->money+tmoney; //目标用户加钱
printf("\n操作成功,您的当前余额:%.2f\n",r->money);
} else{
printf("操作失败,您的账户余额不足\n");
}
}
销户
//销户
struct user * delete_user(struct user* p,int card){
struct user* r;
struct user* q;
r=p;
for(;r!=NULL;r=r->next){
if(card==r->card){
printf("当前账号存在余额:%.2f\n",r->money);
break;
}
}
int flag;
printf("取出全部金额并销户(1)\n");
printf("取消销户(0)\n");
scanf("%d",&flag);
if(flag==1){
for(r=p;r!=NULL;r=r->next){
q=r->next;
if(q->card==card){
r->next=q->next;
free(q);
break;
}
}
}else{
return p;
}
return p;
}
运行截图
文档准备
登录
以卡号2001号用户,杜扬帆为测试实例:
开户
查询余额
取款
存款
转账
销户
完成后保存文件
在以上的操作中,我们重新开了一个新的账号:卡号:2047 身份证:36108756 姓名:胡俊涵; 而在销户的时候将我们的登录账号:卡号:2001 身份证:36100406 姓名:杜扬帆
因此得到一下的结果:
小结
总结
在编写ATM管理系统的时候,能够完成系统的基本职能。但是可能在一些细节的方面考虑不够周全,代码没有经过二次加工为初代产品,可能会有部分瑕疵没有发现。
psp表格
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 8 |
Development | 开发 | 180 | 220 |
Analysis | 需求分析(包括学习新技术) | 25 | 20 |
Design Spec | 生成设计文档 | 30 | 25 |
Design Review | 设计复审 | 15 | 10 |
Coding Standard | 代码规范 | 10 | 5 |
Design | 具体设计 | 20 | 15 |
Coding | 具体编码 | 40 | 50 |
Code Review | 代码复审 | 15 | 13 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 15 |
Reporting | 报告 | 25 | 30 |
Test Report | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 10 | 10 |