2

心拍数トレーニングゾーンを計算するプログラムをPythonで作成しようとしています(興味のある人にはKarvonenの式を使用してください:-))。

式は男性と女性で異なりますが、どちらも年齢 (ハンノキ)、安静時心拍数 (hvilepuls)、最大心拍数 (makspuls) が必要です。

このコードは、個人が Enter キーを押すだけで最大心拍数を計算します。

年齢と休息中の心臓の空白の入力、および 3 つの変数すべてに入力されたゼロ以下の値をキャッチしたかったのです。

空白の入力をキャッチすることはできましたが、ゼロ以下の入力と組み合わせることができないようです。

私が書いたコードは以下のとおりで、機能しますが、ゼロ以下の数字の入力を止めることはできません。

コードのクリーンアップと、これを書くためのより良い(おそらくもっとpythonic?)方法についての他の一般的なコメントは大歓迎です。

# Karvonens formel
#
print(
"""
Kalkulere dine treningssoner for lett løping, anaerob terskel (AT) og VO2 Max treningsøkter.

Instruksjoner

1. Fyll inn din alder, hvilepuls og kjønn.
2. Skriv inn din maksimale hjertefrekvens, hvis du vet det, ellers trykk enter - deretter beregnet programmet det selv som følger:
(Menn 214 - (0,8 * alder) Kvinner:. 209 - (0,7 * alder).

3. Treningssonenes verdier beregnes ved hjelp av Karvonen formelen:
X% = (Maksimal hjertefrekvens hvilepuls) * x/100) + hvilepuls
"""
)

kjonn=""
alder=""
hvilepuls=""
makpuls=""


while kjonn.lower() != "m" and kjonn.lower() != "d":
    kjonn = input("Hvilken kjønn er du? (M)ann/(D)ame\t")

while alder=="":
    alder = int(input("Hvor mange år er du?\t"))

while hvilepuls=="":
    hvilepuls = int(input("Hva er din hvilepuls?\t"))

makspuls = input("Hva er din makspuls?\t")


if makspuls=="":
    if kjonn.lower()=="m":
        makspuls = int(214 - 0.8*int(alder))
    elif kjonn.lower() =="d":
        makspuls = int(209 - 0.7*int(alder))
    else:
        print("\n\nEnter M or D")
else:
    makspuls=int(makspuls)

prosent60 = (makspuls-hvilepuls)*0.6 + hvilepuls
prosent75 = (makspuls-hvilepuls)*0.75 + hvilepuls
prosent85 = (makspuls-hvilepuls)*0.85 + hvilepuls
prosent90 = (makspuls-hvilepuls)*0.9 + hvilepuls

# Remove decimals
prosent60 = int(prosent60)
prosent75 = int(prosent75)
prosent85 = int(prosent85)
prosent90 = int(prosent90)


print("\n\n")
if kjonn.lower()=="m":
    print("Din kjønn  er:\t\tMann")
else:
    print("Din kjønn  er:\t\tDame")
print("Din alder er:\t\t", alder)
print("Din hvilepuls er:\t", hvilepuls," slag/min")
print("Din makspuls er:\t", makspuls," slag/min")

print("\n\n")
print("Din lavsone er:\t",prosent60,"-",prosent75," slag/min")
print("Din ATsone er:\t",prosent85,"-",prosent90," slag/min")
print("Din VO2max er:\t",prosent90,"-",makspuls," slag/min")


input("\n\nTrykk enter for å avslutte")
4

1 に答える 1

1

これが私が提案するものです。

  • 入力はすぐに検証してクリーンアップする必要があります。.strip()通常、入力を受け取るときに、ユーザーが誤って余分なスペースやタブを入力した場合に備えて、メソッドを呼び出すことをお勧めします。'm'or値を読み取った直後に'd'、強制的に小文字にします。その後、コードの残りの部分は小文字であると想定できます。

  • 有効な複数の値に対して 1 つの値をチェックしたい場合は、Python のイディオムとしてin (value0, value1, value2, ..., valueN). この場合、 をチェックできますがin ('m', 'd')、単一の文字をチェックしているため、実際にはチェックするだけin "md"で機能します。

  • 空の文字列または整数を許可する場合は、応答を一時変数 ( s「文字列一時変数」の名前を使用) に読み込むだけで、長さ 0 の文字列を確認できます。長さがゼロでない場合は、整数に変換します。整数変数を負の値に初期化し、負でなくなるまでループすることができます。while True:しかし、私はループを使用して明示的に追加し、break発生した成功条件を示すことを好みます。(注: これが宿題である場合、教師は私に同意しないかもしれません。一部の教師はbreak、ループの内側を見るのが好きではなく、ループの上部だけをテストすることを好みます。)

  • エラーメッセージをいくつか追加しました。テキストの周りに「@@@@@」を付けて、すべてを見つけて自分の言語にローカライズできるようにしています。(これは短いプログラムなので、とにかくすべてを見つけられた可能性がありますが、できるだけ簡単にしたかったのです。)

  • int()浮動小数点数を呼び出して整数に変換する代わりに、 を使用round()して、77.9 が 77 ではなく 78 になるようにしました。

編集:コードを編集しました。入力検証を関数に分割し、「バリデーター」関数を渡しました。この方法の方がきれいだと思います。

コード:

# Karvonens formel
#
print(
"""
Kalkulere dine treningssoner for lett lping, anaerob terskel (AT) og VO2 Max treningskter.

Instruksjoner

1. Fyll inn din alder, hvilepuls og kjnn.
2. Skriv inn din maksimale hjertefrekvens, hvis du vet det, ellers trykk enter - deretter beregnet programmet det selv som flger:
(Menn 214 - (0,8 * alder) Kvinner:. 209 - (0,7 * alder).

3. Treningssonenes verdier beregnes ved hjelp av Karvonen formelen:
X% = (Maksimal hjertefrekvens hvilepuls) * x/100) + hvilepuls
"""
)

kjonn=' '
alder=0
hvilepuls=0
makpuls=' '

def check_positive(n):
    if n > 0:
        return True
    else:
        print("@@@@@ Cannot enter a negative or 0 value! @@@@@")
        return False
def check_positive_or_zero(n):
    if n >= 0:
        return True
    else:
        print("@@@@@ Cannot enter a negative value! @@@@@")
        return False

def get_input_int(s_mesg, fn_validate, default=None):
    while True:
        s = input(s_mesg).strip()
        if not s and default is not None:
            return default
        # not a default value; try it as an int
        try:
            n = int(s)
        except ValueError:
            print("@@@@@ Not even an integer! @@@@@")
            continue
        # works as an int; is it valid?
        if fn_validate(n):
            return n


while kjonn not in ('m', 'd'):
    kjonn = input("Hvilken kjnn er du? (M)ann/(D)ame\t").strip().lower()

alder = get_input_int("Hvor mange r er du?\t", check_positive)
hvilepuls = get_input_int("Hva er din hvilepuls?\t", check_positive)
makspuls = get_input_int("Hva er din makspuls?\t", check_positive_or_zero, default=0)


if not makspuls:
    if kjonn == 'm':
        makspuls = int(214 - 0.8*int(alder))
    else:
        makspuls = int(209 - 0.7*int(alder))

prosent60 = (makspuls-hvilepuls)*0.6 + hvilepuls
prosent75 = (makspuls-hvilepuls)*0.75 + hvilepuls
prosent85 = (makspuls-hvilepuls)*0.85 + hvilepuls
prosent90 = (makspuls-hvilepuls)*0.9 + hvilepuls

# Remove decimals
prosent60 = round(prosent60)
prosent75 = round(prosent75)
prosent85 = round(prosent85)
prosent90 = round(prosent90)


print("\n\n")
if kjonn == 'm':
    print("Din kjnn  er:\t\tMann")
else:
    print("Din kjnn  er:\t\tDame")

print("Din alder er:\t\t", alder)
print("Din hvilepuls er:\t", hvilepuls," slag/min")
print("Din makspuls er:\t", makspuls," slag/min")

print("\n\n")
print("Din lavsone er:\t",prosent60,"-",prosent75," slag/min")
print("Din ATsone er:\t",prosent85,"-",prosent90," slag/min")
print("Din VO2max er:\t",prosent90,"-",makspuls," slag/min")


input("\n\nTrykk enter for avslutte")
于 2012-08-03T07:07:44.770 に答える