当前位置:文档之家› 模拟时钟转动程序课程设计报告

模拟时钟转动程序课程设计报告

《高级语言》课程设计课题名称模拟时钟转动程序学院信息工程专业网络工程地点 D507 学生姓名钟都华学号 13046130 开课时间 2013 至 2014 学年第 2 学期同组人李卓成绩一、课程设计的目的和要求1.课程设计的目的本程序旨在训练读者的基本编程能力,使读者熟悉C语言图形模式下的编程。

本程序中涉及时间结构体、数组、绘图等方面的知识。

通过本程序的训练,使读者能对C 语言有一个更深刻的了解,掌握利用C语言相关函数开发电子时钟的基本原理,为进一步开发出高质量的程序打下坚实的基础。

2.课程设计的要求能模拟机械钟表行走;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;要准确的利用数字显示日期和时间并且可以根据用户的需求更改当前时间(指针式时钟与数字式时钟实现同步更改);数字式时钟的时间显示与指针式时钟显示一致;可以通过上下键改变当前的时、分、秒;改的时间是小时、分钟、还是秒数;通过Tab键切换按Esc时程序退出。

二、设计如下图,此电子时钟主要由以下4个功能模块组成。

1.界面显示模块电子时钟界面显示在调用时钟运行处理之前完成,在这里主要调用了C语言图形系统函数和自负屏幕处理函数画出时钟程序的主界面。

主界面包括类似Windows自带的电子时钟的界面和帮助界面两部冯。

电子时钟界面包括一个模拟时钟运转的钟表和一个显示时间的数字钟表。

在帮助界面中,主要包括一些按键的操作说明。

2.按键控制模块按键控制模块主要完成两大部分功能。

第一,读取用户按键的键值。

第二,通过对键盘按键值得判断,执行相应的操作,如光标移动、修改时间。

3.时钟动画处理模块在时钟动画处理模块中,它通过对相关条件的判断和时钟坐标值的计算,完成时、分、秒指针的擦除和重绘,以达到模拟时钟运转的功能。

4.数字时钟处理模块在数字时钟处理模块中,它主要实现了数字时钟的显示和数字时钟的修改。

其中,用户可先按Tab键定位需要修改内容的位置,然后通过按光标上移()或下移(功能模块设计1.电子时钟执行主流程此电子时钟执行主流程如右图所示。

首先,程序调用initgraph()函数,使系统进入图形模式,然后通过使用line()、arc()、outtextxy()、circle()等函数来绘制主窗口及电子时钟界面,最后调用clockHandle()函数来处理时钟的运转及数字时钟的显示。

在clockhandle()函数中,它使用了bioskey()函数来获取用户的按键值,当用户按键为Esc时,程序会从clockhandle()函数中返回,从而退出程序。

2.电子时钟界面显示电子时钟界面的实现比较简单,在功能模块有详细描述,值得一提的是,模拟时钟运转的动画时钟的时间刻度是用大小不同的圆来表示的,三根长度不同但有一端在相同坐标位置的直线分别表示时、分、秒针。

3.按键控制模块(1)按下Tab键,清除上一个位置的光标,然后在新位置出绘制一个光标。

(2)按下光标上/下移键,增加/减少相应的时、分、秒值。

(3)按下Esc键,程序结束时钟运行,从而退出系统。

4.动画处理模块坐标点的计算rsinα rcosα分别是这两条虚线的长度弧度360°=2π在电子时钟中,秒针转动60次每一次的弧度为2π/60 = π/30;上图对于∠K而言sin=边3/边1,在程序中已经知道∠α的弧度也就知道了∠K的度数;设分钟为m则∠K开始进入图形模式绘制主窗体界面绘制电子时钟界面绘制帮助界面调用clockhandle()时钟处理程序退出系统结束的度数为m*2π/60 = m*π/30,利用C函数sin(m*π/30)则可得到边3与边1的比,带入程序rsinα则可得到边3的长度;设秒针的长度为80像素即r = 80像素 rsinα=80*sin(m*π/30)可求得rsinα长度,则可以得到相对于圆心而言X轴的偏移位置即451+rsinα也就是K的X轴坐标。

同理求的Y轴坐标,对∠K而言,cos∠K=边2/边1 则80*cos(m*π/30) 就可得到y轴的偏移位置K坐标为(451+rsinα,200-rcosα)5.数字时钟处理模块它主要由光标上移或下移按键共同控制,当光标在时/分/秒位置且按下上移/下移按键,程序会将当前时间的时/分/秒增加/减少1,即增加/减少1小时/分钟/秒。

函数功能描述1.keyhandle()函数原型:int keyhandle(int key,int count)Keyhandle()函数用于对用户的按键值key进行判断,然后调用timeupchange(count)或timedownchange(count)或直接处理Tab按键,其中count的值为1、2、3,1表示小时、2表示分钟、3表示秒钟。

按Tab键后,count值加1.2.timeupchange()函数原型:int timeupchange(int count)Timeupchange()函数用于增加时、分、秒数,然后将新的时间设置为系统当前时间。

3.timedownchange()函数原型:int timedownchange(int count)Timedownchange()函数用于减少时、分、秒数,然后将新的时间设置为系统当前时间。

4.digitclock()函数原型:void digitclock(int x,int y,int clock)Digitclock()函数用于在(x,y)位置显示clock值,clock值为时、分、秒值。

5.drawcursor()函数原型:void drawcursor(int count)Drawcursor()函数用于对count进行判断后,在相应位置绘制一条直线作为光标。

6.clearcursor()函数原型:void clearcursor(int count)clearcursor()函数用于对count进行判断后,在相应位置擦除原来的光标。

7.void clockhandle()函数原型:void clockhandle()void clockhandle()函数用于完成时钟转动和数字时钟的显示。

8.main()函数原型:void main()Main()为主函数。

分工:钟都华:电子时钟主流程、界面显示模块、时钟动画处理模块、对程序的改进。

李卓:时钟按键控制模块、数字时钟处理模块、代码的输入。

三、编码#include<graphics.h> //程序的预处理#include<stdio.h>#include<math.h>#include <dos.h>#define PI 3.1415926#define UP 0x4800#define DOWN 0x5000#define ESC 0x11b#define TAB 0xf09int keyhandle(int,int);int timeupchange(int);int timedownchange(int);int digithour(double);int digitmin(double);int digitesc(double);void digitclock(int,int,int);void drawcursor(int);void clockcursor(int);void clockhandle();double h,m,s;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(9);line(82,430,558,430);line(70,62,70,418);line(82,50,558,50);line(570,62,570,418);line(70,62,570,418);line(76,56,179,56);line(340,56,564,56);/*arc(int x, int y, int stangle, int endangle, int radius)*/ arc(82,62,90,180,12);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);setcolor(15);outtextxy(300,53,"CLOCK");setcolor(7);rectangle(342,70,560,360);setwritemode(0);setcolor(15);outtext(433,75,"CLOCK");setcolor(7);line(392,310,510,310);line(392,330,510,330);arc(392,320,90,370,10);arc(510,320,270,90,10);setcolor(5);for(i=431;i<=470;i+=38)for(j=317;j<=324;j+=7){setlinestyle(0,0,3);circle(i,j,1);}setcolor(15);line(424,315,424,325);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);circle(x,y,1);}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);}setcolor(4);outtextxy(184,125,"Help");setcolor(15);outtextxy(182,125,"Help");setcolor(5);outtextxy(140,185,"Tab : Cursor move");outtextxy(140,225,"Up : Time ++");outtextxy(140,265,"Down: Time --");outtextxy(140,305,"Esc : Quit system!");outtextxy(140,345,"Version : 2.0");setcolor(12);outtextxy(150,400,"Nothing is more important than time!");clockhandle(); //开始调用时钟处理程序closegraph(); //关闭图形系统return 0;}void clockhandle() //时钟动画处理模块{int k=0;count;setcolor(15);gettime(t);h=t[0].ti_hour;m=t[0].ti_min;x=50*sin((h*60+m)/360*PI)+451;y=200-50*cos((h*60+m)/360*PI);line(451,200,x1,y1);x1=80*sin(m/30*PI)+451;y1=200-80*cos(m/30*PI);line(451,200,x1,y1);digitclock(408,318,digithour(h));digitclock(446,318,digitmin(m));setwritemode(1);for(count=2;k!=Esc;){setcolor(12);sound(500);delay(700);sound(200);delay(300);nosound();s=t[0].ti_sec;m=t[0].ti_min;h=t[0].ti_hour;x2=98*sin(s/30*PI)+451;y2=200-98*cos(s/30*PI);line(451,200,x2,y2);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);count=keyhand(k,count);if(count==5) count=1;}}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);}}}int keyhandle(int key,int count) //时钟按键控制模块{switch(key){case UP: timeupchange(count-1);break;case DOWN:timedownchange(count-1);break;case TAB:setcolor(15);clearcursor(count);drawcursor(count);count++;break;}return count;}int timeupchange(int count){if(count==1){t[0].ti_hour++;if(t[0].ti_hour==24) t[0].hour=0;settime(t);}if(count==2){t[0].ti_min++;if(t[0].ti_min==60) t[0].min=0;settime(t);}if(count==3){t[0].ti_sec++;if(t[0].ti_sec==60) t[0].sec=0;settime(t);}}int timedownchange(int count){if(count==1){t[0].ti_hour--;if(t[0].ti_hour==0) t[0].hour=23;settime(t);}if(count==2){t[0].ti_min--;if(t[0].ti_min==0) t[0].min=59;settime(t);}if(count==3){t[0].ti_sec--;if(t[0].ti_sec==0) t[0].sec=59;settime(t);}}void digitclock(int x,int y,int clock)//数字时钟处理模块{char buffer1[10];setfillstyle(0,2);bar(x,y,x+15,328);if(clock==60) clock=0;sprintf(buffer1,"%d",clock);outtextxy(x,y,buffer1);}int digithour(double h){int i;for(i=0;i<=23;i++){if(h==i) return i;}}int digitmin(double m){int i;for(i=0;i<=59;i++){if(m==i) return i;}}int digitsec(double s){int i;for(i=0;i<=59;i++){if(s=i) return i;}}void drawcursor(int count){switch(count){case 1:line(424,315,424,325);break;case 2:line(465,315,465,325);break;case 3:line(505,315,505,325);break;}}void clearcursor (int count){switch(count){case 1:line(424,315,424,325);break;case 2:line(465,315,465,325);break;case 3:line(505,315,505,325);break;}}四、调试和运行调试:程序在VC++6.0上不能运行,原因是VC++6.0无graphics函数,只能在win-tc 上运行。

相关主题