2010-11-04 3 views
0

Demander à l'utilisateur d'entrer les informations relatives à la paie de l'entreprise. Mettre en place une boucle qui continue à demander des informations jusqu'à ce qu'ils entrent "DONE". Pour chaque employé poser trois questions:Programme de calcul d'erreur Python

nom (première & dernière) heures travaillées cette semaine (seulement permettre 1 à 60) salaire horaire (seulement permettre à 6,00 par 20,00) VALIDER les heures travaillées et le salaire horaire, et assurez-vous qu'un nom est entré.

Calculez le salaire de chaque employé et écrivez-le dans un fichier séquentiel. Veillez à inclure la logique de gestion des erreurs d'E/S de fichier.

Inclure seulement le salaire hebdomadaire Le salaire hebdomadaire est calculé: Pour (1-40 heures), il est le taux horaire * heures travaillées Pour (41-60 heures), il est (heures travaillées - 40) * (taux horaire * 1.5) + taux horaire * 40

Après avoir entré tous les employés, lisez le fichier séquentiel dans une liste nommée PAY pour le salaire hebdomadaire de chaque employé. Triez la liste. Maintenant, imprimez le salaire hebdomadaire le plus bas, le plus élevé et le salaire hebdomadaire moyen.

J'ai problème évident avec ce code

while len(eName)>0: 
    eName=raw_input("\nPlease enter the employees' first and last name. ") 
    hWork=raw_input("How many hours did they work this week? ") 
    hoursWork=int(hWork) 
    if hoursWork < 1 or hoursWork > 60: 
     print "Employees' can't work less than 1 hour or more than 60 hours!" 

    else: 
     pRate=raw_input("What is their hourly rate? ") 
     payRate=int(pRate) 
     if payRate < 6 or payRate > 20: 
       print "Employees' wages can't be lower than $6.00 or greater than $20.00!" 
     if hoursWork <=40: 
       grossPay=hoursWork*payRate 
     else: 
       grossPay=((hoursWork-40)*(payRate*1.5))+(40*payRate) 
     lsthours.append(grossPay) 
    print grossPay 
    print lsthours 



    ePass=raw_input("Type DONE when finished with employees' information. ") 
    ePass.upper() == "DONE" 
    if ePass == "DONE": 
      break 
    else: 
      continue 
+0

L'indentation de ceci semble totalement faux. Cela peut être un problème de cut'n'paste - si c'est le cas, vous devez éditer afin qu'il ressemble à la façon dont vous l'avez vraiment écrit. Sinon, Python ne fera pas ce que vous pensez qu'il va, –

+1

Je suppose que vous devez d'abord corriger l'indentation. L'indentation actuelle suggère que "ePass = raw_input .." est out of while. – pyfunc

+0

Est-ce que ce sont les devoirs? Ce type d'interface utilisateur était courant en 1980, mais n'est pas acceptable aujourd'hui pour une application déployée. –

Répondre

1

essayez ceci:

lsthours = list() 
eName = "start" # initialize to something to start the loop 
while eName: 
    eName = raw_input("\nPlease enter the employees' first and last name. ") 
    if not eName: 
     break #loop will exit also when blank name is inserted 
    hWork = raw_input("How many hours did they work this week? ") 
    hoursWork = int(hWork) 
    if hoursWork < 1 or hoursWork > 60: 
     print "Employees' can't work less than 1 hour or more than 60 hours!" 
     continue #skip 

    pRate = raw_input("What is their hourly rate? ") 
    payRate = int(pRate) 
    if payRate < 6 or payRate > 20: 
     print "Employees' wages can't be lower than $6.00 or greater than $20.00!" 
     continue #skip 
    if hoursWork <= 40: 
     grossPay = hoursWork * payRate 
    else: 
     grossPay = ((hoursWork - 40) * (payRate * 1.5)) + (40 * payRate) 
    lsthours.append(grossPay) 
    print grossPay 
    print lsthours 
    ePass = raw_input("Type DONE when finished with employees' information. ") 
    if ePass.upper() == "DONE": 
     break 

Il manque encore de vérifier exception, mais devrait fonctionner. Les contrôles "erreur de données" doivent juste court-circuiter la boucle principale, c'est plus simple, mais vous pouvez avoir un code plus impliqué et les mettre dans leur propre boucle.

+0

Merci qui m'a aidé une tonne tellement l'apprécier – HENRY

+0

si je veux continuer à partir d'ici et faire ma lecture et l'écriture d'un fichier qui va l'interrompre ou continuera-t-il à cette partie de mon code – HENRY

+0

comment puis-je ajouter ceci à lui: Après que tous les employés sont entrés, lisez dans le dossier séquentiel dans une liste appelée PAY pour le salaire hebdomadaire de chaque employé. Triez la liste. Maintenant, imprimez le salaire hebdomadaire le plus bas, le plus élevé et le salaire hebdomadaire moyen. – HENRY

1

Yu peut faire quelque chose comme ceci:

grossPay = 0.0 
lsthours = [] 

eName=raw_input("\nPlease enter the employees' first and last name (type 'PASS' to exit): ") 

while eName.upper() != "PASS":  
    hWork=raw_input("How many hours did they work this week? ") 
    hoursWork=int(hWork) 

    if hoursWork < 1 or hoursWork > 60: 
     print "Employees' can't work less than 1 hour or more than 60 hours!" 
    else: 
     pRate=raw_input("What is their hourly rate? ") 
     payRate=int(pRate) 

     if payRate < 6 or payRate > 20: 
     print "Employees' wages can't be lower than $6.00 or greater than $20.00!" 

     if hoursWork <=40: 
     grossPay=hoursWork*payRate 
     else: 
     grossPay=((hoursWork-40)*(payRate*1.5))+(40*payRate) 

     lsthours.append(grossPay) 

     print grossPay 
     print lsthours 

    eName=raw_input("\nPlease enter the employees' first and last name. (type 'PASS' to exit): ") 
+0

Je dois avoir 3 boucles à l'intérieur sur un grand. La boucle de nom, la boucle d'heure, et la boucle de salaire, tous ceux-ci doivent aller à l'intérieur d'une autre boucle qui demande quand vous tapez fait vous sortez de la boucle et passez à l'étape suivante. – HENRY

+0

Cela n'a pas beaucoup de sens, et ce n'est pas la même chose que le code que vous avez affiché. Peut-être que vous devriez éditer votre question pour nous dire plus précisément quelle est la tâche? – philosodad

+0

J'ai mis à jour le code pour refléter votre programme. N'hésitez pas à modifier le code de votre logique. – pyCoder

2

Il y a plusieurs problèmes avec ce code:

  • L'indentation est tout sur le lieu. Par exemple, la boucle while se termine à la première instruction if
  • Le test de la boucle while est presque certainement fausse (puisque Ename n'initialisés), de sorte que la boucle ne pénètre jamais
  • le code à ePass.upper () == "DONE" essaie de définir la variable ePass, ce qui signifie que le test ne fonctionnera pas. Vous avez besoin:

    si ePass.upper() == "DONE": break

1

Quelques erreurs comme cela a été souligné:

En python, indentation décide les blocs de code

boucle while:

while logic_test: 
    # this is inside while loop 
    .... 
# this is outside while loop 

Certaines fonctions sur la chaîne ne remplace pas la chaîne en place, ils retournent une autre chaîne par valeur de retour

supérieure:

>>> a = "done" 
>>> a.upper() 
'DONE' 
>>> a 
'done' 
>>> 

initialize toujours vos variables.

Si vous utilisez des méthodes de séquence, la variable doit avoir été définie comme une séquence antérieure.

>>> t.append('ll') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 't' is not defined 
>>> t = [] 
>>> t.append('ll') 
>>> 

Faites votre portée explicite

lsthours = [] 
while len(eName)>0: 
    ........ 
    lsthours.append(grossPay)