人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

カレンダー作成 プログラミング【C言語・自作】

f:id:hiro-htm877:20190601191549p:plain

 

f:id:hiro-htm877:20190601202549p:plain

 

 「for文を使って何か作ってみたい」

「カレンダーをC言語で作ってみたい」

 

 

そんな方の疑問に答えます。

 

C言語の勉強をしていて、何か自分出作ってみたい!と思っている方、for文を使ったプログラミングとしてカレンダー作成があります。ぜひやってみてください!

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

【完全初心者向け】カレンダー作成プログラミングの自作!

カレンダーの作成!

条件

・日曜スタートの日本カレンダーの作成!

アルゴリズム

カレンダーの作成

1. scanfで表示したい年と月を入力してもらう

2. 閏年判定を行い、閏年なら2月の日数を+1する

3. 指定した年、月のカレンダーを表示

カレンダー作成プログラム実装!

表示ループ処理までの準備
1.  scaf

 ←表示したい年と月の入力

2. int month_daynum_array[] ={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

 ←各月の日数を配列で宣言

3. month_daynum_array[1] += judge_leap_year(year);

 ←閏年判定をし、閏年なら2月の日数を+1

4.  day_of_the_week = (year+year/4-year/100+year/400+(13*month+8)/5+day)%7;

 ←年・月・日からその日の曜日を求める

カレンダー表示プログラム

 

最初の一週間の表示は、別で表示する。

(水曜スタートなどが考えられるため)

printf("\t日\t月\t火\t水\t木\t金\t土\n");
    for(i=0; i<day_of_the_week; i++){
        printf("\t");
    }
    for(i=0; i<7-day_of_the_week; i++){
        printf("\t%d", i+1);
    }
    printf("\n");

あとは月の最後の日まで7日ごとで表示していく。

月の最後の日になれば、breakで強制的にループを抜ける。

for(i=(7-day_of_the_week+1); i<=month_daynum_array[month-1]; i+=7){
        for(j=0; j<7; j++){
            if (i+j > month_daynum_array[month-1]){
                break;
            }else{
                //do nothing
            }
            printf("\t%d", i+j);
        }
        printf("\n");
    }
出力 

カレンダーで表示したい年と月を入力してください!

年:

2019

月:

6

日 月 火 水 木 金 土

1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30

完成です!

カレンダー表示プログラムを実装しました。

※コメントで指摘をいただき、1月2月のday_of_the_week()の計算が間違っていることを教えていただきましたので修正しております。

計算方法の参考文献を教えていただきましたので詳しいことを知りたい方はご参照ください!

http://www.koshi-h.ed.jp/wp-content/uploads/2018/01/H29_12_zeller.pdf

 

 

「for文でどこまで回したらいいか」、「ループを途中から再開するにはどうすればいいか」など結構難しい問題が組み込まれています。

ぜひ自分で作ってみましょう!

 

main文を含む全ソースコードは以下に示します。 

ソースコード

#include <stdio.h>
void enshu0611(void);
int judge_leap_year(int year);
int main() {
    enshu0611();
    return 0;
}
void enshu0611(void){
    int year, month, day;
    printf("カレンダーで表示したい年と月を入力してください!\n");
    printf("年: \n");
    scanf("%d", &year);
    printf("月: \n");
    scanf("%d", &month);
    int month_daynum_array[] ={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int day_of_the_week;
    //閏年処理
    month_daynum_array[1] += judge_leap_year(year);
    //year年 month月 day日の曜日を求める
    day = 1;
        // 1月2月はyearを(year-1)にmonthを(month+12)にする
    int m = month;
    if(month == 1){
        m = month+12;
        year = year-1;
    } else if(month == 2){
        m = month+12;
        year = year-1;
    }

    day_of_the_week = (year+year/4-year/100+year/400+(13*m+8)/5+day)%7;
    int i, j;
    printf("\t日\t月\t火\t水\t木\t金\t土\n");
    for(i=0; i<day_of_the_week; i++){
        printf("\t");
    }
    for(i=0; i<7-day_of_the_week; i++){
        printf("\t%d", i+1);
    }
    printf("\n");
    for(i=(7-day_of_the_week+1); i<=month_daynum_array[month-1]; i+=7){
        for(j=0; j<7; j++){
            if (i+j > month_daynum_array[month-1]){
                break;
            }else{
                //do nothing
            }
            printf("\t%d", i+j);
        }
        printf("\n");
    }
}
int judge_leap_year(int year){
    if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)){
        return 1;
    }
    else{
        return 0;
    }
}