数据结构课程教学设计活期储蓄账目管理方案计划.docx
《数据结构课程教学设计活期储蓄账目管理方案计划.docx》由会员分享,可在线阅读,更多相关《数据结构课程教学设计活期储蓄账目管理方案计划.docx(42页珍藏版)》请在冰豆网上搜索。
数据结构课程教学设计活期储蓄账目管理方案计划
活期储蓄账目管理
一目的
满足活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求。
①能比较迅速地找到储户的帐户进而显示储户信息,以实现存款、取款记账;
②能比较简单,迅速地实现插入和删除,以实现开户和销户的需要;
③熟练使用C语言编写程序,解决实际问题;
学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。
二需求分析
1、数据需求
1.需先进行储户开户才可进行之后的所有的操作。
2.开户时需要的数据有姓名、身份证号码、联系电话、密码、账号会自动生成。
3.销户时,需用输入账号与密码(两者都正确后)方可销户;存取款时,也需进行账号及密码验证后方可进行交易。
2、基本功能需求
基本的功能有新建储户(开户)、删除储户(销户)、存取款、查询储户信息(此步也可看见交易后的信息)、显示所有储户信息。
3、非功能性需求
系统以菜单界面方式工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
三概要设计
1、数据结构设计
用结构体来定义其数据类型,然后将数据按照该数据结构存储,之后运用文件的相关知识将更改的数据写入文件中,采用数组类型的存储结构。
2、储存结构体设计
本系统主要用线性表表结构类型来存储在“活期储蓄账目管理系统”中的信息。
其中,结构体由5个分量构成:
用户账号、用户姓名、用户身份证号码、用户密码、开户金额。
3、模块设计
活期储蓄账目管理
显示菜单
选择功能
1.新建储户
2.查询储户信息
3.显示所有储户信息
4.删除储户
5.存款
6.取款
7.退出账目管理。
voidadd()函数实现新建储户功能
voidselect_id()函数实现查询储户信息功能
voiddisplay()函数实现显示所有储户信息功能
voiddel()函数实现删除储户功能
voidsave_money()函数实现存款功能
voidget_money()函数实现取款功能
voidprint()函数用于显示菜单
voidmain()函数用于实现菜单中的功能
四详细设计
1、结构体的详细定义
structuser//用户类型(账号,姓名,身份证号,存款)
{
intid;
charname[20];
charperson_num[19];
charpassword[6];
doublemoney;
};
2、系统函数详细介绍
voidadd()函数实现新建储户功能
voidadd()//添加用户
{
printf("%45s\n","***新建储户***");
printf("--------------------------------------------------------------------------------\n\n");
structusergetuser();
structusertemp;
intcount();//函数目的:
计算文件中的记录数目以生成自动账号
FILE*fp;
intnumber;
if((fp=fopen(file,"ab"))==NULL)
{
printf("Cannotopenfile!
\n");
exit
(1);
}
temp=getuser();//读取用户名
number=count();
temp.id=number+1;//生成自动账号
fwrite(&temp,sizeof(structuser),1,fp);
printf("添加用户成功!
\n");
fclose(fp);
}
voidselect_id()函数实现查询储户信息功能
voidselect_id()//查询储户信息
{
intcount();
voidgetpassword(char*password);
printf("%45s\n","***查询储户信息***");
printf("--------------------------------------------------------------------------------\n");
printf("%s%15s%15s%15s\n","编号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\n\n");
FILE*fp;
structusertemp;
inti,maxnum;
charpassword[8];
boolflag=false;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannotopenfile!
\n");
exit
(1);
}
maxnum=count();
printf("输入要查询账号:
");
scanf("%d",&i);
if(imaxnum)
{
printf("你要查询的账号不存在!
");
return;
}
printf("输入账号密码:
");
scanf("%s",&password);
while(fread(&temp,sizeof(structuser),1,fp))//循环读取每一条记录判断是否为要查看的记录
{
if(temp.id==i&&strcmp(temp.password,password)==0)
{
printf("NO.%d%8s%25s%.2f\n",temp.id,temp.name,temp.person_num,temp.money);
flag=true;
break;
}
}
if(flag==false)//判断密码是否正确
{
printf("您输入的密码不正确!
\n");
return;
}
fclose(fp);
}
voiddisplay()函数实现显示所有储户信息功能
voiddisplay()//显示所有储户信息
{
printf("%45s\n","***显示所有储户信息***");
printf("--------------------------------------------------------------------------------\n");
printf("%s%15s%15s%15s\n","账号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\n");
FILE*fp;
structusertemp;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannotopenfile!
\n");
exit
(1);
}
while(fread(&temp,sizeof(structuser),1,fp))
{
printf("NO.%d%10s%23s%.2f\n",temp.id,temp.name,temp.person_num,temp.money);
}
fclose(fp);
}
voiddel()函数实现删除储户功能
voiddel()//删除储户
{
printf("%45s\n","***删除储户***");
printf("--------------------------------------------------------------------------------\n");
printf("%s%15s%15s%10s\n","账号","用户姓名","身份证号码","存款余额");
printf("--------------------------------------------------------------------------------\n");
intcount();
voidgetname(char*name);
voidgetperson_num(char*person_num);
voidgetpassword(char*password);
FILE*fp;
inti,num,mark;
charpassword[6];
boolflag=false;
structuser*temp;
num=count();//根据记录数申请空间
temp=(structuser*)malloc(num*sizeof(structuser));
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannotopenfile!
\n");
exit
(1);
}
for(i=0;ifread(&temp[i],sizeof(structuser),1,fp);
fclose(fp);
printf("输入要需要注销的账号:
");
scanf("%d",&mark);
if(inum)
{
printf("你要注销的账号不存在!
");
return;
}
printf("输入账号密码:
");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL)//写方式打开文件,覆盖原文件中的内容
{
printf("cannotopenfile!
\n");
exit
(1);
}
for(i=0;i{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0&&temp[i].money==0.00)
{
strcpy(temp[i].person_num,"0");
strcpy(temp[i].name,"0");
strcpy(temp[i].password,"0");
flag=true;
}
fwrite(&temp[i],sizeof(structuser),1,fp);
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确或是余额不为零!
\n");
}
else
printf("储户注销成功!
\n");
}
voidsave_money()函数实现存款功能
voidsave_money()//函数功能:
存款
{
printf("%45s\n","***用户存款业务***");
printf("--------------------------------------------------------------------------------\n\n");
intcount();
voidgetpassword(char*password);
FILE*fp;
inti,num,mark;
boolflag=false;
structuser*temp;
charpassword[6];
num=count();
temp=(structuser*)malloc(num*sizeof(structuser));//根据记录数申请空间
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannotopenfile!
\n");
exit
(1);
}
for(i=0;ifread(&temp[i],sizeof(structuser),1,fp);
fclose(fp);
printf("输入要存款账号:
");//读取存款账号
scanf("%d",&mark);
if(inum)
{
printf("你要查询的账号不存在!
");
return;
}
printf("输入账号密码:
");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL)//写方式打开文件,覆盖原文件中的内容
{
printf("cannotopenfile!
\n");
exit
(1);
}
for(i=0;i{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0)
{
doublemoney=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(structuser),1,fp);//修改该用户的信息
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确!
\n");
}
else
printf("你存款业务已办妥!
\n");
}
voidget_money()函数实现取款功能
voidget_money()//函数功能:
用户取款
{
printf("%45s\n","***用户取款业务***");
printf("--------------------------------------------------------------------------------\n\n");
intcount();
FILE*fp;
inti,num,mark;
charpassword[6];
boolflag=false;
structuser*temp;
num=count();//根据记录数申请空间
temp=(structuser*)malloc(num*sizeof(structuser));
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannotopenfile!
\n");
exit
(1);
}
for(i=0;ifread(&temp[i],sizeof(structuser),1,fp);
fclose(fp);
printf("输入要取款账号:
");
scanf("%d",&mark);
if(inum)
{
printf("你要查询的账号不存在!
");
return;
}
printf("输入账号密码:
");
scanf("%s",&password);
if((fp=fopen(file,"wb"))==NULL)//写方式打开文件,覆盖原文件中的内容
{
printf("cannotopenfile!
\n");
exit
(1);
}
for(i=0;i{
if(temp[i].id==mark&&strcmp(temp[i].password,password)==0)
{
doublemoney=0;
printf("输入要取出的金额:
");
scanf("%lf",&money);
if(money<=0)//判断用户余额是否足够
{
printf("只能为正数!
\n");
money=0;
}
elseif(money>temp[i].money)
{
printf("你的余额不足!
\n");
money=0;
}
temp[i].money-=money;
flag=true;
}
fwrite(&temp[i],sizeof(structuser),1,fp);
}
fclose(fp);
free(temp);
if(flag==false)
{
printf("您输入的密码不正确!
\n");
}
else
printf("你取款业务已办妥!
\n");
}
voidprint()函数用于显示菜单
voidprint()//函数功能:
输出界面
{
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):
");
}
voidmain()函数用于实现菜单中的功能,主函数
voidmain()
{
charchoose;
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
#include
#include
#include
#definefile"temp.txt"//数据储存文件名
structuser//用户类型(账号,姓名,身份证号,存款)
{
intid;
charname[20];
charperson_num[19];
charpassword[6];
doublemoney;
};
voidadd()//添加用户
{
printf("%45s\n","***新建储户***");
printf("