tom knight
tom knight

Reputation: 29

Division by zero error when adding rogue value without any data

Hi having trouble trying to fix an error that occurs when I put just a '#' or rogue value in case someone doesn't want to add any data. I don't know how to fix it and I'm hoping to just end the code just like I would with data.

#Gets Data Input
def getData():
    fullList = []
    inputText = checkInput("Enter the students first name, last name, first mark, and second mark (# to exit): ")
    while inputText != "#":
        nameList = []
        nameList2 = []
        nameList = inputText.split()
        nameList2.extend((nameList[0],nameList[1]))
        nameList2.append((float(nameList[2]) + float(nameList [3]))/2)
        fullList.append(nameList2)        
        inputText = checkInput("Enter the students first name, last name, first mark, and second mark (# to exit): ")
    print("\n")
    return fullList

#Calculates Group Average
def calc1(fullList):
    total = 0
    for x in fullList:
        total = total + x[2]
    groupAverage = total/(len(fullList))
    return(groupAverage)

#Finds Highest Average
def calc2(fullList):
    HighestAverage = 0
    nameHighAverage = ""
    for x in fullList:
        if x[2] > HighestAverage:
            HighestAverage = x[2]
            nameHighAverage = x[0] + " " + x[1]        
    return (HighestAverage, nameHighAverage)

#Returns Marks above average
def results1(groupAverage,r1FullList):
    r1FullList.sort()
    print("List of students with their final mark above the group average")
    print("--------------------------------------------------------------")
    print("{:<20} {:<12}".format("Name","Mark"))
    for x in r1FullList:
        if x[2] > groupAverage:
            name = x[0] + " " + x[1]
            print("{:<20} {:<12.2f}".format(name,x[2]))

def calc3(x):
        if x[2] >= 80:
            return 'A'
        elif x[2] >= 65:
            return 'B'
        elif x[2] >= 50:
            return 'C'
        elif x[2] < 50:
            return 'D'
        else:
            return 'ERROR'


def results2(fullList):
    print("List of Studens with their Final Marks and Grades")
    print("-------------------------------------------------")
    print("{:<20} {:<12} {:<12}".format("Name","Mark","Grade"))
    for x in fullList:
        grade = calc3(x)
        name = x[0] + " " + x[1]
        print("{:<20} {:<12.2f} {:<12}".format(name,x[2],grade))

#Checks for boundary and invalid data  
def checkInput(question):
    while True:
        textInput = input(question)
        if textInput == "#":
            return textInput            
        splitList = textInput.split()
        if len(splitList) !=4:
            print("Invalid Format, Please Try Again")
            continue
        try:
            a = float(splitList[2])
            a = float(splitList[3])
            if float(splitList[2]) < 0 or float(splitList[2]) > 100:
                print("Invalid Format, Please Try Again")
                continue
            if float(splitList[3]) < 0 or float(splitList[3]) > 100:
                print("Invalid Format, Please Try Again")
                continue
           return(textInput)
        except ValueError:
            print("Invalid Input, Please Try Again")
            continue






#Main Program
#Input Data
fullList = getData()
#Process Data
groupAverage = calc1(fullList)
HighestAverage, nameHighAverage = calc2(fullList)
#Display Results
print("The group average was %.2f" % groupAverage)
print("The student with the highest mark was: %s %0.2f" %(nameHighAverage,HighestAverage))
results1(groupAverage,fullList)
print("\n")
results2(fullList)

Upvotes: 1

Views: 212

Answers (1)

xnx
xnx

Reputation: 25518

Your program works OK for me, unless you enter a # as the first entry, in which case fullList is [] and has length 0. Hence, DivisionByZero at this line: groupAverage = total/(len(fullList)).

You could modify your code to check for this and exit:

import sys
fullList = getData()
if not fullList:
    print('No Data!')
    sys.exit()

Upvotes: 1

Related Questions