人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しい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

完成です!

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

 

「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;
    day_of_the_week = (year+year/4-year/100+year/400+(13*month+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;
    }
}