• ATM管理系统


    一、作业信息

    班级https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
      作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
    目标 编写一个ATM管理系统
    学号 3180701240

    二.题目要求

    编写一个ATM管理系统,语言不限,要求应包括以下主要功能:

    (1)开户,销户

    (2)查询账户余额

    (3)存款

    (4)取款

    (5)转账(一个账户转到另一个账户)等...

    三、代码提交与运行截图
      源代码:

      1 #include <stdio.h>
      2 #include<stdlib.h> //itoa所需要的库函数
      3 #include <string.h>
      4 #include <ctype.h>
      5 #include <conio.h>
      6  
      7 #define topNum 2000 //系统最多容纳用户数目
      8 int uActual;//实际人数
      9 char AccName[topNum][9];//账户名
     10 int users[topNum][2];//密码、状态,0行不存放
     11 char nameGroup[topNum][10];//用户姓名,0行不存放
     12 double balance[topNum];//账户余额,0行不存放
     13  
     14  
     15 int iPWD();
     16 void uExpotrData();//导出数据
     17 void uImportData();//写入数据
     18 void Work();//办理
     19 int BankMenu();//银行界面
     20 void Deposit();
     21 void Withdraw();//取款
     22 void ChangePWD();//改密
     23 void Cancellation();//销户
     24 void Sleep();//挂失
     25 void Recovery();//解挂
     26 void TransferAccount();//转账
     27 void CreateAccount();//开户
     28 void Qurey();//查询
     29 void creatAccNum(int );
     30 int createPWd(int );
     31 int seek(char []);//账户判断
     32 int see(char []);//账号查询
     33 int verifyAll();
     34 int verifyPAD(int Num);//密码验证
     35 int inputPWD();
     36 int main()
     37 {
     38     printf("+------------------+
    ");
     39     printf("+ 欢迎来到CSDN银行 +
    ");
     40     printf("+------------------+
    ");
     41     if(iPWD())//业务员密码验证
     42     {
     43         uExpotrData();//从文件导出数据
     44         Work();//业务办理
     45         uImportData();//写入数据到文件
     46     }
     47     return 0;
     48 }
     49  
     50 int iPWD()//密码登录
     51 {
     52     int right = 0;
     53     int iTry = 3;
     54     int i ;
     55     char ch;
     56     char inputPsss[20];//输入账户密码
     57     char sNameFile[20];//文件保存业务员登录名称名
     58     char sPassFile[20];//业务员登录密码
     59     char inputName[20];//输入业务员登录名称
     60     FILE *fp;
     61     if((fp = fopen("Worker.txt","r"))==NULL)
     62     {
     63         printf("Cannot open file!");
     64         exit(0);
     65     }
     66     fscanf(fp,"%s %s",sNameFile,sPassFile);
     67     fclose(fp);
     68  
     69     do{
     70             i = 0;
     71             printf("请输入业务员用户名:");
     72             scanf("%s",inputName);
     73             printf("
    请输入登录密码:");
     74             while((ch=getch())!= '
    ')
     75             {
     76                 inputPsss[i++] = ch;
     77                 putchar('*');
     78             }
     79             inputPsss[i] = '';
     80             fflush(stdin);
     81             printf("
    ");
     82             if(strcmp(inputName,sNameFile)==0 && strcmp(inputPsss,sPassFile)==0)
     83             {
     84                 right = 1;
     85                 break;
     86             }
     87             else
     88             {
     89                 iTry--;
     90                 if(iTry > 0)
     91                 {
     92                     printf("输入密码错误%d次,请重新输入
    ",4-iTry);
     93                 }
     94                 else
     95                 {
     96                     printf("密码输入已达3次,退出系统
    ");
     97                 }
     98             }
     99     }while(iTry);
    100     return right;
    101 }
    102  
    103 /*功能:从文件中读取储户数据*/
    104 void uExpotrData()//导入数据
    105 {
    106     int i=0;
    107     FILE *fp;
    108     if((fp = fopen("account.txt","r")) == NULL)
    109     {
    110         printf("File cannot open!
    ");
    111         exit(0);
    112     }
    113     if(feof(fp))
    114     {
    115         uActual = 0;
    116     }
    117     else
    118     {
    119         //密码、状态、用户姓名、账号、余额写入
    120         while(fscanf(fp,"%d %d %s %s %lf",&users[i][0],&users[i][1],nameGroup[i],AccName[i],&balance[i]) != EOF)
    121             i++;
    122         fclose(fp);
    123         uActual = i;
    124     }
    125 }
    126  
    127 /*功能:将用户数据保存到文件中*/
    128 void uImportData()//写入数据
    129 {
    130     int i=0;
    131     FILE *fp;
    132     if((fp = fopen("account.txt","w")) == NULL)
    133     {
    134         printf("File cannot open!
    ");
    135         exit(0);
    136     }
    137     //密码、状态、用户名、账号、余额写入
    138     for(i=0;i<uActual;i++)
    139         fprintf(fp,"%d %d %s %s %.2lf
    ",users[i][0],users[i][1],nameGroup[i],AccName[i],balance[i]);
    140     fclose(fp);
    141 }
    142  
    143 
    144 void Work()//办理
    145 {
    146     int uChoice;
    147     if(uActual == 0)
    148     {
    149         printf("系统未存储用户数据,需办理开户
    ");
    150         printf("是否开户:Y/N
    ");
    151         if(tolower(getchar())=='y')//tolower()函数将字母转化为小写,非字母不做处理
    152         {
    153             CreateAccount();//开户
    154         }
    155         else
    156         {
    157             printf("退出系统");
    158             exit(0);
    159         }
    160     }
    161     do{
    162         uChoice = BankMenu();//界面菜单选择
    163         switch(uChoice)
    164         {
    165         case 1:
    166             Deposit();//存款
    167             break;
    168         case 2:
    169             Withdraw();//取款
    170             break;
    171         case 3:
    172             ChangePWD();//改密
    173             break;
    174         case 4:
    175             Cancellation();//销户
    176             break;
    177         case 5:
    178             CreateAccount();//开户
    179             break;
    180         case 6:
    181             Sleep();//挂失
    182             break;
    183         case 7:
    184             Recovery();//解挂
    185             break;
    186         case 8:
    187             TransferAccount();//转账
    188             break;
    189         case 9:
    190             Qurey();//查询
    191             break;
    192         case 0:
    193             printf("欢迎下次光临!
    ");//退出
    194             break;
    195         default:
    196             printf("请输入选项中的0~9选项序号:");
    197             break;
    198         }
    199     }while(uChoice);
    200 }
    201  
    202 /*功能:显示菜单并由业务员选择返回值:用户选择的功能,范围0-9*/
    203 int BankMenu()//银行界面
    204 {
    205     int Choice;//选择业务办理选项
    206     do
    207     {
    208         printf("
    
    ");
    209         printf("  +---------------------------------+
    ");
    210         printf("  +           办理业务选项          +
    ");
    211         printf("  +---------------------------------+
    ");
    212         printf("  +   1.存款    2.取款    3.改密    +
    ");
    213         printf("  +                                 +
    ");
    214         printf("  +   4.销户    5.开户    6.挂失    +
    ");
    215         printf("  +                                 +
    ");
    216         printf("  +   7.解挂    8.转账    9.查询    +
    ");
    217         printf("  +                                 +
    ");
    218         printf("  +   0.退出系统                    +
    ");
    219         printf("  +---------------------------------+
    ");
    220         printf("
    ");
    221         printf("输入所需办理的业务序号:");
    222         scanf("%d",&Choice);
    223         fflush(stdin);
    224         if(Choice<=9&&Choice>=0)
    225             break;
    226         else
    227             printf("请输入1~9的选项");
    228     }while(1);
    229     return Choice;
    230 }
    231  
    232 /*功能:存款   说明:需要保证账户存在,且处于正常状态*/
    233 void Deposit()//存款
    234 {
    235     int site;
    236     double uMoney;
    237     if((site = verifyAll())!= -1)//身份验证
    238     {
    239             printf("请输入存款金额:");
    240             scanf("%lf",&uMoney);
    241             balance[site] +=uMoney;
    242             printf("已存款%0.2lf元
    余额为%0.2lf元
    ",uMoney,balance[site]);
    243     }
    244 }
    245  
    246 /*功能:取款   说明:需要保证账户存在,且处于正常状态,另外,余额要足够取*/
    247 void Withdraw()//取款
    248 {
    249     int site;
    250     double uMoney;
    251     if((site = verifyAll())!= -1)//身份验证
    252     {
    253         printf("请输入取款金额:");
    254         scanf("%lf",&uMoney);
    255         if(uMoney<balance[site])
    256         {
    257             balance[site] -=uMoney;
    258             printf("已取款%0.2lf元
    余额为%0.2lf元
    ",uMoney,balance[site]);
    259         }
    260         else
    261             printf("余额不足!");
    262     }
    263 }
    264  
    265 /*功能:改密码*/
    266 void ChangePWD()//改密
    267 {
    268     int site;//查找位置
    269     if((site = verifyAll())!= -1)//账号查询,并返回位置
    270     {
    271         if(createPWd(site))
    272             printf("修改成功!");
    273         else
    274             printf("修改失败");
    275     }
    276     else
    277     {
    278         printf("修改失败
    ");
    279     }
    280  
    281 }
    282  
    283 /*功能:注销账户   说明:找到账户,并将其状态改为2-注销即可。注销前应该检查余额,应该先取款再注销*/
    284 void Cancellation()//销户
    285 {
    286  
    287     int site;//查找位置
    288     if((site = verifyAll())!= -1)
    289     {
    290         printf("你的账户余额为%0.2lf元
    ",balance[site]);
    291         printf("是否销户Y/N:");
    292         if(tolower(getchar())=='y')//tolower()函数将字母转化为小写,非字母不做处理
    293         {
    294             users[site][1]=2;//销户
    295             printf("销户成功
    ");
    296         }
    297         else
    298         {
    299             printf("销户失败
    ");
    300         }
    301     }
    302     else
    303     {
    304         printf("
    失败
    ");
    305     }
    306     return;
    307 }
    308  
    309 /*功能:开户*/
    310 void CreateAccount()//开户
    311 {
    312     if(uActual == topNum)
    313     {
    314         printf("系统存储已达上线,不能开户");
    315         return;
    316     }
    317     printf("正在开户中……
    ");
    318     printf("系统生成账号为:");
    319     creatAccNum(uActual);//生成账号
    320     printf("请输入姓名:");
    321     scanf("%s",nameGroup[uActual]);//存入用户名
    322     if(createPWd(uActual)==1)//创建密码并校验
    323     {
    324         printf("请输入存款金额:");
    325         scanf("%lf",&balance[uActual]);
    326         printf("您已经存入%lf元",balance[uActual]);
    327         users[uActual][1]=0;//写入状态代号为正常,0表示
    328         uActual++;
    329     }
    330     else
    331         {
    332             printf("返回系统选项
    ");
    333         }
    334 }
    335  
    336 
    337 /*功能:挂失账户*/
    338 void Sleep()//挂失
    339 {
    340     int site;
    341     if((site = verifyAll())!= -1)//身份验证
    342     {
    343         if(users[site][1]==0)//
    344         {
    345             users[site][1]=1;
    346             printf("
    挂失成功
    ");
    347         }
    348         else if(users[site][1]==1)
    349             printf("
    该账已经挂失
    ");
    350         else
    351             printf("
    该账户已经销户
    ");
    352     }
    353 }
    354  
    355 /*功能:解除挂失*/
    356 void Recovery()//解挂
    357 {
    358     char Acc_u[20];//账号
    359     int site;//查找位置
    360     printf("请输入账号:");
    361     gets(Acc_u);
    362     site = see(Acc_u);
    363     if(site!= -1)
    364     {
    365         printf("账户名为:%s
    ",nameGroup[site]);
    366         if(verifyPAD(site))
    367         {
    368             if(users[site][1]==1)//
    369             {
    370                 users[site][1]=0;
    371                 printf("
    解挂成功
    ");
    372             }
    373             else if(users[site][1]==0)
    374                 printf("
    该账户未挂失
    ");
    375             else
    376                 printf("
    该账户已经销户
    ");
    377         }
    378     }
    379  
    380 }
    381  
    382 /*功能:转账    说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够*/
    383 void TransferAccount()//转账
    384 {
    385     int site;
    386     int Num;
    387     double uMoney;
    388     char str[20];//存储输入账号数字
    389     if((site = verifyAll())!= -1)//身份验证
    390     {
    391         printf("请输入需要转入的账户:");
    392         gets(str);//标准输入设备读字符串函数
    393         fflush(stdin);
    394         if((Num = seek(str))!= -1)//
    395         {
    396             printf("请输入转账金额");
    397             scanf("%lf",&uMoney);
    398             if(uMoney < balance[site])
    399             {
    400                 balance[site] -= uMoney;
    401                 balance[Num] +=uMoney;
    402                 printf("转账成功
    账户余额为%lf",balance[site]);
    403             }
    404             else
    405             {
    406                 printf("余额不足");
    407             }
    408         }
    409  
    410     }
    411     return;
    412 }
    413  
    414 /*功能:查询账户   说明:显示账户信息*/
    415 void Qurey()//查询
    416 {
    417     int site;
    418     if((site = verifyAll( ))!= -1)//身份验证
    419     {
    420         printf("账户余额为%lf",balance[site]);
    421     }
    422 }
    423  
    424 
    425 void creatAccNum(int num)//根据实际人数自动生成账号
    426 {
    427     int n;
    428     char s[20];//将num以字符形式保存
    429     char N[20]="CSDN";
    430     itoa(num,s,10); // itoa(int,char,要转换的十进制数)
    431     strrev(s);//数组倒置
    432     n=strlen(s);//长度
    433     while(n<4)
    434     {
    435         s[n]='0';
    436         n++;
    437     }
    438     s[n]='';
    439     strrev(s);
    440     strcat(N,s);//数字连接
    441     printf("%s
    ",N);
    442     strcpy(AccName[num],N);//拷贝到用户账户里面
    443     return;
    444 }
    445  
    446 /*功能:对新密码进行核对   说明:第一次有输入的密码与第二次输入的密码进行比较,如果密码相同则返回1表示设置成功,否者返回0*/
    447 int createPWd(int Num)//创建密码并校验
    448 {
    449     int uPass1;//第一次输入要更改的密码
    450     int uPass2;//第二次输入要更改的密码
    451     printf("
    创建密码:");
    452     uPass1 = inputPWD();
    453     printf("
    请重新输入密码:");
    454     //fflush(stdin);
    455     uPass2 = inputPWD();
    456         if(uPass1==uPass2)
    457         {
    458             users[Num][0]=uPass1;//写入密码
    459             printf("
    创建密码完成
    ");
    460             return 1;
    461         }
    462         else
    463         {
    464             printf("
    密码不一致!
    ");
    465         }
    466         return 0;
    467 }
    468 /*功能:对账户进行身份验证   说明:分别验证账户,密码,当验证成功返回序号下标,账户验证失败返回-1*/
    469 int verifyAll()
    470 {
    471     char str[20];//存储输入账号数字
    472     int site;
    473     printf("请输入账号:");
    474     gets(str);//标准输入设备读字符串函数
    475     fflush(stdin);
    476     
    477     if((site =seek(str))!= -1)//账户验证
    478     {
    479         if(verifyPAD(site)!= -1)//密码验证
    480             {
    481                 printf("
    成功
    ");
    482             }
    483         else
    484             site = -1;
    485     }
    486     else
    487         printf("
    失败
    ");
    488     return site;
    489 }
    490  
    491 /*功能:对输入账户进行验证*/
    492 int seek(char str[])//账户判断
    493 {
    494     int judge=-1;
    495     int Num=0;
    496     if((Num = see(str))!= -1)//: 将一个串与另一个比较, 不管大小写,
    497     {
    498         if(users[Num][1]==0)//
    499         {
    500             printf("姓名:%s
    ",nameGroup[Num]);
    501             judge = Num;//账户序号返回
    502         }
    503         else if(users[Num][1]==1)
    504         {
    505             printf("该账户已经挂失
    ");
    506         }
    507         else
    508         {
    509             printf("该账户已经销户");
    510         }
    511     }
    512     else
    513     {
    514         printf("该账户不存在");
    515     }
    516     return judge;
    517 }
    518  
    519 /*功能:根据账号查询用户,返回用户的下标*/
    520 int see(char str[])//账号查询
    521 {
    522     int ptr;//存放strnicmp函数返回值
    523     int i;
    524     char N[]="CSDN";//账号前缀
    525     int digit;//长度
    526     int judge=-1;
    527     int Num = 0;//将数字字符转换为数字
    528     digit = strlen(str);//统计长度
    529     ptr = strnicmp(str,N,4);//
    530     if(digit == 8&&ptr == 0)
    531     {
    532         for(i=4;i<8;i++)
    533             if(isdigit(str[i]))//检查其参数是否为十进制数字字符
    534                 Num = Num*10+(str[i]-'0');
    535     }
    536     else
    537     {
    538         if(digit != 8)
    539             printf("账号位数出错
    ");
    540         if(ptr !=0)
    541             printf("账号请以CSDN开头
    ");
    542     }
    543     if(strcmpi(str,AccName[Num])==0)//: 将一个串与另一个比较, 不管大小写,
    544         {
    545             printf("查找成功
    ");
    546             judge = Num;
    547         }
    548     else
    549         printf("查找失败
    ");
    550     return judge;
    551 }
    552 /*功能:密码进行验证  功能:当输入密码,如果与原设置密码一致则返回数组下标序号,否则返回-1*/
    553 int verifyPAD(int Num)//密码验证
    554 {
    555     int Pass_u;
    556     int judge=0;
    557     printf("请输入密码:");
    558     Pass_u = inputPWD();
    559     if(Pass_u == users[Num][0])
    560         judge = Num;//返回存在的序号
    561     else
    562     {
    563         printf("
    密码错误
    ");
    564  
    565     }
    566     return judge;
    567 }
    568  
    569 /*功能:输入密码*/
    570 int inputPWD()//密码创建
    571 {
    572     int i;
    573     char ch;//接受字符型密码
    574     int uPass=0;//字符型密码转换为数字
    575     do
    576     {
    577         for(i=0;i<6;i++)
    578         {
    579             ch=getch();
    580             printf("*");
    581             if(isdigit(ch))//检查输入是否为十进制数字字符
    582                 uPass=uPass*10+(ch - '0');
    583             else
    584             {
    585                 uPass=0;
    586                 break;
    587             }
    588         }
    589         fflush(stdin);
    590         if(uPass == 0)
    591         {
    592             printf("
    ");
    593             printf("密码仅能够为数字
    ");
    594             printf("请重新输入密码
    
    ");
    595         }
    596         else
    597         {
    598             break;
    599         }
    600     }while(1);
    601  
    602     return uPass;
    603 }

     四、小结

        PSP表格

    psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 10 12
    Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 12 
    Development 开发 100 150
    Analysis 需求分析(包括学习新技术) 12
    Design Spec 生成设计文档 5
    Design Review 设计复审 5
    Coding Standard 代码规范 3
    Design 具体设计 10 12 
    Coding 具体编码 36 30
    Code Review 代码复审 5
    Test 测试(自我测试,修改代码,提交修改) 10 12
    Reporting 报告 9
    Test Report 测试报告 3
    Size Measurement 计算工作量 2
    Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3
  • 相关阅读:
    unity3d 打包个人记录
    Unity3d 协程
    Unity3d 复制文字到剪切板及存储图像到相册
    为什么 redo log 具有 crash-safe 的能力,是 binlog 无法替代的?
    Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
    深入理解Java虚拟机1——内存区域
    Java源码系列3——LinkedHashMap
    深入理解Java虚拟机2——对象探秘
    高效学习
    WordPress自动代码高亮
  • 原文地址:https://www.cnblogs.com/zzh0/p/14003359.html
Copyright © 2020-2023  润新知