1、沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:软件综合课程设计 课程设计题目:车辆调度管理软件设计 院(系):计算机学院 专 业:计算机科学与技术 班 级:84010101 学 号:5 姓 名:叶伦灼 指导教师:丛丽晖 完毕日期:2023年9月9日 目 录 第1章 需求分析 1 1.1 问题内容与规定 1 1.2 问题分析与假设 1 第2章 概要设计 2 2.1 数据库逻辑模型设计 2 2.1.1 数据库E—R图 2 2.1.2 数据库表格设计 3 2.2 系统
2、功能模块 4 第3章 具体设计 5 3.1 客户功能模块 5 3.2 管理人员功能模块 6 3.2.1车辆信息更新 6 3.2.2车辆信息的添加与删除 7 3.2.3司机信息的添加与删除 8 第4章 调试使用 10 4.1 客户功能 10 4.2 管理员功能 11 4.2.1 车辆及司机信息的增删 11 4.2.2 车辆信息的修改 12 参考文献 14 附 录(程序清单) 15 第1章 需求分析 1.1 问题内容与规定 设计一个简朴的车辆调度管理程序,可实现对不同的车辆、不同规定、不同时间的调度算法。 1) 建立车辆信息
3、表; 2) 实现对车辆信息的插入、修改、查询、删除功能; 3) 界面要优化,直观、大方、美观; 4) 实现针对不同任务、不同时间的调度分派算法; 5) 独立完毕系统的设计、编码和调试; 6) 按照课程设计规范书写课程设计报告。 1.2 问题分析与假设 车辆调度就是根据客户的需求,合理地派遣出相应的车辆。假设每派遣出一辆车,需要记录下该车的特有信息以及使用该车的客户信息。一辆车在被使用后,不能在重叠的时间段被其他客户使用。而客户在选择车辆时,除了可以了解车辆自身的属性外,也有权了解驾驶该车辆驾驶员的信息,比如驾驶员的性别、驾龄、年龄。而作为车辆调度员,应当做到对车辆信息的查看、增
4、删、及时更新等操作。由于每一辆车都有一个专属司机,所以每新增一辆,都必须提供一个已存在的司机信息,假如添加了一个错误的司机,系统应当可以提供提醒现提供一个对的的司机信息。同理,假如想要注销掉某个司机的信息,一方面要取消掉他与配对车辆的关系,然后才干进行注销。 分析了客户与车辆、司机与车辆的关系,有助于我们建立合理的表格,并且在设计程序时考虑到更多切合实际的应用。 本次课设所需要的表格将在SQL 2023中建立。使用Microsoft Visual C++编写代码、进行对数据库的读写等操作。ODBC将作为搭载数据库与VC++的平台。 第2章 概要设计 2.1 数据库逻辑模型设计 2
5、1.1 数据库E—R图 汽车调度管理系统的E—R图如图2.1所示。 车辆 车牌号 车型 豪华限度 车辆载重 状态 最早可用时间 驾驶 司机 司机编号 司机姓名 性别 驾龄 年龄 租用 客户 客户电话 客户姓名 需求车型 需求限度 需求载重 租用车辆 租用时间 归还时间 m 1 n 1 图2.1 车辆调度管理数据库E—R图 车辆实体与司机、客户这两个实体之间,分别通过驾驶关系和租用关系联系
6、在一起。为便于管理,一辆汽车只配备一名司机,一名司机也只能驾驶一辆汽车。所以这两个实体之间是1:n的关系。而一辆汽车可以出租给不同的客户,而一个顾客又可以租用多辆汽车,所以两个实体之间的关系是m:n的关系。 E-R图表达的关系模式为: 车辆(车牌号,车型,司机编号,载重,豪华限度,状态,最早可用时间); 司机(司机编号,司机姓名,性别,驾龄,年龄); 客户(客户电话,客户姓名,需求车型,需求限度,需求载重,租用时间,归还时间,租用车辆)。 “车辆”实体的主码是“车牌号”。属性“司机编号”是来自于实体“司机”,的外码,参照其属性“司机编号”。 “司机”实体的主码是“司机编号”。 “
7、客户”实体的主码是“客户电话”。属性“租用车辆”是来自于实体“车辆”外码,参照其属性“车牌号”。 2.1.2 数据库表格设计 1. 车辆(Vehicles) 表2.1 车辆信息表 列名 数据类型 长度 是否可认为空 说明 Vno char 20 否 车牌号 Vtype char 10 是 车型 Vdno char 20 否 司机编号 Vload int 不定 是 车辆载重 Vgrand char 10 是 豪华限度 Vstatus char 10 是 状态 Vbacktime int 不定 是 最早可用
8、时间 2. 司机(Drivers) 表2.2 司机信息表 列名 数据类型 长度 是否可认为空 说明 Dno char 20 否 司机编号 Dname char 10 是 司机姓名 Dsex char 10 是 性别 Ddegree int 不定 是 驾龄 Dage int 不定 是 年龄 3. 客户(Orders) 表2.3 客户信息表 列名 数据类型 长度 是否可认为空 说明 Otel char 20 否 客户电话 Oname char 10 是 客户姓名 Oty
9、pe char 10 是 需求车型 Ogrand char 10 是 需求限度 Oload int 不定 是 需求载重 Ohiertime int 不定 是 租用时间 Obacktime int 不定 是 归还时间 Ovno char 20 否 租用车辆 2.2 系统功能模块 本系统重要功能和层次结构如图2.2所示。 本系统有七个重要功能。其中客户的使用到的功能更有用户下单、车辆信息查询两个功能,而管理人员使用到的功能有车辆信息更改、新增车辆、新增司机、车辆删除、司机删除五个功能。 车辆调度管理系统功能模块
10、 客户下单 车辆信息查询 车辆信息更改 新增车辆 新增司机 删除车辆 删除司机 图2.2 系统重要功能和层次结构 第3章 具体设计 3.1 客户功能模块 顾客类模块是为了实现顾客下订单和查询车辆信息的需求。客户可以通过它,查看所有车辆或指定车辆的信息,或是根据自己的需求筛选车辆。并且,客户还可以根据指定车辆的车牌号,查看该辆车的司机信息。 客户在输入了客户电话、姓名、对车辆的需求,以及时间等相关信息后
11、可以先使用查询功能查看满足条件的车辆,然后选定某辆车查看其司机信息,所有信息都满意后,再通过了系统对客户的租用时间与该车最早可用时间的核对,就可以下单,已取得该车的使用权。 客户功能模块流程图如图3.1所示。 开始 输入客户数据 显示满足客户需求的车辆 输入指定车辆的车牌 查看司机信息 最早可用时间大于租用时间 成功下单 结束 N Y 图3.1 客户
12、功能模块流程图 3.2 管理人员功能模块 该模块重要实现对车辆与司机信息的增删查改。 3.2.1车辆信息更新 通过该功能,管理人员可以改变指定车辆的配置司机,或是将已归还的汽车的订单取消,使该汽车可以投入下一轮使用。 在改变车辆的配置司机时,输入车牌号和新的司机编号,就可以将指定的车辆的司机改变。注意,输入的新司机编号只能是已存在的,并且是没有被配置到其他车辆的司机的编号,否则系统会提醒犯错。 改变车辆配置司机的流程图如图3.2所示。 开始 输入需要更改的信息 该司机编号是否合法 Y 更改信息 结束 N
13、 图3.2 改变车辆配置司机的流程图 在取消已归还汽车的的订单时,输入车票号和归还时间,就可以将相应的订单取消,若该车辆已其他没有订单,将车辆状态由“Busy”变为“Free”,表达目前空闲,否则车辆状态保持“Busy”,直至该车辆无任何订单。 取消已归还汽车订单的流程图如图3.3所示。 开始 输入订单信息 换车时间小于该车最早可用时间 取消相应订单 车辆状态不改变 结束 取消相应订单 车辆状态变为“Free” N Y
14、 图3.3 取消已归还汽车订单的流程图 3.2.2车辆信息的添加与删除 该功能显而易见,重要是完毕对车辆的新增或删除。 输入车牌号、车型、司机编号、车辆载重、豪华限度、初始车辆状态,而初始最早可用时间默认为0。就可以添加一辆新车。需要注意的是,输入的司机编号只能是已存在的,并且是没有被配置到其他车辆的司机的编号,否则系统会提醒犯错。 若只输入车牌号,则表达需要删除某一个已经存在的车辆信息。需要注意的是,输入的车牌号必须是存在的已有的车辆的车牌号,否则系统提醒犯错。 车辆信息的添加与删除功能的流程图如图3.4所示。 开始
15、 输入车辆信息 是否只有车牌号信息 司机编号是否合法 初始化最早可用时间 写入新车辆信息 结束 车牌号存在 删除车辆信息 输入司机编号 Y N N N Y Y 图3.4 车辆信息的添加与删除功能的流程图 3.2.3司机信息的添加与删除 归还功能与车辆信息的添加与删除类似。 输入司机编号、司机姓名、性别、驾龄、年龄等信息,就可以添加一名新司机。需要注意的是,输入的新司机编号不能与已有的司机编号反复,否则系统提醒犯错。
16、 若只输入司机编号,则表白需要删除某一个司机。需要注意的是,删除的这一个司机不能是配置到车辆上的,否则系统提醒犯错。 司机信息的添加与删除功能流程图如图3.5所示。 N N 开始 输入司机信息 是否只有司机信号 添加司机信息者 司机已配置 删除司机 严禁删除 结束 Y Y 图3.5 司机信息的添加与删除功能流程图 第4章 调试使用 4.1 客户功能 客户下单和查询车辆信息界面如图4.1所示。 图4.1 客户
17、下单和查询车辆信息界面 输入合理信息后,通过鼠标点击按钮,就可以实现不同的功能。比如依次输入:“”、“Vanpersy”、“Audi”、“A+”、“3”、“1530”、“2311”后,点击“根据客户需要显示车辆”出现匹配车辆如图4.2所示。 然后选中其中的车牌为“A1256”的车型,点击“查看司机信息”,出现“0706”、“Ronaldo”、“male”、“6”、“30”字样。分别代表司机编号、司机姓名、性别、驾龄、年龄。信息如图4.3所示。 客户假如满意,点击“下单”即可成功下单。 图4.2 匹配客户Vanpersy需求的车辆 图4.3 车辆A1256的司机信息 4.
18、2 管理员功能 4.2.1 车辆及司机信息的增删 若需要在车辆信息表Vehicles中加入一辆车型为“Lambor”、车牌号为“A1122”、驾驶司机为“0755”豪华限度为“AA+”、载重为2人的新车,需要在车辆信息更新界面输入信息。如图4.4所示。 图 4.4 新增车辆信息 但是点击添加后,会提醒“没有该司机!请先输入司机信息”。因素是编号为0755的司机信息还没有存入数据库。解决办法就是在司机信息更新界面输入编号为0755的司机的相关信息。如图4.5所示。 图4.5 新增司机信息 点击“添加”。添加了司机信息后,重新在车辆信息更新界面输入司机编号,就可以添加所需
19、要的新车辆了。 删除车辆信息与司机信息时,只需要输入相应的车牌号或是司机编号,点击删除即可。 4.2.2 车辆信息的修改 若有车辆归还,输入归还车辆的车牌号,以及该车辆的返回时间,就可以取消相应的订单。如上面被租用的车辆A1256,车辆返回后,在车辆信息更新界面输入信息“A1256”、“2311”,点击“修改”,就完毕了订单的取消。如图4.6所示。 图4.6 取消车辆A1256的订单 若是修改车辆的的配置司机,在司机编号处输入合法的司机编号即可。 参考文献 [1] 高富平,张楚 . 电子商务法[M]. 北京:北京大学出版社,2023 [
20、2] 沈炜,徐慧 . VC++数据库编程技术与实例 [M] . 北京:人民邮电出版社,2023 [3] 杨章伟等 . 21天学通Visual C++ [M]. . 北京:电子工业出版社,2023 [4] 王珊,萨师煊 . 数据库系统概论[M]. 北京:高等教育出版社,2023 [5] 崔莹,王华军 . VC++数据库编程100例[M]. 北京:中国铁道出版社,2023 附 录(程序清单) #include "stdafx.h" #include "ylz.h" #include "ylzSet.h" #include "ylzDoc.h" #include "
21、ylzView.h" #include "Driverset.h" #include "Ve1set.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CYlzView::CYlzView() : CRecordView(CYlzView::IDD) { //{{AFX_DATA_INIT(CYlzView) m_pSet = NULL; m_tel = _T(""); m_name = _T("");
22、 m_type = _T(""); m_grand = _T(""); m_load = 0; m_upvno = _T(""); m_upvdno = _T(""); m_upvgrand = _T(""); m_upvstatus = _T(""); m_upvtype = _T(""); m_upvload = 0; m_dno = _T(""); m_dname = _T(""); m_dsex = _T(""); m_ddegree = 0; m_dage = 0; m_vno = _T(""); m_htime = 0;
23、 m_btime = 0; m_upbtime = 0; //}}AFX_DATA_INIT } void CYlzView::DoDataExchange(CDataExchange* pDX) { CRecordView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CYlzView) DDX_Control(pDX, IDC_LIST3, m_listd); DDX_Control(pDX, IDC_LIST1, m_list1); DDX_Text(pDX, IDC_EDIT1, m_tel); DDX_Text(
24、pDX, IDC_EDIT2, m_name); DDX_Text(pDX, IDC_EDIT3, m_type); DDX_Text(pDX, IDC_EDIT4, m_grand); DDX_Text(pDX, IDC_EDIT5, m_load); DDX_Text(pDX, IDC_EDIT9, m_upvno); DDX_Text(pDX, IDC_EDIT11, m_upvdno); DDX_Text(pDX, IDC_EDIT13, m_upvgrand); DDX_Text(pDX, IDC_EDIT14, m_upvstatus); DDX_T
25、ext(pDX, IDC_EDIT10, m_upvtype); DDX_Text(pDX, IDC_EDIT12, m_upvload); DDX_Text(pDX, IDC_EDIT6, m_dno); DDX_Text(pDX, IDC_EDIT8, m_dname); DDX_Text(pDX, IDC_EDIT15, m_dsex); DDX_Text(pDX, IDC_EDIT16, m_ddegree); DDX_Text(pDX, IDC_EDIT17, m_dage); DDX_Text(pDX, IDC_EDIT7, m_vno); DDX_
26、Text(pDX, IDC_EDIT18, m_htime); DDX_Text(pDX, IDC_EDIT19, m_btime); DDX_Text(pDX, IDC_EDIT20, m_upbtime); //}}AFX_DATA_MAP } BOOL CYlzView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CRecordView::PreC
27、reateWindow(cs); } void CYlzView::OnInitialUpdate() { m_pSet = &GetDocument()->m_ylzSet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } BOOL CYlzView::OnPreparePrinting(CPrintInfo* pInfo) { return DoPreparePrinting(pInfo); } #ifdef _DEBUG
28、 void CYlzView::AssertValid() const { CRecordView::AssertValid(); } void CYlzView::Dump(CDumpContext& dc) const { CRecordView::Dump(dc); } CYlzDoc* CYlzView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CYlzDoc))); return (CYlzDoc*)m_pDocum
29、ent; } #endif //_DEBUG CRecordset* CYlzView::OnGetRecordset() { return m_pSet; } // CYlzView message handlers void CYlzView::OnButton1() { CVeset cc; CString pp(" "); //int nItem=-1; CString str0; UpdateData(TRUE); for(int j=0;j<10;j++) m_list1.DeleteStri
30、ng(0); if(m_pSet->IsOpen()) m_pSet->Close(); if(cc.IsOpen()) cc.Close(); cc.Open(); m_vno=m_vno+pp; m_pSet->Open(); m_pSet->AddNew(); m_pSet->m_Otel=m_tel; m_pSet->m_Oname=m_name; m_pSet->m_Otype=m_type; m_pSet->m_Ogrand=m_grand; m_pSet->m_Oload=m_load; m_pSet->m_Ov
31、no=m_vno; m_pSet->m_Ohiretime=m_htime; m_pSet->m_Obacktime=m_btime; while(cc.IsEOF()!=1){ if(cc.m_Vno==m_vno){ UpdateData(TRUE); cc.Edit(); cc.m_Vstatus="busy"; cc.m_Vbacktime=m_btime; cc.Update(); cc.MoveNext(); cc.Requery(); UpdateData(FALSE); } else{cc.MoveN
32、ext();} } m_pSet->Update(); m_pSet->MoveLast(); m_pSet->Requery(); MessageBox("已下单!"); m_tel=m_name=m_type=m_grand=""; m_load=0; m_htime=m_btime=0; m_pSet->Close(); cc.Close(); m_vno=""; for(int i=0;i<10;i++){ m_list1.DeleteString(0); m_listd.DeleteString(0); } Upd
33、ateData(FALSE); } void CYlzView::OnButton2() { CVeset vs; CString str=""; UpdateData(TRUE); for(int i=0;i<10;i++) m_list1.DeleteString(0); if(vs.IsOpen()) vs.Close(); vs.m_strFilter.Format("Vtype='%s' and Vload>='%d' and Vgarnd='%s'",m_type,m_load,m_grand); vs.Open()
34、 while(vs.IsEOF()!=1){ str.Format("%4s %4s %4s %d %18s %5s %7d",vs.m_Vno,vs.m_Vtype,vs.m_Vdno,vs.m_Vload,vs.m_Vgarnd,vs.m_Vstatus,vs.m_Vbacktime); m_list1.AddString(str); vs.MoveNext(); UpdateData(FALSE); } vs.Close(); } void CYlzView::OnButton3() { CVeset s1; CDriverset s2;
35、 CString str1=""; UpdateData(TRUE); for(int i=0;i<10;i++) m_listd.DeleteString(0); CString sp(" "); m_vno=m_vno+sp; if(s1.IsOpen()) s1.Close(); s1.Open(); s1.MoveFirst(); while(s1.IsEOF()!=1) { if(s1.m_Vno==m_vno) { UpdateData(TRUE); if(s2.IsO
36、pen()) s2.Close(); s2.Open(); s2.MoveFirst(); while(s2.IsEOF()!=1){ if(s1.m_Vdno==s2.m_Dno) {str1.Format("%4s %4s %4s %4d %4d",s2.m_Dno,s2.m_Dname,s2.m_Dsex,s2.m_Ddegree,s2.m_Dage); m_listd.AddString(str1); s2.MoveNext(); UpdateData(FALSE);} else
37、 {s2.MoveNext();} } s1.MoveNext(); UpdateData(FALSE); } else {s1.MoveNext();} } m_vno=""; } void CYlzView::OnButton4() { CVeset upv; CDriverset ckd; CString sp1(" "); int a=0; UpdateData(TRUE); m_upvdno=m_upvdno+sp1; if(upv.IsOpen()) upv.C
38、lose(); if(ckd.IsOpen()) ckd.Close(); ckd.Open(); ckd.MoveFirst(); while(ckd.IsEOF()!=1){ if(ckd.m_Dno==m_upvdno) { a++; upv.Open(); upv.AddNew(); upv.m_Vno=m_upvno; upv.m_Vtype=m_upvtype; upv.m_Vdno=m_upvdno; upv.m_Vload=m_upvload; upv.m_Vgarnd=m_upvgrand; upv.m_V
39、status=m_upvstatus; upv.Update(); upv.MoveLast(); upv.Requery(); MessageBox("添加成功!"); m_upvno=m_upvtype=m_upvdno=m_upvgrand=m_upvstatus=""; m_upvload=0; ckd.MoveNext(); upv.Close(); UpdateData(FALSE);} else {ckd.MoveNext();} } if(a==0) {MessageBox("无此司机!请先输入司机信息!"); m_up
40、vdno=""; UpdateData(FALSE);} ckd.Close(); } void CYlzView::OnButton5() { CVeset dev; UpdateData(TRUE); if(dev.IsOpen()) dev.Close(); dev.m_strFilter.Format("Vno='%s'",m_upvno); dev.Open(); if(dev.m_Vstatus=="busy"){ MessageBox("该车正在使用,无法删除信息!"); m_upvno="";} else{
41、 CRecordsetStatus status; dev.GetStatus(status); dev.Delete(); if(status.m_lCurrentRecord==0) dev.MoveNext(); else dev.MoveFirst(); MessageBox("删除成功!"); m_upvno="";} dev.Close(); UpdateData(FALSE); } void CYlzView::OnButton6() { CDriverset upd; UpdateData(TRUE); if(upd.I
42、sOpen()) upd.Close(); upd.Open(); upd.AddNew(); upd.m_Dno=m_dno; upd.m_Dname=m_dname; upd.m_Dsex=m_dsex; upd.m_Ddegree=m_ddegree; upd.m_Dage=m_dage; upd.Update(); upd.MoveLast(); upd.Requery(); MessageBox("添加成功!"); m_dno=m_dname=m_dsex=""; m_ddegree=m_dage=0; upd.Close(); UpdateData
43、FALSE); } void CYlzView::OnButton7() { CDriverset ded; UpdateData(TRUE); if(ded.IsOpen()) ded.Close(); ded.m_strFilter.Format("Dno='%s'",m_dno); ded.Open(); CRecordsetStatus status; ded.GetStatus(status); ded.Delete(); if(status.m_lCurrentRecord==0) ded.MoveNext(); else
44、 ded.MoveFirst(); MessageBox("删除成功!"); m_dno=""; ded.Close(); UpdateData(FALSE); } void CYlzView::OnButton8() { CVeset alv; CDriverset ckd1; int b=0; CString sp2(" "); UpdateData(TRUE); if(alv.IsOpen()) alv.Close(); if(ckd1.IsOpen()) ckd1.Close(); if(m_pS
45、et->IsOpen()) m_pSet->Close(); if(m_upbtime!=0) { alv.m_strFilter.Format("Vno='%s'",m_upvno); alv.Open(); if(m_upbtime==alv.m_Vbacktime){ alv.Edit(); alv.m_Vstatus="free"; alv.m_Vbacktime=0; alv.Update(); alv.MoveNext(); alv.Requery();} m_pSet->m_strFilter.Forma
46、t("Ovno='%s' and Obacktime='%d'",m_upvno,m_upbtime); m_pSet->Open(); CRecordsetStatus status; m_pSet->GetStatus(status); m_pSet->Delete(); if(status.m_lCurrentRecord==0) m_pSet->MoveNext(); else m_pSet->MoveFirst(); MessageBox("订单已删除,该车辆已返回,可以使用!"); m_upvstatus=""; m_u
47、pvno=""; m_upbtime=0; UpdateData(FALSE); } if(m_upvdno!=""){ ckd1.Open(); ckd1.MoveFirst(); UpdateData(TRUE); m_upvdno=m_upvdno+sp2; while(ckd1.IsEOF()!=1){ if(ckd1.m_Dno==m_upvdno){ b++; alv.m_strFilter.Format("Vno='%s'",m_upvno); alv.Open(); a
48、lv.Edit(); alv.m_Vdno=m_upvdno; alv.Update(); alv.MoveLast(); alv.Requery(); MessageBox("修改成功!"); m_upvdno=m_upvno=""; UpdateData(FALSE); ckd1.MoveNext();} else {ckd1.MoveNext();} } if(b==0){ alv.Open(); MessageBox("无此司机!请先输入司机信息!"); m_upvdno="";
49、 UpdateData(FALSE);} } alv.Close(); m_pSet->Close(); } void CYlzView::OnButton9() { CVeset vs1; CString strc=""; for(int i=0;i<10;i++) m_list1.DeleteString(0); UpdateData(1); if(vs1.IsOpen()) vs1.Close(); vs1.m_strFilter.Format("Vno='%s'",m_vno); vs1.Open(); strc.F
50、ormat("%4s %4s %4s %d %18s %5s %7d",vs1.m_Vno,vs1.m_Vtype,vs1.m_Vdno,vs1.m_Vload,vs1.m_Vgarnd,vs1.m_Vstatus,vs1.m_Vbacktime); m_list1.AddString(strc); vs1.MoveNext(); UpdateData(FALSE); vs1.Close(); } void CYlzView::OnShowall() { CVeset sowv; CString show; UpdateData(TRUE); for(int i=0;






