一、实训目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。
二、实训环境
计算机windows xp或其它版本,VC6.0或更高版本,或其它语言环境。
三、实习题目
小明是一个计算机专业top student,祝贺他毕业了。并准备到银行参加工作。上班第一天,经理叫他编制一个实现一个活期储蓄处理程序,算作考查。上班第一天,一定要给领导一个好印象,小明二话没说,就答应了。现要你是小明了,请完成如下题目功能。储户开户、销户、存入、支出活动频繁,系统设计要求:
(1)能比较迅速地找到储户的帐户,以实现存款、取款记账;
(2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
四、问题分析
需求分析:
1、 创建文件,用数组形式存储用户数据,开户时自定义用户账户、姓名、密码、开户金额;
2、 用户登录时,输入正确的用户姓名、用户密码,完成登陆后即可进行存款、取款、查询、修改密码;
3、 实现输入用户的账户名和密码,将其全部信息删除,进行销户。
五、逻辑结构和存储结构设计
逻辑结构:
存储结构设计:该存储结构是链式存储结构,本系统主要用线性表结构类型来存储在“活期储蓄账目管理系统”中的信息。其中,结构体由4个分量构成:用户账号名、用户姓名、用户密码、开户金额。
六、算法设计
本系统采用链式结构存储储蓄账目管理
1、用户输入想开户的储户输入其姓名账户密码,然后显示开户成功,会有一个账户生成,然后开户成功。
2、用户登录需要输入账号名和密码,判断密码是否正确,如果错误则返回,然后点击登录,就可以进入管理系统。
3、用户的存取款和查询余额,首先在登录账户的基础上,选择存或取款,然后输入相应的金额,若是取款应判断其金额是否小于账户上的金额,如果不小于,则提示储户重新输入相应的金额,或者退出。 4、储户需要销户的账户,然后程序自动判断该账户是否存在,然后输入账户密码,若密码与账户相对应,则删除该账户。
七、空间复杂度和时间复杂度分析
空间复杂度:
是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,
简单说就是递归集算时通常是反复调用同一个方法,递归n次,就需要n个空间。 时间复杂度:
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
八、代码
#include
#include
#include
#include
using namespace std; //加了
class consumer;
class YH
{
public:
YH();
voidbuilt_account(); //建立账户
voiddelet_account(); //销户
voidtransfer(int); //转账
voidenter_account(); //登录账户
voidaddmoney(int,float);
voidexitYH(); //退出系统
voidfunctionshow(); //功能界面
voidsave(); //文件存储函数
void load(); //文件打开函数
protected:
consumer*account[20]; /* 账户数 定义了一个指针数组,
共20个元素,每个元素均为指针*/
staticint acnum;
};
int YH::acnum =0; //初始化账户数为0
YH::YH() //定义用户类Yonghu函数
{
for(inti=0;i<20;i++)
{
account[i]=NULL; /*初步建立了数组空间,
未建立任何账户,元素均为
空值*/
}
}
class consumer:public YH //公有继承Yonghu类
{
public:
friendclass YH; /*友元类Yonghu可以访问consumer的
所有成员(包括私有成员)*/
consumer(intid,string Name,string PassWord,float m)
{
ID=id;name=Name;money=m;passwd=PassWord;
} //定义有参构造函数consumer
consumer(){ID=0;name='0';money=0;passwd='0';}/*初始化 (name,passwd的
类型为字符型,用
引号括起)*/
intget_id(){return ID;} //获取账号
voidsavemoney(); //存钱
stringget_passwd()
{
return passwd;
} //获取密码
void display(); //显示屏幕
void getmoney(); //取钱
voidchange_passwd(); //修改密码
voidadd_money(float); //添加money
voiddec_money(float); //扣钱
float get_money(); //得到money
private:
intID; //开户账号
stringpasswd; //账号密码
stringname; //用户名
floatmoney;
};
void YH::save() //定义文件存储函数
{ofstreamofile("bankdat.dat",ios::out); /*通过构造函数打开文件,相当于 ofstream ofile;(说明一个输出流)
ofile.open("bankdat.dat,ios::out);
ofstream ofile("文件",打开方式) 1]如果文件存在 则存放在C:\\ temp\\
bankdat.dat 2]文件不存在 打开方式一般在ofstream流中默认为
ios_base::out 早期的C++使用ios代替ios::base ifile相当于cin,ofile
相当于cout,它们从文件读/写数据。 在成功读/写过程前,要确定ifile和
ofile读/写的目标文件*/
ofstreamoutfile("bankdat.dat",ios::out); /*格式:输出到磁盘
ofstream 识别字("文件名") ios::out 文件以输出方式打开(内存数据输出到文件) 解释:写入到磁盘bankdat.dat中*/
int n=0;
outfile< for(;n {outfile< outfile< outfile< outfile< } outfile.close(); } void YH::load() //定义文件打开函数 {ifstreaminfile("bankdat.dat",ios::in); /*格式:从磁盘读文件 ifstream 识别字("文件名")*/ if(!infile) { cerr<<"读取错误,无资料!"< return; // } int n=0; int id,m; string nam,passw; //定义变量id,m,nam,passw infile>>acnum; for(;n {infile>>id; //从文件读取数据 infile>>m; infile>>nam; infile>>passw; account[n]->passwd; consumer*acc=newconsumer(id,nam,passw,m); account[n]=acc; } infile.close(); cout<<"读取资料正常!"< } void YH::transfer(int x) //定义转账函数,带一个参数 {int id; cout<<"请输入账号:"; cin>>id; int flag=1; int i=0; while((i { if(id==account[i]->get_id())flag=0;elsei++; } if(flag) { cout<<"账号不存在!"< return ; // } float b; cout< cin>>b; while(b<=0) { cout<<"请输入正确的数字!"< cout<<"$>"; cin>>b; } if(account[x]->get_money()
cout<<"对不起,金额不够!!"< else { account[x]->dec_money(b); account[i]->add_money(b); cout<<"转账成功"; } return ; // } void consumer::add_money(float x) //转账之后某用户添加money {money=x+money;} void consumer::dec_money(float x) //转账之后某用户扣money {money=money-x;} void YH::addmoney(int x,float y) { account[x]->money=account[x]->money-y; } float consumer::get_money() {return money;} void main() { YHa; a.functionshow(); } void YH::functionshow() //显示界面设计 { intn; do {system("cls");load(); cout<<"****************** 银行管理系统****************"< cout<<"1)用户开户"< <<"3)注销账户"< cout<<"**************************************************"< cout< cout<<"$>"; cin>>n; while(n<1||n>4) { cout<<"请输入正确的操作序号!"< cout<<"$>"; cin>>n; } switch(n) //选择语句 { case1:built_account(); break; case2:enter_account(); break; case3:delet_account(); break; case4:exitYH(); break; } cin.get(); } while(true); } void YH::enter_account() { intid; cout<<"请输入账户:"; cin>>id; intflag=1; inti=0; while((i { if(id==account[i]->get_id())flag=0;elsei++; //*****// } if(flag) { cout<<"账号不存在!"< cin.get(); //这里看看了 return ; // } cout<<"请输入密码:"; stringpassw; cin>>passw; if(passw!=account[i]->get_passwd())return; // account[i]->display();cin.get(); cin.get(); //多加一个cin.get();? intn; do{system("cls"); cout<<"请选择你要进行的操作:"< <<"2)取款"< <<"5)转账"< cin>>n; switch(n) { case1:account[i]->display();break; case2:account[i]->getmoney();save();break; case3:account[i]->savemoney();save();break; case4:account[i]->change_passwd();save();break; case5:transfer(i);save();break; case6:return ; // }cin.get();cin.get(); //多了cin.get()? } while(1); } void YH::built_account() { intid; stringnam; stringpassw; floatm; cout< cin>>id; cout< cin>>nam; cout< cin>>passw; cout< cin>>m; while(m<=0) { cout<<"请输入正确的数字!"< cin>>m; } consumer*acc=new consumer(id,nam,passw,m); account[acnum]=acc; cout<<"开户成功!"< acnum++; save(); cin.get(); return; // } //建立账户 void YH::delet_account() { intid; cout< cin>>id; intflag=1; inti=0; while((i { if(id==account[i]->get_id()){flag=0;} else{i++;} } if(flag) { cout<<"账号不存在!"< return; // } cout<<"请输入密码:"; string passw; cin>>passw; if(passw!=account[i]->get_passwd())return ; // for(int j=i;j { account[j]=account[j-1]; } account[acnum-1]=NULL; acnum--; cout<<"注销成功!"< save(); cin.get(); return ; // } void consumer::change_passwd() { stringpwd,repwd; cout<<"请输入新密码:"; cin>>pwd; cout<<"请再输入一次新密码:"; cin>>repwd; if(pwd!=repwd) cout<<"你输入的两次密码不同,请重新输入!"< passwd=pwd; cout<<"密码修改成功!"< } void consumer::getmoney() { floatm; charch; do { cout< cin>>m; while(m<=0) { cout<<"请输入正确的数字!"< cout<<"$>"; cin>>m; } if(money { cout<<"对不起,你的余额已不足!"< } else {money=money-m; cout< } cout<<"是否继续执行该操作:(Y/N)"< cout<<"$>"; cin>>ch; while(ch!='n'&&ch!='N'&&ch!='Y'&&ch!='y') { cout<<"$>"; cin>>ch; } }while(ch=='y'||ch=='Y'); } void consumer::savemoney() //存款 { floatc; charch; do { cout< cin>>c; while(c<=0) { cout<<"请输入正确的数字!"< cout<<"$>"; cin>>c; } money=money+c; cout<<"操作成功!"< cout<<"是否继续执行该操作:(Y/N)"< cout<<"$>"; cin>>ch; while(ch!='n'&&ch!='N'&&ch!='Y'&&ch!='y') { cout<<"$>"; cin>>ch; } }while(ch=='y'||ch=='Y'); } void consumer::display() {system("cls"); cout<<"*********************************"< cout<<"*"< cout<<"* 用户姓名: "< cout<<"* 账号: "< cout<<"* 余额: "< cout<<"*********************************"< } void YH::exitYH() { cout<<"感谢你的支持,欢迎下次光临!"< exit(0); } 九、效果截图 主界面 开户界面 登陆界面 账户信息界面 账户操作界面 账户取款界面 账户存款界面 账户修改密码界面 账户转账界面 注销界面 退出界面 十、收获和体会及不足 这是第二次做课程设计了,但开始自己读题时,思路不是很清晰,也不明白这个程序就是要结合所学数据结构的思想,要首先定义了多个数组,包含了储户的各类信息,如姓名,账号,金额等等,并利用文件将用户信息加以存储。开户时将输入的信息写入文件,存款和取款时对用户的存款加以处理并更新到文件中。 最后在分析好活期储蓄帐目管理的功能模块后,我开始编写代码,在代码调试的过成中,并不是一帆风顺的,这也是平常练的不够吧,经过几轮删删改改,终于做的差不多了,基本达到了老师的要求,但是还是有很多不足的地方。通过这次对银行管理系统的编写与调试,巩固了有关结构体的知识及其操作,锻炼了实际应用能力,同时对文件有了更进一步的了解及应用,明白文件的读写等相关知识。 在不断地进行书面设计和上机调试的过程中,认识到掌握设计程序的思路非常重要,要正确处理算法与语法的关系,算法是程序的核心,是灵魂,语法是外壳是工具。但是光掌握语法也是不够的,应该还要把重点放在解题思路上。这个实验也让我认识到自己知识的有限,与同学讨论的益处,培养了我的团队意识。 在这一周的课程设计中,我通过这次设计我也着实又感受了一次编程的乐趣,从中也学到了不少知识。书上和老师都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课程设计实践。 我感受最深的一点是:以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。现在编程感觉完全不同了。在编写一个程序之前,自己能够综合考虑各种因素, 首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。 通过这次课程设计逐渐提高了自己的程序设计和调试能力,通过上机实习,严整自己设计算法的正确性,学会了有效利用基本调试方法,查找出代码中的错误并且修27 改,我对参数的调用也进行了很多种尝试,已经能够相对准确的选择合适的参数形式来实现函数之间的数据传输交互了。 这次试验也让我看到了自己的不足,许多关于C++的一些比较具体的东西还不太懂,比方说指针。这次课程设计也让我知道了自己的能力只有经过不断地锻炼才能提高。