#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define upNum 50
struct record
{
int account; //账号
int password; //密码
double balance; //账户余额
char name[10]; //姓名
};
struct record users[upNum]; //银行所有用户
int N; //实际的用户数目
void openAccount(); //开户
void pass(); //用户登录
void readData(); //开始前从文件中读数据,存在数组中
void writeData(); //程序结束前,将数组中的数据写入到文件中
void save(); //存款
void Menu(); //用户菜单
void withdraw(); //取款
void transferAccount(); //转账
void showAccount(); //查询用户信息
void showBalance(); //查询余额
int inputPassword(); //返回键盘输入的密码
int search(int); //根据账号找到用户数据对应的下标
int welcomeMenu();//登录界面
int ichooseInMenu();//用户菜单
void welcome();//欢迎界面功能
/主函数/
int main()
{
system("title 银行管理系统");
readData();
welcome();
writeData();
return 0;
}
/欢迎界面/
void welcome()
{
int Choice;/用户选择功能/
do
{
Choice = welcomeMenu();
switch (Choice)
{
case 1:openAccount;/开户/
case 2:
pass();/*用户登录*/
case 3:
break;
case 0:
printf("欢迎您再来. \n");
}
} while (Choice);
}
/开户/
void openAccount()
{
int i;
if (i == upNum)
printf("开户账户已达上限");
}
/登录界面/
int welcomeMenu()
{
int i;
while (1)
{
printf("+------------------------------+\n");
printf("+ +\n");
printf("+ 欢迎使用银行管理系统 +\n");
printf("+ +\n");
printf("+ 1 开户 2 登录 +\n");
printf("+ 3 退出系统 +\n");
printf("+ +\n");
printf("+------------------------------+\n");
printf("请选择: ");
fflush(stdin); //清空输入缓冲区
scanf("%d", &i);
if (i >= 0 && i <= 3)
break;
else
printf("输入有误,请重新选择\n\n");
}
return i;
/*用户界面菜单*/
/*用户菜单*/
int ichooseInMenu();
{
int i;
while (1)
{
printf("\n");
printf("+--------------+\n");
printf("| 1 查询余额 |\n");
printf("| 2 记录查询 |\n");
printf("| 3 存钱 |\n");
printf("| 4 取钱 |\n");
printf("| 5 转账 |\n");
printf("| 0 退出 |\n");
printf("+--------------+\n");
printf("请输入您的选择: ");
scanf("%d", &i);
if (i >= 0 && i <= 5)
break;
else
printf("输入有误,请重新选择\n\n");
}
return i;
}
}/读取文件数据/
void readData()
{
FILE* fp; //用于文件操作
int i = 0;
//从文件中取出余额
if ((fp = fopen("C:\Users\86152\Desktop\银行账户数据.txt", "a+")) == NULL)
{
printf("data file cannot open!");
exit(0);
}
while (fscanf(fp, "%d %s %d %lf %d", &users[i].account, users[i].name, &users[i].password, &users[i].balance) != EOF)
{
i++;
}
N = i; //用全局变量存储用户的总人数
fclose(fp);
return;
}
/用户登录/
void pass()
{
int id; //用于输入的账号
int who; //查找到该账号在数组中对应的下标
int sPass; //业务员登录时输入的密码
int right = 0; //要返回的结果:0-不正确 1-正确
printf("请输入账号:");
scanf("%d", &id);
who = search(id); //根据账号查询用户,返回用户的下标
if (who < 0) //说明id账户不存在
{
printf("该用户不存在,登录失败!\n");
}
else
{
printf("请输入密码:");
sPass = inputPassword();
if (sPass == users[who].password)
{
right = 1;
}
else
{
printf("对不起,密码错误\n");
}
if (right == 1)
Menu();
else
return;
}
}
/查询用户/
int search(int id)
{
int index = -1;
int low = 0, high = N - 1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (users[mid].account == id)
{
index = mid;
break; //找到该用户,立即退出循环
}
else if (users[mid].account > id)
high = mid - 1;
else
low = mid + 1;
}
return index; //若找到,其值在0~N-1间,否则,保持-1
}
/存款/
void save()
{
int id, who;
double money;
printf("输入要存款的账号:");
scanf("%d", &id);
who = search(id); //根据账号查询用户,返回用户的下标
if (who < 0) //说明id账户不存在
{
printf("该用户不存在,存款失败!\n");
}
else
{
printf("用户姓名:%s\n", users[who].name);
printf("输入存款额:");
scanf("%lf", &money);
users[who].balance += money;
printf("存款后,您有%.2f元. \n", users[who].balance);
}
return;
}
/取款/
void withdraw()
{
int id, who;
int iPass;
double money;
printf("输入要取款的账号:");
scanf("%d", &id);
who = search(id); //根据账号查询用户,返回用户的下标
if (who < 0) //说明id账户不存在
{
printf("该用户不存在,取款失败!\n");
}
else
{
printf("用户姓名:%s\n", users[who].name);
printf("密码:");
iPass = inputPassword();
{
printf("输入取款额:");
scanf("%lf", &money);
if (money > users[who].balance) //余额透支
{
printf("余额不足,取款失败!\n");
}
else
{
users[who].balance -= money;
printf("取款后,还有%.2f元. \n", users[who].balance);
}
}
}
return;
}
void showBalance()
{
int id, who;
printf("账号:");
scanf("%d", &id);
who = search(id); //根据账号查询用户,返回用户的下标
if (who < 0) //说明id账户不存在
{
printf("该用户不存在!\n");
}
else
{
printf("用户姓名:%s\n", users[who].name);
{
printf("余额:%.2f元. \n", users[who].balance);
}
}
return;
}
/查询账户/
void showAccount()
{
int id, who;
printf("账号:");
scanf("%d", &id);
who = search(id); //根据账号查询用户,返回用户的下标
if (who < 0) //说明id账户不存在
{
printf("该用户不存在!\n");
}
else
{
printf("户主姓名:%s\n", users[who].name);
{
printf("余额:%.2f元. \n", users[who].balance);
printf("状态:");
}
}
return;
}
/转账/
void transferAccount()
{
int id;
printf("请输入要被转账的id:");
scanf("%d", &id);
}
/显示所有账户/
void showAll()
{
int i;
printf("账号 用户名 密码\n");
for (i = 0; i <= N; i++)
{
printf("%d %s %d", users[i].account, users[i].name, users[i].password);
}
}
/规范密码并将输入密码变成星号/
int inputPassword()
{
char ch; //接收字符形式密码
int iPass = 0; //要转换为数字
int i;
while (1)
{
for (i = 0; i < 6; i++)
{
ch = getch(); //输入但不显示
putchar('*'); //输出*
if (ch)
iPass = iPass * 10 + (ch - '0');
else
{
iPass = 0;
break; //退出for循环后,再次接受
}
}
fflush(stdin); //清除键盘缓存区中已经有的输入
printf("\n");
if (iPass == 0) //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环
{
printf("密码要求全为数字,且不全为0!\n");
printf("请重新输入密码: ");
}
else
break;
}
return iPass;
}
void writeData()
{
FILE* fp; //用于文件操作
int i = 0;
//保存余额
if ((fp = fopen("C:\Users\86152\Desktop\银行账户数据.txt", "w")) == NULL)
{
printf("data file cannot open!");
exit(0);
}
for (i = 0; i < N; i++)
fprintf(fp, "%d %s %d %f %d\n", users[i].account, users[i].name, users[i].password, users[i].balance);
fclose(fp);
}
还有就是怎么使用快排实现对金额字段排序、展示排序结果、
怎么实现为其他用户转账业务