ツェラーの公式は、ある特定の日付の曜日を計算するための数式です。この公式を使えば、過去や未来の任意の日付の曜日を簡単に求めることができます。
本記事では、ツェラーの公式をC言語で実装する方法を詳しく解説します。
C言語のおすすめ教材はこちら!
目次
ツェラーの公式とは?
ツェラーの公式は次のように定義されます。
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)
公式の使い方
- 日付を 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
ツェラーの公式を使うメリット
- 効率的な曜日計算
- シンプルな数式で曜日を計算できるため、複雑なアルゴリズムを設計する必要がありません。
- シンプルな数式で曜日を計算できるため、複雑なアルゴリズムを設計する必要がありません。
- リソースの節約
- メモリやCPUリソースを多く消費しないため、組み込みシステムやリソース制限のある環境に最適です。
- 数学的な公式をプログラムに落とし込む経験が得られるため、教育現場や独学に向いています。
- カスタマイズ可能
- ツェラーの公式を応用して、カレンダーアプリやスケジュール管理システムを開発することができます。
カレンダーアプリへの応用
ツェラーの公式を活用することで、シンプルなカレンダーアプリを作成できます。以下は、年と月を入力するとその月のカレンダーを表示するプログラムの例です。
#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言語で実装する方法について解説しました。また、カレンダーアプリの応用例も取り上げました。
本記事を参考に、ぜひ独自のアプリやツールを開発してみてください。
コメント