Hey guys and gals I am really struggling with this program. I have been working on it for about a week now and every time I think I am getting somewhere it seems like it flops and I get frustrated and start over. I would appreciate it if anyone could help me out. I think I need to start with some function but not really sure. We learned about functions last week and I just don't get it. So again any help would be greatly appreciated.

Create a Python program that meets the following requirements:

• Ask the user to enter payroll information for the company. Set up a loop that continues to ask for information until they enter “DONE”. For each employee ask three questions:
name (first & last)
hours worked this week (only allow 1 through 60)
hourly wage (only allow 6.00 through 20.00)
VALIDATE the hours worked and the hourly wage, and make sure a name is entered.

• Calculate each employee’s pay, and write it out to a sequential file. Be sure to include file I/O error handling logic.
Include only the weekly pay
Weekly pay is calculated:
For (1-40 hours) it is hourly rate * hours worked
For (41-60 hours) it is (hours worked – 40) * (hourly rate * 1.5)
+ hourly rate * 40

• After all the employees are entered, read in the sequential file into a list named PAY for the weekly pay of each employee. Sort the list. Now print the lowest, highest, and average weekly pay for the week.

That is the problem I keep erasing and am frustrated at where to start

this is one version of what I have. but I can't get it to do what the instructions ask.. I have only been doing PYTHON for about 8 weeks and not very familiar with it so please explain so I can understand.

``````def Lowest(hoursList):
PAYList.sort()
lowestPay = hoursList[0]
return lowestPay

def Highest(hoursList):
hoursList.sort()
highestPay=hoursList[len(hoursList)-1]
return highestPay

def Average(hoursList):
total=0
for hour in hoursList:
total += hour
avgPay = total / len(hoursList)
return avgPay

hours=[]
hWork=1
while True:
employee=raw_input("\nPlease enter the employees' first and last name. ")
hWork=int(raw_input("How many hours did they work this week? "))
if hWork < 1 or hWork > 60:
print "Employees' can't work less than 1 hour or more than 60 hours!"
continue
else:
pRate=int(raw_input("What is their hourly rate? "))
if pRate < 6 or pRate > 20:
print "Employees' wages can't be lower than \$6.00 or greater than \$20.00!"
else:
hours.append(hWork)
empDone = ""
empDone = raw_input("Type DONE when finished with employees' information. ")
if empDone == "DONE":
try:
hoursFile=open("PAY.txt", "w")
hoursFile.writelines(hours)
hoursFile.close()
except(IOError):
print "Error writing hours! "
quit()

try:
hoursFile=open("PAY.txt", "r")
hoursFile.close()
hoursList.sort()
except(IOError):
print "Error writing names! "
quit()

modHours = hoursList
for hour in hoursList:
print hour``````

You need to change the integer back to string in order to write lines.
In line 38, change

``hoursFile.writelines(hours)``

to

``hoursFile.writelines(map(str, hours))``

After line 55, add a "break".

``````for hour in hoursList:
print hour
break``````

How do i get it so when a user types in DONE on line 34 to convert different inputs to UPPERCASE.

Change
if empDone == "DONE":
To
if empDone.upper() == "DONE":

Am I calculating the weekly pay part right. I am so sorry for all the questions

also how do i get all this to write out in sequential order

Am I calculating the weekly pay part right. I am so sorry for all the questions

I don't think you have post the part of the code on the weekly pay.

This is my updated code. Not sure if I got the weekly pay portion in the right spot.

``````def Lowest(hoursList):
PAYList.sort()
lowestPay = hoursList[0]
return lowestPay

def Highest(hoursList):
hoursList.sort()
highestPay=hoursList[len(hoursList)-1]
return highestPay

def Average(hoursList):
total=0
for hour in hoursList:
total += hour
avgPay = total / len(hoursList)
return avgPay

employees=[]
hours=[]
rate=[]
PAY=[]
hWork=1
while True:
employee=raw_input("\nPlease enter the employees' first and last name. ")
employees.append(employee)
hWork=int(raw_input("How many hours did they work this week? "))
hours.append(hWork)
if hWork < 1 or hWork > 60:
print "Employees' can't work less than 1 hour or more than 60 hours!"
continue
else:
pRate=int(raw_input("What is their hourly rate? "))
rate.append(pRate)
if pRate < 6 or pRate > 20:
print "Employees' wages can't be lower than \$6.00 or greater than \$20.00!"
if hWork <=40:
gPay=hWork*pRate
else:
gPay=(hWorked-40)*(pRate*1.5)+pRate*40

else:
hours.append(hWork\n)
empDone = ""
empDone = raw_input("Type DONE when finished with employees' information. ")
if empDone.upper() == "DONE":
try:
hoursFile=open("PAYLIST.txt", "w")
hoursFile.writelines(map(str,hours))
hoursFile.close()
except(IOError):
print "Error writing hours! "
quit()

try:
hoursFile=open("PAYLIST.txt", "r")
hoursFile.close()
hoursList.sort()
except(IOError):
print "Error writing names! "
quit()

modHours = hoursList
for hour in hoursList:
print hour
break``````

This is my update code. not sure if my weekly pay part is in the right spot, or if I even entered it in the right way.

``````def Lowest(hoursList):
PAYList.sort()
lowestPay = hoursList[0]
return lowestPay

def Highest(hoursList):
hoursList.sort()
highestPay=hoursList[len(hoursList)-1]
return highestPay

def Average(hoursList):
total=0
for hour in hoursList:
total += hour
avgPay = total / len(hoursList)
return avgPay

employees=[]
hours=[]
rate=[]
PAY=[]
hWork=1
while True:
employee=raw_input("\nPlease enter the employees' first and last name. ")
employees.append(employee)
hWork=int(raw_input("How many hours did they work this week? "))
hours.append(hWork)
if hWork < 1 or hWork > 60:
print "Employees' can't work less than 1 hour or more than 60 hours!"
continue
else:
pRate=int(raw_input("What is their hourly rate? "))
rate.append(pRate)
if pRate < 6 or pRate > 20:
print "Employees' wages can't be lower than \$6.00 or greater than \$20.00!"
if hWork <=40:
gPay=hWork*pRate
else:
gPay=(hWorked-40)*(pRate*1.5)+pRate*40

else:
hours.append(hWork\n)
empDone = ""
empDone = raw_input("Type DONE when finished with employees' information. ")
if empDone.upper() == "DONE":
try:
hoursFile=open("PAYLIST.txt", "w")
hoursFile.writelines(map(str,hours))
hoursFile.close()
except(IOError):
print "Error writing hours! "
quit()

try:
hoursFile=open("PAYLIST.txt", "r")
hoursFile.close()
hoursList.sort()
except(IOError):
print "Error writing names! "
quit()

modHours = hoursList
for hour in hoursList:
print hour
break``````

You need to move 36-39 to be in the same indentation level as the previous lines.
Also, I think you did not read the questions correctly, you should write the gPay
you computed to PAY.txt rather than the hours worked.

I am getting an error on line 41. Also what about the gPay and PAY.txt can you show me

@henryford you are getting desperate, which always makes bad code. Please take a minute to breathe, get a drink of water or caffienated, not booze :) and walk around the room. I'll wait.

OK. The right way to do this is to break off a piece and do just the piece. Get it right. Now add a piece, etc.

I suggest you start by asking for the user name until you see 'DONE', then write it to a file. Check that the file is correct. Probably you have a list of names, right?

Now, add the question about hours. Verify the hours before you put them into your data structure. If you are using a list, you have trouble: Parallel lists are so... FORTRAN... when you can use a map/dictionary: `users = {}...users[name]=hours... for k,v in users.items():...` Make sure you can write it out

Now add the wage. `users[name] = [hours,wage]...` .

Now do the rest of the work. At every step, you have something and it works (albeit not fully). This is worth a lot...

 Oh. And if you aren't using some form of source control, then you need to put that on your 'do very soon' list: Source control allows you to fiddle around without fear of losing something. Consider mercurial (hg) or svn or ... anything.