CSC 533: Organization of Programming Languages
HW4: Scheme Programming I
For this assignment, you are to define the following Scheme functions. For
simplicity, place all of your function definitions in a single file named
YOURNAME-hw4.ss, where YOURNAME is your name. Be careful to name your functions exactly as defined in the exercises, and be sure to comment each function as to its behavior.
- Define a function named wind-chill that takes two inputs, a
temperature (in degrees Fahrenheit) and a wind speed (in miles per hour), and
returns the corresponding wind-chill factor. The formula for computing the
| wind-chill =
|| if windSpeed <= 3
| 35.74 + 0.6215*temperature +
- Define functions for converting between square feet and square meters.
Note that this is not a straightforward conversion. You must first calculate the
square root of the area, convert that square root from one unit to the other,
then square the result. Recall that there are 12 inches in a foot and 100
centimeters in a meter.
For example, (ft^2->m^2 100) should evaluate to
9.290304, since the square root of 100 is 10, 10 feet converts to 3.048 meters,
and 3.0482 is 9.290304. Conversely, (m^2->ft^2 9.290304) should evaluate to 100.0.
- The Mosteller Formula is often used by doctors and dieticians in
estimating the surface area of a person's body given their height and weight.
The formula is as follows, where height is assumed to be in centimeters,
weight is in kilograms, and surface area is in square meters:
area = (height * weight / 3600)1/2
Define a function named surface-area-metric that takes two inputs, a person's
height (in centimeters) and weight (in kilograms), and returns their surface area
(in square meters).
For example, (surface-area-metric 168 59) should evaluate to
- Define a function named surface-area-american that takes two inputs, a person's
height (in inches) and weight (in pounds), and returns their surface area
(in square feet). The functions you have previously written should prove useful here.
For example, (surface-area-american 66 130) should evaluate to
- Define a function named remove-all that takes two inputs, an atom
and a list, and returns the list with each occurrence of the atom removed.
For example, (remove-all 'x '(z x e x)) should evaluate to (z
- Define a function named replace-all that takes three inputs, two atoms
and a list, and returns the list with each occurrence of the second atom
replaced by the first. For example, (replace-all 'a 'x '(z x e x)) should
evaluate to (z a e a).
- Define a function named roman->num that takes one input, a list of characters
representing a roman numeral, and returns the the number value
represented by that roman numeral. For example,
(roman->num '(X V I))
should evaluate to 16. The following is a list of
the roman letters and numbers they represent:
M = 1000, D = 500, C = 100, L = 50, X = 10, V = 5, I = 1.
You may assume the ancient roman style of writing letters, where 4 is
represented IIII and 90 is represented LXXXX. A harder problem, which
you may attempt if you like, is to use the modern roman style where
4 is IV and 90 is XC.
- Define a function named num->roman that performs the reverse conversion, from a number to a list of characters representing a roman numeral. For example,
(roman->num 66) should evaluate to (L X V I).
Again, you may assume the ancient roman style of writing letters.
- Define a function named
dice-roll that has no inputs and simulates the roll of two six-sided dice. That is, the call
(dice-roll) should return an integer from the range 2 through 12, following the appropriate probability distribution (e.g., 7 is the most likely roll, 2 and 12 are the least likely).
Hint: The built-in
random function generates a pseudo-random integer from 0 up to its input (exclusive). For example, the call
(random 4) would return either 0, 1, 2, or 3.
- Define a function named
average-rolls that takes one input, a positive integer, and simulates that many rolls of the dice, returning the average of all of those rolls. For example, the call
(average-rolls 1000) should simulate 1000 dice rolls and return the average. Since the number of rolls could be large, your function should utilize tail-recursion.
- Define a function named
count-dice that takes two inputs, a number of rolls and the desired total. The function should simulate the specified number of rolls and return the number of times the desired total was obtained. For example, the call
(count-dice 1000 7) should simulate 1000 dice rolls and return the number of times 7 was rolled. Since the number of rolls could be large, your function should utilize tail-recursion.
random-walk function below simulates a random 1-dimensional walk. Initially,
walker is assumed to be at position 0. Depending on the flip of a coin, the
either moves to the right (in the positive direction) or to the left (in the
negative direction). The simulation ends when the walker reaches the
(if (= (random 2) 0)
(define (random-walk goalDist)
(define (random-walk-help position)
(begin (display "position: ") (display position) (newline)
(cond ((= (abs position) goalDist) #t)
((equal? (coin-flip) 'heads) (random-walk-help (add1 position)))
(else (random-walk-help (sub1 position))))))
As is, this function displays each step in the walk and returns #t
when the walk ends. Modify the function so that it keeps track of the number of
steps in the walk and returns this value instead. Your modification should only