博客班级 | AHPU软件工程 |
---|---|
作业要求 | 编写一个ATM管理系统 |
作业目标 | |
学号 | 3180701126 |
作业目标
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
代码
开户
void oaa(struct per *head)
{
head=NULL;
FILE *fp; //定义文件指针
struct per *p1=NULL,*p2=NULL; //p1,p2为定义链表指针
p1=(struct per*)malloc(sizeof(struct per));
printf("请输入您的姓名:\n");
scanf("%s",p1->name);
printf("请输入您的卡号:\n");
scanf("%s",p1->ID);
printf("请设置您银行卡密码:\n");
scanf("%s",p1->code);
p1->money=0;
p1->next=NULL;
printf("您的个人信息为");
printf("姓名:%s \n卡号:%s \n余额:%4d\n",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\n");
return;
}
if(fwrite(p1,sizeof(struct per),1,fp)!=1) //将链表信息写入文件中
printf("file write error\n");
fclose(fp);
printf("\n");
printf("恭喜您开户成功,请登录\n");
system("pause");
system("cls");
login(head);
}
登录
void login(struct per *head)
{
char d[20];
char code[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",code);
if(strcmp(q->code,code)!=0) //核对密码
{
printf("密码不正确。请重新输入密码\n");
system("pause");
system("cls");
continue; //若密码不对,跳出循环
}
else
{
system("cls");
menu(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);
}
菜单
void menu(struct per *head)
{
head=NULL;
int i; //i为客户选择输入的变量
while(1)
{
printf("请选择您需要办理的业务\n");
printf("*********************************\n");
printf("** 1 取款 ***** 2 查询 **\n");
printf("*********************************\n");
printf("** 3 转账 ***** 4 修改密码**\n");
printf("*********************************\n");
printf("** 5 存款 ***** 6 退出 **\n");
printf("*********************************\n");
scanf("%d",&i);
if(i<6||i>0)
{
switch(i)
{
case 1:withdrawal(head);
system("pause");
system("cls");
break;
case 2:system("cls");
query(head);
break;
case 3:system("cls");
taccount(head);
break;
case 4:system("cls");
cpassword(head);
break;
case 5:system("cls");
deposit(head);
break;
case 6:system("cls");
tuichu();
break;
}
}
else
{
printf("您的输入有误\n");
system("pause");
system("cls");
}
}
}
存款
void deposit(struct per *head)
{
int i;
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);
system("cls");
printf("您卡上余额%d元\n",q->money);
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",&i);
if(i>6||i<=0)
{
printf("对不起,您的输入有误\n\n");
return;
}
else
{
i=100*i;
q->money+=i;
if((fp=fopen("save.txt","wb+"))==NULL)
{
printf("cannot open file\n");
}
if(fwrite(q,sizeof(struct per),1,fp)!=1) //将修改的密码重新写入文件
printf("file write error\n");
printf("您已经成功存取%d元\n",i);
q->next=NULL;
fclose(fp);
system("pause");
system("cls");
}
}
取款
void withdrawal(struct per *head)
{
head=NULL;
int i;
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);
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",&i);
if(i>6||i<=0) //限制输入范围
{
printf("对不起,您的输入有误\n\n");
return;
}
else
{
i=100*i; //对应选项乘以一百为取款金额
if(i>q->money)
{
printf("对不起,您的金额不足\n");
system("pause");
system("cls");
menu(head);
}
else
{
q->money-=i; //对金额进行处理
if((fp=fopen("save.txt","wb+"))==NULL)
{
printf("cannot open file\n");
return;
}
if(fwrite(q,sizeof(struct per),1,fp)!=1) //将修改的信息重新写入文件
printf("file write error\n");
printf("您已经成功取走%d元\n");
q->next=NULL;
fclose(fp);
}
}
}
转账
void taccount(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");
taccount(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=k*100;
if(k>q->money) //对余额进行判断
{
printf("对不起,您的余额不足\n");
system("pause");
system("cls");
menu(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");
}
}
}
}
查询
void query(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");
}
修改密码
void cpassword(struct per *head)
{
head=NULL;
char code[20];
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");
scanf("%s",code);
if(strcmp(q->code,code)==0) //核对密码
{
{
printf("密码正确\n");
printf("请输入您的新密码:\n");
scanf("%s",q->code);
if((fp=fopen("save.txt","wb+"))==NULL)
{
printf("cannot open file\n");
}
if(fwrite(q,sizeof(struct per),1,fp)!=1)
printf("file write error\n");
fclose(fp);
printf("修改密码成功\n\n\n\n\n");
}
}
else
{
printf("您输入的密码与原密码不同\n");
return;
system("pause");
}
q->next=NULL;
}
销户
void close(struct person **Phead)
{
char k[20];
struct person *p=*Phead,*t;
if(NULL==(*Phead))
{
printf("没有客户信息可删除!\n");
return;
}
printf("请输入要删除的客户卡号:\n");
scanf("%s",k);
if(p->client.ID==k)
*Phead=(*Phead)->next,free(p);
else
{
while(NULL==p->next&&p->next->client.ID!=k)
p=p->next;
if(p->next==NULL)
printf("对不起,没有该客户!\n");
else
{
t=p->next;
p->next=p->next->next;
}
}
}
主函数
int main()
{
char x;
char choose; //choose为定义输入选择的变量
int flag=1;
struct person *Phead=NULL;
struct per *head=NULL;
printf("**欢迎使用ATM自动取款机系统**\n");
printf("——————————————\n");
printf("| 1 开户 |\n");
printf("——————————————\n");
printf("| 2 登陆 |\n");
printf("——————————————\n");
printf("| 3 前台客户信息查询中心 |\n");
printf("——————————————\n");
printf("| 请选择您的需求 |\n");
printf("———————————————\n");
scanf("%s",&x);
system("cls");
switch(x)
{
case '1':system("cls");
oaa(head); //调用开户函数
break;
case '2':system("cls");
login(head); //调用登陆函数
break;
case '3':system("cls");
menu(); //调用后台菜单函数
break;
}
while(flag)
{
system("cls");
menu(); //调用后台菜单函数
choose=getchar();
switch(choose)
{
case '1':setup(&Phead);
output(Phead); //调用后台输出函数
system("pause");
system("cls");
break;
case '2':query1(Phead); //调用后台卡号查询函数
system("pause");
system("cls");
break;
case '3':query2(Phead); //调用后台姓名查询函数
system("pause");
system("cls");
break;
case '4':
query3(Phead); //调用后台余额查询函数
system("pause");
system("cls");
break;
case '5':close(&Phead); //调用后台删除用户函数
system("pause");
system("cls");
break;
case '6':
add(&Phead); //调用后台增加用户函数
system("pause");
system("cls");
break;
case '7':output(Phead); //调用后台输出函数函数
system("pause");
system("cls");
break;
case '8':output(Phead);
system("pause");
system("cls");
break;
case '0':flag=0;
printf("The end.\n");
break;
}
}
}
运行截图
作业小结
psp表格
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 240 | 10 |
Development | 开发 | 110 | 150 |
Analysis | 需求分析(包括学习新技术) | 10 | 10 |
Design Spec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 5 | 10 |
Coding Standard | 代码规范 | 5 | 5 |
Design | 具体设计 | 10 | 12 |
Coding | 具体编码 | 40 | 30 |
Code Review | 代码复审 | 5 | 7 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 20 | 12 |
Test Report | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 3 | 1 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 3 | 3 |
心得和经验
对于这次作业,用c语言编写代码,由于编码时链表的使用,我对链表有了更深的了解和掌握,编程能力得到了提升。