#include<stdio.h>
#include<iostream>
#include<math.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<WINDOWS.H>
#define UP 38
#define DOWN 40
#define ESC 27
#define TAB 9
#define PI 3.1415926
double h,m,s;
double x,x1,x2,y,W,y2;
char ch1;
using namespace std;
void timeupchange(int);
void timedownchange(int);
int digithour(double);
int digitmin(double);
int digitsec(double);
void digitclock(int,int,int);
void clearcursor(int);
void drawcursor(int);
void clockhandle();
struct ti
{
int ti_min;
int ti_hour;
int ti_sec;
}t[1],a;
void main()
{
int i,j;
initgraph(640,480);
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(310,48,310,35);
outtextxy(290,18,"CLOCK");
arc(70,50,94,74,89,179);
arc(550,50,570,74,0,90);
setcolor(0xC0C0C0);
rectangle(270,15,350,35);
setcolor(0x800080);
rectangle(270,350,350,370);
setcolor(0xFCFCFC);
for(i=290;i<=335;i+=39)
for(j=317;j<=324;j+=7)
{
circle(i,j,1);
}
for(i=0,m=0.0,h=0.0;i<=11;i++,h++)
{
x=100*sin((h*60+m)/360*PI)+310;
y=200-100*cos((h*60+m)/360*PI);
circle(x,y,1);
}//時鐘圓點
for(i=0,m=0.0;i<=59;m++,i++)
{
x=100*sin(m/30*PI)+310;
y=200-100*cos(m/30*PI);
circle(x,y,1);
}
//分針圓點
setlinestyle(PS_DASHDOT);
line(70,418,82,430);
setlinestyle(PS_DASHDOT);
line(570,418,558,430);
setcolor(0xFCFCFC);
outtextxy(120,340,"Tab :Cursor move");
outtextxy(120,370,"Up :Time + +");
outtextxy(370,340,"Down:Time - -");
outtextxy(370,370,"Esc :Quit system!");
outtextxy(292,352,"HELP");
settextstyle(15,0,_T("宋體"));
outtextxy(100,110,_T("write it on"));
outtextxy(100,140,_T("your heart"));
outtextxy(100,170,_T("that every"));
outtextxy(100,200,_T("day is the"));
outtextxy(100,230,_T("best of "));
outtextxy(100,260,_T("the year."));
outtextxy(450,140,_T("銘記在心:"));
outtextxy(450,170,_T("每一天都是"));
outtextxy(450,200,_T("一年中最好"));
outtextxy(450,230,_T("的日子。"));
for( i=0;i<12;i++)
{
x=310+(int)(105*sin(30*i*2*PI/360));
y=200-(int)(105*cos(30*i*2*PI/360));
switch(i)
{
case 0:outtextxy(x-5,y-5,"12");break;
case 1:outtextxy(x-5,y-5,"1");break;
case 2:outtextxy(x-5,y-5,"2");break;
case 3:outtextxy(x-5,y-5,"3");break;
case 4:outtextxy(x-5,y-5,"4");break;
case 5:outtextxy(x-5,y-5,"5");break;
case 6:outtextxy(x-5,y-5,"6");break;
case 7:outtextxy(x-5,y-5,"7");break;
case 8:outtextxy(x-5,y-5,"8");break;
case 9:outtextxy(x-5,y-5,"9");break;
case 10:outtextxy(x-5,y-5,"10");break;
case 11:outtextxy(x-5,y-5,"11");break;
}
}
int a,b,a1,b1,n=0;
for(n=0;n<60;n++)
{
a=310+(int)(95 * sin(n*2*PI/60));
b=200-(int)(95 * cos(n*2*PI/60));
a1=310+(int)(85 * sin(n*2*PI/60));
b1=200-(int)(85 * cos(n*2*PI/60));
if(n%5==0)
setlinestyle(PS_DASHDOT);
else
setlinestyle(PS_DASHDOT);
line(a1,b1,a,b);
}
clockhandle();
getch();
closegraph();
}
void clockhandle()
{
SYSTEMTIME xx;
// 定義變量保存當前時間
GetLocalTime(&xx);
t[0].ti_hour=xx.wHour;
t[0].ti_min=xx.wMinute;
t[0].ti_sec=xx.wSecond;
//設置當前系統時
int k=0,count;
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec;
x=50*sin((h*60+m)/360*PI)+310; /*時針的x座標*/
y=200-50*cos((h*60+m)/360*PI);/*時針的y座標*/
setcolor(0xFCFCFC);
line(310,200,x,y); /*繪製時針*/
x1=80*sin(m/30*PI)+310;/*分針的x座標*/
W=200-80*cos(m/30*PI);/*分針的y座標*/
line(310,200,x1,W);/*繪製分針*/
digitclock(260,314,digithour(h));/*顯示小時值*/
digitclock(308,314,digitmin(m)); /*顯示分鐘值*/
// 定義變量保存當前時間
setwritemode(R2_XORPEN); // 設置 XOR 繪圖模式
char ch;
for( count=2;ch!=27;)/*按下Esc鍵結束循環*/
{
if(kbhit())
ch=getch();
setcolor(0x0000A8);
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec;
x2=98*sin(s/30*PI)+310;/*秒針的x座標值*/
y2=200-98*cos(s/30*PI);/*秒針的y座標值*/
line(310,200,x2,y2);/*繪製秒針*/
Sleep(1000);
SYSTEMTIME yy;
// 定義變量保存當前時間
GetLocalTime(&yy);
t[0].ti_hour=yy.wHour;
t[0].ti_min=yy.wMinute;
t[0].ti_sec=yy.wSecond;
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{
ch1=getch();
if(kbhit())//如果有按鍵值則執行if語句
{
while(ch1!=27)//用ch=_getch();會等待你按下任意鍵之後,把該鍵字符所對應的ASCII碼賦給ch,再執行下面的語句。
{
if(ch1==38)
{
if(count==1)
{
t[0].ti_hour++;
if( t[0].ti_hour==24) t[0].ti_hour=0;
}
if(count==2)
{
t[0].ti_min++;
if(t[0].ti_min==60) t[0].ti_min=0;
//設置新的系統時間
}
if(count==3)
{
t[0].ti_sec++;
if(t[0].ti_sec==60) t[0].ti_sec=0;
//設置新的系統時間
}
}
if(ch1==40)
{
if(count==1)
{
t[0].ti_hour--;
if(t[0].ti_hour==0) t[0].ti_hour=23;
//設置新的系統時間
}
if(count==2)
{
t[0].ti_min--;
if(t[0].ti_min==0) t[0].ti_min=59;
//設置新的系統時間
}
if(count==3)
{
t[0].ti_sec--;
if(t[0].ti_sec==0) t[0].ti_sec=59;
//設置新的系統時間
}
}
if(ch1==9)
{
setcolor(0xFCFCFC);clearcursor(count);
setcolor(0);drawcursor(count);
count++;
}
if(count==5)count=1;
}
}
}
setcolor(0);
digitclock(340,314,digitsec(s));
setcolor(0xFCFCFC);
digitclock(340,314,digitsec(s)+1);/*數字時針增加1秒*/
setcolor(0x0000A8);
x2=98*sin(s/30*PI)+310;
y2=200-98*cos(s/30*PI);
line(310,200,x2,y2);/*在原來的地方繪製秒針,清除當前秒針*/
if(t[0].ti_min!=m)/*若分針有變化,則清除當前分針*/
{
setcolor(0xFCFCFC);
x1=80*sin(m/30*PI)+310;
W=200-80*cos(m/30*PI);
line(310,200,x1,W);/*繪製新的分針*/
setcolor(BLACK);
digitclock(308,314,digitmin(m));
m=t[0].ti_min;
setcolor(0xFCFCFC);
digitclock(308,314,digitmin(m));//顯示數字分
x1=80*sin(m/30*PI)+310;
W=200-80*cos(m/30*PI);
line(310,200,x1,W);
}
if((t[0].ti_hour*60+t[0].ti_min)!=(h*60+m))
{
setcolor(0xFCFCFC);
x=50*sin((h*60+m)/360*PI)+310;
y=200-50*cos((h*60+m)/360*PI);
line(310,200,x,y);/*繪製新的時針*/
setcolor(BLACK);
digitclock(260,314,digithour(h));
h=t[0].ti_hour;
setcolor(0xFCFCFC);
digitclock(260,314,digithour(h));//數字
x=50*sin((h*60+m)/360*PI)+310;
y=200-50*cos((h*60+m)/360*PI);
line(310,200,x,y);
}
}
}
void timeupchange(int count)//處理光標上移的按鍵
{
if(count==1)
{
t[0].ti_hour++;
if( t[0].ti_hour==24) t[0].ti_hour=0;
}
if(count==2)
{
t[0].ti_min++;
if(t[0].ti_min==60) t[0].ti_min=0;
//設置新的系統時間
}
if(count==3)
{
t[0].ti_sec++;
if(t[0].ti_sec==60) t[0].ti_sec=0;
//設置新的系統時間
}
}
void timedownchange(int count) //處理光標下移的按鍵
{
if(count==1)
{
t[0].ti_hour--;
if(t[0].ti_hour==0) t[0].ti_hour=23;
//設置新的系統時間
}
if(count==2)
{
t[0].ti_min--;
if(t[0].ti_min==0) t[0].ti_min=59;
//設置新的系統時間
}
if(count==3)
{
t[0].ti_sec--;
if(t[0].ti_sec==0) t[0].ti_sec=59;
//設置新的系統時間
}
}
void digitclock(int x,int y,int clock)//在指定位置顯示數字時鐘
{
char buffer1[3]="";
if(clock==60) clock=0;
sprintf( buffer1,"%d",clock);//文件方式
outtextxy(x,y,buffer1); //文字輸出
}
int digithour(double h)//將double型的小時數換成int型
{
int i;
for(i=0;i<24;i++)
{
if(h==i) return i;
}
}
int digitmin(double m)
{
int i;
for(i=0;i<60;i++)
{
if(m==i) return i;
}
}
int digitsec(double s)
{
int i;
for(i=0;i<60;i++)
{
if(s==i) return i;
}
}
void drawcursor(int count)//根據count的值,畫一個光標
{
switch(count)
{
case 1:setcolor(0xFCFCFC);line(284,315,284,325);break;
case 2:setcolor(0xFCFCFC);line(325,315,325,325);break;
case 3:setcolor(0xFCFCFC);line(365,315,365,325);break;
}
}
void clearcursor(int count)//根據count的值,清除一個光標
{
switch(count)
{
case 1:setcolor(BLACK);line(284,315,284,325);break;
case 2:setcolor(BLACK);line(325,315,325,325);break;
case 3:setcolor(BLACK);line(365,315,365,325);break;
}
}
學C語言半個學期,和同學一起做的課程設計,還有很多bug,但值得記錄第一次。