机械时钟的设计毕业设计论文.docx
- 文档编号:10135049
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:27
- 大小:148.17KB
机械时钟的设计毕业设计论文.docx
《机械时钟的设计毕业设计论文.docx》由会员分享,可在线阅读,更多相关《机械时钟的设计毕业设计论文.docx(27页珍藏版)》请在冰点文库上搜索。
机械时钟的设计毕业设计论文
课程设计报告
课程名称C语言程序设计
课题名称机械时钟的设计
专业电子信息
班级
学号
姓名
指导教师
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题机械时钟设计
专业班级
学生姓名
学号
指导老师
审批
一、设计内容与设计要求
1.设计内容:
机械时钟系统
在屏幕上实现一个机械时钟,并且能够通过键盘上的按键完成时间的修改。
目录
1.需求分析1
2程序总体设计1
3.程序详细设计2
4.程序运行结果11
5.参考资料13
6.总结体会13
7.程序源代码13
机械时钟程序报告
一、需求分析
根据老师的要求,要在屏幕上显示一个机械时钟并且显示当前的数字时钟以及日历。
根据老师的要求,本程序要显示机械时钟就必须通过画图函数将机械表画出来。
另外,本程序还用到延时函数,实现秒针,分针,时针的转动。
树立起总体思想就开始设计整个程序。
二、程序总体设计
本程序包含了一个主函数和六个子函数,主函数完成初始化时间(获取系统时间)以及时钟与日历的进制,同时还是调节六个子函数共同完成整个程序功能的实现。
六个子函数分别完成显示机械表针和数字时钟、显示界面上的文字、显示日历、做表盘、做刻度以及重新设置程序的时间与日历。
流程图如下:
三、程序的详细设计
1、画表盘、做刻度、显示界面上一些无需改动的文字
voidfun2()//做表盘
{
setcolor(WHITE);
circle(220,240,180);
circle(220,240,170);
circle(220,240,2);
circle(220,240,110);
}
voidfun3()//做刻度
{inti,ix,iy,ix1,iy1;
doublei1;
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);}
else
circle(ix,iy,2);
if(i%5==0)
{circle(ix1,iy1,5);
circle(ix,iy,5);}
}
}
voidfun4()//做界面上的文字
{
chars1[]={"机械时钟"},
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、画表针,显示数字时钟,显示日历
voidfun1(inth,intm,ints)//画时钟、分钟、秒钟,显示数字时钟
{doubleh1,m1,s1;
inthx,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);
TCHARstr1[5],str2[5],str3[5];
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);
}
else
{
outtextxy(450,200,"0");
outtextxy(465,200,str3);
}
outtextxy(490,200,":
");
if(m>9)
{
outtextxy(510,200,str2);
}
else
{
outtextxy(510,200,"0");
outtextxy(525,200,str2);
}
outtextxy(550,200,":
");
if(s>9)
{
outtextxy(570,200,str1);
}
else
{
outtextxy(570,200,"0");
outtextxy(585,200,str1);
}
}
voidfun5(intd,inte,intf,intg)//日历的显示
{
charc1[]={"年"},
c2[]={"月"},
c3[]={"日"};
setfont(30,22,"宋体");
TCHARstr1[5],str2[5],str3[5];
_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);}
else
outtextxy(445,120,str2);
outtextxy(480,120,c2);
if(f<10)
{outtextxy(520,120,'0');
outtextxy(540,120,str3);}
else
outtextxy(520,120,str3);
outtextxy(560,120,c3);
setcolor(CYAN);
switch(g)
{
case1:
outtextxy(460,160,"星期一");
break;
case2:
outtextxy(460,160,"星期二");
break;
case3:
outtextxy(460,160,"星期三");
break;
case4:
outtextxy(460,160,"星期四");
break;
case5:
outtextxy(460,160,"星期五");
break;
case6:
outtextxy(460,160,"星期六");
break;
case7:
outtextxy(460,160,"星期日");
break;
}
}
通过获取的系统时间,计算出个表针的角度以及表针的终点,画出表针,并设置不同的大小、长度与颜色,以便用户的区分。
在机械时钟的右侧,显示出从系统获得的日历。
3、修改部分
voidfun6(int*a,int*b,int*c,int*d,int*e,int*f,int*g)//重新设定时间日期
{
intm,n;
printf("请问你是要修改时间还是修改日期\n");
printf("*************************************\n");
printf("*修改时间请按“1”,然后回车*\n");
printf("*修改日期请按“2”,然后回车*\n");
printf("*退出请按“3”,然后回车*\n");
printf("*************************************\n");
scanf("%d",&m);
switch(m)
{
case1:
{
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;
}
}
case2:
{
printf("请输入当前是哪年哪月哪日星期几,用逗号隔开\n");
scanf("%d,%d,%d,%d",d,e,f,g);
break;
}
}
}
通过使用指针,更该当前时钟程序的当前时间与日历,并将其反馈到主函数。
4、主函数
voidmain()//主函数获取系统时间给各个函数传送相关的时间信息
{inta=0,b=0,c=0,d,e,f,g,h=1;
SYSTEMTIMEt;
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;
}
charstr;
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,该头文件没有包含在我所使用的VC里面,经过经一步的搜索,我从网上得知知要在VC上安装EasyX程序即可使我使用的VC能够正常的使用画图函数库里的函数,我半信半疑的按照网上的说法做了,并达到了预期的效果。
其实,我在一开始便在网上搜到了一个机械时钟的模板,但是由于画图函数库不能通过,模板也不能运行。
但是,自我安装了EasyX程序后我在网上搜的程序已经能够正常运行,这使我非常欣喜。
我浏览了一下模板程序,其实,我主要是看了它的一些注释和一些特殊的函数,然后我便开始编程了。
我在图书馆接了一本《C语言程序设计》,那本书讲的是在TC上编译的,但是里面有一章专门讲的是C语言画图,里面提到了许多用于画图的库函数,我仔细的看了那一章,体会了那些函数的用法,到此,我的前期准备工作算是做完了。
老实说,此次程序设计我感觉像是对画图函数的一种深刻的理解吧。
基本上我做的一切都建立在画图界面上。
或许是因为准备充分,很快,我就完成了机械时钟的设计,并开始设计其他东西。
一天老师检查成果,听到我说参考了网上的模板,不怎么高兴,说如果什么都去网上查不自己动脑想想,怎么能得到进步了,于是便对我提了进一步的要求,即显示数字时钟与日历,还要完成时钟日历的修改功能。
在完成机械时钟后这些好像对我来说不是什么难题了,不久我便完成了整个程序的设计。
在本次的程序设计中,我的确收益匪浅。
通过对C语言的进一步了解,我开始明白我在书上学到的知识是十分有限的,要想提高自己的编程能力,不仅要扎实C语言的基础,同时还要更多阅读其他的相关资料,丰富自己的知识,这样在编程方面才可能得到进一步的提高。
七、源程序
#include
#include
#include
#include
#definePI3.1415926
voidfun1(inth,intm,ints)//画时钟、分钟、秒钟,显示数字时钟
{doubleh1,m1,s1;
inthx,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);
TCHARstr1[5],str2[5],str3[5];
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);
}
else
{
outtextxy(450,200,"0");
outtextxy(465,200,str3);
}
outtextxy(490,200,":
");
if(m>9)
{
outtextxy(510,200,str2);
}
else
{
outtextxy(510,200,"0");
outtextxy(525,200,str2);
}
outtextxy(550,200,":
");
if(s>9)
{
outtextxy(570,200,str1);
}
else
{
outtextxy(570,200,"0");
outtextxy(585,200,str1);
}
}
voidfun4()//做界面上的文字
{
chars1[]={"机械时钟"},
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);
}
voidfun5(intd,inte,intf,intg)//日历的显示
{
charc1[]={"年"},
c2[]={"月"},
c3[]={"日"};
setfont(30,22,"宋体");
TCHARstr1[5],str2[5],str3[5];
_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);}
else
outtextxy(445,120,str2);
outtextxy(480,120,c2);
if(f<10)
{outtextxy(520,120,'0');
outtextxy(540,120,str3);}
else
outtextxy(520,120,str3);
outtextxy(560,120,c3);
setcolor(CYAN);
switch(g)
{
case1:
outtextxy(460,160,"星期一");
break;
case2:
outtextxy(460,160,"星期二");
break;
case3:
outtextxy(460,160,"星期三");
break;
case4:
outtextxy(460,160,"星期四");
break;
case5:
outtextxy(460,160,"星期五");
break;
case6:
outtextxy(460,160,"星期六");
break;
case7:
outtextxy(460,160,"星期日");
break;
}
}
voidfun2()//做表盘
{
setcolor(WHITE);
circle(220,240,180);
circle(220,240,170);
circle(220,240,2);
circle(220,240,110);
}
voidfun3()//做刻度
{inti,ix,iy,ix1,iy1;
doublei1;
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);}
else
circle(ix,iy,2);
if(i%5==0)
{circle(ix1,iy1,5);
circle(ix,iy,5);}
}
}
voidfun6(int*a,int*b,int*c,int*d,int*e,int*f,int*g)//重新设定时间日期
{
intm,n;
printf("请问你是要修改时间还是修改日期\n");
printf("*************************************\n");
printf("*修改时间请按“1”,然后回车*\n");
printf("*修改日期请按“2”,然后回车*\n");
printf("*退出请按“3”,然后回车*\n");
printf("*************************************\n");
scanf("%d",&m);
switch(m)
{
case1:
{
printf("请输入当前是几点几分几秒,用逗号隔开\n");
scanf("%d,%d,%d",a,b,c);
printf("请问是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机械 时钟 设计 毕业设计 论文
![提示](https://static.bingdoc.com/images/bang_tan.gif)