Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Spare some change?

Name: Anonymous 2012-12-15 18:39

so, I am trying to write a change-counting program in scheme for some practice (I'm new to programming). Here is what I have:



 define (change-iter change quarter dime nickel penny)
  (cond ((< change 1.00)
          (change-iter (- change 0.25) (+ quarter 1) dime nickel penny))
         ((< change .25)
          (change-iter (- change 0.10) quarter (+ dime 1) nickel penny))
         ((< change .10)
          (change-iter (- change 0.05) quarter dime (+ nickel 1) penny))
         ((< change 0.5)
          (change-iter (- change 0.01) quarter dime nickel (+ penny 1)))
         ((= change 0)
          (display quarter)
          (newline)
          (display dime)
          (newline)
          (display nickel)
          (newline)
          (display penny)
          (newline))))

(define (change-counter change)
  (change-iter change 0 0 0 0))


it doesn't display the coins at the end.  What am I doing wrong?

Name: Anonymous 2012-12-15 18:45

Read SICP. (< change 1.00) would be change<1.00 in a faggot notation.

Name: Anonymous 2012-12-15 18:51

Currently reading/working my through SICP.

Name: Anonymous 2012-12-15 19:07

saw a stupidly obvious mistake.  Still not returning right though.


(define (change-iter change quarter dime nickel penny)
  (cond ((and (< change 1.00) (> change 0.24))
          (change-iter (- change 0.25) (+ quarter 1) dime nickel penny))
         ((and (< change .25)(> change 0.09))
          (change-iter (- change 0.10) quarter (+ dime 1) nickel penny))
         ((and (< change .10)(> change 0.04))
          (change-iter (- change 0.05) quarter dime (+ nickel 1) penny))
         ((and (< change 0.5)(> change 0.00))
          (change-iter (- change 0.01) quarter dime nickel (+ penny 1)))
         ((= change 0.00)
          (display quarter)
          (newline)
          (display dime)
          (newline)
          (display nickel)
          (newline)
          (display penny)
          (newline))))

(define (change-counter change)
  (change-iter change 0 0 0 0))


Any thoughts as to how to get it to display the coins?

Name: Anonymous 2012-12-15 19:28

>>4
You're using the wrong tests:


(define (change-iter change quarter dime nickel penny)
    (cond
      ((>= change 0.25) (change-iter (- change 0.25) (+ quarter 1) 0 0 0))
      ((>= change 0.10) (change-iter (- change 0.10) quarter (+ dime 1) 0 0))
      ((>= change 0.05) (change-iter (- change 0.05) quarter dime (+ nickel 1) 0))
      ((> change 0.00) (change-iter (- change 0.01) quarter dime nickel (+ penny 1)))
      (else (printf "~a\n~a\n~a\n~a\n" quarter dime nickel penny))))

Name: Anonymous 2012-12-15 19:50

>>5

Thanks.  Part of my problem looking at your solution is I wasn't sure how to print variables.  Didn't realize the scheme format was very similar to the C format.

Thanks again.  Part of the reason I had the tests set up like that was after I had it all set up I was going to implement bills.

Name: Anonymous 2012-12-15 20:17

>>5

Also, what version of Scheme are you using?  I just tried it, and it told me that printf was undefined.

Name: Anonymous 2012-12-15 20:25

>>7
Racket

Name: Anonymous 2012-12-15 20:28

>>8
Ah.  I was using Mit-Scheme

Name: Anonymous 2012-12-16 2:11

>>9
you can try (require 'printf)

Name: Anonymous 2012-12-16 19:25

function change_iter(change quarter dime nickel penny) {
    if (change >= 0.25)
        change_iter(change - 0.25, quarter + 1, 0, 0, 0)
    else if (change >= 0.10)
        change_iter(change - 0.10, quarter, dime + 1, 0 0)
    else if (change >= 0.05)
        change_iter(change - 0.05, quarter, dime, nickel + 1, 0)
    else if (change > 0.00)
        change_iter(change - 0.01. quarter, dime, nickel, penny + 1)
    else
        console.log(quarter + '\n' + dime + '\n' + nickel + '\n' + penny)
}

Name: Anonymous 2012-12-16 20:41

>>11
nice javascript

Name: Anonymous 2012-12-17 10:58

JavaScript is Scheme for the web.

Name: Anonymous 2012-12-18 10:52

ok, so, I got it working in regular scheme and it looks nice on the return, but...  For whatever reason, on the amounts between 89 and 92 cents, it returns the wrong number of pennies.  pretty much every other number comes out right.  Why?


(define (change-iter change twenty ten five one quarter dime nickel penny)
  (cond ((>= change 20.00)
     (change-iter (- change 20.00) (+ twenty 1) 0 0 0 0 0 0 0))
    ((>= change 10.00)
     (change-iter (- change 10.00) twenty (+ ten 1) 0 0 0 0 0 0))
    ((>= change 5.00)
     (change-iter (- change 5.00) twenty ten (+ five 1) 0 0 0 0 0))
    ((>= change 1.00)
     (change-iter (- change 1.00) twenty ten five (+ one 1) 0 0 0 0))
    ((>= change 0.25)
      (change-iter (- change 0.25) twenty ten five one (+ quarter 1) 0 0 0))
    ((>= change 0.10)
      (change-iter (- change 0.10) twenty ten five one quarter (+ dime 1) 0 0))
    ((>= change 0.050)
      (change-iter (- change 0.050) twenty ten five one quarter dime (+ nickel 1) 0))
    ((> change 0.00)
      (change-iter (- change 0.010) twenty ten five one quarter dime nickel (+ penny 1)))
    (else
     (newline)
     (display (string twenty "   Twenties"))
     (newline)
     (display (string ten "   Tens"))
     (newline)
     (display (string five "   Fives"))
     (newline)
     (display (string one "   Ones"))
     (newline)
     (display (string quarter "   Quarters"))
     (newline)
     (display (string dime "   Dimes"))
     (newline)
     (display (string nickel "   Nickels"))
     (newline)
     (display (string penny "   Pennies")))))

(define (change-counter change)
  (change-iter change 0 0 0 0 0 0 0 0))

Name: Anonymous 2012-12-18 11:02

>>11
fuck off fagshit

>>12
nice kike

>>13
JavaScript is Kike shit for the web.

Name: Anonymous 2012-12-18 13:36

>>14
It's a floating point error, Here's what happens to change during (change-counter 0.89)

0.89 -> 0.64 -> 0.39 -> 0.14 -> 0.04000000000000001 -> 0.030000000000000006 -> 0.020000000000000004 -> 0.010000000000000004 ->  3.469446951953614e-018 -> -0.0099999999999999970

This is a good lesson not to trust exact testing on floating point variables that undergo multiple calculations. You have to have tolerance. Change change units to mean a penny and you will have your exact answer.

Name: Anonymous 2012-12-18 19:43

>>16

I figured it was a floating point problem. Just dawned on me how to fix it.


(define  (change-counter  change)
  (change-iter (* change   100)))


Then changed all of the tests and  subtraction changed to integers.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List