采用链表存储的银行系统
2011-04-16 14:29
162 查看
//银行.h
1: #include <stdio.h>
2: #include <stdlib.h>[/code]
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/t%4d/%2d/%2d/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(" %4d-%2d-%2d %2d:%2d:%2d",
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: " /t%4d/%2d/%2d %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"
[/code]
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: }
相关文章推荐
- 案例分析:无锡移动采用“戴尔虚拟化方案+EqualLogic™存储+ICS服务”优化IT系统
- 页式存储(已知系统为32位实地址,采用48位虚拟地址,页面大小4KB,页表项大小为8B;每段最大为4GB。)
- 存储过程、事务在银行转账系统的应用
- 采用中序线索链表存储结构,实现中序遍历
- c语言怎么采用链表编写销售管理系统
- C++第14周项目6——银行系统,用文件永久存储
- 数据结构课程设计之银行活期存储系统(设计报告)
- 采用二叉链表存储结构,实现其各种遍历的方法
- 第十九周 银行系统(链表、二进制、业务明细)
- 第二课(模拟银行系统--------链表)
- 链表解决银行储存系统---技术支持
- 问:当前计算机系统一般会采用层次结构存储数据,请介绍下典型计算机存储系统一般分为哪几个层次,为什么采用分层存储数据能有效提高程序的执行效率?
- 用java模拟银行账户存储系统
- 案例分析:福建华科采用“戴尔服务器+ IP SAN存储+Exchange2010+ICS”一体化方案建设高效邮件系统
- 采用中序线索链表存储结构,实现中序遍历
- FastDFS分布式文件存储系统解析
- 分布式存储系统可靠性如何估算?
- Java设计的银行取款系统-Mysql数据库(改进篇)2017/7/16
- 分布式存储系统可靠性系列一:如何估算
- 黑马程序员-----银行调度系统学习日志