Cada vez que escribo "no" para "¿Te gustaría encontrar el área de otra forma?" me vuelve a hacer la pregunta. Aquí está mi código: -

def calculate_area():
  print "Welcome to the area calculator"
  user= raw_input("Enter the shape you would like to calculate the area of:").lower()

  def restart():
    answer= raw_input( "Would you like to find the area of another shape?('yes' or 'no')")
    if answer=="yes":
      calculate_area()
  def rerun():
    restart()


  if user== "rectangle":
    def calculate_rectangle():
      rect1= int(raw_input("Enter the length of the first side:"))
      rect2= int(raw_input("Enter the length of the second side:"))
      print "The area is:",float(rect1*rect2)
    calculate_rectangle()
    rerun()

  elif user== "square":
    def calculate_square():
      square=int(raw_input("Enter the length of the side:"))
      print "The area is:",float(square**2)
    calculate_square()
    rerun()


  elif user== "triangle":
    def calculate_triangle():
      triangle=int(raw_input("Enter the length of the base:"))
      triangle2=int(raw_input("Enter the height of the triangle:"))
      print "The area is:", float((0.5*triangle)*triangle2)
    calculate_triangle()
    rerun()


  elif user== "trapezoid":
    def calculate_trap():
      trapezoid=int(raw_input("Enter the length of base 1:"))
      trapezoid2=int(raw_input("Enter the length of base 2:"))
      trapezoid3=int(raw_input("Enter the height:"))
      print "The area is:", (float(trapezoid+trapezoid2)/2*float(trapezoid3))
    calculate_trap()
    rerun()

  elif user== "circle":
    def calculate_circle():
      circle=int(raw_input("Enter the radius:"))
      print "The area is:", (float((circle**2)*3.14))
    calculate_circle()
    rerun()

  elif user== "rhombus":
    def calculate_rhombus():
      rhombus1=int(raw_input("Enter the length of diagonal 1:"))
      rhombus2=int(raw_input("Enter the length of diagonal 2:"))
      print "The area is:", (float((rhombus1*rhombus2)/2))
    calculate_rhombus()
    rerun()    

  else:
    print "Shape not recognized"
  rerun()

Este código está en "def restart" y se ejecuta dos veces cada vez que escribo "no". ¿Por qué está pasando esto?

1
Samvit Agarwal 14 ene. 2017 a las 20:19

3 respuestas

La mejor respuesta

El último rerun () debe estar dentro de la instrucción else:

  print ("Welcome to the area calculator")
  user = raw_input("Enter the shape you would like to calculate the area of:").lower()

  def restart():
    answer = raw_input( "Would you like to find the area of another shape?('yes' or 'no')")
    if answer == "yes":
      calculate_area()
  def rerun():
    restart()


  if user == "rectangle":
    def calculate_rectangle():
      rect1 = int(raw_input("Enter the length of the first side:"))
      rect2 = int(raw_input("Enter the length of the second side:"))
      print "The area is: ",float(rect1 * rect2)
    calculate_rectangle()
    rerun()

  elif user == "square":
    def calculate_square():
      square=int(raw_input("Enter the length of the side:"))
      print "The area is: ",float(square ** 2)
    calculate_square()
    rerun()


  elif user == "triangle":
    def calculate_triangle():
      triangle = int(raw_input("Enter the length of the base:"))
      triangle2 = int(raw_input("Enter the height of the triangle:"))
      print "The area is: ", float((0.5 * triangle) * triangle2)
    calculate_triangle()
    rerun()


  elif user == "trapezoid":
    def calculate_trap():
      trapezoid = int(raw_input("Enter the length of base 1:"))
      trapezoid2 = int(raw_input("Enter the length of base 2:"))
      trapezoid3 = int(raw_input("Enter the height:"))
      print "The area is: ", (float(trapezoid + trapezoid2) / 2 * float(trapezoid3))
    calculate_trap()
    rerun()

  elif user == "circle":
    def calculate_circle():
      circle = int(raw_input("Enter the radius:"))
      print "The area is: ", (float((circle ** 2)*3.14))
    calculate_circle()
    rerun()

  elif user == "rhombus":
    def calculate_rhombus():
      rhombus1 = int(raw_input("Enter the length of diagonal 1:"))
      rhombus2 = int(raw_input("Enter the length of diagonal 2:"))
      print "The area is: ", (float((rhombus1 * rhombus2) / 2))
    calculate_rhombus()
    rerun()    

  else:
    print "Shape not recognized"
    rerun()
0
kouty 14 ene. 2017 a las 19:18

Tienes un rerun() al final de tu método.

Fragmento:

  ...removed...
  else:
    print "Shape not recognized"
  rerun()
1
phss 14 ene. 2017 a las 17:24

Llamas a rerun() dos veces por cada pregunta:

if user== "rectangle":
    # ...
    rerun()

elif user== "square":
    # ...
    rerun()

# all other elif branches each have rerun()

else:
    print "Shape not recognized"
rerun()

Aquí confía en la recursividad, pero las funciones recursivas return ; cuando escribe "No", restart() regresa a rerun() que devuelve el control al punto donde fue llamado, por lo que en una de sus if ... elif ... ramas. Y después de esas ramas a las que llamas rerun() nuevamente.

No deberías estar usando la recursión en primer lugar. Use un bucle infinito en su lugar:

print "Welcome to the area calculator"

while True:
    user = raw_input("Enter the shape you would like to calculate the area of:").lower()
    # execute their choice
    if user== "rectangle":
        # ...
    # etc.

    else:
        print "Shape not recognized"

    answer = raw_input( "Would you like to find the area of another shape?('yes' or 'no')")
    if answer != "yes":
        break

El break al final finaliza el bucle while True. Si se ingresa yes, el bucle while continúa desde la parte superior, volviendo a ejecutar todo el bloque.

3
Martijn Pieters 14 ene. 2017 a las 17:24