机械时钟程序报告 本科毕业设计(论文).doc
课 程 设 计 报 告课程名称 C语言程序设计 课题名称 机械时钟的设计 专 业 电子信息 班 级 学 号 姓 名 指导教师 湖南工程学院课 程 设 计 任 务 书课程名称 C语言程序设计 课 题 机械时钟设计 专业班级 学生姓名 学 号 指导老师 审 批 一、设计内容与设计要求1 设计内容:机械时钟系统在屏幕上实现一个机械时钟,并且能够通过键盘上的按键完成时间的修改。目 录1.需求分析12程序总体设计13.程序详细设计24.程序运行结果115.参考资料136.总结体会137.程序源代码13机械时钟程序报告一、 需求分析根据老师的要求,要在屏幕上显示一个机械时钟并且显示当前的数字时钟以及日历。根据老师的要求,本程序要显示机械时钟就必须通过画图函数将机械表画出来。另外,本程序还用到延时函数,实现秒针,分针,时针的转动。树立起总体思想就开始设计整个程序。二、 程序总体设计本程序包含了一个主函数和六个子函数,主函数完成初始化时间(获取系统时间)以及时钟与日历的进制,同时还是调节六个子函数共同完成整个程序功能的实现。六个子函数分别完成显示机械表针和数字时钟、显示界面上的文字、显示日历、做表盘、做刻度以及重新设置程序的时间与日历。流程图如下:主函数,获取系统时间,完成时钟日历进制,设置画图窗口。做表盘,做刻度,做画图界面上一些无需变化的文字。画表针,显示数字时钟,显示日历延时一秒。时钟的秒数加一,并按时间进制控制其他时间项目输入现在的时间,并将该程序时钟的时间改成输入的时间擦去表针,擦去数字时针,擦去日历上回随时间变化的东西。按r键,进入修改界面三、 程序的详细设计1、画表盘、做刻度、显示界面上一些无需改动的文字void fun2()/做表盘setcolor(WHITE);circle(220,240,180);circle(220,240,170);circle(220,240,2);circle(220,240,110);void fun3()/做刻度int i,ix,iy,ix1,iy1;double i1;for(i=0;i<60;i+)i1=i*PI/30;ix=int(220+165*sin(i1);iy=int(240-165*cos(i1);ix1=int(220+105*sin(i1);iy1=int(240-105*cos(i1);setcolor(WHITE);if(i%15=0)bar(ix-5,iy-5,ix+5,iy+5);elsecircle(ix,iy,2);if(i%5=0)circle(ix1,iy1,5);circle(ix,iy,5);void fun4()/做界面上的文字char s1="机械时钟",s2="按r键重设时间",s3="按其他键退出",s4="制作人杨自然"setfont(50,40,"黑体");setcolor(RED);outtextxy(80,0,s1);setfont(22,16,"宋体");setcolor(BLUE);outtextxy(420,250,s2);outtextxy(420,300,s3);setcolor(BLUE);setfont(18,12,"宋体");outtextxy(400,455,s4);设计简单的表盘,即四个半径分别为2,110,170,180的同心圆。做刻度,在半径为110的圆盘上标出1到12点的位置,用半径为5小圆圈表示。在半径为170的圆盘上用标出1到12点的位置,用半径分别为2和五的同心圆表示,在1到六十的刻度上用半径为2的小圆圈表示,在3、6、9、12点的位置用边长为10的填充正方形表示。另外,在画图界面上显示一些必要的文字。2、画表针,显示数字时钟,显示日历void fun1(int h,int m,int s)/画时钟、分钟、秒钟,显示数字时钟double h1,m1,s1;int hx,hy,mx,my,sx,sy;s=s%60;m=m%60;h=h%24;s1=s*PI/30;m1=m*PI/30;h1=(h%12)*PI/6+m*PI/360;hx=int(220+100*sin(h1);hy=int(240-100*cos(h1);mx=int(220+140*sin(m1);my=int(240-140*cos(m1);sx=int(220+160*sin(s1);sy=int(240-160*cos(s1);setlinestyle(PS_SOLID, NULL, 2); setcolor(RED);line(220,240,sx,sy);setlinestyle(PS_SOLID, NULL, 6); setcolor(LIGHTGRAY);line(220,240,mx,my);setlinestyle(PS_SOLID, NULL, 10); setcolor(WHITE);line(220,240,hx,hy);TCHAR str15,str25,str35;setfont(20,18,"宋体");_stprintf(str1,"%d",s);_stprintf(str2,"%d",m);_stprintf(str3,"%d",h);setfont(20,16,"宋体");if(h>9)outtextxy(450,200,str3);elseouttextxy(450,200,"0");outtextxy(465,200,str3);outtextxy(490,200,":");if(m>9)outtextxy(510,200,str2);elseouttextxy(510,200,"0");outtextxy(525,200,str2);outtextxy(550,200,":");if(s>9)outtextxy(570,200,str1);elseouttextxy(570,200,"0");outtextxy(585,200,str1);void fun5(int d,int e,int f,int g) /日历的显示char c1="年",c2="月",c3="日"setfont(30,22,"宋体");TCHAR str15,str25,str35;_stprintf(str1,"%d",d);_stprintf(str2,"%d",e);_stprintf(str3,"%d",f);setfont(35,25,"宋体");setcolor(RED);outtextxy(440,70,str1);outtextxy(550,70,c1);setfont(20,18,"宋体");setcolor(WHITE);if(e<10)outtextxy(445,120,'0');outtextxy(465,120,str2);elseouttextxy(445,120,str2);outtextxy(480,120,c2);if(f<10)outtextxy(520,120,'0');outtextxy(540,120,str3);elseouttextxy(520,120,str3);outtextxy(560,120,c3);setcolor(CYAN);switch(g)case 1: outtextxy(460,160,"星期一");break;case 2: outtextxy(460,160,"星期二");break;case 3: outtextxy(460,160,"星期三");break;case 4: outtextxy(460,160,"星期四");break;case 5: outtextxy(460,160,"星期五");break;case 6: outtextxy(460,160,"星期六");break;case 7: outtextxy(460,160,"星期日");break;通过获取的系统时间,计算出个表针的角度以及表针的终点,画出表针,并设置不同的大小、长度与颜色,以便用户的区分。在机械时钟的右侧,显示出从系统获得的日历。3、修改部分void fun6(int *a,int *b,int *c,int *d,int *e,int *f,int *g)/重新设定时间日期int m,n;printf("请问你是要修改时间还是修改日期n");printf("*n");printf("* 修改时间请按“1”,然后回车 *n");printf("* 修改日期请按“2”,然后回车 *n");printf("* 退出请按“3”,然后回车 *n");printf("*n");scanf("%d",&m);switch(m)case 1:printf("请输入当前是几点几分几秒,用逗号隔开n");scanf("%d,%d,%d",a,b,c);printf("请问是否继续修改日期n");printf("*n");printf("*继续修改请按“1”,退出请按“2”*n");printf("*n");scanf("%d",&n);if(n=2)break;case 2: printf("请输入当前是哪年哪月哪日星期几,用逗号隔开n"); scanf("%d,%d,%d,%d",d,e,f,g); break; 通过使用指针,更该当前时钟程序的当前时间与日历,并将其反馈到主函数。4、主函数void main() /主函数 获取系统时间 给各个函数传送相关的时间信息int a=0,b=0,c=0,d,e,f,g,h=1;SYSTEMTIME t;GetLocalTime(&t); a=t.wHour;b=t.wMinute;c=t.wSecond;d=t.wYear;e=t.wMonth;f=t.wDay;g=t.wDayOfWeek;initgraph(640, 480);fun3();fun2();fun4();setwritemode(R2_XORPEN);while(h=1)fun1(a,b,c);fun5(d,e,f,g);Sleep(1000);fun1(a,b,c);fun5(d,e,f,g);c+;if(c%60=0)b+;if(b%60=0)a+;if(a%24=0)f+;g+;if(e%2=1&&e<8)|(e%2=0&&e>7)&&f=31)/日历进制e+;if(e%2=0&&e<8)|(e%2=1&&e>7)&&f=30)e+;if(e%2=1&&e<8)|(e%2=0&&e>7)&&f>31)f=f%31;if(e%2=0&&e<8)|(e%2=1&&e>7)&&f>30)f=f%30;char str;if(kbhit()!=0)str=getch();if(str='r'|str='R')closegraph();fun6(&a,&b,&c,&d,&e,&f,&g);initgraph(640, 480);fun3();fun2();fun4();setwritemode(R2_XORPEN);else h+;closegraph(); e=e%12;主函数,获取系统时间,完成各个函数之间的数据交换,实现各个函数之间所要求的功能。四、 程序的运行结果1、 时钟界面,在设置的画图窗口中显示出机械时钟,数字时钟,日历,以及其他一些文字说明。运行图如下:上图即为运行程序是的结果2、 当运行程序后按r键,程序立刻进入时间修改界面,运行图如下:输入上图数字后,回车,可得下图该图为修改后机械时钟的界面。五、 参考资料C语言程序设计方法邓文心 张宏烈主编哈尔滨工业大学出版社出版六、 总结体会本次程序设计按照老师的要求是未完成一个机械时钟的现实,由于我所学C语言知识的局限,基本不知道该从何下手。但是我根据程序的要求首先从简单地方开始入手,即搜集此次程序设计需要用到的库函数。于是我从网络上找到了延时是函数Sleep(),并且知道C语言上有一个画图函数库,其头文件是graphics.h,该头文件没有包含在我所使用的V里面,经过经一步的搜索,我从网上得知知要在上安装EasyX程序即可使我使用的能够正常的使用画图函数库里的函数,我半信半疑的按照网上的说法做了,并达到了预期的效果。其实,我在一开始便在网上搜到了一个机械时钟的模板,但是由于画图函数库不能通过,模板也不能运行。但是,自我安装了EasyX程序后我在网上搜的程序已经能够正常运行,这使我非常欣喜。我浏览了一下模板程序,其实,我主要是看了它的一些注释和一些特殊的函数,然后我便开始编程了。我在图书馆接了一本语言程序设计,那本书讲的是在上编译的,但是里面有一章专门讲的是语言画图,里面提到了许多用于画图的库函数,我仔细的看了那一章,体会了那些函数的用法,到此,我的前期准备工作算是做完了。老实说,此次程序设计我感觉像是对画图函数的一种深刻的理解吧。基本上我做的一切都建立在画图界面上。或许是因为准备充分,很快,我就完成了机械时钟的设计,并开始设计其他东西。一天老师检查成果,听到我说参考了网上的模板,不怎么高兴,说如果什么都去网上查不自己动脑想想,怎么能得到进步了,于是便对我提了进一步的要求,即显示数字时钟与日历,还要完成时钟日历的修改功能。在完成机械时钟后这些好像对我来说不是什么难题了,不久我便完成了整个程序的设计。在本次的程序设计中,我的确收益匪浅。通过对语言的进一步了解,我开始明白我在书上学到的知识是十分有限的,要想提高自己的编程能力,不仅要扎实语言的基础,同时还要更多阅读其他的相关资料,丰富自己的知识,这样在编程方面才可能得到进一步的提高。七、 源程序#include <graphics.h>/图形库头文件#include<stdio.h>/输入输出头文件#include <conio.h>#include <math.h>#define PI 3.1415926void fun1(int h,int m,int s)/画时钟、分钟、秒钟,显示数字时钟double h1,m1,s1;int hx,hy,mx,my,sx,sy;s=s%60;m=m%60;h=h%24;s1=s*PI/30;m1=m*PI/30;h1=(h%12)*PI/6+m*PI/360;hx=int(220+100*sin(h1);hy=int(240-100*cos(h1);mx=int(220+140*sin(m1);my=int(240-140*cos(m1);sx=int(220+160*sin(s1);sy=int(240-160*cos(s1);setlinestyle(PS_SOLID, NULL, 2); setcolor(RED);line(220,240,sx,sy);setlinestyle(PS_SOLID, NULL, 6); setcolor(LIGHTGRAY);line(220,240,mx,my);setlinestyle(PS_SOLID, NULL, 10); setcolor(WHITE);line(220,240,hx,hy);TCHAR str15,str25,str35;setfont(20,18,"宋体");_stprintf(str1,"%d",s);_stprintf(str2,"%d",m);_stprintf(str3,"%d",h);setfont(20,16,"宋体");if(h>9)outtextxy(450,200,str3);elseouttextxy(450,200,"0");outtextxy(465,200,str3);outtextxy(490,200,":");if(m>9)outtextxy(510,200,str2);elseouttextxy(510,200,"0");outtextxy(525,200,str2);outtextxy(550,200,":");if(s>9)outtextxy(570,200,str1);elseouttextxy(570,200,"0");outtextxy(585,200,str1);void fun4()/做界面上的文字char s1="机械时钟",s2="按r键重设时间",s3="按其他键退出",s4="制作人杨自然"setfont(50,40,"黑体");setcolor(RED);outtextxy(80,0,s1);setfont(22,16,"宋体");setcolor(BLUE);outtextxy(420,250,s2);outtextxy(420,300,s3);setcolor(BLUE);setfont(18,12,"宋体");outtextxy(400,455,s4);void fun5(int d,int e,int f,int g) /日历的显示char c1="年",c2="月",c3="日"setfont(30,22,"宋体");TCHAR str15,str25,str35;_stprintf(str1,"%d",d);_stprintf(str2,"%d",e);_stprintf(str3,"%d",f);setfont(35,25,"宋体");setcolor(RED);outtextxy(440,70,str1);outtextxy(550,70,c1);setfont(20,18,"宋体");setcolor(WHITE);if(e<10)outtextxy(445,120,'0');outtextxy(465,120,str2);elseouttextxy(445,120,str2);outtextxy(480,120,c2);if(f<10)outtextxy(520,120,'0');outtextxy(540,120,str3);elseouttextxy(520,120,str3);outtextxy(560,120,c3);setcolor(CYAN);switch(g)case 1: outtextxy(460,160,"星期一");break;case 2: outtextxy(460,160,"星期二");break;case 3: outtextxy(460,160,"星期三");break;case 4: outtextxy(460,160,"星期四");break;case 5: outtextxy(460,160,"星期五");break;case 6: outtextxy(460,160,"星期六");break;case 7: outtextxy(460,160,"星期日");break;void fun2()/做表盘setcolor(WHITE);circle(220,240,180);circle(220,240,170);circle(220,240,2);circle(220,240,110);void fun3()/做刻度int i,ix,iy,ix1,iy1;double i1;for(i=0;i<60;i+)i1=i*PI/30;ix=int(220+165*sin(i1);iy=int(240-165*cos(i1);ix1=int(220+105*sin(i1);iy1=int(240-105*cos(i1);setcolor(WHITE);if(i%15=0)bar(ix-5,iy-5,ix+5,iy+5);elsecircle(ix,iy,2);if(i%5=0)circle(ix1,iy1,5);circle(ix,iy,5);void fun6(int *a,int *b,int *c,int *d,int *e,int *f,int *g)/重新设定时间日期int m,n;printf("请问你是要修改时间还是修改日期n");printf("*n");printf("* 修改时间请按“1”,然后回车 *n");printf("* 修改日期请按“2”,然后回车 *n");printf("* 退出请按“3”,然后回车 *n");printf("*n");scanf("%d",&m);switch(m)case 1:printf("请输入当前是几点几分几秒,用逗号隔开n");scanf("%d,%d,%d",a,b,c);printf("请问是否继续修改日期n");printf("*n");printf("*继续修改请按“1”,退出请按“2”*n");printf("*n");scanf("%d",&n);if(n=2)break;case 2: printf("请输入当前是哪年哪月哪日星期几,用逗号隔开n"); scanf("%d,%d,%d,%d",d,e,f,g); break; void main() /主函数 获取系统时间 给各个函数传送相关的时间信息int a=0,b=0,c=0,d,e,f,g,h=1;SYSTEMTIME t;GetLocalTime(&t); a=t.wHour;b=t.wMinute;c=t.wSecond;d=t.wYear;e=t.wMonth;f=t.wDay;g=t.wDayOfWeek;initgraph(640, 480);fun3();fun2();fun4();setwritemode(R2_XORPEN);while(h=1)fun1(a,b,c);fun5(d,e,f,g);Sleep(1000);fun1(a,b,c);fun5(d,e,f,g);c+;if(c%60=0)b+;if(b%60=0)a+;if(a%24=0)f+;g+;if(e%2=1&&e<8)|(e%2=0&&e>7)&&f=31)/日历进制e+;if(e%2=0&&e<8)|(e%2=1&&e>7)&&f=30)e+;if(e%2=1&&e<8)|(e%2=0&&e>7)&&f>31)f=f%31;if(e%2=0&&e<8)|(e%2=1&&e>7)&&f>30)f=f%30;char str;if(kbhit()!=0)str=getch();if(str='r'|str='R')closegraph();fun6(&a,&b,&c,&d,&e,&f,&g);initgraph(640, 480);fun3();fun2();fun4();setwritemode(R2_XORPEN);else h+;closegraph(); e=e%12;if(e=0)e=12;