Scheme procedure to capitalize a string

Please support our Legacy and Other Languages advertiser: Programming Forums - DaniWeb Sister Site
Thread Solved

Join Date: Feb 2008
Posts: 65
Reputation: vileoxidation is an unknown quantity at this point 
Solved Threads: 0
vileoxidation vileoxidation is offline Offline
Junior Poster in Training

Scheme procedure to capitalize a string

 
0
  #1
31 Days Ago
Hello, and thank you for helping me today! I am working on a scheme procedure that takes a string as its input, capitalizes every letter in the string, and then prints out the result. This is a homework assignment, and we are supposed to use another procedure that we wrote earlier on, which capitalizes a single character entered by the user. This procedure, which I wrote and which works fine, is included at the top of my current procedure. Right now, I have the following:

; defining the procedure char_toupper to convert a lower case character to upper case
(define char_toupper (lambda (myChar)
                       ; defining x as the ASCII value of myChar
                       (define x (char->integer myChar))
                       ; defining y as x-32
                       (define y (- x 32))
                       ; if statement for while x is less than 91 (already uppercase)
                       (if (< x 91)
                            ; if it is already uppercase, just display it
                            (display myChar)
                            ; otherwise, if x is greater than 96 (lowercase)
                            (if (> x 96)
                                ; then display the character equivalent to the ASCII value given by y
                                (display (integer->char y))
                            )
                        )
                       )
)

(define string_toupper (lambda (myString newString i)       
                         (if (< i (string-length myString))
                             (string_toupper myString (string-append newString (char_toupper (string-ref myString i))) (+ 1 i))
                         )
                         
                         (display newString)
                       )
)

(string_toupper (read) "" 0)

But it is not working. I get an error when I run the procedure, which says this: "string-append: expects type <string> as 2nd argument, given: #<void>; other arguments were: """

What am I doing wrong here? Can someone help me with this?

Thank you in advance!
Reply With Quote Quick reply to this message  
Join Date: May 2008
Posts: 87
Reputation: n1337 is on a distinguished road 
Solved Threads: 8
n1337 n1337 is offline Offline
Junior Poster in Training
 
0
  #2
29 Days Ago
Originally Posted by vileoxidation View Post
But it is not working. I get an error when I run the procedure, which says this: "string-append: expects type <string> as 2nd argument, given: #<void>; other arguments were: """

What am I doing wrong here?
The issue is that your char_toupper function actually returns void... In fact, the display function (display <>) has no return value. That is, (void? (display "a")) returns #t...

But you are using your char_toupper function as though it were returning an upper case character. If you want to use it like this, then you should modify it so that it actually returns the uppercase character to be used in string-append. Alternatively, you could modify your string_toupper function so that it does not require a result from char_toupper. That is, simply output the uppercase characters one character at a time (as your char_toupper currently does), and do not construct an entirely new string of uppercase characters... This would actually be faster since you would not require string-append, which takes O(n) time (although may not be the purpose of the assignment... it depends on whether or not your string_toupper need return a value...)

Hope that makes sense!
Last edited by n1337; 29 Days Ago at 11:19 am.
Optimist: This glass is half full!
Pessimist: This glass is half empty!
Engineering Consultant: This glass is twice as big as it needs to be...
Reply With Quote Quick reply to this message  
Join Date: Feb 2008
Posts: 65
Reputation: vileoxidation is an unknown quantity at this point 
Solved Threads: 0
vileoxidation vileoxidation is offline Offline
Junior Poster in Training
 
0
  #3
29 Days Ago
Originally Posted by n1337 View Post
The issue is that your char_toupper function actually returns void... In fact, the display function (display <>) has no return value. That is, (void? (display "a")) returns #t...

But you are using your char_toupper function as though it were returning an upper case character. If you want to use it like this, then you should modify it so that it actually returns the uppercase character to be used in string-append. Alternatively, you could modify your string_toupper function so that it does not require a result from char_toupper. That is, simply output the uppercase characters one character at a time (as your char_toupper currently does), and do not construct an entirely new string of uppercase characters... This would actually be faster since you would not require string-append, which takes O(n) time (although may not be the purpose of the assignment... it depends on whether or not your string_toupper need return a value...)

Hope that makes sense!
Oh, okay...duh! That makes sense. I hadn't thought about having to change the char_toupper procedure at all, but of course that makes total sense. I do have to use it in the string_toupper procedure, so unfortunately I can't use your idea about just writing the conversion into the string_toupper procedure. Thank you for suggesting it, though!

My procedure now works well, and is ready to go, I think!! Thank you very much for the help, n1337!! I greatly appreciate it.
Reply With Quote Quick reply to this message  
Reply

This thread has been marked solved.
Perhaps start a new thread instead?
Message:



Similar Threads
Other Threads in the Legacy and Other Languages Forum
Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC