Hello all. My name is Younis, I am a computer science newb. I occasionally browse this website reading some fascinating threads. I have a simple project at hand which i am finding the extra credit portion to be somewhat difficult.
The project is very simple,
the project takes a number from the user and
- if the number is one, it quits
-if the number is even, we cut it in half
-if the number is odd, multiply is by 3 and add 1
so if we look at the number 13 it goes like this:
13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
so the length of the chain would be 10.
So our job is to print a menu to the user.
If the user enters "I", ask the user for a number, print the chain and length of the chain for that number
if the user enters "R", ask the user for a range of numbers, and print the length and chain of each number
If the user enters "L", ask the user for a range of numbers, and print the number with the longest chain length.
If the user enters "Q", then quit.
I have all of that working. now i the extra credit says:
if the user enters a number, and the next 10 numbers after that and draw a histograms.
so the x axis would be each of the number, and the y axis would be the chain length of that number.
I can get the number and length of each number in a list. but i am a newb as to how to draw this.
so if the user entered 2, we would draw a histogram of 2-11 and each bar of the number would reach up to the chain length of that number.
here is my code:
# Filename: hw6.py
# Date: 10/16/09
# Section #: 06
# Description:
# This file contains python code for hailstone sequence.
# It follows the rules, if a number is even, it will divide the
# next number by two, if the number is odd, it will multiply the next
# number by three and then add 1. This will continuie forming a chain
# until the last number is 1.
# this function prints the chain of numbers using the rules
# also adds up the length chain
# Inputs : n
# Outputs : none
import string
# from graphics import *
from graphics import *
#Constant
MAX = 10000
# printing functions
# this function prints a brief description of the program to the user
# Inputs: none
# Outputs : none
def printGreeting():
print ""
print " This program finds hailstones sequences of numbers"
print " you choose. The next number in the sequence if found by"
print " either dividing it by two(if even) or multiplying by 3"
print " and adding 1(if odd).The program quits when the last"
print " number in the sequence is 1\n"
# this functions prints the menu for the user
# Inputs: none
# Outputs : none
def printMenu():
print "\n\tHere are your menu choices:"
print "\n\tI - view squence for an individual value\n"
print "\tR - veiw sequence for range of values\n"
print "\tL - Find the longest chain\n"
print "\tH - Print out the histogram\n"
print "\tQ - Quit\n\n"
# end of printing funtions
# hailstone(number) prints the hailstone sequence
# Inputs: number
# Outputs: none
def hailstone(n):
length = 1
print n,
# checks if n is not sential
while n != 1:
# if even, divide by 2 (rule). add 1 to length
if n % 2 == 0:
n = n / 2
print "->",n,
length = length + 1
# if odd, multiply by 3, add 1 (rule). add 1 to length
elif n % 2 != 0:
n = ( 3 * n ) + 1
print "->",n,
length = length + 1
# print the length at the end of each chain
print "; length =",length
print "----------------------------------------------------------------",
print "--------------\n"
return length
# this function returns the length of each chain from the starting number, n
# Inputs : n
# Outputs : none
def chain(n):
length = 1
while n != 1:
# if even, divide by 2 (rule). add 1 to length
if n % 2 == 0:
n = n / 2
length = length + 1
# if even, divide by 2 (rule). add 1 to length
elif n % 2 != 0:
n = ( 3 * n ) + 1
length = length + 1
return length
# getValidInt() prompts the user to enter an integer in the specified range,
# rejects values not in that range by requiring new input, and only returns
# a valid integer.
# Inputs: the question of the prompt,
# the minimum value in the range
# and the maximum value in the range
# Output: an integer in the specified range
def getValidInt(question, min, max):
# use a bad value to enter the loop
value = max + 1
# compose the prompt
prompt = question + " (" + str(min) + "-" + str(max) + "): "
# continue to get values until the user enters a valid one
while value == "" or value < min or value > max:
value = raw_input(prompt)
if len(value) != 0:
value = int(value)
# return a valid value
return value
# this function finds the longest chain
# Inputs: none
# Outputs : none
def longChain():
begin = "Please enter the begining integer for the range"
end = "Please enter the ending integer for the range"
# calls to getValidInt for starting and ending values
beginNum = getValidInt(begin, 1, MAX)
endNum = getValidInt(end, beginNum + 1, MAX)
largestChain = beginNum
for i in range(beginNum, endNum+1):
if largestChain <= chain(i):
largestChain = i
length = chain(i)
print largestChain, " had the longest chain ", length
# this function finds the longest chain***************************8
# Inputs: none*************
# Outputs : none
def histogram():
# initialize variables
longestLength = 1
list = []
start = input("Please enter the begining integer for the range: ")
for n in range (start, start + 10):
length = chain(n)
list.append(length)
if longestLength <= chain(n):
longestLength = n
length = chain(n)
print longestLength
print list
def main():
# prints the greeting to the user
printGreeting()
# prints the menu to the user
printMenu()
# asks user the menu choice
choice = raw_input("Please enter your choice : ").upper()
# checks to see if choice entered is from the menu
while choice != 'Q':
# if choice is "I" or "i", proceeds to follow the individual steps
if choice == 'I':
n = input("Please enter your integer (1-10000):")
hailstone(n)
# if choice is "R" or "r", proceds print each number and its sequence
# until the last number is 1, uses getValidInt to get valid integers
# for the function
elif choice == 'R':
begin = "Please enter the begining integer for the range"
end = "Please enter the ending integer for the range"
# calls to getValidInt for starting and ending values
beginNum = getValidInt(begin, 1, MAX)
endNum = getValidInt(end, beginNum + 1, MAX)
# for loop to get the values between starting and ending value
for n in range(beginNum,endNum+1):
#call to the hailstone function
hailstone(n)
# if choice is "L" or "l", proceeds to use getValidInt again to get the
# range, error checks on the range, and then calls the function chain
# to determine the length.
elif choice == 'L':
# call to function longchain
longChain()
elif choice == 'H':
histogram()
# if niether of the menu choices, then it prints that the
# entered text is not a valid choices
else:
print choice, "is not a valid choice"
# prints the menu to the user
printMenu()
# asks user the menu choice
choice = raw_input("Please enter your choice : ").upper()
main()