采用链表存储的银行系统

    技术2022-05-20  40

    //银行.h 1: #include <stdio.h> 2: #include <stdlib.h> 3: #include <string.h> 4: #include <time.h> 5: #include <conio.h> 6: #define FailureBeep() _beep(2000,300) 7: #define SucceedBeep() _beep(600,500) 8: #define NameLength 20 //用户名最多20个英文字母或10个汉字 9: #define DEPOSIT 1 //存款 10: #define DRAW -1 //取款 11: #define MAX 200 12: #define DataFileName "data.jo" 13: #define ReadMode "rb" 14: #define WriteMode "wb" 15: /* 16: *HOME键71 244 17: *pageup键 73 244 18: *pagedown键 81 244 19: *End键 79 244 20: */ 21: #define HOME 71 22: #define PAGEUP 73 23: #define PAGEDOWN 81 24: #define END 79 25: #define SKEY 224 26: #define RETKEY '/r' 27: int UserCont=0; //总用户数 28: typedef struct HistoryNode 29: { 30: int year,month,day; //该次记录的日期 31: int hour,minute,second; //该次记录的时间 32: double money,blance; //该次记录的交易金额和当前余额 33: int Operation; //该次记录的交易类型 34: struct HistoryNode * next; //下一个记录节点 35: }*HistoryList,HistoryNode; 36: typedef struct UserNode 37: { 38: char name[NameLength] ; //存储用户名 39: unsigned int userAccount; //存储用户账号 40: double blance; //存储用户余额 41: struct date //存储开户日期 42: { 43: int year,month,day; 44: }date; 45: char password[36]; //存储用户密码 46: HistoryList userHistoryHead,rHistory; //用户历史交易记录的链表 47: int HistoryTop; //用户历史交易笔数 48: struct UserNode * next; //下一个用户节点 49: }UserNode ,* UserList; 50: UserList UserHead; 51: UserList rUser; 52: FILE * datafile; 53: void InitEnvironmen(); 54: int printHead(); 55: int printHead2(); 56: UserList GetUser(); 57: UserList NewUserNode(); 58: void AddUser(UserList user); 59: void Deposit(); 60: void Draw(); 61: void Query(); 62: void CheckHistory(); 63: void EXIT(); 64: int printHead() 65: { 66: int length=70; 67: int i; 68: system("cls"); 69: system("mode con:lines=30 cols=80"); 70: printf(" "); 71: for(i=0;i 72: printf("*"); 73: puts("");printf(" "); 74: printf("*"); 75: for(i=0;i 76: printf(" "); 77: puts("*");printf(" "); 78: printf("*"); 79: for(i=0;i 80: printf(" "); 81: puts("*");printf(" "); 82: 83: puts("*/t/t ①开户 ②存款 ③取款 ④查询 ⑤交易记录 ⑥退出 *"); 84: printf(" "); 85: printf("*"); 86: for(i=0;i 87: printf(" "); 88: puts("*");printf(" "); 89: printf("*"); 90: for(i=0;i 91: printf(" "); 92: puts("*");printf(" "); 93: for(i=0;i 94: printf("*"); 95: puts(""); 96: 97: printf("请按下你想要进行的操作的数字键:"); 98: return getche(); 99: } 100: 101: int printHead2() 102: { 103: int length=53; 104: int i; 105: system("cls"); 106: system("mode con:lines=30 cols=64"); 107: printf(" "); 108: for(i=0;i109: printf("*"); 110: puts(""); 111: printf(" ");printf("*"); 112: for(i=0;i113: printf(" "); 114: puts("*"); 115: printf(" ");printf("*"); 116: for(i=0;i117: printf(" "); 118: puts("*"); 119: 120: printf(" ");puts("*/t/t ①按账号 ②按账户名 /t/t *"); 121: printf(" ");printf("*"); 122: for(i=0;i123: printf(" "); 124: puts("*"); 125: printf(" ");printf("*"); 126: for(i=0;i127: printf(" "); 128: puts("*");printf(" "); 129: for(i=0;i130: printf("*"); 131: puts(""); 132: 133: printf("请按下你想要进行的操作的数字键:"); 134: 135: 136: return getche(); 137: } 138: 139: void InitEnvironmen() 140: { 141: int i=0,j=0; 142: UserList r; 143: HistoryList rh; 144: UserHead = (UserList)malloc(sizeof(UserNode)); 145: UserHead ->next = NULL; 146: UserHead ->HistoryTop = 0; 147: //UserHead->userHistoryHead = (HistoryList)malloc(sizeof(HistoryNode)); 148: // UserHead->userHistoryHead->next= NULL; 149: //UserHead->rHistory = UserHead->userHistoryHead; 150: rUser = UserHead; 151: fopen_s(&datafile,DataFileName,ReadMode); 152: if(datafile==NULL) 153: return ; 154: else 155: { 156: fread(&UserCont,sizeof(int),1,datafile); 157: i=UserCont; 158: while(i--) 159: { 160: r=(UserList)malloc(sizeof(UserNode)); 161: fread(r,sizeof(UserNode),1,datafile); 162: r->next = NULL; 163: r->userHistoryHead = (HistoryList)malloc(sizeof(HistoryNode)); 164: r->userHistoryHead->next= NULL; 165: r->rHistory = r->userHistoryHead; 166: AddUser(r); 167: j=r->HistoryTop; 168: while(j--) 169: { 170: rh = (HistoryList)malloc(sizeof(HistoryNode)); 171: fread(rh,sizeof(HistoryNode),1,datafile); 172: //rh->next = NULL; 173: rh->next = r->rHistory->next; 174: r->rHistory->next = rh; 175: r->rHistory = r->rHistory->next; 176: } 177: } 178: } 179: fclose(datafile); 180: } 181: 182: UserList GetUser() 183: { 184: int useraccount; 185: char username[NameLength]; 186: UserList r=NULL; 187: int choice; 188: retry_getuser: 189: choice = printHead2(); 190: if(choice=='1') 191: { 192: printf("请输入您的账号:"); 193: scanf("%d",&useraccount); 194: r = UserHead->next; 195: while(r) 196: { 197: if(r->userAccount==useraccount) 198: return r; 199: else 200: r=r->next; 201: } 202: return NULL; 203: } 204: else if(choice=='2') 205: { 206: puts("/n请输入您的账户名: "); 207: fflush(stdin); 208: //fgets(username,NameLength,stdin); 209: scanf("%s",username); 210: r=UserHead->next; 211: while(r) 212: { 213: if(strcmp(r->name,username)==0) 214: return r; 215: else 216: r=r->next; 217: } 218: return NULL; 219: } 220: else 221: { 222: puts("没有对应操作。"); 223: _sleep(4000); 224: goto retry_getuser; 225: } 226: } 227: 228: UserList NewUserNode() 229: { 230: time_t t; 231: struct tm*gt; 232: UserList tmp = (UserList)malloc(sizeof(UserNode)); 233: time(&t); 234: gt = localtime(&t); 235: UserCont++; 236: printf("请输入帐户名:"); 237: scanf("%s",tmp->name); 238: tmp->blance = 0; 239: tmp->HistoryTop = 0; 240: tmp->userAccount = UserCont; 241: 242: tmp->date.year = gt->tm_year+1900; 243: tmp->date.month = gt->tm_mon+1; 244: tmp->date.day = gt->tm_mday; 245: 246: tmp->userHistoryHead = (HistoryList)malloc(sizeof(HistoryNode)); 247: tmp->userHistoryHead->next = NULL; 248: tmp->rHistory = tmp->userHistoryHead; 249: return tmp; 250: } 251: 252: void AddUser(UserList user) 253: { 254: if(user) 255: { 256: user->next = rUser->next; 257: rUser->next = user; 258: rUser = user; 259: } 260: } 261: 262: void AddHistory(UserList user,HistoryList rt) 263: { 264: rt->next = user->rHistory->next; 265: user->rHistory->next = rt; 266: user->rHistory = user->rHistory->next; 267: } 268: 269: HistoryList NewHistoryNode(UserList user,double money, int opration) 270: { 271: HistoryList rt; 272: time_t t; 273: struct tm*gt; 274: rt=(HistoryList)malloc(sizeof(HistoryNode)); 275: time(&t); 276: gt = localtime(&t); 277: rt->year = gt->tm_year+1900; 278: rt->month = gt->tm_mon+1; 279: rt->day = gt->tm_mday; 280: rt->hour = gt->tm_hour; 281: rt->minute = gt->tm_min; 282: rt->second = gt->tm_sec; 283: rt->Operation = opration; 284: rt->money = money; 285: rt->blance = user->blance; 286: rt->next = NULL; 287: user->HistoryTop++; 288: return rt; 289: } 290: 291: void Deposit() 292: { 293: float depositMoney; 294: int useraccount; 295: UserList r = GetUser(); 296: if(r) 297: { 298: printf("请输入您要存的钱:"); 299: scanf("%f",&depositMoney); 300: r->blance+=depositMoney; 301: AddHistory(r,NewHistoryNode(r,depositMoney,DEPOSIT)); 302: } 303: else 304: { 305: puts("不存在的用户。"); 306: _sleep(4000); 307: return ; 308: } 309: } 310: 311: void Draw() 312: { 313: float drawMoney; 314: UserList r = GetUser(); 315: if(r) 316: { 317: printf("请输入您要取的钱:"); 318: scanf("%f",&drawMoney); 319: r->blance-=drawMoney; 320: AddHistory(r,NewHistoryNode(r,drawMoney,DRAW)); 321: } 322: else 323: { 324: puts("不存在的用户。"); 325: _sleep(400); 326: return ; 327: } 328: } 329: 330: void Query() 331: { 332: UserList r = GetUser(); 333: if(r) 334: { 335: printf("/n/t/t开户日期 账号/t账户名/t账户余额/n" 336: "/t/tM/-/-/t %d %s/t %g", 337: r->date.year,r->date.month,r->date.day,r->userAccount,r->name,r->blance); 338: puts("/n/n/n查询更多详细信息请按5查询交易记录……/n"); 339: 340: } 341: else 342: { 343: puts("不存在的用户。"); 344: _sleep(400); 345: return ; 346: } 347: } 348: 349: void printHistory(HistoryList position,int AllPages,int CurrutPage) 350: { 351: int i; 352: printf(" 日期 时间 交易类型 交易金额 余额 /n"); 353: 354: for(i=0;i<10&&position;i++) 355: { 356: printf(" M---- -:-:-", 357: position->year, 358: position->month, 359: position->day, 360: position->hour, 361: position->minute, 362: position->second); 363: if(position->Operation==DEPOSIT) 364: printf(" 存款 "); 365: else if(position->Operation==DRAW) 366: printf(" 取款 "); 367: printf("%6.1f %6.1f /n",position->money, 368: position->blance); 369: 370: position = position->next; 371: } 372: printf("/n/n 共%d页 第%d页/n/n" 373: " PageUp:上一页 PageDown:下一页/n/n Home:第一页 End:最后一页 Enter:返回/n", 374: AllPages,CurrutPage); 375: } 376: 377: void printUserInfo(UserList r) 378: { 379: system("cls"); 380: printf("/n/n /t开户日期 账号 账户名/n" 381: " /tM/-/- %d/t%s/n/n", 382: r->date.year,r->date.month,r->date.day,r->userAccount,r->name); 383: } 384: 385: void CheckHistory() 386: { 387: UserList r = GetUser(); 388: int historypage,i=0,j=0; 389: HistoryList* hr,rhistory; 390: int key,skey; 391: if(r) 392: { 393: if(r->HistoryTop>0) 394: { 395: historypage = r->HistoryTop/10; 396: hr = (HistoryList*)malloc((historypage+1)*(sizeof(HistoryNode))); 397: rhistory = r->userHistoryHead->next; 398: while(i<=historypage) 399: { 400: hr[i] = rhistory; 401: while(j<10&&rhistory->next) 402: { 403: rhistory = rhistory->next; 404: j++; 405: } 406: j=0; 407: i++; 408: } 409: i=0; 410: printUserInfo(r); 411: printHistory(hr[i],historypage+1,i+1); 412: while((key = getch())!=RETKEY) 413: { 414: if(key==SKEY) 415: { 416: if((skey=getch())==HOME) 417: i=0; 418: else if(skey==END) 419: i=historypage; 420: else if(skey==PAGEUP) 421: { 422: if(i>0) 423: i--; 424: else 425: { 426: puts("已经是第一页"); 427: _sleep(1000); 428: } 429: } 430: else if(skey==PAGEDOWN) 431: { 432: if(i433: i++; 434: else 435: { 436: puts("已经是最后一页"); 437: _sleep(1000); 438: } 439: } 440: else 441: { 442: puts("没有对应的操作"); 443: _sleep(500); 444: } 445: 446: 447: } 448: else 449: { 450: puts("没有对应操作"); 451: _sleep(1000); 452: } 453: 454: printUserInfo(r); 455: printHistory(hr[i],historypage+1,i+1); 456: 457: } 458: 459: 460: } 461: else 462: { 463: puts("没有该用户的记录。"); 464: return ; 465: } 466: } 467: else 468: { 469: puts("不存在的用户。"); 470: _sleep(400); 471: return ; 472: } 473: } 474: 475: void SaveData() 476: { 477: FILE * datafile; 478: int i,j,n,pcont=0; 479: float m; 480: fopen_s(&datafile,DataFileName,WriteMode); 481: if(datafile) 482: { 483: i=UserCont; 484: puts("/n开始保存数据,请稍等……/n"); 485: for(n=0;n<69;n++) 486: printf("-"); 487: printf("/r"); 488: m=70.0/(float)i; 489: fwrite(&UserCont,sizeof(int),1,datafile); 490: while(i--&&UserHead) 491: { 492: UserHead = UserHead->next; 493: fwrite(UserHead,sizeof(UserNode),1,datafile); 494: j=UserHead->HistoryTop; 495: UserHead->userHistoryHead = UserHead->userHistoryHead->next; 496: while(j--&&UserHead->userHistoryHead) 497: { 498: fwrite(UserHead->userHistoryHead,sizeof(HistoryNode),1,datafile); 499: UserHead->userHistoryHead=UserHead->userHistoryHead->next; 500: } 501: for(n=0;n502: { 503: if(pcont<70) 504: { 505: printf("*"); 506: _sleep(5); 507: pcont++; 508: } 509: } 510: _sleep(40); 511: } 512: puts("/n成功保存数据."); 513: _sleep(500); 514: return ; 515: } 516: else 517: puts("保存数据失败./n即将自动退出."); 518: fclose(datafile); 519: } 520: 521: void EXIT() 522: { 523: int length=60; 524: int i; 525: system("cls"); 526: system("mode con:lines=30 cols=70"); 527: printf(" "); 528: for(i=0;i529: printf("*"); 530: puts(""); 531: printf(" ");printf("*"); 532: for(i=0;i533: printf(" "); 534: puts("*"); 535: printf(" ");printf("*"); 536: for(i=0;i537: printf(" "); 538: puts("*"); 539: 540: printf(" ");puts("*/t/t ①保存并退出 ②直接退出 ③取消 /t /t *"); 541: printf(" ");printf("*"); 542: for(i=0;i543: printf(" "); 544: puts("*"); 545: printf(" ");printf("*"); 546: for(i=0;i547: printf(" "); 548: puts("*");printf(" "); 549: for(i=0;i550: printf("*"); 551: puts(""); 552: 553: printf("/t请按下你想要进行的操作的数字键:"); 554: switch(getch()) 555: { 556: case '1': 557: SaveData(); 558: exit(0); 559: case '2': 560: puts("警告:直接退出将不保存数据而直接退出,可能造成您的数据丢失!请慎重选择!"); 561: printf("请再次确认:直接退出吗?(Y/N)N/b"); 562: if(getche()=='y') 563: exit(0); 564: else 565: return ; 566: case '3': 567: return ; 568: default: 569: break; 570: 571: } 572: 573: } 574:

    //main.c

    1: #include <stdio.H> 2: #include "银行.h" 3: int main() 4: { 5: InitEnvironmen(); 6: while(1) 7: { 8: switch(printHead()) 9: { 10: case 49: AddUser(NewUserNode());break; 11: case 50: Deposit();break; 12: case 51: Draw();break; 13: case 52: Query();break; 14: case 53: CheckHistory();break; 15: case 54: EXIT();break; 16: default: printf("没有对应的操作……");break; 17: } 18: 19: system("pause"); 20: } 21: return 0; 22: }

    最新回复(0)