This lab must be completed individually
The goal of this lab is to demonstrate how we can abstract “things” in the world (such as geometric objects) into program contructs. We also hope that you will get a lot more practice with using pointers, passing pointers to functions and using pointers along with structs. Y
You will continue to use the test-driven development (TDD) process to develop high quality and well-tested code in a systematic manner. When you run into problems with your code, remember to use the skills we have been learning such as code tracing and drawing pointer diagrams, to understand the dynamics of your program and how it is interacting with memory.
Go to github and find a repo for lab03 assigned to your GitHub id.
Log on to your CSIL account.
Change into your ~/cs16 directory
Clone your empty lab03 repo into your ~/cs16 directory.
In your empty repo, do git checkout -b main to establish that you are on the main branch as your default branch.
The starter code is in this repo:
The URL for cloning this repo is this: git@github.com:ucsb-cs16-m23/STARTER-lab03.git
Previous labs contain instruction for the process of:
starter remote for this repostarter remote into your own repo.Please do those steps now, and then do a git push origin main to populate your own repo with the starter code.
If you need help with these steps:
Once you’ve populated your repo, typing the ls command should show you the following files in your current directory
$ ls
Makefile pointsApproxEqualTest.cpp
README.md shapeFuncs.cpp
areaOfBoxTest.cpp shapeFuncs.h
boxesApproxEqualTest.cpp shapes.h
distanceBetweenTest.cpp tddFuncs.cpp
initBoxTest.cpp tddFuncs.h
initPointTest.cpp utility.cpp
pointToStringTest.cpp utility.h
$
Here is a brief description of each of the files and expected implementation.
Note that some of the files are organized in pairs of matching .h/.cpp files:
shapeFuncs.h/shapeFuncs.cpptddFuncs.h/tddFuncs.cpputililty.h/utility.cpp.h file has function declarations (also known as function prototypes) and the .cpp file has the function definitions..h files and .cpp files that are in pairs like this..h or a .cpp file.The shapes.h file is different; it isn’t paired with any .cpp file. That’s because it contains struct declarations used in the other files.
Finally, there are also a variety of .cpp files that have the suffix Test in their names. Each of these contains a main function, and code that runs our
tests. These are the same tests that run on Gradescope.
Here’s an overview of all of the files and their purpose:
Here are some further notes about the files that end in Test.cpp:
distanceBetweenTest.cpp contains test code to test your implementation of the distanceBetween() function in shapeFuncs.cpp.*Test.cpp file tests contains a main function, which means that each test file along with its dependent code is meant to be compiled into a separate executable.Makefile makes sure that this is in fact the case.The rationale behind this approach is that each function in shapeFuncs.cpp can be developed and tested independently as much as possible.
Here is a list of your tasks for this lab. You will see that we are working on one function at a time, seeing the tests fail, then editing code to see the tests pass.
distanceBetween workingmake and see the given code being compiled../distanceBetweenTest and see it fail.distanceBetween function in shapeFuncs.cpp to replace with correct code../distanceBetweenTest and see it pass.git status to see which files have been changed and need to be added.git add filename for each filename that you have changedgit add shapeFuncs.cppgit commit -m "distanceBetween function is now passing tests" (the exact comment is up to you; this is a suggestion)git push origin mainpointsApproxEqual functionThere is no code to commit for this step; this is just a step for you to read some code and understand it.
initPoint working./initPointTest and see it fail.initPointTest.cpp, figure out what the initPoint function is supposed to do.initPoint function in shapeFuncs.cpp to replace the stub with correct code../initPointTest and see it pass.git status to see which files have been changed and need to be added.git add filename (replacing filename as needed)git commit -m "distanceBetween function is now passing tests" (the exact comment is up to you; this is a suggestion)git push origin mainNow, as preparation for homework and exam questions, reason about why your code works.
initPoint function returns when it is called for the very first time by the test code.x and y of the struct object p1 in initPointTest.cpp
as well as the relationship between p1 and the formal parameter p of the function initPoint.xVal and yVal in memory and indicate whether or not they are colocated in memory with any other variables (such as x and y).boxesApproxEqual working./boxesApproxEqualTest and see it fail.boxesApproxEqual function in shapeFuncs.cpp to replace the stub with correct code. As you do, consider adding an approxEqual function that takes two double values into utility.h and utility.cpp, as this will make your coding job easier, and keep you code “DRYer”.pointsApproxEqual function in your boxesApproxEqual solution. Remember that the && operator is the symbol for “logical and” in C++../boxesApproxEqualTest and see it pass.initBox working./initBoxTest and see it failinitBox function in shapeFuncs.cpp to replace with correct code. As you do, remember that you use -> to access members of a struct through a pointer, but simply . to access members of a struct directly. You may need both in your answer../initBoxTest and see it passareaOfBox workingboxToString tests set up./pointToStringTest and see it pass; we’ll use that as a basis to develop boxToString.pointToStringTest.cpp to boxToStringTest.cpp (the Unix command is cp) and write code for tests for the boxToString function.
shapeFuncs.cpp at the boxToString function stub for an example of the format you need for boxToString’s return values.pointToString has.Makefile so that boxToString runs. Just follow the model—adding code in the Makefile for boxToStringTest everywhere you see code for pointToStringTestmakeboxToString working./boxToStringTest and see the tests failboxToString in shapeFuncs.cpp./boxToStringTest passEven if you now got 100 on Gradescope, please now check your work before submitting.
When you are finished, you should be able to type make clean and then make tests and see the following output:
-bash-4.2$ make clean
/bin/rm -f distanceBetweenTest initPointTest pointsApproxEqualTest boxesApproxEqualTest initBoxTest areaOfBoxTest pointToStringTest *.o
-bash-4.2$ make tests
g++ -Wall -Wno-uninitialized -c -o distanceBetweenTest.o distanceBetweenTest.cpp
g++ -Wall -Wno-uninitialized -c -o tddFuncs.o tddFuncs.cpp
g++ -Wall -Wno-uninitialized -c -o utility.o utility.cpp
g++ -Wall -Wno-uninitialized -c -o shapeFuncs.o shapeFuncs.cpp
g++ -Wall -Wno-uninitialized distanceBetweenTest.o tddFuncs.o utility.o shapeFuncs.o -o distanceBetweenTest
g++ -Wall -Wno-uninitialized -c -o initPointTest.o initPointTest.cpp
g++ -Wall -Wno-uninitialized initPointTest.o tddFuncs.o utility.o shapeFuncs.o -o initPointTest
g++ -Wall -Wno-uninitialized -c -o pointsApproxEqualTest.o pointsApproxEqualTest.cpp
g++ -Wall -Wno-uninitialized pointsApproxEqualTest.o tddFuncs.o utility.o shapeFuncs.o -o pointsApproxEqualTest
g++ -Wall -Wno-uninitialized -c -o boxesApproxEqualTest.o boxesApproxEqualTest.cpp
g++ -Wall -Wno-uninitialized boxesApproxEqualTest.o tddFuncs.o utility.o shapeFuncs.o -o boxesApproxEqualTest
g++ -Wall -Wno-uninitialized -c -o initBoxTest.o initBoxTest.cpp
g++ -Wall -Wno-uninitialized initBoxTest.o tddFuncs.o utility.o shapeFuncs.o -o initBoxTest
g++ -Wall -Wno-uninitialized -c -o areaOfBoxTest.o areaOfBoxTest.cpp
g++ -Wall -Wno-uninitialized areaOfBoxTest.o tddFuncs.o utility.o shapeFuncs.o -o areaOfBoxTest
g++ -Wall -Wno-uninitialized -c -o pointToStringTest.o pointToStringTest.cpp
g++ -Wall -Wno-uninitialized pointToStringTest.o tddFuncs.o utility.o shapeFuncs.o -o pointToStringTest
./distanceBetweenTest
PASSED: distanceBetween(p1,p2)
PASSED: distanceBetween(p2,p1)
PASSED: distanceBetween(p3,p4)
PASSED: distanceBetween(p4,p5)
PASSED: distanceBetween(p5,p3)
./initPointTest
PASSED: pointsApproxEqual(p1,p1Expected)
PASSED: pointsApproxEqual(p2,p2Expected)
PASSED: pointsApproxEqual(p3,p3Expected)
PASSED: pointsApproxEqual(p4,p4Expected)
./pointsApproxEqualTest
PASSED: pointsApproxEqual(p1,p1)
PASSED: pointsApproxEqual(p1,p2)
PASSED: assertFalse(pointsApproxEqual(p2,p1)
./boxesApproxEqualTest
PASSED: boxesApproxEqual(b0,b0)
PASSED: boxesApproxEqual(b1,b0)
PASSED: boxesApproxEqual(b0,b1)
PASSED: boxesApproxEqual(b0,b2)
PASSED: boxesApproxEqual(b0,b3)
PASSED: boxesApproxEqual(b0,b4)
PASSED: boxesApproxEqual(b5,b6)
PASSED: boxesApproxEqual(b6,b5)
./initBoxTest
PASSED: boxesApproxEqual(b1,b1Expected)
PASSED: boxesApproxEqual(b2,b2Expected)
PASSED: boxesApproxEqual(b1,b2)
./areaOfBoxTest
PASSED: areaOfBox(r)
PASSED: areaOfBox(s)
PASSED: areaOfBox(t)
PASSED: areaOfBox(u)
./pointToStringTest
PASSED: pointToString(p1)
PASSED: pointToString(p2)
PASSED: pointToString(p2,1)
PASSED: pointToString(p2,4)
PASSED: pointToString(p2,5)
-bash-4.2$
Plus, some output at the end with the output of your boxToStringTest
./boxToStringTest
PASSED: boxToString(b1,1)
PASSED: boxToString(b1,2)
PASSED: boxToString(b1,3)
PASSED: boxToString(b1,4)
PASSED: boxToString(b1,5)
PASSED: boxToString(b1,6)
-bash-4.2$
At that point, if you haven’t already, submit on Gradescope
Please check that you have followed these style guidelines:
Your submission should be on-time. If you miss the deadline, you are subject to getting a zero. The instructor may or may not extend the deadline for late submissions at their discretion.