小明是一个计算机专业top student,祝贺他毕业了。并准备到银行参加工作。上班第一天,经理叫他编制一个实现一个活期储蓄处理程序,算作考查。上班第一天, 一定要给领导一个好印象,小明二话没说,就答应了。现要你是小明了,请完成如下题目功能。储户开户、销户、存入、支出活动频繁,系统设计要求:(1)能比较迅速地找到储户的帐户,以实现存款、取款记账;
(2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
通过数组来存储数据结构,其结构则按照C语言的相关知识定义结构体,其中储户开户、销户就是实现链表的插入与删除,而存入、支出等活动则是实现数组中结点的查找,然后进行更改。
逻辑结构是线性表的逻辑结构,
存储结构用链接存储结构
时间复杂度T(n)=O(f(n))
空间复杂度S(n)=O(f(n))
#include
#include
#include
using namespace std;
long num[100],time[100];float money[100];
char*namek[100];char*idk[100];
char*telk[100];
char*wplacek[100],*homek[100];
float interest=0;
#define ROI 0.02
char yes;
char name[100];
int get_num( long *num ) //获取账号
{
for(int j=1;j<=100;j++)
if(num[j]<=0)return j;
cout<<" 账户已满"<
return 0;
}
//填写储户资料
void get_inform( int n,long* num,char**idk,
char **namek,char**wplacek,char**telk,char**homek)
{
cout<<"请输入 姓 名:";
cin>>*(namek+n);
cout<<"请输入 电话号码:";
cin>>*(telk+n);
cout<<"请输入 单位名称:";
cin>>*(wplacek+n);
cout<<"请输入 地 址:";
cin>>*(homek+n);
cout<<"请输入 密 码:";
cin>>*(num+n);
cout<<"请输入身份证号码:";
cin>>*(idk+n);
return;
}
//个人界面
void personal(int n,long* time,float *money,long *num,float interest)
{ long t;
int mtemp,ntemp,loop=0;
char temp;//loop=0必须放在这里面,否则只能打开一次子菜单
while(loop==0) //loop=0不能放到personal外!
{cout<<"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<
cout<<" 1-存 款"<
cout<<" 2-取 款"<
cout<<" 3-转 账"<
cout<<" 4-销 户"<
cout<<" 5-返回主菜单"<
cout<<"当前的利率为:"<
scanf("%c",&temp);
fflush(stdin);
if(temp!='1'&&temp!='2'&&temp!='3'&&temp!='4'&&temp!='5')
cout<<"输入错误,请重新输入\n"<
switch(temp)
{
case '1':
cout<<"请输入存款金额:";
cin>>mtemp;
*(money+n)+=mtemp;
cout<<" 交易成功!"<
cout<<" 当前的余额为:"<<*(money+n)<
break;
case '2':
cout<<"请输入存款时长:";
cin>>t;
*(time+n)=t;
interest+=(0.02*t*(*(money+n)));
cout<<" 获得利息为:"<
*(money+n)+=interest;
cout<<"请输入取款金额(<="<<*(money+n)<<"):";
cin>>mtemp;
if(mtemp>*(money+n))
{
cout<<" 余额不足,交易失败!";
break;
}
*(money+n)-=mtemp;
cout<<" 交易成功!"<
cout<<" 当前的余额为:"<<*(money+n)<
break;
case '3':
cout<<"请输入转入账号:";
cin>>ntemp;
if(ntemp<1||ntemp>99)
{
cout<<" 该账号不存在!"<
break;
}
if(*(num+ntemp)==0)
{
cout<<" 该账号未注册!"<
break;
}
if(*(num+ntemp)==-1)
{
cout<<" 该账户已注销!"<
break;
}
cout<<"请输入转出金额(<="<<*(money+n)<<"):";
cin>>mtemp;
if(mtemp>*(money+n))
{
cout<<" 余额不足,交易失败!";
break;
}
cout<<" 确认转账?[Y/N]:";
cin>>yes;
if(yes=='Y')
{
*(money+n)-=mtemp;
*(money+ntemp)+=mtemp;
cout<<" 交易成功!"<
}
cout<<" 当前的余额为:"<<*(money+n)<
break;
case '4':
cout<<" 确认注销?[Y/N]:";
cin>>yes;
if(yes=='Y')
{
cout<<" 已注销!"<
*(num+n)=-1;
}
loop=1;
break ;
case '5':
loop=1;
break;
}
}
}
//打印用户信息
void print(int n,char**namek,char**wplacek,char**telk,
char**homek,char**idk,float *money,long*time,float interest)
//不能是char*namek,char*wplacek(二级指针)
{
cout<<"★★★★★★★★★★★★★★★★★★★★"<
cout<<"账 号:"<
cout<<"姓 名:"<<*(namek+n)<
cout<<"单 位:"<<*(wplacek+n)<
cout<<"电 话:"<<*(telk+n)<
cout<<"地 址:"<<*(homek+n)<
cout<<"余 额:"<<*(money+n)<
cout<<"时 长:"<<*(time+n)<
cout<<"利 息:"<
cout<<"身份证号码:"<<*(idk+n)<
cout<<"=================================="< } //查询 void check(int n,char**namek,char**wplacek,char**telk, char**homek,char**idk,float *money,long*time,float interest) { int i=0,k=0; char j; //k=0必须放在这里,否则只能打开一次子菜单 while(k==0) {cout<<"++++++++++++++++++++++++++++++++"< cout<<" 1-按账号查询"< cout<<" 2-按姓名查询"< cout<<" 3-返回上一层"< scanf("%c",&j); fflush(stdin); if(j!='1'&&j!='2'&&j!='3') cout<<"输入错误,请重新输入\n"< switch(j) { case '1': cout<<"请输入账号:"; cin>>n; if(n<1||n>99) { cout<<" 该账号不存在!"< break; } if(*(num+n)==0) { cout<<" 该账号未注册!"< break; } if(*(num+n)==-1) { cout<<" 该账户已注销!"< break; } print( n,namek,wplacek,telk, homek,idk,money,time,interest); break; case '2': cout<<"请输入姓名:"; cin>>name; for(j=1;j<=99;j++) { if(string(*(namek+j))==string(name)) { if(*(num+j)!=-1) { print( j,namek,wplacek,telk, homek,idk,money,time,interest); i++; } } } if(i==0) cout<<" 该户主不存在!"< break; case '3': k=1; break; } } } void main() { cout<<" 欢迎进入活期储蓄账目管理 "< int r=0,i,m,n; char temp; for(i=1;i<=100;i++) { num[i]=0;money[i]=0;time[i]=0; *(namek+i)=new char[100]; //必须先给指针数组分配内存,才可以出入值 *(wplacek+i)=new char[100]; //*号不能省略 *(homek+i)=new char[100]; *(idk+i)=new char[100]; *(telk+i)=new char[100]; } while(r==0) { cout<<"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< cout<<"☆☆ 1-进入帐户 ☆☆"< cout<<"☆☆ 2-开 户 ☆☆"< cout<<"☆☆ 3-查 询 ☆☆"< cout<<"☆☆ 4-退 出 ☆☆"< cout<<"☆☆ 请 选 择: ☆☆"< cout<<"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< scanf("%c",&temp); fflush(stdin); if(temp!='1'&&temp!='2'&&temp!='3'&&temp!='4') cout<<"输入错误,请重新输入\n"< switch(temp) { case '1': cout<<"请输入账号:"; cin>>n; if(n<1||n>99) { cout<<" 该账号不存在!"< break; } if(*(num+n)==0) { cout<<" 该账号未注册!"< break; } if(*(num+n)==-1) { cout<<" 该账户已注销!"< break; } cout<<"请输入密码:"; cin>>m; if(*(num+n)!=m) { cout<<" 密码错误!"; break; } else personal(n,time,money,num,interest); break; case '2': n=get_num( num ); if(n==0) break; get_inform(n,num, idk,namek,wplacek,telk,homek); cout<<" 确认开户?[Y/N]:"; cin>>yes; if(yes=='Y') cout<<" 开户成功!\n"<<" 您的账号为:" < else *(num+n)=-1; break; case '3': check( n,namek,wplacek,telk,homek,idk,money,time,interest); break; case '4': r=1; cout<<" 再见!"< break; } } for(i=1;i<100;i++) { delete []*(namek+i); //写成(name)\(name+i)都是不对的!! delete []*(wplacek+i); delete []*(homek+i); delete []*(idk+i); delete []*(telk+i);} } 进入界面 开户 存款 另开一户 转账 查询七. 程序运行结果
这是第三次做课程设计了,但开始自己读题时,思路不是很清晰,也不明白这个程序就是要结合所学数据结构的思想,要首先定义了多个数组,包含了储户的各类信息,如姓名,账号,金额等等,并利用文件将用户信息加以存储。开户时将输入的信息写入文件,存款和取款时对用户的存款加以处理并更新到文件中。
通过这次课程设计逐渐提高了自己的程序设计和调试能力,通过上机实习,严整自己设计算法的正确性,学会了有效利用基本调试方法,查找出代码中的错误并且修改,我对参数的调用也进行了很多种尝试,已经能够相对准确的选择合适的参数形式来实现函数之间的数据传输交互了。
这次试验也让我看到了自己的不足,许多关于C++的一些比较具体的东西还不太懂,比方说指针。这次课程设计也让我知道了自己的能力只有经过不断地锻炼才能提高。
1.《 数据结构与算法》 赵文静 祁飞等编著 科学出版社
2.《 数据结构C++版学习辅导与实验指导》 王红梅 胡明 王涛编著,清华出版社
3.《 数据结构 C++版》 王红梅 胡明 王涛编著,清华大学出版社