资源描述
沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:软件综合课程设计
课程设计题目:车辆调度管理软件设计
院(系):计算机学院
专 业:计算机科学与技术
班 级:84010101
学 号:
姓 名:叶伦灼
指引教师:丛丽晖
完毕日期: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 系统功能模块 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) 建立车辆信息表;
2) 实现对车辆信息插入、修改、查询、删除功能;
3) 界面要优化,直观、大方、美观;
4) 实现针对不同任务、不同步间调度分派算法;
5) 独立完毕系统设计、编码和调试;
6) 按照课程设计规范书写课程设计报告。
1.2 问题分析与假设
车辆调度就是依照客户需求,合理地派遣出相应车辆。假设每派遣出一辆车,需要记录下该车特有信息以及使用该车客户信息。一辆车在被使用后,不能在重叠时间段被其她客户使用。而客户在选取车辆时,除了可以理解车辆自身属性外,也有权理解驾驶该车辆驾驶员信息,例如驾驶员性别、驾龄、年龄。而作为车辆调度员,应当做到对车辆信息查看、增删、及时更新等操作。由于每一辆车均有一种专属司机,因此每新增一辆,都必要提供一种已存在司机信息,如果添加了一种错误司机,系统应当可以提供提示现提供一种对的司机信息。同理,如果想要注销掉某个司机信息,一方面要取消掉她与配对车辆关系,然后才干进行注销。
分析了客户与车辆、司机与车辆关系,有助于咱们建立合理表格,并且在设计程序时考虑到更多切合实际应用。
本次课设所需要表格将在SQL 中建立。使用Microsoft Visual C++编写代码、进行对数据库读写等操作。ODBC将作为搭载数据库与VC++平台。
第2章 概要设计
2.1 数据库逻辑模型设计
2.1.1 数据库E—R图
汽车调度管理系统E—R图如图2.1所示。
车辆
车牌号
车型
豪华限度
车辆载重
状态
最早可用时间
驾驶
司机
司机编号
司机姓名
性别
驾龄
年龄
租用
客户
客户电话
客户姓名
需求车型
需求限度
需求载重
租用车辆
租用时间
归还时间
m
1
n
1
图2.1 车辆调度管理数据库E—R图
车辆实体与司机、客户这两个实体之间,分别通过驾驶关系和租用关系联系在一起。为便于管理,一辆汽车只配备一名司机,一名司机也只能驾驶一辆汽车。因此这两个实体之间是1:n关系。而一辆汽车可以出租给不同客户,而一种顾客又可以租用多辆汽车,因此两个实体之间关系是m:n关系。
E-R图表达关系模式为:
车辆(车牌号,车型,司机编号,载重,豪华限度,状态,最早可用时间);
司机(司机编号,司机姓名,性别,驾龄,年龄);
客户(客户电话,客户姓名,需求车型,需求限度,需求载重,租用时间,归还时间,租用车辆)。
“车辆”实体主码是“车牌号”。属性“司机编号”是来自于实体“司机”,外码,参照其属性“司机编号”。
“司机”实体主码是“司机编号”。
“客户”实体主码是“客户电话”。属性“租用车辆”是来自于实体“车辆”外码,参照其属性“车牌号”。
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
不定
是
最早可用时间
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
是
客户姓名
Otype
char
10
是
需求车型
Ogrand
char
10
是
需求限度
Oload
int
不定
是
需求载重
Ohiertime
int
不定
是
租用时间
Obacktime
int
不定
是
归还时间
Ovno
char
20
否
租用车辆
2.2 系统功能模块
本系统重要功能和层次构造如图2.2所示。
本系统有七个重要功能。其中客户使用到功能更有顾客下单、车辆信息查询两个功能,而管理人员使用到功能有车辆信息更改、新增车辆、新增司机、车辆删除、司机删除五个功能。
车辆调度管理系统功能模块
客户下单
车辆信息查询
车辆信息更改
新增车辆
新增司机
删除车辆
删除司机
图2.2 系统重要功能和层次构造
第3章 详细设计
3.1 客户功能模块
顾客类模块是为了实现顾客下订单和查询车辆信息需求。客户可以通过它,查看所有车辆或指定车辆信息,或是依照自己需求筛选车辆。并且,客户还可以依照指定车辆车牌号,查看该辆车司机信息。
客户在输入了客户电话、姓名、对车辆需求,以及时间等有关信息后,可以先使用查询功能查看满足条件车辆,然后选定某辆车查看其司机信息,所有信息都满意后,再通过了系统对客户租用时间与该车最早可用时间核对,就可如下单,已获得该车使用权。
客户功能模块流程图如图3.1所示。
开始
输入客户数据
显示满足客户需求车辆
输入指定车辆车牌
查看司机信息
最早可用时间不不大于租用时间
成功下单
结束
N
Y
图3.1 客户功能模块流程图
3.2 管理人员功能模块
该模块重要实现对车辆与司机信息增删查改。
3.2.1车辆信息更新
通过该功能,管理人员可以变化指定车辆配备司机,或是将已归还汽车订单取消,使该汽车可以投入下一轮使用。
在变化车辆配备司机时,输入车牌号和新司机编号,就可以将指定车辆司机变化。注意,输入新司机编号只能是已存在,并且是没有被配备到其她车辆司机编号,否则系统会提示出错。
变化车辆配备司机流程图如图3.2所示。
开始
输入需要更改信息
该司机编号与否合法
Y
更改信息
结束
N
图3.2 变化车辆配备司机流程图
在取消已归还汽车订单时,输入车票号和归还时间,就可以将相应订单取消,若该车辆已其她没有订单,将车辆状态由“Busy”变为“Free”,表达当前空闲,否则车辆状态保持“Busy”,直至该车辆无任何订单。
取消已归还汽车订单流程图如图3.3所示。
开始
输入订单信息
换车时间不大于该车最早可用时间
取消相应订单
车辆状态不变化
结束
取消相应订单
车辆状态变为“Free”
N
Y
图3.3 取消已归还汽车订单流程图
3.2.2车辆信息添加与删除
该功能显而易见,重要是完毕对车辆新增或删除。
输入车牌号、车型、司机编号、车辆载重、豪华限度、初始车辆状态,而初始最早可用时间默以为0。就可以添加一辆新车。需要注意是,输入司机编号只能是已存在,并且是没有被配备到其她车辆司机编号,否则系统会提示出错。
若只输入车牌号,则表达需要删除某一种已经存在车辆信息。需要注意是,输入车牌号必要是存在已有车辆车牌号,否则系统提示出错。
车辆信息添加与删除功能流程图如图3.4所示。
开始
输入车辆信息
与否只有车牌号信息
司机编号与否合法
初始化最早可用时间
写入新车辆信息
结束
车牌号存在
删除车辆信息
输入司机编号
Y
N
N
N
Y
Y
图3.4 车辆信息添加与删除功能流程图
3.2.3司机信息添加与删除
归还功能与车辆信息添加与删除类似。
输入司机编号、司机姓名、性别、驾龄、年龄等信息,就可以添加一名新司机。需要注意是,输入新司机编号不能与已有司机编号重复,否则系统提示出错。
若只输入司机编号,则表白需要删除某一种司机。需要注意是,删除这一种司机不能是配备到车辆上,否则系统提示出错。
司机信息添加与删除功能流程图如图3.5所示。
N
N
开始
输入司机信息
与否只有司机信号
添加司机信息者
司机已配备
删除司机
禁止删除
结束
Y
Y
图3.5 司机信息添加与删除功能流程图
第4章 调试使用
4.1 客户功能
客户下单和查询车辆信息界面如图4.1所示。
图4.1 客户下单和查询车辆信息界面
输入合理信息后,通过鼠标点击按钮,就可以实现不同功能。例如依次输入:“”、“Vanpersy”、“Audi”、“A+”、“3”、“1530”、“2311”后,点击“依照客户需要显示车辆”浮现匹配车辆如图4.2所示。
然后选中其中车牌为“A1256”车型,点击“查看司机信息”,浮现“0706”、“Ronaldo”、“male”、“6”、“30”字样。分别代表司机编号、司机姓名、性别、驾龄、年龄。信息如图4.3所示。
客户如果满意,点击“下单”即可成功下单。
图4.2 匹配客户Vanpersy需求车辆
图4.3 车辆A1256司机信息
4.2 管理员功能
4.2.1 车辆及司机信息增删
若需要在车辆信息表Vehicles中加入一辆车型为“Lambor”、车牌号为“A1122”、驾驶司机为“0755”豪华限度为“AA+”、载重为2人新车,需要在车辆信息更新界面输入信息。如图4.4所示。
图 4.4 新增车辆信息
但是点击添加后,会提示“没有该司机!请先输入司机信息”。因素是编号为0755司机信息还没有存入数据库。解决办法就是在司机信息更新界面输入编号为0755司机有关信息。如图4.5所示。
图4.5 新增司机信息
点击“添加”。添加了司机信息后,重新在车辆信息更新界面输入司机编号,就可以添加所需要新车辆了。
删除车辆信息与司机信息时,只需要输入相应车牌号或是司机编号,点击删除即可。
4.2.2 车辆信息修改
若有车辆归还,输入归还车辆车牌号,以及该车辆返回时间,就可以取消相应订单。如上面被租用车辆A1256,车辆返回后,在车辆信息更新界面输入信息“A1256”、“2311”,点击“修改”,就完毕了订单取消。如图4.6所示。
图4.6 取消车辆A1256订单
若是修改车辆配备司机,在司机编号处输入合法司机编号即可。
参照文献
[1] 高富平,张楚 . 电子商务法[M]. 北京:北京大学出版社,
[2] 沈炜,徐慧 . VC++数据库编程技术与实例 [M] . 北京:人民邮电出版社,
[3] 杨章伟等 . 21天学通Visual C++ [M]. . 北京:电子工业出版社,
[4] 王珊,萨师煊 . 数据库系统概论[M]. 北京:高等教诲出版社,
[5] 崔莹,王华军 . VC++数据库编程100例[M]. 北京:中华人民共和国铁道出版社,
附 录(程序清单)
#include "stdafx.h"
#include "ylz.h"
#include "ylzSet.h"
#include "ylzDoc.h"
#include "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("");
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;
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(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_Text(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_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::PreCreateWindow(cs);
}
void CYlzView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_ylzSet;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
BOOL CYlzView::OnPreparePrinting(CPrintInfo* pInfo)
{
return DoPreparePrinting(pInfo);
}
#ifdef _DEBUG
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_pDocument;
}
#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.DeleteString(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_Ovno=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.MoveNext();}
}
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);
}
UpdateData(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();
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;
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.IsOpen())
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 {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.Close();
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_Vstatus=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_upvdno="";
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{
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.IsOpen())
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(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
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_pSet->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.Format("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_upvno="";
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();
alv.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="";
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.Format("%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;i<10;i++)
m_list1.DeleteString(0);
if(sowv.IsOpen())
sowv.Close();
sowv.Open();
sowv.MoveFirst();
while(sowv.IsEOF()!=1){
show.Format("%4s %4s %4s %d %18s %5s %7d",sowv.m_Vno,sowv.m_V
展开阅读全文