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("+------------------+\n"); 39 printf("+ 欢迎来到CSDN银行 +\n"); 40 printf("+------------------+\n"); 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("\n请输入登录密码:"); 74 while((ch=getch())!= '\r') 75 { 76 inputPsss[i++] = ch; 77 putchar('*'); 78 } 79 inputPsss[i] = '\0'; 80 fflush(stdin); 81 printf("\n"); 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次,请重新输入\n",4-iTry); 93 } 94 else 95 { 96 printf("密码输入已达3次,退出系统\n"); 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!\n"); 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!\n"); 135 exit(0); 136 } 137 //密码、状态、用户名、账号、余额写入 138 for(i=0;i<uActual;i++) 139 fprintf(fp,"%d %d %s %s %.2lf\n",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("系统未存储用户数据,需办理开户\n"); 150 printf("是否开户:Y/N\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("欢迎下次光临!\n");//退出 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("\n\n"); 209 printf(" +---------------------------------+\n"); 210 printf(" + 办理业务选项 +\n"); 211 printf(" +---------------------------------+\n"); 212 printf(" + 1.存款 2.取款 3.改密 +\n"); 213 printf(" + +\n"); 214 printf(" + 4.销户 5.开户 6.挂失 +\n"); 215 printf(" + +\n"); 216 printf(" + 7.解挂 8.转账 9.查询 +\n"); 217 printf(" + +\n"); 218 printf(" + 0.退出系统 +\n"); 219 printf(" +---------------------------------+\n"); 220 printf("\n"); 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元\n余额为%0.2lf元\n",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元\n余额为%0.2lf元\n",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("修改失败\n"); 279 } 280 281 } 282 283 /*功能:注销账户 说明:找到账户,并将其状态改为2-注销即可。注销前应该检查余额,应该先取款再注销*/ 284 void Cancellation()//销户 285 { 286 287 int site;//查找位置 288 if((site = verifyAll())!= -1) 289 { 290 printf("你的账户余额为%0.2lf元\n",balance[site]); 291 printf("是否销户Y/N:"); 292 if(tolower(getchar())=='y')//tolower()函数将字母转化为小写,非字母不做处理 293 { 294 users[site][1]=2;//销户 295 printf("销户成功\n"); 296 } 297 else 298 { 299 printf("销户失败\n"); 300 } 301 } 302 else 303 { 304 printf("\n失败\n"); 305 } 306 return; 307 } 308 309 /*功能:开户*/ 310 void CreateAccount()//开户 311 { 312 if(uActual == topNum) 313 { 314 printf("系统存储已达上线,不能开户"); 315 return; 316 } 317 printf("正在开户中……\n"); 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("返回系统选项\n"); 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("\n挂失成功\n"); 347 } 348 else if(users[site][1]==1) 349 printf("\n该账已经挂失\n"); 350 else 351 printf("\n该账户已经销户\n"); 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\n",nameGroup[site]); 366 if(verifyPAD(site)) 367 { 368 if(users[site][1]==1)// 369 { 370 users[site][1]=0; 371 printf("\n解挂成功\n"); 372 } 373 else if(users[site][1]==0) 374 printf("\n该账户未挂失\n"); 375 else 376 printf("\n该账户已经销户\n"); 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("转账成功\n账户余额为%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]='\0'; 439 strrev(s); 440 strcat(N,s);//数字连接 441 printf("%s\n",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("\n创建密码:"); 452 uPass1 = inputPWD(); 453 printf("\n请重新输入密码:"); 454 //fflush(stdin); 455 uPass2 = inputPWD(); 456 if(uPass1==uPass2) 457 { 458 users[Num][0]=uPass1;//写入密码 459 printf("\n创建密码完成\n"); 460 return 1; 461 } 462 else 463 { 464 printf("\n密码不一致!\n"); 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("\n成功\n"); 482 } 483 else 484 site = -1; 485 } 486 else 487 printf("\n失败\n"); 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\n",nameGroup[Num]); 501 judge = Num;//账户序号返回 502 } 503 else if(users[Num][1]==1) 504 { 505 printf("该账户已经挂失\n"); 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("账号位数出错\n"); 540 if(ptr !=0) 541 printf("账号请以CSDN开头\n"); 542 } 543 if(strcmpi(str,AccName[Num])==0)//: 将一个串与另一个比较, 不管大小写, 544 { 545 printf("查找成功\n"); 546 judge = Num; 547 } 548 else 549 printf("查找失败\n"); 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("\n密码错误\n"); 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("\n"); 593 printf("密码仅能够为数字\n"); 594 printf("请重新输入密码\n\n"); 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 | 5 |
Design Spec | 生成设计文档 | 5 | 5 |
Design Review | 设计复审 | 5 | 5 |
Coding Standard | 代码规范 | 3 | 2 |
Design | 具体设计 | 10 | 12 |
Coding | 具体编码 | 36 | 30 |
Code Review | 代码复审 | 5 | 7 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 12 |
Reporting | 报告 | 9 | 6 |
Test Report | 测试报告 | 3 | 2 |
Size Measurement | 计算工作量 | 2 | 1 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 3 | 3 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步