| CSC 153 | Grinnell College | Spring, 2005 |
| Computer Science Fundamentals | ||
| Laboratory Exercise | ||
This laboratory exercise provides practice with several elements of program correctness and design:
State pre-conditions and post-conditions for procedures power, countdown, replicate and square-each-element from the lab on recursion.
Add tests of pre-conditions for procedures power and square-each-element from the lab on recursion.
Write a husk-and-kernel version of the replicate procedure
from the lab on recursion.
Write a procedure sum-of-list that takes any list of
numbers and returns the sum of of the elements of the list. Have the
procedure print a warning message if it is given an empty list. (The
procedure should return 0 after issuing this warning message.)
Define a predicate author? that takes one argument and
determines whether that argument is a list containing exactly three
arguments, the first one a string and the second and third ones integers.
(The predicate should return #t if all of these
conditions are met, #f if any one of them is not
satisfied.)
The reading for this lab included the following Scheme definitions. These are reproduced here for easy reference.
(define longest-on-list
(lambda (ls)
;Pre-condition: ls is non-empty list of strings
;Post-conditions: returns error if pre-condition is not met
; otherwise, returns the string on ls of longest length
;; Check pre-conditions
(if (or (null? ls)
(not (list-of-strings? ls)))
(error 'longest-on-list
"the argument must be a non-empty list of strings"))
;; Find the longest string on the list.
(longest-on-list-kernel ls)))
(define longest-on-list-kernel
(lambda (ls)
;Pre-condition: ls is non-empty list of strings
;Post-conditions: returns the string on ls of longest length
(if (null? (cdr ls))
(car ls)
(longer-string (car ls)
(longest-on-list-kernel (cdr ls))))))
(define longer-string
(lambda (str1 str2)
(if (< (string-length str1) (string-length str2))
str2
str1)))
(define list-of-strings?
(lambda (ls)
;Pre-condition: none
;Post-condition: returns #t if ls is a non-empty list of strings
(or (null? ls)
(and (pair? ls)
(string? (car ls))
(list-of-strings? (cdr ls))))))
Identify tests cases that will cover a full range of situations that might be encountered in executing the longest-on-string procedure.
Develop a test plan for the tally-by-parity problem from the lab on recursion.
Replace define by trace-define in the definition of longest-on-list and longest-on-string-kernel in the code above, and then run several test cases. Describe the output obtained, and explain why it appears.
Revise longest-on-list and longest-on-string-kernel so they are defined with define rather than by trace-define. Then edit longer-string, so it is defined with trace-define. Run a few test cases, describe the output obtained, and explain why this output is obtained.
Notes
This document is available on the World Wide Web as
http://www.math.grin.edu/~walker/courses/153.sp05/labs/lab-correctness.shtml
|
created January 13, 1998 by John David Stone and Henry
M. Walker last revised January 22, 2005 |
|
| For more information, please contact Henry M. Walker at walker@cs.grinnell.edu. |