ATM机模拟
这是某次的作业,翻出来保存到博客园里。
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <conio.h> #include <string.h> int shuzi(const char *ab,int is);/*验证数组合法性*/ char selectkey,creditmoney,debitmoney,mim[20]={'0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'},temp[50],tem[50],acoumt[50]; long moneyint; int q=0,top=-1; void anya(char mim[]);/*暗压函数*/ void (*p)(long int *money); void query(long int *money);/*查询函数单据函数*/ void credit(long int *money); void debit(long int *money); void passchange(char mim[]); int input_mima(char mi[]);/*密码输入函数*/ char *nuchange(long int num); struct record { char rec[50]; struct record *next; }; typedef struct record list; list *st,*point; int initaz(const char *x); int save(const char *x,const char *m,list *pp); main() { st=(list*) malloc (sizeof(list)); point=st; st->next=NULL; printf("请输入您的账号.\n"); scanf("%s",acoumt); for(;initaz(acoumt);) { printf("\n账号输入错误,继续吗?(y/n)"); do { selectkey=(char)getche(); if((selectkey=='n')||(selectkey=='N')) return 0; if((selectkey=='y')||(selectkey=='Y')) { printf("\n请再次输入账号!\n"); scanf("%s",acoumt); } else { printf("输入错误\n"); } }while(!((selectkey=='n')||(selectkey=='N')||(selectkey=='y')||(selectkey=='Y'))); } if (input_mima(mim)) return 0; for(;;) { do { system("cls");/*lint !e534*/ puts("========================="); puts("| 您要做什么? |"); puts("| 1. 查询以往单据 |"); puts("| 2. 取款 |"); puts("| 3. 转账 |"); puts("| 4. 密码修改 |"); puts("| 5. 退出 |"); puts("========================="); selectkey =(char)getch(); }while( selectkey!='1' && selectkey!='2' && selectkey!='3' && selectkey!='4'&&selectkey!='5' ); switch(selectkey) { case '1': p=query; break; case '2': p=credit; break; case '3': p=debit; break; case '4': passchange(mim); if(q&&input_mima(mim)) return 0; q=0; continue; case '5': system("cls");/*lint !e534*/ puts("正在储存信息,请稍后。。。。"); if(save(acoumt,mim,st)) printf("出现未知的文件写入错误,信息未能正确保存\n"); puts("================================"); puts("| 谢谢您的使用! |"); puts("| 再见! |"); puts("================================"); getch();/*lint !e534*/ return 0; default:break; } (*p)(&moneyint); } } int shuzi(const char *ab,int is) { int i; for(i=0;i<=is;++i) { if ((ab[i]<'0')||(ab[i]>'9')) return 1; } return 0; } int input_mima(char *mi) { int count=1; while(count<=3) { printf("请输入您的密码!!\n"); anya(temp); if (strcmp(mi,temp)) { printf("\n您输入了一个错误的密码,您还有 %d 次机会尝试。\n",3-count); ++count; continue; } break; } if (count==4) { printf("您没有机会尝试了!!"); getch();/*lint !e534*/ return 1; } else return 0; }/*lint !e818*/ void query (long int *money) { int i; list *temppoint; system("cls");/*lint !e534*/ if (top==-1) { printf("您的账户没有做任何事\n"); } else for(temppoint=st,i=1;temppoint->next!=0;temppoint=temppoint->next,i++) printf("*%-5d%s\n",i,temppoint->rec); puts("=========================================="); printf("| 您的余额还剩%-8d元人民币。 |\n",*money); puts("| 请按任意键继续 |"); puts("=========================================="); getch();/*lint !e534*/ }/*lint !e818*/ void credit(long int *money) { long moneytem=*money; long l; char moneyl[13]; for(;;) { system("cls");/*lint !e534*/ puts("=================================="); puts("| 请选择取出的金额: |"); puts("| a. 50元 |"); puts("| b. 100元 |"); puts("| c. 500元 |"); puts("| d. 返回 |"); puts("|你也可以用键盘直接输入想要的金额|"); puts("=================================="); scanf("%s",moneyl); l=(long)(strlen(moneyl)-1); if(!shuzi(moneyl,l)) { (*money)-=atoi(moneyl); if (*money<0) { printf("您的余额不足!!\n"); getch();/*lint !e534*/ (*money)+=atoi(moneyl); continue; } puts("============================================"); printf("| 您取出了%-7d元人民币! |\n",atoi(moneyl)); puts("| 按任意键继续 |"); puts("============================================"); getch();/*lint !e534*/ } else { if (0<l) { printf ("这是一个错误的输入,再试一次。\n"); getch();/*lint !e534*/ continue; } switch(moneyl[0]) { case 'a': (*money)-=50; if ((*money)<0) { printf("您的余额不足。\n"); getch();/*lint !e534*/ (*money)+=50; continue; } puts("========================================="); puts("| 您取出了50元 |"); puts("| 按任意键返回 |"); puts("========================================="); moneyl[0]='5';moneyl[1]='0',moneyl[2]='\0'; getch();/*lint !e534*/ break; case 'b': (*money)-=100; if (*money<0) { printf("You don't have enough money.\n"); getch();/*lint !e534*/ (*money)+=100; continue; } puts("========================================="); puts("| 您取出了100元 |"); puts("| 按任意键返回 |"); puts("========================================="); moneyl[0]='1';moneyl[1]='0';moneyl[2]='0';moneyl[3]='\0'; getch();/*lint !e534*/ break; case 'c': (*money)-=500; if (*money<0) { printf("You don't have enough money.\n"); getch();/*lint !e534*/ (*money)+=500; continue; } puts("========================================="); puts("| 您取出了500元 |"); puts("| 按任意键返回 |"); puts("========================================="); moneyl[0]='5';moneyl[1]='0';moneyl[2]='0';moneyl[3]='\0'; getch();/*lint !e534*/ break; case 'd': return; default: printf("It is a wrong input,please try again!\n"); getch();/*lint !e534*/ continue; } } getch();/*lint !e534*/ fflush(stdin); ++(top); l=*money; tem[0]='\0'; strcat(tem,"您取出了"); strcat(tem,nuchange(moneytem-*money)); moneytem-=*money; strcat(tem,"元人民币,还剩下"); strcat(tem,nuchange(l)); strcpy(point->rec,tem); point->next=(list*) malloc(sizeof(list)); point=point->next; point->next=0; } } void debit(long int *money) { FILE *fp; long moneytem=*money,moneye,t; char t1[50],t2[50]; system("cls");/*lint !e534*/ printf("请输入您要转账的账户。\n"); anya(t1); if(!strcmp(t1,acoumt)) { printf("您不能给自己转账,按任意键退出。\n"); getch();/*lint !e534*/ return; } printf("请再次输入您要转账的账户。\n"); anya(t2); if(strcmp(t1,t2)) { printf("两次输入不一致,按任意键退出。"); getch();/*lint !e534*/ return; } fp=fopen(t1,"r+"); if (fp==NULL) { printf("没有这个账户,按任意键退出。"); getch();/*lint !e534*/ return; } for(;;) { printf("请输入您要转账的钱数。\n"); scanf("%s",t1); if (shuzi(t1,(int)strlen(t1)-1)||atol(t1)>*money) { printf("错误的输入。"); continue; } break; } printf("您确定吗?输入y或Y继续。\n"); if(!(getch()=='y')&&!(getch()=='Y')) { printf("按任意键退出\n"); getch();/*lint !e534*/ return; } printf("再次确认?输入y或Y继续。\n"); if(!(getch()=='y')&&!(getch()=='Y')) { printf("按任意键退出\n"); getch();/*lint !e534*/ return; } *money-=atol(t1); fscanf(fp,"%s\n",t2); t=ftell(fp); fscanf(fp,"%ld",&moneye); fseek(fp,t,SEEK_SET); fprintf(fp,"%-10ld\n",moneye+atol(t1)); fseek(fp,0L,SEEK_END); fprintf(fp," 您的账号被转入了%ld元人民币。\n",atol(t1)); printf("您还剩%ld元人民币\n",*money); getch();/*lint !e534*/ fflush(stdin); ++(top); tem[0]='\0'; strcat(tem,"您已经转账"); strcat(tem,nuchange(moneytem-*money)); moneytem=*money; strcat(tem,"元人民币,您还剩"); strcat(tem,nuchange(*money)); strcat(tem,"元人民币"); strcpy(point->rec,tem); point->next=(list*) malloc(sizeof(list)); point=point->next; point->next=NULL; fclose(fp); } void passchange(char mimx[]) { char temp1[50],temp2[50],judge='y'; int i,l; system("cls");/*lint !e534*/ printf("===================================\n"); printf(" 请输入原本的密码! \n"); printf("===================================\n"); anya(temp1); if (strcmp(temp1,mimx)) { printf("**********************************************************\n"); printf(" 和原密码不相同,需要确认您的身份 \n"); printf("**********************************************************\n"); q=1; return; } for(;;) { printf("==============================\n"); printf(" 请输入新密码\n"); printf("==============================\n"); anya(temp1); printf("====================================\n"); printf(" 请再次输入新密码\n"); printf("====================================\n"); anya(temp2); if (strcmp(temp1,temp2)) { printf("两次输入的新密码不相同!!\n要放弃吗修改吗?(y/n)\n"); do { judge=(char)getch(); }while(judge!='Y' &&judge!='N'&&judge!='y'&&judge!='n'); if (judge=='y'||judge=='Y') { printf("您已经放弃了\n"); printf("输入任意键继续。。。。\n"); getch();/*lint !e534*/ return; } else { system("cls");/*lint !e534*/ continue; } } else { l=(long)(strlen(temp1)); for(i=0;i<=l;++i) { mimx[i]=temp1[i]; } mimx[i]='\0'; ++(top); tem[0]='\0'; strcat(tem,"您将密码修改成"); strcat(tem,mim); strcpy(point->rec,tem); point->next=(list*) malloc(sizeof(list)); point=point->next; point->next=0; printf("输入任意键继续"); getch();/*lint !e534*/ } break; } } void anya(char mimx[]) { char temx[50]; int i; for(i=0;(temx[i]=(char)getch())!=13;++i) { fflush(stdin); if(temx[i]==8) { if (i!=0) { putch(8);/*lint !e534*/ putch(' ');/*lint !e534*/ putch(8);/*lint !e534*/ i-=2; } } else putch('*');/*lint !e534*/ fflush(stdin); fflush(stdout); } temx[i]='\0'; strcpy(mimx,temx); printf("\n\n"); } char *nuchange(long int nume) { static char tt[50]; int len,i; len=(int)log10((double)nume); tt[len+1]='\0'; for(i=len;i>=0;--i) { tt[i]=(nume%10)+48; nume=(nume-(nume%10))/10; } return tt; } int initaz(const char *x) { FILE *fp; char *em=(char*) calloc((unsigned int)50,sizeof(char)); if(em==NULL) { printf("内存不足"); getch();/*lint !e534*/ exit(1); } fp=fopen(x,"r"); if (fp==NULL) { fflush(stdin); free(em); return 1; } fgets(mim,20,fp);/*lint !e534*/ if (mim[strlen(mim)-1]=='\n') mim[strlen(mim)-1]='\0';/*本语句实现兼容手写文件*/ fscanf(fp,"%ld\n",&moneyint); while(fgets(em,50,fp)!=NULL) { if(em[0]=='\n') continue; ++top; strcpy(point->rec,em+6); point->next=(list*) malloc(sizeof(list)); point=point->next; point->next=NULL; } free(em); fclose(fp); return 0; } int save(const char *x,const char *m,list *pp) { FILE *fp; int i; fp=fopen(x,"w"); if (fp==NULL) { fflush(stdin); return 1; } fprintf(fp,"%s\n",m); fprintf(fp,"%-10ld\n",moneyint); for(i=1;pp->next!=NULL;pp=pp->next,++i) fprintf(fp,"*%-5d%s\n",i,pp->rec); fclose(fp); return 0; }