日历管理器.docx
《日历管理器.docx》由会员分享,可在线阅读,更多相关《日历管理器.docx(15页珍藏版)》请在冰豆网上搜索。
日历管理器
C++程序设计课程设计报告
(2011--2012年度第2学期)
日历管理器的开发的设计
目录
1概述1
1.1课程设计目的1
1.2课程设计内容1
2系统需求分析1
2.1系统目标1
2.2主体功能1
2.3开发环境1
3系统概要设计1
3.1系统的功能模块划分1
3.2系统流程图2
4系统详细设计2
4.1年份跳转模块设计2
5测试5
5.1测试方案5
6小结7
参考文献8
附录9
附录1日历管理器源程序清单9
日历管理软件的设计
1概述
1.1课程设计目的
1、巩固并加深对C++语言程序设计知识的理解;
2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;
3、进一步掌握和应用VC++6.0集成开发环境;
4、提高运用C++语言解决实际问题的能力;
5、初步掌握开发小型实用软件的基本方法,能独立设计,实现基本的MIS系统
6、了解高级程序设计语言的结构,掌握基本的分析问题和利用计算机求解问题的能力;
7、掌握调试程序的一般方法
1.2课程设计内容
课程名称:
日历管理器的开发
说明:
显示日历
要求:
1)根据用户输入的年份,自动产生每个月的日期列表;
2)自定义显示日历的形式。
2.系统需求分析
2.1系统目标
建立电子日历,可以自主生成新的日历,方便用户。
2.2主体功能
1.根据用户输入的年份,自动产生每个月的日期列表;
2.自定义显示日历的形式
2.3开发环境
①开发工具VisualC++6.0
②设计工具Office2003
3系统概要设计
3.1系统的功能模块划分
日历管理器系统设计的主要模块分为:
年份跳转模块设计
年份跳转模块:
根据用户自己输入的年份,该模块为用户显示该年的日历!
3.2系统流程图
4系统详细设计
4.1年份跳转模块设计
设计思路:
使用MFC编辑主界面、基本对话框、组框(可调整1-10000这间的年份)、静态文本框,默认年份为系统时间,默认一个已知的日期,并已知该日的星期,通过计算,得出所求目的年份所有日期的星期。
主要成员变量及其意义:
①Charstr[7][3];//从一到日的字符
inta,b,c,d,e,f,//a设置年份差周期为4的天数,b设置周期为100的年份差的天数,c为周期为400的年份差的天数,d为已知年份一月一号的星期,e为所求年份一月一日到所求月份一月一日的天数差,f为所求年份到已知年份之间的天数差
在C1111Dlg类的构造函数中添加以下代码:
strcpy(str[0],"一");
strcpy(str[1],"二");
strcpy(str[2],"三");
strcpy(str[3],"四");
strcpy(str[4],"五");
strcpy(str[5],"六");
strcpy(str[6],"日");
a=4*365+1;a=a%7;
b=a*25-1;b=b%7;
c=b*4+1;c=c%7;
d=0;
②在CMY1111Dlg类的初始化函数OnInitDialog中添加以下代码:
CComboBox*pCboxyear=(CComboBox*)GetDlgItem(IDC_COMBO1);CStringstr;
pCboxyear->InsertString(0,"请输入年份");
for(inti=1;i<10000;i++)
{
str.Format("%d",i);
pCboxyear->InsertString(i,str);
}
③添加消息处理函数
为组合框添加WM_CLOSEUP消息处理函数:
UpdateData();
if(m_nYear!
=0){
RedrawWindow();
f=(m_nYear-1)/400*c+((m_nYear-1)%400)/100*b+(((m_nYear-1)%400)%100)/4*a+(((m_nYear-1)%400)%100)%4*365;
CStatic*pDraw=(CStatic*)GetDlgItem(IDC_STATIC);
CDC*pDC=pDraw->GetDC();
pDC->SetBkMode(TRANSPARENT);
for(inti=0;i<3;i=i++)
{pDC->MoveTo(0,i*118+10);pDC->LineTo(708,i*118+10);}
for(intj=0;j<7;j=j++)
{pDC->MoveTo(j*118,10);pDC->LineTo(j*118,246);}
for(i=0;i<7;i=i++)
for(j=0;j<12;j=j++)
{pDC->TextOut(j%6*118+16*i+5,j/6*118+12,str[i]);
}
for(j=0;j<12;j++)
for(i=0;i<31;i++)
{switch(j+1)
{case1:
e=0;break;
case2:
e=31;break;
case3:
e=31+28;break;
case4:
e=31+28+31;break;
case5:
e=31+28+31+30;break;
case6:
e=31+28+31+30+31;break;
case7:
e=31+28+31+30+31+30;break;
case8:
e=31+28+31+30+31+30+31;break;
case9:
e=31+28+31+30+31+30+31+31;break;
case10:
e=31+28+31+30+31+30+31+31+30;break;
case11:
e=31+28+31+30+31+30+31+31+30+31;break;
case12:
e=31+28+31+30+31+30+31+31+30+31+30;break;}
if(m_nYear%100!
=0&&m_nYear%4==0||m_nYear%400==0)
if(j>1)e=e+1;
CStringstr;
str.Format("%d",i+1);
if(j==1&&!
(m_nYear%100!
=0&&m_nYear%400==0||m_nYear%400==0)&&i>27||j==1&&(m_nYear%100!
=0&&m_nYear%4000==0||m_nYear%400==0)&&i>28||(j==3||j==5||j==8||j==10)&&i>29)
continue;
pDC->TextOut((f+d+e+i)%7*16+j%6*118+5,j/6*118+((i+(f+d+e)%7)/7+1)*16+15,str);
}
}
}
日历上方有菜单栏,提供一些按钮,实际效果如下所示:
5测试
5.1测试方案
根据用户输入年份,是否能正确显示出跳转年份的日历表;
5.2测试结果
输入年份1:
输入年份2000:
输入年份:
2012
经检验输出无误差
6小结
课程设计小结:
通过近俩周的课程设计,我更加深入了解了vc++软件和c++这门课程,修改了范围之外的数值产生日历的BUG,新了解很多函数fomattextoutinsterstring等函数和很多消息处理函数,了解了组框,静态文本框的使用方法
并初步掌握了如何对其编写、调试与运行,把书本上学习到的和老师、同学v的指导运用到实际中去,很好的锻炼自己的学习能力!
由于是第一次在做课程设计,自己对C++了解的不够透彻,再加上时间紧,开始时的思路不是很清晰,我遇到了很多问题!
首先是源程序代码的错误导致程序无法运行,后来仔细检查才发现都是输入时的错误,而且有些是代码混乱,还有些标点的错误使用和字母大小写的问题,这让我得到了一个教训,检查代码浪费了我太多的时间!
但让我对此有了更加系统的了解。
课程设计过程有些坎坷,让我意识到必须要抓紧自己的专业课了!
并让我意识到以后的学习要加强动手能力,多实践,这样才能从各个方面来提高自己的水平。
最后,感谢帮助我完成课程设计的的老师和同学!
参考文献
[1]谭浩强. C程序设计(第三版).北京:
清华大学出版社,2005
[2]谭浩强. C程序设计题解与上机指导(第三版).北京:
清华大学出版社,2005
附录
附录1源程序清单
附录1.1日历管理器模块源程序
控件类型
控件ID
控件名称
成员变量
非默认属性
组合框
IDC_COMBO1
intm_nYear
下拉列表
组框
IDC_STATIC
日历
#include"stdafx.h"
#include"1111.h"
#include"1111Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endifclassCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CMy1111Dlg:
:
CMy1111Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMy1111Dlg:
:
IDD,pParent)
{
strcpy(str[0],"一");
strcpy(str[1],"二");
strcpy(str[2],"三");
strcpy(str[3],"四");
strcpy(str[4],"五");
strcpy(str[5],"六");
strcpy(str[6],"日");
a=4*365+1;a=a%7;
b=a*25-1;b=b%7;
c=b*4+1;c=c%7;
d=0;
m_nYear=-1;
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMy1111Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
DDX_CBIndex(pDX,IDC_COMBO1,m_nYear);
}
BEGIN_MESSAGE_MAP(CMy1111Dlg,CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_CLOSEUP(IDC_COMBO1,OnCloseupCombo1)
END_MESSAGE_MAP()
BOOLCMy1111Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
CComboBox*pCboxyear=(CComboBox*)GetDlgItem(IDC_COMBO1);CStringstr;
pCboxyear->InsertString(0,"请输入年份");
for(inti=1;i<10000;i++)
{
str.Format("%d",i);
pCboxyear->InsertString(i,str);
}
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);
}
}
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
returnTRUE;
}
voidCMy1111Dlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
voidCMy1111Dlg:
:
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();
}
}
HCURSORCMy1111Dlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMy1111Dlg:
:
OnCloseupCombo1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
if(m_nYear!
=0){
RedrawWindow();
f=(m_nYear-1)/400*c+((m_nYear-1)%400)/100*b+(((m_nYear-1)%400)%100)/4*a+(((m_nYear-1)%400)%100)%4*365;
CStatic*pDraw=(CStatic*)GetDlgItem(IDC_STATIC);
CDC*pDC=pDraw->GetDC();
pDC->SetBkMode(TRANSPARENT);
for(inti=0;i<3;i=i++)
{pDC->MoveTo(0,i*118+10);pDC->LineTo(708,i*118+10);}
for(intj=0;j<7;j=j++)
{pDC->MoveTo(j*118,10);pDC->LineTo(j*118,246);}
for(i=0;i<7;i=i++)
for(j=0;j<12;j=j++)
{pDC->TextOut(j%6*118+16*i+5,j/6*118+12,str[i]);
}
for(j=0;j<12;j++)
for(i=0;i<31;i++)
{switch(j+1)
{case1:
e=0;break;
case2:
e=31;break;
case3:
e=31+28;break;
case4:
e=31+28+31;break;
case5:
e=31+28+31+30;break;
case6:
e=31+28+31+30+31;break;
case7:
e=31+28+31+30+31+30;break;
case8:
e=31+28+31+30+31+30+31;break;
case9:
e=31+28+31+30+31+30+31+31;break;
case10:
e=31+28+31+30+31+30+31+31+30;break;
case11:
e=31+28+31+30+31+30+31+31+30+31;break;
case12:
e=31+28+31+30+31+30+31+31+30+31+30;break;}
if(m_nYear%100!
=0&&m_nYear%4==0||m_nYear%400==0)
if(j>1)e=e+1;
CStringstr;
str.Format("%d",i+1);
if(j==1&&!
(m_nYear%100!
=0&&m_nYear%400==0||m_nYear%400==0)&&i>27||j==1&&(m_nYear%100!
=0&&m_nYear%4000==0||m_nYear%400==0)&&i>28||(j==3||j==5||j==8||j==10)&&i>29)
continue;
pDC->TextOut((f+d+e+i)%7*16+j%6*118+5,j/6*118+((i+(f+d+e)%7)/7+1)*16+15,str);
}
}
}