windows课程设计.docx
《windows课程设计.docx》由会员分享,可在线阅读,更多相关《windows课程设计.docx(24页珍藏版)》请在冰点文库上搜索。
windows课程设计
中南民族大学计算机科学学院
Windows系统编程
课程设计报告
题目:
汽车客运公司售票系统
数据库及主界面设计
专业自动化
学生姓名
班级学号
指导老师
完成日期2010年12月22日
设计题目
汽车客运公司售票系统
设
计
目
的
和
要
求
一、目的
1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识
2.基本掌握面向对象程序设计的基本思路和方法
3.掌握用VC++开发应用程序的的一般步骤和方法
4.进一步加强C++的编程能力和对程序结构的理解
二、要求要求
根据所学知识,编写指定题目的程序,并规范地完成课程设计报告。
通过课程设计,加深对《Windows程序设计》课程所学知识的理解,学会编制结构清晰、风格良好、数据结构适当的Windows平台应用程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。
具体要求如下:
1了解Windows编程的基础知识,掌握MFC应用程序的基本知识;基本掌握面向对象程序设计的基本思路和方法;掌握用VC++开发应用程序的一般步骤和方法;系统以Windows标准菜单界面方式工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
2采用界面选择与编辑框两种输入方式,输出结果直接显示在售票对话框中。
输入的数据必须符合程序所规定的合法输入方式,对不合法的信息输入将提示无法处理。
3输入输出的要求
采用界面选择与编辑框两种输入方式,输出结果直接显示在售票对话框中。
输入的数据必须符合程序所规定的合法输入方式,对不合法的信息输入将提示无法处理。
4使用界面编程、网络、数据库、文件系统、线程和进程、异常处理等知识。
特别是数据库的应用,用来存储数据和提供数据。
对于网络主要进行网络通信,连接客户端和服务器端。
开
发
工
具
介
绍
1.MicrosoftVisualStudio2010主要是运用该软件进行对话框的设计
VisualStudio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件。
2.MicrosoftOffice2007Access运用该软件进行数据库部分的设计
Assess能够存取Access/Jet、MicrosoftSQLServer、Oracle,或者任何ODBC兼容数据库内的资料。
熟练的软件设计师和资料分析师利用它来开发应用软件,而一些不熟练的程序员和非程序员的"进阶用户"则能使用它来开发简单的应用软件。
3另外:
vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。
VC++应用程序的开发主要有两种模式,一种是WINAPI方式,另一种则是MFC方式,传统的WINAPI开发方式比较繁琐,而MFC则是对WINAPI再次封装,所以MFC相对于WINAPI开发更具备效率优势,
流
程
图
否
是
设
计
思
路
一关于数据库的设计:
建立一个数据库主要用于存储该汽车客运售票系统关于汽车班次信息和旅客购票记录的存储和读取,便于各个功能模块对数据的使用
(1)首先是运用access创建一个数据库以及包含班次信息的数据表
表一为班次表
表二为旅客登记表
(2)其次是建立ODBC数据源
(3)是建立数据库与系统的连接
classADOConn
{
//定义变量
public:
//添加一个指向Connection对象的指针
_ConnectionPtrm_pConnection;
//添加一个指向Recordset对象的指针
_RecordsetPtrm_pRecordset;
//定义方法
public:
ADOConn();
virtual~ADOConn();
//初始化--连接数据库
voidOnInitADOConn();
//执行查询
_RecordsetPtr&GetRecordSet(_bstr_tbstrSQL);
//执行SQL语句
BOOLExecuteSQL(_bstr_tbstrSQL);
voidExitConnect();
};
ADOConn:
:
ADOConn()
{
}
ADOConn:
:
~ADOConn()
{
}
voidADOConn:
:
OnInitADOConn()
{
//初始化OLE/COM库环境
:
:
CoInitialize(NULL);
HRESULThr;
try
{
hr=m_pConnection.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionString="FileName=LinkDatabase.udl";
m_pConnection->ConnectionTimeout=20;
hr=m_pConnection->Open("","","",adConnectUnspecified);
if(FAILED(hr))
{
AfxMessageBox("打开数据库失败!
");
return;
}
}
else
{
AfxMessageBox("创建连接对象失败!
");
return;
}
}
catch(_com_errore)
{
AfxMessageBox(e.Description());
}
}
_RecordsetPtr&ADOConn:
:
GetRecordSet(_bstr_tbstrSQL)
{
try
{
//连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
}
//捕捉异常
catch(_com_errore)
{
//显示错误信息
AfxMessageBox(e.Description());
}
//返回记录集
returnm_pRecordset;
}
BOOLADOConn:
:
ExecuteSQL(_bstr_tbstrSQL)
{
try
{
//是否已经连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
returntrue;
}
catch(_com_errore)
{
AfxMessageBox(e.Description());
returnfalse;
}
}
voidADOConn:
:
ExitConnect()
{
//关闭记录集和连接
if(m_pConnection!
=NULL){
m_pConnection->Close();
//m_pRecordset->Close();
}
//释放环境
:
:
CoUninitialize();
}
二关于主界面对话框的设计
//ShouPiaoXiTongDlg.cpp:
implementationfile
//
//本文件为主对话框的实现文件,大部分关于对话框的操作均在次实现
//包含的头文件
#include"stdafx.h"
#include"ShouPiaoXiTong.h"
#include"ShouPiaoXiTongDlg.h"
#include"shoupiao.h"
#include"chaxun.h"
#include"chaxunrecord.h"
#include"shezhi.h"
#include"shezhi1.h"
#include"shezhi2.h"
#include"shezhi3.h"
#include"shezhi4.h"
#include"shezhi5.h"
#include"tuipiao1.h"
#include"tuipiao2.h"
#include"BusList.h"
#include"LoginDlg.h"
#include"SysManager.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//--------------------------------------
//全局变量
BusList*buslist;//这里定义了一个汽车列表的指针
floatXueShengPiao=0.5;//学生票折扣
floatJunRenPiao=0.7;//军人票折扣
floatQiTaPiao=0.8;//其它票折扣
intYuShouDays=3;//预售期限
intJieZhiHours=1;//退票截止时间(小时)
intJieZhiMins=5;//售票截止时间(分钟)
CTimenowtime;
CStringtoday;//假定今天的日期
intwhichday=0;//正在操作哪一天
//--------------------------------------
/////////////////////////////////////////////////////////////////////////////
//CShouPiaoXiTongDlgdialog
CShouPiaoXiTongDlg:
:
CShouPiaoXiTongDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CShouPiaoXiTongDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CShouPiaoXiTongDlg)
m_banciinput=_T("");
m_time=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCShouPiaoXiTongDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CShouPiaoXiTongDlg)
DDX_Control(pDX,IDC_COMBO1,m_riqi);//对控件进行绑定
DDX_Control(pDX,IDC_LIST1,m_listbus);
DDX_Text(pDX,IDC_EDIT1,m_banciinput);
DDX_Text(pDX,IDC_TIME,m_time);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CShouPiaoXiTongDlg,CDialog)
//{{AFX_MSG_MAP(CShouPiaoXiTongDlg)
ON_WM_PAINT()//添加对应得消息响应函数
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SHOUPIAO,OnShoupiao)
ON_BN_CLICKED(IDC_CHAXUN,OnChaxun)
ON_BN_CLICKED(IDC_TUIPIAO,OnTuipiao)
ON_BN_CLICKED(IDC_SHEZHI,OnShezhi)
ON_NOTIFY(NM_CLICK,IDC_LIST1,OnClickList1)
ON_EN_KILLFOCUS(IDC_EDIT1,OnKillfocusEdit1)
ON_WM_TIMER()
ON_CBN_SELENDOK(IDC_COMBO1,OnSelendokCombo1)
ON_NOTIFY(NM_DBLCLK,IDC_LIST1,OnDblclkList1)
//}}AFX_MSG_MAP
ON_CBN_SELCHANGE(IDC_COMBO1,&CShouPiaoXiTongDlg:
:
OnCbnSelchangeCombo1)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CShouPiaoXiTongDlgmessagehandlers
BOOLCShouPiaoXiTongDlg:
:
OnInitDialog()//初始化
{
CDialog:
:
OnInitDialog();
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
//-------------------------------------------------------------------------
//从这里开始是主窗口的初始化代码
//-----------------------------------------------
SetWindowText("汽车客运公司售票系统v1.0[售票管理]");
ListView_SetExtendedListViewStyle(m_listbus.m_hWnd,LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
SetTimer(1,1000,NULL);//设定每次刷新的时间
nowtime=CTime:
:
GetCurrentTime();//获得当前时间
today=nowtime.Format("%Y-%m-%d");
m_time=nowtime.Format("%Y-%m-%d%H:
%M:
%S");//刷新主界面的时钟
UpdateData(false);
fin>>YuShouDays;//读取预售天数到全局变量
fin>>JieZhiHours;//读取退票截止时间
fin>>JieZhiMins;//读取售票截止时间
fin>>XueShengPiao;//学生票折扣
fin>>JunRenPiao;//军人票折扣
fin>>QiTaPiao;//其它票折扣
buslist=newBusList[YuShouDays];//建立与预售天数相同的动态数组
for(inthh=0;hhif(buslist[hh].LoadBusListFromFile("班次信息\\"+(nowtime+CTimeSpan(hh,0,0,0)).Format("%Y-%m-%d")+".txt")==-1)
buslist[hh].LoadBusListFromFile("initBanci.ini");
}
inti,j;
for(j=0;jfor(i=1;i<=buslist[j].GetCurBusNum();i++){
buslist[j].LoadChengKeListFromFile("旅客登记\\"+(nowtime+CTimeSpan(j,0,0,0)).Format("%Y-%m-%d")+buslist[j].GetBanCi(i)+".txt",buslist[j].GetBanCi(i));
}
}
//初始化主窗口的汽车列表
m_listbus.InsertColumn(0,"班次号",LVCFMT_RIGHT,76);
m_listbus.InsertColumn(1,"发车时间",LVCFMT_CENTER,90);
m_listbus.InsertColumn(2,"终点城市",LVCFMT_CENTER,90);
m_listbus.InsertColumn(3,"座位数",LVCFMT_CENTER,70);
m_listbus.InsertColumn(4,"已售数量",LVCFMT_CENTER,90);
m_listbus.InsertColumn(5,"全票价(元)",LVCFMT_LEFT,124);
//初始化日期选择控件
m_riqi.ResetContent();
for(intm=0;mm_riqi.AddString((nowtime+CTimeSpan(m,0,0,0)).Format("%Y-%m-%d"));
}
m_riqi.SetCurSel(0);
//显示班次表
flushbus();
//以下部分曾经用于调试!
//MessageBox("hell0!
","hi");
//if(buslist[whichday].GetStartTimeM("HF001")==38)MessageBox("Ok!
");
//m_banciinput="aaa";
//UpdateData(false);
//BusListbuslist;
//CStringfilename="initBanci.ini";
//buslist.SaveBusListToFile(filename);
//buslist.LoadBusListFromFile(filename);
//buslist.LoadChengKeListFromFile("LYG001.txt","LYG001");
//flushbus();
//主窗口初始化到此结束
//------------------------------------------------------------------------
测
试
数
据
及
结
果
分
析
一测试买一张票
以下是班次数据表中的变化
以下是旅客登记表中的变化
以下是主界面中的变化
二测试删除一个班次及相应的数据库中的变化
这是想应得主界面中的变化
这是相应的数据表的变化
结果分析
通过在VC上运行调试等到的系统已经达到预定的目标,具体的结果已由上版的截图清晰地描述。
当对售票员系统进行操作时,只要输入的用户名和密码符合相应的要求,在主界面和对应的数据表中都会看到的变化,而且该变化也是符合要求的。
再者是对班次信息进行修改观察主界面和班次数据库中变化,结果显示出当通过正确的方法进入管理员系统后,删除一个班次的话在相应的主界面和班次数据表中也会得到相应的变化,且该变化也是符合要求的。
通过上面一系列对数据库和主界面的测试,可以看出该系统还是符合要求的,系统的运行也是符合要求的。
调
试
过
程
中
的
问
题
(一)连接access数据库时遇到过怎么也连接不上的问题,后来请教同学教了我两个连接access数据库的方法
1.数据源
//加载JDBC驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//建立数据库连接路径
Connectioncon=DriverManager.getConnection("jdbc:
odbc:
ge");
2.直连
Stringstrurl="jdbc:
odbc:
driver={MicrosoftAccessDriver(*.mdb)};DBQ=D:
\\SQL\\db.mdb";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connectionconn=DriverManager.getConnection(strurl);
(2)创建主对话框界面时对获取当前时间有一些问题
先创建一个Ctime对象,然后用GetCurrentTime()即可,该方法现在已经被宏定义为GetTickCount().
CtimeCurrent;
Current.GetTickCount();
IntIyear=Current.getyear();
IntImonth=Current.getMonth();
Ct