質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

pythonで閏年でない場合の結果が表示されない

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 368

Cherry1217

score 21

現在、pythonで簡易的な閏年判定プログラムを作成しています。
以下プログラムで、結果が閏年の場合は、print文が実行されるのですが、
閏年ではない場合にprint文が実行されません。
表示されないのは、何か条件が足りていないからでしょうか?
ご教授のほどよろしくお願いします。

#閏年かどうかを判定する
def leap_year_judgment(target_year):
    if target_year % 400 == 0:
        print(target_year,"は閏年です")
    elif target_year % 4 == 0:
        print(target_year,"は閏年です")
    elif target_year % 100 == 0 and target_year % 400 == 0:
        print(target_year,"は閏年ではありません")

leap_year_judgment(2000)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

たとえば、2001年の場合を考えてみましょう

1
target_year % 400 == 0
この条件にはあてはまりません

2
target_year % 4 == 0
この条件にもあてはまりません

3
target_year % 100 == 0 and target_year % 400 == 0
この条件は、まず前半だけ考えましょう

target_year % 100 == 0
この条件にあてはまりません

ということは、and なので、後半の条件を考えるまでもなく、あてはまりません

1, 2, 3 より、すべての条件にあてはまらないので
なにも出力されません

閏年の判定のしかた

閏年の条件が示されていないので、
ここでの解説は次の Wikipedia の定義に従います

西暦年が4で割り切れる年は(原則として)閏年。
ただし、西暦年が100で割り切れる年は(原則として)平年。
ただし、西暦年が400で割り切れる年は必ず閏年。

この「ただし」を if として実装します
そして、条件に示されていない else を忘れないようにします

def leap_year_judgment(target_year):
    """
    閏年かどうかを判定する
        西暦年が4で割り切れる年は(原則として)閏年。
        ただし、西暦年が100で割り切れる年は(原則として)平年。
        ただし、西暦年が400で割り切れる年は必ず閏年。
    https://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4
    """
    if target_year % 400 == 0:
        print(target_year,"は閏年です")
    elif target_year % 100 == 0:
        print(target_year,"は閏年ではありません")
    elif target_year % 4 == 0:
        print(target_year,"は閏年です")
    else:
        print(target_year,"は閏年ではありません")


leap_year_judgment(2000)
leap_year_judgment(2001)
leap_year_judgment(2004)
leap_year_judgment(2100)

実行結果:

$ python test.py
2000 は閏年です
2001 は閏年ではありません
2004 は閏年です
2100 は閏年ではありません

また、論理演算はベン図を書くと理解が深まるかもしれません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

閏年の条件を知っていますか?
・4で割れれば閏年
・しかし100で割れれば閏年で無い
・でも400で割れればやっぱり閏年
・4で割れない場合は閏年じゃ無い
の4パターンです。3パターンではありません。

あと、条件判断の順番もおかしいです。どの条件から先にチェックすべきかよく考えましょう。

あるいは、4条件を並列じゃなくて、上記の通りにコーディングするのも手です。

    if target_year % 4 == 0:
        if arget_year % 100 == 0:
            if arget_year % 400 == 0:
                print(target_year,"は閏年です")
            else:
                print(target_year,"は閏年ではありません")
        else:
            print(target_year,"は閏年です")
    else:
        print(target_year,"は閏年ではありません")

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

elif target_year % 100 == 0:
        print(target_year,"は閏年ではありません")


上記の部分のprintが作用するための条件を見ると、

elif target_year % 100 == 0 and target_year % 400 == 0:


となっています。
これは、100で割り切れて、さらに400でも割り切れると言うことです。
このような条件の数字が引数に代入されたとしても、それ以前の

if target_year % 400 == 0:


elif target_year % 4 == 0:


で、動作してしまうので、閏年ではない判定の出力が出ないのだと思います。

おそらく100でも400でも割り切れないと言う条件を実装しようとしてらっしゃるのだと推測しますので、「イコールでない」を表す!=を用いて

elif target_year % 100 != 0 and target_year % 400 != 0:
  print(target_year,"は閏年ではありません")


と実装されるか、もしくは単に、それまでのいずれの条件にも一致しないものと言う条件のelseを用いて、

else:
  print(target_year,"は閏年ではありません")


と実装されるといいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

閏年になる条件をまとめると、

  • 400で割り切れる
  • 4で割り切れ、かつ100で割り切れない
    いずれかになります。

これを条件式として書けば、以下のようになります。

def leap_year_judgment(target_year):
    if target_year % 400 == 0 or (target_year % 4 == 0 and target_year % 100 != 0):
        print(target_year, "は閏年です")
    else:
        print(target_year, "は閏年ではありません")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

if 条件1:
   処理1
elif 条件2:
   処理2

処理X

この場合. まず 条件1をチェックして成立すれば処理1 をおこなってから処理X をおこないます。
条件1 が成立しないかったら、条件2をチェックします。
成立したら、処理2 をおこなってから処理X を行います。
成立しなければ、処理X だけを行います。

if .. elsf ... の場合、チェックする条件の順番は重量です。
また最後に else を書くか書かないかも重要です。

この点に注意して質問文のコードを見直す、多の回答のコードを研究すると良いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る