一.作业规范要求
博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478 |
作业目标 | <编写一个ATM管理系统> |
学号 | <3180701121> |
二.题目要求
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
三.代码提交
目录
(1)代码
头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN sizeof(struct Account)
#define RECORDCOUNT 5
#define MESSAGELENGTH 100
#define NAMELENGTH 100
#define VIEWCOUNT 5
#define DEFAULTBALANCE 0.00
#define SAVE 1
账户结构体
struct Account *head,*tail,*p; /*账户头部和尾部指针*/
struct Account
{
char name[NAMELENGTH]; /* 账户名称 */
float balance; /* 账户余额*/
char message[RECORDCOUNT][MESSAGELENGTH]; /* 交易记录 */
int maxMessageIndex;
struct Account *next; /* 指向下一账户 */
};
函数定义
void freeMemory(); /*释放内存*/
void removeFirst(struct Account * account); /*移除第一个元素*/
void showMenu(); /*输出选择菜单*/
struct Account * findAccountByName(char name[]); /*通过账户名称找到对应的账户 */
void writeMessage(struct Account * account,char message[]); /* 写入交易记录 */
void init(); /* 创建链表,并返回表头指针 */
void openAccount(); /* 开户 */
void closeAccount(); /* 销户 */
void deposit(); /* 存款*/
void withdraw(); /* 取款 */
void transfer(); /* 转账 */
void print(); /*输出账户列表*/
void printMessage(); /*输出账户交易记录*/
主函数
int main()
{
init();
printf("欢迎使用杨哥ATM管理系统
");
showMenu();
char choice;
fflush(stdin);
choice = getchar();
while(choice != '8')
{
switch(choice)
{
case '1':
openAccount();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '2':
closeAccount();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '3':
deposit();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '4':
withdraw();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '5':
transfer();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '6':
print();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '7':
printMessage();
showMenu();
fflush(stdin);
choice = getchar();
break;
default:
printf("无效菜单!
");
showMenu();
fflush(stdin);
choice = getchar();
break;
}
}
freeMemory(); /*释放内存*/
return 0;
}
菜单函数
void showMenu()
{
printf(" 请选择操作序号!(0~4)
");
printf("**********************************************************
");
printf("* *
");
printf("* 1.开户 *
");
printf("* 2.销户 *
");
printf("* 3.存款 *
");
printf("* 4.取款 *
");
printf("* 5.转账 *
");
printf("* 6.查看账户 *
");
printf("* 7.查看交易 *
");
printf("* 8.退出 *
");
printf("* *
");
printf("**********************************************************
");
}
查询账户
struct Account * findAccountByName(char name[])
{
if(strlen(name)>0)
{
p = head;
while(p != NULL)
{
if(strcmp(p->name,name)==0)
{
return p;
}
p = p->next;
}
}
return NULL;
}
写入交易记录
void writeMessage(struct Account * account,char message[])
{
if(account->maxMessageIndex >= RECORDCOUNT)
{
removeFirst(account);
strcpy((account->message)[RECORDCOUNT-1],message);
account->maxMessageIndex = account->maxMessageIndex+1;
}
else
{
strcpy((account->message)[account->maxMessageIndex],message);
account->maxMessageIndex = account->maxMessageIndex+1;
}
}
void removeFirst(struct Account * account)
{
int i=0;
for(i=1; i<RECORDCOUNT; i++)
strcpy((account->message)[i-1],(account->message)[i]);
}
初始化账户
void init()
{
p = (struct Account *)malloc(LEN); /* 创建第一个账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
p->maxMessageIndex=0;
strcpy(p->name,"001");
head=p;
tail = p;
p = (struct Account *)malloc(LEN); /* 创建第二个账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
p->maxMessageIndex=0;
strcpy(p->name,"002");
head->next = p;
tail = p;
p = (struct Account *)malloc(LEN); /* 创建第三个账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
p->maxMessageIndex=0;
strcpy(p->name,"003");
tail->next = p;
tail = p;
}
显示账户信息
void print()
{
int i;
p = head;
i = 1;
while(p != NULL)
{
printf("第%d个账户的数据 账户名称:%s 余额:%.2f
",i++,p->name,p->balance);
p = p->next;
}
}
释放内存
void freeMemory()
{
p = head;
while(p != NULL)
{
head = p;
free(head);
p = p->next;
}
}
开户
void openAccount()
{
char name[NAMELENGTH];
printf("请输入新开立的账户名称 : ");
fflush(stdin);
gets(name);
if(strlen(name)>0)
{
p = (struct Account *)malloc(LEN); /* 创建一个新账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
strcpy(p->name,name);
tail->next=p;
tail = p;
}
}
销户
void closeAccount()
{
char name[NAMELENGTH];
printf("请输入要销户的账户名称 : ");
fflush(stdin);
gets(name);
if(strlen(name)>0)
{
struct Account *pre;
p = head;
pre=head;
int find=0;
while(p != NULL)
{
if(strcmp(p->name,name)==0)
{
if(head == p)
head=p->next;
else if(tail==p)
{
pre->next=NULL;
tail = pre;
}
else
{
pre->next = p->next;
}
find=1;
break;
}
pre = p;
p = p->next;
}
if(find==0)
printf("没有此账户,无法完成销户!
");
}
}
存款
void deposit()
{
char name[NAMELENGTH];
printf("请输入要存款的账户名称 :");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
float savemoney;
printf("请输入要存款的金额 : ");
scanf("%f",&savemoney);
while(savemoney<=0)
{
printf("存款额不能小于等于零,请重新输入! ");
scanf("%f",&savemoney);
}
p->balance = p->balance+savemoney; /*存入账户金额*/
char message[MESSAGELENGTH];
sprintf(message,"账户%s成功存入%.2f元!
",name,savemoney);
writeMessage(p,message); /*写入交易记录*/
}
else
printf("没有此账户!
");
}
取款
void withdraw()
{
char name[NAMELENGTH];
printf("请输入要取款的账户名称 :");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
float savemoney;
printf("请输入要取款的金额 : ");
fflush(stdin);
scanf("%f",&savemoney);
while(savemoney<=0 || savemoney> p->balance)
{
printf("存款额不能小于等于零或者大于余额,请重新输入! ");
scanf("%f",&savemoney);
}
p->balance = p->balance-savemoney; /*存入账户金额*/
char message[MESSAGELENGTH];
sprintf(message,"账户%s成功取出%.2f元!
",name,savemoney);
writeMessage(p,message); /*写入交易记录*/
}
else
printf("没有此账户!
");
}
转账
void transfer()
{
char outname[NAMELENGTH];
char inname[NAMELENGTH];
struct Account *outAccount;
struct Account *inAccount;
printf("请输入要转出的账户名称 :");
fflush(stdin);
gets(outname);
outAccount = findAccountByName(outname);
if(outAccount!=NULL)
{
printf("请输入要转入的账户名称 :");
fflush(stdin);
gets(inname);
inAccount = findAccountByName(inname);
if(inAccount != NULL)
{
float money;
printf("请输入要转账的金额 : ");
fflush(stdin);
scanf("%f",&money);
while(money<=0 || money> outAccount->balance)
{
printf("转账金额不能小于等于零或者大于转出账户余额,请重新输入! ");
scanf("%f",&money);
}
outAccount->balance = outAccount->balance-money; /*减少转出账户金额*/
inAccount->balance = inAccount->balance+money; /*增加转入账户金额*/
char outmessage[MESSAGELENGTH];
sprintf(outmessage,"账户%s成功转出%.2f元!
",outname,money);
writeMessage(outAccount,outmessage); /*写入转出交易记录*/
char inmessage[MESSAGELENGTH];
sprintf(inmessage,"账户%s成功转入%.2f元!
",inname,money);
writeMessage(inAccount,inmessage); /*写入转出交易记录*/
}
}
else
printf("没有此转出账户!
");
}
查看交易历史
void printMessage()
{
char name[NAMELENGTH];
printf("请输入要查看最近五笔交易历史的账户名称 :");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
int i=0;
int end = (p->maxMessageIndex)>=VIEWCOUNT?VIEWCOUNT:(p->maxMessageIndex);
for(i=0; i<end; i++)
printf("%s",(p->message)[i]);
}
else
printf("没有此账户!
");
}
(2)界面截图
主界面
查看账户
销户:
存款
取款
转账
四.个人小结
1)psp表格
2)小结
1.把模块细化写,比如需要产生一个随机的卡号,由于我们需要判断每张卡是否重复,需要定义一个函数
get_cardid()函数
2.无论是取钱还是存款还是查询都是需要输入密码的,而且输入密码之后会给卡一个状态即是锁卡还是非锁卡,于是又定义了一个函数check_pwd()需要后期改进
3.编写注册模块的时候,出现了我们需要实例化一个卡,一个人而且还要就行绑定。
4.此次我是用c编写的,但是在java定义对象和python的方法中无论是类还是对象都可以调用,更为方便。