时钟程序实验报告
- 格式:doc
- 大小:349.45 KB
- 文档页数:22
程序设计实践设计报告课题名称:时钟改进程序学生姓名:陈宸班级: 2 0 1 3 2 1 1 1 1 3班内序号:12学号: 2 0 1 3 21 0 3 75日期:2015.6.131、课题概述1.1 课题目标和主要内容主要内容:根据所提供的时钟代码,新建派生类,利用WINDOWS AP 设计和绘制图形。
目标:以培养学生动手实践能力为目的,重点是在学习C++程序设计和数据结构的基础上,使学生从实践中学习如何综合运用C++和数据结构的相关知识解决实际应用中的问题,了解程序设计的基本思想在具体实际应用中的体现,掌握分析问题、解决问题的方法,从而提高学生的编程能力,达到编程熟练、会调试、代码书写规范的基本要求,具备简单应用程序的设计、实现能力。
本实验使用的开发平台为visual studio2012集成开发环境,工程类型为Win32 Console Application,采用的主要工具为C++编程语言。
1.2系统的主要功能功能框图:功能列表及说明:2、系统设计2.1 系统总体框架①设计思路:2.2系统详细设计①程序流程图及描述遵循了MVC设计模式:(1)设计Moldel。
及工作区和时钟的存储结构用来方便的存取数据;(2)设计View。
即如何根据数据显示不同的界面;(3)设计COntroller。
即如何用键盘控制时间的变化。
②类关系图及描述没有定义类结构,直接是各个功能函数在主函数中根据获取到的不同按键以及游戏的具体情况而被调用。
所以这里代替类关系及描述介绍所用到的各功能函数:HBRUSH brush-- 实心刷子:系统用来绘制要填充图形的内部区域的位图;SelectObject--恢复原来画刷;PatBlt--用选入设备环境中的刷子绘制给定的矩形区域;2.3关键算法分析算法1:窗口过程函数[1] 算法功能:当按下指定菜单,窗口需要运行相应的处理函数。
[2] 算法基本思想在API 里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc 函数不处理这个消息,就可以把它转向DefWindowProc 函数来处理,这是系统的默认消息处理函数。
[3]算法空间、时间复杂度分析:算法时间空间复杂度均为O(1)。
[4]源代码:I NT_PTR CALLBACK Alter(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}else if(LOWORD(wParam) == IDOK ){bbh=0;HWND hDialog_1 = ::FindWindow(NULL,"修改时间");//获取有edit框窗口的句柄。
GetWindowText(GetDlgItem(hDialog_1,IDC_EDIT1),tmp1,4);//MessageBox(hDialog_1,tmp1,"ddd1",IDOK);GetWindowText(GetDlgItem(hDialog_1,IDC_EDIT2),tmp2,4);//MessageBox(hDialog_1,tmp2,"ddd2",IDOK);GetWindowText(GetDlgItem(hDialog_1,IDC_EDIT3),tmp3,4);//MessageBox(hDialog_1,tmp3,"ddd3",IDOK);a1=atoi(tmp1);a2=atoi(tmp2);a3=atoi(tmp3);z=a1*3600+a2*60+a3-(time(NULL)-((time(NULL)/(3600*24))*(3600*24)))-8*3600;EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;}[5]算法目的:处理应用程序菜单- 发送退出消息并返回WM_PAINT -绘制主窗口目的: 处理主窗口的消息。
算法2:绘图函数[1] 算法功能运行函数时,绘出相应图形。
[2] 算法基本思想设置double x, double y, double ra, double rb,COLORREF mColor 等变量,当运行函数时根据相应参数画出图形在这里我新建了一个重载函数和类,多定义了COLORREF icolor 变量。
oColor 指的是画圆的笔的颜色,而icolor 则是填充圆的画刷的颜色。
通过在void GraphicWindow::ellipse 中新建笔和刷子用来绘图,最后将比和刷子的颜色恢复成预制,删除新建笔刷。
[3]算法空间、时间复杂度分析:算法时间空间复杂度均为O(1)。
[4]源代码:#include"cstdio"#include"ccc_shap.h"Point::Point(){x = 0.0, y = 0.0;}Point::Point(double x1, double y1){x = x1, y = y1;}double Point::get_x() const{return x;}double Point::get_y() const{return y;}COLORREF Point::get_color() const{return color;}void Point::move(double dx, double dy){x += dx;y += dy;}void Point::SetColor(COLORREF mColor){color=mColor;}/*-------------------------------------------------------------------------*/Circle::Circle(){radius = 0.0;}Circle::Circle(Point p, double r){center = p, radius = r;}Point Circle::get_center() const{return center;}double Circle::get_radius() const{return radius;}COLORREF Circle::get_color() const{return color;}void Circle::move(double dx, double dy){center.move(dx, dy);}void Circle::SetColor(COLORREF mColor){color=mColor;}/*-------------------------------------------------------------------------*/Line::Line(){}Line::Line(Point p1, Point p2){from = p1, to = p2;}Point Line::get_start() const{return from;}Point Line::get_end() const{return to;}COLORREF Line::get_color() const{return color;}void Line::move(double dx, double dy){from.move(dx, dy);to.move(dx, dy);}void Line::SetColor(COLORREF mColor){color=mColor;}算法3:时间转换函数[1] 算法功能进行两地时间的转换。
[2] 算法基本思想通过两者间的比较和计算机之间的比较来确定时间。
[3]算法空间、时间复杂度分析:算法时间空间复杂度均为O(1)。
[4]源代码:localtime_s(&local,&t);x_s=0.89*radius*sin(PI*(local.tm_sec)/30);y_s=0.89*radius*cos(PI*(local.tm_sec)/30);x_m=0.7*radius*sin(PI*(local.tm_min)/30);y_m=0.7*radius*cos(PI*(local.tm_min)/30);x_h=0.5*radius*sin(PI*(local.tm_hour)/6);y_h=0.5*radius*cos(PI*(local.tm_hour)/6);Point hEnd(x_h,y_h),mEnd(x_m,y_m),sEnd(x_s,y_s);Line hLine(org,hEnd),mLine(org,mEnd),sLine(org,sEnd);hLine.SetColor((RGB(255,0,0))); // 红色mLine.SetColor((RGB(0,255,0))); // 绿色sLine.SetColor((RGB(255,255,0))); // 黄色cwin<<hLine<<mLine<<sLine<<org;cwin<<Message(Point(-2,8),local.tm_hour);cwin<<Message(Point(-1,8),":");cwin<<Message(Point(0,8),local.tm_min);cwin<<Message(Point(1,8),":");cwin<<Message(Point(2,8),local.tm_sec);}算法4:手动输入时间程序[1] 算法功能运行两时钟时,能手动设置初始时间。
[2] 算法基本思想重新设置一个控制台窗口,通过这一窗口来设置时钟的初始时间。
[3]算法空间、时间复杂度分析:算法时间空间复杂度均为O(1)。
[4]源代码:int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR, int nShowCmd){MSG msg;WNDCLASS wndclass;if (!hPrevInstance){wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = ccc_win_proc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);wndclass.lpszMenuName =MAKEINTRESOURCE(IDC_TEST2);wndclass.lpszClassName = "CCC_WIN";RegisterClass (&wndclass);}char title[80]="模拟时钟";HWND hwnd = CreateWindow("CCC_WIN",title,WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,GetSystemMetrics(SM_CYFULLSCREEN) * 3 / 4,GetSystemMetrics(SM_CYFULLSCREEN) * 3 / 4,NULL,NULL,hInstance,0);ShowWindow(hwnd, nShowCmd);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}2.4 其他使用了尽量减少值传递,多用引用来传递参数……有助于提高代码简洁和效率的方法。