数据结构课程设计报告.docx
- 文档编号:12230889
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:33
- 大小:237.77KB
数据结构课程设计报告.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< < < < < p=p->link; } } voidWrite_to_File(LinkListL,char*str) { LinkListp; p=L->link; ofstreamoutf(str); while(p) { outf< < < < 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< "< 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< < < //将其添加到已借连接表中 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< < < return; } p=p->link; } p=R->link; while(p) { if(p->data.license_number==number) { cout< <<"收益"< cout< < < return; } p=p->link; } p=I->link; while(p) { if(p->data.license_number==number) { cout< <<"收益"< cout< < < 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<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)