#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100000
char NewAccount[10];
char SelAccuont[10];
int static static_countnum=-1;
int static static_flag=0;
char Newcustomerid[30];
char NewName[20];
char NewAddress[30];
struct account
{
char accountid[10];
char customerid[30];
char name[20];
char address[30];
float balance;
}Bank_Account[SIZE];
/*accountsize()是用来确定文件中函数含有记录的条数*/
int accountsize()
{
FILE *fp;
long EndPos;
if ((fp=fopen("bank_account","rb"))==NULL)
return 0;
fseek(fp,0,2); /*将文件指针从文件头移动文件尾*/
EndPos=ftell(fp); /*检测文件当前指针位置,求得文件长度*/
rewind(fp); /*将文件指针移动文件的开头*/
return EndPos/sizeof(struct account);/*文件的总长度/结构体的大小,得到文件中记录的条数*/
}
/*save() 保存结构体记录,以追加的方式写入二进制文件*/
int save(struct account BankAccount[],int bankaccount)
{
FILE *fp;
if ((fp=fopen("bank_account","ab"))==NULL)
return 0;
if (fwrite(&Bank_Account[bankaccount],sizeof(struct account),1,fp)!=1)/*每次向文件写入一个结构体类型的信息*/
{
return 0;
}
fclose(fp);
return 1;
}
/*SetAccountID() 随机产生一个9位数长度的accountid,数组的最后一位用来保存空字符,
存放空字符的原因:因为结构体在申请空间的时候 成员变量的地址是连续的,当accountid[10]存放了10个字符后
由于与customerid[30] 没有空字符的存在,在用printf打印Bank_Account[i].accountid时,会连customerid也打印出来,
所以要在两者中间加一个空字符来控制
*/
void SetAccountID()
{
int randnum;
int i;
FILE *fp;
fp=fopen("bank_account","rb");
temp:
srand((unsigned)time(NULL));
for (i=0;i<9;i++)
{
randnum=rand()%10;/*随机产生0-9之间的整数*/
NewAccount[i]=randnum+48;//将产生的整数的ASCII加48转为相应的字符,存入数组里面 NewAccount 是一个全局变量
}
for (i=0;i<accountsize();i++)//判断产生的AccountID 是否存在,如果在文件中存在的话,则重新产生一个AccountID
{
fread(&Bank_Account[i],sizeof(struct account),1,fp);
if (!strcmp(Bank_Account[i].accountid,NewAccount))//比较两个数组是否相等用 strcmp 相等返回0
goto temp;
}
NewAccount[9]='\0';//最后一个字符赋 空字符
}
void printHead()
{
printf(" -------------------------------------------------------------------------\n");
printf(" | |\n");
printf(" | 欢迎使用银行帐户管理系统 |\n");
printf(" | |\n");
printf(" | 吴丹萍 |\n");
printf(" | |\n");
printf(" -------------------------------------------------------------------------\n");
}
char menu()
{
char ch;
temp:
printf(" ----------------------\n");
printf(" | 功能菜单-->> |\n");
printf(" | 1、开户 |\n");
printf(" | 2、查询 |\n");
printf(" | 3、删除用户 |\n");
printf(" | 4、用户列表 |\n");
printf(" | 5、退出系统 |\n");
printf(" ----------------------\n");
printf(" 请选择--> ");
/*static_flag的初始值为0,主要是用来控制getchar(),getchar的主要作用是用来
吸收回车符,如果在scanf("%c",&ch);之前有回车动作的话,那么scanf("%c",&ch)
将得到回车符,而不是我们输入的符号;第一次使用该功能菜单时,没有回车动作,故
不吸收回车符。SubMenu()、SubsubMenu() 是同样的道理
*/
if (static_flag==1)
{
getchar();
}
scanf("%c",&ch);
static_flag=1;//第一次使用了该功能菜单后,后面再使用该功能菜单时都有回车的动作
if (ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5')
{
return ch;
}
else
{
printf(" 选择功能菜单不合法,请重新选择!\n");
goto temp;
}
}
char SubMenu()
{
char ch;
temp:
printf(" ----------------------\n");
printf(" | 功能菜单-->> |\n");
printf(" | 1、取款 |\n");
printf(" | 2、存款 |\n");
printf(" | 3、修改资料 |\n");
printf(" | 4、返回 |\n");
printf(" | 5、退出系统 |\n");
printf(" ----------------------\n");
printf(" 请选择--> ");
if (static_flag==1)
{
getchar();
}
ch=getchar();
if (ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5')
{
return ch;
}
else
{
printf(" 选择功能菜单不合法,请重新选择!\n");
goto temp;
}
}
char SubsubMenu()
{
char ch;
temp:
printf(" ----------------------\n");
printf(" | 功能菜单-->> |\n");
printf(" | 1、身份证 |\n");
printf(" | 2、姓名 |\n");
printf(" | 3、地址 |\n");
printf(" | 4、保存更新 |\n");
printf(" | 5、返回 |\n");
printf(" | 6、退出系统 |\n");
printf(" ----------------------\n");
printf(" 请选择--> ");
if (static_flag==1)
{
getchar();
}
ch=getchar();
if (ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='6')
{
return ch;
}
else
{
printf(" 选择功能菜单不合法,请重新选择!\n");
goto temp;
}
}
/*读取文件中的内容*/
void ReadAllAccount()
{
FILE *fp;
int i;
fp=fopen("bank_account","rb");
printf("----------------------------------用户列表------------------------------------\n");
printf("| 账号 身份证 用户名 地址 余额 |\n");
for (i=0;i<accountsize();i++)
{
fread(&Bank_Account[i],sizeof(struct account),1,fp);
printf("| %-15s%-24s%-13s%-11s%-0.2f RMB |\n",Bank_Account[i].accountid,Bank_Account[i].customerid,Bank_Account[i].name,Bank_Account[i].address,Bank_Account[i].balance);
}
/*%-15s 是输出的格式控制 - 表示左对齐 15 表示占符位,具体的书上有的。。。*/
printf("------------------------------------------------------------------------------\n");
}
/*开户函数*/
void OpenAccount()
{
long num;
num = accountsize();
SetAccountID();//调用该函数后 会产生9位数的AccountID 存放在全局变量NewAccount中
strcpy(Bank_Account[num].accountid,NewAccount);
printf(" 请输入你的身份证号: ");
scanf("%s",Bank_Account[num].customerid);
printf(" 请输入你的姓名: ");
scanf("%s",Bank_Account[num].name);
printf(" 请输入你的地址: ");
scanf("%s",Bank_Account[num].address);
if (!save(Bank_Account,num))
{
printf("创建帐户失败!");
return;
}
static_countnum=num;
printf("\n恭喜你,开户成功! 以下是你的帐户信息......\n");
printf(" 账号: %s\n",NewAccount);
printf("身份证: %s\n",Bank_Account[num].customerid);
printf(" 姓名: %s\n",Bank_Account[num].name);
printf(" 地址: %s\n",Bank_Account[num].address);
}
void SelectAccount()
{
FILE *fp;
int i;
fp=fopen("bank_account","rb");
temp:
printf(" 请输入你的账号: ");
scanf("%s",SelAccuont);
for (i=0;i<accountsize();i++)
{
fread(&Bank_Account[i],sizeof(struct account),1,fp);
if (!strcmp(Bank_Account[i].accountid,SelAccuont))
{
static_countnum=i;
printf(" 下面是你的个人信息: \n");
printf(" 账号: %s\n",Bank_Account[i].accountid);
printf(" 身份证: %s\n",Bank_Account[i].customerid);
printf(" 姓名: %s\n",Bank_Account[i].name);
printf(" 地址: %s\n",Bank_Account[i].address);
printf(" 余额: %0.2f RMB\n",Bank_Account[i].balance);
break;
}
}
if (i==accountsize())
{
printf(" 用户不存在!\n");
goto temp;
}
}
void Exit()
{
printf(" 谢谢使用本系统!\n");
exit(0);
}
void Out_Money()
{
float outmoney;
char ch;
FILE *fp;
int i;
int n =accountsize();
fp=fopen("bank_account","rb");
temp1:
printf(" 请输入金额: (当前余额%0.2f RMB) ",Bank_Account[static_countnum].balance);
getchar();
scanf("%f",&outmoney);
getchar();
printf(" 确定要取出%0.2f RMB(Y/N) ",outmoney);
temp:
ch=getchar();
if (ch=='y'||ch=='Y')
{
if (Bank_Account[static_countnum].balance-outmoney<0)
{
printf(" 当前余额小于 %0.2f 请重新输入\n",outmoney);
goto temp1;
}
else
{
for (i=0;i<accountsize();i++)
{
没有合适的资源?快使用搜索试试~ 我知道了~
C语言课程设计
共15个文件
pdb:2个
bank_account:2个
c:1个
5星 · 超过95%的资源 需积分: 3 22 下载量 161 浏览量
2008-07-23
08:14:47
上传
评论
收藏 219KB RAR 举报
温馨提示
本人自己课程设计的作品,分享下。。。。
资源推荐
资源详情
资源评论
收起资源包目录
BankAccountSystem.rar (15个子文件)
BankAccountSystem
bank_account 288B
BankAccountSystem.dsp 3KB
BankAccountSystem.plg 1KB
BankAccountSystem.c 12KB
BankAccountSystem.opt 53KB
Debug
BankAccountSystem.exe 224KB
BankAccountSystem.pch 202KB
bank_account 288B
vc60.pdb 52KB
vc60.idb 33KB
BankAccountSystem.pdb 433KB
BankAccountSystem.ilk 242KB
BankAccountSystem.obj 41KB
BankAccountSystem.ncb 41KB
BankAccountSystem.dsw 559B
共 15 条
- 1
资源评论
- liu8z2012-12-29初学者,觉得很好
笨笨周0915
- 粉丝: 54
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功