Book Corecpp
Book Corecpp
Computer Science
Concepts
Summer 2024
CS 200: Concepts of Programming using C++
(Summer 2024 version)
Contents
2 Reference 7
2.1 C++ quick reference . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Basic computer skills . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Common C++ bugs and issues . . . . . . . . . . . . . . . . . . . 17
2.4 Code and UI style guide . . . . . . . . . . . . . . . . . . . . . . . 23
2.5 How to use VSCode . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.6 How to install Git . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3 Syllabus 43
3.1 Course information . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2 Course policies . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3 Additional information . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4 Course catalog info . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5 Reading 72
5.1 Unit 00: Welcome and setup . . . . . . . . . . . . . . . . . . . . . 72
5.2 Unit 01: Tech Literacy: Exploring computers . . . . . . . . . . . 78
5.3 Unit 02: C++: Variables, pointers, input, and output . . . . . . 93
5.4 Unit 03: C++: Functions . . . . . . . . . . . . . . . . . . . . . . 115
5.5 Unit 04: Tech Literacy: Debugging, testing, and researching . . . 131
5.6 Unit 05: C++: Structs . . . . . . . . . . . . . . . . . . . . . . . . 139
2
5.7 Unit 06: Tech Literacy: Careers in tech . . . . . . . . . . . . . . 145
5.8 Unit 07: C++: Looping . . . . . . . . . . . . . . . . . . . . . . . 153
5.9 Unit 08: C++: Arrays and vectors . . . . . . . . . . . . . . . . . 166
5.10 Unit 09: C++: Branching . . . . . . . . . . . . . . . . . . . . . . 182
5.11 Unit 10: C++: Searching and sorting . . . . . . . . . . . . . . . 190
5.12 Unit 11: Tech Literacy: Current trends in tech . . . . . . . . . . 200
5.13 Unit 12: Tech Literacy: Object Oriented Programming . . . . . . 207
5.14 Unit 13: C++: Classes and Inheritance . . . . . . . . . . . . . . 213
5.15 Unit 14: C++: Strings and File I/O . . . . . . . . . . . . . . . . 239
5.16 Unit 15: Tech Literacy: Ethics in tech . . . . . . . . . . . . . . . 254
5.17 Unit 16: C++: Intro to recursion . . . . . . . . . . . . . . . . . . 255
5.18 End of the semester . . . . . . . . . . . . . . . . . . . . . . . . . 267
Rachel Wil Sha Singh's Core C++ Course © 2024 by Rachel Wil Sha Singh
is licensed under CC BY 4.0. To view a copy of this license, visithttp://
creativecommons.org/licenses/by/4.0/
3
1 Navigating this course
4
The best way to contact me is via the in-Canvas email system, not through
@jccc email.
I also have a Discord char server for their classes, feel free to join in order
to ask questions. The join link is here: https://discord.gg/A2mgwrUeAj
We can also schedule time to meet on campus or via Zoom based on your
availability.
You can retake the exams but you need to email me in order for me
to unlock the exam for you. Exams are built randomly from a pool of
questions.
Since this is the summer semester you will need to gure out a schedule
of how many modules you want to tackle per week. I have a suggested
schedule a little later on.
5
1.1 Recommended Summer 2024 schedule
This schedule is recommended, but the modules are available whenever you
meet the prerequisites for any of them.
6
2 Reference
Assign a value to a variable that has already been declared: VAR = VALUE;
vipStudent = student3;
Output text to the console: cout << ITEM << ITEM << endl;
You can mix variables (VAR) and string literals ("HI"), as long as the
stream operator << is between each item.
Get input from the keyboard and store it in a variable: cin >> VAR;
Get a full line of text and store in a string: getline( cin, VAR );
Only works with string variables.
Note that if you have a cin >> statement immediately before the
getline statement, your input will get skipped. In this case you need
to add a cin.ignore() statement:
7
Branching
If statements:
If: If the condition evaluates to true, then execute the code within
the if statement. Otherwise, skip that code completely.
8
Switch statements
Switch statement: switch( VARIABLE ) { case VALUE: break; }
The switch variable can be int, char, but not string.
switch( myNumber )
{
case 1: cout << "It's one!" << endl; break;
case 2: cout << "It's two!" << endl; break;
default: cout << "I don't know what it is!" << endl;
}
Looping
Conditional loops:
For loops:
9
Arrays
Declare a traditional C-style array: DATA_TYPE ARRAY_NAME[SIZE];
When declaring a vanilla array, you need to set its size. You can
either hard-code the size with a number or use a named constant.
// read a word
input >> buffer;
// read a line
getline( input, buffer );
10
Create an output le and write with ofstream (output le stream)
Create an input le and read with ifstream (input le stream)
Prevent le duplication with File Guards: When creating .h/.hpp les,
it is important to include these lines to prevent le duplication, which
happens if you #include this le in more than one place.
#endif
DisplayMenu();
int num1 = 2;
int num2 = 5;
int result = Sum( num1, num2 ); // Passing in variable values
11
Classes
Declaring a class: Remember that classes must end with ; on their closing
curly brace!
// Member functions
private: void Setup( string new_name, float new_gpa );
void Display();
};
private:
// Member variables
string name;
float gpa;
};
// Function definition
void Student::Setup( string name, float gpa )
{
m_name = name;
m_gpa = gpa;
}
12
Getter function, aka Accessor:
Returns the value of the member variable (return type should match
the member variable)
Takes in an input value for a new value for the member variable -
parameter should have the same data type as the member variable
Setter functions should include any needed error checking and reject
invalid data
Pointers
Declare a pointer: DATATYPE* PTRNAME = nullptr;
Assign an address to a pointer: PTRNAME = &VARIABLE;
Pointer variables store addresses as their value. To get the address
of a variable, prex the variable name with the address-of operator
&.
Dereference a pointer: *PTRNAME
Dereference an object pointer and access a member variable: PTRNAME->MEMBER
// DECLARING POINTERS
int * ptrInt = nullptr;
string * ptrString = nullptr;
13
// SETTING POINTERS TO ADDRESSES
string name = "Bob"; // Normal variable
string * ptrName = &name; // Pointer
// DEREFERENCING POINTERS
cout << *ptrName; // Display contents that pointer is pointing to
cin >> *ptrName; // Overwrite contents that pointer is pointing to
// POINTERS TO OBJECTS
Student* newStudent = new Student;
newStudent->name = "Hikaru";
cout << "Student name: " << newStudent->name << endl;
14
2.2 Basic computer skills
How to take a screenshot:
In Windows Press PRINTSCREEN on your keyboard, then go to an
image editing application (Paint, if you have nothing else) and use
EDIT > PASTE to paste the image in.
15
Project working directory: It is important to keep in mind that the
default working directory of our programs is the location where the project
le is.
When building and running from the command line (or VS Code
Terminal), the working directory should be the folder you're running
the program from.
For Visual Studio, the working directory is the same location as your
project .vcxproj le.
* Paste:
You can paste copied/cut text by using EDIT > PASTE
CTRL+V.
or
Up and down
* HOME: The HOME key on your keyboard will take you to the
top of a webpage. For a text document use CTRL+HOME to
go to the top.
* END: The END key on your keyboard will take you to the
bottom of a webpage. For a text document use CTRL+END
to go to the bottom.
Highlighting text
* Double-click a word with your mouse to auto-highlight the entire
word.
16
2.3 Common C++ bugs and issues
Common build errors
Undened Reference to WinMain
Try:
Undened reference to . . .
Try: Check to make sure you don't have any typos, that your vari-
ables have been declared, that your #include are set up properly,
and that any functions declared also are dened elseware.
Explanation: You're trying to use a variable XYZ but you have not
declared it at this point in the program.
Try: Look for your variable declaration and make sure it shows up
before any code that uses this variable.
Try: Look at class' parent - for any pure virtual functions (e.g.,
virtual RETURN FUNC() = 0;), make sure you have declared and
dened them in the child class.
17
Cannot convert from ABC to XYZ
Explanation: The program is expecting an XYZ data type in a loca-
tion where you're giving it an ABC type instead.
Try: If you're working with a class object, perhaps you need to pass
a member variable of that class object instead?
Try:
Try: Don't forget to put #include <fstream> in the code les where
you're using ifstream or ofstream.
Fixes:
18
Visual Studio: Fatal error LNK1104: cannot open le . . . exe
Explanation: Visual Studio is trying to build the program but cannot
overwrite the .exe le.
Fixes:
* OR Turn o your virus scan - Sometimes your virus scan will see
the .exe le you just built as an unknown threat and prevent
it from opening, which also causes this error.
19
XCode: Cannot nd functions
You will need to set up a Working Path for your projects in XCode.
You can get to this option by going to the menu bar: Scheme ->
Edit Scheme. You will want to set your working directory to a
specic path where you can locate the text les.
20
Git issues
Git: There is no tracking information for the current branch.
$ git pull
There is no tracking information for the current branch .
Please specify which branc you want to merge with .
See git - pull (1) for details .
Explanation: Git isn't sure what branch you're working with; tell it
explicitly.
Explanation: There are changes on the server that you don't have on
your local machine yet. A merge needs to happen.
Try: The hint gives you the solution: Run git pull and then repeat
your git push after the merge.
Git: fatal: not a git repository (or any of the parent directories):
.git
$ git status
fatal : not a git repository ( or any of the parent
directories ) : . git
Explanation: You are not running your git commands from within a
repository folder.
Try: Make sure you open Git Bash within a folder, or use the cd
commands to navigate to your repository path.
21
Git: error: Browse.VC.opendb Permission denied
error : open ("..../ Browse . VC . opendb ") : Permission denied
error : unable to index file '.../ Browse . VC . opendb '
fatal : adding files failed
22
2.4 Code and UI style guide
Repository management
For your course folder, lab assignments should be labeled clearly and con-
sistently (e.g., u02_TopicABC, u03_TopicXYZ)
Sync (add / commit / pull / push) frequently, and especially before
starting a new assignment.
Your merge request should only contain les related to the current feature
or project you're working on It shouldn't contain code from multiple
assignments.
My Program
_
My Program
Please enter pet name : _
NO:
MAIN MENU
N . New game
L . Load game
S . Save game
X . Exit
YES:
MAIN MENU
1. New game
2. Load game
3. Save game
0. Exit
23
Validate user input:
YES:
Your selection : 2
Naming conventions
Additionally:
Best practices
Basics
24
Don't put an entire program in main() - Split out the pro-
gram into separate menu functions; ideally use a Program class that
contains functions within it.
Naming conventions
Arrays
Do not use a variable for an array's size; some compilers might sup-
port this but not all do. Traditional C arrays and STL arrays must
have hard-coded integer literals or named constant integers as its
size.
Functions
Structs should be used for structures that only contain a few amount
of variables and no functions. Classes should be used for more so-
phisticated structures that contain functions and variables.
try/catch
The try{} statement should wrap the most minimal amount of code
(NOT THE ENTIRE FUNCTION BODY!) - generally, try
should wrap the one function that could throw an exception.
25
The system("cls"); command only works on Windows
1 void ClearScreen ()
2 {
3 # if defined ( WIN32 ) || defined ( _WIN32 ) || defined
( __WIN32 ) && ! defined ( __CYGWIN__ )
4 system ( " cls " ) ;
5 # else
6 system ( " clear " ) ;
7 # endif
8 }
File guards: Always use ifndef instead of pragma once for your le
guards.
YES:
1 # ifndef _MYFILE_H
2 # define _MYFILE_H
3
4 // My code
5
6 # endif
NO:
1 # pragma once
2
3 // My code
26
File organization
Function/class declarations
Function and class declarations should go in a header (.h) le.
Function denitions
Function denitions should go in a source (.cpp) le, EXCEPT TEM-
PLATED FUNCTIONS (those all go in .h).
Each class/struct should have its own set of .h and .cpp (as
needed) les
Don't put multiple class declarations in one le.
Clean code
Erase unused codeblocks
If you want to make sure to be able to reference old code later, back
it up to GitLab, then delete the comment. Don't leave commented
out code blocks in turn-in assignments.
Whitespace
Adequate whitespace should be used to dierentiate logical sections
of code.
At the same time, don't use too much whitespace. The goal is to have
readable code.
27
If ( true ) return true; else return false;
NO:
1 if ( a == b )
2 return true ;
3 else
4 return false ;
YES:
1 return ( a == b ) ;
Curly braces
Follow the existing code base
If you're writing code from scratch you can follow whatever style
you'd like as long as it is consistent.
When working with existing code-bases, use the same style as the
existing code.
Preferred style:
1 if ( a == b )
2 {
3 DoThing () ;
4 }
GNU styling:
1 if ( a == b )
2 {
3 DoThing () ;
4 }
28
One-line contents
NO:
1 if ( CONDITION )
2 DoThingA () ;
3 else if ( CONDITION2 )
4 DoThingB () ;
5 else
6 DoThingC () ;
YES 1:
1 if ( CONDITION )
2 {
3 DoThingA () ;
4 }
5 else if ( CONDITION2 )
6 {
7 DoThingB () ;
8 }
9 else
10 {
11 DoThingC () ;
12 }
YES 2:
1 if ( CONDITION ) { DoThingA () ; }
2 else if ( CONDITION2 ) { DoThingB () ; }
3 else { DoThingC () ; }
29
Bad user interface examples
Try to space out a program's output by "section" in the program. Don't
just barf out all the information to the screen. Sometimes, not all information
is required on a given screen.
BAD FIXED
################################ #################################
# NEW RECIPE # # NEW RECIPE #
############## ##############
Enter new recipe name: PB Cups
Enter URL: asdf.com Enter new recipe name: PB Cups
How many ingredients? 2 Enter URL: asdf.com
Ingredient name: How many ingredients? 2
Peanut-Butter
Ingredient unit: INGREDIENT 1:
cups - Name: Peanut butter
Ingredient amount: - Unit of measurement: cups
30 - Amount: 2
Ingredient name:
Chocolate INGREDIENT 2:
Ingredient unit: - Name: Chocolate
cups - Unit of measurement: tbsp
Ingredient amount: - Amount: 5
10
Recipe added successfully.
30
2.5 How to use VSCode
Installing and conguring VSCode
On the VSCode website you can download the program for free.
Website: https://code.visualstudio.com/Download
Select your operating system, the big blue button on top is ne, or you
can select one of the smaller buttons for more rened options.
31
Cloning your course repository
Once you have a GitLab account, the instructor will set up a course
repository for you. This is a folder on a server where you can keep your
work backed up. You can sync between the les on your desktop and any
changes on the server (the instructor may add new les or make updates
to your code to add comments).
Go to your GitLab repository webpage and locate the blue code but-
Clone with HTTPS.
ton. Click on it, then copy the URL underneath
Clone repository:
Within VSCode, click on the icon on the left that looks like a node
branching into two nodes. This is the source control tab. Click on the
Clone Repository button.
32
Clone in VS Code:
A little box will pop up at the top of VSCode asking for arepository
URL. Paste the copied URL from the website here, then hit enter.
Select repository destination:
It will ask you to set a destination for your course folder. I would sug-
gest putting in in your Documents or Desktop. Once you've found a
location, click the Select as Repository Destination button.
View on computer:
Once it's been cloned, you will be able to see the folder on your computer
under the le explorer. You will work from this directory.
33
As you work through assignments you will periodically back up your work
and sync it with the server, but we will cover that later on.
Once you're ready to start programming, from the File menu, select Open
Folder. . . .
Select folder:
34
Project view:
You will be able to see all the contents of your repository on the left side.
The left view shows you all of the folders and les within the folder you
opened.
You can double-click one of the folders (which have a > to its left) to open
it and you can see the code within the folder. If you double-click a le it
will open it in the editor view.
The right view shows the currently opened code le. You can edit your
code in this view.
35
VSCode terminal
View > Terminal:
To open the terminal, click on the View dropdown from the top menu
and select Terminal.
The Terminal is a text interface, we will use some basic commands to
work with our code. The terminal has a prompt, which displays the
current folders that you're inside of (called the path), and ends with a >
sign. You can type commands after the >.
36
Command: ls - LiSt les and folders
If you type ls (that is a lower-case L and S) and hit ENTER, it will show
you the les and folders in this location.
37
Building your C++ program
Every time you make a change to your C++ source code you will have to
compile (aka build) the code into an executable (.exe) le. To do this,
we use the g++ compiler program.
To run the program, we list the program name rst (g++) then give it any
options after a space. For g++, the option will be the code le we want
to build:
If the build is successful, g++ won't give you any messages and just return
you to the prompt to enter a new command. However, if there are syntax
errors in your code, it will display the errors afterwards. You will need to
x any syntax errors in order to get the program to build.
To run the program, use the ./PROGRAMNAME command, this runs your
program. By default, g++ generates a a.exe or a.out le, so to run you
would use ./a.exe or ./a.out:
Once you've made any changes to your repository, under the Source Con-
trol tab (the branching icon), it will show a little notication bubble with
a number in it.
38
From this page, you can back up your changes. In the little text box, add
a useful message to keep note of what you changed (e.g., "Fixed bug with
input", "Finished with u02 lab"), then click the Commit button to make
a backup snapshot.
After a commit, the button turns into a Sync Changes button. This will
send your changes to the server for long-term storage. You will also need
to save your les on the server so that the instructor can see your work.
You can click it any time you're doing a commit to back up your work.
39
Once you've synced your work, on the GitLab repo website you will be
able to see your latest commit message:
If you click on the folder and le that you edited you will be able to see
the updates online as well:
40
2.6 How to install Git
Installing Git
The Git software is PC software that allows you to interact with a Git server.
On the "Choosing the default editor used by Git", just select Notepad,
or any other program you recognize there.
Open VS Code and open up the terminal by going to View > Ter-
minal:
41
Enter each of the following commands in the terminal. (Replace
"[email protected]" with your email address)
42
3 Syllabus
Prerequisites (CS 134 with a grade of "C" or higher or CIS 142 with a grade
of "C" or higher or department waiver test and MATH 131 or higher) or
MATH 241 or department approval.
Drop deadlines To view the deadline dates for dropping this course, please
refer to the schedule on the JCCC website under Admissions>Enrollment
Dates> Dropping Credit Classes. After the 100% refund date, you will
be nancially responsible for the tuition charges; for details, search on
Student Financial Responsibility on the JCCC web page. Changing your
schedule may reduce eligibility for nancial aid and other third party fund-
ing. Courses not dropped will be graded. For questions about dropping
courses, contact the Student Success Center at 913-469-3803.
Auto-withdraws Attendance for the rst week of classes at JCCC are recorded
and students marked as NOT IN ATTENDANCE get auto-withdrawn
from the course. Please pay attention to course announcements / emails
from the instructor for instructions on how to make sure you are marked
as IN ATTENDANCE.
Instructor information
Name: Rachel Wil Singh, aka R.W. (they/them)
Oce: RC 348 H
43
Course delivery
This course is set up as an Online course. This means the following:
You can utilize oce hours to meet with the instructor, ask questions,
and get help.
To see more about JCCC course delivery options, please visit: https://
www.jccc.edu/student-resources/course-delivery-methods.html
Oce hours
Over the summer semester, oce hours are optional. You can schedule a
time to meet with me on campus or via Zoom (Zoom preferred), just send me
an email.
Class communication
Please use Canvas email, not the @jccc email, to contact the in-
structor! I rely upon the Canvas email system for communication with
students and only students. The direct @jccc email address also receives
non-student communication such as automated campus updates, depart-
ment emails, commitee emails, and so on. To ensure that I see your email
in a timely manner, please email me via Canvas!
3. Tools: We will go over how to set this up during rst week assignments.
WINDOWS: MinGW
44
LINUX/MAC: g++
VS Code
4. Accounts: See the UNIT 00 SETUP assignments for steps on set up.
Installing software
Running software
Taking screenshots
Sending emails
Uploading attachments
Learning skills - Learning to program takes a lot of reading, and you will
be building up your problem solving skills. You should be able to exercise the
following skills:
Organizing your notes so you can use them for reference while coding.
Learning how to ask a question - Where are you stuck, what are you stuck
on, what have you tried?
45
Managing your time to give yourself enough time to tackle challenges,
rather than waiting until the last minute.
Exams: Mastery Checks to help the student and instructor assess how
much about a topic has been learned (40%)
Final letter grade: JCCC uses whole letter grades for nal course grades:
F, D, C, B, and A. The way I break down what your receive at the end of the
semester is as follows:
46
3.2.2 Tentative schedule
This schedule is recommended, but the modules are available whenever you
meet the prerequisites for any of them.
On Canvas you will have access to a set amount of modules, with a Mas-
tery Check milestone gating access to subsequent modules. Each Mastery
Check includes one exam and one project.
If you score below 70% (after the write-in questions have been graded) you
can retake the exam but you need to reach out to me to unlock it again.
47
Exams are randomly built from a pool of questions, so each attempt will
be a little dierent.
Grade scoring:
As you progress through the course and nish more course content, your
grade will continue rising. Ideally, if you get 100% on all assignments in
the course, you'll end with 100% as your nal grade.
Assignments don't close until the last day of class - July 25th. See the
Academic Calendar (https://www.jccc.edu/modules/calendar/academic-calendar.
html) if needed.
48
Use your IDE (replit, visual studio, code::blocks) to test out things
before answering questions.
Not OK Things:
Sharing your code les with other students, or asking other students
for their code les.
Don't give your code les to other students, even if it is "to verify
my work!"
The best way to contact the instructor is via Canvas' email system.
You can also email the instructor at [email protected], however,
emails are more likely to be lost in the main inbox, since that's where
all the instructor's work-related email goes. You can also attend
Zoom oce hours to ask questions.
49
* Work on Concept Introduction assignment(s).
Those are the core topics for the class. The Tech Literacy assignments
can be done a bit more casually, and the Topic Mastery (exams) don't
have to be done right away - do the exams once you feel comfortable
with the topic.
(https://www.jccc.edu/student-resources/academic-resource-center/
academic-achievement-center/)
provides tutoring services for our area. Make sure to look for the
expert tutor service and you can learn more about getting a tutor.
50
Is there someone I can talk to for my degree plan? - Academic
Advising
https://www.jccc.edu/student-resources/academic-counseling/
JCCC has advisors to help you with:
Learn how to get involved in Student Senate, clubs and orgs, ath-
letics, study abroad, service learning, honors and other leadership
programs.
51
3.3 Additional information
3.3.1 ADA compliance / disabilities
JCCC provides a range of services to allow persons with disabilities to par-
ticipate in educational programs and activities. If you are a student with a
disability and if you are in need of accommodations or services, it is your re-
sponsibility to contact Access Services and make a formal request. To schedule
an appointment with an Access Advisor or for additional information, you can
contact Access Services at (913) 469-3521 or [email protected]. Access
Services is located on the 2nd oor of the Student Center (SC202)
52
A faculty member may further dene academic dishonesty, cheating or pla-
giarism in the course syllabus.
Clean surfaces
Wear yoru name badge or carry your JCCC photo id while on campus
Phone app - download JCCC Guardian (the free campus safety app:
www.jccc.edu/guardian) - instant panic button and texting capabil-
ity to Campus Police
https://secure.ethicspoint.com/domain/en/report_company.asp?
clientid=25868 or 888-258-3230
Be Alert:
53
You are an extra set of eyes and ears to help maintain campus safety
Be Prepared:
4. Implement procedures.
54
Content Outline and Competencies:
I. Computer Systems and Ethics
A. Describe basic software components.
3. Describe compilers.
B. Examine ethics.
55
6. Dereference and assign values to pointers.
2. Declare pointers.
D. Search arrays.
56
E. Sort arrays.
F. Implement structures.
G. Implement an array of structures.
VI. Object-oriented Programming
A. Write code using the built-in string class and associated methods.
B. Write code using the built-in vector class and associated methods.
C. Implement encapsulation and data abstraction by writing user-dened
classes.
D. Dierentiate between private and public access modiers.
E. Hide member data.
F. Write accessors, mutators and other member functions that process mem-
ber data.
G. Write code that utilizes objects.
H. Implement an array of objects.
VII. Code Standards
A. Create descriptive identiers according to language naming conventions.
B. Write structured and readable code.
C. Create documentation.
VIII. Professional Development Environment
A. Write code using a professional, integrated development environment
(IDE).
B. Utilize key editor features.
C. Debug code using the integrated debugger.
D. Include and use standard libraries.
57
4 Notes - Questions to answer for review
4.1.2 Terminal
The command to list all les and folders in a directory is:
58
4.2 Unit 02: C++ Basics - Variables, pointers, input, and
output
Which data types are used for the following types of data?
Whole numbers
True or False
A single character:
Example code to get the user's INPUT and store it in an integer variable,
using cin :
Example code to get the user's INPUT and store it in a string variable,
using getline:
59
4.2.1 Pointers
What is the address-of operator? How do we access the address of a
variable?
What is a return type? Which return type is used if the function returns
no data?
60
How do you dene a function? Write some example code.
What is scope? How do you tell what the scope of a variable is?
What does a function header that takes in a pointer parameter look like?
What does calling the function, passing in a variable address, look like?
61
4.4 Unit 05: Structs
What is a struct?
What is an object?
What is a condition?
62
What causes an innite loop with a while loop?
Write example code: Validate user input (between min and max values)
Give example code for how to write a for loop that iterates from i = 0 to
5 (inclusive), going up by 1 each time, and displaying the value of i within
the for loop.
63
4.6 Unit 08: Arrays and vectors
4.6.1 Arrays
What is an element of an array?
Given an array of size n, what are the minimum and maximum valid
indices?
64
Write a for loop to iterate through every element of the arr array and
display the index and value of each item.
Write several cout statements to display each element of the array arr at
indices 0 through 4.
Write a cout statement that displays the element of arr at the index given
by the variable.
Note that "Iterate over all the elements of the array arr, displaying each
index and element value." translates to this code:
65
4.6.3 STL Array objects
Note the documentation page for Arrays: https://cplusplus.com/
reference/array/array/
Write an example for loop that iterates through all the elements of an
array object and couts each one.
Write an example for loop that iterates through all the elements of a vector
object and couts each one.
66
Write out the form of an if statement.
Name Operator
Greater than
Greater than or equal to
Less than
Less than or equal to
Equal to
Not equal to
Name Operator
and
or
not
67
What does the break statement do?
What is ow-through?
What is an object?
How do you tell a member variable from a parameter variable when inside
of a class' function?
68
How do you declare an object variable of some class type? (Write down
example code)
What does a class function denition function header look like? (it's a
little dierent from a non-class function)
4.8.2 Inheritance
What do the dierent accessibility settings mean?
* A. Everything
* A. Everything
* A. Everything
What is inheritance?
When a child inherits from a parent, which member variables and functions
are inherited?
69
Write some example code of how to use inheritance in a class' declaration.
What is composition?
How do you override a parents' version of a function from the child class?
How can you call the parents' version of a function from a child class'
function?
What function is used to insert some text into the middle of a string?
Write out some example code for how to use it.
What function is used to erase some text in a string? Write out some
example code for how to use it.
70
What function is used to replace some text at some position in a string?
Write out some example code for how to use it.
What function is used to see if some text is in a string? Write out some
example code for how to use it.
When creating a le variable to read data from a text le, what data
type should that variable be?
Give an example of how to read string and numeric data from a text le
into variables in your program.
Write down how to use a while loop to read in every word or every line of
text from a text le.
When creating a le variable to write data to a text le with, what data
type should the variable be?
What function is used to open a text le for an output le stream? Give
some example code.
Give an example of how to write some text and variable values to a le
via an output le stream.
71
5 Reading
1. Belonging
Unfortunately there is a lot of bias in STEM elds and over decades there
has been a narrative that computer science is for a certain type of person
- antisocial, nerdy, people who started coding when they were 10 years
old.
Because of this, a lot of people who don't t this description can be hesi-
tant to get into computers or programming because they don't see people
like themselves in media portrayals. Or perhaps previous professors or
peers have acted like you're not a real programmer if you didn't start
programming as a child
I will say from my own experience, I know developers who fell in love with
programming by accident as an adult after having to take a computer
class for a dierent degree. I know developers who are into all sorts of
sports, or into photography, or into fashion. There is no specic "type"
of programmer. You can be any religion, any gender, any color, from any
country, and be a programmer.
2. Challenge
Programming can be hard sometimes. There are many aspects of learning
to write software (or websites, apps, games, etc.) and you will get better
at it with practice and with time. But I completely understand the feeling
of hitting your head against a wall wondering why won't this work?! and
even wondering am I cut out for this?! - Yes, you are.
I will tell you right now, I have cried over programming assignments, over
work, over software. I have taken my laptop with me to a family holiday
celebration because I couldn't gure out this program and I had to get it
done!!
All developers struggle. Software is a really unique eld. It's very intan-
gible, and there are lots of programming languages, and all sorts of tools,
and various techniques. Nobody knows everything, and there's always
more to learn.
72
Figure 1: Don't be like Gatekeeper Baby. You can begin coding at any age!
It's completely natural to hit roadblocks. To have to step away from your
program and come back to it later with a clear head. It's natural to be
confused. It's natural to not know.
But some skills you will learn to make this process smoother are how to
plan out your programs, test and verify your programs, how to phrase
what you don't know as a question, how to ask for help. These are all
skills that you will build up over time. Even if it feels like you're not
making progress, I promise that you are, and hopefully at the end of our
class you can look back to the start of it and realize how much you've
learned and grown.
3. Learning
First and foremost, I am here to help you learn.
73
My teaching style is inuenced on all my experiences throughout my learn-
ing career, my software engineer career, and my teaching career.
I have personally met teachers who have tried to scare me away from com-
puters, I've had teachers who really encouraged me, I've had teachers who
barely cared, I've had teachers who made class really fun and engaging.
74
4. Roadmap
When you're just starting out, it can be hard to know what all you're
going to be learning about. I have certainly read course descriptions and
just thought to myself "I have no idea what any of that meant, but it's
required for my degree, so I guess I'm taking it!"
CS 250 Basic Data Structures with C++ You're learning about data,
how to store data, how to assess how ecient algorithms are. Data
data data.
How do you validate that what you wrote actually works? (Spoilers:
How to write tests, both manual and automated.)
What tools can you use to make your programming life easier? (And
are used in the professional world?)
75
How do you nd jobs?
That's all I can really think of to write here. If you have any questions,
let me know. Maybe I'll add on here.
(b) At the end of the semester, you can download the entire course's
"stu" in a single PDF le for easy referencing later on
(c) Hopefully throughout this semester I'll get everything "moved over"
to orgmode, and in Summer/Fall 2024 I can have a physical textbook
printed for the courses, which students can use and take notes in so
as to have most of their course stu in one place as well
(d) It's important to me to make sure that you have access to the course
content even once you're not my student anymore - this resource is
available publicly online, whether you're in the course or not. You
can always reference it later.
76
5.1.2 Tools for software development
1. What kind of tools are needed to make programs?
77
5.2 Unit 01: Tech Literacy: Exploring computers
In this class we will be learning to write C++ programs for a computer, but
knowing why we do things in certain ways, or why things work the way they do,
often boils down to how the computer itself works. I would like to try to give
you some context about computers so you will be better prepared to understand
the topics we cover in the future.
The earliest known writing system, Cuneiform, was used to store information
about inventory - how much of each thing do you have? How much copper did
you buy from Ea Nasir? And so on. Cuneiform tablets were a form of long-
term storage of records.
However, when someone needed to do math, they wouldn't write it out on a
tablet like we do on notebook paper. The Abacus was used to do computations.
This way you could have temporary data you work through, such as "add
this", "subtract that", on your way to get the nal value.
This is what we still use computers for today - long term storage, such as
storing data in a database, and short-term processing, such as calculating all
the items in your shopping cart, applying shipping and tax, and returning the
resulting cost.
78
Figure 3: LEFT: Image of the TRS-80 Model I, image by Tim Colegrove/Pitti-
https://en.wikipedia.org/wiki/Commodore_PET , RIGHT: IBM
grilli, from
PC running GEM, image by Rolf Hartmann, from https://en.wikipedia.
org/wiki/History_of_the_graphical_user_interface
79
CLI programs are still created and used today, but usually by more technical
people - the average layperson tends to work exclusively in the GUI.
Some examples of user input interfaces are the keyboard and mouse
of a computer. What other ways can you think of to interact with a
computer, giving it input?
Whether we're working on our phone, our computer, or a website that stores
data in "the cloud" (aka someone else's computer ), data that we want to pre-
serve between runs of the program (or even after we shut o and turn on our
computer again) goes in long-term storage. This includes information our
program processes, but also the program itself - we install software, it is saved
on the system's hard-drive, and we can use it when we want without re-installing
it each time.
As we work on our programs this semester we will be storing our source
code les on our computers (and on the GitLab servers :), and our programs
will also work with reading in and writing out to les, like text les, HTML
les, or CSV spreadsheets. Knowing how to navigate your system's lesystem
is important.
80
Folders and les both have names, but les often also have extensions.
This is the information after the "." that species what kind of le it is:
2. Paths
Each Operating System might store their lesystems dierently, but a
lot of the concepts are the same. A lesystem is conceptually based o of
paper folders (like in a le cabinet) where you have a lot of folders labeled,
and each folder can contain multiple les. If we didn't come up with some
way to organize the data on our computers it would be dicult to nd
everything in the jumbled mess.
Our system has some sort of root directory (or folder), like the roots of a
tree - the starting point. In Windows, it's often your C:\ drive. In Linux
and Mac, it's usually just labeled /. Often there are system folders in the
root directory, and then we have some kind of "home" or "my documents"
folder set aside for us to store our les in.
81
Example: Homework
Let's say your CS 200 directory looks like this:
cs200/
- week1/
- laba.cpp
- labb.cpp
- myname.txt
- project1/
- data/
- savegame.txt
- hello.txt
- program.cpp
Our program is the program.cpp source le.
If we told our program to open hello.txt, we would retrieve
the hello.txt le in the same folder (project1/), without having
to type the entire absolute path
(/home/singh/cs200/week1/project1/hello.txt).
82
5.2.4 Short-term processing: The CPU and RAM
Our program itself and the data it reads and writes all are stored on the hard-
drive in long-term storage, but long term storage is slow. When we're actively
working with something it needs to be loaded into a faster type of memory. RAM
(Random Access Memory) is the short-term working memory that a computer
uses. RAM is plugged into the computer's motherboard directly, while hard
drives are still usually hooked up with some kind of cable, which slows down its
access (input/output) speed.
While we're creating our programs, any time we create a variable it will
have a block of space set in RAM (well, the Operating System virtualizes it. . .
we're not accessing the RAM directly, but we can think of it that way for now).
While we don't have to worry about loading our program into RAM - the
operating system handles that and a lot of other things for us - we will have
a chance to look at memory addresses and how we can allocate memory for
additional data. Memory management and allocating memory for variables is a
big part of core computer science classes.
While the RAM stores the program's data, the CPU (Central Processing
83
Unit) handles doing the math operations. We're not going to go into how CPUs
work, though if you take a Computer Architecture class you will learn about
how they work and how they're designed. The main gist here is that the CPU
takes in inputs, does computations, and returns outputs.
All of our modern software runs on top of some Operating System, whether
that's something like Android on a phone, Windows on a computer, or whatever
kind of operating system your game console runs on top of. The Operating
System is a special type of software that acts as an intermediary between your
computer's hardware and its software. It helps us so that we don't have to know
exactly how the wi works, or exactly how to work with xyz brand of keyboard
- the Operating System uses programs called drivers to work with those things
itself.
Operating Systems you might have used are: Windows, Linux, Mac, iOS,
Android. If you're older, you might have used DOS as well! (I used DOS in the
1990s to load some of my video games, mostly.)
The Software we run are the programs or apps themselves: Our web browser
(Firefox, Chrome), the bank app we use, a document writer (MS Word, LibreOf-
ce). Software is often built to be packaged and shared or sold to other people,
though you can also write our own little software utilities for personal use once
you have enough experience.
84
Tech Literacy discussion: Exploring software (U02.TEC.202406CS200):
What kind of program would you like to write, if you can think of
anything?
With some of the rst computers, the only commands you could program in
directly mapped to the CPU on the machine. This type of code was called ma-
chine code or assembly. Later, developers such as Grace Hopper worked on ways
to write code that lets you t multiple machine-code-pieces into one command
that was more human-readable, leading to early languages like COBOL. Many
of these "higher-level" languages (higher-level meaning further from the hard-
ware; more abstracted) eventually will get turned into machine code through a
process called compiling.
85
Example: Displaying "Hello, world!" output in MIPS Assembly:
1 . data
2 Hello : . asciiz " \ n Hello , world ! "
3
4
5 . globl main
6
7 . text
8
9 main :
10 # load syscall ; address of string ( set up for string
output )
11 li $v0 , 4
12 # load address of string into parameter $a0
13 la $a0 , Hello
14 # display
15 syscall
Compiled languages aren't the only variety - Java runs in a Java Virtual
Machine, and Python is a scripting language that runs via a Python executable.
But we're focusing on C++ here. The point is, modern software is built on
top of many layers: high-level languages that compile down to machine code,
pre-written libraries of code that handle common features for the programmers
so they don't have to reinvent the wheel.
(a) Inputs
Some programs don't take any input and just run a set of pre-dened
instructions. Most programs do take some form of input, however,
whether that's when the program rst starts up or during its runtime.
86
input, gamepad input, mouse input, touch screen input, or receiving
signals via the network or internet.
(b) Outputs
Programs also often will return some form of output, but this is also
optional. If a program doesn't return output, maybe the user just
wants to tell the program to do a job, but doesn't need conrmation
that the job was done (these are usually called background processes).
Figure 7: Variables
(c) Variables
Our program may also use variables to store data during its execu-
tion. Variables are locations in memory (RAM) where we can store
numbers, text, or more complex objects like an image. We give vari-
ables a name to reference it by, such as userName or cartTotal, and
we can do math operations on it, as well as write it to the screen or
read new values into it from the user.
We can also change the instructions our program runs based on some
condition we set. For example, if bankBalance < 0 then maybe we
display an error message. Otherwise, we can withdraw some amount
of money from the bankBalance.
87
Figure 9: A owchart diagram of a "decision diamond" that loops back on itself.
2. Example programs
88
3. C++ Programs
Each programming language is a little dierent in how it looks, but whether
you're using C++, Java, C#, Python, or many other languages, you'll still
encounter branching with if statements, looping, functions, and classes
(though older languages may not have classes at all, like C!).
i. Lines of code:
A code statement ends with a semi-colon. Statements are single
commands like cout (console-out) to display text to the output,
cin (console-in) to read input from the keyboard, declaring vari-
ables, assigning variables, or doing math operations.
iv. Comments:
It is often useful to add comments to programs to specify what
is going on in the code. There are two ways to add comments
in C++. Generally, you can use any upper or lower case letters,
numbers, and underscores in variable names - no spaces allowed.
Beyond that, variables cannot begin with a number, and you
cannot use a keyword (such as if) as a variable name.
89
to humans. Add enough new lines to separate sections of a pro-
gram, use consistent indentation, and give variables descriptive
names.
90
1. Syntax errors
The best type of error you can get is a syntax error, even though it may
feel bad to get them. Syntax errors are when you have a typo or have
otherwise miswritten a statement in the code, and the compiler doesn't
know what to do with it. It will then display a build error telling you
what it needs. Diagnosing syntax error messages can be confusing at
rst: often the compiler doesn't know exactly what's wrong, just what it's
expecting. But, the good thing about syntax errors is that your program
won't run if it can't build - that means you must x these errors before
continuing. It also means that these errors can't just be hidden in the
code, like other error types.
2. Logic errors
Another type of error that's much harder to track down are logic errors.
Logic errors can be errors in formulas, bad if statement conditions, or
other things that don't do what the programmer was intending to do
(again, either because of a typo, or not quite understanding the program
ow, or for other reasons). Logic errors don't show up in the error list, but
can cause your program to crash down the line - or worse, never crash but
create bad output. Because it's not crashing, you may assume everything
is working ne, but incorrect output can cause problems.
3. Runtime errors
When a logic error causes the program to crash while it's running, it is
called a runtime error.
4. Testing
Programs need to be tested. Starting o, you will probably be manually
running the program, entering inputs, and checking outputs. However,
this gets tedious after a while and you'll probably start entering gibberish
as inputs and assuming everything works if it outputs something. Man-
ual testing is good to do, but it is easy to become sloppy. You can also
write code to automatically test certain things for you. This will become
more relevant to us once we're working with functions in C++.
The main idea behind testing is that programs or functions will be taking
some sort of inputs, and given those inputs you have some expected
outputs or results. If the actual outputs don't match the expected
outputs, then there is something wrong.
91
Compile often: Get into the habit of using keyboard shortcuts to
build your code after every few lines - especially when you're rst
starting out. If you write two lines of code and get a syntax error,
it's much easier to diagnose than if you write a whole program and
then build.
Comment things out: If you have a lot of code but can't get it
compiling and aren't sure what to do, you can comment out large
chunks of the program until it builds again. Then, bit by bit, un-
comment out dierent regions until you nd what's causing the build
error.
These practices can help you become a more ecient and eective pro-
grammer, especially when you're rst starting out. Debugging and testing
are essential skills for any programmer, and learning them early can save
you a lot of time and frustration in the long run.
92
5.3 Unit 02: C++: Variables, pointers, input, and output
5.3.1 main(): The starting function
The bare-minimum C++ program looks like this:
1 int main ()
2 {
3
4 return 0;
5 }
Compiler?
A compiler is a program that converts your code (such as C++ code)
into an executable le that your computer can run.
The opening curly-brace { and closing curly-brace } denote the start and
end of the main function. The curly-braces and any code within is known as a
code-block. Program instructions will go within this code-block.
At the end of the main function we have return 0;. In this context, it means
"return (exit) the program with a status of 0", with that basically meaning
"return with no errors". If you ran into an error while the program was running,
you might do something like return 123; instead, to mark the area with an
"error code" (123), which you can then nd in the code.
For our programs starting o, we will be putting our instruction code after
the opening curly-brace { and before the return 0;, but the code given above
is the absolute, bare-minimum required to write a C++ program.
C++ source code les will end in the extension ".cpp" on your computer.
A le extension helps you and the computer identify what a le does and how
to open it, like a ".txt" le can be opened in a text editor like Notepad.
For information on how to create a project and build and run your code,
check the "Reference" section, where steps are given.
93
5.3.2 Variables: Storing our data
Intro
When we're writing programs in C++, we need to tell our program what
thedata type of each variable is, and give each variable a variable
name (aka identier). When a variable is declared, a space in RAM is
allocated to that variable and it can store its data there. That data can
be manipulated or overwritten later as needed in the program.
94
2. Data types
In C++, when we want to create a variable we need to tell the compiler
what the data type of the variable is. Data types specify what is stored
in the variable (whole numbers? numbers with decimal values? text?
true/false values?). Each data type takes up a dierent amount of space
in memory.
95
3. Declaring variables and assigning values to variables
(a) Variable declaration
When we're declaring a variable, it needs to follow one of these
formats:
Declaration forms
DATATYPE VARIABLENAME;
DATATYPE VARIABLENAME = VALUE;
DATATYPE VAR1, VAR2, VAR3;
DATATYPE VAR1 = VALUE1, VAR2 = VALUE2;
The data type goes rst, then the variable name/identier, and
if you'd like, you can also assign a value during the same step
(though this is not required). Once a variable has been declared,
you don't need to declare it again. This means you don't need to re-
specify its data type when you're using it. Just address the variable
by its name, and that's all.
96
(b) Variable assignment
Assignment forms
The item on the right-hand side ("RHS") will be the value stored
in the variable specied on the LHS. This can be a literal (a hard-
coded value) or it can be a dierent variable of the same data type,
whose value you want to copy over.
97
(c) Variable initialization
When we declare a variable and give it a value in the same
line of code, that is called initialization. The equal sign can be used
in this regard:
But with more modern C++, it's recommended that we use braced
initialization :
1 string productName { " Candybar " };
2 float productPrice { 3.25 };
Garbage!
98
(d) Named constants
Whenever you nd yourself using a literal value in your assignment
statements, you may want to think about whether you should replace
it with a named constant instead.
Declaration form
A named constant looks like a variable when you declare it, but it
also has the keyword const - meaning that the value can't change
after its declaration.
Let's say you wrote a program and hard-coded the tax rate:
Then the tax rate changes later on. You would have to go into your
program and search for "0.0948" and update all those places! Instead,
it would have been easier to assign the tax rate ONCE to a named
constant and referred to that instead:
If you ever nd yourself using the same literal multiple times in your
program, then perhaps consider replacing it with a named constant.
99
4. Naming conventions
While you can generally name a variable whatever you'd like, you still
need to adhere to the syntax rules of the C++ language. In particular:
There are also naming conventions used so that variables (and later on
functions and structs/classes) have a consistent naming scheme:
Variables:
Named constants:
100
5. Basic operations on variables
Now that you have variables available in your program to play with, what
can you even do with them?
But you can also display the values stored within variables, simply
by using the variable's name:
You can also chain as many literals, variables, and commands to-
gether as long as they have the output stream operator << in-between.
1 cout << " Student : " << name
2 << endl << " GPA : " << gpa
3 << endl << " Year : " << year << endl << endl ;
1 float gpa ;
2 cin >> gpa ;
cin >> can be used on strings, but it will not read anything after a
space. Instead, we use the getline function to read whole lines of
text into string variables:
1 string oneLine ;
2 getline ( cin , oneLine ) ;
3
4 string oneWord ;
5 cin >> oneWord ;
101
(c) Math operations
With variables with numeric data types (ints, oats, doubles), we
can do arithmetic with the +, -, *, and / operators.
1 cout << " Sum : " << num1 + num2 + num3 << endl ;
Operations:
Symbol Description
+ Addition
- Subtraction
* Multiplication
/ Division
1 totalCats + 1;
1 newCatTotal = totalCats + 1;
1 totalCats = totalCats + 1;
1 // Long way :
2 totalCats = totalCats + 5;
3
4 // Compound operation :
5 totalCats += 5;
102
(e) String operations
Strings have some special operations you can do on them. You can
also see a list of functions supported by strings here: C++ String
Reference (We will cover more with strings in a later part).
i. Concatenating strings
You can use the + symbol to combine strings together. When
used in this context, the + sign is called the concatenation op-
erator.
ii. Letter-of-the-string
You can also use the subscript operator [ ] (more on this when
we cover arrays) to access a letter at some position in the string.
Note that in C++, the position starts at 0, not 1.
6. Review questions:
(a) Before a variable can be used, it must be. . .
103
5.3.3 Introduction to memory addresses and pointer variables
place 128 64 32 16 8 4 2 1
value 0 0 0 0 0 0 0 0
place 128 64 32 16 8 4 2 1
value 1 1 1 1 1 1 1 1
Some data types, like a Boolean and a Character, use only 1 byte. But oth-
ers, like Integers and Floats, use more. Since an integer uses 4 bytes, that
means it has 8·4 = 32 bits available to store data. 232 = 4, 294, 967, 296,
so oats and integers can store this many dierent values. (Note that this
doesn't mean that an integer goes from 0 to 4,294,967,296, because we
have to account for negative values.)
104
2. Memory addresses
Whenever a variable is declared, we need space to store what its value
is. We have already looked at how many bytes a data type takes up,
but where is the variable's data stored? In working memory. You can
think of this as the RAM, though the Operating System interacts with
the RAM and gives us a "virtual memory space" to work with. But, to
keep it simple, we will think of this as the RAM.
Each block of space in memory has a memory address, one after an-
other. . .
Bit address 0 1 2 3 4 5 6 7
Hexadecimal goes from 0 to 16, but values from 10 and up are represented
with letters. This is so each "number" in the value only takes 1 character
(10 is two characters: 1 and 0). So, a quick reference for hexadecimal is
like this:
Base 16 (Hex) A B C D E F
Base 10 10 11 12 13 14 15
105
Example: Variable in memory
Let's say we're investigating some blocks of memory.
its data will be placed with its rst bit at address 0x2.
We can use the address-of operator & to see what any variable's address
in memory is:
1 cout << " Value : " << char1 << " \ t " ;
2 cout << " Address : " << & char1 << endl ;
Getting the address-of a variable will return the address of its rst bit, so
the output here would be:
Value : A Address : 0 x2
106
Example: Variable value in memory
We can see where the variable is stored at in memory, but let's look at
how it's value will be stored as well. Given the declaration:
The value of 'A' is stored in 1 byte. Technically, our computer stores the
letter "uppercase A" as the number code 65. This can be converted into
binary: (65)10 = 0100 0001. This is the data that would be stored in
that memory address.
0x0 (used)
0x1 (used)
0x2 char1 0
0x3 char1 1
0x4 char1 0
0x5 char1 0
0x6 char1 0
0x7 char1 0
0x8 char1 0
0x9 char1 1
0xA(10) (used)
0xB(11) (used)
0xC(12)
0xD(13)
0xE(14) (used)
0xF(15) (used)
This is just a basic representation, again. One thing you'll learn more
about in future Computer Science courses is endian-ness, such as whether
a number has its most-signicant bit on the left side or the right side.
We're not worrying about that here. :)
107
3. Pointer variables
Pointer variables are another type of variable, but instead of storing a
value like "ABC", 'X', 10.35, or 4, it stores a memory address instead.
Declaration forms
DATATYPE* PTRNAME;
DATATYPE * PTRNAME;
DATATYPE *PTRNAME;
DATATYPE* PTRNAME = nullptr;
DATATYPE* PTRNAME{nullptr};
108
(b) Pointer assignment
Once we have a pointer, we can point it to the address of any variable
with a matching data type. To do this, we have to use the address-
of operator to access the variable's address - this is what gets stored
as the pointer's value.
Assignment forms
109
(c) Dereferencing pointers to get values
Once the pointer is pointing to the address of a variable, we can
access that pointed-to variable's value by dereferencing our pointer.
This gives us the ability to read the value stored at that memory
address, or overwrite the value stored at that memory address. We
dereference the pointer by prexing the pointer's name with a * -
again, another symbol being reused but in a dierent context.
Dereference forms
110
5.3.4 Input and output: Interacting with the user
1. Interactivity and Output in C++
Most programs feature interactivity in some way or another. This can
involve moving a mouse around, clicking on things, tapping on a touch
screen, using a gamepad's joysticks and buttons, but we'll be primarily
interacting with our C++ programs through keyboard input. Feedback
from our C++ programs will come in the form of text output to the screen,
as we are writing terminal programs.
1300 + 37 = 1337
We will also delve into reading from and writing to text les (or other le
formats) later on. But for now, let's focus on the terminal/console.
Terminology
111
2. Outputting Information with cout
The cout command (pronounced as "c-out" for "console-out") is used
to write information to the screen. This can include outputting a string
literal:
or a variable's value:
1 cout << " Hello , " << yourName << " ! " << endl ;
HelloWorld
Hello
World
112
3. Inputting Information with cin
When we want the user to enter a value for a variable using the keyboard,
we use the cin command (pronounced as "c-in" or "console-in").
For variables like int and oat, you will use this format to store data from
the keyboard into the variable:
You can also chain cin statements together to read multiple values
for multiple variables:
1 string name ;
2 cin >> name ;
1 string name ;
2 getline ( cin , name ) ;
113
(e) Escape Sequences
There are special characters, called escape sequences, that you can
use in your cout statements:
Character Description
\n newline (equivalent to endl)
\t tab
\" double quote
Example code:
1 cout << " \" hello \ nworld \" " << endl ;
Output:
" hello
world "
Example code:
Output:
A B C
1 2 3
Example code:
Output:
4. Review questions:
(a) What is a "console" (aka "terminal")?
114
5.4 Unit 03: C++: Functions
As programs become more sophisticated and oer more features, the size of
the program increases. At some point, it becomes too complicated to keep your
entire program just within main(). (You could certainly do it, but maintaining
it would be a nightmare!)
One of the tools we use to build modular, easier-to-read code is func-
tions. By using functions, we can delegate tasks out to other portions of the
program, passing inputs as data to the function, and receiving some kind of
output as a result.
115
copy-and-pasting the same formula over and over again in the code - which also
means less likelihood of errors, and easier to update later as needed.
116
5.4.2 Uses of functions
1. Functions for formulas
In algebra, you've seen functions like this:
f (x) = 2x + 3
If you were like me in algebra, you might have thought to yourself, "That's
the same as y = 2x + 3, why did we replace y with f (x)?"
The reason is that we want to write a function in terms of its input, x,
and its output f (x). The equation 2x + 3 is the function body, which
species how we get some output given some input.
A(w, l) = w · l
In C++, it would look like this:
2. Functions to validate
Functions can also be handy in validating data and user input, putting
the validation in one place instead of having to re-implement the same
checks over and over.
For example, let's say we want to keep some variable percentage in our
program betwee 0% and 100% - no negative values, nothing over 100%.
We could implement a function that takes the percentage as an input,
and either returns the same percentage, or 0%, or 100% as output. . .
1 int BoundPercent ( int originalPercent ) {
2 if ( originalPercent < 0 ) {
3 return 0;
4 }
5 else if ( originalPercent > 100 ) {
6 return 100;
7 }
8 else {
9 return originalPercent ;
10 }
11 }
117
Then, anywhere in the program, we could use this function to make
sure our percentages are in the right range. . .
1 // in main ()
2 hungerPercent = BoundPercent ( hungerPercent ) ;
3 healthPercent = BoundPercent ( healthPercent ) ;
4 happinessPercent = BoundPercent ( happinessPercent ) ;
118
You write this function once and then you can reuse it in your entire
program for all menus. . .
4. Functions to output
Functions aren't required to return data. Sometimes, you just want a
function that is responsible for formatting output or displaying a menu.
In this case, a function's return type can be void.
You also aren't required to pass input to functions. In this case, the
parameter list between ( ) remains empty, but the () is always required
for functions:
1 void DisplayMainMenu ()
2 {
3 cout << " 1. Deposit " << endl ;
4 cout << " 2. Withdraw " << endl ;
5 cout << " 3. View Balance " << endl ;
6 cout << " 4. Log Out " << endl ;
7 }
5. Other uses
These are just some examples of why you might use functions in your
programs. Anything you write in main() can go inside of a dierent
function as well - it's just another tool for designing clean, maintanable,
and readable code.
119
5.4.3 Anatomy of a function
1. Function Declaration
1 float GetArea ( float width , float height );
Before you start using a function, you have to declare and dene it. . .
A function declaration is similar to a variable declaration - we tell the
program "hey, we want to use this function, here's its name and some info
about it." Declaration statements end with a semi-colon and don't contain
a code block (the function body) because it's just a declaration.
120
2. Function Denition
1 float GetArea ( float width , float height )
2 {
3 return width * height ;
4 }
The function denition is where we actually write what the function does.
It includes the same information as the function declaration, but we in-
clude the function body in a code block.
3. Function Body
The function body is the code block, written between { and }, dening
what logic the function performs.
4. Function Call
1 float room1Sqft = GetArea ( 5 , 10 ) ;
2 float room2Sqft = GetArea ( room2width , room2length ) ;
After a function is dened, we can then call that function to execute its
internal code. If the function has input parameters, we can pass in literal
values (hard-coded data) or variables to provide that input data.
5. Calling a function
Once the function has been dened, you can call it from anywhere in your
program. . .
1 int main ()
2 {
3 float width , height ;
4 cout << " Enter width and height : " ;
5 cin >> width >> height ;
6
7 // Call GetArea
8 float area = GetArea ( width , height ) ;
9
10 cout << " Area : " << area << endl ;
11 }
121
(b) Arguments:
An argument is the name of the value or variables being passed into
the function during the function call. These arguments become the
values that the function parameters within the function deni-
tion uses.
1 // Call GetArea
2 float area = GetArea ( 10 , 20 ) ;
So the values of 10 and 20 get used as the width and length param-
eters' values:
The arguments passed indo not need to share a name with the
parameters; these are not the same variables. They're only sharing
the data stored within them.
122
Common function errors:
YES:
DisplayMenu();
NO:
DisplayMenu;
YES:
main():
If you declare a variable at the top of the main() function, not inside any
if statements or loops, then that variable is in scope for the entire duration of
main(), starting with the line it was declared on.
1 int main ()
2 {
3 int a;
4 // ... etc ...
5 }
123
Variables declared within if statements and loops:
Variables declared within the code block of an if statement or a loop only
exists within that code block.
1 if ( a == 3 )
2 {
3 int b ; // only exists within this block
4 }
5
6 for ( int i = 0; i < 10; i ++ )
7 {
8 cout << i ; // only exists within this block
9 }
If you try to use these variables somewhere below the code block, your
compiler will give an error, stating that the variable does not exist in that
scope. Once the program leaves the code block, the variable is out of scope.
Functions:
Remember that main() is a function, just like any other functions we write
in our program. Any variables declared within a function are local to that
function, and accessible anywhere from the variable's declaration until the end
of the function.
1 int GetChoice ()
2 {
3 int choice ; // local variable
4 cout << " Choice : " ;
5 cin >> choice ;
6 return choice ;
7 }
Parameters:
Variables declared in the parameter list of a function are also local to that
function and can be used anywhere within the function.
124
Same names?
The same name can be reused for dierent variables in dierent scopes.
Even if they share the same name, they are not related in any way.
1 int GetChoice ()
2 {
3 int choice ; // Variable A
4 cout << " Choice : " ;
5 cin >> choice ;
6 return choice ;
7 }
8
9 int main ()
10 {
11 int choice ; // Variable B
12 choice = GetChoice () ;
13 }
1 int main ()
2 {
3 int myNumber = 2;
4 Example ( myNumber ) ;
5 return 0;
6 }
125
If you wrote the function to change the value of its parameter, that change
would only be reected within the function and would not aect the
original argument passed as part of the function call.
Example begin : 2
Example end : 100
main end : 2
Even though the value of someNumber from the Example function changes
(which is valid), that change doesn't aect myNumber within main(), be-
cause only the value was copied over.
This is known as pass-by-value.
2. Pass-by-reference
If we wanted to change the value of an argument variable within a function,
we'd have to change the parameter to pass-by-reference. To do this, we
use the symbol = &= in the parameter's declaration, after the data type
and before the variable name.
The ampersand symbol can go next to the data type (int & blah), next
to the variable name (int &blah), or separate from both (int & blah).
Once we've made the parameter a reference, then when the function is
called, the argument is not copied - a reference to that variable is passed
to the function. Any changes to the reference parameter in the function
also aects the original argument variable.
126
1 int main ()
2 {
3 int myNumber = 2;
4
5 // Calling it looks the same as before
6 Example ( myNumber ) ;
7
8 cout << " main end : " << myNumber << endl ;
9
10 return 0;
11 }
Example begin : 2
Example end : 100
main end : 100
In some cases, you may need to return multiple pieces of data from a
function - however, you can only return one item from a function with
the return statement (in C++). One option is to set the information you
want "returned" as pass-by-reference parameters of the function.
127
5.4.6 Summary: Ways to pass data to/from functions
The following table illustrates dierent ways we can dene our parameters,
and what the goal is. "RT" means "Return Type", "T" is the "Type" of the
parameter.
1. X is pass-by-value, which is ne for primitive data types like ints, oats,
chars, and bools.
3. The function can read from X but also overwrite its value and the change
will be reected back to the argument being passed to the function call.
128
5.4.7 Default parameters
When declaring a function, you can also set default parameters. These are
the default values assigned to the parameters if the user doesn't pass anything
in. The default parameters are only specied in a function declaration -
NOT the denition!
You can have multiple default parameters specied in your function decla-
ration - but all variables with default values must go after any variables without
default values.
129
You can write as many versions of the function as you like, so long as the
function headers are uniquely identiable to the compiler, which means:
The functions have a dierent amount of parameters, or
The data types of the parameters are dierent, or
The parameters are in a dierent order (when mixing data types).
These will become much more useful once we cover classes and objects.
The function takes in a oat for the width and a oat for the length
a.
b.
c.
3. Identify how the following parameters are passed (by value / by reference),
given this function declaration:
130
5.5 Unit 04: Tech Literacy: Debugging, testing, and re-
searching
5.5.1 Syntax
What is syntax ?
syntax, noun - The way in which linguistic elements (such as words) are
put together to form constituents (such as phrases or clauses)
From the Merriam-Webster Dictionary.
C++, Java, C#, and other "C-like" languages follow similar syntax rules.
Lines of code:
A code statement ends with a semi-colon. Statements are single commands,
like using cout ("console out") to display text to the screen, assigning a value
to a variable, and other simple operations.
Comments:
Comments are notes left in the code by humans for humans. They can help
us remember what our code was doing later on, or help guide someone else
reading through our code. There are two ways we can write comments in C++.
If we use // then all text afterwards will be a comment. This is a single-line
comment. If we use /* then all text will be a comment, only ending once we
reach a */. This is a multi-line comment.
Code blocks:
There are certain types of instructions that contain additional code. If state-
ments, for example, contain a set of instructions to execute only if the con-
dition given evalutes to true. Any time an instruction contains additional
instructions, we use opening and closing curly braces { } to contain this in-
ternal code. Note that an if statement and other structures that contain code
don't end with a semicolon ;.
1 if ( price > 100 )
2 { // Code block begin
3 cout << " Too expensive ... " << endl ;
4 } // Code block end
131
5.5.2 Types of errors
Syntax errors and logic errors
Syntax errors are errors in the language rules of your program code. This
typos, misspellings, or just writing something that
include things like isn't
valid C++ code, such as forgetting a ; at the end of some instructions. Although
they're annoying, syntax errors are probably the "best" type of error because
the program won't build while they're present. Your program won't build if you
have syntax errors.
Logic errors are errors in the programmer's logic. This could be something
like a wrong math formula, a bad condition on an if statement, or other things
where the programmer thinks thing A is going to happen, but thing B happens
instead. These don't lead to build errors, so the program can still be run, but
it may result in the program crashing, or invalid data being generated, or other
problems.
Write a few lines of code and build after every few lines - this will help
you detect syntax errors early.
DON'T write the "entire program" before ever doing a build or a test -
chances are you've written in some syntax errors, and now you'll have a
long list of errors to sift through!
If you aren't sure where an error is coming from, try commenting out
large chunks of your program until it's building again. Then, you can
un-comment-out small bits at a time to gure out where the problem is.
132
5.5.3 Testing software
1. Why test?
Test case: A test case is a single test. You specify some input(s)
that you will give your program, and the expected output(s) it should
return.
When you run the actual program with your inputs, it will return actual
output(s). Compare the actual output with the expected output to val-
idate whether the program worked as expected. Test cases can be built
without any of the program built so far. In fact, it can be handy to write
your tests ahead of time so you have a better understanding of how things
are supposed to work.
133
2. Writing test cases
Example: Bank withdrawals
In this example, the program keeps track of a bank balance and the amount
the user wants to withdraw, but it shouldn't let the balance fall below 0.
You would make a list of inputs and what should be the result for each
case, and then run your program and check each scenario - does the actual
output match the expected output? If something doesn't match, it
could mean that there's an error in a calculation somewhere, or other
logic in the program. (And yes, sometimes tests can be wrong, too.)
3. Ways to test
Testing is a whole job title in software development. Usually the "devel-
opers" write the new features and maybe add unit tests for their code.
A dedicated QA (Quality Assurance) or SET (Software Engineer in Test)
is then responsible for thoroughly testing developer work. This includes
testing in multiple ways, both the feature itself "in a vacuum", and con-
nected to the entire system as a whole, to make sure that nothing breaks
along the way.
134
1 // Inputs for this test case
2 int input_balance = 100;
3 int input_withdraw = 10;
4
5 // What the expected result ( balance ) is
6 int expected_output = 90;
7
8 // Call the function that handles it with the
9 // test case inputs , its output is our " actual
output ".
10 int actual_output = Withdraw ( input_balance ,
expected_output ) ;
11
12 if ( actual_output == expected_output )
13 {
14 // If the actual output matches
15 // the expected output - PASS !
16 cout << " Test passes ! " << endl ;
17 }
18 else
19 {
20 // The actual output didn 't match , so test FAILS .
21 cout << " TEST FAILS ! " << endl ;
22 }
Again, for reference, the rst test case is written out as:
135
5.5.4 Doing research as a programmer
For developers it's a pretty common experience for people to feel like they spend
a lot of their time searching for solutions and scouring Stack Overow posts for
solutions to their troubles. In the professional world you will belearning your
company's codebase, as well as probably learning third party APIs from
other companies as well. While you may be procient in the language you
work in, learning other peoples' code and products will always be part of it. So,
research is part of development.
Companies often have some kind of internal Wiki (or Conuence, or Share-
point) where employees can post documentation and notes to share with
others. However, developers don't usually do much documentation on
their code or code they've explored, so usually a company's internal doc-
umentation for their own code is pretty bad. (In my experience only the
auto-generated API docs built from code comments are okay.)
136
2. Search engines (and AI?)
Searching on a search engine can come up with tutorials, blogs, API docs,
message board posts, and other resources for reference. Finding help,
documentation, examples, and posts where someone else had the same
problem is a common way of working through problems, as well as asking
coworkers, sketching out the problem on paper, and testing out dierent
approaches.
3. Documentation resources
Figure 10: A screenshot of the documentation page for Canvas' API, listing an
action, inputs, and other information.
When working with third party libraries and APIs that are provided by
another business or organization they will generally have decent documen-
tation explaining the items you can use. Going over API documentation
is a big part of software development. :) So having the patience to read
through docs to nd what you need is important.
If you want to see some examples of API documentation, here are a few.
You can also search "[thing] API docs" to nd documentation for a lot of
things, from meal delivery apps to catalogs of venomous frogs in Australia.
137
4. Stack Overow and message boards
As you do web searches for programming problems (for me, usually build
error messages - what does it mean? :)) often you will see message boards
with archived posts from people with similar problems. These are pretty
common to reference, though can be limited in how helpful they are. Some-
times the poster's problem matches yours, sometimes nobody responded,
sometimes you can't quite nd what you need. But still a common re-
source.
Figure 11: An image of the cover of the book "JavaScript Pocket Reference",
published by O'Reilly.
It's good to keep a reference book about the language you're using as
well. These can usually be college style textbooks about the language, or
maybe a quick reference. There are also books that help you gain a deeper
understanding of the language, frameworks, and tools you use.
There are also often online video lessons that can teach you about tech-
nologies as well. These are usually through websites like Pluralsight or
maybe Coursera or Udemy.
138
5.6 Unit 05: C++: Structs
5.6.1 Introduction to objects
139
Certain functions are made public, which other programmers
can use to interface with the object.
The developer of the class can modify how the internals work
without breaking the public interface.
Helps protect the data within the class from being accessed or
modied by external things that shouldn't have access to it.
1 string food1_name ;
2 float food1_price ;
3 int food1_calories ;
4 bool food1_is_veggie ;
But there isn't really anything in the program that says these variables are
related, except that we as humans have given these variables similar prexes
in their names. A better design would be to create a new datatype called
MenuItem (or something similar), and the MenuItem will contain these four
variables within it. We're basically making a variable data type that can contain
multiple variables!
140
First we create the struct, which should go in its own .h le:
MenuItem.h:
1 struct MenuItem
2 {
3 string name ;
4 float price ;
5 int calories ;
6 bool isVeggie ;
7 };
When creating a struct, we should create a new source code le in our
project. Usually the name of the le will be the same name as the struct, with
a .h at the end. This is a header le and declarations for structs (and functions
and classes later) will go in these types of les.
Something you need to require in your .h les that isn't needed for your .cpp
les are le guards. These prevent the compiler from reading the le more than
once. If it reads it multiple times, it will think you're redeclaring things over
and over again. Your .h les should always look like this:
141
1 # ifndef _MYFILE_H
2 # define _MYFILE_H
3
4 // put code here
5
6 # endif
1 # ifndef _MYFILE_H
2 # define _MYFILE_H
3
4 struct STRUCTNAME
5 {
6 // member variables
7 int MEMBER1 ;
8 string MEMBER2 ;
9 float MEMBER3 ;
10 };
11
12 # endif
Note that the closing curly-brace } must end with a ; otherwise the compiler
will give you errors.
You can name your struct anything you'd please but it has to abide by the
C++ naming rules (no spaces, no keywords, can contain letters, numbers, and
underscores).
Any variables we declare within the struct are known as member variables
- they are members of that struct.
Any new variables you declare whose data type is this struct will have its
own copy of each of these variables.
1 DATATYPE VARIABLE ;
142
1 VARIABLE . MEMBER1 = 10;
2 VARIABLE . MEMBER2 = " ASDF " ;
3 VARIABLE . MEMBER3 = 2.99;
4
5 cout << VARIABLE . MEMBER1 << endl ;
Within main(), we could then create Fraction variables and work with
them:
main.cpp:
1 # include " Fraction . h "
2
3 int main ()
4 {
5 Fraction frac1 , frac2 , frac3 ;
6
7 cout << " FIRST FRACTION " << endl ;
8 cout << " * Enter numerator : " ;
9 cin >> frac1 . num ;
10 cout << " * Enter denominator : " ;
11 cin >> frac1 . denom ;
12
13 cout << endl ;
14 cout << " SECOND FRACTION " << endl ;
15 cout << " * Enter numerator : " ;
16 cin >> frac2 . num ;
17 cout << " * Enter denominator : " ;
18 cin >> frac2 . denom ;
19
20 frac3 . num = frac1 . num * frac2 . num ;
21 frac3 . denom = frac1 . denom * frac2 . denom ;
22 cout << endl ;
23 cout << " PRODUCT : " << frac3 . num << " / " << frac3 . denom
<< endl ;
24
25 return 0;
26 }
143
5.6.5 Review questions:
1. File guards are needed because. . .
144
5.7 Unit 06: Tech Literacy: Careers in tech
Here I tried to summarize, or nd text summaries of, descriptions of dierent
common roles in tech. I myself have worked as a Software Engineer and have
worked on teams with QAs, Software Engineers in Test, Business Analysts,
UI/UX Designers, and Database Admins, but most of my rst-hand experience
is the development side of things.
If you're interested in some particular elds, I have added links to YouTube
videos from various people that describe more about the roles. In the PDF le
you should be able to click the links to access them on the web.
https://youtu.be/5kas2jBObUY
Average teams may have one or two software engineers in test on a team.
https://www.youtube.com/watch?v=C7OLZf5099Y
https://www.youtube.com/watch?v=Nd31XiSGJLw
145
3. Quality Assurance
Colloquially, a person in a Quality Assurance test role with software devel-
opment doesn't do as much coding as a Software Engineer in Test. They
may write basic scripts but sometimes their background isn't even in cod-
ing. A lot of this includes manually testing the software (usually from the
GUI) and documenting the steps on how to test a given feature.
Teams may have both QA testers and software engineers in test, or one,
or the other. It kind of depends on the application itself !
https://www.youtube.com/watch?v=t5jJ4bNJ4kw
4. Database Admin
Software and websites need to store data, whether it's all the products
available in a store, or a series of chat messages between users. The
database is its own area that needs specialized people to build and main-
tain, even if software developers occasionally write their own tables and
scripts. Databases also require maintenance of the actual servers where
the database lives, as well as conguration, migration, and more.
https://www.youtube.com/watch?v=aI8CB60HGoo
5. UX Design
The User Experience Designer is more about the entire experience of using
the product. In a way, think of a person who gures out what kind of
features might be important to a user - is "clicking once to purchase an
item online" a feature that users would desire? UX is somewhat more
about functionality, and they work with UI and developers to gure out
how to create the solution.
https://www.youtube.com/watch?v=v6n1i0qojws
6. UI Design
UI Designer is more of a visual, graphical role, creating a pleasant interface
for customers/users who are using the product. It is important to be
able to present information clearly, and to be consistent across the entire
product. Depending on the company, sometimes the UI designer may also
write HTML and CSS, but not always. Still, learning some basic coding
with HTML, CSS, and JavaScript can be a huge asset as a designer.
https://www.youtube.com/watch?v=_6Tl2_eM0DE
146
7. DevOps
DevOps engineers reduce that complexity, closing the gap between actions
needed to quickly change an application, and the tasks that maintain its
reliability.
https://www.youtube.com/watch?v=s7E9pMHPRts
8. Business Analyst
Business analysts (BAs) are responsible for bridging the gap
between IT and the business using data analytics to assess pro-
cesses, determine requirements and deliver data-driven recom-
mendations and reports to executives and stakeholders.
(Description from
cio.com/article/276798/project-management-what-do-business-analysts-
actually-do-for-software-implementation-projects.html)
https://www.youtube.com/watch?v=50MooA33nlk
9. IT Specialist
IT is needed anywhere a company has computers. This can include places
that develop software, but also companies that don't develop software and
still need someone to set up and maintain the oce's systems. This may
include the actual computer systems, the network and wi, maintaining in-
building server(s), and otherwise providing tech support for the employees
of the company. Coding in IT can include writing scripts (e.g., UNIX
scripts) to automate conguring many systems, or writing utilities to help
you diagnose issues or otherwise do your job.
https://www.youtube.com/watch?v=1l3kKBEEQIo
147
A product manager is the person who identies the customer
need and the larger business objectives that a product or feature
will fulll, articulates what success looks like for a product, and
rallies a team to turn that vision into a reality.
(Description from
atlassian.com/agile/product-management/product-manager)
https://www.youtube.com/watch?v=pCmh6XaMVxs
https://www.youtube.com/watch?v=eKM9AGwSPKU
(Description from
redhat.com/en/topics/devops/devops-engineer)
https://www.youtube.com/watch?v=XW0YptcgZSk
148
5.7.2 Professional development and networking
One of the easiest ways to get your foot in the door at a company is by knowing
somebody who is already working there. This could be somebody that you
went to school with, somebody that you've worked with previously, or even
someone you've met through conferences or via the internet. But, how do you
go about making contacts and keeping in touch? You can build your network of
professionals in various ways throughout the years. Here are some of the ways
that I've met other developers throughout my career. . .
School: One of the easiest ways to meet people right now is meeting your
classmates. For some of us, our style might be go to class, do the work by
myself, don't talk to others (like me, I was a shy youngin'), but making
contacts at school can go a long way.
School clubs can be a good way to meet others, both inside and outside
your area of study. You can view a list of JCCC clubs and organizations
here:
https://www.jccc.edu/campus-life/student-activities-organizations/
The school may also have events from time-to-time to get you and your
work exposed to local businesses and professionals, such as regular career
fairs and poster symposiums. You may need to keep an eye on campus
news for these! The CSIT department hosts a reverse career fair once a
year so keep an eye out!
Work: As you have jobs (whether they're software development or not), try to
make sure to keep in touch with one or more coworker. With coworkers
especially, they will be able to better vouch for you and how you work if
you end up applying for a job with them at a dierent company as well.
Friends: Your friends have their own professional networks and, even if they're
not in tech, they might know others who are, or know of other companies
that hire tech people.
Conferences and meetups: You can also connect with other professionals at
events and conferences. It could be tech conferences or events for other
topics (you don't exclusively need to keep in touch with just software
developers; knowing non-developers can also be helpful in nding oppor-
tunities!).
149
Some local conferences:
KCDC Kansas City Developer Conference
https://www.kcdc.info/
Yearly conferences that feature developers from Kansas City and elseware
giving talks about various technology, practices, and more. This can be a
good place to learn the basics of a new area and meet with others. They
also have a booth area where you can talk to recruiters and developers
from dierent companies.
https://www.minkwic.org/
This is a conference for women in tech in the surrounding area. Each year
the conference is held in a dierent one of the four states and also includes
talks and presentations and company booths.
https://flyoverindies.party/
Flyover Indies is a group of independent game developers here in the KC
Metro area. There's a co-working afternoon on Sundays, a Ludology club
studying about game development concepts, and more.
https://www.seckc.org/
SecKC is a meetup of people interested in the security side of tech. They
usually meet monthly.
Other ideas
Meetup.com - You can nd other meetups for specic areas (e.g., just
Python, just web development, etc.) on Meetup.com. Going to meetings
will help you become acquainted with other developers and learn about
businesses locally, as well as give you a chance to ask questions and get
advice.
Online communities - Sometimes you can nd Slack or Discord servers for
people in a specic eld (e.g., ".net developers", "women in tech", etc.)
and it can be handy to be a part of these groups.
Reddit - Some students have suggested that you can network with others
via Reddit as well.
Discord and IRC chat - Find a group of hobbyists, open source developers,
or other areas and join the community! Even libraries like SFML have
their own community.
150
5.7.3 What about AI?
You don't have to read this if you don't want to, I'm just rambling
here.
All the big tech companies seem to be buying into adding AI into their
products these days, but I see this as repeated history, such as the frenzy about
NFTs in the past ve years, or the dot com bubble of the late 1990s.
Basically, companies make money if their investors are excited about some-
thing. We already saw how many companies announced some kind of "blockchain"
or "NFT" based feature they were going to create, which seems to have some-
what quietly died down in the past year or two. Companies throw something
out there, whether it's an idea they are actually excited about or not, just to
get an inux of cash from investors.
Just like with NFTs and AI, in the 1990s any business touting having a web-
site would get funding, even if the business idea was not viable. Investors were
excited about the potential to make a ton of money o the hot new technology:
the Internet.
Non-technical bosses and investors think they can save money by using AI
instead of developers, but doing so will create erroneous, awed products.
(Will they be humble enough to backtrack on their decisions in order to
x it? Doubtful.)
More companies than usual may be using "AI" to try to pair down a pool of
applications, even though this bakes in historical bias into what resumes
151
are brought forward - or the ability to game the system if a candidate
knows how to appeal to the algorithm.
At the same time, it looks good for companies to be "searching for jobs"
by posting jobs online, even without the intention of hiring for those jobs.
152
5.8 Unit 07: C++: Looping
5.8.1 Boolean expressions
In order to start writing questions that a computer can understand, we need to
understand boolean expressions.
2+3
A boolean expression is a statement that result in either true or false:
"it is daytime."
"the user saved the document"
"the user's age is greater than 12 and less than 20"
Logic in computer programs are based around these types of questions: some-
thing that can only be true or false. Statements include:
1 x
1 !x
1 x == y
153
1 x != y
Is x less than y?
1 x < y
1 x <= y
Is x greater than y?
1 x > y
1 x >= y
For the rst two, we can check the value of a boolean variable. The rest
of them, we can use any data type to compare if two values are equal, greater
than, less than, etc. a and b can be replaced with variables and/or values. . .
Note: When using < and > with strings or chars, it will compare them
based on alphabetical order - if they're both the same case (both uppercase or
both lowercase). The code 65 represents 'A', but the code 97 represents 'a',
so items will be "sorted" based on these codes.
154
1. And, Or, and Not operators
We can also combine boolean expressions together to ask more sophisti-
cated questions.
To break it down, the customer would only get beer if they want beer
AND if they are over 21. If they don't want beer but are 21 or over,
they don't get beer. If they want beer but are under 21, then they
don't get beer.
(c) Or operator: ||
For an or operator, we can check to see if at least one boolean
variable/expression is true. If at least one item is true, then the
whole statement is true. The only way for it to be false is when each
boolean variable/expression is false.
155
3 GiveDiscount () ;
4 }
In this case, discounts are given to babies, seniors, and vets. A cus-
tomer wouldn't have to be all three to qualify (and clearly, couldn't
be all three at the same time!). If the customer is not a baby and not
a senior and not a vet, then they don't get the discount - all three
criteria have to be false for the entire expression to be false.
2. Truth tables
We can use truth tables to help us visualize the logic that we're working
with, and to validate if our assumptions are true. Truth tables are for
when we have an expression with more than one variable (usually) and
want to see the result of using ANDs, ORs, and NOTs to combine them.
On the right-hand side (I put after the double lines) will be the result
of the expression - in this case, "not-p" !p. The not operation simply
takes the value and ips it to the opposite: true → false, and false
→ true.
p !p
T F
F T
(b) Truth table for AND: For a truth table that deals with two vari-
ables, p and q, the total amount of states will be 4:
p q p && q
T T T
T F F
F T F
F F F
This is just a generic truth table. We can replace the values with
boolean expressions in C++ to check our logic.
156
(c) Truth table for OR: This also deals with 2 variables, p and q, so
4 total states. If at least one of the two variables are true, then the
entire expression istrue. An expression with an "or" is only false
when all sub-expressions are false.
p q p q
T T T
T F T
F T T
F F F
157
iii. T: hasCake is false and hasIcecream is true: The store has no
cake but it has ice cream; suggest it to the user.
3. DeMorgan's Laws
Finally, we need to cover DeMorgan's Laws, which tell us what the opposite
of an expression means.
For example, if we ask the program "is a > 20?" and the result is false,
then what does this imply? If a > 20 is false, then a ≤ 20 is true. . . notice
that the opposite of "greater than" is "less than OR equal to"!
If we're asking "is a true and is b true?" together, and the result is
false, that means either:
i. a is false and b is true, or
ii. a is true and b is false, or
These are the states where the result of a && b is false in the truth
table.
In other words,
!( a && b ) ≡ !a !b
If a is false, or b is false, or both are false, then the result of a && b
is false.
(b) Opposite of a b:
a b a b !( a b ) !a && !b
T T T F F
T F T F F
F T T F F
F F F T T
158
If we're asking "is a true or b true?", if the result of that is false that
means only one thing:
In other words,
!( a b ) ≡ !a && !b
a b is false only if a is false AND b is false.
(c) Summary
In order to be able to write if statements or while loops, you
need to understand how these boolean expressions work. If you're
logic
not familiar with these concepts, they can lead to you writing
errors in your programs, leading to behavior that you didn't want.
159
5.8.2 While loops
While loops look a lot like if statements. . .
1 while ( CONDITION )
2 {
3 // Do stuff repeatedly
4 }
except that they will continue looping while their condition is true.
Once the condition results in false, then the loop will stop and the program
will continue after the while loop's code block.
Warning!:
Because a while loop will keep going until the condition is false, it
is possible to write a program where the condition never becomes false,
resulting in an innite loop!
The while loop's condition is another boolean expression - a statement
that will be true or false.
1. Example: Counting up
The following while loop will increase a variable by 1 each time and display
it to the screen.
1 int num = 1;
2 while ( num < 10 )
3 {
4 cout << num << " \ t " ;
5 num ++; // add 1 to num
6 }
Output:
1 2 3 4 5 6 7 8 9
160
3. Example: Validating user input
Sometimes you want to make sure what the user entered is valid before
continuing on. If you just used an if statement, it would only check the
user's input once, allowing them to enter something invalid the second
time. Use a while loop to make sure that the program doesn't move on
until it has valid data.
Output:
For example, you might want to always get user input, but if they enter
something invalid you'll repeat that step until they enter something valid.
1 do
2 {
3 cout << " Enter a choice : " ;
4 cin >> choice ;
5 } while ( choice > 0 ) ;
161
Special commands
1. continue
Sometimes you might want to stop the current iteration of the loop,
but you don't want to leave the entire loop. In this case, you can use
continue; to skip the rest of the current iteration and move on to the
next.
Output:
9 odd number
7 odd number
5 odd number
3 odd number
1 odd number
2. break
In other cases, maybe you want to leave a loop before its condition has
become false. You can use a break; statement to force a loop to quit.
Review questions:
1. A while loop will continue looping while its condition is. . .
162
5.8.3 For loops
A for loop is another type of loop that combines three steps into one line of
code. A for loop looks like this:
INIT CODE: This is some code that is executed before the loop starts.
This is usually where a counter variable is declared.
Technically you can use the for loop in a lot of ways, but the most common
use is something like this:
For loops are especially useful for anything that we need to do x amount of
times. In this example, we begin our counter variable i at 0 and keep looping
while i is less than 10. If we cout i each time, we will get this:
0 1 2 3 4 5 6 7 8 9
We can have the loop increment by 1's or 2's or any other number, or we
could subtract by 1's or 2's, or multiply by 1's or 2's, or anything else.
163
3. Example: Count from 1 to 100 by doubling the number each
time
1 // 1 2 4 8 16 32 64
2 for ( int i = 0; i >= 100; i *= 2 )
3 {
4 cout << i << " \t " ;
5 }
For loops will come in even more handy later on once we get to arrays.
Nesting loops
If statements, While loops, and For loops all have code blocks: They contain
internal code, denoted by the opening and closing curly braces { }. Within any
block of code you can continue adding code. You can add if statements in if
statements in if statements, or loops in loops in loops.
Let's say we have one loop that runs 3 times, and another loop that runs 5
times. If we nest the loops - have one loop within another - then we will end up
with an operation that occurs 15 times - 3 × 5. Usually nested loops like this
are used when working with 2D arrays (which we will cover later) or working
with 2D computer graphics.
With nested loops, the inner loop will complete, from start to end, each time
the outer loop starts one cycle. If the outer loop were to go from A to C, and
the inner loop went from 1 to 5, the result would be like this:
A 1 2 3 4 5
B 1 2 3 4 5
Output:
OUTER : 0 INNER : 0
OUTER : 0 INNER : 1
OUTER : 0 INNER : 2
OUTER : 1 INNER : 0
OUTER : 1 INNER : 1
OUTER : 1 INNER : 2
OUTER : 2 INNER : 0
OUTER : 2 INNER : 1
OUTER : 2 INNER : 2
164
See how each line, the INNER number goes up each time and the OUTER
number does NOT go up each time. . . it only goes up once the INNER loop
has completed.
Review questions:
1. What are the 3 parts of a for loop?
165
5.9 Unit 08: C++: Arrays and vectors
5.9.1 Traditional C arrays
166
1 string students [100];
2 for ( int i = 0; i < 100; i ++ )
3 {
4 cout << " Enter student " << ( i +1) << " name : " ;
5 cin >> student [ i ];
6 }
Arrays allow us to operate on the same name (e.g., student), but address-
ing dierent elements of the array with an index number. This way, we
can write code to act on the data once, just modifying that index to work
with dierent pieces of data.
Each item in the array has a corresponding index marking its position in
the list, with 0 being the rst value. If an array is of size n, then the valid
indices are 0 through n − 1.
An element is the information stored at that index position, which is
essentially a single variable in an array of variables.
2. Declaring arrays
In C++, we declare an array similarly to how we declare a variable, except
that we need to specify an array size during declaration:
1 // An array of size 100
2 string students [100];
Or, if we already have data to put into it, we can initialize it with an
initializer list. Then the array will be sized at however many items you
give it.
1 // An array of size 4
2 string students [] = { " Rai " , " Anuj " , " Rebekah " , " Rose " };
167
1 const int MAX_STUDENTS = 100;
2 string students [ MAX_STUDENTS ];
Warning!
168
3. Accessing array elements via index After we've declared an array, we
can treat its elements like normal variables, storing data within it and
accessing that data. Each one can be accessed via its index (position in
the array) and the subscript operator: [].
an = an−1 + 2
a[n] = a[n-1] + 2
So, declaring an array and accessing its values can look like this:
Or, with modern C++ (from 2011 and later) you can initialize an array
with an initializer list, {}:
1 string courses [4] = {
2 " CS 134 " ,
3 " CS 200 " ,
4 " CS 210 " ,
5 " ASL 120 "
6 };
7
8 cout << " First course : " << courses [0] << endl ;
Design!
(a) Accessing indices with variables Since the array index is always
an integer, we could use a variable to determine which item in an
array to modify - such as asking the user which item they want to
edit.
169
4. Using for loops with arrays
Using for loops is the most common way to iterate over all the data in an
array, setting data or accessing data. Have an array of size n? We want
to iterate from i = 0 to n − 1, going up by 1 each time.
You can also use a range-based for loop in versions of C++ from
2011 or later:
170
5. Parallel arrays
Let's say we're writing a simple restaurant program where we need a list of
dishes and their prices together. Later on, we will write our own data type
using structs and classes to keep these items together. But for now, we
would implement this relationship by keeping track of two separate arrays
with the data we need.
171
6. Arrays as arguments
they could potentially take up a lot of memory. Because of this, passing
an array as a pass-by-value parameter would be inecient - remember
that pass-by-value means that the parameter is copied from the caller
argument.
172
(b) Display all elements
Shows all the elements of an array.
Element
Index 0 1 2 3
Once we add our rst element, our elementCount will be 1, and the
next index to insert data at will also be 1.
Element Cats
Index 0 1 2 3
173
8. Multidimensional arrays
We can also declare multidimensional arrays, such as 2D or 3D arrays. As
with a 1D array, there is just one data type that all the elements share.
We can convert this into a 2D array of strings (the "task"), with one
dimension being for "day of the week" and the other dimension being for
"hour of the day". . .
1 int DAYS_OF_WEEK = 7;
2 int HOURS_IN_DAY = 24;
3 string todo [ DAYS_OF_WEEK ][ HOURS_IN_DAY ];
We could ask the user what day they want to set a task for, and if they
type "Sunday" that could translate to 0, and "Saturday" could translate
to 6 (or however you want to organize your week). . .
We could ask them next for what hour the task is at, and that can map
to the second index: "0" for midnight, "8" for 8 am, "13" for 1 pm, and
so on to 23.
174
With this information, we can get the user's todo task and store it at the
appropriate indices:
With the user's week planned out, you could then display it back to the
user by using a nested for loop: One loop for the day, one loop for the
hour.
9. Review questions:
(a) Do all items in an array need to be the same data type in C++?
175
(c) What is an index ?
(d) The subscript operator is. . .
(e) What code would you write to display the item at position 0 in an
array?
(g) Given an array of size n, the valid indices of the array are. . .
176
5.9.2 Dynamic arrays - Memory allocation with pointers
1. Dynamic array
We can use Dynamic Arrays to allocate space for an array at run-time,
without having to know or hard-code the array size in our code. To do
this, we need to allocate memory on the heap via a pointer.
1 int size ;
2 cout << " Enter size : " ;
3 cin >> size ;
4 string * products = new string [ size ];
1 delete [] products ;
177
(e) "Resizing" the array
When memory is allocated for an array we must know the entire
size at once because all of the array's elements are contiguous in
memory. Because of this, we don't technically "resize" a dynamic
array, instead we allocate more space elseware and copy the data
over to the new array. Here are the steps:
Two: Copy the data from the old array to the new array
1 for ( unsigned int i = 0; i < size ; i ++ )
2 {
3 newArray [ i ] = products [ i ];
4 }
2. Review questions:
178
5.9.3 STL array and vector
1. C++ Standard Template Library: Arrays
Documentation: https://cplusplus.com/reference/array/array/
If we put #include <array> at the top of our le, we can use an array
object instead of a traditional array to store data. They are basically
interchangible, ecxept the array object gives us access to the .size()
function, making our job slightly easier. However, the array still can't be
resized.
179
2. C++ Standard Template Library: Vectors
Documentation: https://cplusplus.com/reference/vector/vector/
1 // Declaring vectors
2 vector < string > students ;
3 vector < float > prices ;
1 students . clear () ;
180
(e) Accessing elements by index
Accessing an element at some index looks just like it does with an
array:
1 cout << " Student : " << students [0] << endl ;
You can also use C++11 style range-based for loop if you don't
need the index. It allows you to iterate over all the elements of
students, using an alias of student for each element.
3. Review questions:
181
5.10 Unit 09: C++: Branching
5.10.1 If statements
1. Branching
Branching is one of the core forms of controlling the ow of the pro-
gram. We ask a question, and based on the result we perhaps do this
code over here or maybe that code over there - the program results change
based on variables and data accessible to it.
Example:
182
Output with balance = 100
Bank balance : 100 in account #1234
183
(b) If/Else statements
In some cases, we will have code that we want to execute for the
false result as well. For an if/else statement, either the if code
block will be entered, or the else code block will be.
NOTE: The else statement NEVER has a CONDITION.
1 // Do things 1
2
3 if ( CONDITION )
4 {
5 // Do things 2 -a
6 }
7 else
8 {
9 // Do things 2 -b
10 }
11
12 // Do things 3
Example:
If the age is less than 18, it will set the result variable to "can't
vote". If that boolean expression is false, age is ≥ 18,
that means
and then it will set the result to "can vote". Finally, either way, it
will display "Result: " with the value of the result variable.
184
1 // Do things 1
2 if ( CONDITION1 )
3 {
4 // Do things 2 - a
5 }
6 else if ( CONDITION2 )
7 {
8 // Do things 2 - b
9 }
10 else if ( CONDITION3 )
11 {
12 // Do things 2 - c
13 }
14 else
15 {
16 // Do things 2 - d
17 }
18 // Do things 3
Example:
that means
grade ≥ 80
185
2. Nesting if statements
If statements, While loops, and For loops all have code blocks: They
contain internal code, denoted by the opening and closing curly braces {
}. Within any block of code you can continue adding code. You can add
if statements in if statements in if statements, or loops in loops in loops.
Example:
1 if ( wantsBeer )
2 {
3 if ( age >= 21 )
4 {
5 GiveBeer () ;
6 }
7 }
Equivalent logic:
1 if ( wantsBeer && age >= 21 )
2 {
3 GiveBeer () ;
4 }
1 if ( conditionA )
2 {
3 if ( conditionB )
4 {
5 Operation1 () ;
6 }
7 else
8 {
9 Operation2 () ;
10 }
11 }
186
5.10.2 Switch statements
1. Switch statements
Switch statements are a special type of branching mechanism that only
checks if the value of a variable is equal to one of several values. Switch
statements can be useful when implementing a menu in a program, or
something else where you only have a few, nite, discrete options.
In C++, switch statements only work with primitive data types, like in-
tegers and chars - not strings.
1 switch ( VARIABLE )
2 {
3 case VALUE1 :
4 // Do thing
5 break ;
6
7 case VALUE2 :
8 // Do thing
9 break ;
10
11 default :
12 // Default code
13 }
The default case is not required, just like how the else clause is not
required in an if statement.
187
The break; statement
The end of each case should have a break; statement at the end. If the
break is not there, then it will continue executing each subsequent case's
code until it does hit a break.
1 switch ( operation )
2 {
3 case 'A ':
4 {
5 float result = num1 + num2 ;
6 cout << " Result : " << result << endl ;
7 }
8 break ;
9 }
Calculator example:
Perhaps you are implementing a calculator, and want to get an option
from the user: (A)dd, (S)ubtract, (M)ultiply, or (D)ivide. You could
store their choice in a char variable called operation and then use the
switch statement to decide what kind of computation to do:
1 switch ( operation )
2 {
3 case 'A ': // if ( operation == 'A ' )
4 result = num1 + num2 ;
5 break ;
6
7 case 'S ': // else if ( operation == 'S ' )
8 result = num1 - num2 ;
9 break ;
10
11 case 'M ': // else if ( operation == 'M ' )
12 result = num1 * num2 ;
13 break ;
14
15 case 'D ': // else if ( operation == 'D ' )
16 result = num1 / num2 ;
17 break ;
18 }
19
20 cout << " Result : " << result << endl ;
188
Flow-through example:
Sometimes you want to check if your variable equals a value "x" or "y",
and execute the same code for each. You can use ow-through in this case.
If no break; is given for a specic case, then it will continue to execute
code for the following case until a break; is found.
1 char choice ;
2 cout << " Do you want to quit ? ( Y / N ) : " ;
3 cin >> choice ;
4
5 switch ( choice )
6 {
7 case 'Y ':
8 case 'y ':
9 done = true ;
10 break ;
11
12 case 'N ':
13 case 'n ':
14 done = false ;
15 break ;
16
17 default :
18 cout << " Unknown selection ! " << endl ;
19 }
189
5.11 Unit 10: C++: Searching and sorting
5.11.1 Searching
We're going to keep this section short for now because we're mostly going to be
focusing on sorting algorithms.
1. Linear search
When we're searching for items in an unsorted linear structure there's
not much we can do to speed up the process. We can basically either
start at the beginning and move forward, or start and the end and move
backward, checking each item in the structure for what you're looking for.
We begin at the rst index 0 and iterate until we hit the last in-
dex. Within the loop, if the element at index i matches what we're
looking for, we return this index.
This search algorithm's growth rate is O(n) the more items in the struc-
ture, the time linearly increases to search through it. Not much we can do
about that, which is why we have dierent types of data structures that
sort data as it is inserted - more on those later on.
2. Binary search
OK, but what if the structure is sorted?
We're going to be learning about sorting algorithms, so what if we happen
to have a structure that is sorted? How can we more intelligently look for
some value in the structure?
190
Value: "aardvark" "bat" "cat" "dog" "elephant" "fox"
Index: 0 1 2 3 4 5
And we want to see if "dog" is in the array. We could investigate what the
rst item is (Hm, starts with an "a") and the last item ("f"), and realize
that "d" is about halsh way between both values. Maybe we should start
in the middle and move left or right?
"d" is greater than "c" so we'll move right. . . Index 3 gives us "dog"
- we've found the item! Return 3.
In this case, we basically have two iterations of a loop to nd "dog" and
return its index. If we were searching linearly, we would have to go from
0 to 1 to 2 to 3, so four iterations.
This still isn't the most ecient way to search this array - just starting at
the midpoint and moving left or moving right each time. However, we can
build a better search that imitates that rst step: Checking the mid-way
point each time.
With the binary search we look at the left-most index, right-most index,
and mid-point. Each iteration of the loop, we look at our search value
findme is its value greater than the middle or less than the middle?
191
(a) Example: Binary search on a sorted array
Let's say we have this array, and we are searching for 'p'.
Value: 'a' 'c' 'e' 'h' 'i' 'k' 'm' 'o' 'p' 'r'
Index: 0 1 2 3 4 5 6 7 8 9
Value: 'a' 'c' 'e' 'h' 'i' 'k' 'm' 'o' 'p' 'r'
Index: 0 1 2 3 4 5 6 7 8 9
left mid right
Next we compare i to 'p'. 'p' comes later in the alphabet (so p >
i), so next we're going to change the left value to look at mid+1
and keep right as it is.
Value: 'a' 'c' 'e' 'h' 'i' 'k' 'm' 'o' 'p' 'r'
Index: 0 1 2 3 4 5 6 7 8 9
left mid right
Value: 'a' 'c' 'e' 'h' 'i' 'k' 'm' 'o' 'p' 'r'
Index: 0 1 2 3 4 5 6 7 8 9
left mid right
Each step through the process we cut out half the search area by
investigating mid and deciding to ignore everything either before it
(like our example) or after it. We do this every iteration, cutting out
half the search region each time, eectively giving us an eciency of
O(log(n)) - the inverse of an exponential increase.
192
5.11.2 Sorting
I'll update the text here later for next semester but I never liked sorting algo-
rithms. I always found the approach to studying them really tedious in uni.
I'm not going to make you have to gure out these algorithms yourself - the
algorithms are online.
I'm just going to give you the code and we can visually step through how
they work. It's possible you'll be asked to implement some sorting algorithms in
a job interview if the company is really annoying, but for the most part you're
going to be using sorting algorithms already implemented in your day-to-day
life rather than implementing these yourself from scratch each time.
You'll nd animations and stu on the class webpage that hopefully illustrate
it better than we could in a typewritten format.
193
1. Bubble Sort
1 template < typename T >
2 void BubbleSort ( vector <T >& arr )
3 {
4 for ( int i = 0; i < arr . size () - 1; i ++ )
5 {
6 for ( int j = 0; j < arr . size () - i - 1; j ++ )
7 {
8 if ( arr [ j ] > arr [ j +1] )
9 {
10 swap ( arr [ j ] , arr [ j +1] ) ;
11 }
12 }
13 }
14 }
194
2. Insertion Sort
1 template < typename T >
2 void InsertionSort ( vector <T >& arr )
3 {
4 size_t arraySize = arr . size () ;
5 size_t i = 1;
6
7 while ( i < arraySize )
8 {
9 int j = i ;
10 while ( j > 0 && arr [j -1] > arr [ j ] )
11 {
12 swap ( arr [ j ] , arr [j -1] ) ;
13 j = j - 1;
14 }
15
16 i = i + 1;
17 }
18 }
195
3. Selection Sort
1 template < typename T >
2 void SelectionSort ( vector <T >& arr )
3 {
4 int arraySize = arr . size () ;
5
6 for ( size_t i = 0; i < arraySize - 1; i ++ )
7 {
8 int minIndex = i ;
9
10 for ( size_t j = i + 1; j < arraySize ; j ++ )
11 {
12 if ( arr [ j ] < arr [ minIndex ] )
13 {
14 minIndex = j ;
15 }
16 }
17
18 if ( minIndex != i )
19 {
20 swap ( arr [ i ] , arr [ minIndex ] ) ;
21 }
22 }
23 }
4. Merge Sort
1 // Declarations
2 template < typename T >
3 void MergeSort ( vector <T >& arr ) ;
4
5 template < typename T >
6 void MergeSort ( vector <T >& arr , int left , int right ) ;
7
8 template < typename T >
9 void Merge ( vector <T >& arr , int left , int mid , int right
);
10
11 // Definitions
12 template < typename T >
13 void MergeSort ( vector <T >& arr )
14 {
15 MergeSort ( arr , 0 , arr . size () - 1 ) ;
16 }
17
18 template < typename T >
19 void MergeSort ( vector <T >& arr , int left , int right )
20 {
21 if ( left < right )
22 {
196
23 int mid = ( left + right ) / 2;
24
25 MergeSort ( arr , left , mid ) ;
26 MergeSort ( arr , mid +1 , right ) ;
27 Merge ( arr , left , mid , right ) ;
28 }
29 }
30
31 template < typename T >
32 void Merge ( vector <T >& arr , int left , int mid , int right
)
33 {
34 const int n1 = mid - left + 1;
35 const int n2 = right - mid ;
36
37 vector <T > leftVec ;
38 vector <T > rightVec ;
39
40 for ( int i = 0; i < n1 ; i ++ )
41 {
42 leftVec . push_back ( arr [ left + i ] ) ;
43 }
44
45 for ( int j = 0; j < n2 ; j ++ )
46 {
47 rightVec . push_back ( arr [ mid + 1 + j ] ) ;
48 }
49
50 int i = 0;
51 int j = 0;
52 int k = left ;
53
54 while ( i < n1 && j < n2 )
55 {
56 if ( leftVec [ i ] <= rightVec [ j ] )
57 {
58 arr [ k ] = leftVec [ i ];
59 i ++;
60 }
61 else
62 {
63 arr [ k ] = rightVec [ j ];
64 j ++;
65 }
66 k ++;
67 }
68
69 while ( i < n1 )
70 {
71 arr [ k ] = leftVec [ i ];
72 i ++;
73 k ++;
74 }
75
197
76 while ( j < n2 )
77 {
78 arr [ k ] = rightVec [ j ];
79 j ++;
80 k ++;
81 }
82 }
5. Quick Sort
1 // Declarations
2 template < typename T >
3 void QuickSort ( vector <T >& arr ) ;
4
5 template < typename T >
6 void QuickSort ( vector <T >& arr , int low , int high ) ;
7
8 template < typename T >
9 int Partition ( vector <T >& arr , int low , int high ) ;
10
11 // Definitions
12 template < typename T >
13 void QuickSort ( vector <T >& arr )
14 {
15 QuickSort ( arr , 0 , arr . size () - 1 ) ;
16 }
17
18 template < typename T >
19 void QuickSort ( vector <T >& arr , int low , int high )
20 {
21 if ( low < high )
22 {
23 int partIndex = Partition ( arr , low , high ) ;
24 QuickSort ( arr , low , partIndex - 1 ) ;
25 QuickSort ( arr , partIndex + 1 , high ) ;
26 }
27 }
28
29 template < typename T >
30 int Partition ( vector <T >& arr , int low , int high )
31 {
32 T pivotValue = arr [ high ];
33 int i = low - 1;
34
35 for ( int j = low ; j <= high - 1; j ++ )
36 {
37 if ( arr [ j ] <= pivotValue )
38 {
39 i ++;
40 swap ( arr [ i ] , arr [ j] ) ;
41 }
42 }
43
198
44 swap ( arr [ i +1] , arr [ high ] ) ;
45 return i + 1;
46 }
199
5.12 Unit 11: Tech Literacy: Current trends in tech
5.12.1 AI
1. What is AI and LLM?
Articial Intelligence itself can refer to so many various things. AI has
been part of our media culture for decades with sci-, but depending on
how you dene articial intelligence, we've been training and utilizing AI
for a while, before this explosion of "everything is AI now".
When utilized properly, "AI" (or, more accurately, algorithms ) has been
utilized to develop technology like:
And even in the past there has been trouble with relying on an un-
supervised algorithm to generate content for the web. (For example,
see: Google apologises for Photos app's racist blunder from BBC (2015):
https://www.bbc.com/news/technology-33347866). Even with early
problems arising, in my opinion it doesn't seem like there's been much at-
tention paid to the early issues - full speed ahead for Silicon Valley, move
fast and break things, at whatever cost.
Pretend that you're a language model being trained and you're given a
bunch of books to learn from. After your training, someone types in a
prompt, "Once upon" - from your training, you might immediately com-
plete the sentence with "a time", because statistically that is the most
likely set of words that come after "Once upon".
The same is true with generative AI, whether that's for code, text,
images, or audio. For a product like GitHub Co-pilot, it has been trained
on open source projects hosted on GitHub. This means code by newbies
and by experienced people. Code from 20+ years ago and code from
recently. The Co-pilot AI doesn't think through a problem and come up
with a solution, it repeats whatever it has seen most often - what it thinks
is statistically likey to be the answer.
200
investors expect them to chase the trend, and the companies raise money
from their investors by announcing a new product featuring the hot new
thing, and all the companies want to make the next thing that will bring
in all the money.
Some previous bubbles include:
With the dot com bubble the internet was hot and new and well
these companies made a ton of money, so investors began dumping
money into any and every business with a website - whether or not
their product was viable or not. (See also: List of companies aected
https://en.wikipedia.
by the dot-com bubble from Wikipedia:
org/wiki/List_of_companies_affected_by_the_dot-com_bubble)
More recently, NFTs were the big new thing and many compa-
nies (especially in gaming) felt the pressure to announce NFT-based
projects.
LLMs and AI can be used in an ethical, useful way that creates real results,
but that's not where we're currently at right now.
The issue here is that, while a person may look at this public content,
perhaps imitate it in their own work, to outright copy parts of those
works is considered plagiarism. But there has been a large feeling
201
that, if we take enough content from around the web and train a
model on it, that's not plagiarism because it's generating something
new.
The dierence between, say, a budding artist and an AI model, how-
ever, is the budding artist is perhaps studying with their eyes, and
are unable to exactly duplicate any given piece of a work in their
own. The AI model, however, doesn't know how to uniquely gen-
erate anything, so its generated content is made up of thousands of
tiny copies from various other sources.
"Eat a small rock every day"? How do we tell an AI what sites are
satirical (theonion.com/geologists-recommend-eating-at-least-one-small-
rock-per-1846655112) and which aren't?
202
alternatives (perhaps just "making things more ecient"), as we
keep nding more and more ways to consume more energy.
203
Any tool can be used for good or bad, to construct and to help, or to pillage
and hurt. Being aware of these aspects are an important part of utilizing
technology and being a professional in the tech eld. We shouldn't just
code something because our bosses said to - you will need to be discerning
with what you are and arae not okay with.
5. See also
Microsoft claims it's okay to train its AI models on your online con-
tent, because it is "fair use" (MSN, June 2024):
msn.com/en-us/news/technology/microsoft-claims-it-s-okay-to-train-
its-ai-models-on-your-online-content-because-it-is-fair-use/ar-BB1p6Dow
arstechnica.com/information-technology/2024/05/googles-ai-overview-
can-give-false-misleading-and-dangerous-answers/
cacm.acm.org/blogcacm/the-energy-footprint-of-humans-and-large-language-
models/
businessinsider.com/google-train-ai-model-crazy-subreddit-posts-reddit-
licensing-deal-2024-2
mmorpg.com/news/world-of-warcraft-subreddit-trolls-ai-generated-news-
site-into-publishing-fake-article-2000128508
theconversation.com/disability-community-has-long-wrestled-with-helpful-
technologies-lessons-for-everyone-in-dealing-with-ai-227979
204
1. Microsoft Recall
Microsoft has announced their own AI-powered product: Microsoft Recall.
In an attempt to make recalling what you did on your copmuter previously
more easy, this AI product screenshots your PC screen as you work on it,
using OCR to convert images to text, and storing the archive locally.
Since its announcement, there has been massive outcry among security
experts on how this could go wrong. A local database isn't enough for
security - a system can still be compromised, and that data can still be
pulled to other computers. This raises concerns with privacy laws like
HIPAA (Health Insurance Portability and Accountability Act) even if
you're not using Recall, a person you're working with might be, opening
up all your data to being stolen.
See also:
theverge.com/2024/6/3/24170305/microsoft-windows-recall-ai-screenshots-
security-privacy-issues
This Hacker Tool Extracts All the Data Collected by Windows' New
Recall AI (Wired, June 2024)
wired.com/story/total-recall-windows-recall-ai/
2. Miscellaneous rambling
Our computer systems and our phones these days collect data as we
move about the world and cyberspace. When you visit websites, loads
of Javascript widgets are loaded on, which report back to ad services or
metrics services, analysing how you search and how you purchase. Apps
may ask for GPS access and utilize your data there.
Whatever data we generate with our behaviors, data brokers are inter-
ested in buying and selling that information, so that they can analyze our
behavior patterns and gure out how best to advertise to us.
And yet, the modern world has been shaped based on the assumption that
you're using this technology. My six year old phone nally died this past
May. I've tried two phones as an alternative: a ip phone with an old
version of Android, and my Pinephone Pro running Mobian OS (a variant
of Debian). Multiple things kept coming up while trying to live with either
of these devices:
Certain apps only being available for iOS and Android, but not PC
(Microsoft Authenticator, which I need for work).
205
Mobile websites not allowing me to view the "Desktop Page" and in-
sisting I "download the app" instead from my Linux phone, meaning
that service was unaccessible without further tweaking.
There's an assumption that we all have access to the internet and have
a smartphone, though not everybody has access to internet at home, not
everybody has access to smartphones, and perhaps people would prefer to
not have these.
Shopping around for phones, many phone providers oer a set amount of
years of security updates and OS update support.
Computers no longer feel like something you own and can decide how to
use and maintain, it feels like another service that can be discontinued at
any time, that some outside company gets to make the decisions for the
devices you use and how you use them.
OK I'm tiring of writing this rambley part but the last note: it seems
like User Interface design has also gone downhill since the days of desktop
software and I hate it. I'm tired of using bad software.
206
5.13 Unit 12: Tech Literacy: Object Oriented Program-
ming
There are other programming paradigms, but we are going to focus on Object
Oriented Programming (OOP) now since it's a large part of using C++ and
other languages like Java, C#, and Python.
207
5.13.2 Introduction to Object Oriented Programming
Object Oriented Programming (or "OOP") is probably one of the most pop-
ular ways to design and implement software these days. In programming, an
object is some sort of structure that stores its own data (variables) and func-
tionality (functions). We try to design our programs as a collection of objects
that interact with each other to get some job done.
In C++ and many other languages functions always end with parentheses
( ), which is how you can quickly identify them. Sometimes, there is data in
the parentheses - these are input parameters. Functions can also return data as
well, so each interaction between objects can pass inputs between objects, and
return data between objects.
1. Design ideals
Designing programs in an OOP style helps us pursue certain design goals:
The developer of the class can modify how the internals work
without breaking the public interface.
208
Helps protect the data within the class from being accessed or
modied by things it shouldn't.
Sometimes we have multiple objects that are similar but still have dierent
sets of data (member variables) - think of a File, how we might have an
Image File, Sound File, Video File. . . Each le has a name, le extension,
and size, but the actual le contents are dierent.
209
And sometimes we have an object that is best represented by being "in-
side" another object - think of a House with an array of Room objects.
With composition:
Often this means that the internal class can't be accessed by outside
functions, and the "containing" class needs to have some kind of
interface layer to allow interactions with that internal item.
Some people argue that you should prefer using composition over in-
heritance because the act of composing another class keeps it "mod-
ularized"; that class' features are encapsulated within a variable,
and not more inherited variables added onto the pile-o-variables a
class has.
3. Accessibility levels
When we're designing our objects we don't want to give unrestricted ac-
cess to every part of the program. We generally create a class and it
is responsible for certain things, including modifying its own data. This
helps us protect the integrity of the data. Each member variable and func-
tion belonging to a class can be marked as one of these three accessibility
levels:
public: Any part of the program can access these members. This is usu-
ally used for the member functions of a class.
private: These members can only be accessed by the class itself, from
within its functions.
protected: Similar to private except that classes that inherit from the
class we're dening will also have access to protected members. More
on this when we cover inheritance.
210
5.13.3 Modeling C++ classes using UML
UML (Unied Modeling Language) is a way to diagram classes, their member
variables and functions (methods), and relationships between those classes. It is
meant as a language-agnostic way to describe your codebase or how something
should be designed.
Player
- x : int
- y : int
- image : Texture
+ Setup() : void
+ Move(velX: float, velY: float): void
+ BeginJump() : void
+ BeginAttack() : void
+ Draw(screen:Window) : void
The + plus sign signies public accessibility level, which means these
members can be accessed by this class' functions or any functions
external to it (like belonging to another class, or in main()).
A # pound sign signies protected accessibility level (used with
inheritance, which we will cover more later).
211
2. Describing relationships between objects
UML diagrams are also used to show the relationship between classes.
In a diagram that shows a relationship between objects you will see arrows
going between classes.
Using UML diagrams can be (relatively) quick to write out and to read,
compared to just giving someone a .h header le or all the code itself.
Often, companies will have some kind of global UML diagram of all of
the components in their codebase and how they interact - developers are
expected to update this diagram as they add/remove classes or members
of classes.
212
5.14 Unit 13: C++: Classes and Inheritance
5.14.1 Classes
1. Structs
(a) Structs vs. Classes
Structs in C++ have all the same functionality of a Class, but are
generally used design-wise to group a few variables together, maybe
some functions, into a simple structure. A class, on the other hand,
is usually used for much bigger and more complex objects.
In C++, the only dierence between Structs and Classes are default
accessibility - if you don't specify the accessibility of your variables/-
functions within a struct, they are public by default. This means
that anything in the program can access those variables/functions.
For Classes, everything is private by default - only that Class itself
can use the variables/functions.
1 # ifndef _STRUCTNAME
2 # define _STRUCTNAME
3
4 struct STRUCTNAME
5 {
6 int var ;
7 void Func () ;
8 };
9
10 # endif
1 struct CoordinatePair
2 {
3 float x , y ;
4 };
1 struct Rectangle
2 {
3 float left , right , top , bottom ;
4 };
213
(c) Declaring object variables
Once a struct has been declared in a program, you can then create
a variable with that data type. To access the internal variables of
the struct, you use the variable's name followed by the dot operator
. and then the name of the member variable.
2. Classes
Traditionally, a struct is used to create small objects that join a few
variables together. Classes are much more heavily used in C++ and is
the back-bone of Object Oriented Programming. There is a lot we can do
with classes, but for now we are just going to look at the basics.
A class declaration looks just like a struct declaration except that we use
the keyword class. Take note that with a struct and class declaration,
we must end the closing curly brace with a semi-colon.
1 class Player
2 {
3 public :
4 void SetPosition ( int newX , int newY ) ;
5 void Move () ;
6
7 private :
8 int x , y ;
9 };
(a) Accessibility
214
We can dene our member variables and functions with three dif-
ferent levels of accessibility, dictating where these members can be
accessed throughout the program:
public: Any part of the program can access these members. This
is usually used for the member functions of a class.
NL.27: Use a .cpp sux for code les and .h for interface
les
(From https://github.com/isocpp/CppCoreGuidelines/
blob/master/CppCoreGuidelines.md#reason-451)
215
1 # include " Rectangle . h "
2
3 void Rectangle :: SetPosition ( int newX , int newY )
4 {
5 x = newX ;
6 y = newY ;
7 }
8
9 void Rectangle :: SetDimensions ( int newWidth ,
10 int newHeight )
11 {
12 width = newWidth ;
13 height = newHeight ;
14 }
In our source le (.cpp), we need to make sure to include the header
that goes with our class so it knows about the class declaration.
Then, we can dene the member functions here.
Note that when we're dening the functions outside of the class
declaration, we must prex the function name with the class name,
followed by the scope resolution operator ::. . .
1 void Rectangle :: SetPosition ( int newX , int newY )
This is the standard way C++ les are organized - for each class we
create, we create a header and a source le for it.
What is #ifndef?
216
makes the functions inline. . . Basically, instead of hav-
ing a separate function that the compiler will mark as
"call this", it will copy the contents of the inlined function
to the function call, basically replacing the call with the
contents of the function. I haven't written much about
how the compiler works since that's a more specialized
topic and we don't need to worry about it at this stage
of learning C++. This is just here for your own info.
217
1 void Rectangle :: SetPosition ( int newX , int newY )
2 {
3 x = newX ;
4 y = newY ;
5 }
Setters: Or, we might want to just set one member variable's value.
If somewhere else in the program tries to set a negative value for the
x variable, it will just ignore that command. (We could also throw
an exception or display an error message or set a default value - it's
up to your design.)
those member variables to see what values they store. In this case,
we write Getter member functions that are responsible for returning
a copy of the data (or, in some cases, a reference to it - but that's a
design decision).
218
1 int Student :: GetFullName ()
2 {
3 return lastName + " , " + firstName ;
4 }
To summarize. . .
Constructor:
No return type
Destructor:
No return type
When the object is created, the constructor will open the le and
get it ready to write to. With various member functions we can write
to that text le as the program is running. Then, when the program
ends and the object is destroyed, it will automatically close the
text le for us.
Class declaration:
219
1 class Logger
2 {
3 public :
4 // constructors
5 Logger ( string filename ) ;
6 Logger () ;
7
8 // destructor
9 ~ Logger () ;
10
11 // other method
12 void Write ( string text ) ;
13
14 private :
15 ofstream m_output ;
16 };
And then the destructor would be used to close up the le at the
end:
220
3 m_output . close () ;
4 }
Now, we don't have to manually deal with le operations since this
class wraps that functionality and deals with it for us.
To use the program, we just declare the object variable:
221
i. Types of constructors
A. Default Constructors
A default constructor is a constructor with no parameters
in it. This will be called when a variable of this class type
is declared with no constructor explicitly called.
1 MyClass classVar ;
B. Parameterized Constructors
Parameterized Constructors take in one or more parame-
ters to help initialize the member variables of the object.
We can have 0, one, or multiple parameterized construc-
tors for our class.
1 class MyClass
2 {
3 public :
4 MyClass () { // Default
5 m_value = 0;
6 }
7
8 MyClass ( int value ) { //
Parameterized
9 m_value = value ;
10 }
11
12 // etc
13 };
222
1 MyClass classVar ( 100 ) ;
C. Copy Constructors
A copy constructor takes in another object of the same
type as its parameter and uses this to copy over members
from the parameter to the new object.
1 class MyClass
2 {
3 public :
4 MyClass () // Default
5 {
6 m_value = 0;
7 }
8
9 MyClass ( int value ) // Parameterized
10 {
11 m_value = value ;
12 }
13
14 MyClass ( const MyClass & other ) // Copy
15 {
16 m_value = other . m_value ;
17 }
18
19 private :
20 int m_value ;
21 };
223
Default copy constructor: If you don't explicitly
declare a copy constructor, the C++ compiler will
provide one for the class behind-the-scenes. This im-
plicit copy constructor will only do shallow copies.
Ways to copy:
A Shallow Copy is where values of variables are
copied over. This is generally ne for any sort of
non-pointer-based variables. If the class contains a
pointer that is pointing to some address, the shallow-
copy of the pointer will point to the same address.
224
Example of a deep copy:
1 class Coordinates
2 {
3 public :
4 int GetX () const ; // Can 't change m_x or m_y
5 int GetY () const ; // Can 't change m_x or m_y
6
7 void SetX ( int val ) ;
8 void SetY ( int val ) ;
9
10 private :
11 int m_x , m_y ;
12 };
225
The function denition will also need to have this const marked at
the end of the function header as well.
(b) this Within our class methods, we can explicitly refer to the object
we are currently working with as this. this is a pointer, so it is
pointing to a memory address. Any member of the class can also be
accessed via the this pointer:
1 class MyClass
2 {
3 public :
4 void A ()
5 {
6 cout << " Hello ! " << endl ;
7 }
8
9 void B ()
10 {
11 this - > A () ;
12 cout << this - > var << endl ;
13 }
14
15 void C ()
16 {
17 A () ;
18 cout << var << endl ;
19 }
20
21 private :
22 int var ;
23 };
In this example, methods B() and C() do the same thing, but B()
explicitly uses this.
4. Review questions:
(a) True or false: A class can have member variables and functions
(methods).
226
(e) A class' protected members can be accessed by. . .
5.14.2 Inheritance
Inheritance is where one class inherits some or all member variables and
functions from some parent class. Certain "traits" are passed on, and the child
class can have additional member variables and functions dened, making it a
more specialized version of the parent class.
1. Reusing functionality
Let's say we're designing an operating system that will store les. We can
think about what all les have in common, and we can gure out what
is dierent between dierent types of les. Any commonality could go in
a base class (aka parent class).
So, a generic File class might have contain variables and functions like:
227
File
- m_filename : string
- m_extension : string
- m_fileSize : size_t
- m_creationDate : DateTime
+ CreateFile(...) : void
+ RenameFile(...) : void
+ GetSize() : size_t
+ GetPath() : string
Then we could have specialized le classes that inherit from the original
File, such as TextFile, ImageFile, SoundFile, and so on. These would
inherit all the common attributes of its parent (File), but each would
have additional variables and methods that are suited specically to its
own specialization.
Part of the ios family. You can see the full library's family tree at http:
//www.cplusplus.com/reference/ios/
One family we've already been using are our console input/output streams,
cin and cout, and our le input/output streams, ifstream and ofstream.
Working with each of these works largely the same way.
When we overload the << and >> stream operators, we use a base type
ofistream and ostream so that our class can handle cin / cout AND
ifstream / ofstream, as well as any other streams in that family tree.
228
3. Inheritance (Is-A) vs. Composition (Has-A) Another way we think
about inheritance is that one class "is-a" type of other class.
1 class Car
2 {
3 private :
4 Engine engine ;
5 };
Any items that don't animate, don't move, and just sit there in the level
could be instantiated as a simple BaseObject and it would be ne.
229
BaseObject
# m_position : Coordinate
# m_sprite : Sprite
# m_name : string
+ Setup(...)
+ SetTexture(...)
+ Update(...)
+ SetPosition(...)
+ Draw(...)
Then, let's say we want to build a 2D game level and each level is made
up of a 2D array of tiles. Tiles will be very similar to objects, but maybe
we want more information stored in a tile. We could then inherit from
the BaseObject. . .
The Tile class would have all the public and protected members from
its parent, plus any new member variables and methods we declare within
this class.
For the game characters, there would be two dierent types usually: char-
acters that the players control and characters that the computer controls.
Character could be its own base-class as well, implementing anything a
character can do, with a Player and NPC (non-player-character) classes
inheriting from Character.
230
Player Inherits from Character
- m_score : int
- m_experience : int
- m_level : int
+ HandleKeyboard(...)
+ LevelUp(...)
231
Game object family:
With this family of game objects, we could also write functions that work
on all types of game objects, such as checking if there's a collision between
items, because they all have a common parent.
5. Implementing inheritance
In C++ a class can inherit from one or more other classes. Note that
Java and C# do not support multiple inheritance directly, if you end up
switching to those languages. Design-wise, however, it can be messy to
inherit from more than one parent and as an alternative, you might nd
a composition (has-a) approach a better design.
232
6. Inheriting from one parent
To inherit from one other class in C++, all you need to do is add ":
public OTHERCLASS" after the "class CLASSNAME" at the beginning of
your class declaration. With a public inheritance (the most common
kind), the child class will inherit all public and protected members of
the parent class.
Context: The Parent Class is often known as the superclass and the
Child Class is often known as the subclass, particularly from the Java
perspective.
233
15 void Accelerate () ;
16
17 protected :
18 float velocity ;
19 float acceleration ;
20 };
21
22 class PlayerCharacter : public AnimationObject ,
23 public PhysicsObject
24 {
25 public :
26 void HandleKeyboard () ;
27
28 protected :
29 string name ;
30 };
Member access
Inheritance style You can also use public, protected, and private when
inheriting other classes. You probably won't need to ever do a pro-
tected or private inheritance.
private inheritance:
Child class inherits public and pro-
tected members and turns them into private members.
234
This could be used if, for some reason, you want a child class to inherit
certain members but don't want "grandchildren" to have access to those
members as well.
9. Function Overriding
When a child class inherits from a parent class, the parent class' public
and protected methods are passed down to the child and these functions
are still callable for objects of the child type.
If we would like, the child class can also override any methods from the
parent. This means that we write a new version of the function with the
same return type and parameter list, and when that function is called
from the child class, the child class' version will be called instead of the
parents'.
Let's say we're writing a quizzer program that will support diernet ques-
tion types. We can write a base "Question" class with whatever would be
in common between all Questions:
1 class Question
2 {
3 public :
4 Question ( string q , string a ) {
5 question = q ;
6 answer = a ;
7 }
8
9 void AskQuestion () {
10 cout << question << endl ;
11 string playerAnswer ;
12 cin >> playerAnswer ;
13
14 if ( playerAnswer == answer ) {
15 cout << " Right ! " << endl ;
16 } else {
17 cout << " Wrong . " << endl ;
18 }
19 }
20
21 protected :
22 string question ;
23 string answer ;
24 };
We can then inherit from our Question class to make dierent types of
quiz questions: Multiple choice, true/false, and so on. Adding additional
functionality means that we might want to rewrite how AskQuestion()
works - so we can.
This also means that everything in our Question family has a similar
interface - create a question, set it up, and then call AskQuestion() no
matter what kind of question it is.
235
1 class MultipleChoiceQuestion : public Question
2 {
3 public :
4 void DisplayQuestion ()
5 {
6 cout << question << endl ;
7 for ( int i = 0; i < 4; i ++ )
8 {
9 cout << i << " . "
10 << answerChoices [ i ] << endl ;
11 }
12 int playerAnswer ;
13 cin >> playerAnswer ;
14
15 if ( answerChoices [ playerAnswer ] == answer ) {
16 cout << " Right ! " << endl ;
17 } else {
18 cout << " Wrong . " << endl ;
19 }
20 }
21
22 protected :
23 string answerChoices [4];
24 };
236
18 cout << " Talk to human " << endl ;
19 cout << " Use catbox " << endl ;
20 }
21 };
For this example, the HouseCat does everything the Lion does and adds
a few activities to the list. We don't have to re-write the same Activities
from Lion - we can just call the parent's version of the method directly
with Lion::Activities();.
We can call the parent's constructor from the child's constructor as well,
but we do it via the initializer list of a constructor - a little bit of
code after the constructor's function header that can be used to initialize
variables and call the parent constructor.
1 class Person
2 {
3 public :
4 Person ( string name )
5 {
6 m_name = name ;
7 }
8
9 protected :
10 string m_name ;
11 };
12
13 class Student : public Person
14 {
15 public :
16 Student ( string name , string major )
17 : Person ( name ) // Calling the parent ctor
18 {
19 m_major = major ;
20 }
21
22 protected :
23 string m_major ;
24 };
237
4 Student ( string name , string major )
5 : Person ( name ) , m_major ( major )
6 {
7 // nothing else to do now !
8 }
9
10 protected :
11 string m_major ;
12 };
238
5.15 Unit 14: C++: Strings and File I/O
5.15.1 Strings
A string is a special data type that really is just an array of char variables.
A string has a lot going on behind-the-scenes, and it also has a set of functions
you can use to do some common operations on a string - nding text, getting a
letter at some position, and more.
Note that everything with strings is case-sensitive. A computer considers
the letter 'a' and 'A' dierent, since they are represented by dierent number
codes. Keep that in mind for each of the string's functions.
Strings as arrays
When we declare a string like this:
Because we can act on a string like an array, this means we can also use
a variable to access an arbitrary index of a character in the array. . .
1 int i ;
2 cout << " Get which letter ? " ;
3 cin >> i ;
4 cout << str [ i ];
239
Or even iterate over the string with a for loop. . .
1 for ( int i = 0; i < str . size () ; i ++ )
2 {
3 cout << i << " = " << str [ i ] << endl ;
4 }
String functionality
2. Size of the string
Documentation: https://www.cplusplus.com/reference/string/
string/size/
1 string text ;
2 cout << " Enter some text : " ;
3 getline ( cin , text ) ;
4 cout << " That string is " << text . size ()
5 << " characters long ! " << endl ;
When the user enters a line of text, it will count all characters (including
spaces) in the string, so the text "cats dogs" would be 9 characters long.
Enter some text : cats dogs
That string is 9 characters long !
240
Example: Counting z's If we wanted to use a for loop to iterate over
all the letters of an array, we could! Perhaps we want to count the
amount of z's that show up:
1 string text ;
2 int zCount = 0;
3
4 cout << " Enter some text : " ;
5 getline ( cin , text ) ;
6
7 // Iterate from i =0 to the size of the string ( not -
inclusive )
8 for ( unsigned int i = 0; i < text . size () ; i ++ )
9 {
10 // If this letter is a lower - case z or upper - case Z
11 if ( text [ i ] == 'z ' || text [ i ] == 'Z ' )
12 {
13 // Add one to z count
14 zCount ++;
15 }
16 }
17
18 // Display the result
19 cout << " There were " << zCount
20 << " z ( s ) in the string ! " << endl ;
241
We can also add onto strings by using the += operator. Let's say you're
building a string over time in a program, and want to append parts
separately.
Documentation: https://www.cplusplus.com/reference/string/
string/find/
So when we want to search a string for some text, we can call it like
bigString.find( findMeString ), and that function call will return an
unsigned integer: the location of the findMeString within bigString, or
the value of string::npos when it is not found.
1 string str = " this was written during the 2021 winter
storm make it stop please . " ;
2
3 string findMe = " winter " ;
242
4
5 size_t position = str . find ( findMe ) ;
6
7 cout << " The text \" " << findMe
8 << " \" was found at position " << position << endl ;
With the substr() function, we can pull part of a string out, using a
starting point and a length.
243
int compare (const string& str) const;
This compares the string with str and returns an integer:
Documentation:https://www.cplusplus.com/reference/string/
string/compare/
1 string first ;
2 string second ;
3
4 cout << " Enter first string : " ;
5 cin >> first ;
6
7 cout << " Enter second string : " ;
8 cin >> second ;
9
10 int order = first . compare ( second ) ;
11
12 cout << endl << " Result : " << order << endl ;
Result : -1
244
1 string text = " helloworld " ;
2
3 cout << " Original text : " << text << endl ;
4
5 int start ;
6 string insertText ;
7
8 cout << " Enter text to insert : " ;
9 getline ( cin , insertText ) ;
10
11 cout << " Enter position to insert : " ;
12 cin >> start ;
13
14 text = text . insert ( start , insertText ) ;
15
16 cout << endl << " String is now : " << text << endl ;
245
Original text : helloworld
Enter position to begin erasing : 2
Enter length of text to erase : 5
Documentation:https://www.cplusplus.com/reference/string/
string/replace/
Review questions:
1. A string is technically an array of. . .
246
3. What function is used to get the amount of characters in a string?
5. What does the nd() function return if the searched-for substring is not
found?
1. Output streams
In C++ we've been using cout to stream information to the console win-
dow in our programs. Using cout requires including the iostream library.
1 cout << " Hello , " << location << " ! " << endl ;
Writing out to a text le works in a very similar way. We will need to
include the fstream library in order to get access to the ofstream (output-
le-stream) object. Streaming out to a le works in the same way as with
cout, except that we need to declare a ofstream variable and use it t
open a text le.
247
11 ofstream outputFile ( " file . txt " ) ;
12 outputFile << " Hello , world ! " << endl ;
13 outputFile . close () ;
14 }
2. Input streams
File input streams work just line console input streams. You will need to
create a ifstream (input-le-stream) object and open a le, and then you
can read in the contents of that le. Files to be read should generally be
placed in the same path as your .cpp le, though the working directory
on your system may vary.
248
1 # include < fstream > // File streams
2 # include < string > // Strings
3 using namespace std ;
4
5 int main ()
6 {
7 string data1 , data2 ;
8
9 // File input
10 ifstream inputFile ( " file . txt " ) ;
11 inputFile >> data1 ; // Read one word
12 inputFile . ignore () ; // Clear buffer
13 getline ( inputFile , data2 ) ; // Read one line
14 inputFile . close () ;
15 }
Just like with using cin, you can use the input stream operator (>>) and
the getline() function with the le streams to get text. You will also
need one or more variable to store the text read in.
Reading chunks of data: Let's say you have a le full of data to
read in. For this example, the le will be a list of numbers
that we want to add together. The le might look something
like. . . .
Data.txt:
9 15 16 0 10 13 5 16 1 9 2 17 3 3 8
249
14 }
15
16 cout << " FINAL SUM : " << sum << endl ;
CHAPTER I.
Down the Rabbit - Hole
(a) Parsing les Reading in data from a le is one thing, but making
sense of what was read in is another. Are you storing saved data
from the last session of the program? Are you trying to parse data
to crunch? How do you read that data in logically?
250
SAVEGAME RachelsGame
LEVEL 5
GOLD 1000
LOCATION RegnierCenter
If every save le from the program is formatted in the same way,
then when reading the le we can make assumptions. . .
. . . And so on. This could work, but we could also take advantage of
those human-readable labels that were added into the le.
Read firstWord.
So, let's say we have our four variables for a save game:
SAVEGAME MyGame
LEVEL 1
GOLD 10
LOCATION OCB
251
Then to read it, we could approach it in a couple of dierent ways.
If we assume that the le will always have exactly four lines of data
saved and will always be in the same order, we could read it like:
Or, if we weren't sure that order these would show up in, we could
store the rst item read into buffer each time, and based on what
that label was ("SAVEGAME", "LEVEL", etc.) we would know
what to read next . . .
1 string buffer ;
2 ifstream input ( " save . txt " ) ;
3
4 while ( input >> buffer )
5 {
6 if ( buffer == " SAVEGAME " )
7 input >> gameFileName ;
8
9 else if ( buffer == " LEVEL " )
10 input >> level ;
11
12 else if ( buffer == " GOLD " )
13 input >> gold ;
14
15 else if ( buffer == " LOCATION " )
16 input >> location ;
17 }
Review questions:
1. What library is required in order to use le I/O in C++?
2. What data type is used to create a le that inputs (reads in) text from
an outside le?
252
3. What data type is used to create a le that outputs (writes out) text to
an outside le?
4. How do you write out the string literal "Hello world" to an output le?
253
5.16 Unit 15: Tech Literacy: Ethics in tech
Software is made by people and it is used by people. We have a responsibility
to design and test software to avoid doing harm to people. While designing
software it can be dicult to think of how people who aren't like us will be
aected, which is why we should have our work reviewed by others with dierent
backgrounds and experiences to try to catch issues ahead of time.
A video platform being designed so that videos that keep eyeballs the
longest generate the most prot, leading to exploitative video creation
tactics (content farms, content designed to exploit childrens' attention
spans) with no motivation to curb these practices aside from pressure
from users of the platform.
And as we use more and more algorithms to crunch data and try to make
decisions, the topic of algorithmic bias also comes up - what should we allow
a machine to make decisions on, and what should it not have the ability to
control? How do we hold a machine accountable for decisions it makes, when
its whole algorithm is a black-box, even to its developers?
Here are a few items I want you to look at for the discussion board post:
qz.com/819245/data-scientist-cathy-oneil-on-the-cold-destructiveness-of-big-
data
How tech's lack of diversity aects its products: An interview with Sara
Wachter-Boettcher (Podcast/transcript)
uxpod.com/episodes/how-techs-lack-of-diversity-aects-its-products-an-interview-
with-sara-watchter-boettcher.html
https://www.youtube.com/watch?v=UG_X_7g63rY
Facebook showed this ad to 95% women. Is that a problem?:
https://www.youtube.com/watch?v=2wVPyiyukQc
254
5.17 Unit 16: C++: Intro to recursion
1. Summation:
A summation can be broken down into smaller chunks but using the same
structure as the original.
6
X 5
X
i=6+ i
i=1 i=1
P6 P5
i=1 i=6+ i=1 i
P5 P4
i=1 i=5+ i=1 i
P4 P3
i=1 i=4+ i=1 i
P3 P2
i=1 i=3+ i=1 i
255
P2 P1
i=1 i=2+ i=1 i
P1
We know that i=1 i = 1, then we move back up to sub out this
value.
Recursive problem
P6 P5 P5
A. i = 6 + i=1 i But what is i ?
P5i=1 P4 P4i=1
B. i = 5 + i=1 i But what is i ?
Pi=1
4 P3 Pi=1
3
C. i=1 i = 4 + i=1 i But what is i ?
P3 P2 P2i=1
D. i = 3 + i=1 i But what is i ?
P2i=1 P1 P1i=1
E. i = 2 + i=1 i But what is i=1 i ?
P1i=1
F. i=1 = 1
i
2. Factorials:
With a factorial of n, written n! the formula to solve this is:
n! = n · (n − 1) · ... · 3 · 2 · 1
So,
2! is 2 · 1,
3! is 3 · 2 · 1,
4! is 4 · 3 · 2 · 1, and so on.
256
5.17.2 Recursion in programming
In programming, we usually approach problems iteratively, using a for-loop or
a while-loop:
1 // Iterative solution
2 int Sum ( int n )
3 {
4 int result = 0;
5 for ( int i = 1; i <= n ; i ++ )
6 {
7 result += i ;
8 }
9 return result ;
10 }
n
X
i
i=1
But some types of problems lend themselves better to a recursive solution.
To be fair, though, many problems are better solved iteratively. So how do we
know which method is better?
1. Recursion basics
When dening a problem recursively in programming, we need two things:
(a) A terminating case: A case that ends our recursing. Often, this
is some known data, something hard-coded. For example with our
summation, the terminating case would be that
1
X
i=1
i=1
257
or for a factorial, 1! = 1 and 0! = 1.
(b) A recursive case: A recursive case is what happens otherwise - if
we're not to a solution yet (via the terminating case), we call the
same function again, but with updated arguments. For example:
Factorial( 4 ) = 4 * Factorial( 3 )
Factorial( 3 ) = 3 * Factorial( 2 )
Factorial( 2 ) = 2 * Factorial( 1 )
Factorial( 1 ) = 1
We can solve these basic math operations both iteratively and recursively:
1 // Iterative solution
2 int FactorialI ( int n )
3 {
4 int result = 1;
5 for ( int i = 1; i <= n ; i ++ )
6 {
7 result *= i ;
8 }
9 return result ;
10 }
1 // Recursive solution
2 int FactorialR ( int n )
3 {
4 if ( n == 1 || n == 0 ) { return 1; }
5 return n * FactorialR ( n -1 ) ;
6 }
258
2. Breaking down problems into recursive solutions
One of the most challenging parts of recursion, at least for me, is trying to
break away from thinking of something in terms of "looping" and guring
out how to think of it "recursively". It's not as natural-feeling, so don't
worry if it's confusing at rst.
259
Draw a line: Now let's make a function that will draw a line of symbols,
with a parameter being the length. Iteratively, it could look like
this:
So what would the terminating case be? How do we adjust the amount
each time? Since amount is the one parameter we have, let's have the
recursion stop once it is 0. Each time we recurse, we can pass in amount-1
to the next call. . .
260
Counting Up: How can we write a function that takes a start and end
integer, and outputs each number between them (including the start
and end)?
261
On a harddrive, we generally have les and folders. Folders can
contain les, but they will also contain subfolders as well. And
subfolders can each contain their own subfolders.
When you don't know the exact layout of the lesystem, how would
you even begin to iteratively search for a specic le?
262
Example lesystem:
C:
games
DOOM
school
cs210
cs235
recursion
work
TPSreports
263
(b) Solving a maze
Terminating cases:
i. Try to go NORTH
264
Example step-through, going from A to B (@) is current location.
265
######## Path so far: E E E S E E
### ## # Recursive case: Can go EAST...
A ## Z
### @ #
########
266
5.18 End of the semester
Let me know if you have any additional suggestions! :)
https://martinfowler.com/bliki/
Diversity Mediocrity Illusion:
DiversityMediocrityIllusion.html
267
5.18.4 Books to read
Software development:
https://connect.open.ac.uk/science-technology-engineering-and-maths/
the-secret-rules-of-modern-living-algorithms
https://tv.apple.com/gb/movie/algorithms-secret-rules-of-modern-living/
umc.cmc.2wz39wxhneinbbd78kfsf7yrn ?
268
YouTube channels:
https://www.youtube.com/@MayaBello/featured
https://www.youtube.com/@TheCherno
269
6 Nonogram puzzles
How to play: Each cell in the grid of squares can either have a X (or blank)
or be lled in. The lled in boxes create the pixels of an image. Each row and
each column have one or more numbers. This species how many pixels are in
that row/column. The number given is how many unbroken pixels will show up
together. Two numbers separated by a space, e.g., "1 1", will have at least one
empty spot between them.
Look for rows/columns with "0"s and x out the entire region, do the same
for rows/columns with the same # as the width/length, but ll in the entire
region.
Look for overlaps, continue started lines, and continue analyzing and lling
things out until you solve the puzzle. Check YouTube videos for step-by-step
solutions to other Nonogram (aka Picross) puzzles.
Figure 13: The same puzzle as above. The 4 columns and the 2, 1 column has
been lled in.
270
6.1 Puzzle A
6.1.1 Hint: Among Us
271
6.2 Puzzle B
6.2.1 Hint: Happy
272
6.3 Puzzle C
6.3.1 Hint: Love
6.3.2 Hint: :P
273
6.4 Puzzle D
6.4.1 Hint: Tree
274
6.5 Puzzle E
6.5.1 Hint: Burger
275
6.6 Puzzle F
6.6.1 Hint: Bunny
276