谁能帮我编一个C语言时钟啊
/*这是我做了一半的万年历的界面,正好有你需要的显示时钟的功能,你把它分离出来吧*/
#include<stdio.h>
#include<windows.h>
#include<time.h>
int week; //用于存放星期几的变量
/****定义结构体存时间数据***/
int year,month,day,hour,min,sec; //当前时间
int l_year,l_month,l_day,l_hour,l_min,l_sec; //前一次的时间
//定义星期几和格子坐标的数组
int curx[5][7]={
{2,6,10,14,18,22,26},
{2,6,10,14,18,22,26},
{2,6,10,14,18,22,26},
{2,6,10,14,18,22,26},
{2,6,10,14,18,22,26}
};
void setcur(int x,int y); //set cursor
void setcur(int x,int y)
{
HANDLE hOut = ::GetStdHandle(STD_OUTPUT_HANDLE); // get the handle
COORD p;
p.X = x;
p.Y = y;
SetConsoleCursorPosition(hOut,p);
}
/*把某年某天转换到几天*/
int y_2_d(int year,int month,int day);
int y_2_d(int year,int month,int day)
{
const short MonthDay[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int JD,i;
JD = day;
for(i=1;i<month;i++)
JD+=MonthDay[i];
if((year%4==0)&&(year%100!=0)||(year%400==0)&&month>2)
JD++;
return JD;
}
/****把天数转换成星期****/
int d_2_w(int year,int month,int day);
int d_2_w(int year,int month,int day)
{
int cha,d,w;
cha = ((year-1)+(year-1)/4-(year-1)/100+(year-1)/400)%7;
d = y_2_d(year,month,day);
w = (d+cha) % 7;
return w;
}
void drawmap();
void drawmap()
{
system("mode con cols=44 lines=16");
system("title _______________万年历________________");
system("color 3a");
int x,y;
/* 万年历地图 1:┌ 2:┐ 3:└ 4:┘ 5:┼ 6:─ 7:│ 8:┬ 9:├ 10:┤
11:┴
*/
int map[15][44]={
{1,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,2,0},
{7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{9,0,6,0,8,0,6,0,8,0,6,0,8,0,6,0,8,0,6,0,8,0,6,0,8,0,6,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,10,0},
{7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{9,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{9,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{9,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{9,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{9,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,5,0,6,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0},
{3,0,6,0,11,0,6,0,11,0,6,0,11,0,6,0,11,0,6,0,11,0,6,0,11,0,6,0,11,0,6,0,6,0,6,0,6,0,6,0,6,0,4,0}
};
for(y=0;y<15;y++)
for(x=0;x<44;x+=2)
{
setcur(x,y);
/* 1:┌ 2:┐ 3:└ 4:┘ 5:┼ 6:─ 7:│ 8:┬ 9:├ 10:┤11:┴ */
switch(map[y][x])
{
case 1: printf("┌");break;
case 2: printf("┐");break;
case 3: printf("└");break;
case 4: printf("┘");break;
case 5: printf("┼");break;
case 6: printf("─");break;
case 7: printf("│");break;
case 8: printf("┬");break;
case 9: printf("├");break;
case 10: printf("┤");break;
case 11: printf("┴");break;
default: printf(" ");
}
}
//显示星期
for(int w=2;w<44;w+=4)
{
setcur(w,3);
switch(w)
{
case 2: printf("日");break;
case 6: printf("一");break;
case 10: printf("二");break;
case 14: printf("三");break;
case 18: printf("四");break;
case 22: printf("五");break;
case 26: printf("六");break;
case 30: printf("〖详细信息〗");break;
default:break;
w+=4;
}
}
//画时间间隔符
setcur(35,1);
printf(":");
setcur(38,1);
printf(":");
//画日期间隔符
setcur(13,1);
printf("年");
setcur(17,1);
printf("月");
setcur(21,1);
printf("日");
}
/*******更新年-月-日*****/
void setymd(int year,int month,int day);
void setymd(int year,int month,int day)
{
if(l_year!=year)
{
setcur(9,1);
printf("%d",year);
}
if(l_month!=month)
{
setcur(15,1);
printf(month<=9?"0%d":"%d",month);
}
if(l_day!=day)
{
setcur(19,1);
printf(day<=9?"0%d":"%d",day);
}
l_year = year;
l_month = month;
l_day = day;
}
/**更新时间***/
void settime(int hour,int min,int sec);
void settime(int hour,int min,int sec)
{
if(l_sec!=sec) //判断系统时间是否改变,如果改变,就更新
{
setcur(39,1);
printf(sec<=9?"0%d":"%d",sec); //判断秒数是否小于10 如果小于 就在前面加0
}
if(l_min!=min)
{
setcur(36,1);
printf(min<=9?"0%d":"%d",min);
}
if(l_hour!=hour)
{
setcur(33,1);
printf(hour<=9?"0%d":"%d",hour);
}
l_hour=hour; //把当前的时间保存在全局变量中,给下一次和新的时间对比
l_min=min;
l_sec=sec;
}
/************写入日期数据**************/
void writedata(int week,int maxday);
void writedata(int week,int maxday)
{
int x,y=6,i,j,n=1;
switch(week)
{
case 0:x=2;break;
case 1:x=6;break;
case 2:x=10;break;
case 3:x=14;break;
case 4:x=18;break;
case 5:x=22;break;
case 6:x=26;break;
default:break;
}
for(j=0;j<5;j++)
for(i=x;i<7;i++)
{
setcur(curx[j][i],y);
printf(n>9?"%d":"0%d",n);
n++;
y+=2;
}
}
/********更新万年历日期数据********/
void setdate(int year,int month,int week);
void setdate(int year,int month,int week)
{
if((year%4==0)&&(year%100!=0)||(year%400==0&&month==2))
{
writedata(week,28);
}
else if(month==4||month==6||month==9||month==11)
{
writedata(week,30);
}
else if(month==2)
{
writedata(week,29);
}
else
{
writedata(week,31);
}
}
void main() //主函数
{
/*******以下部分隐藏光标,并且画出背景地图*******/
HANDLE hOut = ::GetStdHandle(STD_OUTPUT_HANDLE); //get the handle
CONSOLE_CURSOR_INFO cci;
::GetConsoleCursorInfo(hOut, &cci); //get the cursor infomation
cci.bVisible = false; //可见属性设置为假
::SetConsoleCursorInfo(hOut, &cci); //set the cursor infomation
drawmap();
/*********以下部分获取系统时间********
struct tm -- 时间结构,time.h 定义如下:
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
*/
time_t nowtime;
struct tm *timeinfo;
while(1)
{
time(&nowtime);
timeinfo = localtime(&nowtime);
year = timeinfo->tm_year + 1900;
month =timeinfo->tm_mon + 1;
day = timeinfo->tm_mday;
hour = timeinfo->tm_hour;
min = timeinfo->tm_min;
sec = timeinfo->tm_sec;
setymd(year,month,day);
settime(hour,min,sec);
week = d_2_w(year,month,1);
setdate(year,month,week);
}
Sleep(100000);
}