320 likes | 463 Views
Scheme: Functions. Chapter 3 of HTDP Ms. Knudtzon September 12. Check Point. Lab Exercises from last week Fabric Exercises from the weekend. Scheme Programs. We’ve now written several simple functions in Scheme A program in Scheme usually consists of several inter-related functions
E N D
Scheme: Functions Chapter 3 of HTDP Ms. Knudtzon September 12
Check Point • Lab Exercises from last week • Fabric Exercises from the weekend
Scheme Programs • We’ve now written several simple functions in Scheme • A program in Scheme usually consists of several inter-related functions • In the area-of-ring function from last week, we used a small auxiliary function, area-of-disk that we had written in a previous step • For very large programs, having auxiliary functions becomes more and more necessary
Class Problem Imagine the owner of a movie theater who has complete freedom in setting ticket prices. The more he charges, the fewer the people who can afford tickets. In a recent experiment the owner determined a precise relationship between the price of a ticket and average attendance. At a price of $5.00 per ticket, 120 people attend a performance. Decreasing the price by a dime ($.10) increases attendance by 15. Unfortunately, the increased attendance also comes at an increased cost. Every performance costs the owner $180. Each attendee costs another four cents ($0.04). The owner would like to know the exact relationship between profit and ticket price so that he can determine the price at which he can make the highest profit. • How do we go about solving this problem? • Need to figure out what the problem wants, and then write contracts, purpose and headers for each function.
Dependencies • Profit is difference between revenue and cost • Revenue is generated by sale of tickets. (Product of ticket price and # of attendees) • Cost consists of two part - fixed part $180 and variable part that depends on # of attendees • Also know that # of attendees depends on ticket price.
Definitions ;; profit : number -> number ;; to compute the profit as the difference between revenue and costs ;; at some given ticket-price (define (profit ticket-price) ...) ;; revenue : number -> number ;; to compute the revenue, given ticket-price (define (revenue ticket-price) ...) ;; cost : number -> number ;; to compute the costs, given ticket-price (define (cost ticket-price) ...) ;; attendees : number -> number ;; to compute the number of attendees, given ticket-price (define (attendees ticket-price) ...)
Examples • Exercise 3.1.1. The next step is to make up examples for each of the functions. Determine how many attendees can afford a show at a ticket price of $3.00, $4.00, and $5.00. Use the examples to formulate a general rule that shows how to compute the number of attendees from the ticket price. • Exercise 3.1.2. Use the results of exercise 3.1.1 to determine how much it costs to run a show at $3.00, $4.00, and $5.00. Also determine how much revenue each show produces at those prices. Finally, figure out how much profit the monopolistic movie owner can make with each show. Which is the best price (of these three) for maximizing the profit?
;; How to design a program (define (profit ticket-price) (- (revenue ticket-price) (cost ticket-price))) (define (revenue ticket-price) (* (attendees ticket-price) ticket-price)) (define (cost ticket-price) (+ 180 (* .04 (attendees ticket-price)))) (define (attendees ticket-price) (+ 120 (* (/ 15 .10) (- 5.00 ticket-price)))) ;; How not to design a program (define (profit price) (- (* (+ 120 (* (/ 15 .10) (- 5.00 price))) price) (+ 180 (* .04 (+ 120 (* (/ 15 .10) (- 5.00 price))))))) Two ways
Guidelines • Formulate auxiliary function definitions for every dependency between quantities mentioned in the problem statement or discovered with example calculations. • Give names to frequently used constants and use the names instead of the constants in programs. • Variable definitions (define pi 3.14) • (The “shortcuts” I told you about last week)
Homework • Exercise 3.31 of HTDP (unit conversion)
Scheme: Conditionals Chapter 4 of HTDP Ms. Knudtzon September 13
Check Point • 80 point quiz • Fabric Exercise Homework • Show me it is working (show off the 3 clothing items you designed in part 6) • Show me your comments, test cases, etc • Grades: 100, 80, 60
Booleans • True or False values • We already saw how to code equalities and inequalities in Scheme: • (= x 5) • (< x y) • (>= x z) • => These are called relational operations
Compound Conditions • If we want two conditions to be true, use the and operator • (and (= x y) (< y z)) • If we want at least one of the conditions to be true, use the or operator • (or (= x y) (< y z)) • If we want the negation to be true, use the not operator • (not (= x y))
Example • Using Scheme to test a solution for polynomial ; equation1: number --> boolean ; to determine whether x is a solution for x^2 + 2x + 1 = 0 (define (equation1 x) (= (+ (* x x) (+ (* 2 x) 1)) 0)) ;Test Cases (equation1 -1) “should be” true (equation1 1) “should be” false Why did I put the zero on a separate line?
Symbols • A symbol in Scheme is a set of characters preceded by a single quotation mark (no spaces allowed within symbol) • Examples: • ‘dog ‘east ‘chocolate ‘hello ‘WakeUp
Conditional Functions • Sometimes what we want our program to do depends on certain conditions Is it raining? Yes No Take an Umbrella Bring a swimsuit (= x 0) Yes No Say “Can’t divide by zero” (/ y x)
(cond [question answer] … [question answer]) (cond [question answer] … [elseanswer]) Conditionals in Scheme Arbitrary # of cond-lines Each cond-line has a condition (question) and a result (answer)
Example Conditional ;sign: number --> symbol ; consume number and returns whether num is ; zero, pos, or neg (define (sign anum) (cond [ (= anum 0) ‘zero] ; question answer [ (> anum 0) ‘positive] [ (< anum 0) ‘negative] ) ) ; Test Cases (sign 0) “should be” ‘zero (sign 40) “should be” ‘positive (sign -222) “should be” negative
Interest Rate • Some banks pay different levels of interest for saving accounts. The more a customer deposits, the more the bank pays. In such arrangements, the interest rate depends on the interval into which the savings amount falls. To assist their bank clerks, banks use interest-rate functions. An interest function consumes the amount that a customer wishes to deposit and responds with the interest that the customer receives for this amount of money.Suppose the bank pays 4% for deposits of up to $1,000 (inclusive), 4.5% for deposits of up to $5,000 (inclusive), and 5% for deposits of more than $5,000. • Write the interest-rate function for the bank.
Writing Conditionals • Start by sketching the “outline” of a conditional expression (for the right number of questions) (cond [() …] [() …] [() …]) (cond [(<= amount 1000) …] [(<= amount 5000) …] [(> amount 5000) …]) Then fill in the questions Then fill in the answers (cond [(<= amount 1000) .040] [(<= amount 5000) .045] [(> amount 5000) .050])
Data Analysis • Data analysis - understand the different situations that the problem statement discusses • Enumerate all possible situations • Adds a step to the design recipe
Check your understanding Develop the function interest. Like interest-rate, it consumes a deposit amount. Instead of the rate, it produces the actual amount of interest that the money earns in a year. The bank pays a flat 4% for deposits of up to $1,000, a flat 4.5% per year for deposits of up to $5,000, and a flat 5% for deposits of more than $5,000.
Wednesday & Thursday Lab Days
Scheme: Symbols Chapter 5 of HTDP Ms. Knudtzon September 16
Checkpoint • Lab/Homework exercises on conditionals • Show me structure of code and test cases working • 80 point quiz #2
Symbols Operations • Scheme has one basic operation for symbols, a comparison operator which returns true if the two symbols are identical • The operator is: symbol=? • To use it: (symbol=? ‘Hello ‘Hello) (symbol=? ‘hello ‘howdy) (define x ‘hello) (symbol=? ‘hello x) Note: It is case-sensitive!
Strings • As some of you have found from experimentation, Scheme also provides strings, which must be enclosed in double quotes. • There is also a String comparison operator, string=? • It is also case-sensitive
Symbols/Strings • Historical Note: Symbols were first introduced by researchers in AI who wanted to design functions that could have conversations with people • For now, assume symbols & strings to be fairly interchangeable • It mostly depends if you need spaces or not • Later, we will learn more about the differences between strings & symbols
Using Strings • We could write a function that took in a greeting and made a response ;; reply: string --> string ;; to determine a reply for the greeting s (define (reply s) (cond [ (string=? s “Good Morning”) “Hi” ] [ (string=? s “How are you?”) “Fine” ] [ (string=? s “Good Afternoon”) “I need a nap” ] [ (string=? s “Good Evening”) “Good night” ])) ;Test (reply “Good Morning”) “should be” “Hi”
Checking Input • What if you wanted to check if the input you got was a string? Or if it was a number? Or if it was a symbol? • Scheme has operators to do just that. Each of the following operators return a boolean • (string? X) • (symbol? X) • (number? X)
Exercises • Homework - On Website • In Class: Exercise 5.1.2. Develop the function check-guess. It consumes two numbers, guess and target. Depending on how guess relates to target, the function produces one of the following three answers: 'TooSmall, 'Perfect, or 'TooLarge. The function implements one part of a two-player number guessing game. One player picks a random number between 0 and 99999. The other player's goal is to determine this number, called target, with the least number of guesses. To each guess, the first player responds with one of the three responses that check-guess implements. The function check-guess and the teachpack guess.ss implement the first player. The teachpack picks the random number, pops up a window in which the second player can choose digits, and hands over the guess and the target to check-guess. To play the game, set the teachpack to guess.ss using the Language|Set teachpack option. Then evaluate the expression (guess-with-gui check-guess) After check-guess has been thoroughly tested