fifiman
fifiman

Reputation: 264

easy python code

In programming, I'm writing a code that the user chooses a solid, and then it calculates the volume and surface area. But instead of choosing directly, I give the user the option to ask for extra information on the solid, if they enter the number then 'show' (for example '1 show'). They can keep asking until a solid is chosen, so i used a while loop.

The loop isn't working. If the condition with the loop isn't valid, it still goes into it and loops and doesn't let me get out. Please help. It's pretty simple I think. I have tried to do integer and string conversions, without it helping.

#11/07/12 
#A program that asks user for input and calculates SA and Volume of a chosen solid

print "Which solid would you like to calculate?"    
print "  "      
print "1. Tetrahedron"          
print "2. Dodecahedron"           
print "3. Cone"                 
print "4. Sphere"                        
print "5. Icosahedron"                    
print '  '                        
print "If you want extra information on the solid, enter the solid's number and then add show. Example: 1 show"                   
print "If not, just enter the number"                       
choice = raw_input('----->')                             

#Where asks if user wants extra information on the solids, loops until solid is chosen             
while choice != '1' or choice != '2' or choice != '3' or choice != '4' or choice != '5':      
    if choice == "1 show":     
        print "A tetrahedron is composed of four congruent triangle faces. "     
    if choice =='2 show':      
        print "A dodecahedron is a polyhedron composed of 12 pentagonal faces. "      
    if choice == '3 show':       
        print 'A cone is a geometric solid that tapers smoothly from a circular base to an   apex. '          
    if choice == '4 show':          
        print "A sphere is a perfectly round circle. "            
    if choice == '5 show':
        print 'An icosahedron is a regular polyhedron with 20 congruent equilateral triangular faces'        
    choice = raw_input('Your new choice: ')              

if choice == 1: # Tetradedron               
    tetraside = raw_input("What is the length of your solid's side? ")               
    tetrabaseA = ((3 ** (1/2)) / 4) * tetraside**2                
    tetraheight = 9 * ((6 ** (1/2)) / 3) * tetraside                  
    tetraSA = 4 * tetrabaseA                
    tetraV = (1 / 3) * tetrabaseA * tetraheight                  

Upvotes: 0

Views: 1085

Answers (2)

Lev Levitsky
Lev Levitsky

Reputation: 65851

Your while condition is wrong. Think about it: even if choice equals '1', the condition choice != '2' will be true, so the whole condition will always be satisfied.

You need something like

while choice not in {'1', '2', ...}:

or

while choice not in set(map(str, range(1, 6))): # a fancier version

or just change all or to and in your condition.

Upvotes: 5

Blckknght
Blckknght

Reputation: 104852

Note that while your mistake was in the loop condition, some of your other code could be made more "Pythonic" by using dictionary lookups rather than big if elif else blocks.

Your while loop, for instance, could be simplified to this:

info = { "1 show" : "A tetrahedron is composed of four congruent triangle faces.",
         "2 show" : "A dodecahedron is a polyhedron composed of 12 pentagonal faces.",
         "3 show" : "A cone is a geometric solid that tapers smoothly from a circular base to an   apex.",
         "4 show" : "A sphere is a perfectly round circle.",
         "5 show" : "An icosahedron is a regular polyhedron with 20 congruent equilateral triangular faces" }

while choice not in { "1", "2", "3", "4", "5" }:
    print info.get(choice, "I'm sorry, I didn't understand your input.")
    choice = raw_input('Your new choice: ')

You can probably do something similar later on for the actual computation of the volume and surface area, though you might need to put the code for those calculations into separate functions and then put the functions into a dictionary (or even a list, since the indexes will be integers).

Upvotes: 2

Related Questions