数据结构.docx
- 文档编号:9676412
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:30
- 大小:216.67KB
数据结构.docx
《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构
一、停车场管理
1.需求规格说明
(1)问题描述:
本题需要模拟停车场及便道,有车来时如果停车场未停满,则进入停车场,否则进入便道等候,直到停车场有车出来再进停车场。
收费按车辆进入停车场的时间收费,便道上的时间不计费,因此计算停车时间时应从车辆进入停车场开始算起。
2.总体分析与设计
(1)设计思想:
停车场用栈模拟,便道用队列模拟。
另外由于停车场内的车辆出来时,在它之后的车辆必须先出停车场,等到这辆车出去时,再按原顺序进入停车场,因此还需要一个临时的栈来存储这些车辆的信息。
首先需要设置栈的最大size表示停车场的最大停车量。
然后有车来时首先检查栈是否已满,如果没有满就将车加入栈,如果满了就加入队列。
有车出停车场时需要将车辆信息从栈中删除,并记下出栈时间,计算费用。
同时要将队列中的队头删除,并加入到栈中,并记下此时的时间为车辆进入停车场时间。
(2)设计表示:
Car
Operator==Licence相等表示同一辆车
CStringLicence;车牌号
CTimectime;时间
(3)详细设计表示:
进出
否
否是
否是
3.编码
编程过程中遇到的主要问题是MFC的使用,其中主要涉及到CtrlList控件的应用,通过查找资料了解了该控件的基本用法。
4.程序及算法分析
5.小结
代码写的不是很规范,不是严格按照C++面向对象的思想。
6.附录
核心代码:
classCar
{
public:
Car(){}
Car(CStrings,CTimet){
Licence=s;
ctime=t;}
booloperator==(Cara){
if(a.Licence==Licence)
returntrue;
elsereturnfalse;}
CStringLicence;
CTimectime;
};
voidCParkingManagementDlg:
:
OnClickedButton2()
{
//入停车场
UpdateData();
CTimetime=CTime:
:
GetCurrentTime();
Carc(m_licence,time);
CStringlicence=c.Licence;
if(m_licence=="")
MessageBox(_T("请输入车牌号!
"));
elseif(parking.IsIn(c))
MessageBox(_T("车辆已在停车场!
"));
elseif(road.Search(c))
MessageBox(_T("车辆已在便道!
"));
elseif(!
parking.IsFull())//进入停车场
{
parking.Add(c);//车辆加入栈
Showparking();//ctrllist显示车辆信息
m_licence="";
UpdateData(false);
CStringstr;
str="进入停车场";
str=c.Licence+str;
SetDlgItemText(IDC_EDIT3,str);
SetDlgItemText(IDC_EDIT5,_T(""));
}
else//进入便道
{
road.Add(c);
Showroad();
m_licence="";
UpdateData(false);
}
}
voidCParkingManagementDlg:
:
OnClickedButton3()
{
//出停车场
//TODO:
在此添加控件通知处理程序代码
UpdateData();
CTimetime=CTime:
:
GetCurrentTime();;
CarCout(m_licence,time),Cin;
CStringlicence=Cout.Licence;
if(m_licence=="")
MessageBox(_T("请输入车牌号!
"));
elseif(parking.IsIn(Cout))
{
Stack
Cartemp;
while(!
(temp==Cout))
{
//车进入临时通道
parking.Delete(temp);
temproad.Add(temp);
}
temproad.Delete(Cin);
while(!
temproad.IsEmpty())
{
//将临时通道的车开进parking
temproad.Delete(temp);
parking.Add(temp);
}
if(!
road.IsEmpty())
{
road.Delete(temp);
temp.ctime=time;//更改便道上的车进入停车场的时间为当前时间
parking.Add(temp);
}
Showparking();
Showroad();
//计算车辆停车时间
CTimeSpanparkingtime;
parkingtime=Cout.ctime-Cin.ctime;
CStringptime;
ptime.Format(_T("%02d:
%02d:
%02d"),parkingtime.GetHours(),parkingtime.GetMinutes(),parkingtime.GetSeconds());
Income(parkingtime);
CStringstr;
str="停车时间:
";
str=str+ptime;
SetDlgItemText(IDC_EDIT5,str);
str="出停车场";
str=m_licence+str;
SetDlgItemText(IDC_EDIT3,str);
}
elseif(!
parking.IsIn(Cout))
MessageBox(_T("车不在停车场内!
"));
}
二、个人电话号码查询
1.需求规格说明
根据用户输入的信息(例如姓名等)进行快速查询,在外存上,用文件保存电话号码信息;在内存中,设计数据结构存储电话号码信息;提供查询功能:
根据姓名实现快速查询;提供其他维护功能:
例如插入、删除、修改等。
2.总体分析与设计
(1)设计思想:
由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息,所以电话号码信息采用文件的形式存放到外存中。
在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以设计如下结构类型的数组来接收数据:
constintmax=10;
structTeleNumber
{
stringname;//姓名
stringphoneNumber;//固定电话号码
stringmobileNumber;//移动电话号码
stringemail;//电子邮箱
}Tele[max];
(2)设计表示:
TeleNumber
CStringname;//姓名
CStringphoneNumber;//固定电话号码
CStringmobileNumber;//移动电话号码
CStringemail;//电子邮箱
Operator==//姓名相等
Operator>
Operator<
3.编码
主要问题是文件的读取,要从文件中读取姓名,固话,移动电话,邮箱并初始化TeleNumber对象。
通过查找资料,了解了fstream流的基本应用。
4.程序及算法分析
5.小结
此题中用到的是二叉搜素树,但在某些情况下,二叉搜素树会不平衡,搜索话费的时间肯能比用一般的方法还要长,因此要考虑二叉搜素树是否平衡,为了解决这个问题,可以用AVL树。
6.附录
核心代码:
#pragmaonce
classTeleNumber
{
public:
TeleNumber(){}
TeleNumber(CStringn,CStringp,CStringm,CStringe)
{
name=n;
phoneNumber=p;
mobileNumber=m;
email=e;
}
booloperator==(TeleNumbert)
{
if(name==t.name)
returntrue;
else
returnfalse;
}
booloperator!
=(TeleNumbert)
{
return!
(*this==t);
}
booloperator<(TeleNumbert)const
{
if(name returntrue; else returnfalse; } booloperator>(TeleNumbert)const { if(name>t.name) returntrue; else returnfalse; } CStringname;//姓名 CStringphoneNumber;//固定电话号码 CStringmobileNumber;//移动电话号码 CStringemail;//电子邮箱 }; //读取文件 voidCPhoneSearchDlg: : OnBnClickedButton7() { //打开 //TODO: 在此添加控件通知处理程序代码 CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("ALLFile(*.txt)|*.*"),NULL,0,TRUE); if(dlg.DoModal()! =IDOK) { return; } CStringstr=dlg.GetPathName(); wifstreamReadFile; inti=0; wchar_tline[50]; CStringtemp; TeleNumbertele; ReadFile.open(str); if(ReadFile.fail())return; ReadFile.imbue(locale("chs")); //ReadFile.getline(line,50,'\n'); while(! ReadFile.eof()) { ReadFile.getline(line,50,'\n');//逐行读入 //提取姓名 i=0; temp.Empty(); while(line[i]! ='') { temp=temp+line[i]; i++; } tele.name=temp; while(line[i]=='') { i++; } //提取固定电话 temp.Empty(); while(line[i]! ='') { temp=temp+line[i]; i++; } tele.phoneNumber=temp; while(line[i]=='') { i++; } //提取移动电话 temp.Empty(); while(line[i]! ='') { temp=temp+line[i]; i++; } tele.mobileNumber=temp; while(line[i]=='') { i++; } //提取邮箱 temp.Empty(); while(line[i]! ='\n') { temp=temp+line[i]; i++; } tele.email=temp; try { Tele.Insert(tele); } catch(BadInput) { MessageBox(_T("重复! ")); } } 三、排序应用 1.需求规格说明 编写程序,读出文件中的内容,再按挑房的先后次序排队后将排序号和姓名以文本方式存放到文件A2.txt中。 排队原则: 先按职称排,同职称按分房工龄排,同工龄按年龄排。 2.总体分析与设计 (1)设计思想: 用一个对象数组存储职工信息,然后用快速排序算法排序。 对于“先按职称排,同职称按分房工龄排,同工龄按年龄排”的排序规则,用重载>和<操作符的方法。 (2)设计表示: Node CStringname; intnumber; intwork_age; intage; operator> operator< 3.编码 对于运算符重载做得比较复杂。 4.程序及算法分析 排序前: 排序后: 5.小结 写入文件是,用的是把数据先存入一个CString的字符串中,在数据量大时不合理。 写入文件格式不是很好。 6.附录 核心代码: #include"stdafx.h" classNode { public: CStringname; intnumber; intwork_age; intage; booloperator>(Noden)//重载>操作符按先按职称排,同职称按分房工龄排,同工龄按年龄排 { if(number>n.number) returntrue; elseif(number==n.number) { if(work_age>n.work_age) returntrue; elseif(work_age==n.work_age) { if(age>n.age) returntrue; elsereturnfalse; } elsereturnfalse; } else returnfalse; } booloperator<(Noden) { if(number returntrue; elseif(number==n.number) { if(work_age returntrue; elseif(work_age==n.work_age) { if(age returntrue; elsereturnfalse; } elsereturnfalse; } else returnfalse; } } //读取文件; voidCOrderDlg: : OnBnClickedButtonOpen() { //TODO: 在此添加控件通知处理程序代码 CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("ALLFile(*.txt)|*.*"),NULL,0,TRUE); if(dlg.DoModal()! =IDOK) { return; } row=0; CStringstr=dlg.GetPathName(); wifstreamReadFile; inti=0; intn=0; wchar_tline[50]; CStringtemp; ReadFile.open(str); if(ReadFile.fail())return; ReadFile.imbue(locale("chs")); ReadFile.getline(line,50,'\n');//逐行读入 while(! ReadFile.eof()) { ReadFile.getline(line,50,'\n');//逐行读入 //提取姓名 i=0; temp.Empty(); while(line[i]! ='') { temp=temp+line[i]; i++; } node[n].name=temp; while(line[i]=='') { i++; } //提取编号 temp.Empty(); while(line[i]! ='') { temp=temp+line[i]; i++; } node[n].number=_ttoi(temp); while(line[i]=='') { i++; } //提取工龄 temp.Empty(); while(line[i]! ='') { temp=temp+line[i]; i++; } node[n].work_age=_ttoi(temp); while(line[i]=='') { i++; } //提取年龄 temp.Empty(); while(line[i]! ='\n') { temp=temp+line[i]; i++; } node[n].age=_ttoi(temp); n++; row++; } Show(); } //快速排序算法 voidCOrderDlg: : QuickSort(Node*a,intn) {//对a[0: n-1]进行快速排序. //要求a[n]必须有最大关键值. quickSort(a,0,n-1); } voidCOrderDlg: : quickSort(Nodea[],intl,intr) {//Sorta[l: r],a[r+1]haslargevalue. if(l>=r)return; inti=l,//从左到右的游标 j=r+1;//从右到左的游标 Nodepivot=a[l];//支点 //swapelements>=pivotonleftside //withelements<=pivotonrightside while(true) { do{//find>=elementonleftside i=i+1; }while(a[i] do{//find<=elementonrightside j=j-1; }while(a[j]>pivot); if(i>=j)break;//swappairnotfound //Swap(a[i],a[j]); Nodetemp; temp=a[i]; a[i]=a[j]; a[j]=temp; } //placepivot a[l]=a[j]; a[j]=pivot; quickSort(a,l,j-1);//sortleftsegment quickSort(a,j+1,r) } 四、火烧连营问题 1.需求规格说明 “火烧连营”是三国演义中的著名典故之一广为流传,假定文本文件c1.txt是火烧连营中的军营分布图,每个字符A代表一个营帐,营帐是可燃物,其他字符代表不可燃的空白地段,文件共有40行70列,请你编写程序,读入该文件的内容,再从键盘输入任意点的x和y值(x<70,y<40)作为着火点,“火烧连营”后,被燃烧的营帐标上字符’X’,并把整个结果输出到文件c2.txt中。 2.总体分析与设计 (1)设计思想: 用一个char型二维数组存储文件中的40*70的数据,然后根据这个二维数组确定要点火的点,并将这个点放入到一个栈,并判断其周围的点是否是A,是A的话则换成X并将这个点放入栈中,直到栈空为止。 3.编码 对于边界的处理类比书上的迷宫问题,加一圈围墙,而对于每一行的最后在加上一个换行符“\n”。 另外,在读取文件的时候由于没有考虑到文本本来就有换行符,用的Get函数一个个读取,每一行都多读了一个换行符,导致出错。 4.程序及算法分析 5.小结 在程序设计时考虑不是很严密,导致出现很多问题。 6.附录 核心代码: //fire.h #include"stack.h" #include usingnamespacestd; classPosition { friendclassFire; private: intx; inty; }; classFire { public: Fire() { for(inti=0;i<72;i++)//设置围墙 { tent[0][i]='X'; tent[41][i]='X'; } for(intj=0;j<42;j++) { tent[j][0]='X'; tent[j][71]='\n'; } } voidOpenfile(); voidFireposition(intxx,intyy); voidSave(); private: voidFireUp(Position&p) { if(tent[p.x][p.y+1]=='A') { ten
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构