Homework 2
Last updated: Tue, 18 Feb 2025 00:31:47 -0500
Out: Tue Feb 11 2025, 11am EST
Due: Tue Feb 18 2025, 11am EST
Overview
This assignment introduces The Design Recipe, a systematic way to write programs that are both correct and readable.
This hw will be graded accordingly:
correctness (autograder) (6 pts)
design recipe (10 pts)
testing (10 pts)
style (5 pts)
README (1 pt)
Setup
Create a new repository for this assignment by going to the CS450 Spring 2025 GitHub Organization and clicking "New".
Note: The CS450 Spring 2025 GitHub Organization must be the owner of the repository. Do not create the repository in your own account.
On the "Create a new repository" screen:
Name the repository hw<X>-<LASTNAME>-<FIRSTNAME> where <X> is the current homework number.
For example, I would name my hw2 repository hw2-Chang-Stephen.
Mark the repository as Private.
Check "Add a README file".
Select the Racket template for the .gitignore.
Choose whatever you wish for the license.
When done click "Create repository".
Tasks
Reading
Read Chapters 3-4 of the Textbook (where reading means working through the examples and exercises interactively).
Begin to read the The Design Recipe section of the course website (topics that will be covered in future lectures are marked as such).
For example, set! and other "imperative" features are not allowed ever.
In this assignment, conditionals such as if and cond are not allowed either, since they are only to be used with Data Definitions that we have not covered yet.
All code you write must now follow the The Design Recipe. (Just submitting code is no longer sufficient.) Signatures should use define/contract and the predicates defined in the Data Design Recipe step.
For Examples and Tests, do not use check-expect from the Beginning Student Language (even though the textbook says to). Instead, use check-equal? or other testing forms from rackunit.
Examples for a function definition should be right after the define. But Tests should be put into the test-suite in tests.rkt. Try to think about corner cases and code coverage.
In this assignment, each function should have at minimum one Example, and "sufficient" Tests.
Programming
In this assignment we’ll create a big-bang interactive program that could maybe eventually resemble a famous game.
Here is an online demo that approximates the behavior of the program.
Tests should go in a tests.rkt file, as described in lecture and the hw2 starter code, and the rest of the code should go in a file named hw2.rkt.
NOTE: The submitted program must be only a series of defines (both constants and function definitions are allowed). It should not run any code (e.g., it should not start the big-bang loop automatically!). Not following this will result in GradeScope errors and/or timeouts.
NOTE: You may look at the code from lecture04 to help you but DO NOT SUBMIT ANY OF THIS CODE (even if you change the variable names, etc). You won’t receive any credit. Instead, you should write code for this homework from scratch using The Design Recipe.
- Create a big-bang program that uses a 10\cdot\texttt{UNIT}\times 20\cdot\texttt{UNIT} pixel scene, whereThe big-bang expression should include:
A J-block (unrotated) should "fall" from the top of the scene to the bottom, at a rate of UNIT pixels per tick.
The block should initially be completely off the screen, but the "horizontal" part should be visible after one tick.
The block should stop "falling" when it touches the bottom of the scene.
The "x" coordinate of the block center should be centered in the scene.
a Data Definition named WorldState that represents the world state values of your big-bang program (remember that a world state should only include values that change; constant values should be defined as constants)
a WorldState? predicate that returns true when given a value that is a valid WorldState,
a function next-WorldState, with signature WorldState -> WorldState, that is given to on-tick,
a function WorldState->Image, with signature WorldState -> Image (Image is a built-in basic data definition from 2htdp/image where (image? i) evaluates to true if i is a valid Image), that is given to to-draw,
a constant INIT-WORLDSTATE where (WorldState? INIT-WORLDSTATE) evaluates to true.
a function main that takes no arguments and starts the big-bang interactive loop
Before Submitting
Testing (and Autograders)
Before submitting, note:
Do not submit until all code has been thoroughly tested (by you), which means writing a "sufficient" number of Test cases.
A GradeScope "Autograder" may or may not be released before the due date but either way, an Autograder is not a software development/testing tool, so do not use it as one. Code must be tested independent of any Autograder and questions about Autograders will be ignored (e.g., posts asking "why is the Autograder giving an error?" are not allowed)
If you do submit before the deadline and get an Autograder error, this is bonus information that indicates the submitted code is not complete and/or not correct. But it’s up to you to figure out what "correct" means and how to fix to the program.
Of course, the course staff is here and eager to help, but cannot do so without context information. The best way to supply this information is to INCLUDE EXAMPLES WITH ALL QUESTIONS, along with what the "expected" result should be! Also, examples should be minimal in order to get the clearest possible answer.
The Autograder test suite is subject to change. This means that the visible grade seen during submission is not the final grade.
Style
All code should follow proper Racket Style.
Also, the repository itself must follow proper style. Specifically, it must have appropriate commit messages. See How to Write a Git Commit Message if you are unsure how to write a commit message.
Files
A submission must have the following files in the repository root:
hw2.rkt: Contains the hw solution code.
All defines should use the name specified in the exercise (ask if you are unsure) and should be provided.
The easiest (but not always the most readable) way to ensure all necessary definitions are provided is to (initially) put as the second line in the file:
This automatically provides all definitions in the file (the first line should be #lang racket).
tests.rkt: This file should require hw2.rkt and define tests for it.
Specifically, it should define a rackunit test-suite named TESTS which contains "sufficient" rackunit Test cases (e.g., check-equal?, etc.) for each defined function.
README.md: Contains the required README information, including the GitHub repo url.
Submitting
When you are done, submit your work to Gradescope hw2. You must use the "GitHub" Submission Method and select your hw<X>-<LASTNAME>-<FIRSTNAME> repository.
Note that this is the only acceptable way to submit homework in this course. (Do not manually upload files and do not email files to the course staff. Homework submitted via any unapproved methods will not be graded.)