个人作业三-ATM管理系统
所在班级 | AHPU-软件工程导论 |
---|---|
作业要求 | 个人作业三-ATM管理系统 |
作业目标 | 实现ATM管理系统 |
学号 | 3180701202 |
一.题目要求 | |
编写一个ATM管理系统,语言不限,要求应包括以下主要功能: |
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
二.代码提交
1.开户
void BuildUser()
{
printf("\n\t\t\t开始录入用户:\n");
USERDATA userdata;
int i=0;FILE fp; //判断是否继续录入,如果继续按1,否则按2
char ch;
if((fp=fopen("iddata.txt","a+"))NULL)
{
printf("Failure to open admin.txt!\n");
exit(0);
}
do{
system("cls");
printf("\n\t\t\t请输入你的卡号:");
gets(userdata.UserID);
printf("\n\t\t\t请输入用户密码:");
gets(userdata.UserPassword);
fprintf(fp,"%-10s%-10s%-10s%-10.2f\n",userdata.Name,userdata.UserID,userdata.UserPassword,userdata.money); //见录入数据保存到文件中
system("cls");
printf("\n\t\t\t录入成功。\n\t\t\t继续录入请按 1 \n\t\t\t结束录入并推出登陆请按 2\n");
printf("\t\t\t----");
scanf("%d",&i);
ch=getchar();
}while(i1);
fclose(fp);
if(i2) main();
}
2.登录
void denglu(struct per *head)
{
char d[20];
char mima[20];
int i,j;
FILE *fp; //定义文件指针
struct per p,q=NULL;
if((fp=fopen("save.txt","rb+"))NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件\n"); //如不能打开,则结束程序
}
p=(struct per)malloc(sizeof(struct per)); //申请空间
head=p;
while(!feof(fp)) //循环读数据直到文件尾结束
{
if(1!=fread(p,sizeof(struct per),1,fp))
break; //如果没读到数据,跳出循环
p->next=(struct per *)malloc(sizeof(struct per)); //为下一个结点申请空间
q=p; //保存当前节点的指针,作为下一结点的前驱
p=p->next; //指针后移,新读入数据链到当前表尾
}
q->next=NULL; //最后一个结点的后继指针为空
fclose(fp);
printf(" **********************\n");
printf(" 欢迎来都建设银行\n");
printf(" **********************\n");
for(j=1;j<4;j++) //限制卡号输入的次数的循环
{
printf("请输入您的卡号\n");
scanf("%s",d);
for(q=head;q!=NULL;q=q->next) //遍历链表
{
if(strcmp(q->ID,d)!=0) //核对账号
{
continue; //跳出循环
}
else
{
for(i=1;i<4;i++) //限制密码输入的次数的循环
{
printf("\n\n请输入您的密码\n");
scanf("%s",mima);
if(strcmp(q->mima,mima)!=0) //核对密码
{
printf("密码不正确。请重新输入密码\n");
system("pause");
system("cls");
continue; //若密码不对,跳出循环
}
else
{
system("cls");
caidan(head); //调用菜单函数
}
}
printf("\n\n\n您输入密码三次错误,谢谢光临\n");
system("pause");
system("cls");
exit(0);
}
}
printf("\n\n\n您输入的卡号有误,请重试\n");
system("pause");
system("cls");
}
printf("您的卡号三次输入错误,谢谢使用\n");
exit(0);
}
3.查询余额
void chaxun(struct per *head)
{
head=NULL; //链表头指针
FILE fp; //定义文件指针
struct per p,q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件\n"); //如不能打开,则结束程序
}
p=(struct per)malloc(sizeof(struct per)); //申请空间
head=p;
while(!feof(fp)) //循环读数据直到文件尾结束
{
if(1!=fread(p,sizeof(struct per),1,fp))
break; //如果没读到数据,跳出循环
p->next=(struct per *)malloc(sizeof(struct per)); //为下一个结点申请空间
q=p; //保存当前结点的指针,作为下一个结点的前驱
p=p->next; //指针后移,新读入数据链到当前表尾
}
q->next=NULL; //最后一个结点的后继指针为空
fclose(fp);
printf("您卡上原有余额%d元\n\n",q->money);
system("pause");
system("cls");
}
4.存款
void savemoney()
{
FILE *fp;
int a,i;
char c;
printf("\t请输入您的存款数额:");
scanf("%d",&a);
getchar();
user.money+=a;
if((fp=fopen("data/client.dat","wb"))!=NULL)
{
fwrite(&user, sizeof(client), 1 ,fp);
fclose(fp);
}
printf("\t存款成功\n");
printf("\t请按Enter键退出\n");
getchar();
}
5.取款
void drawmoney()
{
FILE *fp;
int a,i;
char c;
while(1){
printf("\t请输入您的取款金额:");
scanf("%d",&a);
if(a>user.money)
printf("\t账户余额不足,请重新输入!\n");
else if(a<0)
printf("\t输入有误,请重新输入!\n");
else
break;
}
getchar();
user.money-=a;
if((fp=fopen("data/client.dat","wb"))!=NULL)
{
fwrite(&user, sizeof(client), 1 ,fp);
fclose(fp);
}
printf("\t取款成功,请收好您的钞票!\n");
printf("\t请按Enter键退出\n");
getchar();
}
6.转账
void zhuanzhang(struct per head)
{
head=NULL;
FILE fp; //定义文件指针
struct per p,q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件\n"); //如不能打开,则结束程序
}
p=(struct per)malloc(sizeof(struct per)); //申请空间
head=p;
while(!feof(fp)) //循环读数据直到文件尾结束
{
if(1!=fread(p,sizeof(struct per),1,fp))
break; //如果没读到数据,跳出循环
p->next=(struct per )malloc(sizeof(struct per)); //为下一个结点申请空间
q=p; //保存当前结点的指针,作为下一个结点的前驱
p=p->next; //指针后移,新读入数据链到当前表尾
}
q->next=NULL; //最后一个结点的后继指针为空
fclose(fp);
int i,j,k;
printf("请输入帐号号码\n");
scanf("%d",&i);
printf("请再次输入帐号号码\n"); //核对卡号
scanf("%d",&j);
if(i!=j)
{
printf("两次账号不同,请重新输入\n");
zhuanzhang(head);
}
else
{
system("cls");
printf("\n");
printf(" 1: 100元 ***** 2:200元 \n");
printf("\n");
printf(" 3: 300元 ***** 4:400元 \n");
printf("\n");
printf(" 5: 500元 ***** 6:600元 \n");
printf("*\n");
printf("请输入转账金额\n");
scanf("%d",&k);
if(k>6||k<=0)
{
printf("对不起,您的输入有误\n\n");
return;
}
else
{
k=k100;
if(k>q->money) //对余额进行判断
{
printf("对不起,您的余额不足\n");
system("pause");
system("cls");
caidan(head);
}
else
{
printf("您已成功转账%d元\n",k);
q->money-=k;
if((fp=fopen("save.txt","wb+"))NULL)
{
printf("cannot open file\n");
return;
}
if(fwrite(q,sizeof(per),1,fp)!=1) //将数据重新写入文件
printf("file write error\n");
q->next=NULL;
fclose(fp);
system("pause");
system("cls");
}
}
}
}
7.销户
void logout()
{
char confirm;//confirm 确认
printf("您正在使用注销功能\n");
printf("%d确认注销?\n",user[find].account);
printf("Y表示确定,其它字符表示取消\n");
scanf("%c",&confirm);
if(confirm'y'||confirm=='Y')
{
printf("正在注销%d\n",user[find].account);
isLogout=1;
}else
{
printf("取消注销帐号%d,返回服务界面\n",user[find].account);
isLogout=0;
}
}
三.运行截图
四.个人小结
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 200 | 240 |
Development | 开发 | 10 | 30 |
Analysis | 需求分析(包括学习新技术) | 10 | 10 |
Design Spec | 生成设计文档 | 10 | 20 |
Design Review | 设计复审 | 10 | 20 |
Coding Standard | 代码规范 | 10 | 10 |
Design | 具体设计 | 20 | 30 |
Coding | 具体编码 | 30 | 20 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 10 | 20 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 5 | 10 |
本次设计的ATM管理系统简单的实现了我们日常生活中需要的开户、存款、取款等功能。还有许多不足需要完善。