Basics of C/C++ Programming
Introduction
Lecturers
Rait Liiv: rait.liiv@itcollege.ee
Janno Tomingas: janno.tomingas@itcollege.ee
Video recordings of lectures and practices
Descending date order.
https://echo360.org.uk/media/c002b483-d428-4249-842a-9e92fdebfce8/public
https://echo360.org.uk/media/7efb0957-f384-4eb1-85ad-dd713fe4d65d/public
https://echo360.org.uk/media/bba448ab-8a38-405c-b2a2-5353e227265f/public
https://echo360.org.uk/media/df9ae848-a582-4ba2-999a-8df18d3132c6/public
https://echo360.org.uk/media/02aa7ba3-4bcc-4ace-b676-fd04b58eeff8/public
https://echo360.org.uk/media/8c1485c5-61f3-4062-851d-916906503fd3/public
https://echo360.org.uk/media/2e7e5c6a-10af-4b8c-8303-2e6e4650a206/public
https://echo360.org.uk/media/3917eeef-a127-4338-85e5-207d692504b7/public
https://echo360.org.uk/media/54f0ef26-6ef2-4bc7-9637-c3cde6a27aaa/public
https://echo360.org.uk/media/e099b072-a8ab-4c4b-9c3e-532715cc2d7e/public
https://echo360.org.uk/media/6f39d546-5572-4cda-ad97-e61b968506ff/public
https://echo360.org.uk/media/c02ce02d-9e01-45dd-9f54-3be66a1dc2b2/public
https://echo360.org.uk/media/2cb53a4e-f2b7-44b7-9bd6-93d90b26043b/public
https://echo360.org.uk/media/d366f877-b4ae-4fcc-a90c-0d433772252a/public
https://echo360.org.uk/media/35cd1108-141b-4a1a-8fb2-63e5f3a5b766/public
https://echo360.org.uk/media/befc74e4-5873-4c34-a65f-84ebd00e3370/public
https://echo360.org.uk/media/c3a24815-2b5c-4e3c-8649-bebde59784a3/public
Code from lectures
http://enos.itcollege.ee/~rliiv/
C
Practices
Practice 1
Console input/output, conditions, loops, pointers, arrays, functions
Practice 2
File input/output, dynamic memory allocation, structs, .h/.c files
Additional info:
Always close the file stream after you are done using it.
Make sure to check for error codes.
2. Write a program that dynamically allocates a small array of ints. Fill the array and print its contents. Free the memory after you're done using it.
Additional info:
Use "fseek", "ftell" and "rewind" to find out how large the buffer should be.
Make sure you have enough room for a null terminator. (You may have to assign it to the end of the array yourself)
Remember to free the allocated memory after calling malloc or calloc.
Make sure to check for error codes.
4. Create an implementation of a stack data structure (Stack (abstract data type)) that uses a dynamically allocated array for storage.
- Required functions:
- init - Initializes stack's variables and allocates required dynamic memory with an initial(default) size,
- destroy - Frees all allocated memory and optionally resets other stored information for a stack,
- push - Adds an element to the top of the stack,
- peek - Gets the top element of the stack,
- pop - Gets and removes the top element of the stack;
- Describe the stack struct and functions in a separate .h file,
- Implement the functions in a corresponding .c file,
- Test your stack with some operations. Remember to check for edge cases;
- How do you know which element to access?
- How do you know if an array is full?
- How should the functions behave when a stack is empty?
- How should the functions behave when a stack is full?
- What will happen if any of the functions are called many times or in unexpected order?
5. Write a program that reads an unknown number of integers (each on a separate line) from a file into the stack you created. After reading the whole file, print out all ints that were read (in reverse order).
Practice 3 (first half)
insertion sort, sorting structs
1. Implement insertion sort to sort an array of integers in ascending order.
2. Create a struct to hold integral key-value pairs. Modify the insertion sort algorithm to sort an array of these structs instead.
Assignment
Write a program that reads values from a file and outputs the result to stdout.
Input
Input file's name is "input.txt".
The file contains index-value pairs of integers on a single line. Integers in a pair are separated with a comma (,) and pairs are separated with a semicolon (;).
All indices between 0 and (count_of_pairs - 1) are guaranteed to be present.
The indices are guaranteed to be unique.
The indices are not guaranteed to appear in an ascending order.
Sample input: 1,4;0,2;2,8
Output
The program should output the differences between consecutive values as the index increases.
Output should be printed as a comma separated list of values on a single line to stdout.
For input:
0,1;2,4;1,2
Calculates:
0,1 to 1,2 -> 2 - 1 = 1 1,2 to 2,4 -> 4 - 2 = 2
And outputs:
1,2
Examples
-> 0,2 -> 0 1,2;0,1 -> 1 1,4;0,2;2,8 -> 2,4 1,4;0,2;2,-2 -> 2,-6
C++
Practices
Practice 3 (second half)
C++ console i/o, std::string, std::vector, references, range based for, auto
1. Write a Hello, World! program in C++
2. Write a program that performs an addition operation based on user input. A sample input string: "2+2".
3. Write a program that asks the user for his name, stores it in an std::string and outputs the name back to the console window.
4. Write a program that asks the user for several strings and stores them in an std::vector. Upon receiving the last string, the program should output all strings in the order they were received.
5. Modify the last program by adding a function to modify a string by reference. Use that function on all input strings.
6. Modify the last program to output the strings using a range based for loop. Bind the values to an auto&.
Practice 4
file i/o, command line parameters, new/delete, classes, constructors/destructors, smart pointers
1. Read strings from a file into a std::vector<std::string>, then print them out to another file.
2. Modify the last program to read two file names from the command line and use these file names for files.
3. Create a class that logs its creation and destruction via std::cout. Use a custom defined constructor and destructor for that. Observe how actions are logged in different scenarios of instance creation and destruction, including smart pointers.
Practice 5
dynamic inheritance, (constructor) overloading, simple templates
1. Dynamic inheritance
- Create a base class for several shape types, called Shape with:
- virtual default destructor
- an abstract function that returns the Shape's area
- an abstract function that returns the Shape's name
- Create classes Rectangle and Shape that override the Shape and implement its methods
- Use the classes in an std::vector<std::unique_ptr<Shape>> to find the names and areas of several mixed Shapes
- Add an overloaded constructor to Rectangle that enables the user to customize the name of some Rectangles
2. Exercise
- Create a hierarchy of Animals similarly to the Shapes (with animal names and sounds)
- Provide an overloaded constructor for some Animal
3. Simple templates
- Create a Queue of ints, that uses an std::deque as an underlying datatype
- Provide methods to queue and dequeue values
- Convert the Queue to a template class
4. Exercise
- Create an Accumulator of ints
- stores an int as a member variable
- initial value of the accumulator is specified via the constructor
- has a member function that adds a value to the stored value (using the operator +=)
- has a member function that fetches the stored value
- Template the Accumulator to store and add any type of values
- (optional) Create a class Distance that can be used with the Accumulator
- wraps some value (like an int or a double) in a class
- overloads the operator+=
Assignment
Pizza Shop:
Write a program that calculates the prices for pizzas and tells the pizza shop owner if they have enough ingredients to fill the order.
You are provided 3 files: recipes.json, ingredients.json and prices.json. These are all example files and your code must work with any kind of such file that matches the object syntax.
Each file contains a list of objects whose schema is defined below.
Prices contains the ids and prices for each price.
Ingredients contains the names, stock counts (total available quantity) and priceTypes for each ingredient - this is the amount of ingredients available for you during one program run. Ingredient priceType is matched with a Price from prices.json file (match them by their id number).
Recipes contains pizzas with ingredients - these are the same ingredients as in ingredients.json file (match them by their name).
Your program must read all .json files and provide console input where you can enter a pizza (pizza name) to be made. You can make any number of pizzas (at least until there are enough ingredients left).
Program usage:
1. Console asks for pizza name to be made
2. User enters pizza name
3.a. When the pizza can be made (is made):
Print to console the total price of the pizza.
Ingredients used must be taken off your stock.
3.b. When the pizza cannot be made:
Print out which ingredients are missing and how many.
4. --Return to step 1--
Datatypes (schema):
Pizza:
name - string
ingredients - list of strings
Ingredient:
name - string
quantity - integer
priceType - integer
Price:
id - integer
price - double