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;
}

posted @ 2010-10-23 00:25  幻魇  阅读(253)  评论(0编辑  收藏  举报