簡體   English   中英

為什么我的if語句沒有得到正確的答案? 我也如何找到所有輸入的平均值?

[英]why am i not getting the right answer for my if statements? also how do i find the average of all the inputs?

由於某些原因,運行此程序時,我無法獲得正確數量的快速女性和快速男性。 一個快女的數字小於-19,一個快男的數字小於15。而且,如果有人可以建議如何找到所有投入的平均值?

#Write a program that categorizes user input

#Ask for user input
userInput=input("Enter a time (negative for F, "" to quit): ")

#Initialize variables
female=0
male=0
noRunner=0
fastFemale=0
fastMale=0
count=0

#Categorize input into male, female, fast female, and fast male
while userInput!="":
    count=count+1
    if userInput=="0":
        userInput=noRunner
        noRunner=noRunner+1
    if str(userInput).startswith("-"):
        userInput=female
        female=female+1
        if float(userInput) >= 19.0 and float(userInput) < 0.0:
            userInput=fastFemale
            fastFemale=fastFemale+1
    elif float(userInput) > 0.0:
        male=count-female-noRunner
        if float(userInput) <= 15.0 and float(userInput) > 0.0:
            userInput=fastMale
            fastMale=fastMale+1
    userInput=input("Enter a time (negative for F, "" to quit): ")

#Computations
total=male+female
noShow=noRunner

#Print statements
print()
print("Try-Out Report")
print("-"*40)
print("Total number of runners:", count-noShow)
print("Number of runners who didn't show:", noShow)
print("female", female)
print("male", male)
print("Average time for male runners:")
print("Average time for female runners:")
print("Average time for all runners:")
print("Fast female runners:", fastFemale)
print("Fast male runners:", fastMale)

得到輸入后,建立一個總和,然后除以計數

當然,在初始化計數時,初始化sum = 0

由於您已經刪除了“-”號,因此無需使用Abs,因此

sum += float(userval)

avg = sum/total

請注意,您應該使用如下代碼

female += 1

而不是

female = female + 1

請注意,這里的問題是您在使用輸入變量之前先對其進行了更改,這會使所有以后的檢查均無效。 在檢查該值之前,也不要使輸入為正,以便它始終為負,因此永遠不會> 19將其更改為字符串以查找'-'是錯誤的,只需檢查<0

從已經是float或int的userInput開始

檢查負值,然后在“女性”類別中更改為abs(userval)進行實際算術運算。

if str(userInput).startswith("-"):
    userInput=female # This messes up the next if
    female=female+1
    if float(userInput) >= 19.0 and float(userInput) < 0.0:
        userInput=fastFemale
        fastFemale=fastFemale+1
...
if str(userInput).startswith("-"):
...

我對此感到驚訝。 就像在以下elif上所做的一樣,使用userInput < 0

    ...
    userInput=female
    ...

當您這樣做時,您只是失去了userInput值。

在交互式會話中播放input ,並查看其工作原理。 不需要float(userInput)

代碼真的很糟糕。 嘗試從問題的一個子集開始,例如僅從女性開始,並嘗試了解正在發生的事情,而不僅僅是嘗試隨機調整事物以獲得結果。

您可以充分利用python的迭代器和列表函數( sumlen )和-comprehensions。

像這樣:

def prompt():
    return input('Enter a time (negative for F, "" to quit): ')

data = [float(datum) for datum in iter(prompt, '')]

females = [-datum for datum in data if datum < 0.]
males = [datum for datum in data if datum > 0.]

print ('Males average: {}'.format(sum(males) / len(males)))
print ('Females average: {}'.format(sum(females) / len(females)))
print ('Fast males: {}'.format(sum(1 for male in males if male < 15.)))

這是一個交互式會話示例:

Enter a time (negative for F, "" to quit): 0
Enter a time (negative for F, "" to quit): 0
Enter a time (negative for F, "" to quit): 12
Enter a time (negative for F, "" to quit): 14
Enter a time (negative for F, "" to quit): 18
Enter a time (negative for F, "" to quit): -10
Enter a time (negative for F, "" to quit): -11
Enter a time (negative for F, "" to quit): 
Males average: 14.666666666666666
Females average: 10.5
Fast males: 2

要進一步分類,您可以執行以下操作:

fastMales = [male for male in males if male < 15.]
fastFemales = [female for female in females if female < 19.]

我提取了一個Stats類,該類僅自動跟蹤適用的值。 它使您的代碼更長一些,但更容易遵循:

import sys

if sys.hexversion < 0x3000000:
    inp = raw_input   # Python 2.x
else:
    inp = input       # Python 3.x

def average(sum, num):
    return sum / (num or 1.)    # prevent div-by-0

class Stats:
    def __init__(self, title, filter_fn, neg=False):
        self.filter_fn = filter_fn
        self.neg = neg
        self.num = 0
        self.sum = 0.

    def add(self, item):
        if self.filter_fn(item):
            self.num += 1
            self.sum += -item if self.neg else item

    @property
    def avg(self):
        return average(self.sum, self.num)

female =      Stats("Female runners",      lambda x: x < 0.       , True)
fast_female = Stats("Fast female runners", lambda x: -19. < x < 0., True)
no_show =     Stats("No shows",            lambda x: x == 0.            )
fast_male =   Stats("Fast male runners",   lambda x: 0. < x < 15.       )
male =        Stats("Male runners",        lambda x: 0. < x             )

def main():
    while True:
        s = inp("Enter run time (negative for female, blank to quit): ")
        try:
            time = float(s)
            for stat in [female, fast_female, no_show, fast_male, male]:
                stat.add(time)
        except ValueError:
            break

    print("\nTryout Report\n----------------------------------------")

    print(
        "All runners: {:d} male + {:d} female = {:d}  ({:d} no-shows)"
        .format(male.num, female.num, male.num + female.num, no_show.num)
    )
    print(
        "Average times: {:0.3f} male, {:0.3f} female, {:0.3f} overall"
        .format(male.avg, female.avg, average(male.sum + female.sum, male.num + female.num))
    )
    print(
        "Fast runners: {:d} male + {:d} female = {:d}"
        .format(fast_male.num, fast_female.num, fast_male.num + fast_female.num)
    )

if __name__=="__main__":
    main()

然后運行如下:

Enter run time (negative for female, blank to quit): -20
Enter run time (negative for female, blank to quit): -16
Enter run time (negative for female, blank to quit): -12
Enter run time (negative for female, blank to quit): 0
Enter run time (negative for female, blank to quit): 0
Enter run time (negative for female, blank to quit): 12
Enter run time (negative for female, blank to quit): 14
Enter run time (negative for female, blank to quit): 16
Enter run time (negative for female, blank to quit): 

Tryout Report
----------------------------------------
All runners: 3 male + 3 female = 6  (2 no-shows)
Average times: 14.000 male, 16.000 female, 15.000 overall
Fast runners: 2 male + 2 female = 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM