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
原文地址:https://www.cnblogs.com/zzh0/p/14003359.html