<5>c语言实现ATM存取款系统(文件、排序)
2012-12-05 08:15
537 查看
#include<stdio.h> #include<String.h> #include<math.h> #include<stdlib.h> #include<windows.h> #define N 100 typedef struct info { char account[21]; char user[21]; long dsit; long pw; struct info *next; }Info; void login(); void regist(); int menu(); int refer(); int deposit(); int withdraw(); int transfer(); int resetPW(); int judgePW(long ps); int search(char *s,int psw); int searchAC(char *s); void OutFile(); void InFile(); void Sort(); void Print(); Info *pt, *head = NULL, *tail, *p0; main() { int choice = -1; OutFile(); while(1) { printf(" 欢迎使用银行存取款系统 \n"); printf("\n ================================ \n"); printf(" 1.登录 \n"); printf(" 2.注册 \n"); printf(" 3.退出 \n"); printf("\n ================================ \n"); printf("\t* 请输入您的选择:"); scanf("%d", &choice); switch(choice) { case 1: system("cls"); login(); break; case 2: system("cls"); regist(); break; case 3: Sort(); Print(); InFile(); exit(0); break; default: printf("输入有误,请重输...\n"); break; } } } /////////////////登录////////////////////////////////// void login() { int flag; char my_act[100]; long password; int X = -1; printf("\t\t=================****登录****=================\n\n"); printf("\t\t* 输入账户: "); scanf("%s", my_act); printf("\n"); printf("\t\t* 输入密码: "); scanf("%ld", &password); flag = search(my_act,password); if(flag == 1) { printf("\t\t登录成功,正在跳转页面...\n"); p0 = pt; Sleep(2000); system("cls"); while(1) { X = menu();//成功进入 if(X == 1) { system("cls"); menu(); } else return; } } else if(flag == 0) { printf("\t\t账号或密码错误,请重新输入...\n"); Sleep(2000); system("cls"); return; } } int search(char *s,int psw) { if(head == NULL) { return 0; } pt = head; while(1) { if(strcmp(pt->account, s)==0&&pt->pw==psw) { return 1; } if(pt->next == NULL) break; pt = pt->next; } return 0; } int searchAC(char *s) { if(head == NULL) { return 0; } pt = head; while(1) { if(strcmp(pt->account, s)==0) { return 1; } if(pt->next == NULL) break; pt = pt->next; } return 0; } ////////////////////////注册/////////////////////////// void regist() { printf("\t\t=================****注册****=================\n\n"); struct info *p1; p1 = (Info *)malloc(sizeof(Info)); p1->next = NULL; int flag; printf("\t\t请输入您的账户....\n"); printf("\t\t"); scanf("%s", p1->account); printf("\t\t请输入用户名......\n"); printf("\t\t"); scanf("%s", p1->user); printf("\t\t输入您的密码......\n"); printf("\t\t"); scanf("%ld", &p1->pw); flag = search(p1->account,p1->pw); if(flag == 1) { printf("\t\t账户已存在,请重新注册......\n"); Sleep(2000); system("cls"); return; } else if(flag == 0) { printf("\t\t注册成功\n"); //flagN = N; //标记当前注册账户是链表中的第几个 p1->dsit = 0; if(head == NULL) { head = p1; tail = p1; //n ++; Sleep(2000); system("cls"); return; } else { tail->next = p1; tail = p1; //n ++; Sleep(2000); system("cls"); return; } } } ////////////主页面///////////////////////////////////// int menu() { printf("\t\t=================****主页面****=================\n\n"); printf("\t\t====================****************=================\n\n"); printf("\t\t* 1. 查询 \n"); printf("\t\t* 2. 存钱 \n"); printf("\t\t* 3. 取钱 \n"); printf("\t\t* 4. 转账 \n"); printf("\t\t* 5. 修改密码 \n"); printf("\t\t* 6. 安全退出 \n"); printf("\t\t=====================================================\n\n"); int choice = -1; int Y = -1; printf("\t\t *"); printf("我的选择:"); scanf("%d", &choice); while(1) { switch(choice) { case 1: system("cls"); Y = refer(); break; case 2: system("cls"); Y = deposit(); break; case 3: system("cls"); Y = withdraw(); break; case 4: system("cls"); Y = transfer(); break; case 5: system("cls"); Y = resetPW(); break; case 6: system("cls"); return 0; default: printf("输入有误,请重输...\n"); return 1; } switch(Y) { case 0: printf("出现错误!\n"); return 0; break; case 1: /*正常情况menu返回1重新进入menu*/ return 1; break; case 2: Y = deposit(); break; case 3: Y = withdraw(); break; case 4: Y = transfer(); break; case 5: Y = resetPW(); break; } } } //////////////////////查询///////////////////////////// int refer() { printf("\t\t=================****查询****=================\n\n"); printf("\t\t* 您的账户余额为:\n"); printf("\t\t* %ld\n", p0->dsit); Sleep(3000); system("cls"); return 1; } //////////////////////////取款////////////////////////// int deposit() { long rMoney; printf("\t\t=================****存款****=================\n\n"); printf("\t\t* 输入您要存入的钱数(整百):\n\n"); printf("\t\t* "); scanf("%ld", &rMoney); if(rMoney%100 != 0) { printf("\t\t* 出现错误,请重试...\n\n"); return 2; } p0->dsit += rMoney; printf("\t\t* 存钱成功...\n\n"); Sleep(2000); system("cls"); return 1; } //////////////////////////取款///////////////////////// int withdraw() { long omoney; printf("\t\t=================****取款****=================\n\n"); printf("\t\t* 输入您要取出的钱数...\n\n"); printf("\t\t* "); scanf("%ld", &omoney); if(omoney%100 != 0) { printf("\t\t* 出现错误...\n\n"); Sleep(2000); system("cls"); return 3; } if(omoney > p0->dsit) { printf("\t\t* 余额不足...\n\n"); system("cls"); return 1; } p0->dsit -= omoney; printf("\t\t* 取钱成功...\n\n"); Sleep(2000); system("cls"); return 1; } ////////////////转账//////////////////////////////// int transfer() { struct info *pFlag; char ob[20]; long money; int flag; printf("\t\t=================****转账****=================\n\n"); printf("\t\t* 请输入您要转账的账户...\n"); printf("\t\t* "); scanf("%s", ob); flag = searchAC(ob); pFlag = pt; if(flag == 1) { printf("\t\t* 输入要转出的钱数(整百):\n"); printf("\t\t* "); scanf("%ld", &money); if(money%100 != 0) { printf("\t\t *"); printf("\t\t出现错误,请重试...\n"); Sleep(2000); system("cls"); return 1; } if(money > p0->dsit) { printf("\t\t* 余额不足.....\n"); return 1; } p0->dsit -= money; pFlag->dsit += money; Sleep(2000); printf("\t\t* 转账成功..."); Sleep(2000); system("cls"); return 1; } else if(flag == 0) { printf("\t\t* 对不起,您输入的账户不存在...\n"); printf("*****************请稍等*********************"); Sleep(2000); system("cls"); return 1; } } ///////////////////////修改密码//////////////////////////////////////////// int resetPW() { long password1, password2; long newpassword; printf("\t\t=================****修改密码****=================\n\n"); printf("\t\t* 请输入原始密码...\n\n"); printf("\t\t* "); scanf("%ld", &password1); printf("\t\t* 请再次输入...\n\n"); printf("\t\t* "); scanf("%ld", &password2); if(p0->pw == password1 && p0->pw == password2) { printf("\t\t* 输入新密码...\n\n"); printf("\t\t* "); scanf("%ld", &newpassword); if(judgePW(newpassword) == 1) { p0->pw = newpassword; printf("\t\t* 密码重置成功...\n\n"); Sleep(2000); system("cls"); return 1; } else { printf("\t\t* 输入的密码不符合规则,请重试...\n"); Sleep(2000); system("cls"); return 5; } } else { printf("\t\t* 密码错误...\n"); Sleep(2000); system("cls"); return 1; } return 1; } //////////////////////////密码判断//////////////////////////////////////// int judgePW(long ps) { int n, k; for(k=0; k<6; k++) { n = ps%10; ps = ps/10; if(n < 0 || n > 9) { return 2; } } return 1; } ///////////////////////文件读取//////////////////////////////////////////// void OutFile(){ FILE *fp; Info *p; fp = fopen("record.txt","rb+"); if(!fp) { printf("ERROR!"); return; } while(1){ p = (Info *)malloc(sizeof(Info)); fread(p,sizeof(Info),1,fp); if(p->next==NULL){ tail->next=p; tail=p; break; } else{ if(head == NULL){ p->next = NULL; head = tail = p; } else { p->next=NULL; tail->next=p; tail=p; } } } fclose(fp); } //////////////////////文件读入//////////////////////////////////////////// void InFile(){ FILE *ft; Info *p; p = head; while(p->next != NULL){ ft = fopen("record.txt","wb+"); fwrite(p, sizeof(Info), 1, ft); p = p->next; } fwrite(p, sizeof(Info), 1, ft); fclose(ft); } //////////////////////排序///////////////////////////////////////////// void Sort(){ Info *p, *pt, *p1, *p2, *p0, *px; /*链表冒泡法排序*/ while(1) { p0 = head->next; /*包含头结点的比较为特殊情况,先进行比较*/ if(head->pw > p0->pw) { head->next = p0->next; p0->next= head; head = p0; }//此时p0等于head //print(head); pt = head; while(1) {//p0为前置节点,p1,p2为要比较的节点 p0 = pt; p1 = p0->next; p2 = p1->next; if(p1->pw > p2->pw) { p1->next = p2->next; p0->next = p2; p2->next = p1; if(p1->next==NULL || p1==px) { px = p2; break; } } else { if(p2->next==NULL || p2==px) { px = p1; break; } } pt = pt->next; } /*px的作用:每进行一次循环比较,就将一个最大的数 推到最后,而px就记录这个最大数的前面一个数,排序完后 px == head->next*/ if(px == head->next) break; } } ///////////////////////账号查询//////////////////////////////////////// void Print(){ Info *p; p=head; while(1){ printf("%ld ", p->pw); if(p->next == NULL) break; p=p->next; } }
相关文章推荐
- <1>c语言实现ATM存取款系统(数组)
- <3>c语言实现ATM存取款系统(数组实现)
- <4>c语言实现ATM存取款系统(链表)
- <C语言>使用一个二维数组实现学生姓名管理系统,要求不能使用链表
- C语言实现读取FAT12文件系统
- < < PXE实现Linux系统无人值守批量安装 > >
- Linux环境下C语言实现简单的基于文件的学生信息管理系统
- c语言实现的排序系统
- <QT实现音乐播放器1> QMediaPlayer音乐文件导入
- <Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码
- <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现
- js利用appendChild对<li>标签进行排序的实现方法
- <2012 12 06> FL2440开发板的U-boot-2010.09版本移植(十一)U-boot引导内核设置、编译linux内核、编译文件系统、加载...
- C语言 实现ATM系统
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)
- C语言构建WEB管理系统(五):CGI实现上传文件
- [置顶] <无线自主点餐系统>html普通导航栏实现,仿宾之郎,不做商业用途
- 自定义监听器类来加载web.xml中的<context-param>系统属性</context-param> 和xxx.properties文件属性
- <详解>C语言实现程序跳转到绝对地址0x100000处执行