今日も昼過ぎに研究室へ。
C言語でカレンダーを表示させるプログラムを作った。
祝日も対応のなかなか便利なカレンダーです!
使い方は第一引数に年、第二引数に月を入れて実行
#include <stdio.h>
#include <string.h>
int main();
int zeller(int,int,int);
/* 第1引数:年 第2引数:月 */
int main(int argc,char *argv[]){
int i,youbi,day,y = atoi(argv[1]),m = atoi(argv[2]);
int flag=0; // 連休判定Flag
printf("\n\t\tYear:%d Month:%d\n\n\x1b[;31mSun\x1b[;0m\tMon\tTue\tWed\tThu\tFri\t\x1b[;34mSat\x1b[;0m\n",y,m);
/* 日数を設定 */
if(m == 2){
if(y%400 == 0 || (y%100 != 0 && y%4 == 0)){
day = 29;
}
else{
day = 28;
}
}
else if(m == 4 || m == 6 || m == 9 || m == 11){
day = 30;
}
else{
day = 31;
}
/* 1日の曜日を求めます */
if(m == 1 || m == 2){
youbi = zeller(y-1,m+12,1);
}
else{
youbi = zeller(y,m,1);
}
for(i=1;i<=day+youbi;i++){ //day+youbi回ループさせる // (i-youbi)が日付、(i-1)%7が曜日となる
if(i-youbi<1){printf("\t");} //1日までタブ else{
if(hantei(y,m,i-youbi,(i-1)%7) == 2){
printf("\x1b[;31m");
printf("(%d)\t",i-youbi);
printf("\x1b[;0m");
flag = 1; // 日曜と祝日が重なったらflagをたてる
}
else if(hantei(y,m,i-youbi,(i-1)%7) == 1 || flag == 1){
printf("\x1b[;31m");
printf("(%d)\t",i-youbi);
printf("\x1b[;0m");
flag = 0;
}
else if((i-1)%7 == 6){ // 土曜日
printf("\x1b[;34m");
printf("%d\t",i-youbi);
printf("\x1b[;0m");
}
else{
printf("%d\t",i-youbi); //日付を出力
flag = 0;
}
if((i-1)%7 == 6){printf("\n");} //土曜のあとは改行
}
}
return 0;
}
/* Zellerの公式 */
int zeller(int y,int m,int d){
return ((y + (int)(y/4) - (int)(y/100) + (int)(y/400) + (int)(2.6*m + 1.6) + d) % 7);
}
/* 祝日判定関数(祝日なら0以外を返す) */
int hantei(int y,int m,int d,int youbi){
if((m==3 && d== (int)(20.8431 + 0.242194*(y-1980) - (y-1980)/4)) // 春分の日
|| (m==9 && d== (int)(23.2488 + 0.242194*(y-1980) - (y-1980)/4)) // 秋分の日
|| (m==1 && d==1) // 元旦
|| (m==1 && d>7 && d<15 && youbi==1) // 成人の日
|| (m==2 && d==11) // 建国記念日
|| (m==4 && d==29) // みどりの日
|| (m==5 && d==3) // 憲法記念日
|| (m==5 && d==4) // 国民の祝日
|| (m==5 && d==5) // 子供の日
|| (m==7 && d>14 && d<22 && youbi==1) // 海の日
|| (m==9 && d>14 && d<22 && youbi==1) // 敬老の日
|| (m==10 && d>7 && d<15 && youbi==1) // 体育の日
|| (m==11 && d==3) // 文化の日
|| (m==11 && d==23) // 勤労感謝の日
|| (m==12 && d==23))// 天皇誕生日
{
if(youbi == 0){// 日曜と休日が重なった処理
return 2;
}
else{
return 1;
}
}
if(youbi == 0){ // 日曜日
return 1;
}
return 0;
}
C言語でカレンダーを表示させるプログラムを作った。
祝日も対応のなかなか便利なカレンダーです!
使い方は第一引数に年、第二引数に月を入れて実行
#include <stdio.h>
#include <string.h>
int main();
int zeller(int,int,int);
/* 第1引数:年 第2引数:月 */
int main(int argc,char *argv[]){
int i,youbi,day,y = atoi(argv[1]),m = atoi(argv[2]);
int flag=0; // 連休判定Flag
printf("\n\t\tYear:%d Month:%d\n\n\x1b[;31mSun\x1b[;0m\tMon\tTue\tWed\tThu\tFri\t\x1b[;34mSat\x1b[;0m\n",y,m);
/* 日数を設定 */
if(m == 2){
if(y%400 == 0 || (y%100 != 0 && y%4 == 0)){
day = 29;
}
else{
day = 28;
}
}
else if(m == 4 || m == 6 || m == 9 || m == 11){
day = 30;
}
else{
day = 31;
}
/* 1日の曜日を求めます */
if(m == 1 || m == 2){
youbi = zeller(y-1,m+12,1);
}
else{
youbi = zeller(y,m,1);
}
for(i=1;i<=day+youbi;i++){ //day+youbi回ループさせる // (i-youbi)が日付、(i-1)%7が曜日となる
if(i-youbi<1){printf("\t");} //1日までタブ else{
if(hantei(y,m,i-youbi,(i-1)%7) == 2){
printf("\x1b[;31m");
printf("(%d)\t",i-youbi);
printf("\x1b[;0m");
flag = 1; // 日曜と祝日が重なったらflagをたてる
}
else if(hantei(y,m,i-youbi,(i-1)%7) == 1 || flag == 1){
printf("\x1b[;31m");
printf("(%d)\t",i-youbi);
printf("\x1b[;0m");
flag = 0;
}
else if((i-1)%7 == 6){ // 土曜日
printf("\x1b[;34m");
printf("%d\t",i-youbi);
printf("\x1b[;0m");
}
else{
printf("%d\t",i-youbi); //日付を出力
flag = 0;
}
if((i-1)%7 == 6){printf("\n");} //土曜のあとは改行
}
}
return 0;
}
/* Zellerの公式 */
int zeller(int y,int m,int d){
return ((y + (int)(y/4) - (int)(y/100) + (int)(y/400) + (int)(2.6*m + 1.6) + d) % 7);
}
/* 祝日判定関数(祝日なら0以外を返す) */
int hantei(int y,int m,int d,int youbi){
if((m==3 && d== (int)(20.8431 + 0.242194*(y-1980) - (y-1980)/4)) // 春分の日
|| (m==9 && d== (int)(23.2488 + 0.242194*(y-1980) - (y-1980)/4)) // 秋分の日
|| (m==1 && d==1) // 元旦
|| (m==1 && d>7 && d<15 && youbi==1) // 成人の日
|| (m==2 && d==11) // 建国記念日
|| (m==4 && d==29) // みどりの日
|| (m==5 && d==3) // 憲法記念日
|| (m==5 && d==4) // 国民の祝日
|| (m==5 && d==5) // 子供の日
|| (m==7 && d>14 && d<22 && youbi==1) // 海の日
|| (m==9 && d>14 && d<22 && youbi==1) // 敬老の日
|| (m==10 && d>7 && d<15 && youbi==1) // 体育の日
|| (m==11 && d==3) // 文化の日
|| (m==11 && d==23) // 勤労感謝の日
|| (m==12 && d==23))// 天皇誕生日
{
if(youbi == 0){// 日曜と休日が重なった処理
return 2;
}
else{
return 1;
}
}
if(youbi == 0){ // 日曜日
return 1;
}
return 0;
}