C语言模拟时钟转动课设报告附代码.docx
- 文档编号:23274079
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:16
- 大小:714.49KB
C语言模拟时钟转动课设报告附代码.docx
《C语言模拟时钟转动课设报告附代码.docx》由会员分享,可在线阅读,更多相关《C语言模拟时钟转动课设报告附代码.docx(16页珍藏版)》请在冰豆网上搜索。
C语言模拟时钟转动课设报告附代码
模拟时针转动程序
姓名:
学号:
完成日期:
2012年12月
设计目的
加深对讲授内容的理解,尤其是一些语法规定。
通过课程设计,自然地、熟练地掌握。
熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。
学会上机调试程序。
熟悉C语言图形模式下的编程,掌握利用C语言相关函数开发电子时钟的基本原理。
能模拟机械钟表行走;要准确地利用数字显示时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致。
总体设计
电子时钟的功能描述
电子时钟流程图
模块描述
动画处理模块在屏幕上显示sin和cos型的动态函数图像,显示运动的问候语。
转时针动处理模块指针式的时钟表盘为椭圆形并且圆周上有分布均匀的12个刻度刻度显示清楚钟面上有长度不相同的指针即时针、分针、秒针指针的运动具有规律性为顺时针。
数字时钟处理模块数字钟显示时间的格式是年月日时分秒小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步且两个时钟所显示的时间与计算机的系统时间一致。
详细设计
time结构体
strumetime
{
usignedcharti_min;
usignedcharti_hour;
usignedcharti_hud;
usignedcharti_sec;
};
time结构体定义在dos.h文件中,可以保存系统的当前时间。
全局变量
doubleh,m,s;这三个变量分别保存小时,分钟,秒。
doublex,y,x1,y1,x2,y2;保存数字时钟中小时分钟秒在屏幕中显示的位置。
structtimet[1];定义一个time结构类型的数组。
函数功能的描述
1.def()
函数原型:
voiddef()
def()函数是用来输出一组彩带的,通过输入位置和颜色的变化来输出sin型的彩带,且在整个函数中保留结果。
2.abc()
函数原型:
voidabc()
abc()函数是用来在退出系统是输出运动的问候语,函数类型单一且比较简单。
3.digitclock()
函数原型:
voiddigitclock()
digitclock函数用于在(x,y)位置显示clock值,clock值为时分秒。
4.clockhandle()
函数原型:
voidclockhandle()
clockhandle()函数用于完成时针转动和数字时钟的显示,包括时针转动角度的运算,还有对声音的输出。
5.main()
函数原型:
voidmain()
main()函数是主函数,既包括绘画表盘的基本框架,又有对其他函数的调用。
函数测试与调试
在函数编写完成后,进行过多次测试。
在测试过程中遇到很多的问题,像数字时钟的显示位置与理想中的有偏差,转动时针移动后痕迹不能清除。
这些问题通过对clockhandle()的调整得到了很好的解决。
还有就是在动画处理上运动时间的间隔和遇到路程的测试遇到了问题,但最后通过查阅资料都得到了解决。
源程序清单
#include
#include
#include
#include
#include
#include
#definePI3.1415926
#defineESC0x11b
#definestep10
/*函数声明*/
intdigithour(double);
intdigitmin(double);
intdigitsec(double);
voiddigitclock(int,int,int);
voidclockhandle();
voidabc();
voiddef();
doubleh,m,s,day,mon;
doublex,x1,x2,y,y1,y2;
structtimet[1];
/*主函数*/
main()
{
intdriver,mode=0,i,j;
driver=DETECT;/*自动检测显示设备*/
initgraph(&driver,&mode,"");/*初始化图形系统*/
setlinestyle(0,0,3);
setbkcolor(0);
/*画主体框架的边线*/
setcolor(12);
line(82,430,558,430);
line(70,62,70,418);
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(76,56,295,56);
line(342,56,564,56);
/*画主体框架的边角弧线*/
setlinestyle(0,0,3);
arc(82,62,90,180,12);
setlinestyle(0,0,3);
arc(558,62,0,90,12);
setlinestyle(0,0,3);
arc(82,418,180,279,12);
setlinestyle(0,0,3);
arc(558,418,270,360,12);
setlinestyle(0,0,7);
setcolor(9);
outtextxy(301,53,"CLOCK");
setcolor(15);
outtextxy(299,53,"CLOCK");/*显示标题*/
setcolor(9);
rectangle(342,72,560,380);/*绘制矩形时钟框架*/
setwritemode(0);/*规定划线的方式(将所画位置的原来信息覆盖)*/
setcolor(13);
outtextxy(405,75,"BeiJingShijian");
/*绘制电子时钟的边框*/
setlinestyle(0,0,1);
setcolor(7);
line(392,310,510,310);
line(392,330,510,330);
arc(392,320,90,270,10);
arc(510,320,270,90,10);
/*绘制数字时钟的分隔符*/
setcolor(5);
for(i=431;i<=470;i+=39)
for(j=317;j<=324;j+=7){
setlinestyle(0,0,3);
circle(i,j,1);
}
/*绘制表示小时的圆点*/
for(i=0,m=0,h=0;i<=11;i++,h++){
x=100*sin((h*60+m)/360*PI)+451;
y=200-100*cos((h*60+m)/360*PI);
setlinestyle(0,0,3);
setcolor(5);
circle(x,y,1);
}
/*绘制表示分针或秒针的圆点*/
setcolor(3);
for(i=0,m=0;i<=59;m++,i++){
x=100*sin(m/30*PI)+451;
y=200-100*cos(m/30*PI);
setlinestyle(0,0,1);
circle(x,y,1);
}
setlinestyle(0,0,5);
setcolor(5);
outtextxy(110,90,"Name:
LiJianli");
outtextxy(110,105,"Xuehao:
12020326");
setcolor(10);
outtextxy(108,90,"Name");
outtextxy(108,105,"Xuehao");
setcolor(14);
outtextxy(180,410,"PressEsctochangewindows!
");
def();
clockhandle();/*开始调用时针处理程序*/
abc();
closegraph();/*关闭图形函数*/
return0;
}
/*时针处理函数*/
voidclockhandle()
{
intk=0,n=0;
setcolor(15);
gettime(t);/*获取系统时间*/
h=t[0].ti_hour;
m=t[0].ti_min;
x=50*sin((h*60+m)/360*PI)+451;/*时针的x坐标值*/
y=200-50*cos((h*60+m)/360*PI);/*时针的y坐标值*/
line(451,200,x,y);
x1=80*sin(m/30*PI)+451;/*分针的x坐标值*/
y1=200-80*cos(m/30*PI);/*分针的y坐标值*/
line(451,200,x1,y1);
/*在数字时钟中显示时间*/
digitclock(408,318,digithour(h));
digitclock(446,318,digitmin(m));
setwritemode
(1);/*设置图形方式下划线输出模式*/
for(;k!
=ESC;){
setcolor(12);
/*声音处理*/
sound(500);/*以频率为500Hz打开PC扬声器*/
delay(700);/*发一个500Hz的音调,维持700毫秒*/
sound(200);
delay(300);
nosound();/*关闭PC扬声器*/
s=t[0].ti_sec;
m=t[0].ti_min;
h=t[0].ti_hour;
x2=98*sin(s/30*PI)+451;/*秒针的x坐标值*/
y2=200-98*cos(s/30*PI);/*秒针的y坐标值*/
line(451,200,x2,y2);
/*运动的问候语*/
setfillstyle(0,2);
bar(100,115,320,150);
setcolor(4);
settextstyle(1,0,99);
outtextxy(101+n*5,140,"Welcome!
");
n=n+1;
if(n>28)n=0;
/*利用此循环,延时一秒*/
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{gettime(t);
if(bioskey
(1)!
=0){
k=bioskey(0);
}
}
/*数字时钟的秒针*/
setcolor(15);
digitclock(485,318,digitsec(s)+1);
/*用原来的颜色在原来位置再绘制秒针,清除当前秒针*/
setcolor(12);
x2=98*sin(s/30*PI)+451;
y2=200-98*cos(s/30*PI);
line(451,200,x2,y2);
/*分针处理*/
if(t[0].ti_min!
=m){
/*消除当前分针*/
setcolor(15);
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
/*绘制新的分针*/
m=t[0].ti_min;
digitclock(446,318,digitmin(m));/*在数字时钟中显示新的钟值*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
}
/*小时处理*/
if((t[0].ti_hour*60+t[0].ti_min)!
=(h*60+m)){
/*消除当前时针*/
setcolor(15);
x=50*sin((h*60+m)/360*PI)+451;
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
/*绘制新的时针*/
h=t[0].ti_hour;
digitclock(408,318,digithour(h));
x=50*sin((h*60+m)/360*PI)+451;
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
}
}
}
/*在指定位置显示数字时钟*/
voiddigitclock(intx,inty,intclock)
{charbufferl[10];
setfillstyle(0,2);
bar(x,y,x+15,328);/*画一个二维码*/
if(clock==60)clock=0;
sprintf(bufferl,"%d",clock);
outtextxy(x,y,bufferl);
}
/*将double型的小时数转换成int型*/
intdigithour(doubleh)
{inti;
for(i=0;i<=23;i++)
{if(h==i)returni;}
}
/*将double型的分针数转换成int型*/
intdigitmin(doublem)
{inti;
for(i=0;i<=59;i++)
{if(m==i)returni;}
}
/*将double型的秒钟数转换成int型*/
intdigitsec(doubles)
{inti;
for(i=0;i<=59;i++)
{if(s==i)returni;}
}
/*滚动的字幕*/
voidabc()
{
intn,size,q=0;
staticintstartx=5;
staticintstarty=10;
setbkcolor
(1);
while(q<10)
{
q=q+1;
for(n=1;n<=35;n++)
{
cleardevice();
setcolor
(2);
setlinestyle(0,0,1);
setfillstyle(1,10);
rectangle(startx+n*step,starty+n*step,startx+n*step+160,starty+n*step+80);/*绘制矩形*/
floodfill(startx+n*step+10,starty+n*step+20,2);
settextstyle(1,0,20);
outtextxy(startx+40+n*step,starty+n*step+40,"Thankyou!
");
delay(6e10);
}
}
}
/*绘画彩带函数*/
voiddef()
{
doublea;
intd,e,color=1;
for(a=75;a<=300;a+=1)
{
setcolor(color);
/*计算划线位置*/
d=220+30*cos(a/47.75);
e=200+30*sin(a/47.75-PI/2);
line(a,d,a+30,d);
line(a,e,a+30,e);
setcolor(color+5);
line(a,d+90,a+30,d+90);
line(a,e+90,a+30,e+90);
delay(10000);
color++;
if(color>15)
color=1;
}
getch();
}
运行结果
电子时钟的初运行状态
电子时钟的转动与运行
退出电子时钟
小结
通过这次的编程训练,让我对C语言有了更好的理解,在学习生活的同时能够更好的去利用这门课程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 模拟 时钟 转动 报告 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)