这个作业属于哪个课程 | AHPU-软件工程导论 |
---|---|
这个作业要求在哪里 | 个人作业三-ATM管理系统 |
这个作业的目标 | 编写一个ATM管理系统,并实现存款取款等功能 |
学号 | 3180701108 |
**
1.开户
/*开户函数*/
void kaihu(struct per *head)
{
head=NULL;
FILE *fp; //定义文件指针
struct per *p1=NULL,*p2=NULL; //p1,p2为定义链表指针
p1=(struct per*)malloc(sizeof(struct per)); //开辟内存单元
printf("请输入您的姓名:
"); //请数据输入链表中
scanf("%s",p1->name);
printf("请设置您的卡号:
");
scanf("%s",p1->ID);
printf("请设置您银行卡密码:
");
scanf("%s",p1->mima);
p1->money=0;
p1->next=NULL;
printf("您的个人信息为");
printf("姓名:%s
卡号:%s
余额:%4d
",p1->name,p1->ID,p1->money);
if(NULL==head) //为新用户开辟内存单元
{
head=(struct per *)malloc(sizeof(struct per));
head->next=p1; //进行头插法,将其作为第一个节点
}
else //为新增客户开辟内存单元
{
for(p2=head;p2->next!=NULL;p2=p2->next); //进行尾插
p2->next=p1;
}
if((fp=fopen("save.txt","ab+"))==NULL) //打开文件
{
printf("cannot poen file
");
return;
}
if(fwrite(p1,sizeof(struct per),1,fp)!=1) //将链表信息写入文件中
printf("file write error
");
fclose(fp);
printf("
");
printf("恭喜您开户成功,请登录
");
system("pause");
system("cls");
denglu(head);
}
2.查询账户余额
void chaxun(struct per *head)
{
head=NULL; //链表头指针
FILE *fp; //定义文件指针
struct per *p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件
"); //如不能打开,则结束程序
}
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元
",q->money);
system("pause");
system("cls");
}
3.取款
//银行取款函数
//
void qukuan(struct per *head)
{
head=NULL; //head为链表头指针
int i;
FILE *fp; //定义文件指针
struct per *p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件
"); //如不能打开,则结束程序
}
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);
system("cls");
printf("************************************
");
printf("** 1: 100元 ***** 2:200元 **
");
printf("************************************
");
printf("** 3: 300元 ***** 4:400元 **
");
printf("************************************
");
printf("** 5: 500元 ***** 6:600元 **
");
printf("************************************
");
printf("请按要求选择您要取款的金额
");
scanf("%d",&i);
if(i>6||i<=0) //限制输入范围
{
printf("对不起,您的输入有误
");
return;
}
else
{
i=100*i; //对应选项乘以一百为取款金额
if(i>q->money)
{
printf("对不起,您的金额不足
");
system("pause");
system("cls");
caidan(head); //调用取款机菜单函数
}
else
{
q->money-=i; //对金额进行处理
if((fp=fopen("save.txt","wb+"))==NULL) //打开文件
{
printf("cannot open file
");
return;
}
if(fwrite(q,sizeof(struct per),1,fp)!=1) //将修改的信息重新写入文件
printf("file write error
");
printf("您已经成功取走%d元
");
q->next=NULL;
fclose(fp); //关闭文件
}
}
}
4.存款
//银行存款函数
void cunkuan(struct per *head)
{
int i;
head=NULL; //链表头指针
FILE *fp; //定义文件指针
struct per *p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件
"); //如不能打开,则结束程序
}
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);
system("cls");
printf("您卡上原有余额%d元
",q->money);
printf("************************************
");
printf("** 1: 100元 ***** 2:200元 **
");
printf("************************************
");
printf("** 3: 300元 ***** 4:400元 **
");
printf("************************************
");
printf("** 5: 500元 ***** 6:600元 **
");
printf("************************************
");
printf("请选择您要存入的余额
");
scanf("%d",&i);
if(i>6||i<=0)
{
printf("对不起,您的输入有误
");
return;
}
else
{
i=100*i;
q->money+=i;
if((fp=fopen("save.txt","wb+"))==NULL) //打开文件
{
printf("cannot open file
");
}
if(fwrite(q,sizeof(struct per),1,fp)!=1) //将修改的密码重新写入文件
printf("file write error
");
printf("您已经成功存取%d元
",i);
q->next=NULL;
fclose(fp);
system("pause");
system("cls");
}
}
5.转账
//银行转账函数
/
void zhuanzhang(struct per *head)
{
head=NULL;
FILE *fp; //定义文件指针
struct per *p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
{
printf("不能打开文件
"); //如不能打开,则结束程序
}
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("请输入帐号号码
");
scanf("%d",&i);
printf("请再次输入帐号号码
"); //核对卡号
scanf("%d",&j);
if(i!=j)
{
printf("两次账号不同,请重新输入
");
zhuanzhang(head);
}
else
{
system("cls");
printf("************************************
");
printf("** 1: 100元 ***** 2:200元 **
");
printf("************************************
");
printf("** 3: 300元 ***** 4:400元 **
");
printf("************************************
");
printf("** 5: 500元 ***** 6:600元 **
");
printf("************************************
");
printf("请输入转账金额
");
scanf("%d",&k);
if(k>6||k<=0)
{
printf("对不起,您的输入有误
");
return;
}
else
{
k=k*100;
if(k>q->money) //对余额进行判断
{
printf("对不起,您的余额不足
");
system("pause");
system("cls");
caidan(head);
}
else
{
printf("您已成功转账%d元
",k);
q->money-=k;
if((fp=fopen("save.txt","wb+"))==NULL)
{
printf("cannot open file
");
return;
}
if(fwrite(q,sizeof(per),1,fp)!=1) //将数据重新写入文件
printf("file write error
");
q->next=NULL;
fclose(fp);
system("pause");
system("cls");
}
}
}
}
6.销户
void shanchu(struct person **Phead) //*(*Phead)为指向结构体指针的地址
{
char k[20]; //定义输入查找客户姓名卡号的变量
struct person *p=*Phead,*t;
if(NULL==(*Phead)) //若指针最后指向空,则没有客户信息
{
printf("没有客户信息可删除!
");
return;
}
printf("请输入要删除的客户卡号:
");
scanf("%s",k);
if(p->kehu.ID==k) //若第一个客户就是,则让头指针指向下一个结点
*Phead=(*Phead)->next,free(p);
else
{
while(NULL==p->next&&p->next->kehu.ID!=k) //遍历寻找,核对客户卡号
p=p->next; //当p->next没指向空,并且客户的卡号还没找到,则继续寻找
if(p->next==NULL)
printf("对不起,没有该客户!
");
else
{
t=p->next; //如果找到,则把p->next的值赋给t
p->next=p->next->next;
}
}
}
7.菜单
//银行子菜单函数
/
void caidan(struct per *head)
{
head=NULL;
int i; //i为客户选择输入的变量
while(1)
{
printf("请选择您需要的业务
"); //银行业务菜单
printf("*********************************
");
printf("** 1 取款 ***** 2 查询 **
");
printf("*********************************
");
printf("** 3 转账 ***** 4 修改密码**
");
printf("*********************************
");
printf("** 5 存款 ***** 6 退出 **
");
printf("*********************************
");
scanf("%d",&i);
if(i<6||i>0)
{
switch(i)
{
case 1:qukuan(head); //调用银行取款函数
system("pause");
system("cls");
break;
case 2:system("cls");
chaxun(head); //调用银行查询函数
break;
case 3:system("cls");
zhuanzhang(head); //调用银行转账函数
break;
case 4:system("cls");
xgmm(head); //调用银行修改密码函数
break;
case 5:system("cls");
cunkuan(head); //调用银行存款函数
break;
case 6:system("cls");
tuichu(); //调用银行退出函数
break;
}
}
else
{
printf("您的输入有误
");
system("pause");
system("cls");
}
}
}
后台运行菜单函数
//后台运行菜单函数
///
void menu()
{
printf("****************欢迎来到建设银行取款机系统****************
");
printf("**************************************************
");
printf("**** 1 建立信息并显示 ****** 2 卡号查询信息 ****
");
printf("**************************************************
");
printf("**** 3 姓名查询信息 ****** 4 余额查询信息 ****
");
printf("**************************************************
");
printf("**** 5 删除某卡号信息 ****** 6 增加新的用户 ****
");
printf("**************************************************
");
printf("**** 7 按余额降序输出 ****** 8 输出 ****
");
printf("**************************************************
");
printf("**** 0 退出 ****** 谢谢光临 ****
");
printf("**************************************************
");
printf("请选择您需要的业务
");
}
8.运行截图
系统界面
系统子界面
开户
存款
取款
转账
销户
9.PSP表格
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 125 | 130 |
Development | 开发 | 40 | 60 |
Analysis | 需求分析(包括学习新技术) | 15 | 20 |
Design Spec | 生成设计文档 | 10 | 15 |
Design Review | 设计复审 | 10 | 15 |
Coding Standard | 代码规范 | 5 | 10 |
Design | 具体设计 | 15 | 20 |
Coding | 具体编码 | 30 | 40 |
Code Review | 代码复审 | 5 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 25 |
Reporting | 报告 | 20 | 30 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 5 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 10 | 15 |
10.实验小结
本次设计的ATM管理系统简单的实现了我们日常生活中需要的开户、存款、取款等功能。还有许多不足需要完善。