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

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

ただいまの
回答率

90.49%

  • Python

    8523questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6848questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

うるう年を20個表示させる方法

解決済

回答 5

投稿 編集

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

amagrammer

score 7

「YEAR」の部分にある数字を入れると、その翌年以降の閏年を20個表示するプログラムを作りたいです。
条件をif文で示すことはできているかと思うのですが、20個表示させてそこで止める方法、そしていろんな数字を入れてあっているか確認する方法がうまくいきません。

def leapyear(YEAR):
    n = 0
    while True:                
        if YEAR % 400 == 0:
            n = n + 1
        if YEAR % 4 == 0 and YEAR % 100 == 0:
            pass
        elif YEAR % 4 == 0:
            n = n + 1
            print(YEAR = YEAR + 1)
            if n == 20:
                break
print (leapyear(2020))

結果は下記のように出ておりました。
Traceback (most recent call last):
line 13, in <module>
print (leapyear(2020))
line 10, in leapyear
print(YEAR = YEAR + 1)
TypeError: 'YEAR' is an invalid keyword argument for this function

Process finished with exit code 1

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/09/06 19:00

    質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

  • 退会済みユーザー

    2017/09/06 19:02

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • amagrammer

    2017/09/06 23:30

    コードの入れ方も知らずに質問してしまい、大変失礼いたしました。

    キャンセル

回答 5

checkベストアンサー

+3

全体的におかしいですね。
while で回すなら、n を条件にすると良いです。

また、year を 1 づつ足そうとしていますが、4 で割れるまで足したら、あとは 4 づつ足すと効率的です。
それと、上記を使えば、うるう年の条件は
year % 100 != 0 or year % 400 == 0
で満たされます。

宿題、がんばってw

追記
幾つか回答がついていて、ちょうどよいので追記します。
まず、私の回答のサンプルコードですが、以下となります。

def leapyear(year):
    print('start:',year)
    n = 1
    while year % 4 != 0 :
        year += 1
    while n <= 20 :
        if year % 100 != 0 or year % 400 == 0:
            print(n,year)
            n += 1
        year += 4
leapyear(1990)


最初のwhileで4で割り切れるまでyearを増やし、2番目のwhileで20個表示します。
Python は始めて2ヶ月なので、ちょっと書き方が Python っぽくないかもしれませんw

で、追記の本題ですが、うるう年ってコンピュータで扱える条件が独立して 2 つあるんです。

1,4で割り切れればうるう年、だけど100で割り切れるときは飛ばす。ただし400で割り切れれば、うるう年!
2,2月29日がある。

私のアプローチは 1 で、YouheiSakurai さんのが 2 ですね。
これは、作り出される結果に対しての考え方の違いでもあります。

1,法則に従って、うるう年を作り出す
2,順次、年を検証して、条件合致したものを抽出する

こうしてみると、結構違っている事が分かり、面白いと思います。

ちなみに、LouiS0616 さんの回答は「関数には 1 つのことしかやらせない!」、YouheiSakurai さんの隠れコンセプトは「yield 使ってみたかった^^」だと思われます。

プログラムって入力と出力を紐付けるものですが、人によって色々書けるので、メッセージを読み取ると興味を持って読み取ることができ、学習がすすむと思います。

がんばってくださいね^^

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/06 23:41

    4ずつたしていくというのは美しいですね。その方が、条件を一つ減らせますし、画期的ですね。今回は4で割れるまで足したらという条件発動がうまく使えず、一つずつ足していくというスタイルを選びました。美しいコードがかける日まで、宿題頑張ります。ありがとうございました。

    キャンセル

  • 2017/09/07 09:45

    サンプルコード、記述してみました。
    もうちょっとプログラムに興味を持ってもらいたかったので、今回の皆さんの回答に関しても少し追記しました。
    プログラム、楽しんでください^^

    キャンセル

  • 2017/09/07 10:03

    ご丁寧にありがとうございます。昨日プログラムが動作した時のアハ体験もすごかったですが、解き終わった後も同じ課題でもいろんなことが学べますね。いまは考えに困って鼻血が出そうな時間がつらいですが、楽しめる領域にいけるように勉強します。ある程度結果が予測できるものは「作り出す」でいけるということですね。システムの不可もなるべく作り出す方法のほうが負荷が少ないということだと理解します。そこら辺も含めて研究してみます。

    キャンセル

+2

インデントが崩れているためコードは読めませんが、次の点は文法上アウトです。

print(YEAR = YEAR + 1)

代入を出力することはできません。

また、次の点は確実に想定通りに動作しないでしょう。

print (leapyear(2020))

返り値のない関数を出力しようとしています。


ああ、宿題の提出が近いんだな、と思いました。
最低限の文法はしっかり勉強しましょう。また、正しい質問が出来るようにしましょう。

  • コードブロックを用いていない
  • エラーの内容が書かれていない
  • 仕様が曖昧、実行例がない

動作するプログラムが完成したようなので追記。こんな風に書くかなぁ。
is_leap_yearのネストを浅くするために、比較回数を犠牲にしています。

def is_multiple(div, base):
    return div % base == 0

def is_leap_year(year):
    if is_multiple(year, 400):
        return True
    if is_multiple(year, 100):
        return False
    if is_multiple(year, 4):
        return True
    return False

def main():
    year = int(input('>> '))
    while year % 4 != 0:
        year += 1

    num_of_leap_year = 0
    while num_of_leap_year < 20:
        if is_leap_year(year):
           print(year)
           num_of_leap_year += 1
        year += 4

if __name__ == '__main__':
    main()

テストはろくにしてないので、変な部分があるかもしれません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/06 23:39

    文法上でダメな部分を指摘していただけるだけでも初学者としては大変ありがたいです。質問の作法も丁寧に教えていただいてありがとうございました。まさに、その通りで、宿題に追われて無我夢中でした。ありがとうございました。

    キャンセル

  • 2017/09/07 10:08

    関数をわけて記述いただいているうえに、普通は略すところを単語で説明風にして記述されているので、読解しやすいです。Pseudocodeに近い感覚で読むことができました。ありがとうございます。ネストループを深くしすぎると頭も混乱してくるので、ある程度長くなったら切り分けもできるように考えてみます。

    キャンセル

+2

面白そうなので課題をやってみた。

from datetime import date

def iter_leap_years(YEAR):
    while True:
        try:
            date(YEAR, 2, 29)
            yield YEAR
        except ValueError:
            pass
        YEAR += 1

for i, year in enumerate(iter_leap_years(2020)):
    print(year)
    if i == 19:
        break

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/06 23:50

    インポートしてやるとこういうスタイルでできるのですね。これが理解できるようになるまでもうしばらく時間がかかりそうですが、勉強してから振り返ってみたいと思います。ありがとうございました。

    キャンセル

+1

みなさま、迅速なご助言ありがとうございました。
試行錯誤してみて、+1する場所を前方に持ってきて、print の指示に計算式が入ることを避けました。
コードブロックを用いてということでしたので、以下、使ってみます。
コードの書き方だけでなく、質問のしかたなど、流儀もきっちり学んでいきたいと思います。
この度はお騒がせしまして失礼いたしました。

year1 = int(input(">> "))+1
YEAR=year1-1
n = 0

while True:
    if year1 % 400 == 0:
        print(year1)
        n = n + 1
    if year1 % 4 == 0 and year1 % 100 == 0:
        pass
    elif year1 % 4 == 0:
        print(year1)
        n = n + 1
    if n == 20:
        break
    year1 = year1 + 1

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

def leapyear(year):
    for i in range(4):
        if year%4!=0:
            year+=1
        else:
            break
    rslt=list()
    while len(rslt)<20:
        if year%4==0 and not (year%100==0 and year%400!=0):
            rslt.append(year)
        year+=4
    return rslt

def print_leapyear():
    year=int(input("start year??>>"))
    for i in leapyear(year):
        print(i)

print_leapyear()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

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

  • Python

    8523questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6848questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。