基本問題(4)

[ edit ]

*


概要

[ edit ]

  • 演習(4)

    基本課題(4a)

    【関数定義】

    ツェラーの公式による
    曜日判定関数
    (年月日から曜日を求める)

    BP_02_004a_day_of_week_by_zeller_congruence.py

  • ツェラーの公式
    • y年 m月 d日の曜日を0~6の整数で求める
      • Dが,0のとき月曜,1のとき火曜,... ,6のとき日曜
      • CとYは(4桁の)西暦年yの上2桁と下2桁
      • 1月と2月は,それぞれ,前年の13月と14月として取り扱う

$$ D = \{ d + \lfloor \frac{ 26 ( m + 1 ) }{10} \rfloor + Y + \lfloor \frac{Y}{4} \rfloor + \Gamma \} \mod 7 $$

$$ \Gamma = \left\{ \begin{array}{ll} 5 C + \lfloor \frac{C}{4} \rfloor & グレゴリオ暦 (1582 \lessapprox y)\\ 6 C + 5 & ユリウス暦 (4 \lessapprox y \lessapprox 1582)\\ \end{array} \right. $$

*


ヒント

この課題で使うPythonの機能 (学習のヒント)

[ edit ]

  • この課題で使うPythonの機能 (学習のヒント) ...
    • 関数定義

    • print()関数

      • キーワードパラメータsepは区切り文字列,キーワードパラメータendは行末文字列です.

この課題の解き方 (問題解決のヒント)

[ edit ]

  • この課題の解き方 (問題解決のヒント) ....
    • ツェラーの公式(合同式)

      • 数式からプログラムに書き起こす作業に慣れましょう.
      • y 年 m 月 d 日の曜日を求める関数zeller_congruence( y, m, d )を作ってください.
        • 但し,1月と2月は,それぞれ,前年の13月,14月として取り扱う.
        • ツェラーの公式(合同式)自体は,wikipediaを見てください.

          • この式の中のfloor(x)関数(x 以下の最大の整数)としては...
            • mathモジュールのmath.floor()関数を使ってもよいのですが,単純にint()関数で整数化してもかまいません

          • 剰余演算子は,%でしたね.

  • ツェラーの公式
    • y年 m月 d日の曜日を0~6の整数で求める
      • Dが,0のとき月曜,1のとき火曜,... ,6のとき日曜
      • CとYは(4桁の)西暦年yの上2桁と下2桁
      • 1月と2月は,それぞれ,前年の13月と14月として取り扱う

$$ D = \{ d + \lfloor \frac{ 26 ( m + 1 ) }{10} \rfloor + Y + \lfloor \frac{Y}{4} \rfloor + \Gamma \} \mod 7 $$

$$ \Gamma = \left\{ \begin{array}{ll} 5 C + \lfloor \frac{C}{4} \rfloor & グレゴリオ暦 (1582 \lessapprox y)\\ 6 C + 5 & ユリウス暦 (4 \lessapprox y \lessapprox 1582)\\ \end{array} \right. $$

*


実行例

[ edit ]

  • 実行例(1) ... クリックすると拡大します

fig-01

*


プログラム例: 本質的な部分 (授業中に順次公開します)

[ edit ]

  • 解答例の核心部分は,下記の実質 9 行です.
    • y 年 m 月 d 日の曜日を求める。
      • 但し,1月と2月は,それぞれ,前年の13月,14月として取り扱う.
      • ツェラーの公式(合同式)自体は,wikipediaを見てください.

   1 # ----- ツェラーの公式(合同式) ---------------------------
   2 def zeller_congruence( year, month, day ):
   3     # ----- 1月と2月は,前年の13月と14月とみなします -----
   4     if month == 1 or month == 2:
   5         month += 12
   6         year  -= 1
   7     # ----- Cは西暦の上2桁(世紀), Yは西暦の下2桁 ---------
   8     C = int( year/100 )
   9     Y = int( year%100 )
  10     Gamma = int( 5 * C  + int( C / 4 ) )
  11     D = (day + int( 26 * ( month + 1 ) / 10 ) + Y + int( Y / 4 ) + Gamma + 5) % 7
  12     # ----- Dの値は.0のとき月曜,1のとき火曜, ..., 6のとき日曜を意味します -----
  13     return( int( D ) )
*


高度な話題 (授業中,もしくは授業後に順次公開します)

[ edit ]

  • 高度な話題へのリンク: 授業の流れを阻害しないように別ページにします

    • (後日の回の授業内容にはなる可能性がありますが,この回の授業内容には含めません).
    • 「リストの添え字アクセス」とλ式に関するものです.


プログラム例: 配布コード (授業中に順次公開します)

*

*

SoftEng: Python/Prog/Practice/Basic/02/BP_004a (last edited 2018-10-28 14:44:16 by TadashiIijima)