数据结构课程设计报告(附代码)
数据结构课程设计报告
一、实训目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握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<iostream>
#include<string>
#include<stdlib.h>
#include<fstream>
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<<acnum<<" "; //输出数据到文件里
for(;n<acnum;n++) //for语句,初始化n=0提前
{outfile<<account[n]->ID<<"";
outfile<<account[n]->money<<"";
outfile<<account[n]->name<<"";
outfile<<account[n]->passwd<<""; //指针获取各参数值
}
outfile.close();
}
void YH::load() //定义文件打开函数
{ifstreaminfile("bankdat.dat",ios::in); /*格式:从磁盘读文件
ifstream 识别字("文件名")*/
if(!infile)
{
cerr<<"读取错误,无资料!"<<endl;
return; //
}
int n=0;
int id,m;
string nam,passw; //定义变量id,m,nam,passw
infile>>acnum;
for(;n<acnum;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<<"读取资料正常!"<<endl;
}
void YH::transfer(int x) //定义转账函数,带一个参数
{int id;
cout<<"请输入账号:";
cin>>id;
int flag=1;
int i=0;
while((i<acnum)&&(flag))
{
if(id==account[i]->get_id())flag=0;elsei++;
}
if(flag)
{
cout<<"账号不存在!"<<endl<<endl; //看看是不是多了<<endl
return ; //
}
float b;
cout<<endl<<"请输入你要转账的金额:";
cin>>b;
while(b<=0)
{
cout<<"请输入正确的数字!"<<endl;
cout<<"$>";
cin>>b;
}
if(account[x]->get_money()<b)
cout<<"对不起,金额不够!!"<<endl;
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<<"****************** 银行管理系统****************"<<endl;
cout<<"1)用户开户"<<endl<<"2)登陆账户"<<endl
<<"3)注销账户"<<endl<<"4)退出系统"<<endl;
cout<<"**************************************************"<<endl;
cout<<endl<<"请你输入相应的操作序号进行操作:"<<endl; //多了endl?
cout<<"$>";
cin>>n;
while(n<1||n>4)
{
cout<<"请输入正确的操作序号!"<<endl;
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<acnum)&&(flag))
{
if(id==account[i]->get_id())flag=0;elsei++; //*****//
}
if(flag)
{
cout<<"账号不存在!"<<endl<<endl; //多加一个<<endl?
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<<"请选择你要进行的操作:"<<endl<<"1)查看信息"<<endl
<<"2)取款"<<endl<<"3)存款"<<endl<<"4)修改密码"<<endl
<<"5)转账"<<endl<<"6)返回"<<endl;
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<<endl<<"请输入开户号:";
cin>>id;
cout<<endl<<"请输入开户人姓名:";
cin>>nam;
cout<<endl<<"请输入开户密码:";
cin>>passw;
cout<<endl<<"请输入存入金额:";
cin>>m;
while(m<=0)
{
cout<<"请输入正确的数字!"<<endl;
cin>>m;
}
consumer*acc=new consumer(id,nam,passw,m);
account[acnum]=acc;
cout<<"开户成功!"<<endl; //再加一个<<endl
acnum++;
save();
cin.get();
return; //
} //建立账户
void YH::delet_account()
{
intid;
cout<<endl<<"请输入你要注销的账户号: ";
cin>>id;
intflag=1;
inti=0;
while((i<acnum)&&(flag))
{
if(id==account[i]->get_id()){flag=0;}
else{i++;}
}
if(flag)
{
cout<<"账号不存在!"<<endl<<endl; //多了<<endl?
return; //
}
cout<<"请输入密码:";
string passw;
cin>>passw;
if(passw!=account[i]->get_passwd())return ; //
for(int j=i;j<acnum;j++)
{
account[j]=account[j-1];
}
account[acnum-1]=NULL;
acnum--;
cout<<"注销成功!"<<endl<<endl;
save();
cin.get();
return ; //
}
void consumer::change_passwd()
{
stringpwd,repwd;
cout<<"请输入新密码:";
cin>>pwd;
cout<<"请再输入一次新密码:";
cin>>repwd;
if(pwd!=repwd)
cout<<"你输入的两次密码不同,请重新输入!"<<endl;
passwd=pwd;
cout<<"密码修改成功!"<<endl;cin.get();
}
void consumer::getmoney()
{
floatm;
charch;
do
{
cout<<endl <<"你要取多少钱:"<<"$>"<<endl; //多了endl?
cin>>m;
while(m<=0)
{
cout<<"请输入正确的数字!"<<endl;
cout<<"$>";
cin>>m;
}
if(money<m)
{
cout<<"对不起,你的余额已不足!"<<endl;
}
else
{money=money-m;
cout<<endl <<"操作成功!"<<endl; //多了endl?
}
cout<<"是否继续执行该操作:(Y/N)"<<endl;
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<<endl <<"你要存多少钱:"<<"$>"<<endl; //多了endl?
cin>>c;
while(c<=0)
{
cout<<"请输入正确的数字!"<<endl;
cout<<"$>";
cin>>c;
}
money=money+c;
cout<<"操作成功!"<<endl;
cout<<"是否继续执行该操作:(Y/N)"<<endl;
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<<"*********************************"<<endl;
cout<<"*"<<endl;
cout<<"* 用户姓名: "<<name<<endl;
cout<<"* 账号: "<<ID<<endl;
cout<<"* 余额: "<<money<<endl;
cout<<"*********************************"<<endl;
}
void YH::exitYH()
{
cout<<"感谢你的支持,欢迎下次光临!"<<endl;
exit(0);
}
九、效果截图
主界面
开户界面
登陆界面
账户信息界面
账户操作界面
账户取款界面
账户存款界面
账户修改密码界面
账户转账界面
注销界面
退出界面
十、收获和体会及不足
这是第二次做课程设计了,但开始自己读题时,思路不是很清晰,也不明白这个程序就是要结合所学数据结构的思想,要首先定义了多个数组,包含了储户的各类信息,如姓名,账号,金额等等,并利用文件将用户信息加以存储。开户时将输入的信息写入文件,存款和取款时对用户的存款加以处理并更新到文件中。
最后在分析好活期储蓄帐目管理的功能模块后,我开始编写代码,在代码调试的过成中,并不是一帆风顺的,这也是平常练的不够吧,经过几轮删删改改,终于做的差不多了,基本达到了老师的要求,但是还是有很多不足的地方。通过这次对银行管理系统的编写与调试,巩固了有关结构体的知识及其操作,锻炼了实际应用能力,同时对文件有了更进一步的了解及应用,明白文件的读写等相关知识。
在不断地进行书面设计和上机调试的过程中,认识到掌握设计程序的思路非常重要,要正确处理算法与语法的关系,算法是程序的核心,是灵魂,语法是外壳是工具。但是光掌握语法也是不够的,应该还要把重点放在解题思路上。这个实验也让我认识到自己知识的有限,与同学讨论的益处,培养了我的团队意识。
在这一周的课程设计中,我通过这次设计我也着实又感受了一次编程的乐趣,从中也学到了不少知识。书上和老师都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课程设计实践。
我感受最深的一点是:以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。现在编程感觉完全不同了。在编写一个程序之前,自己能够综合考虑各种因素,
首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
通过这次课程设计逐渐提高了自己的程序设计和调试能力,通过上机实习,严整自己设计算法的正确性,学会了有效利用基本调试方法,查找出代码中的错误并且修27 改,我对参数的调用也进行了很多种尝试,已经能够相对准确的选择合适的参数形式来实现函数之间的数据传输交互了。
这次试验也让我看到了自己的不足,许多关于C++的一些比较具体的东西还不太懂,比方说指针。这次课程设计也让我知道了自己的能力只有经过不断地锻炼才能提高。
数据结构课程设计报告(附代码)相关推荐
- c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...
<数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...
- c语言数据结构课程设计电梯,数据结构课程设计报告(模拟电梯).doc
数据结构课程设计报告(模拟电梯) 山东理工大学计算机学院 课 程 设 计 (数据结构) 班 级姓 名学 号 指导教师 二〇一二年一月十日 课程设计任务书及成绩评定 课题名称电 梯 模 拟 Ⅰ.题目的目 ...
- 2018数据结构课程设计报告
目录 一.引言 a) 编写目的 b) 项目背景 c) 术语说明 d) 参考资料 二.任务概述 a) 目标 b) 运行环境 c) 需求概述 d) 条件与限制 三. 总体设计 a) 处理流程 b) 总体结 ...
- 数据结构课程设计报告-职工信息管理系统
"数据结构"课程设计报告 系 (院): 信息工程学院 设计题目: 员工管理系统 专业班级: 计算机科学与技术1401B 小 ...
- 【数据结构课程设计报告】电话号码查询系统(Java实现)
数据结构课程设计报告 电话号码查询系统 数据结构课程设计报告 一.需求分析 二.系统功能划分及设计 1.存储结构设计 2.系统的功能架构设计 3.模块设计 3.代码实现 一.需求分析 问题描述:路径规 ...
- java万年历设计报告_JAVA《万年历系统》课程设计报告附源码.doc
JAVA<万年历系统>课程设计报告附源码 学号<> 课程设计报告 万年历系统专业:计算机科学与技术班级:姓名:学号:指导教师:成绩: 计算机与信息工程系 2014年6月6日目录 ...
- 万年历java课程设计报告_java《万年历系统》课程设计报告附源码.doc
java<万年历系统>课程设计报告附源码.doc 学号<面向对象程序设计>课程设计报告题目:万年历系统专业:计算机科学与技术班级:姓名:学号:指导教师:成绩:计算机与信息工程系 ...
- 计算机课程设计收费管理系统,数据结构课程设计报告---收费停车场管理系统
数据结构课程设计报告---收费停车场管理系统 (20页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 XX大学计算机与电子 信息学院< ...
- c语言实现一元多项式程序报告设计,数据结构课程设计报告一元多项式的计算..doc...
数据结构课程设计报告一元多项式的计算. 题目:一元多项式的计算 --链表 摘要(题目) 一元多项式计算 任务:能够按照指数降序排列建立并输出多项式: 能够完成两个多项式的相加.相减,并将结果输入: 目 ...
最新文章
- nginx 配置信息
- SQL Server创建视图——视图的作用
- 使用python实现knn算法_使用python实现knn算法
- 【机器学习】怎样将Embedding融入传统机器学习框架?
- SAP UI5 webIDE good build and bad build
- 地图漫游功能的具体体现_一卡通考勤门禁管线系统主要模块功能说明
- aix么把占用的端口释放掉_AIX 环境下Telnet返回提示所有端口已经被占用,处理方法...
- L2-006 树的遍历
- 判断按键值_Pygame(九)按键事件(2)
- WebsSocket
- Spring Boot 学习之表单验证
- codeforces test #12 C. Subsequences 树状数组统计
- 字符串太长 pep8_Python f字符串– PEP 498 –文字字符串插值
- react取消捕获_React生命周期
- 梦记录:1204(梦到观世音菩萨像)
- eXeScope 提取.exe/.dll中的图片资源
- vue3.0 关闭 eslint
- 使用SpringBoot+RabbitMQ框架集成例程
- CodeForces 645D Robot Rapping Results Report
- Beer-Lambert Law and LAI
热门文章
- coe_xfr_sql_profile.sql和coe_load_sql_profile.sql
- Unity学习笔记--超简单:两个游戏对象直接用线连接(UI和世界坐标下均可)
- SASS的概念和使用
- java架构设计图,不止面试题,笔记源码统统都有
- 微拍堂深耕线上文玩平台,推动文玩艺术品行业健康发展
- 【跟彤砸学编程】—— 第一课
- centos7 通过git连接GitHub仓库
- 北理python复试_北理复试及其初试超强总结(转)
- Web 开发初学者指南
- 1、R5为ISP,只能进行ip地址配置:其所有接口配置为公有ip地切 2、R1与R5间使用PPP的PAP认证,R5为主认证方;R2与R5间使用PPP的chap认证 R5为主认证方;R3与R5间使用H