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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

1回答

3480閲覧

生年月日を入力して、今日の運勢を占うプログラムを完成させたいです Python

ss1408

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/11/08 16:42

実現したいこと

授業で行っている正年月日を入力して、今日の運勢を占うプログラムを完成させたいです。

実行結果の例

今日は2021年10月20日です。
あなたの運勢を占います。。[Y/N]->
正年月日をYYYYMMDDで入力してください->19760626
あなたの運勢は大吉です。

###ランダムに0から15数値を生成して運勢に番号を振り当てる
大吉:0
中吉:1、2
小吉:3、4、5
吉 :6、7、8、9
末吉:10、11、12
凶 :13、14
大凶:15

ランダムな数値は以下の計算を行う
今日の日付 20211020
生年月日  19760626
差し引き    450394 * 1〜9の乱数 % 16 = 0〜15の値 です。

###オプション
オプション①
あなたの運勢を占います[Y/N]・・・Y:占う/N:終了
Y又はN以外はエラーとする

オプション②
誕生年は1900以降。それ以外はエラーとする。
誕生年は1〜12。それ以外はエラーとする。
誕生日は1月なら31まで・・・各月の日数を超える場合はエラーとする。

オプション③
生年月日のうるう年判定がを行うユーザー定義関数を作成し、入力された西暦がうるう年か判定し、うるう年であれば、2月の日数を29日に変更する。
*参考:ユーザー関数の引数を西暦、戻り値を28又は29にするなど。

python

1from datetime import date 2today = date.today() 3year = today.year 4month = today.month 5day = today.day 6d = [0,31,28,31,30,31,30,31,31,30,31,30,31] 7kyo = str(year) + str(month) + str(day) 8print(f"今日は{year}{month}{day}日です") 9from random import randint 10i = randint(1,9) 11while True: 12 try: 13 unsei = (input("あなたの今日の運勢を占います[Y/N]->")) 14 if unsei == "n" or "N": 15 print("終了") 16 break 17 elif unsei == "y" or "Y": 18 print() 19 except: 20 print("エラーです") 21 while True: 22 try: 23 j = int(input("生年月日をYYYYMMDDで入力してくださいー>")) 24 if len(str(j)) != 8: 25 print("文字数が足りないです") 26 continue 27 year_z = int(str(j)[0:4]) 28 month_z = int(str(j)[4:6]) 29 day_z = int(str(j)[6:]) 30 if year_z <1900 or year < year_z: 31 print("エラー1") 32 continue 33 if month_z > 12 or month_z <= 0: 34 print("エラー2") 35 continue 36 if d[month_z] < day_z: 37 print("エラー3") 38 continue 39 except: 40 print("エラー4") 41 def check(): 42 if int(year) % 400 == 0: 43 u = 29 44 elif int(year) % 100 == 0: 45 u = 28 46 elif int(year) % 4 == 0: 47 u = 29 48 else: 49 u = 28 50 return u 51 re = check() 52 d.insert(2,re) 53 print(d) 54 k = (int(kyo)-j) * i % 16 55 if k == 0: 56 l = "大吉" 57 elif k == i or k == 2: 58 l = "中吉" 59 elif k == 3 or k == 4 or k == 5: 60 l = "小吉" 61 elif k == 6 or k == 7 or k == 8 or k == 9: 62 l = "吉" 63 elif 10 <= k <= 12: 64 l ="末吉" 65 elif k == 13 or k == 14: 66 l ="凶" 67 elif k == 15: 68 l = "大凶" 69 print(f"あなたの運勢は{l}です")

###結果
ローマ字でYを打っても終了となります。どの様にすればいいですか?
このコード自体も完成できていないので、完成まで助けて欲しいです。
初心者ですがお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2021/11/08 16:55

他の箇所では if year_z <1900 or year < year_z: と書いていますよね。unsei の判定部分もこれと同じ書き方をすれば良いのです。それと、後半の部分でインデントの深さが間違っているので、占いの結果が表示されません。
ss1408

2021/11/09 07:40

ありがとうございます。アドアイスをもとに修正していきます。
guest

回答1

0

pythonでは
14行目 if unsei == “n” or “N”:
のように1度に文字列を
比較することができません。
これを実現したいなら
if unsei == “n” or unsei ==“N”:
のようにすればいいと思います。
17行目も同様です。
また、41行目 check関数を定義していますが、
except節の中なので、エラーが起きた時に実行されることになってしまいます。
なのでエラーが起きなかった時に実行されるようにelse節の中で記述します。
完成コードがこちらです。

python

1 2from datetime import date 3today = date.today() 4year = today.year 5month = today.month 6day = today.day 7d = [0,31,28,31,30,31,30,31,31,30,31,30,31] 8kyo = str(year) + str(month) + str(day) 9print(f"今日は{year}{month}{day}日です") 10from random import randint 11i = randint(1,9) 12while True: 13 try: 14 unsei = input("あなたの今日の運勢を占います[Y/N]->") 15 if unsei == "n" or unsei == "N": 16 print("終了") 17 break 18 elif unsei == "y" or unsei == "Y": 19 print() 20 except: 21 print("エラーです") 22 while True: 23 try: 24 j = int(input("生年月日をYYYYMMDDで入力してくださいー>")) 25 if len(str(j)) != 8: 26 print("文字数が足りないです") 27 continue 28 year_z = int(str(j)[0:4]) 29 month_z = int(str(j)[4:6]) 30 day_z = int(str(j)[6:]) 31 if year_z <1900 or year < year_z: 32 print("エラー1") 33 continue 34 if month_z > 12 or month_z <= 0: 35 print("エラー2") 36 continue 37 if d[month_z] < day_z: 38 print("エラー3") 39 continue 40 except: 41 print("エラー4") 42 else: 43 def check(): 44 if int(year) % 400 == 0: 45 u = 29 46 elif int(year) % 100 == 0: 47 u = 28 48 elif int(year) % 4 == 0: 49 u = 29 50 else: 51 u = 28 52 return u 53 re = check() 54 d.insert(2,re) 55 print(d) 56 k = (int(kyo)-j) * i % 16 57 if k == 0: 58 l = "大吉" 59 elif k == i or k == 2: 60 l = "中吉" 61 elif k == 3 or k == 4 or k == 5: 62 l = "小吉" 63 elif k == 6 or k == 7 or k == 8 or k == 9: 64 l = "吉" 65 elif 10 <= k <= 12: 66 l ="末吉" 67 elif k == 13 or k == 14: 68 l ="凶" 69 elif k == 15: 70 l = "大凶" 71 print(f"あなたの運勢は{l}です") 72

投稿2021/11/12 14:22

hiro_hiro_hiro_

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問