Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I have already completed all the functions and I am not sure about the calc func

ID: 3852810 • Letter: I

Question

I have already completed all the functions and I am not sure about the calc function. findNextOpr() returns the position of the next operator in the input string, isNumber() checks if the substring is a number, getNextNumber() returns the number, operator and operator position. I am having troubles to get calc() function to work. Somehow I need to update the getnextnumber() inside the while loop so that it produces the correct answer for a string eg.'1+2-3'

import pdb
def findNextOpr(s):
#s must be a nonempty string.
if len(s)<=0 or not isinstance(s,str):
print("type mimatch error: findNextOpr")
return "type mimatch error: findNextOpr"
oprposition=-1
oprindex=-1
operations="+ - * /"
myopr= operations.split()
#mys= s.split(' ')
#pdb.set_trace()
for opr in s:
if opr in myopr :
oprindex= s.index(opr)
if oprindex> oprposition :
oprposition= oprindex
break
return oprposition

def isNumber(s):
s.strip()
if len(s)==0 or not isinstance(s, str):
print("type mismatch error: isNumber")
return "type mismatch error: isNumber"
try:
float(s)
return True
except ValueError :
return False

def getNextNumber(expr, pos):

#expr is a given arithmetic formula in string
#pos = start position in expr
#1st returned value = the next number (None if N/A)
#2nd returned value = the next operator (None if N/A)
#3rd retruned value = the next operator position (None if N/A)
if len(expr)==0 or not isinstance(expr, str) or pos<0 or pos>=len(expr) or not isinstance(pos, int):
print("type mismatch error: getNextNumber")
return None, None, "type mismatch error: getNextNumber"
#--- function code starts ---#
op=findNextOpr(expr[pos:])
oprPos= op+ pos
a=expr[pos:oprPos].strip()
if isNumber(a) :
newNumber= float(a)

newOpr= expr[pos+op]
return newNumber,newOpr,oprPos

def exeOpr(num1, opr, num2):
#This is a simple utility function skipping type check
if opr=="+":
return num1+num2
elif opr=="-":
return num1-num2
elif opr=="*":
return num1*num2
elif opr=="/":

return num1/num2
else:
return None


def calc(expr):
#expr: nonempty string that is an arithmetic expression
#the fuction returns the calculated result
if not isinstance(expr,str) or len(expr)<=0:
print("argument error: line A in eval_expr") #Line A
return "argument error: line A in eval_expr"
#Hold two modes: "addition" and "multiplication"
#Initializtion: get the first number
newNumber, newOpr, oprPos = getNextNumber(expr, 0)
if newNumber is None:
print("input formula error: line B in eval_expr") #Line B
return "input formula error: line B in eval_expr"
elif newOpr is None:
return newNumber
elif newOpr=="+" or newOpr=="-":
mode="add"
addResult=newNumber #value so far in the addition mode
mulResult=None #value so far in the mulplication mode
elif newOpr=="*" or newOpr=="/":
mode="mul"
addResult=0
lastOpr='+'
mulResult=newNumber
pos=oprPos+1 #the new current position
opr=newOpr

#the new current operator
#start the calculation. Use the above functions effectively.
#pdb.set_trace()
while True:
newNumber, newOpr, oprPos=getNextNumber(expr, pos)
print(expr[pos:])
#if expr[pos:] == " 3- 2*1":
# pdb.set_trace()
if newNumber== None and pos>=len(expr):
return "Expression error"
elif newOpr== None and mode=='add':
return exeOpr(addResult, opr, newNumber)
elif newOpr== None and mode=='mul':
return exeOpr(mulResult, opr, newNumber)
elif (newOpr== "+" or newOpr=='-') and mode=='add' :
addResult= exeOpr(addResult,opr,newNumber)
pos= oprPos+1
opr=newOpr
elif (newOpr=="*" or newOpr=='/') and mode=='add':
addResult= newNumber
LastOpr= opr
mulResult= exeOpr(addResult,newOpr, newNumber)
mode='mul'
pos= oprPos+1
opr=newOpr
elif (newOpr=="*" or newOpr=="/") and mode=="mul":
mulResult= exeOpr(mulResult, opr, newNumber)
pos= oprPos+1
opr=newOpr
elif (newOpr=="-" or newOpr=='+') and mode=="mul":
mulResult=exeOpr(mulresult,opr, newNumber)
addResult= exeOpr(mulResult, lastOpr, newNumber)
mode="add"
pos= oprPos+1
opr=newOpr

print(calc("1+2+3"))

Explanation / Answer

Please refer to getNextNumber(expr,pos) for my changes.

import pdb
def findNextOpr(s):
#s must be a nonempty string.
if len(s)<=0 or not isinstance(s,str):
print("type mimatch error: findNextOpr")
return "type mimatch error: findNextOpr"
oprposition=-1
oprindex=-1
operations="+ - * /"
myopr= operations.split()
#mys= s.split(' ')
#pdb.set_trace()
for opr in s:
if opr in myopr :
oprindex= s.index(opr)
if oprindex> oprposition :
oprposition= oprindex
break
return oprposition

def isNumber(s):
s.strip()
if len(s)==0 or not isinstance(s, str):
print("type mismatch error: isNumber")
return "type mismatch error: isNumber"
try:
float(s)
return True
except ValueError :
return False

def getNextNumber(expr, pos):
#expr is a given arithmetic formula in string
#pos = start position in expr
#1st returned value = the next number (None if N/A)
#2nd returned value = the next operator (None if N/A)
#3rd retruned value = the next operator position (None if N/A)
if len(expr)==0 or not isinstance(expr, str) or pos<0 or pos>=len(expr) or not isinstance(pos, int):
print("type mismatch error: getNextNumber")
return None, None, "type mismatch error: getNextNumber"
#--- function code starts ---#
op=findNextOpr(expr[pos:])
if op==-1:
newNumber=float(expr[len(expr)-1])
newOpr=None
oprPos=None
else:
oprPos= op+ pos
a=expr[pos:oprPos].strip()
if isNumber(a) :
newNumber= float(a)
newOpr= expr[pos+op]
return newNumber,newOpr,oprPos

def exeOpr(num1, opr, num2):
#This is a simple utility function skipping type check
if opr=="+":
return num1+num2
elif opr=="-":
return num1-num2
elif opr=="*":
return num1*num2
elif opr=="/":
return num1/num2
else:
return None


def calc(expr):
#expr: nonempty string that is an arithmetic expression
#the fuction returns the calculated result
if not isinstance(expr,str) or len(expr)<=0:
print("argument error: line A in eval_expr") #Line A
return "argument error: line A in eval_expr"
#Hold two modes: "addition" and "multiplication"
#Initializtion: get the first number
newNumber, newOpr, oprPos = getNextNumber(expr, 0)
if newNumber is None:
print("input formula error: line B in eval_expr") #Line B
return "input formula error: line B in eval_expr"
elif newOpr is None:
return newNumber
elif newOpr=="+" or newOpr=="-":
mode="add"
addResult=newNumber #value so far in the addition mode
mulResult=None #value so far in the mulplication mode
elif newOpr=="*" or newOpr=="/":
mode="mul"
addResult=0
lastOpr='+'
mulResult=newNumber
pos=oprPos+1 #the new current position
opr=newOpr
#the new current operator
#start the calculation. Use the above functions effectively.
#pdb.set_trace()
while True:
newNumber, newOpr, oprPos=getNextNumber(expr, pos)
#if expr[pos:] == " 3- 2*1":
# pdb.set_trace()
if newNumber== None and pos>=len(expr):
return "Expression error"
elif newOpr== None and mode=='add':
return exeOpr(addResult, opr, newNumber)
elif newOpr== None and mode=='mul':
return exeOpr(mulResult, opr, newNumber)
elif (newOpr== "+" or newOpr=='-') and mode=='add' :
addResult= exeOpr(addResult,opr,newNumber)
pos= oprPos+1
opr=newOpr
elif (newOpr=="*" or newOpr=='/') and mode=='add':
addResult= newNumber
LastOpr= opr
mulResult= exeOpr(addResult,newOpr, newNumber)
mode='mul'
pos= oprPos+1
opr=newOpr
elif (newOpr=="*" or newOpr=="/") and mode=="mul":
mulResult= exeOpr(mulResult, opr, newNumber)
pos= oprPos+1
opr=newOpr
elif (newOpr=="-" or newOpr=='+') and mode=="mul":
mulResult=exeOpr(mulresult,opr, newNumber)
addResult= exeOpr(mulResult, lastOpr, newNumber)
mode="add"
pos= oprPos+1
opr=newOpr

print(calc("1+2-3"))

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote