-2

これが私のプログラムです。給与明細を作成している従業員は 7 人です。num = 1 で開始し、num = 7 までループするループを実現しようとしています。ただし、プログラムを実行すると、何も出力されません。考え?

#initalize all variables
medPremiere = 400
fedRate = .20
stateRate = .05
FICA = .08
retirement = .06
**Tax rates and such**


#the processing module
num = 1
while num < 8:
    if num ==1:
        empNum = 1
        empName = 'billybob'
        hours = 40
        rate = 50
        num = num + 1

    if num ==2:
        empNum = 2
        empName = 'superman'
        hours = 55
        rate = 40
        num = num + 1

    if num ==3:
        empNum = 3
        empName = 'hulk'
        hours = 60
        rate = 60
        num = num + 1

    if num ==4:
        empNum = 4
        empName = 'scoobie'
        hours = 45
        rate = 80
        num = num + 1

    if num ==5:
        empNum = 5
        empName = 'Sherry'
        hours = 66
        rate = 30
        num = num + 1

    if num ==6:
        empNum  = 6
        empName = 'doctor'
        hours = 88
        rate = 90
        num = num + 1

    if num ==7:
        empNum = 7
        empName = 'ironman'
        hours = 77
        rate = 70
        num = num + 1

これらは、計算モジュールの給与明細を作成する必要がある 7 人の従業員です。

        #calculate gross pay
    num ==1
while num < 8:
        They get payed overtime and double overtime so I have to account for how many hours each employee has worked. Less than 41 hours they get payed regular, 41-60 hours they get paid overtime and more than 61 hours they get payed double overtime.
    if hours <41:
            gross = rate*hours
            fedTax = gross*fedRate
            stateTax = gross*stateRate
            F = gross*FICA
            K = gross*retirement
            netPay = gross - fedTax - stateTax - F - K - medPremiere
            print('Gross pay: ', gross)
            print('Federal tax @ 20%: ', fedTax)
            print('State tax @ 5%: ', stateTax)
            print('FICA @ 8%: ', F)
            print('401K @ 6%: ', K)
            print('Net pay: $', netPay)
            num = num + 1

ここでは、一番上の番号のリストに戻り、次の従業員の情報を取得しようとしています。

        if hours < 61:
            gross = (40*hours) + (hours - 40)(1.5)(rate)
            fedTax = gross*fedRate
            stateTax = gross*stateRate
            F = gross*FICA
            K = gross*retirement
            netPay = gross - fedTax - stateTax - F - K - medPremiere
            print('Gross pay: ', gross)
            print('Federal tax @ 20%: ', fedTax)
            print('State tax @ 5%: ', stateTax)
            print('FICA @ 8%: ', F)
            print('401K @ 6%: ', K)
            print('Net pay: $', netPay)

            num = num + 1


        if hours > 61:
            gross = 40*hours + (hours-40)(1.5)(rate) + (hours - 60)(2)(rate)
            fedTax = gross*fedRate
            stateTax = gross*stateRate
            F = gross*FICA
            K = gross*retirement
            netPay = gross - fedTax - stateTax - F - K - medPremiere
            print('Gross pay: ', gross)
            print('Federal tax @ 20%: ', fedTax)
            print('State tax @ 5%: ', stateTax)
            print('FICA @ 8%: ', F)
            print('401K @ 6%: ', K)
            print('Net pay: $', netPay)
            num = num + 1
            break 

calc モジュールは適切にフォーマットされていますか、それとももっと良い方法がありますか?

4

3 に答える 3

0

このコードは意図したとおりに機能しない可能性があります。最初のループを 7 回繰り返し、同じ変数を再バインドし、他には何もしません。その最後に、従業員 7 の値が得られます。次に、従業員 7 の値を毎回使用して、2 番目のループを 7 回繰り返します。(次に、インデントが正しくないため、41 時間以上の従業員に対して何もしないので、7 回何もしません。)

これはプログラムを構造化する上で非常に厄介な方法であり、再構築すると修正がはるかに簡単になります。


まず、[1, 8) 内のすべての数値をループしたい場合は、forループを使用します。

for num in range(1, 8):

これにより、実際に間違いを犯したものを含め、問題を起こす可能性のある余分なコード行が大幅に削除されます。


次に、各従業員に対して実際に何かを行う必要があります。最初のループを関数に移動して、それぞれの後に を配置することもできますがyield empNum, empName, hours, rate, num、これは必要以上に複雑になります。必要なのは、数値で呼び出すことができ、その数値に適した値を返すだけの関数です。そうすれば、ここでループはまったく必要ありません。

しかし、適切なデータ構造を使用すれば、その関数はすでに作成されています。それは単なるインデックス付けです。

たとえば、最初のループを次のように置き換えると:

employees = {}
employees[1] = dict(empNum = 1, 
                    empName = 'billybob',
                    hours = 40,
                    rate = 50)
employees[2] = dict(empNum = 2,
# etc.

…次に、2 番目のループでこれを実行できます。

for employee in employees.values():
    if employee['hours'] < 41:
        gross = employee['rate'] * employee['hours']
        fedTax = gross*fedRate
        stateTax = gross*stateRate
        F = gross*FICA
        K = gross*retirement
        netPay = gross - fedTax - stateTax - F - K - medPremiere
        print('Gross pay: ', gross)
        print('Federal tax @ 20%: ', fedTax)
        print('State tax @ 5%: ', stateTax)
        print('FICA @ 8%: ', F)
        print('401K @ 6%: ', K)
        print('Net pay: $', netPay)
    if employee['hours'] < 61:
        # ...

ただし、実際にはキーを何にも使用していないため、 a のlist代わりに a を使用する必要があることに注意してくださいdict。(そうすれば、作成した順序で常に従業員を繰り返すことが保証されます)。次に例を示します。

employees = [
    dict(empNum = 1, 
         empName = 'billybob',
         hours = 40,
         rate = 50),
    dict(empNum = 2,
         # etc.

for employee in employees.values():そして今、あなたは必要ありませんfor employee in employees:.


elif一方、 と を使用した場合、インデントの問題は発生しませんelse。このコードでは:

if employee['hours'] < 41:
    gross = employee['rate'] * employee['hours']
    # ... a bunch more code
    if employee['hours'] < 61:
        gross = employee['rate'] * employee['hours']
        # ... a bunch more code
    if employee['hours'] > 61:
        gross = employee['rate'] * employee['hours']

... すべてがコンパイルされて実行されますが、時間は 41 未満ではなく、60 を超えることもできないため、最後のブロックに到達することはできません。しかし、このコードでは:

if employee['hours'] < 41:
    gross = employee['rate'] * employee['hours']
    # ... a bunch more code
    elif employee['hours'] < 61:
        gross = employee['rate'] * employee['hours']
        # ... a bunch more code
    elif employee['hours'] > 61:
        gross = employee['rate'] * employee['hours']

と同じレベルにSyntaxErrorないため、インデントを間違えると が得られ、デバッグが容易になります。ifelif


次に、61 は 41 未満でも 61 未満でも 61 より大きいこともないので、61 時間働いても何も起こらないことに注意してください。>= 61最後のチェックに使用することで修正できます。または、もっと単純に、else代わりにelif.


次に、同じコード行を 2 回以上書くときはいつでも、それをリファクタリングする方法を探す必要があります。ほとんどすべての詳細は、3 つのケース間で同じです。最初の行だけが異なります。反復コードは読みにくいだけでなく、正しく理解するのも維持するのも難しくなります。たとえば、ある時点でバグが発生し、1 つのコピーでそれを修正し、他の 2 つのコピーでは修正しないとします。


また、Python では 2 つの数値を隣接させて乗算することはできません。*次のように、演算子を使用する必要があります。

gross = 40*hours + (hours - 40) * 1.5 * rate + (hours - 60) * 2 * rate

最後に、あなたの方程式は間違っています。誰かが 50 時間働いた場合、最初の項に を掛け忘れたため、1 時間あたり 1 ドルで 40 時間支払うことにrateなります。余分な 50%。


すべてをまとめると、最初のループを上記の辞書のリストに置き換え、次に 2 番目のループを次のように置き換えます。

for employee in employees:
    gross = rate * hours
    if hours > 40:
        gross += rate * (hours - 40) * 0.5 * rate
        if hours > 60:
            gross += rate * (hours - 60) * 0.5 * rate
    fedTax = gross*fedRate
    stateTax = gross*stateRate
    F = gross*FICA
    K = gross*retirement
    netPay = gross - fedTax - stateTax - F - K - medPremiere
    print('Gross pay: ', gross)
    print('Federal tax @ 20%: ', fedTax)
    print('State tax @ 5%: ', stateTax)
    print('FICA @ 8%: ', F)
    print('401K @ 6%: ', K)
    print('Net pay: $', netPay)

これがプログラム全体です。

于 2013-07-08T17:55:39.553 に答える
0

また、エラーを回避するのに役立つ文体のポイント (および、カウンター変数の初期化とインクリメントという汚い作業を行います) は、次のように行うことができます。

for num in range(1,8):
   ...
   print num
   ...
于 2013-07-08T17:45:10.667 に答える