5

I've been reading other posts and couldn't figure it out. No matter what I enter at the end of this repeat it always repeats the loop. I've tried while(repeat != "Quit" or repeat != "quit" or repeat != "b" or repeat != "B" or repeat != "no" or repeat != "No"):but it still never worked. I don't know what else to try. What's wrong with this while loop?

    repeat = "d"
    print "Please answer questions using the choices (A, B, C, etc.)"
    time.sleep(2.1738)
    while repeat != "Quit" or repeat != "quit" or repeat != "b" or repeat != "B" or repeat != "no" or repeat != "No":
        print "A) Round Edges"
        print "B) Straight Edges"
        Edges1 = raw_input("Does the shape have round edges or straight edges?: ")
        if Edges1 == "a" or Edges1 == "A" or Edges1 == "Round Edges" or Edges1 == "round edges":
            print "A) Circle"
            print "B) Semi-Circle"
            Circle = raw_input("Is it a circle or semi-circle?: ")
            if Circle == "A" or Circle == "a" or Circle == "Circle" or Circle == "circle":
                radius_C = input("What is the radius (1/2 of the Diameter)?: ")
                Area_C = math.pi * radius_C ** 2.0
                Circum_C = 2.0 * math.pi * radius_C
                Diameter_C = 2.0 * radius_C
                print "The radius is " + str(radius_C) + ". "
                time.sleep(.5)
                print "The diameter is " + str(Diameter_C) + ". "
                time.sleep(.5)
                print "The circumference is " + str(round(Circum_C, 2)) + ". "
                time.sleep(.5)
                print "The area is " + str(round(Area_C, 2)) + ". "
                time.sleep(5)
            elif Circle == "B" or Circle == "b" or Circle == "Semi-Circle" or Circle == "semi-circle":
                radius_S = input("What is the radius (1/2 of the Diameter)?: ")
                Area_S = math.pi * radius_S ** 2.0 * .5
                Diameter_S = 2 * radius_S
                Per_S = ((math.pi * 2 * radius_S) / 2) + Diameter_S
                print "The radius is " + str(radius_S) + ". "
                time.sleep(.5)
                print "The diameter is " + str(Diameter_S) + ". "
                time.sleep(.5)
                print "The perimeter is " + str(round(Per_S, 2)) + ". "
                time.sleep(.5)
                print "The area is " + str(round(Area_S, 2)) + ". "
                time.sleep(5)
            else:
                print "Incorrect input."
        elif Edges1 == "b" or Edges1 == "B" or Edges1 == "Straight Edges" or Edges1== "straight edges":
            sides = input("How many sides does the shape have?: ")
            sideL = input("What is the length of 1 side?: ")
            Area = round(Area_R(sides, sideL), 4)
            Perim = round(Perm_R(sides, sideL), 4)
            print "The area of this figure is: " + str(Area)
            print "The perimeter of the figure is: " + str(Perim)
        else:
            print "Incorrect input."


        time.sleep(4)
        print" "
        print" "
        print "A) yes"
        print "B) No"
        repeat = raw_input("Want to try another?: ")
        time.sleep(1)
main()

2 Answers2

7

Well, let's take a look at that condition:

while repeat != "Quit" or repeat != "quit"

Think about it. No matter what the value of repeat is, this is always true. repeat will always be different from "Quit" OR FROM "quit". If it's the one, it won't be the other.

You need it to be different from "Quit" AND FROM "quit". Try this:

while repeat != "Quit" and repeat != "quit" ...

Or, the more compact:

while repeat.lower() not in ["quit", "b"]
salezica
  • 74,081
  • 25
  • 105
  • 166
  • Wow such a simple fix :/ –  Oct 08 '15 at 23:35
  • 2
    Perhaps, I spotted it easier because I didn't read all of the code in the loop -- I assumed the problem would be in the first or last lines. Next time, when you can't find an issue, **find the smallest possibe piece of code that has the problem**, and attack that :) – salezica Oct 08 '15 at 23:37
0

Replace your or's with and's like this:

while repeat != "Quit" and repeat != "quit" and repeat != "b" and repeat != "B" and repeat != "no" and repeat != "No":

It's always going to not equal at least one of those things. It can't equal two things at once. Here's another shorter example (but try my suggestion above).

# Never true
repeat == "Quit" and repeat == "quit"

# Never false
repeat != "Quit" or repeat != "quit"
Caleb Mauer
  • 662
  • 6
  • 11