模拟时钟行走 C语言程序
C语言模拟时钟转动课程设计报告

《C语言程序设计》课程设计报告题目:模拟时钟转动程序班级:组别:组员:指导教师:目录第一章课程设计的题目 (2)1.1 C语言课程设计的题目 (2)第二章课程设计的要求 (2)2.1 C语言课程设计的要求 (2)第三章课程设计的目的 (2)3.1 C语言课程设计的目的 (2)第四章课程设计的内容 (3)4.1 C语言课程设计的程序清单和注释 (3)第五章课程设计的运行结果 (7)5.1 C语言课程设计的运行结果 (7)第六章课程设计的结果分析 (8)6.1 C语言课程设计的结果分析 (8)第七章课程设计的心得体会 (9)7.1 C语言课程设计的心得体会 (9)模拟时钟转动程序第一章课程设计的题目1.1 C语言课程设计的题目本次为期两周的课程设计的题目为设计一个模拟时钟转动的程序。
第二章课程设计的要求2.1 C语言课程设计的要求能模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。
第三章课程设计的目的3.1 C语言课程设计的目的加深对讲授内容的理解,尤其是一些语法规定。
通过课程设计,自然地、熟练地掌握。
熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。
学会上机调试程序。
第四章课程设计的内容4.1 C语言课程设计的程序清单和注释模拟时钟转动程序清单+注释#include<windows.h> //包含窗口头文件#include<math.h> //头文件,包含了一些数学计算的函数#define TWOPI (2*3.14159)#define IDTIMER 1 //计时器ID#define ANGLE TWOPI/360 //2PILRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam ); //回调函数Int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow ) // 应用启动函数mian{TCHAR szClassName[] = TEXT("analogCloc");MSG msg; //定义消息HWND hwnd; //窗口句柄WNDCLASS wndclass; //系统支持结构,定义并初始化窗口结构wndclass.cbClsExtra = 0; //窗口类无扩展wndclass.cbWndExtra = 0; //窗口势力无扩展wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//窗口背景为白色wndclass.hCursor = NULL;wndclass.hIcon = NULL;wndclass.hInstance = hInstance; //当前实例句柄wndclass.lpfnWndProc = WindowProc; //关联到消息回调函数wndclass.lpszClassName = szClassName;wndclass.lpszMenuName = NULL; //窗口中无菜单wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口重绘风格RegisterClass(&wndclass);hwndCreateWindow(szClassName,TEXT("Clock"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL, hInstance, NULL); //创建窗口ShowWindow(hwnd,nCmdShow); //显示窗口UpdateWindow(hwnd); //更新窗口,强制显示while(GetMessage(&msg,NULL,0,0)) //函数GetMessage 是从调用线程的消息队列里取得一个消息并将其放于指定的结构{TranslateMessage(&msg); //消息处理DispatchMessage(&msg); //消息派遣}return msg.wParam; //windows应用程序的消息循环形式}void setISOTROPIC(HDC hdc,int cxClient,int cyClient)//设置映射模式,使之成为笛卡尔坐标系的映射模式{SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,1000,1000,NULL); // 逻辑单位与设备单位比1/2 SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL);SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); //竖坐标向上为正,下为负}void drawClock(HDC hdc) // 画时钟圆盘{int x, y, radius; //以逻辑单位表示的窗口原点坐标SelectObject(hdc,CreateSolidBrush(RGB(1,148,138)));//设置整个窗口线条颜色for(int i=0;i<360;i+=6){x = (int)(cos(TWOPI/360*i)*900); //cos函数,包含在math.h头文件利的函数y = (int)(sin(TWOPI/360*i)*900);radius = !(i%5)?40:10;Ellipse(hdc,x-radius,y-radius,x+radius,y+radius);// 把弧度制转换成坐标形式,Ellipse函数用来画圆}}void drawHands(HDC hdc,SYSTEMTIME *pst,BOOL hChange)// draw hands函数负责绘制时钟的时针、分针和秒针的轮廓{int radius[3] = {500,700,850};int angle[3];angle[0] = pst->wHour*30+pst->wMinute/12*6;angle[1] = pst->wMinute*6;angle[2] = pst->wSecond*6;for(int i=hChange?0:2;i<3;i++){MoveToEx(hdc,0,0,NULL);LineTo(hdc,(int)(radius[i]*cos(ANGLE*(90-angle[i]))),(int)(radius[i]*sin(ANGLE*(90-angle[i]))));}}LRESULT CALLBACK WindowProc(HWND hwnd,UINT message, // 消息标识符,标识某个特定的消息WPARAM wParam,LPARAM lParam) //消息处理函数{TCHAR time[40];PAINTSTRUCT ps;HDC hdc;static int cxClient, cyClient;SYSTEMTIME st; //定义结构体变量static SYSTEMTIME preSt;BOOL hChange;switch(message) //switch 语句一个case代表一种情况{case WM_CREATE: // 窗口创建事件SetTimer(hwnd,IDTIMER,1000,NULL); //创建一个1000ms定时器GetLocalTime(&st); //得到当前系统时间wsprintf(time,TEXT("%d年%d月%d日%d时%d分%d秒"),//记录系统时间,包括年、月、日、时、分、秒st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);SetWindowText(hwnd,time); // 设置当前时间为窗口title preSt = st;return 0;case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_TIMER: //定时器到时,即是每隔一秒要重画下界面GetLocalTime(&st); //每次都要获取当前时间hChange = st.wHour!=preSt.wHour||st.wMinute!=preSt.wMinute;hdc = GetDC(hwnd);setISOTROPIC(hdc,cxClient,cyClient);SelectObject(hdc,GetStockObject(WHITE_PEN));drawHands(hdc,&preSt,hChange);SelectObject(hdc,GetStockObject(BLACK_PEN));drawHands(hdc,&st,TRUE);ReleaseDC(hwnd,hdc);wsprintf(time,TEXT("%d年%d月%d日%d时%d分%d秒"),//记录系统时间,包括年、月、日、时、分、秒st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);SetWindowText(hwnd,time); //setwindowText函数:系统里的函数preSt = st; // 更新完毕后记录前一次的状态return 0;case WM_KEYDOWN:case WM_CHAR:DestroyWindow(hwnd); // 关闭窗口return 0;case WM_PAINT: //窗口绘制消息hdc = BeginPaint(hwnd,&ps); //开始绘制setISOTROPIC(hdc,cxClient,cyClient);drawClock(hdc);drawHands(hdc,&preSt,TRUE);EndPaint(hwnd,&ps); //结束绘制return 0;case WM_DESTROY: //程序退出消息PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);//其他消息有系统默认处理}5.1 C语言课程设计的运行结果6.1 C语言课程设计的结果分析运行结果分析问题一:程序清单中某个符号添加错误,导致编译时出现错误,执行不出结果。
C语言51单片机时钟程序

} /*----------------------- 主函数 ------------------------- */
/*主函数*/
void main()
{
init_timer();
/*定时器 T0 初始化*/
while(1) /*无限循环*/
{
if(P2_4==0)scan_key(); /*有按键,调用按键扫描?函数*/
switch(set)
/*根据 set 键值散转*/
{
case 0:time(); break; /*走时时间程序*/
程序三
同时用两个定时器控制蜂鸣器发声, 定时器 0 控制频率,定时器 1 控制同个 频率持续的时间,间隔 2s 依次输出 1,10,50,100,200,400,800, 1k(hz)的方波
#include<reg52.h> //52 单片机头文件 #include <intrins.h> //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit beep=P2^3;
ET0=1;//开定时器 0 中断
TR0=1;//启动定时器 0
a=0xfe;
while(1);//等待中断产生
}
void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==2) {
用c语言实现钟表

1. 引入所需的头文件:你需要引入一些头文件来实现程序的功能,例如 stdio.h、stdlib.h、time.h 等。
2. 定义程序的数据结构:你可以定义一个结构体来表示钟表的时间,包括时、分、秒等字段。
3. 获取当前时间:使用 time 函数获取当前系统时间,并将其转换为时、分、秒等字段。
localTime->tm_sec);
22.
23.
// 暂停一秒钟
Байду номын сангаас
24.
sleep(1);
25. }
26.
27. return 0;
28. }
29. 这个程序会不断获取当前系统时间,并输出格式为"时:分:秒"的钟表界面。程序会每 秒钟更新一次时间,并在终端上显示。你可以根据需要进行适当的修改和扩展,例
time_t currentTime = time(NULL);
17.
struct tm *localTime = localtime(¤tTime);
18.
19.
// 输出钟表界面
20.
system("clear"); // 清屏(适用于 Linux 和 Mac)
21.
printf("%02d:%02d:%02d\n", localTime->tm_hour, localTime->tm_min,
7. 下面是一个简单的 C 语言实现钟表的代码示例:
8. c 复制代码
9. #include <stdio.h>
10. #include <stdlib.h>
用VC++制作_模拟时钟应用程序

(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。
为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。
另外,秒表需要采用单独的定时器消息控制。
4 程序清单按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。
(1) 添加表示年、月、日、时、分、秒的变量。
模拟时钟程序

1模拟时钟程序分析模拟时钟程序是tc图形模式编程的典型程序,主要用画圆、画线函数实现,程序流程图如图1:图1 时钟程序流程图代码如下:#include<graphics.h>#include<math.h>#include<dos.h>#define PI 3.1416void init_screen(int x0,int y0,int r0);void sec();main(){int x0=320,y0=240,r0=150; /* x0,y0 圆心坐标点*/init_screen(x0,y0,r0);sec();closegraph(); /* 关闭图形模式*/}void init_screen(int x0,int y0,int r0){int i,x,y,graphdriver,graphmode;char s[10];float alpha,a0=PI/2;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,"");setbkcolor(3);setcolor(2);circle(x0,y0,r0); /* 内圆*/circle(x0,y0,r0+30); /* 外圆*/setfillstyle(SOLID_FILL,10);/*设置填充模式和颜色*/floodfill(x0-r0-10,y0,2); /*填充一个有界区域*//* 填写时钟数字 */for(i=1;i<=12;i++){alpha=a0-30*i*PI/180;x=x0+cos(alpha)*r0-16;y=y0-sin(alpha)*r0;setcolor(4);settextstyle(0,0,2);/*为图形输出设置当前的文本属性settextstyle设置fornt 为字体:DEFAULT_FONT,TRIPLEX_FONT,SMALL_FONT,SANSSERIF_FONT,GOTHIC_FONT,也可以用0 ~ 4代替。
C语言运动的时钟

#include <graphics.h>#include <windows.h>#include <conio.h>#include <math.h>#define PI 3.1415926int main(void) //函数原型声明{voidDralDial();voidDrawHand(inthour, int minute, int second);initgraph(600, 600); //初始化600×600的绘图窗口setbkcolor(LIGHTMAGENTA); //设置背景色cleardevice(); //清空屏幕DralDial(); //画表盘setcolor(MAGENTA); //刻字outtextxy(235, 160, " 韩晶");outtextxy(235, 130, " 数计学院");outtextxy(235, 100, "武汉轻工大学");setwritemode(R2_XORPEN); //设置异或绘图方式SYSTEMTIME t; //定义变量保存当前时间while(!kbhit()){GetLocalTime(&t); //获取当前时间DrawHand(t.wHour, t.wMinute, t.wSecond); //画表针 Sleep(1000);DrawHand(t.wHour, t.wMinute, t.wSecond); //擦表针}closegraph(); //关闭绘图窗口return 0;}void DralDial() /*画表盘*/{inti;int x1, y1, x2, y2,x3,y3; //表心坐标系坐标char rome[][3]= {"12","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" } ; //数字setcolor(LIGHTGRAY); //画圆circle(300, 300, 250);circle(300, 300, 260);for(i = 0; i< 59; i++) // 画60条短线{setcolor(LIGHTGRAY);x1 = (int)(300 + (sin(i * PI / 30) * 250));y1 = (int)(300 - (cos(i * PI / 30) * 250));x2 = (int)(300 + (sin(i * PI / 30) * 260));y2 = (int)(300 - (cos(i * PI / 30) * 260));line(x1, y1, x2, y2);if(i%5==0){x3 = (int)(290 + (sin((i - 0.2) * PI / 30) * 220));y3 = (int)(290 - (cos((i - 0.2) * PI / 30) * 220));setcolor(YELLOW); //写表盘数字setfont(24, 0, "黑体");outtextxy(x3 , y3, rome[i / 5]);}}}void DrawHand(int hour, int minute, int second) //画指针{intxhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标 xhour = (int)(130 * sin( hour * PI / 6 + minute * PI / 360 + second * PI / 1800));yhour = (int)(130 * cos( hour * PI / 6 + minute * PI / 360 + second * PI / 1800));xminute = (int)(145 * sin( minute * PI / 30 + second * PI / 1800));yminute = (int)(145 * cos( minute * PI / 30 + second * PI / 1800));xsecond = (int)(200 * sin( second * PI / 30));ysecond = (int)(200 * cos( second * PI / 30));// setlinestyle(PS_SOLID, NULL, 10); //画时针setcolor(LIGHTGREEN);line(300 + xhour, 300 - yhour, 300 -xhour / 6, 300 + yhour / 6);// setlinestyle(PS_SOLID, NULL, 7); //画分针setcolor(LIGHTCYAN);line(300 + xminute, 300 - yminute, 300 -xminute / 4, 300 + yminute / 4);// setlinestyle(PS_SOLID, NULL, 3); //画秒针setcolor(RED);line(300 + xsecond, 300 - ysecond, 300 -xsecond / 3, 300 + ysecond / 3); }。
模拟时钟转动程序

东南大学C语言课程设计报告课程名称:计算机综合课程设计学院:土木工程学院设计题目:模拟时钟转动程序级别: B级学生姓名:***学号: ******** 同组学生:学号:指导教师:***2015年 9 月 1 日C语言课程设计任务书模拟时钟转动程序一、课程设计的内容1、能模拟机械钟表行走2、还要准确利用数字显示日期和时间3、在屏幕上显示一个活动时钟4、按任意键时程序退出。
二、课程设计应完成的工作1、编写完成相应题目的程序2、编写课程设计报告,课程设计报告应该包含以下6部分1)需求分析:包括设计题目、设计要求以及系统功能需求分析2)总体设计:包括系统总体设计框架和系统功能模块图3)详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图4)调试分析过程描述:包括测试数据、测试输出结果以及对程序测试过程中存在问题进行思考(主要问题的出错现象、出错原因、解决方法及其效果等,相应效果截图)5)总结:课程设计完成了哪些主要功能,是否有扩展功能?还有哪些地方需要改进?课程设计的学习与体会?有哪些合理化建议?6)附录:主要原程序代码含必要的注释3、答辩:在实验室建立程序运行环境,并在指导教师的监督下,独立解决问题,运行程序和回答教师的提问。
四、应收集的资料及其主要参考文献[1]谭浩强.C程序设计(第四版),北京:清华大学出版社,2010年6月[2]陈清华朱红 . C语言课程设计案例精选与编程指导(第一版),南京:东南大学出版社,2003年6月[3]顾小晶 . 实用C语言简明教程(第一版),北京:中国电力出版社,2003年9月目录1.设计目的与要求 (4)2.总体设计 (5)3.详细设计 (6)3.1画出钟表的轮廓3.2获取系统时间4.调试分析 (7)5.总结 (10)6.附录(程序) (11)7.答辩记录(正文处留出适当空白) (15)8.指导教师意见(正文处留出适当空白) (16)1.目的与要求要求:1、能模拟机械钟表行走2、还要准确利用数字显示日期和时间3、在屏幕上显示一个活动时钟4、按任意键时程序退出。
89C52单片机时钟显示C语言程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;sbit rw=P3^6;uchar count,s1num;char miao,fen,shi;uchar code table[]=" 2011-5-23 MON";uchar code table1[]=" 00:00:00";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){ rs=0;P0=com;lcden=0;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1;P0=date;lcden=0;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date)//写时分秒函数{uchar shi,ge;shi=date/10;//分解一个2位数的十位和个位ge=date%10;write_com(0x80+0x40+add);//设置显示位置write_date(0x30+shi);//送去液晶显示十位write_date(0x30+ge); //送去液晶显示个位}void init()//初始化函数{uchar num;dula=0;wela=0;lcden=1;fen=0;miao=0;shi=0;count=0;s1num=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void keyscan()//按键扫描函数{rd=0;if(s1==0){delay(5);if(s1==0)//确认功能键被按下{ s1num++;//功能键按下次数记录while(!s1);//释放确认if(s1num==1)//第一次被按下时{TR0=0; //关闭定时器write_com(0x80+0x40+10);//光标定位到秒位置write_com(0x0f); //光标开始闪烁}if(s1num==2)//第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x40+7);}if(s1num==3)//第三次按下光标闪烁定位到小时位置{write_com(0x80+0x40+4);}if(s1num==4)//第四次按下{s1num=0;//记录按键数清零write_com(0x0c);//取消光标闪烁TR0=1; //启动定时器使时钟开始走}}}if(s1num!=0)//只有功能键被按下后,增加和减小键才有效{if(s2==0){delay(5);if(s2==0)//增加键确认被按下{while(!s2);//按键释放if(s1num==1)//若功能键第一次按下{miao++; //则调整秒加1if(miao==60)//若满60后将清零miao=0;write_sfm(10,miao);//每调节一次送液晶显示一下write_com(0x80+0x40+10);//显示位置重新回到调节处}if(s1num==2)//若功能键第二次按下{fen++;//则调整分钟加1if(fen==60)//若满60后将清零fen=0;write_sfm(7,fen);//每调节一次送液晶显示一下write_com(0x80+0x40+7);//显示位置重新回到调节处}if(s1num==3)//若功能键第三次按下{shi++;//则调整小时加1if(shi==24)//若满24后将清零shi=0;write_sfm(4,shi);;//每调节一次送液晶显示一下write_com(0x80+0x40+4);//显示位置重新回到调节处}}}if(s3==0){delay(5);if(s3==0)//确认减小键被按下{while(!s3);//按键释放if(s1num==1)//若功能键第一次按下{miao--;//则调整秒减1if(miao==-1)//若减到负数则将其重新设置为59miao=59;write_sfm(10,miao);//每调节一次送液晶显示一下write_com(0x80+0x40+10);//显示位置重新回到调节处}if(s1num==2)//若功能键第二次按下{fen--;//则调整分钟减1if(fen==-1)//若减到负数则将其重新设置为59fen=59;write_sfm(7,fen);//每调节一次送液晶显示一下write_com(0x80+0x40+7);//显示位置重新回到调节处}if(s1num==3)//若功能键第二次按下{shi--;//则调整小时减1if(shi==-1)//若减到负数则将其重新设置为23shi=23;write_sfm(4,shi);//每调节一次送液晶显示一下write_com(0x80+0x40+4);//显示位置重新回到调节处}}}}}void main(){rw=0;init();while(1){keyscan();}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==18){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟时钟行走课程设计总体要求采用模块儿化程序设计;鼓励可视化编程;源程序中有足够的注释;学生可自行增加新功能模块儿;必须上机调试通过;注重算法运用,优化存储效率与运算效率;需提交源程序及相关文件;目录1 课程任务书2 系统设计3 模块设计3.1 总体结构3.2 流程图3.3 使用的主要函数4 调试及测试1、调试过程中的问题2、调试结果5 设计总结6 心得体会及致谢7 答辩记录8 教师意见一、课程设计任务书在屏幕上显示一个活动时钟;能模拟机械钟表行走;准确地利用数字显示日期和时间;按任意键时程序退出。
二、系统设计总体结构:在绘图窗口中先画出表盘后获取系统的时间,利用得到的系统时间计算表针的位置,并将时间在屏幕上输出。
每隔一秒读取一次时间,直到键盘有输入为止。
流程图开始初始化绘画窗口画表盘否获取系统时间结束使用的主要函数:setlinestyle 设置画线setcolor 设置颜色line(int x1,int y1,int x2,int y2)画直线circle(int x,int y,int r)画圆outtextxy(int x,int y,char *textstring)在指定位置输出字符initgraph(int x, int y); 初始化绘图窗口setwritemode( ); 设置绘图模式kbhit() 检查是否有键盘输入GetLocalTime(&ti); 获取当前时间sleep() 程序暂停若干时间三、模块设计主要模块功能、源代码及注释:1.计算表针的位置并画出表针void Drawzhizhen(int hour, int minute, int second){double a_hour, a_min, a_sec; // 时、分、秒针的弧度值int x_hour, y_hour, x_min, y_min, x_sec, y_sec; // 时、分、秒针的位置a_sec = second * 2 * PI / 60; // 计算时、分、秒针的弧度值a_min = minute * 2 * PI / 60 + a_sec / 60;a_hour= hour * 2 * PI / 12 + a_min / 12;x_sec = int(120 * sin(a_sec)); y_sec = int(120 * cos(a_sec)); ///计算时、分、秒针的位置x_min = int(100 * sin(a_min)); y_min = int(100 * cos(a_min));x_hour= int(70 * sin(a_hour)); y_hour= int(70 * cos(a_hour));setlinestyle(PS_SOLID, NULL, 10); // 画时针setcolor(BLUE);line(300 + x_hour, 240 - y_hour, 300, 240 );setlinestyle(PS_SOLID, NULL, 5);// 画分针setcolor(GREEN);line(300 + x_min, 240 - y_min, 300, 240 );setlinestyle(PS_SOLID, NULL, 2); // 画秒针setcolor(WHITE);line(300 + x_sec, 240 - y_sec, 300, 240 );}2.画表盘void Drawbiaopan(){int i,l,x1,x2,y1,y2;setbkcolor(1);circle(300,240,180);circle(300,240,185);for(i=0;i<60;i++) /*划钟点上的短线*/ {if(i%5==0)l=15;elsel=5;x1=180*sin(i*6*PI/180)+300;y1=180*cos(i*6*PI/180)+240;x2=(180-l)*sin(i*6*PI/180)+300;y2=(180-l)*cos(i*6*PI/180)+240;line(x1,y1,x2,y2);}outtextxy(300,80,"12") ;outtextxy(300,390,"6");outtextxy(140,230,"9");outtextxy(460,230,"3");outtextxy(380,100,"1");outtextxy(220,100,"11");outtextxy(430,160,"2");outtextxy(430,310,"4");outtextxy(380,370,"5");outtextxy(220,370,"7");outtextxy(160,160,"10");outtextxy(160,310,"8");}3.将获取的整数型时间变量转换成字符型void ch1(int a,int x) //将年转换成字符型并输出{char b,c,d,e;b=(char)(a/1000+48);c=(char)((a%1000)/100+48);d=(char)((a%100)/10+48);e=(char)(a%10+48);outtextxy(x,10,b);outtextxy(x+10,10,c);outtextxy(x+20,10,d);outtextxy(x+30,10,e);}void ch2(int a,int x) //其他时间转换成字符型并输出{char b,c;b=(char)(a/10+48);c=(char)(a%10+48);outtextxy(x,10,b);outtextxy(x+10,10,c);}主函数:void main(){initgraph(640, 480); // 初始化绘图窗口Drawbiaopan(); // 绘制表盘setwritemode(R2_XORPEN); // 设置绘图模式SYSTEMTIME ti; // 定义ti保存当前时间while(!kbhit()) // 按任意键退出钟表程序{GetLocalTime(&ti); // 获取当前时间ch1(ti.wYear,10);outtextxy(50,10,"年"); //输出时间ch2(ti.wMonth,65);outtextxy(85,10,"月");ch2(ti.wDay,100);outtextxy(120,10,"日");ch2(ti.wHour,135);outtextxy(155,10,":");ch2(ti.wMinute,165);outtextxy(185,10,":");ch2(ti.wSecond,195);Drawzhizhen(ti.wHour, ti.wMinute, ti.wSecond); // 画表针Sleep(1000); // 延时1 秒Drawzhizhen(ti.wHour, ti.wMinute, ti.wSecond); // 画表针}closegraph(); // 关闭绘图窗口}四调试及测试使用vc企业版进行反复调试五设计总结调试过程出现的问题:1.Vc++6.0中没有“graphics.h”,安装turboc.2.0中的函数库EasyX后出现权限问题。
解决办法:安装vc企业版解决权限问题,然后导入graphics.h。
2.无法获取系统时间解决办法:使用函数GetLocalTime( );并使用#include <time.h>声明3.Outtextxy()函数无法显示整数型时间解决办法:将整数型时间变量转换为字符型再输出六、心得体会及致谢由于C语言没有学过图形方面的知识,很多东西都要去查资料。
在设计的过程中遇到很多问题,都需要花很多时间去尝试,去解决。
这个程序总体来说不复杂,思路也简单,编写的过程中询问了相关知识的专业人士,上网搜集很多前人所作的资料,查询借阅图书馆的相关书籍,对自己在思维方面的帮助很大。
参考文献1.谭浩强著,C程序设计(第三版),北京:清华大学出版社。
2. Gary J.Bronson著,刘勇译,C++程序开发与设计(第二版)北京:人民邮电出版社3.朱站立编著,数据结构——使用C语言(第4版)北京:电子工业出版社4.谭浩强,张基温,唐永炎编著,C语言程序设计教程,北京:高等教育出版社19925.谭浩强编著,C程序设计题解与上机指导(第二版),北京:清华大学出版社,19926.谭浩强编著,QBASIC语言教程,北京:电子工业出版社,19977.谭浩强编著,田数清编著,PASCAL语言程序设计(第二版),北京:高等教育出版社,19988.C程序编写组,常用C语言用法速查手册,北京:龙门书局,19959.H M Peitel,P J Deitei.C How to progrom,second Edition. 蒋才鹏等译,C程序设计教程,北京:机械工业出版社,200010.Herbert Schild著,王曦若,李沛译,ANSIC标准详解,北京:学院出版社,1994七、答辩记录八、教师意见。