
C言語のfor文でうるう年を考慮したカレンダーの表示方法を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,aarch64).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信や,Unreal Editor for Fortnite(UEFN)でゲーム開発に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でChatGPT/Geminiを訓練するプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
- UEFNで10本以上のゲームを開発し,フォートナイト上で公開(Fortnite,Fortnite.GG).
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
うるう年
うるう年とは,2月が28日ではなく29日と1日増える年のことです.
西暦年が「4の倍数である」かつ「100の倍数でない」,または「400の倍数である」ならばうるう年と判定します.
C言語で書いたうるう年を判定するis_leap_year関数は以下になります.
引数yearの値で判定し,うるう年ならばtrue,そうでないならfalseを返します.
| 1 2 3 4 5 6 7 8 | bool is_leap_year(int year) {   if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {     return true;   }   return false; } | 
for文でうるう年を考慮したカレンダー
for文でうるう年を考慮したカレンダーのコードは以下になります.
| 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | /*  * Author: Hiroyuki Chishiro  * License: 2-Clause BSD  */ #include <stdio.h> #include <stdbool.h> #define BUFSIZE 32 struct month {   char name[BUFSIZE];   int days; }; struct month days_in_month[] = {   {"    January", 31},   {"   February", 28},   {"     March", 31},   {"     April", 30},   {"      May", 31},   {"     June", 30},   {"     July", 31},   {"    August", 31},   {"   September", 30},   {"    October", 31},   {"   November", 30},   {"   December", 31} }; bool is_leap_year(int year) {   if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {     return true;   }   return false; } int get_day_of_the_week(int year, int month) {   int m = month;   int day_of_the_week;   int day = 1;   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;   return day_of_the_week; } int main(void) {   int year, month;   int day_of_the_week;   int i, j;   printf("Please input year: ");   scanf("%d", &year);   printf("Please input month: ");   scanf("%d", &month);   if (is_leap_year(year)) {     days_in_month[1].days++;   }   day_of_the_week = get_day_of_the_week(year, month);   printf("%s %d\n", days_in_month[month - 1].name, year);   printf("Su Mo Tu We Th Fr Sa\n");   for (i = 0; i < day_of_the_week; i++) {     printf("   ");   }   for (i = 0; i < 7 - day_of_the_week; i++) {     printf("%2d ", i + 1);   }   printf("\n");   for (i = 6 - day_of_the_week;        i <= days_in_month[month - 1].days;        i += 7) {     for (j = 0; j < 7; j++) {       if (i + j > days_in_month[month - 1].days) {         break;       }       printf("%2d ", i + j);     }     printf("\n");   }   return 0; } | 
実行結果は以下になります.
3行目の2021と4行目の2,13行目の2020と14行目の2は入力した数字です.
つまり,2021年2月と2020年2月のカレンダーになります.
2020年はうるう年で2月は29日ありますが,正しく表示されることがわかります.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ gcc calendar.c  $ a.out  Please input year: 2021 Please input month: 2    February 2021 Su Mo Tu We Th Fr Sa     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  $ a.out Please input year: 2020 Please input month: 2    February 2020 Su Mo Tu We Th Fr Sa                    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 | 
上記の結果はcalコマンドを真似しています.
calコマンドによる2021年2月と2020年2月のカレンダーの表示は以下になります.同じですね.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ cal 2 2021    February 2021       Su Mo Tu We Th Fr Sa       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                                       $ cal 2 2020    February 2020       Su Mo Tu We Th Fr Sa                      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   | 
まとめ
C言語のfor文でうるう年を考慮したカレンダーの表示方法を紹介しました.
カレンダーの自作コードの出力結果が,calコマンドと同じになることを確認しました.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

