模拟时针转动程序
姓名: 学号:
完成日期:2012年12月
设计目的
加深对讲授内容的理解,尤其是一些语法规定。通过课程设计,自然地、熟练地掌握。熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。学会上机调试程序。熟悉C语言图形模式下的编程,掌握利用C语言相关函数开发电子时钟的基本原理。
能模拟机械钟表行走;要准确地利用数字显示时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致。
总体设计
电子时钟 动画显示模块 转动时针处理模块 数字时钟处理模块 电子时钟的功能描述
开始
进入图形模式 进入主体界面 显示动态图像
转动时钟数字时钟的显示 退出系统显示 结束
电子时钟流程图 模块描述
动画处理模块 在屏幕上显示sin和cos型的动态函数图像,显示运动的问候语。
转时针动处理模块 指针式的时钟表盘为椭圆形并且圆周上有分布均
匀的12个刻度刻度显示清楚钟面上有长度不相同的指针即时针、分针、秒针指针的运动具有规律性为顺时针。
数字时钟处理模块 数字钟显示时间的格式是年月日时分秒小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步且两个时钟所显示的时间与计算机的系统时间一致。
详细设计
time结构体 strume time {
usigned char ti_min; usigned char ti_hour; usigned char ti_hud; usigned char ti_sec; };
time 结构体定义在dos.h文件中,可以保存系统的当前时间。
全局变量
double h,m,s;这三个变量分别保存小时,分钟,秒。
double x,y,x1,y1,x2,y2;保存数字时钟中小时分钟秒在屏幕中显示的位置。
struct time t[1];定义一个time结构类型的数组。
函数功能的描述
1. def()
函数原型: void def()
def()函数是用来输出一组彩带的,通过输入位置和颜色的变化来输出sin型的彩带,且在整个函数中保留结果。
2. abc()
函数原型: void abc()
abc()函数是用来在退出系统是输出运动的问候语,函数类型单一且比较简单。
3 .digitclock()
函数原型:void digitclock()
digitclock函数用于在(x,y)位置显示clock值,clock值为时分秒。
4. clockhandle()
函数原型:void clockhandle()
clockhandle()函数用于完成时针转动和数字时钟的显示,包括时针转动角度的运算,还有对声音的输出。
5 . main()
函数原型: void main()
main()函数是主函数,既包括绘画表盘的基本框架,又有对其他函数的调用。
函数测试与调试
在函数编写完成后,进行过多次测试。在测试过程中遇到很多的问题,像数字时钟的显示位置与理想中的有偏差,转动时针移动后痕迹不能清除。这些问题通过对clockhandle()的调整得到了很好的解决。
还有就是在动画处理上运动时间的间隔和遇到路程的测试遇到了问题,但最后通过查阅资料都得到了解决。
源程序清单 #include void abc(); void def(); double h,m,s,day,mon; double x,x1,x2,y,y1,y2; struct time t[1]; /*主函数*/ main() { int driver,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,\"BeiJing Shijian\"); /*绘制电子时钟的边框*/ 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 :Li Jianli\"); outtextxy(110,105,\"Xuehao:12020326\"); setcolor(10); outtextxy(108,90,\"Name\"); outtextxy(108,105,\"Xuehao\"); setcolor(14); outtextxy(180,410,\"Press Esc to change windows!\"); def(); clockhandle(); /*开始调用时针处理程序*/ abc(); closegraph(); /*关闭图形函数*/ return 0; } /*时针处理函数*/ void clockhandle() { int k=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); } } } /*在指定位置显示数字时钟*/ void digitclock(int x,int y,int clock) {char bufferl[10]; setfillstyle(0,2); bar(x,y,x+15,328); /*画一个二维码*/ if(clock==60) clock=0; sprintf(bufferl,\"%d\ outtextxy(x,y,bufferl); } /*将double型的小时数转换成int型*/ int digithour(double h) { int i; for(i=0;i<=23;i++) {if(h==i) return i;} } /*将double型的分针数转换成int型*/ int digitmin(double m) {int i; for(i=0;i<=59;i++) {if(m==i) return i;} } /*将double型的秒钟数转换成int型*/ int digitsec(double s) {int i; for(i=0;i<=59;i++) {if(s==i) return i;} } /*滚动的字幕*/ void abc() { int n,size,q=0; static int startx=5; static int starty=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,\"Thank you!\"); delay(6e10); } } } /*绘画彩带函数*/ void def() { double a; int d,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语言有了更好的理解,在学习生活的同时能够更好的去利用这门课程。 因篇幅问题不能全部显示,请点此查看更多更全内容