2017-11-28 3 views
-3

各アソシエートの平均給料を計算するのに役立つ必要があります。
ここに私が現在持っているコードがあります。クラス内の既存のオブジェクトの平均を調べようとしています

class Associate: 
    ID = 0; 
    avgPay = 0.0 

    def __init__(self, ID, name, pay): 
     self.ID = ID 
     self.name = name 
     self.pay = pay 
     Associate.ID += 1 
     Associate.avgPay = (pay + Associate.avgPay)/Associate.ID 

    def speak(self): 
     print('Name: ', self.name,'Pay: ', self.pay) 

a1 = Associate('A111','Emily',85000) 
a1.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 
a2 = Associate('A222','Bob',88000) 
a2.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 
a3 = Associate('A333','John',92000) 
a3.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 
a4 = Associate('A444','Tom',77000) 
a4.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 

私の問題は、それがAssociate.avgPayを呼び出すたびに、それは代わりにself.payを追加する前の呼び出しからの平均を追加するということです。
電流出力:

Name: Emily Pay: 85000 
ID = 1, avgPay = 85000.0 
Name: Bob Pay: 88000 
ID = 2, avgPay = 86500.0 
Name: John Pay: 92000 
ID = 3, avgPay = 59500.0 
Name: Tom Pay: 77000 
ID = 4, avgPay = 34125.0 

正しい出力:

Name: Emily Pay: 85000 
ID = 1, avgPay = 85000.0 
Name: Bob Pay: 88000 
ID = 2, avgPay = 86500.0 
Name: John Pay: 92000 
ID = 3, avgPay = 88333.33333 
Name: Tom Pay: 77000 
ID = 4, avgPay = 85500.0 

任意の助けをいただければ幸いです。

+2

平均はそのようには機能しません。すべての支払いのリストが必要 –

答えて

0

でなければなりません。

あなたは、その後、既に分割値に新しい値を追加し、再び分割ではなく、分割、一度にすべての値を合計する必要があります...

また、あなたがコードを繰り返しているという事実は、そのあなたの意味とにかくリストを使うことを本当に考えなければならない。またcricket_007 @として、任意のクラスが

属性ここでは、そのような例は

associates = [] 
associates.append(Associate('A111','Emily',85000)) 
associates.append(Associate('A222','Bob',88000)) 
associates.append(Associate('A333','John',92000)) 
associates.append(Associate('A444','Tom',77000)) 

pays = [a.pay for a in associates] 
avg = sum(pays)/len(pays) 
for id, a in enumerate(associates): 
    a.speak() 
    print("ID = {0}, avgPay = {1}".format(id, avg)) 
0

平均計算が間違っているようです。 それはあなたが二つ以上のオブジェクトのために紙の上にしようとした平均アルゴリズムを書いた場合、あなたはあなたが実際に平均を計算していないことを確認したい、

Associate.avgPay = (pay + Associate.avgPay * (Associate.ID-1))/Associate.ID 
+0

前の部門をキャンセルするために倍増していますか? –

+0

おおよそ、はい。数値演算子は、過去の支払いの合計である必要があります。 – dkato

+0

あなたはまた、前の給料を控除してから乗算する必要があるので、間違っているようです。 –

0

を必要としない平均値はその方法ではありません仕事をする、と述べました。あなたは何ができることは、リスト内のすべての支払いを追跡し、平均値を計算するためにそれを使用です:

class Associate: 
    ID = 0; 
    payList = [] 

    def __init__(self, ID, name, pay): 
     self.ID = ID 
     self.name = name 
     self.pay = pay 
     Associate.ID += 1 
     Associate.payList.append(pay) 
     Associate.avgPay = sum(Associate.payList)/len(Associate.payList) 
0

あなたが維持しない場合は、追加のクラス属性として集計賃金の累計を保つことができますリスト:

a1 = Associate('A111','Emily',85000) 
a1.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 
a2 = Associate('A222','Bob',88000) 
a2.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 
a3 = Associate('A333','John',92000) 
a3.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 
a4 = Associate('A444','Tom',77000) 
a4.speak() 
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay)) 

プリント:

をあなたが意図したとおり

class Associate: 
    ID = 0; 
    avgPay = 0.0 
    totalPay = 0.0 

    def __init__(self, ID, name, pay): 
     self.ID = ID 
     self.name = name 
     self.pay = pay 
     Associate.totalPay+=pay 
     Associate.ID += 1 
     Associate.avgPay = Associate.totalPay/Associate.ID 

    def speak(self): 
     print('Name: ', self.name,'Pay: ', self.pay) 

その後、オブジェクトのあなたのシリーズが働きます

Name: Emily Pay: 85000 
ID = 1, avgPay = 85000.0 
Name: Bob Pay: 88000 
ID = 2, avgPay = 86500.0 
Name: John Pay: 92000 
ID = 3, avgPay = 88333.33333333333 
Name: Tom Pay: 77000 
ID = 4, avgPay = 85500.0 
関連する問題