Description
- Write C++ programs
- Compile C++ programs
- Implement programs that use advanced class concepts such as constructors, destructors, and member functions.
Additional Reading
This lab exercise requires an understanding of some concepts to solve the problems. You are strongly encouraged to read the following tutorials to help you answer the problems.
- Organizing C++ files: function prototypes, implementations, and drivers.
- Using objects as parameters and return values in functions
- Passing arrays as parameters to functions
- File reading and writing (also includes dealing with arrays)
Instructions
Answer the programming problems sequentially (i.e., answer prob01 before prob02). If you have questions let your instructor or the lab assistant know. You can also consult your classmates.
When you answer two programming problems correctly, let your instructor know and wait for further instruction.
Lab exercise guide
Here’s a link to the Lab exercise guide in case you need to review the lab exercise objectives, grading scheme, or evaluation process.
Digicup
This program simulates interactions with a Cup
 object for getting a drink, refilling a drink, emptying a drink, and drinking from it.
Output
All of the output statements (std::cout
) should be in main
 and are mostly provided for you. You will only need to complete the menu functionality by calling the appropriate member functions from the Cup
 object. Your member functions are designed to only perform calculations and return values.
The Cup
 object will be used to ask the user for the type of drink they prefer and the amount they want to drink.
The menu options are shown below for your reference:
D: Drink
R: Refill
N: Get a brand new drink
E: Empty
X: Exit
Cup
 class
The Data members
Create a class called Cup
 with the following member variables:
drink_type_
 which is anÂstd::string
 that will be the name of the drink.fluid_oz_
 which is aÂdouble
 that will be the amount of fluid in the cup.
Constructors
Default constructor
The default constructor should initialize drink_type_
 to "Water"
 and initialize fluid_oz_
 to 16.0
Non-default constructor
The non-default constructor should take in an std::string
 parameter that will be the name of the drink type and a double
 parameter that will be the amount of drink in the cup. It should set the passed parameter values to the corresponding data members.
Member functions
drink
Drinking reduces the amount of liquid in the Cup
 based on a given amount
 that is passed as a parameter. Take note that fluid_oz_
 should never be negative such that if you drink an amount
 that is greater that fluid_oz_
, then fluid_oz_
 should be set to 0
.
refill
Refilling the cup increases the amount of liquid in the Cup
 based on the given parameter, amount
. Assume the cup is bottomless.
new_drink
Throw out your current drink and replace it with a new drink. The function accepts two parameters. The first is the name of the new drink type and the second is the amount of the new drink type.
empty
Empties out the contents of the cup in it’s entirety. fluid_oz_
 should be set to 0, and _drink_type
 should be set to "nothing"
.
Accessors
Create the accessors for fluid_oz_
 and drink_type_
.
Other information
Place the Cup
 class in cup.hpp
 and complete the code in main.cpp
.
Sample Output
What kind of drink can I get you?: Kool Aid How much do you want?: 32 Your cup currently has 32 oz. of Kool Aid Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: D How much do you want to drink from the cup?: 16 Your cup currently has 16 oz. of Kool Aid Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: D How much do you want to drink from the cup?: 6 Your cup currently has 10 oz. of Kool Aid Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: R How much do you want to refill your cup?: 2 Your cup currently has 12 oz. of Kool Aid Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: E Emptying your cup Your cup currently has 0 oz. of nothing Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: N What is the new drink you want?: Coke What is the amount you want?: 16 Your cup currently has 16 oz. of Coke Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: D How much do you want to drink from the cup?: 8 Your cup currently has 8 oz. of Coke Please select what you want to do with your drink/cup?: D: Drink R: Refill N: Get a brand new drink E: Empty X: Exit Selection: X Thank you for using Digicup!
Submission checklist
- Created function prototype and stored inÂ
.hpp
 file. - Created function implementation and stored inÂ
.cpp
 file (see reference). - Call function in the driver
- Compiled and ran the driver (
main
). - Manually checked for compilation and logical errors.
- Ensured no errors on the unit test (
make test
). - Followed advice from the stylechecker (
make stylecheck
). - Followed advice from the formatchecker to improve code readbility (
make formatcheck
).
Code evaluation
Open the terminal and navigate to the folder that contains this exercise. Assuming you have pulled the code inside of /home/student/labex02-tuffy
 and you are currently in /home/student
 you can issue the following commands
cd labex02-tuffy
You also need to navigate into the problem you want to answer. To access the files needed to answer problem 1, for example, you need to issue the following command.
cd prob01
When you want to answer another problem, you need to go back up to the parent folder and navigate into the next problem. Assuming you are currently in prob01
, you can issue the following commands to go to the parent folder then go into another problem you want to answer;Â prob02
 for example.
cd ..
cd prob02
Use the clang++
 command to compile your code and the ./
 command to run it. The sample code below shows how you would compile code saved in main.cpp
, and into the executable file main
. Make sure you use the correct filenames required in this problem. Take note that if you make any changes to your code, you will need to compile it first before you see changes when running it.
clang++ -std=c++17 main.cpp -o main
./main
You can run one, two, or all the commands below to test
 your code, stylecheck
 your code’s design, or formatcheck
 your work. Kindly make sure that you have compiled and executed your code before issuing any of the commands below to avoid errors.
make test
make stylecheck
make formatcheck
A faster way of running all these tests uses the all
 parameter.
make all
Shopping List
Create a ShoppingList
 class that has three data members: a std::string*
 list_
, an int
 num_items_
, and an int
 list_size_
.
ShoppingList
Default constructor
The default constructor should dynamically allocate list_
 to an array of std::string
 objects with a size 10, initialize num_items_
 to 0, and set list_size
 to 10.
Non-default constructor
The non-default constructor should receive one parameter: an int
 that is the size of the dynamically-allocated array of std::string
 assigned to list_
. The size from the parameter should also be assigned to list_size_
 and num_items
 should be set to 0.
Member functions
Accessors
Create accessor functions for num_items_
 and list_size_
.
add_item
Create a function add_item
 that receives an std::string
 and adds it to the first available location in the list.
Adding an item should also increment num_items_
 which is used to track the total number of items added to the array and, conveniently, stores the index for the next item.
If you attempt to add an item into a full list, you should display an error message Error! Shopping List full!
.
remove_last
Create a function remove_last
 that removes the last item from the list. Specifically, it sets the value of the last element to an empty string ""
 and decrements num_items_
.
print_list
Create a functionprint_list
 that prints all elements in the list. It provides the numbering for items. For example, given a list of three items, it might show:
1) Milk
2) Eggs
3) Flour
Destructor
Create a destructor that uses the delete []
 keyword to delete the list of shopping items. Don’t forget to set the list pointer to nullptr
 to avoid dangling references.
Other instructions
Store your ShoppingList
 class in list.hpp
. Member functions that take more than five lines or use complex constructs should have their function prototype in list.hpp
 and implementatiion in list.cpp
.
In main.cpp
, create a ShoppingList
 object using the non-default constructor where you pass it the value of 10. Add items to the shopping list according to the output below. Call the print_list
 function to display all items. The values are hard-coded and do not need to be retrieved from the user (no need for std::cin
). See main.cpp
 for more details.
Sample Output:
Shopping List:
1) Milk
2) Eggs
3) Flour
4) Sugar
5) Cocoa Powder
6) Vanilla
Submission checklist
- Created function prototype and stored inÂ
.hpp
 file. - Created function implementation and stored inÂ
.cpp
 file (see reference). - Call function in the driver
- Compiled and ran the driver (
main
). - Manually checked for compilation and logical errors.
- Ensured no errors on the unit test (
make test
). - Followed advice from the stylechecker (
make stylecheck
). - Followed advice from the formatchecker to improve code readbility (
make formatcheck
).
Code evaluation
Open the terminal and navigate to the folder that contains this exercise. Assuming you have pulled the code inside of /home/student/labex02-tuffy
 and you are currently in /home/student
 you can issue the following commands
cd labex02-tuffy
You also need to navigate into the problem you want to answer. To access the files needed to answer problem 1, for example, you need to issue the following command.
cd prob01
When you want to answer another problem, you need to go back up to the parent folder and navigate into the next problem. Assuming you are currently in prob01
, you can issue the following commands to go to the parent folder then go into another problem you want to answer;Â prob02
 for example.
cd ..
cd prob02
Use the clang++
 command to compile your code and the ./
 command to run it. The sample code below shows how you would compile code saved in list.cpp
 and main.cpp
, and into the executable file main
. Make sure you use the correct filenames required in this problem. Take note that if you make any changes to your code, you will need to compile it first before you see changes when running it.
clang++ -std=c++17 main.cpp list.cpp -o main
./main
You can run one, two, or all the commands below to test
 your code, stylecheck
 your code’s design, or formatcheck
 your work. Kindly make sure that you have compiled and executed your code before issuing any of the commands below to avoid errors.
make test
make stylecheck
make formatcheck
A faster way of running all these tests uses the all
 parameter.
make all
Player
Create a Player
 class with the following data members to represent a game character: xpos_
 that is an int
 representing their x position, ypos_
 that is an int
 representing their y position, name_
 that is an std::string
 representing the player’s name, and health_
, strength_
, and defense_
 which are all int
s representing the character’s attributes.
Default Constructor
Create a default constructor that initializes the following values to your data members:Â 0
 for the x position, 0
 for the y position, Ash
 for the name, 10
 for the health, 5
 for the strength and 2
 for the defense.
Non-Default Constructor
Create a non-default constructor that takes in 6 values: the name, the health, the strength, the defense, the x position, and the y position respectively. These should be used to initialize the corresponding data members.
Accessors & Mutators
Create accessors and mutators for all data members
Member functions
display_stat
Create a member function called display_stat
 that takes in no parameters and does not return anything. This member function should display the name of the player, the player’s health, the player’s strength, the player’s defense, and the player’s coordinates (x and y position). Look at the output provided below for an example.
player_move
Create a member function called player_move
 that takes in no parameters and does not return anything. This member function should increment the x position and the y position by a value of 1.
is_player_dead
Create a member function called is_player_dead
 that takes in no parameters and returns a bool
 value. This member function should check the player’s health. If the player’s health is equal to 0, then return true
, otherwise return false
.
take_damage
Create a member function called take_damage
 that takes in an int
 value for the damage taken and returns nothing. This member function should display a statement saying that the player took damage, and decrease the player’s health based on the damage taken.
If the damage taken is greater than the player’s current health, set the player’s health to 0 (the player cannot have negative health). This member function should call the is_player_dead
 function to check whether the player survives the attack. If the player is dead, display a statement saying that the player is dead. Look at the output provided below for an example.
Other instructions
Place the Player
 class inside player.hpp
. Member functions that take more than five lines or use complex constructs should have their function prototype in list.hpp
 and implementatiion in list.cpp
.
The main
 function is already provided for you. Do not edit the main.cpp
 file.
Sample output
Player: Ash
Health: 10
Strength: 5
Defense: 2
At position: (10, 10)
Player: Les
Health: 20
Strength: 10
Defense: 6
At position: (0, 0)
Ash took 25 damage
Ash is dead
Player: Ash
Health: 0
Strength: 5
Defense: 2
At position: (10, 10)
Submission checklist
- Created function prototype and stored inÂ
.hpp
 file. - Created function implementation and stored inÂ
.cpp
 file (see reference). - Call function in the driver
- Compiled and ran the driver (
main
). - Manually checked for compilation and logical errors.
- Ensured no errors on the unit test (
make test
). - Followed advice from the stylechecker (
make stylecheck
). - Followed advice from the formatchecker to improve code readbility (
make formatcheck
).
Code evaluation
Open the terminal and navigate to the folder that contains this exercise. Assuming you have pulled the code inside of /home/student/labex02-tuffy
 and you are currently in /home/student
 you can issue the following commands
cd labex02-tuffy
You also need to navigate into the problem you want to answer. To access the files needed to answer problem 1, for example, you need to issue the following command.
cd prob01
When you want to answer another problem, you need to go back up to the parent folder and navigate into the next problem. Assuming you are currently in prob01
, you can issue the following commands to go to the parent folder then go into another problem you want to answer;Â prob02
 for example.
cd ..
cd prob02
Use the clang++
 command to compile your code and the ./
 command to run it. The sample code below shows how you would compile code saved in player.cpp
 and main.cpp
, and into the executable file main
. Make sure you use the correct filenames required in this problem. Take note that if you make any changes to your code, you will need to compile it first before you see changes when running it.
clang++ -std=c++17 main.cpp player.cpp -o main
./main
You can run one, two, or all the commands below to test
 your code, stylecheck
 your code’s design, or formatcheck
 your work. Kindly make sure that you have compiled and executed your code before issuing any of the commands below to avoid errors.
make test
make stylecheck
make formatcheck
A faster way of running all these tests uses the all
 parameter.
make all
Advanced Student Class
Create a Student
 class that has four data members: an std::string
 name_
, an int
 id_
, an int[]
 grades_
, and an int
 num_grades_
. The grades array will have a capacity of 10 elements.
Create a default constructor that sets name_
 to “Stu Dent”, id
 to 123456789, grades_
 empty, and num_grades_
 to 0.
Create a non-default constructor that receives an std::string
 and an int
 for the student’s name and id, respectively. Remember to set num_grades_
 to 0 as well.
Create accessor and mutator functions for name_
, id_
, and num_grades_
.
Create a function called add_grade
 that receives an int
 and adds it to the grades_
 array if there is space. The grade should not be added to the array if it exceeds 10 and displays the error message: Array full, unable to add grade
.
Create another function called calculate_grade
 that returns the average of the grades as a double
. Take note that if the user added fours grades, then the function should return the average of those four grades only.
Finally create a function called print_student
 that prints the student’s name and all their grades.
The main.cpp
 has already been created for you. It creates a Student
 object, adds grades to it, calls the print_student
 function, then prints the student’s total grade. You do not need to modify main.cpp
.
Place your class in student.hpp
. Member functions that take more than five lines or use complex constructs should have their function prototype in student.hpp
 and implementation in student.cpp
.
Sample Output:
Lonnie Hansen 965137824
Test Grades:
95
88
92
77
84
Total grade = 87.20
Submission checklist
- Created function prototype and stored inÂ
.hpp
 file. - Created function implementation and stored inÂ
.cpp
 file (see reference). - Call function in the driver
- Compiled and ran the driver (
main
). - Manually checked for compilation and logical errors.
- Ensured no errors on the unit test (
make test
). - Followed advice from the stylechecker (
make stylecheck
). - Followed advice from the formatchecker to improve code readbility (
make formatcheck
).
Code evaluation
Open the terminal and navigate to the folder that contains this exercise. Assuming you have pulled the code inside of /home/student/labex02-tuffy
 and you are currently in /home/student
 you can issue the following commands
cd labex02-tuffy
You also need to navigate into the problem you want to answer. To access the files needed to answer problem 1, for example, you need to issue the following command.
cd prob01
When you want to answer another problem, you need to go back up to the parent folder and navigate into the next problem. Assuming you are currently in prob01
, you can issue the following commands to go to the parent folder then go into another problem you want to answer;Â prob02
 for example.
cd ..
cd prob02
Use the clang++
 command to compile your code and the ./
 command to run it. The sample code below shows how you would compile code saved in student.cpp
 and main.cpp
, and into the executable file main
. Make sure you use the correct filenames required in this problem. Take note that if you make any changes to your code, you will need to compile it first before you see changes when running it.
clang++ -std=c++17 main.cpp student.cpp -o main
./main
You can run one, two, or all the commands below to test
 your code, stylecheck
 your code’s design, or formatcheck
 your work. Kindly make sure that you have compiled and executed your code before issuing any of the commands below to avoid errors.
make test
make stylecheck
make formatcheck
A faster way of running all these tests uses the all
 parameter.
make all
Find Number
Create a class called Numbers
. Create two data members, an int*
 values_
 that points to a dynamically allocated array of numbers and an int
 capacity_
 that stores the total number of elements that the array can hold.
Default Constructor
Create a default constructor that initializes (sets) the value of 10 to capacity_
 and initializes a new dynamically allocated array with a capacity of 10. It should call the init
 function inside the body of the constructor.
Non-default Constructor
Create a non-default constructor that accepts an int
 parameter that is assigned to capacity_
 that is used as the capacity of the dynamically allocated array. It should also call the init
 function inside the body of the constructor.
Destructor
Create a destructor that deletes the dynamically allocated array and initializes the pointer to nullptr
.
Accessor
Create an accessor for capacity_
.
Member functions
init
The implementation of the init
 member function is already provided for you. You only need to create it’s function prototype in find_number.hpp
. This function should be a private member function that sets initial values of your dynamically allocated array according to the capacity.
display_array
Create a member function display_array
 that displays the contents of the array, as shown in the output below.
2 4 6 8 10 12 14 16 18 20
find_number
Create a member function find_number
 that takes in an int
 parameter representing the number you want to find. It should check to see if the array contains the number that is passed. If the number is present, then display a statement saying that the number is in the array as shown in the the output below.
2 is in the array
Other instructions
The main function is already given to you. Do not edit main.cpp
, but place your Numbers
 class in find_number.hpp
. Member functions that take more than five lines or use complex constructs should have their function prototype in find_number.hpp
 and implementation in find_number.cpp
.
Sample Output
2 4 6 8 10 12 14 16 18 20
2 is in the array
10 is in the array
16 is in the array
Submission checklist
- Created function prototype and stored inÂ
.hpp
 file. - Created function implementation and stored inÂ
.cpp
 file (see reference). - Call function in the driver
- Compiled and ran the driver (
main
). - Manually checked for compilation and logical errors.
- Ensured no errors on the unit test (
make test
). - Followed advice from the stylechecker (
make stylecheck
). - Followed advice from the formatchecker to improve code readbility (
make formatcheck
).
Code evaluation
Open the terminal and navigate to the folder that contains this exercise. Assuming you have pulled the code inside of /home/student/labex02-tuffy
 and you are currently in /home/student
 you can issue the following commands
cd labex02-tuffy
You also need to navigate into the problem you want to answer. To access the files needed to answer problem 1, for example, you need to issue the following command.
cd prob01
When you want to answer another problem, you need to go back up to the parent folder and navigate into the next problem. Assuming you are currently in prob01
, you can issue the following commands to go to the parent folder then go into another problem you want to answer;Â prob02
 for example.
cd ..
cd prob02
Use the clang++
 command to compile your code and the ./
 command to run it. The sample code below shows how you would compile code saved in find_number.cpp
 and main.cpp
, and into the executable file main
. Make sure you use the correct filenames required in this problem. Take note that if you make any changes to your code, you will need to compile it first before you see changes when running it.
clang++ -std=c++17 main.cpp find_number.cpp -o main
./main
You can run one, two, or all the commands below to test
 your code, stylecheck
 your code’s design, or formatcheck
 your work. Kindly make sure that you have compiled and executed your code before issuing any of the commands below to avoid errors.
make test
make stylecheck
make formatcheck
A faster way of running all these tests uses the all
 parameter.
make all