您的位置:首页 > 编程语言 > C语言/C++

<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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐