用C写ATM机

 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

#include<time.h>

#define N 10

struct inform                //取款记录  

{

int year,mon,day,hour,min,sec;

int amount;

char place[20];

struct inform *next;

};

 

struct account             //帐号信息

{

int no;

char name[9];

char password[N];

float remainder;        //余额

struct account *next;

struct inform *mnext;

};

 

void Creatlist(struct account **head,FILE *fp);

void access(struct account *head,struct account **p);

void menu(struct account *p);

int Draw(struct account **p,int *s);

int Changepass(struct account *p);

int Save(struct account **p);

void Inquiry(struct account *p);

void sum(struct account **p,int *s);

void Save_Data(FILE *fp,struct account *head);//存盘

 

int main()

{

FILE *fp;

struct account *head=NULL,*p=NULL;

int flag=1,select,s=0;

 

if((fp=fopen("E://VC&汇编//编译程序//ATM作业//account.dat","r+"))==NULL)

{

printf("系统出错,即将退出!/a/n");

exit (0);

}

 

Creatlist(&head,fp);

access(head,&p);

 

while(flag)

{

system("cls");

menu(p);

scanf("%d",&select);

switch(select)

{

case 1:Draw(&p,&s);break;   //取款

case 2:Save(&p);break;         //存款

case 3:Inquiry(p);break;       //查询余额

case 4:Changepass(p);break;    //修改密码

case 0:flag=0;break;           //退出

}

}

 

sum(&p,&s);

rewind(fp);

fflush(fp);

Save_Data(fp,head);

 

fclose(fp);

return 1;

}

 

void Creatlist(struct account **head,FILE *fp)

{

struct inform *q;

struct account *p;

int c;

 

fscanf(fp,"%d",&c);

while(!feof(fp))

{

p=(struct account *)malloc(sizeof(struct account));

p->no=c;

fscanf(fp,"%s",p->name);

fscanf(fp,"%s",p->password);

fscanf(fp,"%f",&p->remainder);

 

p->mnext=NULL;

fscanf(fp,"%d",&c);

while(c<10000&&!feof(fp))

{

q=(struct inform*)malloc(sizeof(struct inform));

q->year=c;

fscanf(fp,"%d",&q->mon);

fscanf(fp,"%d",&q->day);

fscanf(fp,"%d",&q->hour);

fscanf(fp,"%d",&q->min);

fscanf(fp,"%d",&q->sec);

fscanf(fp,"%d",&q->amount); 

fscanf(fp,"%s",q->place);

q->next=p->mnext;

p->mnext=q;

fscanf(fp,"%d",&c);

}

 

p->next=*head;

*head=p;

}

}

 

void access(struct account *head,struct account **p)

{

char user[N],ch;

int t=0,i,n;

 

printf("请输入账户号码:"); //模拟读卡

scanf("%d",&n);

*p=head;

while((*p)!=NULL)           //查找账户

if((*p)->no==n)

break;

else

(*p)=(*p)->next; 

while(1)

{

i=0;

printf("请输入密码:");

while((ch=getch())!='/r')

{

user[i++]=ch;

putchar('*');

}

user[i]='/0';

t++;

if(strcmp((*p)->password,user)==0)

break;

else

{

if(t<3)

printf("/n密码错误,请重新输入!/n");

else

{

printf("/n对不起,你无权使用本卡! 退出系统!/a/n");

exit (-1);

}

}

}

}

 

void menu(struct account *p)

{

printf("/t/t/t   欢迎使用ATM取款机!/n/n");

printf("/t/t/t您的帐户名是:   %s/n",p->name); 

printf("/t/t/t您的帐户号码是:%d/n/n",p->no);

printf("/t/t/t请输入所需办理业务的序号:/n");

printf("/t/t/t/t1 取款/n");

printf("/t/t/t/t2 存款/n");

printf("/t/t/t/t3 余额查询/n");

printf("/t/t/t/t4 修改密码/n");

printf("/t/t/t/t0 退出/n");

}

 

int Draw(struct account **p,int *s)

{

int n,t=0;

 

while(1)

{

system("cls");

printf("本机仅提供面值100元人民币/n一次取款金额不得超过5000/n");

printf("返回上级菜单请输0/n");

if(t==1)

printf("金额输入错误!/n");

if(t==2)

printf("余额不足!/n");

printf("请输入取款金额:");

scanf("%d",&n);

if(n>(*p)->remainder)

{

t=2;

continue;

}

if(n%100||n>5000)

{

t=1;

continue;

}

if(!n)

return 0;

if(!(n%100)&&n<=5000)

{

(*p)->remainder-=n;

*s+=n;

t=0;

}

}

}

 

void sum(struct account **p,int *s)

{

struct inform *q=NULL;

time_t rawtime;

struct tm *timeinfo;

 

if(*s>50000)

{

q=(struct inform*)malloc(sizeof(struct inform));

q->next=(*p)->mnext;

(*p)->mnext=q; 

time(&rawtime);

timeinfo=localtime(&rawtime);

q->year=1900+timeinfo->tm_year;

q->mon=1+timeinfo->tm_mon;

q->day=timeinfo->tm_mday;

q->hour=timeinfo->tm_hour;

q->min=timeinfo->tm_min;

q->sec=timeinfo->tm_sec;

q->amount=*s;

scanf("武汉",q->place);

}

}

 

int Changepass(struct account *p)

{

int i,t=0;

char user[N],ch,m[N],n[N];

 

while(1)

{

i=0;

printf("请输入原始密码:");

while((ch=getch())!='/r')      

{

user[i++]=ch;

putchar('*');

}

user[i]='/0';

t++;

printf("%s",p->password);

if(strcmp(p->password,user)==0)

break;

else

{

if(t<3)

printf("/n密码错误,请重新输入!/n");

else

{

printf("/n对不起,你无权修改密码! 退出系统!/a/n");

return 0;

}

}

}

while(1)

{

printf("/n请输入新密码:");

scanf("%s",m);

if(strcmp(m,"0")==0)

return 1;

system("cls");

printf("请确认新密码:");

scanf("%s",n);

if(strcmp(m,n)==0)

{

strcpy(p->password,m); 

printf("密码修改成功!");

printf("输任意数返回上级菜单/n");

scanf("%d",&i);

return 1;

}

else

{

printf("密码输入不一致,请重新输入/n");

printf("返回上级菜单请输0/n");

}

}

}

 

int Save(struct account **p)

{

int n;

 

while(1)

{

system("cls");

printf("本机仅提供面值100元人民币/n");

printf("返回上级菜单请输0/n");

printf("请输入存款金额:");

scanf("%d",&n);

if(!n)

return 0;

if(n%100)

printf("输入错误/n");

else

{

printf("存款成功/n");

(*p)->remainder+=n; 

printf("输任意数返回上级菜单/n");

scanf("%d",&n);

return 1;

}

}

}

 

void Inquiry(struct account *p)

{

int n;

 

printf("您的余额为:%.2f/n/n",p->remainder);

printf("输任意数返回上级菜单/n");

scanf("%d",&n);

}

 

void Save_Data(FILE *fp,struct account *p)//存盘

{

struct inform *q;

 

while(p!=NULL)   

{

fprintf(fp,"%-8d",p->no);

fprintf(fp,"%s",p->name);

fprintf(fp,"%10s",p->password);

fprintf(fp,"%10.2f/n",p->remainder);

 

q=p->mnext;     //存入取款记录

while(q!=NULL)

{

fprintf(fp,"/t%4d",q->year);

fprintf(fp,"%3d",q->mon);

fprintf(fp,"%3d",q->day);

fprintf(fp,"%4d",q->hour);

fprintf(fp,"%3d",q->min);

fprintf(fp,"%3d",q->sec);

fprintf(fp,"%7d",q->amount);

fprintf(fp,"/t武汉/n");

q=q->next;

}

p=p->next;

}

}

account.dat图

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值