数据结构课程设计--活期储蓄账目管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计--活期储蓄账目管理
活期储蓄账目管理
一目的
满足活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求。
①能比较迅速地找到储户的帐户进而显示储户信息,以实现存款、取款记账;
②能比较简单,迅速地实现插入和删除,以实现开户和销户的需要;
③熟练使用 C 语言编写程序,解决实际问题;
学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。
二需求分析
1、数据需求
1.需先进行储户开户才可进行之后的所有的操作。
2.开户时需要的数据有姓名、身份证号码、联系电话、密码、账号会自动生成。
3.销户时,需用输入账号与密码(两者都正确后)方可销户;存取款时,也需进行账号及密码验证后方可进行交易。
2、基本功能需求
基本的功能有新建储户(开户)、删除储户(销户)、存取款、查询储户信息(此步也可看见交易后的信息)、显示所有储户信息。
3、非功能性需求
系统以菜单界面方式工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
三概要设计
1、数据结构设计
用结构体来定义其数据类型,然后将数据按照该数据结构存储,之后运用文件的相关知识将更改的数据写入文件中,采用数组类型的存储结构。
2、储存结构体设计
本系统主要用线性表表结构类型来存储在“活期储蓄账目管理系统”中的信息。
其中,结构体由5个分量构成:用户账号、用户姓名、用户身份证号码、用户密码、开户金额。
3、模块设计
void add()函数实现新建储户功能
void select_id()函数实现查询储户信息功能
void display()函数实现显示所有储户信息功能
void del()函数实现删除储户功能
void save_money() 函数实现存款功能
void get_money()函数实现取款功能
void print()函数用于显示菜单
void main()函数用于实现菜单中的功能
四详细设计
1、结构体的详细定义
struct user //用户类型(账号,姓名,身份证号,存款) {
int id;
char name[20];
char person_num[19];
char password[6];
double money;
};
2、系统函数详细介绍
void add()函数实现新建储户功能
void add() //添加用户
{
printf("%45s\n","***新建储户***");
printf("--------------------------------------------------------------------------------\n\n");
struct user getuser();
struct user temp;
int count(); //函数目的:计算文件中的记录数目以生成自动账号
FILE *fp;
int number;
if((fp=fopen(file,"ab"))==NULL)
{
printf("Can not open file!\n");
exit(1);
}
temp=getuser(); //读取用户名
number=count();
temp.id=number+1; //生成自动账号
fwrite(&temp,sizeof(struct user),1,fp);
printf("添加用户成功!\n");
fclose(fp);
}
void select_id()函数实现查询储户信息功能
void select_id() //查询储户信息
{
int count();
void getpassword(char *password);
printf("%45s\n","***查询储户信息***");
printf("--------------------------------------------------------------------------------\n");
printf("%s %15s %15s %15s\n","编号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------
\n\n");
FILE *fp;
struct user temp;
int i,maxnum;
char password[8];
bool flag=false;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
maxnum=count();
printf("输入要查询账号:");
scanf("%d",&i);
if(i<i||i>maxnum)
{
printf("你要查询的账号不存在!");
return;
}
printf("输入账号密码:");
scanf("%s",&password);
while(fread(&temp,sizeof(struct user),1,fp)) //循环读取每一条记录判断是否为要查看的记录
{
if(temp.id==i&&strcmp(temp.password,password)==0)
{
printf("NO.%d %8s %25s %.2f\n",temp.id,,temp.person_num,te mp.money);
flag=true;
break;
}
}
if(flag==false) //判断密码是否正确
{
printf("您输入的密码不正确!\n");
return;
}
fclose(fp);
}
void display()函数实现显示所有储户信息功能
void display() //显示所有储户信息
{
printf("%45s\n","***显示所有储户信息***");
printf("--------------------------------------------------------------------------------\n");
printf("%s %15s %15s %15s\n","账号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\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 %10s %23s %.2f\n",temp.id,,temp.person_num,t emp.money);
}
fclose(fp);
}
void del()函数实现删除储户功能
void del() //删除储户
{
printf("%45s\n","***删除储户***");
printf("--------------------------------------------------------------------------------\n");
printf("%s %15s %15s %10s\n","账号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\n");
int count();
void getname(char *name);
void getperson_num(char *person_num);
void getpassword(char *password);
FILE *fp;
int i,num,mark;
char password[6];
bool flag=false;
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;i++) //读取文件内容
fread(&temp[i],sizeof(struct user),1,fp); fclose(fp);
printf("输入要需要注销的账号:");
scanf("%d",&mark);
if(i<mark||mark>num)
{
printf("你要注销的账号不存在!");
return;
}
printf("输入账号密码: ");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++) //无效账户信息全部置为0
{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0&&temp[i].mo ney==0.00)
{
strcpy(temp[i].person_num,"0");
strcpy(temp[i].name,"0");
strcpy(temp[i].password,"0");
flag=true;
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确或是余额不为零!\n");
}
else
printf("储户注销成功!\n");
void save_money() 函数实现存款功能
void save_money() //函数功能:存款
{
printf("%45s\n","***用户存款业务***");
printf("--------------------------------------------------------------------------------
\n\n");
int count();
void getpassword(char *password);
FILE *fp;
int i,num,mark;
bool flag=false;
struct user *temp;
char password[6];
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;i++) //将文件内容存入数组
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要存款账号:"); //读取存款账号
scanf("%d",&mark);
if(i<mark||mark>num)
{
printf("你要查询的账号不存在!");
return;
}
printf("输入账号密码: ");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++)
{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0)
{
double money=0;
printf("输入要存入的金额:");
scanf("%lf",&money);
while(1)
{
if(money<=0)
{
printf("只能为正数!\n");
money=0;
printf("输入要存入的金额:");
scanf("%lf",&money);
}
else
break;
}
temp[i].money +=money;
flag=true;
}
fwrite(&temp[i],sizeof(struct user),1,fp); //修改该用户的信息}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确!\n");
}
else
printf("你存款业务已办妥!\n");
}
void get_money()函数实现取款功能
void get_money() //函数功能:用户取款
{
printf("%45s\n","***用户取款业务***");
printf("--------------------------------------------------------------------------------\n\n");
int count();
FILE *fp;
int i,num,mark;
char password[6];
bool flag=false;
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;i++) //读取文件内容
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要取款账号:");
scanf("%d",&mark);
if(i<mark||mark>num)
{
printf("你要查询的账号不存在!");
return;
}
printf("输入账号密码: ");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中
的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++)
{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0)
{
double money=0;
printf("输入要取出的金额:");
scanf("%lf",&money);
if(money<=0) //判断用户余额是否足够
{
printf("只能为正数!\n");
money=0;
}
else if(money>temp[i].money)
{
printf("你的余额不足!\n");
money=0;
}
temp[i].money -=money;
flag=true;
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确!\n");
}
else
printf("你取款业务已办妥!\n");
}
void print()函数用于显示菜单
void print() //函数功能:输出界面
{
printf("%48s\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("\n请选择功能(1~7):");
}
void main()函数用于实现菜单中的功能,主函数
void main()
{
char choose;
do{
print();
scanf(" %c",&choose); //读取功能标号,根据标号选择不同的函数
fflush(stdin);
system("cls");
switch(choose)
{
case '1':
add();
break;
case '2':
select_id();
break;
case '3':
display();
break;
case '4':
del();
break;
case '5':
save_money();
break;
case '6':
get_money();
break;
case '7':
exit(1);
default:
printf("对不起,你所选择的功能不存在!\n");
}
getch(); //暂停功能(读取任意键继续)(conio.h)
system("cls"); //清除屏幕显示(stdlib.h)
}while(1);
}
五调试分析
系统运行主界面如图所示,各子功能测试运行结果如下:
每个方面实现一个功能。
定义一个包含有五个变量的结构体数组,并存入文件中。
定义一个计数函数,贯穿整个程序。
然后每个函数实现一个功能,共有六个功能。
添加用户时会使用到录入姓名和录入身份证号码两个函数。
查询只需要比较字符串,然后输出即可实现。
显示全部储户信息只需将结构体数组依次输出即可实现。
储户的存款和取款按找账号依次从文件中查找到匹配的账号,然后加上或减去存取的金额即可实现。
销户时将储户除账号外信息全部置0即可。
六测试结果
1.主界面截图
2.新建储户
3.查询储户信息
4.显示所有储户信息
5.存款
6.取款
7.删除储户
七用户使用说明
(1) 本程序执行文件为”活期储蓄.exe”.
(2) 进入本系统后,随即显示系统主菜单页面,用户可在该界面下输入各子菜单前对应的数字并按回车键,执行相应子菜单命令。
(3) 账号或密码输入不正确时,会出现提示信息,然后按任意键退出。
八课程设计总结
这次课程设计中遇到了一些问题与同学一起讨论解决,从其他人身上学到了很多。
这个课程设计并不完美,还有很多要改善的地方,在删除储户时不能将储户信息从文件中删除,只能将储户信息全部置0了。
还有一些没想到的细节。
虽然不是很完美,但发现不足之处并在以后的设计中注意这些细节,对于将来的实践还是很有帮助,我们可以不断发现我们的不完美,并想办法去改进这些不完美。
通过这次课程设计学到了很多东西包括以前在课本上没有学到的知识,还使我懂得了理论和时间结合是很重要的。
让我进一步了解了C++程序设计方法,并且对这门课产生了浓厚的兴趣。
更重要的是培养了自己耐心、细心、用心的良好品质。
同时也非常感谢同学的帮助及老师的建议与指导。
源程序:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define file "temp.txt" //数据储存文件名
struct user //用户类型(账号,姓名,身份证号,存款)
{
int id;
char name[20];
char person_num[19];
char password[6];
double money;
};
void add() //添加用户
{
printf("%45s\n","***新建储户***");
printf("--------------------------------------------------------------------------------
\n\n");
struct user getuser();
struct user temp;
int count(); //函数目的:计算文件中的记录数目以生成自动账号
FILE *fp;
int number;
if((fp=fopen(file,"ab"))==NULL)
{
printf("Can not open file!\n");
exit(1);
}
temp=getuser(); //读取用户名
number=count();
temp.id=number+1; //生成自动账号
fwrite(&temp,sizeof(struct user),1,fp);
printf("添加用户成功!\n");
fclose(fp);
}
int count() //函数目的:计算文件中的记录总数
{
FILE *fp;
int num;
struct user temp;
num=0;
if((fp=fopen(file,"rb"))==NULL)
{
printf("Can not open file!\n");
exit(1);
}
while(fread(&temp,sizeof(struct user),1,fp))
{
num++;
}
fclose(fp);
return num;
}
struct user getuser()
{
void getname(char *name);
void getperson_num(char *person_num);
void getpassword(char *password);
struct user temp;
printf("请输入用户姓名(字符数<20): ");
getname();
printf("请输入用户身份证号码: ");
getperson_num(temp.person_num);
printf("请输入账户密码: ");
getpassword(temp.password);
printf("输入开户金额:"); //判断开户金额(>=100)
do
{
scanf("%lf",&temp.money);
fflush(stdin);
if(temp.money<100.00)
printf("开户金额不能小于100\n");
else
break;
printf("重新输入开户金额: ");
}while(1);
return temp;
}
void getname(char *name) //函数功能:读取用户姓名(字数<20)
{
do
{
scanf("%s",name);
fflush(stdin);
if(strlen(name)==0)
printf("姓名不能为空!\n");
else
if(strlen(name)>=20)
printf("姓名不能超过20个字符!\n");
else break;
printf("重新输入姓名: "); //while循环,直到姓名输入有效
}while(1);
}
void getperson_num(char *person_num)
{
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)!=18)
printf("身份证号码只能是18位!\n");
else
break;
printf("重新输入身份证号码: ");
}while(1);
}
void getpassword(char *password)
{
do
{
int i,j;
char ch;
for(i=0,j=0;; i++)
if((ch=getchar())!='\n')
{
if(ch<='9'&&ch>='0')
password[i]=ch;
else
{
printf("密码只能是数字!\n");
j=1;
break;
}
}
else
break;
password[i]='\0';
if(j==1)
continue;
if(strlen(password)!=6)
printf("密码只能是6位!\n");
else
break;
printf("重新输入密码: ");
}
while(1);
}
void select_id() //查询储户信息
{
int count();
void getpassword(char *password);
printf("%45s\n","***查询储户信息***");
printf("--------------------------------------------------------------------------------\n");
printf("%s %15s %15s %15s\n","编号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------
\n\n");
FILE *fp;
struct user temp;
int i,maxnum;
char password[8];
bool flag=false;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
maxnum=count();
printf("输入要查询账号:");
scanf("%d",&i);
if(i<i||i>maxnum)
{
printf("你要查询的账号不存在!");
return;
}
printf("输入账号密码:");
scanf("%s",&password);
while(fread(&temp,sizeof(struct user),1,fp)) //循环读取每一条记录判断是否为要查看的记录
{
if(temp.id==i&&strcmp(temp.password,password)==0)
{
printf("NO.%d %8s %25s %.2f\n",temp.id,,temp.person_num,te mp.money);
flag=true;
break;
}
}
if(flag==false) //判断密码是否正确
{
printf("您输入的密码不正确!\n");
return;
}
fclose(fp);
}
void display() //显示所有储户信息
{
printf("%45s\n","***显示所有储户信息***");
printf("--------------------------------------------------------------------------------\n");
printf("%s %15s %15s %15s\n","账号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\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 %10s %23s %.2f\n",temp.id,,temp.person_num,t emp.money);
}
fclose(fp);
}
void save_money() //函数功能:存款
{
printf("%45s\n","***用户存款业务***");
printf("--------------------------------------------------------------------------------
\n\n");
int count();
void getpassword(char *password);
FILE *fp;
int i,num,mark;
bool flag=false;
struct user *temp;
char password[6];
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;i++) //将文件内容存入数组
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要存款账号:"); //读取存款账号
scanf("%d",&mark);
if(i<mark||mark>num)
{
printf("你要查询的账号不存在!");
return;
}
printf("输入账号密码: ");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++)
{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0)
{
double money=0;
printf("输入要存入的金额:");
scanf("%lf",&money);
while(1)
{
if(money<=0)
{
printf("只能为正数!\n");
money=0;
printf("输入要存入的金额:");
scanf("%lf",&money);
}
else
break;
}
temp[i].money +=money;
flag=true;
}
fwrite(&temp[i],sizeof(struct user),1,fp); //修改该用户的信息}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确!\n");
}
else
printf("你存款业务已办妥!\n");
}
void get_money() //函数功能:用户取款
{
printf("%45s\n","***用户取款业务***");
printf("--------------------------------------------------------------------------------\n\n");
int count();
FILE *fp;
int i,num,mark;
char password[6];
bool flag=false;
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;i++) //读取文件内容
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要取款账号:");
scanf("%d",&mark);
if(i<mark||mark>num)
{
printf("你要查询的账号不存在!");
return;
}
printf("输入账号密码: ");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++)
{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0)
{
double money=0;
printf("输入要取出的金额:");
scanf("%lf",&money);
if(money<=0) //判断用户余额是否足够
{
printf("只能为正数!\n");
money=0;
}
else if(money>temp[i].money)
{
printf("你的余额不足!\n");
money=0;
}
temp[i].money -=money;
flag=true;
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确!\n");
}
else
printf("你取款业务已办妥!\n");
}
void del() //删除储户
{
printf("%45s\n","***删除储户***");
printf("--------------------------------------------------------------------------------\n");
printf("%s %15s %15s %10s\n","账号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\n");
int count();
void getname(char *name);
void getperson_num(char *person_num);
void getpassword(char *password);
FILE *fp;
int i,num,mark;
char password[6];
bool flag=false;
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;i++) //读取文件内容
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要需要注销的账号:");
scanf("%d",&mark);
if(i<mark||mark>num)
{
printf("你要注销的账号不存在!");
return;
}
printf("输入账号密码: ");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++) //无效账户信息全部置为0
{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0&&temp[i].mo ney==0.00)
{
strcpy(temp[i].person_num,"0");
strcpy(temp[i].name,"0");
strcpy(temp[i].password,"0");
flag=true;
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确或是余额不为零!\n");
}
else
printf("储户注销成功!\n");
}
void print() //函数功能:输出界面
{
printf("%48s\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("\n请选择功能(1~7):");
}
void main()
{
char choose;
do{
print();
scanf(" %c",&choose); //读取功能标号,根据标号选择不同的函数
fflush(stdin);
system("cls");
switch(choose)
{
case '1':
add();
break;
case '2':
select_id();
break;
case '3':
display();
break;
case '4':
del();
break;
case '5':
save_money();
break;
case '6':
get_money();
break;
case '7':
exit(1);
default:
printf("对不起,你所选择的功能不存在!\n");
}
getch(); //暂停功能(读取任意键继续)(conio.h)
system("cls"); //清除屏幕显示(stdlib.h)
}while(1); }。