CS253 HW1: Word Recognition                
Changes                
Updates to the assignment will be noted here. None yet!
                
Description                
For this assignment, you will write a C++ program called hw1
that will read from standard input, recognize words, and display some
statistics of questionable value about the input. It will display the
words found, the number of words encountered, and the range of word
lengths. If no words are encountered, display an error message, and
nothing else.
                
Input Format                
The input will be any number of lines, containing words. A word is
defined as a series of consecutive non-whitespace characters, separated
by whitespace. However, parentheses, (
and )
, are
always separate single-character words, no matter where they appear.
                
Whitespace is defined as any of the six characters " \f\n\r\t\v"
,
or, equivalently, what isspace() says it is.
                
Sample Run                
Here is a sample run, where %
is my prompt.
                
% cat CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(hw1)
# Are we in the wrong directory?
if(CMAKE_SOURCE_DIR MATCHES "[Hh][Ww]([0-9])$")
if(PROJECT_NAME MATCHES "[^${CMAKE_MATCH_1}]$")
message(FATAL_ERROR "Building ${PROJECT_NAME} in ${CMAKE_SOURCE_DIR}")
endif()
endif()
# Using -Wall is required:
add_compile_options(-Wall)
# These compile flags are highly recommended, but not required:
add_compile_options(-Wextra -Wpedantic)
# Optional super-strict mode:
add_compile_options(-fmessage-length=80 -fno-diagnostics-show-option
-fstack-protector-all -g -O3 -std=c++17 -Walloc-zero -Walloca
-Wctor-dtor-privacy -Wduplicated-cond -Wduplicated-branches
-Werror -Wextra-semi -Wfatal-errors -Winit-self -Wlogical-op
-Wold-style-cast -Wshadow -Wunused-const-variable=1
-Wzero-as-null-pointer-constant)
# add_compile_options must be BEFORE add_executable.
# Create the executable from the source file main.cc:
add_executable(${PROJECT_NAME} main.cc)
# Create a tar file every time:
add_custom_target(${PROJECT_NAME}.tar ALL COMMAND
tar -cf ${PROJECT_NAME}.tar *.cc CMakeLists.txt)
% cmake . && make
… cmake output appears here …
… make output appears here …
% cat data
Price: $4653055.99(+tax)
+15% gratuity-which-is-RATHER-stingy
% ./hw1 <data
Word is "Price:"
Word is "$4653055.99"
Word is "("
Word is "+tax"
Word is ")"
Word is "+15%"
Word is "gratuity-which-is-RATHER-stingy"
Words: 7
Word range: 1-31
% echo -e "\tQ\f" | ./hw1
Word is "Q"
Words: 1
Word range: 1-1
Hints                
Debugging                
If you encounter “STACK FRAME LINK OVERFLOW”, then try this:
export STACK_FRAME_LINK_OVERRIDE=ffff-ad921d60486366258809553a3db49a4a
Requirements                
- Error messages:
- go to standard error
- include the program name as given by
argv[0]
.
- Input format:
- The input may consist of any number of lines.
- Each input line may be arbitrarily long.
- Each input line may contain any number of words, including zero.
- Words may be arbitrarily long
- I didn’t really need to specify the previous requirements.
When an assignment doesn’t specify a limit, don’t create your own
limits.
- Creativity is a wonderful thing, but your output format is not
the place for it. Your output should look exactly like
the output shown above.
- UPPERCASE/lowercase matters.
- Spaces matter.
- Blank lines matter.
- Extra output matters.
- You may not use any external programs. You many not use
system(), fork(), popen(), execl(), execvp(), etc.
- You may not use C-style I/O
such as printf(), scanf(), fopen(), and getchar().
- You may not use dynamic memory via new, delete,
malloc(), calloc(), realloc(), free(), strdup(), etc.
- It’s ok to implicitly use dynamic memory via containers
such as string or vector.
- You may not use the eof() method.
- No global variables.
- Except for an optional single global string called
program_name
containing argv[0]
.
- For readability, don’t use ASCII int constants (
65
) instead of
char constants ('A'
) for printable characters.
- We will compile your program like this:
cmake . && make
- If that generates warnings, you will lose a point.
- If that generates errors, you will lose all points.
- There is no automated testing/pre-grading/re-grading.
- Test your code yourself. It’s your job.
- Test with the CSU compilers, not just your laptop’s compiler.
- Even if you only change it a little bit.
- Even if all you do is add a comment.
If you have any questions about the requirements, ask.
In the real world, your programming tasks will almost always be
vague and incompletely specified. Same here.
                
Tar file                
- For each assignment this semester, you will create a tar file,
and turn it in.
- The tar file for this assignment must be called:
hw1.tar
- It must contain:
- source files (
*.cc
)
- header files (
*.h
) (if any)
CMakeLists.txt
- This command must produce the program
hw1
(note the dot):
cmake . && make
- At least
-Wall
must be used every time g++ runs.
Remember how HW0 went on & on about testing your tar file?
It applies here, too, and also to all other assignments.
                
How to submit your work:                
In Canvas, check in the
file
hw1.tar
to the assignment “HW1”.
It’s due 10:00:00ᴘᴍ MT Saturday, with a 24-hour late period for a 25% penalty.
                
How to receive negative points:                
Turn in someone else’s work.