c++课程设计 17.docx
- 文档编号:12685966
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:20
- 大小:67.75KB
c++课程设计 17.docx
《c++课程设计 17.docx》由会员分享,可在线阅读,更多相关《c++课程设计 17.docx(20页珍藏版)》请在冰豆网上搜索。
c++课程设计17
辽宁工业大学
《C++语言程序设计》课程设计(论文)
题目:
定时器
院(系):
软件学院
专业班级:
软件113班
学号:
111301074
学生姓名:
指导教师:
翟宝峰
教师职称:
副教授
起止时间:
2011.12.12-2011.12.25
课程设计(论文)任务及评语
院(系):
软件学院教研室:
软件教研室
学号
111301074
专业班级
软件113班
课程设计(论文)题目
定时器
课程设计(论文)任务
程序设计的任务与要求:
(1).掌握面向对象程序设计语言C++的基本语法
(2).掌握C++面向对象设计的思想
(3).掌握VC++6.0与DEVC++开发工具的使用
(4).运用标准C++规范设计应用程序
设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。
正确地完成上述内容,规范完整地撰写出设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
年月日
目录
第1章课程设计目的与要求1
1.1设计目的1
1.2实验环境1
1.3预备知识1
1.4设计要求1
第2章课程设计内容2
2.1课题描述2
2.2系统设计2
2.2.1功能分析2
2.2.2面向对象设计4
2.2.2类成员描述5
2.3程序实现6
2.3.1源码分析6
2.3.2运行结果13
第3章课程设计总结14
参考文献15
第1章课程设计目的与要求
1.1设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境
硬件要求能运行Windows操作系统的微机系统。
C++语言应用程序开发软件使用:
VC++系统,或其他C++语言应用程序开发软件。
1.3预备知识
熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。
1.4设计要求
1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。
第2章课程设计内容
2.1课题描述
C++语言通过应用程序和控件来处理许多基本的问题,如在编程中最常遇到的定时器问题。
使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。
通常有两种方法来实现:
发送WM_TIMER消息和调用应用程序定义的回调函数。
此方法首先写一个如下格式的回调函数,voidCALLBACKTimerProc(HWNDhWnd,UINTnMsg,UINTnTimerid,DWORDdwTime);然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAMwParam中的值便是该定时器的ID,使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可。
当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器。
不再使用定时器后,我们应该调用KillTimer来取消定时,在MFC程序中我们可以直接调用KillTimer(intnIDEvent)来取消定时器。
2.2系统设计
2.2.1功能分析
定时器的实现方式大致有这样的几种:
1、直接使用多媒体定时器
具体有两种做法,一种是使用timeGetTime函数,自己做独立的线程来不断的查询定时;一种是直接使用timeSetEvent函数设定回调。
优点:
使用方便,精度高
缺点:
对windows平台和多媒体库存在依赖
2、直接使用WM_TIMER消息
优点:
使用简单方便,不依赖特定的库
缺点:
精度低,依赖windows平台
3、通过QueryPerformance*系列函数自己做独立线程来定时
优点:
精度比较高,不依赖特定的库
缺点:
使用稍显复杂(自己包装后使用也会很简单),依赖windows平台
4、通过查询CPU时间戳来自己做独立线程定时
优点:
精度高,不依赖特定操作系统平台
缺点:
使用稍显复杂(自己包装后使用也会很简单),在多核的情况下可能需要补丁,实现起来大概是最麻烦的一种
除了这四种,最近还想到一种取巧的办法也可以用来定时,即WaitForSingleObject这一类带有等待超时特性的函数。
方法是循环等待一个绝对不会有信号的信号量,设定某个超时时间,超时后做某些你感兴趣的动作。
这样可以得到一个按指定超时时间定时动作的线程。
经过测试,这种方法定时的结果一定是比设定值大一点点,在一般情况下(我没有在极端的情况下测试过,例如有极大量的进程和线程、只有一颗cpu或者有很多颗cpu等等)定时误差在5ms以下,不过从操作系统的线程调度实现机制上看,这种方法是不能保证定时精度的。
只是在某些要求没有那么高的场合可以得到比WM_TIMER好不少的精度,同时也不那么复杂。
程序功能结构图:
2.2.2面向对象设计
UnifiedModelingLanguage(UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。
面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。
它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。
UML融合了Booch、OMT和OOSE方法中的基本概念,而且这些基本概念与其他面向对象技术中的基本概念大多相同,因而,UML必然成为这些方法以及其他方法的使用者乐于采用的一种简单一致的建模语言;其次,UML不仅仅是上述方法的简单汇合,而是在这些方法的基础上广泛征求意见,集众家之长,几经修改而完成的,UML扩展了现有方法的应用范围;第三,UML是标准的建模语言,而不是标准的开发过程。
尽管UML的应用必然以系统的开发过程为背景,但由于不同的组织和不同的应用领域,需要采取不同的开发过程。
UML图:
2.2.2类成员描述
类:
CCh3_1App成员函数InitInstance()
类:
CCh3_1Dlg成员函数DoDataExchange(CDataExchange*pDX),OnButton1(),OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor),OnInitDialog(),OnPaint(),OnQueryDragIcon(),OnSysCommand(UINTnID,LPARAMlParam)
,OnTimer(UINTnIDEvent)
数据成员:
flag,m_hIcon,m_Static1,m_Static2,OkFlag
2.3程序实现
2.3.1源码分析
//ch3_1Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"ch3_1.h"
#include"ch3_1Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CCh3_1Dlgdialog
CCh3_1Dlg:
:
CCh3_1Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CCh3_1Dlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CCh3_1Dlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCCh3_1Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCh3_1Dlg)
DDX_Control(pDX,IDC_STATIC2,m_Static2);
DDX_Control(pDX,IDC_STATIC1,m_Static1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCh3_1Dlg,CDialog)
//{{AFX_MSG_MAP(CCh3_1Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CTLCOLOR()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CCh3_1Dlgmessagehandlers
BOOLCCh3_1Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
CStringstr=_T("10:
10:
10");
m_Static1.SetWindowText(str);//更改时钟框的内容
flag=0;//以第一种方式显示时钟
SetTimer(0,500,NULL);//启运定时器,定时值500毫秒
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCCh3_1Dlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCCh3_1Dlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCCh3_1Dlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
HBRUSHCCh3_1Dlg:
:
OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
HBRUSHhbr=CDialog:
:
OnCtlColor(pDC,pWnd,nCtlColor);
//TODO:
ChangeanyattributesoftheDChere
HBRUSHm_brush;//定义画刷句柄
switch(nCtlColor)
{
caseCTLCOLOR_STATIC:
//改变静态控件字符和背景颜色
//判断当前重画的控件是否为IDC_STATIC1
if(pWnd->m_hWnd==m_Static1.m_hWnd||pWnd->m_hWnd==m_Static2.m_hWnd)
{
pDC->SetBkMode(TRANSPARENT);//设置透明模式
if(flag==0)//flag=0,设置黄字、蓝底
{
pDC->SetTextColor(RGB(255,255,0));//设置字符为黄色
m_brush=CreateSolidBrush(RGB(0,0,255));//创建蓝色画刷
}
else//flag!
=0,设置蓝字、黄底
{
pDC->SetTextColor(RGB(0,0,255));//设置字符为黄色
m_brush=CreateSolidBrush(RGB(255,255,0));//创建蓝色画刷
}
returnm_brush;//用蓝色画刷重画控件IDC_STATIC1底色
}
break;
}
//
//TODO:
Returnadifferentbrushifthedefaultisnotdesired
returnhbr;
}
voidCCh3_1Dlg:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
time_tm_time;
tm*t;
inthour,hour1,min,sec;
intyear,mon,day,week;
CStrings;
CStrings1[7]={"日","一","二","三","四","五","六"};
time(&m_time);
t=localtime(&m_time);
hour=t->tm_hour;
min=t->tm_min;
sec=t->tm_sec;
hour1=hour%12;
year=t->tm_year+1900;
mon=t->tm_mon+1;
day=t->tm_mday;
week=t->tm_wday;
//-------------------------------------------------------------
//if(flag==0)
s.Format("%02d:
%02d:
%02d",hour,min,sec);//按24小时制格式化字符串
//将当前时钟送到IDC——STATIC1表态框显示
else
{
s.Format("%02d:
%02d:
%02d",hour1,min,sec);
if(hour>=12)s+="PM";
elses+="AM";
m_Static1.SetWindowText(s);
s.Format("\n%4d年%2d月\n\n%2d日\n\n星期",year,mon,day);
s+=s1[week];
//将当前日历送到IDC——STATIC2表态框显示
m_Static2.SetWindowText(s);
SetTimer(0,500,NULL);//重置定时器
CDialog:
:
OnTimer(nIDEvent);
}
}
voidCCh3_1Dlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(flag==0)flag=1;//如果是蓝底黄字,则切换到黄字蓝底
elseflag=0;//否则切换到蓝底黄字
m_Static1.Invalidate(true);//要求重画时钟框
m_Static2.Invalidate(true);//要求重画日历框
}
2.3.2运行结果
第3章课程设计总结
当今社会,各行各业都有着愈来愈多的自动化设备,职业学校的学生更需要针对自己所学专业了解其中自动化执行的部分,这就要求他们系统地学习一门程序设计语言,同时学习程序设计语言还有助于培养学生分析解决问题的能力、逻辑能力、创新能力。
众所周知,C++程序设计语言这门课程比较枯燥,难度大,但它却在现代化的各行各业里都有着广泛的使用,这就带来学习这门课的必要性。
经过本次课程设计,我发现做软件真的需要做很多工作,不仅仅是敲代码。
首先,必须要有需求分析。
就拿这次的题目来说,一个清晰的需求分析能让我省去很多工作,能让我把代码写的更清晰,让我的代码能有更好的重用性,以此简化程序。
而这次的题目其实也算不上需求分析,只能算是功能分析吧。
从界面到用户登陆判断,从增删改查基本功能到文件读写。
如果能够把代码细化,把基本功能都封装成函数,这样应该会提高代码的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+课程设计 17 c+ 课程设计