银行活期储蓄帐目管理系统
一、需求分析:
设计一个银行活期储蓄帐目管理系统(每个
有下列数据项:账户号码、用户名、身
份证号、地址等)。
(1) 能比较迅速地找到储户的帐户,以实现存款、取款记账。 (2) 能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。 (3) 符合课题要求,实现相应功能;
(4) 要求界面友好美观,操作方便易行;
(5) 注意程序的实用性、安全性。
所使用的函数:
函数: 功能如下: void mainmenu(); 输出主菜单 void add(); 添加用户资料 void select_name(); 按姓名查询余额 void select_id(); 按账号查询余额
void display(); 显示用户资料 void save_money(); 用户存款 void get_money(); 用户取款 void delete(); 销户
二、概要设计:
1、所使用的存储结构是:
struct user
{
int id;
char name[20];
char person_num[19];
double money;
}
2、其
图如下:
开始
执行main()函数
ch=getchar()
switch(ch)
选择操作编号
1 2 3 4 5 6 7 8
add(select_select_Dispsave_get_mdelete(exit(
) name() id() lay() moneyoney() ) 0)
()
三、详细设计:
1. void add() //添加用户资料
{
printf("%30s\n","***添加用户***");
printf("---------------------------------------------\n\n");
struct user getuser();
int count(); //函数目的:计算文件中的记录数目 以生成自动账号
FILE *fp;
int number;
struct user temp;
if((fp=fopen(file,"ab"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
temp=getuser(); //读取用户名
number=count();
temp.id=number+1; //生成自动账号
fwrite(&temp,sizeof(struct user),1,fp);
printf("添加用户成功!\n");
fclose(fp);
}
2. int count() //函数目的:计算文件中的记录总数 {
FILE *fp;
int num;
struct user temp;
num=0;
if((fp=fopen(file,"rb"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
while(fread(&temp,sizeof(struct user),1,fp))
{
num++;
}
fclose(fp);
return num;
}
取用户姓名(字符数<20) 3. void getname(char *name) //读{
do{
scanf("%s",name);
fflush(stdin);
if(strlen(name)==0)
printf("姓名不能为空!\n");
else
if(strlen(name)>=20)
printf("姓名不能超过20个字符!\n");
else
break;
printf("请重新输入姓名: ");
}while(1); //循环以保证读入数据有效
}
void getperson_num(char *person_num) //函数功能:读取用户身份证号码(15位 或
者 18位 )
{
do{
int i,mark;
char ch;
for(i=0,mark=0;;i++) //输入有效性判断(只能是数字)
if((ch=getchar())!='\n')
{
if(ch<='9'&&ch>='0')
person_num[i]=ch;
else
{
printf("身份证号码只能是数字!\n");
mark=1;
break;
}
}
else
break;
person_num[i]='\0';
if(mark==1)
continue;
if(strlen(person_num)!=15&&strlen(person_num)!=18)
printf("身份证号码只能是15位,或者18位!\n");
else
break;
printf("重新输入身份证号码: ");
}while(1); //循环以保证读入数据有效 }
4. void select_name() //按照姓名查询账户余额 {
void getname(char *name);
printf("%30s\n","***按照姓名查询账户余额***");
printf("%8s %15s %15s %10s\n","账号","用户姓名","身份证号码","存款余额");
printf("---------------------------------------------\n\n");
FILE * fp;
struct user temp;
char name[20];
if((fp=fopen(file,"rb"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
printf("请输入要查询的姓名:"); //调用读取用户名函数
getname(name);
while(fread(&temp,sizeof(struct user),1,fp)) //循环读取每一条记录 判断是否为要查看的记录
if(strcmp(temp.name,name)==0)
{
printf("NO.%d %15s %15s %.2f\n",temp.id,temp.name,temp.person_num,temp.mone
y);
}
fclose(fp);
}
5. void select_id() //按照账号查询账户余额
{
int count();
printf("%30s\n","***按照编号查询账户余额***");
printf("%8s %15s %15s %10s\n","编号","用户姓名","身份证号码","存款余额");
printf("---------------------------------------------\n\n");
FILE * fp;
struct user temp;
int i,maxnum;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
maxnum=count();
printf("输入要查询账号:"); //判断账号是否在记录中
scanf("%d",&i);
if(i<1||i>maxnum)
{
printf("你要查询的账号不存在!");
return;
}
while(fread(&temp,sizeof(struct user),1,fp))//循环读取每一条记录 判断是否
为要查看的记录
if(temp.id==i)
{
printf("NO.%d %15s %15s %.2f\n",temp.id,temp.name,temp.person_num,temp.mone
y);
}
fclose(fp);
}
6. void display() //显示用户资料
{
printf("%30s\n","***用户资料显示***");
printf("%8s %15s %15s %10s\n","账号","用户姓名","身份证号码","存款余额");
printf("---------------------------------------------\n\n");
FILE * fp;
struct user temp;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
while(fread(&temp,sizeof(struct user),1,fp))
{
printf("NO.%d %15s %15s %.2f\n",temp.id,temp.name,temp.person_num,temp.mone
y);
}
fclose(fp);
}
7.void save_money() //函数功能:按账号存款
{
printf("%30s\n","***用户存款业务***");
printf("---------------------------------------------\n\n");
int count();
FILE *fp;
int i,num,mark;
struct user *temp;
num=count(); //根据记录数
空间
temp=(struct user *)malloc(num*sizeof(struct user));
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i
num)
{
printf("你要存款账号不存在!");
return;
}
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;inum)
{
printf("你要取款账号不存在!");
return;
}
if((fp=fopen(file,"wb"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
for(i=0;itemp[i].money)
{
printf("你的余额不足!\n");
money=0;
}
temp[i].money -=money;
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
printf("你取款业务已办妥!\n");
}
9.void del() //销户
{
int count();
printf("%30s\n","***注销账户***");
printf("%8s %15s %15s %10s\n","账号","用户姓名","身份证号码","存款余额");
printf("---------------------------------------------\n\n");
FILE * fp;
struct user temp;
int i,maxnum;
if((fp=fopen(file,"rb"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
maxnum=count();
printf("输入要销户账号:"); //判断编号是否在记录中
scanf("%d",&i);
if(i<1||i>maxnum)
{
printf("你要查询的账号不存在!");
return;
}
while(fread(&temp,sizeof(struct user),1,fp))//循环读取每一条记录 判断是否为要
查看的记录
if(temp.id==i&&temp.money==0.00)//余额为0
{temp.id=-1;//算无效帐户
printf("NO.%d %15s %15s %.2f\n",temp.id,temp.name,temp.person_num,temp.mone
y);
//printf("%d\n",temp.id);
fwrite(&temp,sizeof(struct user),1,fp);//保存修改
}
fclose(fp);
}
10void mainmenu() //函数功能:输出界面
{
printf("%30s\n"," ***活期储蓄帐目管理系统***");
printf("---------------------------------------------------\n\n");
printf("%8s,%-20s\n","** 1","储户开户 **");
printf("%8s,%-20s\n","** 2","按照姓名查询 **");
printf("%8s,%-20s\n","** 3","按照账号查询 **");
printf("%8s,%-20s\n","** 4","显示用户信息 **");
printf("%8s,%-20s\n","** 5","储户存款 **");
printf("%8s,%-20s\n","** 6","储户取款 **");
printf("%8s,%-20s\n","** 7","储户销户 **");
printf("%8s,%-20s\n","** 8","退出 **");
printf("\n请选择功能(1~8):");
}
四、调试分析:
将软件进行初始化,即在VC++6.0中运行该程序,进入程序主菜单。 界面显示的是“主菜单”,主菜单有八个方面:
1、 添加用户资料
2、 按姓名查询帐户余额
3、 按账号查询账户余额
显示用户资料 4、
5、 储户存款
储户取款 6、
7、 销户
8、 退出
每个方面实现一个功能。定义一个包含有四个变量的结构体数组,并存入文件中。定义一个计数函数,贯穿整个程序。然后每个函数实现一个功能,共有七个功能。添加用户时会使用到录入姓名和录入身份证号码两个函数。按姓名和账号查询只需要比较字符串,然后输出即可实现。显示用户资料只需将结构体数组依次输出即可实现。储户的存款和取款按找账号依次从文件中查找到匹配的账号,然后加上或减去存取的金额即可实现。销户时将金额为零的账户账号标为-1即可。
主界面截图
添加用户资料
按姓名查询账户
按账号查询账户
显示用户资料
储户存款
储户取款
销户
五、课设:
1)程序的编写应是:三分编写,七分调试,调试程序是一件很考验耐心的事情。 2)程序编写之前需求分析然后想好整个程序的框架,这一点至关重要,将关系这整个 项目的成败.
3)做这个程序时,遇到了一些问题,销户时能显示出来销户,但是查询时候就会发现 实际上没有销户成功,这是一个待改善的地方。
4)做软件的最终目的是满足用户的需求,所以做软件时应一切应以用户为导向。 5)由于我们的知识浅薄,经验不足及阅历颇浅,因此,在该程序的设计方面还有很多的不足,会在以后的学习过程中,根据所学的知识不断的修改、完善,争取慢慢趋于完美。