您的位置:首页 > 其它

哇咔咔,今(那)天第二个程序——指针时钟(1.0)

2013-06-27 23:17 267 查看
效果图:(其实还可以再美观一点 o(∩_∩)o 。。。)



/********************************************
* 程序名称:MR.DUAN 的模拟时钟
* 作  者:WindAutumn <duanxu@outlook.com>
* 最后修改:2012-8-9-PM
* 版 本 号:1.0
*
* 以后有空再修改
* *****************************************/

#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<math.h>

#define MAXWIDE 50
#define MAXHIGH 24
#define CENTER_X 25
#define CENTER_Y 12
#define CALENDA_Y_OFFSET 1
#define TIME_OFFSET_X  MAXWIDE + 1
#define TIME_OFFSET_Y CALENDA_Y_OFFSET + 13
#define PI 3.1415926

void InitScreen(HANDLE hClock);
void HideCursor(HANDLE hClock);
void GotoXY(HANDLE hClock, int x, int y);
void PrintCalendar(HANDLE hClock, int x, int y, time_t * p_rawtime);
void PrintClock(HANDLE hClock, time_t * p_rawtime);
void PrintTime(HANDLE hClock, time_t * p_rawtime);

void main()
{
time_t rawtime = time(0);

HANDLE hClock = GetStdHandle(STD_OUTPUT_HANDLE);
system("color 7b");
SetConsoleTitle("MR.DUAN 的时钟");
HideCursor(hClock);
InitScreen(hClock);
PrintCalendar(hClock, MAXWIDE+1, CALENDA_Y_OFFSET, &rawtime);

PrintClock(hClock, &rawtime);
}

void InitScreen(HANDLE hClock)            // 打印周围红框框
{
int i;

SetConsoleTextAttribute(hClock, FOREGROUND_INTENSITY | FOREGROUND_RED |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);                    // 红色字体,白色背景
GotoXY(hClock, 0, 0);
printf("╔");
for(i=1; i<(MAXWIDE-1)/2; i++)
printf("═");
printf("╗");

for(i=1; i< MAXHIGH; i++)
{
GotoXY(hClock, 0, i);
printf("║");
GotoXY(hClock, MAXWIDE-2, i);
printf("║");
}

GotoXY(hClock, 0, MAXHIGH);
printf("╚");
for(i=1; i<(MAXWIDE-1)/2; i++)
printf("═");
printf("╝");

GotoXY(hClock, 0, 0);
}

void HideCursor(HANDLE hClock)
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(hClock, &cursor_info);
}

void GotoXY(HANDLE hClock, int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(hClock, coord);
}

void PrintCalendar(HANDLE hClock, int x, int y,  time_t * p_rawtime)
{
int i;
struct tm * timenow = localtime(p_rawtime);
int year = timenow->tm_year+1900 , years;
int month = timenow->tm_mon + 1;
int day = timenow->tm_mday;
int week,centry;

int mon[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
if(year%400==0||year%4==0&&year%100!=0)
mon[1]++;
if ( month < 3 )
{
year -= 1;
month += 12;
}
centry = year/100;
years = year-centry*100;
week = (centry/4)-2*centry+(years+years/4)+(26*(month+1)/10);
week = (week%7+7)%7;

GotoXY(hClock, x,y++);
printf("Sun Mon Tue Wed Thu Fri Sat");
GotoXY(hClock, x,y);
for(i=0; i<week; i++)
printf("    ");
for(i=1; i<=mon[month-1]; i++)
{
if(day==i)
{
SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_BLUE |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
printf("%3d ",i++);
SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_RED |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
}
printf("%3d ",i);
if((i+week)%7==0)
GotoXY(hClock, x,y+=2);
}
}

void PrintClock(HANDLE hClock, time_t * p_rawtime)
{
struct tm * timenow = localtime(p_rawtime);
int board_degree=0, hour_degree=0, min_degree=0, sec_degree=0,i,R=11;

SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_BLUE |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);

for(i=1; i<=12; i++)                        // 打印周围的数字1-12
{
GotoXY(hClock,CENTER_X + R*2*sin(PI*i/6), CENTER_Y - R*cos(PI*i/6));
printf("%d",i);
}

while(1)
{
while(*p_rawtime != time(0))
{
*p_rawtime = time(0);
timenow = localtime(p_rawtime);
hour_degree = timenow->tm_hour % 12 * 30;
min_degree  = timenow->tm_min  * 6;
sec_degree  = timenow->tm_sec  * 6;

PrintTime(hClock, p_rawtime);

for(i=1; i<11; i++)
{
SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_BLUE |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
GotoXY(hClock,CENTER_X + i*2*sin(PI*(sec_degree-6)/180), CENTER_Y - i*cos(PI*(sec_degree-6)/180));
printf(" ");
GotoXY(hClock,CENTER_X + i*2*sin(PI*sec_degree/180), CENTER_Y - i*cos(PI*sec_degree/180));
printf("+");
}
for(i=1; i<8; i++)
{
SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_GREEN |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
if(0==timenow->tm_sec)
{
GotoXY(hClock,CENTER_X + i*2*sin(PI*(min_degree-6)/180), CENTER_Y - i*cos(PI*(min_degree-6)/180));
printf(" ");
}
GotoXY(hClock,CENTER_X + i*2*sin(PI*min_degree/180), CENTER_Y - i*cos(PI*min_degree/180));
printf("*");
}
for(i=1; i<5; i++)
{
SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_RED |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
if(0==timenow->tm_min)
{
GotoXY(hClock,CENTER_X + i*2*sin(PI*(hour_degree-30)/180), CENTER_Y - i*cos(PI*(hour_degree-30)/180));
printf(" ");
}
GotoXY(hClock,CENTER_X + i*2*sin(PI*hour_degree/180), CENTER_Y - i*cos(PI*hour_degree/180));
printf("#");

}
}
}
}

void PrintTime(HANDLE hClock, time_t * p_rawtime)
{
struct tm * timenow = localtime(p_rawtime);
SetConsoleTextAttribute(hClock,FOREGROUND_INTENSITY | FOREGROUND_BLUE |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
GotoXY(hClock,TIME_OFFSET_X,TIME_OFFSET_Y);
printf("当前系统时间:");
GotoXY(hClock,TIME_OFFSET_X,TIME_OFFSET_Y + 1);
printf("%4d 年 %2d 月 %2d 日",1900+timenow->tm_year,timenow->tm_mon,timenow->tm_mday);
GotoXY(hClock,TIME_OFFSET_X,TIME_OFFSET_Y + 2);
printf("%4d 时 %2d 分 %2d 秒",timenow->tm_hour,timenow->tm_min,timenow->tm_sec);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: