0

私は、従業員の名前、賃金、労働時間を入力する小さなPython給与プロジェクトに取り組んでいます。賃金入力に小数を入力すると、例外処理のために「無効な入力」が発生します。小数が無効として返されるのはなぜですか?また、ユーザーが「完了」と入力するまで同じ3つの質問を保持するように、このプログラムをループするにはどうすればよいですか。どんな助けでも大歓迎です!ありがとう!

import cPickle

def getName():
    strName="dummy"
    lstNames=[]
    strName=raw_input("Enter employee's Name: ")
    lstNames.append(strName.title() + " \n")


def getWage():
    lstWage=[]
    strNum="0"
    blnDone=False
    while blnDone==False: #loop to stay in program until valid data is entered
        try:
            intWage=int(raw_input("Enter employee's wage: "))
            if intWage >= 6.0 and intWage <=20.0:
                lstWage.append(float(strNum)) #convert to float
                blnDone=True
            else:
                print "Wage must be between $6.00 and $20.00"
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"


def getHours():
    lstHours=[]
    blnDone=False
    while blnDone==False: #loop to stay in program until valid data is entered
        try:
            intHrs=int(raw_input("Enter number of hours worked: "))
            if intHrs >= 1.0 and intHrs <=60.0:
                blnDone=True
            else:
                print "Hours worked must be 1 through 60."
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"

def getDone():
    strDone=""
    blnDone=False
    while blnDone==False:
        try:
            srtDone=raw_input("Type \"DONE\" if you are finished entering names, otherwise press enter: ")
            if strDone.lower()=="done":
                blnDone=True
            else:
                print "Type another empolyee name"
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"


##### Mainline ########

strUserName=getName()
strWage=getWage()
strHours=getHours()
srtDone1=getDone()
4

5 に答える 5

3

その核心は次のとおりです。

>>> int("4.3")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '4.3'

整数でない場合、文字列を整数に変換することはできません。したがって、それを行うintWage=int(raw_input("Enter employee's wage: "))と、ValueError. おそらく、直接変換する必要がありますfloat

于 2012-03-28T13:31:01.767 に答える
2

入力を次のように変換しているためint:

intWage=int(raw_input("Enter employee's wage: "))
于 2012-03-28T13:30:48.580 に答える
1

使ってみて

intWage=int(float(raw_input("Enter employee's wage: ")))

これは、入力として 10 進数を受け入れます。

于 2015-08-18T16:04:53.873 に答える
1

賃金は整数であると想定していますが、定義上、小数点以下の桁数はありません。これを試して:

intWage=float(raw_input("Enter employee's wage: "))
于 2012-03-28T13:31:02.950 に答える
0

フロートによるエラー

他の人が前に言ったように、入力が浮動小数点数になると想定しています。の代わりにfloat()またはを使用します。 eval()int()

intWage = float(raw_input("Enter employee's wage: "))

またはinput()代わりに使用int(raw_input())

intWage = input("Enter employee's wage:")

どちらも同じことを達成します。ああ、少なくとも変更intWageするfloatWageか、さらに良いことに、ハンガリー語表記を使用しないでください。

コード

あなたのコードに関しては、私はいくつかのことをしました:

  • breakand/orreturnは、ブール値を追跡する代わりにループを終了するために使用されます (これがbreakandcontinueステートメントの全体的な目的です) 。
  • intWageに変更floatWage
  • 数値の比較をより簡潔に書き直しました ( のx <= y and x >= zように記述できますz >= x >= y) 。
  • returnステートメントを追加しました。Noneに割り当てたい場合を除き、なぜ自分でそれらを配置しなかったのかわかりませんstrUserNamestrWageおよびstrHours)
  • 従業員の詳細を尋ねるときに要求されたループを追加しました。
  • getDone()ループで動作するように 修正。

import cPickle

def getName():
    strName = "dummy"
    lstNames = []
    strName = raw_input("Enter employee's Name: ")
    lstNames.append(strName.title() + " \n")
    return strName

def getWage():
    lstWage = []
    strNum = "0"
    while True:                                                #Loop to stay in program until valid data is entered
        try:
            floatWage = float(raw_input("Enter employee's wage: "))
            if 6.0 <= floatWage <= 20.0:
                lstWage.append(floatWage)
                return floatWage
            else:
                print "Wage must be between $6.00 and $20.00"
        except ValueError:                                     #Catches ValueErrors from conversion to float
            print "Invalid entry"

def getHours():
    lstHours = []
    while True:                                                #loop to stay in program until valid data is entered
        try:
            intHrs=int(raw_input("Enter number of hours worked: "))
            if 1.0 <= intHrs <= 60.0:
                return intHrs
            else:
                print "Hours worked must be 1 through 60."
        except ValueError:                                     #Catches ValueErrors from conversion to int
            print "Invalid entry"

def getDone():
    strDone = ""
    while True:
        srtDone = raw_input('Type "DONE" if you are finished entering names, otherwise press enter: ')
        if strDone.strip().lower() == "done":
            return True
        else:
            print "Type another empolyee name"

while not getDone():
    strUserName = getName()
    strWage = getWage()
    strHours = getHours()

breakとの例continue

ループ内のbreakステートメント ( forand while) は、ループを終了し、すべての 'else' 句をスキップします (存在する場合)。

continueステートメントはループ内の残りのコードをスキップし、何も起こらなかったかのようにループを続行します。

コンストラクト内のelse句は、ループがすべての項目を使い果たし、正常に終了したとき、つまり、または何かfor...elseによって終了されていないときに、そのコード ブロックを実行します。break

for no in range(2, 10):
    for factor in range(2, no):
        if no % factor == 0:
            if factor == 2:
                print "%d is even" % no
                continue  
                # we want to skip the rest of the code in this for loop for now
                # as we've already done the printing
            print "%d = %d * %d" % (no, factor, n/x)
            break 
           # We've asserted that the no. isn't prime, 
           # we don't need to test the other factors
    else:
        # if 'break' wasn't called
        # i.e., if the loop fell through w/o finding any factor
        print no, 'is a prime number'
于 2012-03-28T14:24:25.117 に答える