#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define N_MAXREC_NO 100
#define FILE_DATA_PATH "c:"
#define MAXLINE 256
struct record
{
int accNumber;
char accName[9];
char accPWD[7];
double balance;
char flag[2];
};
typedef struct record RECORD;
RECORD rs[N_MAXREC_NO];
int maxAccount;
void welcome();
void mainmenu();
void openAnAccount();
void closeAnAcount();
void deposit();
void withdraw();
void query();
int findAnAccount(int accNumber);
void dispAnAccount(int i);
int createAccNumber();
int readData();
int writeData();
int checkInput(int flag, char *checkStr);
char *rightTrim(char *str);
void queryall();
void getaccName(char accName[]);
void getaccPWD(char accPWD[]);
double getcash();
int getaccNumber(int flag);
void main()
{
char username[9];
char userPWD[7];
int i;
welcome();
for (i=0;i<3;i++)
{
printf("/n");
printf("请输入您的用户名(please input your username):");
scanf("%s",&username);
fflush(stdin);
printf("请输入您的密码(please input yout password):");
scanf("%s",&userPWD);
fflush(stdin);
if((strcmp(username,"admin")==0)&&(strcmp(userPWD,"hheng"==0)))
{
/*用户名和密码正确,显示主菜单*/
mainmenu();
}
else
{
if(i<2)
{
/*用户名和密码错误,请重新输入!*/
printf("用户名和密码错误,请重新输入!(error!)");
}
else
{
/*连续输入3次错误用户名或密码,退出系统!*/
printf("用户名和密码错误,退出系统!(exit)!");
}
}
}
}
void welcome()
{
printf("+------------------------------------+/n");
printf("| |/n");
printf("| (欢迎光临汇款系统) |/n");
printf("| |/n");
printf("+------------------------------------+/n");
}
void mainmenu()
{
int choice;
choice = -1;
/*maxAccount = readData();*/
do
{
printf("/n");
printf("+-------------------------------------------------+/n");
printf("| 存款(deposit) 1 开户(openAnAccount) 4 |/n");
printf("| 取款(withdraw) 2 销户(closeAnAccount) 5 |/n");
printf("| 查询(queray) 3 退出(exit) 0 |/n");
printf("+--------------------------------------------------+/n");
printf("input yuur choice");
scanf("%d", &choice);
fflush(stdin);
switch(choice)
{
case 0:
exit(0);
case 1:
deposit();
break;
case 2:
withdraw();
break;
case 3:
query();
break;
case 4:
openAnAccount();
break;
case 5:
closeAnAcount();
break;
case 6:
queryall();
break;
default:
printf("/n no choice!");
break;
}
}while(choice != 0);
}
void openAnAccount()
{
int accNumber;
char accName[9];
char accPWD[7];
double cash;
accNumber = 0;
memset(accName, 0, sizeof(accName));
memset(accPWD, 0, sizeof(accPWD));
cash = 0;
if (maxAccount >= (N_MAXREC_NO - 1))
{
printf("max/n");
return ;
}
accNumber = createAccNumber();
getaccName(accName);
getaccPWD(accPWD);
cash = getcash(0);
maxAccount++;
rs[maxAccount].accNumber = accNumber;
strcpy(rs[maxAccount].accName,accName);
strcpy(rs[maxAccount].accPWD,accPWD);
rs[maxAccount].balance = cash;
strcpy(rs[maxAccount].flag,"0");
if(writeData())
{
printf("error");
return;
}
dispAnAccount(maxAccount);
printf("sucess");
getch();
return;
}
void closeAnAcount()
{
int accNumber;
char accPWD[7];
char userAnswer;
int accountPosition;
accountPosition = -1;
accNumber = 0;
memset(accPWD,0,sizeof(accPWD));
accNumber = getaccNumber(2);
getaccPWD(accPWD);
accountPosition = findAnAccount(accNumber);
if (accountPosition == -1)
{
printf("no found ");
getch();
return;
}
dispAnAccount(accountPosition);
if (strcmp(rs[accountPosition].accPWD ,accPWD) != 0)
{
printf("/neeror");
getch();
return;
}
if (strcmp(rs[accountPosition].flag, "0") != 0)
{
printf("no again close ");
getch();
return;
}
printf("confirm %d] [1:close|other:no close] ", rs[accountPosition].accNumber);
scanf("%c", &userAnswer);
fflush(stdin);
if (userAnswer == '1')
{
strcpy(rs[accountPosition].flag, "1");
rs[accountPosition].balance = 0;
if(writeData())
{
printf("error");
return;
}
dispAnAccount(accountPosition);
printf("sucess");
getch();
return;
}
printf("cancel");
getch();
return;
}
void deposit()
{
int accNumber;
int accountPosition;
double cash;
accNumber = 0;
accountPosition = -1;
cash = 0;
accNumber = getaccNumber(0);
accountPosition = findAnAccount(accNumber);
if (accountPosition== -1)
{
printf("not found ");
getch();
return;
}
dispAnAccount(accountPosition);
if (strcmp(rs[accountPosition].flag,"0") != 0)
{
printf("error");
getch();
return;
}
cash = getcash(0);
rs[accountPosition].balance = rs[accountPosition].balance + cash;
if(writeData())
{
printf("error");
return;
}
dispAnAccount(accountPosition);
printf("sucess");
getch();
}
void withdraw()
{
int accNumber;
char accPWD[7];
double cash;
int accountPosition;
accNumber = 0;
memset(accPWD, 0, sizeof(accPWD));
accountPosition = -1;
cash = 0;
accNumber = getaccNumber(1);
getaccPWD(accPWD);
accountPosition = findAnAccount(accNumber);
if (accountPosition== -1)
{
printf("no found ");
getch();
return;
}
dispAnAccount(accountPosition);
if (strcmp(rs[accountPosition].accPWD ,accPWD) != 0)
{
printf("/nerror");
getch();
return;
}
if (strcmp(rs[accountPosition].flag,"0") != 0)
{
printf("error");
getch();
return;
}
cash = getcash(1);
if (cash > rs[accountPosition].balance)
{
printf("error");
getch();
return;
}
rs[accountPosition].balance = rs[accountPosition].balance - cash;
if(writeData())
{
printf("error");
return;
}
dispAnAccount(accountPosition);
printf("success");
getch();
}
void query()
{
int accNumber;
char accPWD[7];
int accountPosition;
accountPosition = -1;
accNumber = 0;
memset(accPWD,0,sizeof(accPWD));
accNumber = getaccNumber(3);
getaccPWD(accPWD);
accountPosition = findAnAccount(accNumber);
if (accountPosition== -1)
{
printf("not found");
getch();
}
if (strcmp(rs[accountPosition].accPWD, accPWD) != 0)
{
printf("/nerror");
getch();
return;
}
if (strcmp(rs[accountPosition].flag, "0") != 0)
{
printf("/nerror");
getch();
return;
}
dispAnAccount(accountPosition);
printf("/n sucess");
getch();
return;
}
int createAccNumber()
{
if(maxAccount == -1)
{
return 10001;
}
else
{
return rs[maxAccount].accNumber + 1;
}
}
void queryall()
{
int i;
for(i = 0; i <= maxAccount; i++)
{
dispAnAccount(i);
}
printf("/npress any key");
getch();
}
int findAnAccount(int accNumber)
{
int accountPosition;
int i;
accountPosition = -1;
for(i = 0; i <= maxAccount; i++)
{
if(rs[i].accNumber == accNumber)
{
accountPosition = i;
break;
}
}
return accountPosition;
}
void dispAnAccount(int i)
{
printf("+-------------------------------------------------+/n");
printf("| %-5s | %-8s | %-6s | %-12s| %4s |/n","acoount","user","password","balance","flag");
printf("+--------+----------+--------+-------------+------+/n");
printf("| %5d | %-8s | %-6s | %12.2f| %4s |/n",rs[i].accNumber,rs[i].accName,rs[i].accPWD,rs[i].balance,atoi(rs[i].flag)?"cancel":"normal" );
printf("+-------------------------------------------------+/n");
}
int readData()
{
int length,i,j,k;
char cLineStr[255],cData[80],cTmp[2];
FILE* fp;
char SrcFile[60];
j = 0;
i = 0;
memset(cData, 0, sizeof(cData));
memset(cLineStr, 0, sizeof(cLineStr));
memset(&rs, 0, sizeof(RECORD));
strcpy(SrcFile, FILE_DATA_PATH);
strcat(SrcFile, "//Bank");
fp = fopen(SrcFile, "r");
if (fp == NULL)
{
return -1;
}
while((!feof(fp)) && ((fgets(cLineStr, MAXLINE, fp)) != NULL))
{
length=strlen(cLineStr);
for(k=0; k<length; k++)
{
memset(cTmp, 0, sizeof(cTmp));
memcpy(cTmp, &cLineStr[k], 1);
if(cTmp[0] != ',')
{
strcat(cData,cTmp);
}
else
{
if(j==0)
{
rs[i].accNumber = atoi(cData);
}
if(j==1)
{
rightTrim(cData);
strcpy(rs[i].accName,cData);
}
if(j==2)
{
rightTrim(cData);
strcpy(rs[i].accPWD,cData);
}
if(j==3)
{
rs[i].balance = atof(cData);
}
if(j==4)
{
rightTrim(cData);
strcpy(rs[i].flag,cData);
}
memset(cData, 0, sizeof(cData));
j++;
if(j==5)
{
break;
}
}
}
j = 0;
i++;
}
fclose(fp);
i--;
return i;
}
int writeData()
{
FILE* fp;
char SrcFile[60];
int i;
strcpy( SrcFile, FILE_DATA_PATH);
strcat( SrcFile, "//Bank");
fp = fopen( SrcFile, "w");
if ( fp == NULL )
{
return 1;
}
for(i=0; i <= maxAccount; i++)
{
fprintf(fp,"%-5d,%-8s,%-6s,%12.2f,%-1s,/n",
rs[i].accNumber,rs[i].accName,rs[i].accPWD,rs[i].balance,rs[i].flag);
}
fclose(fp);
return 0;
}
int checkInput(int flag, char *checkStr)
{
switch(flag)
{
case 0:
{
if(strlen(checkStr) > 8)
{
return 1;
}
break;
}
case 1:
{
if(strlen(checkStr) > 6)
{
return 1;
}
break;
}
case 2:
{
if(strlen(checkStr) > 12)
{
return 1;
}
break;
}
default:
return 0;
}
return 0;
}
char *rightTrim(char *str)
{
char *s = str;
while (*s)
{
++s;
}
--s;
while (s >= str)
{
if ((*s==' ') || (*s=='/t') || (*s=='/r') || (*s=='/n'))
{
--s;
}
else
{
break;
}
}
* (s + 1) = 0;
return str;
}
void getaccName(char accName[])
{
char caccName[100];
int i = 1;
while(i)
{
memset(caccName, 0, sizeof(caccName));
printf("/n");
printf("name:");
scanf("%s", caccName);
fflush(stdin);
if(checkInput(0, caccName))
{
printf("error/n");
continue;
}
i = 0;
}
memcpy(accName, caccName, 9);
}
void getaccPWD(char accPWD[])
{
char caccPWD[100];
int i = 1;
while(i)
{
memset(caccPWD, 0, sizeof(caccPWD));
printf("/n");
printf("password");
scanf("%s", caccPWD);
fflush(stdin);
if(checkInput(1, caccPWD))
{
printf("error/n");
continue;
}
i = 0;
}
memcpy(accPWD, caccPWD, 7);
}
double getcash(int flag)
{
char ccash[100];
double dcash;
int i = 1;
while(i)
{
memset(ccash, 0, sizeof(ccash));
dcash = 0;
printf("/n");
switch(flag)
{
case 0: printf("jine"); break;
case 1: printf("jine"); break;
}
scanf("%lf",&dcash);
fflush(stdin);
sprintf(ccash,"%12.2f",dcash);
if(checkInput(2, ccash))
{
printf("error/n");
continue;
}
i = 0;
}
return dcash;
}
int getaccNumber(int flag)
{
int iaccNumber;
iaccNumber = 0;
printf("/n");
switch(flag)
{
case 0: printf("acount"); break;
case 1: printf("acount"); break;
case 2: printf("acount"); break;
case 3: printf("acount"); break;
}
scanf("%d",&iaccNumber);
fflush(stdin);
return iaccNumber;
}