|
ちょっと日にちが経ちすぎてお役に立てないかもしれませんが…。
>カレンダーで現在の日にちを取得し、 >現在の日を点滅するようにしたいのですが >それってできるのでしょうか??
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
void calendar(HANDLE hOut, int y, int m, int d);
int is_leap_year(int y);
int week_of_day(int y, int m, int d);
int month_last_day(int y, int m);
int Locate(HANDLE hOut, int x, int y);
int main(void)
{
time_t timer;
struct tm *t_st;
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
time(&timer);
t_st = localtime(&timer);
/* カレンダーの表示 */
calendar(hStdout, t_st->tm_year+1900, t_st->tm_mon+1, t_st->tm_mday);
return 0;
}
/* カレンダーの表示 */
void calendar(HANDLE hStdout, int y, int m, int d)
{
int i, e, fw, xz, yz;
static int sw = 0;
fw = week_of_day(y, m, 1);
e = month_last_day(y, m);
Locate(hStdout, 0, 0);
printf(" %d年%d月\n", y, m);
printf(" 日 月 火 水 木 金 土\n");
printf("---------------------\n");
for (i = 1; i <= fw; i++)
printf(" ");
for (i = 1; i <= e; i++) {
printf(" %2d", i);
if ( (i + fw) % 7 == 0)
putchar('\n');
}
xz = (d + fw - 1) % 7 * 3;
yz = (d + fw - 1) / 7 + 3;
while(!kbhit()) {
Locate(hStdout, xz, yz);
if (sw == 0) {
printf(" %2d", d);
sw = 1;
}
else {
printf(" ");
sw = 0;
}
Sleep(500);
}
}
/* 閏年の判定 */
int is_leap_year(int y)
{
return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
}
/* 月の最終日を求める */
int month_last_day(int y, int m)
{
int d = 0, last[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (m == 2)
d = last[m-1] + is_leap_year(y);
else if (m >= 1 && m <= 12)
d = last[m-1];
return d;
}
/* 指定日の曜日を求める */
int week_of_day(int y, int m, int d)
{
if(m==1) {
y=y-1;
m=13;
}
else if(m==2) {
y=y-1;
m=14;
}
return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
}
/* カーソル位置の指定 */
int Locate(HANDLE hOut, int x, int y)
{
COORD dwPos;
dwPos.X = (SHORT)x;
dwPos.Y = (SHORT)y;
if (SetConsoleCursorPosition(hOut, dwPos) == 0)
return -1;
else
return 0;
}
|