おはこんばんにちは!
うにゃうにゃエンジニアの猫です(=^・^=)
今日はC言語で、ある日付から別の日付まで何日あるのかカウントするプログラムと、
それを利用して曜日を求めるプログラムを作ってみました。
良かったら使って下さいにゃっ!
その年の1月1日からの日数を計算します。
それには月ごとの日数の配列を作って利用しています。
例えば1月だったら+0、2月だったら+31…と加算日数が配列に入っています。
C言語は配列の要素が0から始まる為、配列の先頭の要素はダミーとして0が入っています。
開始日と終了日を年、月、日ごとに入力して、開始日が3月より前だったら、または終了日が3月以降だったら、
閏(うるう)年かどうか調べて、閏年だったら日付を1つ増やすように計算します。
開始日と終了日の年の差×365とうるう年の調整をして日数を求めました。
では実行して見ます。
今日は2021年(令和3年)1月23日です。
1年前の2020年1月23日までの日数を求めます。
2020年はうるう年で、2月29日が含まれるので、その分加算され、365+1で366日になります。
では、私が生れた1977年5月19日から今日までの日数を調べます。
うわぁぁぁ、こんなに生きているんだ。もっと1日1日丁寧に生きないと!!
ここまでのプログラミングのコードです。
#include <stdio.h>
//ここで引き算している
int hikizan(int start,int goal){
return goal-start;
}
//うるう年かどうかの判定をしている
int isLeapYear(int uruyear){
if((uruyear%4==0 && uruyear%100!=0) || uruyear%400==0){
return 1;
}else{
return 0;
}
}
int main(void)
{
//日付の開始日、終了日の変数
int yearstart,yeargoal,yeardif; //開始年、終了年、終了年-開始年
int monthstart,monthgoal; //開始月、終了月
int daystart,daygoal; //開始日付け、終了日付け
int uruFlg; //うるう年の判定フラグ
int count=0; //うるう年の回数
//月の配列。その年の1月1日からの日数
int tukihi[]={0,0,31,59,90,120,151,181,212,243,273,304,334};
//開始日の入力
printf(“開始日の年を入力してください。開始の年:yearstart=”);
scanf(“%d”,&yearstart);
printf(“開始日の月を入力してください。開始の月:monthstart=”);
scanf(“%d”,&monthstart);
printf(“開始日の日を入力してください。開始の日:daystart=”);
scanf(“%d”,&daystart);
printf(“——————————————-\n”);
//終了日の入力
printf(“終了日の年を入力してください。\n※開始日以降の日付を入力してください※\n終了の年:yeargoal=”);
scanf(“%d”,&yeargoal);
printf(“終了日の月を入力してください。終了の月:monthgoal=”);
scanf(“%d”,&monthgoal);
printf(“終了日の日を入力してください。終了の日:daygoal=”);
scanf(“%d”,&daygoal);
//もしも開始日>終了日だったら
if(daystart>daygoal){
printf(“終了日を開始日以降の日付にしてやり直して下さい。\n”);
return 0;
}
printf(“\n”);
//その年の1月1日からの日数
daystart+=tukihi[monthstart];
daygoal+=tukihi[monthgoal];
//開始年と終了年の差は何年あるか
yeardif=hikizan(yearstart,yeargoal);
//開始日の月が3月より前だったらその年が閏(うるう)年かチェックする
if(monthstart<3){ uruFlg=isLeapYear(yearstart); if(uruFlg==1){ daystart–; } }
//終了日の月が3月以降だったらその年が閏(うるう)年かチェックして、前の年の判定の順準備をする if(monthgoal>=3){
uruFlg=isLeapYear(yeargoal);
if(uruFlg==1){
daygoal++;
}
}
yeargoal–; //終了日の前年のうるう年判定をする準備
//終了日の前年から開始日の年までうるう年か調べる
for(int i=yeargoal;yeargoal>yearstart;yeargoal–)
{
uruFlg=isLeapYear(yeargoal);
if(uruFlg==1){
count++;
}
}
daygoal+=365*yeardif+count-daystart; //日数計算
printf(“%d日です。\n”,daygoal);
}
では、上のプログラムを利用して、曜日を求めてみます。
基準日は1970年1月1日とします。その日は木曜日なので、日数差を7で割った余りが0なら木曜日、
1なら金曜日…と配列に入力して曜日を調べます。
今日2021年1月23日は土曜日ですので、ちゃんと求まりました。
では、私が高校生の頃に阪神淡路大震災や地下鉄サリン事件があった激動の年、1995年(平成7年)から任意の日付、6月21日は何曜日か調べます。
水曜日ですね。
良かったちゃんと動いていた。
では、このプログラムのコードです。
#include <stdio.h>
//ここで引き算している
int hikizan(int start,int goal){
return goal-start;
}
//うるう年かどうかの判定をしている
int isLeapYear(int uruyear){
if((uruyear%4==0 && uruyear%100!=0) || uruyear%400==0){
return 1;
}else{
return 0;
}
}
//曜日を求める
int youbihantei(int nanyou){
return nanyou%7;
}
int main(void)
{
//日付の開始日、終了日の変数
int yearstart,yeargoal,yeardif; //開始年、終了年、終了年-開始年
int monthstart,monthgoal; //開始月、終了月
int daystart,daygoal; //開始日付け、終了日付け
int uruFlg; //うるう年の判定フラグ
int count=0; //うるう年の回数
int week; //曜日を表す配列の添え字
//月の配列
int tukihi[]={0,0,31,59,90,120,151,181,212,243,273,304,334};
//開始日(基準の日を1970年1月1日とする)
yearstart=1970;
monthstart=1;
daystart=1;
//曜日の配列。基準日との日数差を7で割った余りが0になるのが木曜日
char youbi[]={“木”,”金”,”土”,”日”,”月”,”火”,”水”};
printf(“年を入力してください。年:yeargoal=”); scanf(“%d”,&yeargoal); printf(“月を入力してください。月:monthgoal=”); scanf(“%d”,&monthgoal);
printf(“日を入力してください。日:daysgoal=”);
scanf(“%d”,&daygoal); printf(“\n”); //その年の1月1日からの日数 daygoal+=tukihi[monthgoal]; //開始年と終了年の差 yeardif=hikizan(yearstart,yeargoal); //終了日の月が3月以降だったらその
年が閏(うるう)年かチェックする if(monthgoal>=3){ uruFlg=isLeapYear(yeargoal); if(uruFlg==1){ daygoal++; } } yeargoal–; //終了日の前年から1971年までうるう年か調べる for(int i=yeargoal;yeargoal>yearstart;yeargoal–) { uruFlg=isLeapYear(yeargoal); if(uruFlg==1){ count++; } } daygoal+=365yeardif+count-daystart;
week=youbihantei(daygoal);
if(yeargoal<1970){
printf(“1970年1月1日以降の日付を入力してください。\n”);
}else{
printf(“%s曜日です。\n”,youbi[week]);
}
}
ご精読ありがとうございました(=^・^=)mm