ツェラーの公式をC言語で実装する方法と活用例

当ページのリンクには広告が含まれています。
アイキャッチ画像

ツェラーの公式は、ある特定の日付の曜日を計算するための数式です。この公式を使えば、過去や未来の任意の日付の曜日を簡単に求めることができます。

本記事では、ツェラーの公式をC言語で実装する方法を詳しく解説します。

C言語のおすすめ教材はこちら!
楽天ブックス
¥2,530 (2025/01/18 14:47時点 | 楽天市場調べ)
目次

ツェラーの公式とは?

ツェラーの公式は次のように定義されます。

h=(q+513(m+1)​+K+4K​+4J​−2J)mod7

  • h: 曜日を表す数字(0: 土曜日, 1: 日曜日, …, 6: 金曜日)
  • qq: 日付(1日, 2日, …, 31日)
  • mm: 月(3月: 3, 4月: 4, …, 12月: 12, 1月: 13, 2月: 14)
  • KK: 年の下2桁(例: 2023年の場合、23)
  • JJ: 年の上2桁(例: 2023年の場合、20)

公式の使い方

  1. 日付を qq、月を mm、年を YY として入力します。

2. mm が1月または2月の場合、mm に12を足し、YY から1を引きます。

3. KK を Ymod  100Ymod100、JJ を Y/100Y/100 として計算します。

4. 上記の公式に代入して hh を求めます。

C言語での実装

以下は、ツェラーの公式を用いて曜日を計算するC言語のサンプルコードです。

#include <stdio.h>

// 曜日を表示するための配列
const char *weekdays[] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};

// ツェラーの公式を実装する関数
int zeller(int year, int month, int day) {
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    int K = year % 100;
    int J = year / 100;
    int h = (day + (13 * (month + 1)) / 5 + K + K / 4 + J / 4 - 2 * J) % 7;
    return h;
}

int main() {
    int year, month, day;

    // ユーザーから日付を入力
    printf("Enter year (e.g., 2023): ");
    scanf("%d", &year);
    printf("Enter month (1-12): ");
    scanf("%d", &month);
    printf("Enter day (1-31): ");
    scanf("%d", &day);

    // ツェラーの公式で曜日を計算
    int weekday = zeller(year, month, day);

    // 結果を表示
    printf("The day is: %s\n", weekdays[weekday]);

    return 0;
}

実行例

Enter year (e.g., 2023): 2025
Enter month (1-12): 1
Enter day (1-31): 18
The day is: Saturday

ツェラーの公式を使うメリット

  1. 効率的な曜日計算
    • シンプルな数式で曜日を計算できるため、複雑なアルゴリズムを設計する必要がありません。
  2. リソースの節約
    • メモリやCPUリソースを多く消費しないため、組み込みシステムやリソース制限のある環境に最適です。
    • 数学的な公式をプログラムに落とし込む経験が得られるため、教育現場や独学に向いています。
  3. カスタマイズ可能
    • ツェラーの公式を応用して、カレンダーアプリやスケジュール管理システムを開発することができます。

カレンダーアプリへの応用

ツェラーの公式を活用することで、シンプルなカレンダーアプリを作成できます。以下は、年と月を入力するとその月のカレンダーを表示するプログラムの例です。

#include <stdio.h>

// 各月の日数
const int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 閏年かどうかを判定する関数
int is_leap_year(int year) {
    return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
}

// ツェラーの公式を使用して月初の曜日を計算
int zeller_month_start(int year, int month) {
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    int K = year % 100;
    int J = year / 100;
    return (1 + (13 * (month + 1)) / 5 + K + K / 4 + J / 4 - 2 * J) % 7;
}

void print_calendar(int year, int month) {
    printf("\n  %d年 %d月\n", year, month);
    printf("Sun Mon Tue Wed Thu Fri Sat\n");

    int days = days_in_month[month - 1];
    if (month == 2 && is_leap_year(year)) {
        days = 29;
    }

    int start_day = zeller_month_start(year, month);

    // カレンダーの表示
    for (int i = 0; i < start_day; i++) {
        printf("    ");
    }
    for (int day = 1; day <= days; day++) {
        printf("%3d ", day);
        if ((start_day + day) % 7 == 0) {
            printf("\n");
        }
    }
    printf("\n");
}

int main() {
    int year, month;
    printf("Enter year: ");
    scanf("%d", &year);
    printf("Enter month (1-12): ");
    scanf("%d", &month);

    print_calendar(year, month);

    return 0;
}

実行例

Enter year: 2025
Enter month (1-12): 1

  2025年 1月
Sun Mon Tue Wed Thu Fri Sat
            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

終わりに

ツェラーの公式を理解し、C言語で実装する方法について解説しました。また、カレンダーアプリの応用例も取り上げました。

本記事を参考に、ぜひ独自のアプリやツールを開発してみてください。

tenjiprogramming
20代エンジニア。
メインで使用している言語はJava/JavaScript/TyoeScript/react/C言語
AWSなどクラウド周りも経験あり。
楽しいをモットーに記事を書いています。
Noteではサンプルコード付きのゲームの作り方など様々な内容を公開しています。
そちらも是非ご覧ください!
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次