数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(33页珍藏版)》请在冰点文库上搜索。
数据结构课程设计报告
算法与数据结构
课程设计报告
题目:
汽车租借公司的管理
班级:
学号:
姓名:
指导教师:
成绩:
2013年1月17日
一、题目
问题描述
设计数据结构及算法完成某个汽车租借公司日常工作的组织与管理。
该管理系统的基本管理对象为汽车,每台汽车用一个licensenumber进行唯一标识。
每个汽车存在三种可能状态:
·可以租借(availableforrent)
·已借(rented)
·修理中(inrepair)
其中在available队列中汽车应该依据汽车行驶过的路程进行排序,行驶路程最少的汽车排在最前面。
在rented队列中汽车应该依据其预期返回时间进行排序,排在最前的应该是预期最早返回的汽车。
课程设计目的
应用线性数据结构存储信息,并能够应用上面的基本操作实现事务管理。
基本要求
1用三个链表组织三种状态的汽车。
2能够实现租借的日常事务:
引入新车,租借,收费,修理等。
3租借收费应该根据汽车行驶的路程及借去的时间综合计算得出,路程收费标准如下:
1.低于100㎞收费20.00元。
2.100㎞以外的路程0.15元/㎞。
4汽车根据行驶的路程定期进行维护。
5还需实现辅助操作:
汽车查询,打印全部信息,计算并打印收入、成本及收益。
6管理系统应有完整的界面。
实现提示
主要集中在链表的基本操作上。
二、设计思想
设计三个链表,分别为A(可以租借),R(已借),I(修理中)。
链表的操作有初始化通用过InitList()实现,链表的插入有函数linkInsert(),链表的排序通过插入排序,建立一个新的排序链表,由于三个链表的排序关键字不同,所以设计了Run_Sort()(按行驶路程排序,链表A)、Time_Sort()(按返回时间排序,链表I,R)函数实现,对三个链表进行排序。
使用Newday()函数模拟时间过去一天,返回时间减1。
为了使导入数据方便,数据的导入方式为文件导入,三种状态的车辆信息分别放在afr.txt(可以租借),rd.txt(已借),ir.txt(修理中)里面,打开程序后遍自动导入。
同时可以在这三个文件里经行修改管理。
引入新车:
在链表A的第一个结点前添加新节点。
租借:
将链表A的第一个结点删除,按返还时间排序后添加到链表R中。
收费:
被租借的车按一定的计算方法求的费用。
修理:
在链表A中,判断是否行驶路程超过一定值,如超过,则删除结点,添加到链表I的尾部。
基本功能包括:
1.添加新车2.租借3.修理4.查询车辆
5.显示所有车辆状态6.显示财务状况7.新的一天
结构关系:
enum{AFR,RD,IR}CarKind;//{可以租借,已借,修理中}
头文件:
InitList(LinkList&L)//构造一个空的带头结点的链表
ListInsert(LinkListL,inti,ElemTypee)//L为带头结点的单链表的头指针,本算法
//在链表中第i个结点之前插入新的元素e
Run_Sort(LinkListL,ElemTypee)//按路程查找e所排的位置序列,并返回序列
Time_Sort(LinkListL,ElemTypee)//按返回时间查找e所排的位置序列,并返回序列
ListDelete(LinkListL,ElemType&e)//删除以L为头指针(带头结点)的单链表中第1个结点,并赋值给e
Display(LinkListL)//打印链表信息
Write_to_File(LinkListL,char*str)//将链表写入到名为str的文件中
Read_from_File(LinkListL,char*str,CarKindk)//从名为str的文件中读取链表
主文件:
AddNewCar(LinkListL)//添加新车,在A中添加新节点
RentCar(LinkListA,LinkListR)//租车,从A中删除,添加到R
Repair(LinkListA,LinkListI)//修理,从A中删除,添加到I
Search(LinkListA,LinkListR,LinkListI)//在三个链表中查找
DisplayAll(LinkListA,LinkListR,LinkListI)//一次打印三个链表的信息
Financial(LinkListA,LinkListR,LinkListI)//财务状况函数
NewDay(LinkListA,LinkListR,LinkListI)//函数目的在于将期限减一,模拟过去一天。
如果时间为0,则将其从已借或修理中删除。
添加到可借链表中。
三、软件结构图及流程图
软件结构图:
流程图:
四、测试与分析
输入:
5
输出:
状态标识号行驶路程收益返回时间
01000
02000
0380000
0490000
1520202
1620202
1730203
1840204
29200351
210500802
211100203
212200354
输入:
1135
输出:
状态标识号行驶路程收益返回时间
013000
01000
02000
0380000
0490000
1520202
1620202
1730203
1840204
29200351
210500802
211100203
212200354
输入:
2110
输出:
已借车辆:
1520202
1620202
1730203
1840204
1190014010
输入:
35
输出:
状态标识号行驶路程收益返回时间
013000
02000
1520202
1620202
1730203
1840204
1190014010
29200351
210500802
211100203
212200354
2380005
2490005
输入:
48
输出:
状态标识号行驶路程收益返回时间
1840204
输入:
6
输出:
标志号收入
130
20
520
620
720
820
1140
935
1080
1120
1235
30
40
输入:
7
输入:
5
输出:
状态标识号行驶路程收益返回时间
013000
02000
09200350
1520201
1620201
1730202
1840203
119001409
210500801
211100202
212200353
2380004
2490004
输入:
0
五、源程序
LinkList.h
#include
#include
#include
#include
#include
#include
typedefintStatus;
typedefenum{AFR,RD,IR}CarKind;
//{可以租借,已借,修理中}
#defineOK1
#defineERROR0
#defineOVERFLOW1
#definenull0
typedefstruct
{
CarKindkind;//汽车状态
intlicense_number;//汽车标识号
intdistance_run;//行驶路程
floatincome;//此车的总收入费
inttime;//租借时间,以天为单位
}ElemType;
typedefstructLNode
{
ElemTypedata;//数据域
structLNode*link;//指针域
}LNode,*LinkList;
StatusInitList(LinkList&L)
{
L=(LinkList)malloc(sizeof(ElemType));
if(!
L)
exit(OVERFLOW);
L->link=null;
returnOK;
}
StatusListInsert(LinkListL,inti,ElemTypee)
{
LinkListp,s;
intj=0;
p=L;
while(p&&j{
p=p->link;
++j;
}
if(!
p||j>i-1)//i大于表长或者小于1
{
cout<<"节点位置错误"<returnERROR;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->link=p->link;
p->link=s;//插入
returnOK;
}
StatusRun_Sort(LinkListL,ElemTypee)
{
LinkListp;
intj=1;
p=L->link;
while(p)
{
if(p->data.distance_run>e.distance_run)
returnj;
p=p->link;
++j;
}
returnj;
}
StatusTime_Sort(LinkListL,ElemTypee)
{
LinkListp;
intj=1;
p=L->link;
while(p)
{
if(p->data.time>=e.time)
returnj;
p=p->link;
j++;
}
returnj;
}
StatusListDelete(LinkListL,ElemType&e)
{
LinkListp,q;
intj=0;
p=L;
if(!
(p->link))
returnERROR;
q=p->link;
p->link=q->link;
e=q->data;
free(q);
returnOK;
}
voidDisplay(LinkListL)
{
LinkListp;
p=L->link;
while(p)
{
cout<data.kind
<data.license_number
<data.distance_run
<data.income
<data.time<p=p->link;
}
}
voidWrite_to_File(LinkListL,char*str)
{
LinkListp;
p=L->link;
ofstreamoutf(str);
while(p)
{
outf<data.license_number
<data.distance_run
<data.income
<data.time;
p=p->link;
}
outf.close();
}
voidRead_from_File(LinkListL,char*str,CarKindk)
{
ElemTypep;
inti=1;
ifstreaminf(str);
while(inf)
{
inf>>setw(10)>>p.license_number
>>setw(10)>>p.distance_run
>>setw(10)>>p.income
>>setw(10)>>p.time;
p.kind=k;
ListInsert(L,i,p);
i++;
}
inf.close();
}
CarRent.cpp
#include
#include"linklist.h"
charafr[]="AFR.txt";
charrd[]="RD.txt";
charir[]="IR.txt";
voidAddNewCar(LinkListL)//添加新车
{
LinkLists;
CarKindk=AFR;
intI;
s=(LinkList)malloc(sizeof(LNode));
cout<<"输入汽车编号:
";
cin>>I;//应当设计判断是否冲突
s->data.kind=k;
s->data.distance_run=0;
s->data.income=0;
s->data.license_number=I;
s->data.time=0;
s->link=L->link;
L->link=s;
//因为链表中是按行驶路程排序,新车的行驶路程为0,所以加在第一个
}
voidRentCar(LinkListA,LinkListR)
{
LinkListp,s;
intnumber=0,day=0;
floatthis_income;
p=A->link;
cout<<"目前可租借车辆有:
"<while(p)
{
cout<data.license_number<<"号车"<<"行驶路程为:
"<data.distance_run<p=p->link;
}
cout<<"选择需要租借的编号:
";
cin>>number;
p=A->link;
for(;p->link;p=p->link)
{
if(p->link->data.license_number==number)
{
s=p->link;
p->link=p->link->link;//从链表A中删除,将该节点复制给s
cout<<"输入需要租借的天数:
";
cin>>day;
s->data.kind=RD;
s->data.distance_run+=day*90;//按每天90㎞算
if(day*90<100)
this_income=20;
else
this_income=20+(day*90-100)*0.15;
s->data.income+=this_income;
s->data.time=day;
cout<data.kind<data.license_number<<data.distance_run<data.income
<data.time<//将其添加到已借连接表中
ListInsert(R,Time_Sort(R,s->data),s->data);
cout<<"已借车辆为:
"<Display(R);
cout<//Write_to_File(A,afr);
//Write_to_File(R,rd);
return;
}
}
cout<"<}
voidRepair(LinkListA,LinkListI)//目前设计的是手动修理,可在NewDay()函数中设计自动完成修理
{
LinkLista,s,i;
a=A->link;
i=I;
while(a->link&&(a->link->data.distance_run<500))//设计达到500㎞就送修
a=a->link;//行驶路程是从小到大,所以一找到大于500㎞
s=a->link;//的车辆,就把A链表断开,成为两部分
a->link=null;//一部分是小于500的(a),另一部分是大于500的(s)//又I链表中是以修理返回时间排序的,且修理时间都初始化为5天
while(i->link)//因此s排在I链表的最后
i=i->link;
i->link=s;
while(s)
{
s->data.time=5;//每次修理5天
s->data.kind=IR;
s=s->link;
}
//Write_to_File(A,afr);
//Write_to_File(I,ir);
}
voidSearch(LinkListA,LinkListR,LinkListI)
{
LinkListp;
intnumber;
cout<<"输入车辆编号:
";
cin>>number;
p=A->link;//三个链表中一次查找
while(p)
{
if(p->data.license_number==number)
{
cout<<<"收益"<cout<data.kind<data.license_number
<data.distance_run<data.income
<data.time<return;
}
p=p->link;
}
p=R->link;
while(p)
{
if(p->data.license_number==number)
{
cout<<<"收益"<cout<data.kind<data.license_number
<data.distance_run<data.income
<data.time<return;
}
p=p->link;
}
p=I->link;
while(p)
{
if(p->data.license_number==number)
{
cout<<<"收益"<cout<data.kind<data.license_number
<data.distance_run<data.income
<data.time<return;
}
p=p->link;
}
cout<<"无此车信息"<}
voidDisplayAll(LinkListA,LinkListR,LinkListI)
{
cout<Display(A);
cout<Display(R);
cout<Display(I);
cout<}
voidFinancial(LinkListA,LinkListR,LinkListI)//财务状况函数
{//可添加固有成本,可变成本等数据丰富函数
LinkListp;
floatsum=0;
cout<p=A->link;
while(p)
{
sum+=p->data.income;
cout<data.license_number<d