This is an old revision of the document!
Table of Contents
Week 00 Materials
This week is for participants in the experimental CS 19 Boot Camp.
Monday
Tuesday
Scope and Lifetime
scopes.cpp (illustrating locally and globally scoped variables)
- scopes.cpp
- /**
- * @file scopes.cpp
- * @author Jeffrey Bergamini for CS 19 Boot Camp, jeffrey.bergamini@cabrillo.edu
- *
- * Let's see how much you understand/remember about scope and lifetime in C++!
- */
- #include <iostream>
- int x;
- void f1() {
- x = 2;
- std::cout << x << '\n';
- }
- void f2(int x) {
- std::cout << x << '\n';
- {
- int x;
- x = 4;
- std::cout << x << '\n';
- }
- x = 5;
- std::cout << x << '\n';
- }
- int main() {
- x = 1;
- std::cout << x << '\n';
- f1();
- std::cout << x << '\n';
- f2(3);
- std::cout << x << '\n';
- int x;
- x = 6;
- std::cout << x << '\n';
- }
Notes
Your job: Be the compiler and the shell and determine the output of this program without using any tools other than your mind!
Then compile and run this code to see if you were right.
scopes_annotated.cpp (illustrating locally and globally scoped variables)
- scopes_annotated.cpp
- /**
- * @file scopes_annotated.cpp
- * @author Jeffrey Bergamini for CS 19 Boot Camp, jeffrey.bergamini@cabrillo.edu
- *
- * Let's add *memory addresses* to the output to see which symbol `x` represents in which context.
- */
- #include <iostream>
- int x; // global variable, global scope
- void f1() {
- x = 2; // assigns to global variable `x`
- std::cout << &x << '\t' << x << '\n';
- }
- void f2(int x) {
- std::cout << &x << '\t' << x << '\n';
- {
- int x; // local variable (local to function `f1()`), scoped within anonymous block
- x = 4; // assigns to local variable `x` scoped within anonymous block
- std::cout << &x << '\t' << x << '\n';
- }
- x = 5; // assigns to local variable `x` (function parameter)
- std::cout << &x << '\t' << x << '\n';
- }
- int main() {
- x = 1; // assigns to global variable (i.e., global var `x` is a *lvalue*)
- std::cout << &x << '\t' << x << '\n';
- f1();
- std::cout << &x << '\t' << x << '\n'; // function `f1()` should have mutated global variable `x`
- f2(3);
- std::cout << &x << '\t' << x << '\n'; // function `f2()` has not mutated global variable `x`
- int x; // local variable, local scope
- x = 6; // assigns to local variable `x` (global `x` is now "shadowed" for the rest of the block)
- std::cout << &x << '\t' << x << '\n';
- }
Notes
This is the same program, but prints the memory address of each variable in question. Note which x
variables are at the same address, i.e. are literally the same integer object.
raii.cpp (illustrating the concept of RAII)
- scopes_annotated.cpp
- /**
- * @file raii.cpp
- * @author Jeffrey Bergamini for CS 19 Boot Camp, jeffrey.bergamini@cabrillo.edu
- *
- * RAII: "Resource acquisition is initialization"
- * Perhaps easier to understand: "scope-based resource management"
- *
- * An object's resources (memory storage, file handles, etc.) are allocated during initialization,
- * and released during destruction. When an object's lifetime ends, its resources should be
- * deallocated/cleaned up/closed/etc.
- *
- * We'll run this through `strace` to verify when files are opened/closed:
- * strace --trace=openat,close ./a.out </srv/datasets/shakespeare-othello.txt
- */
- #include <cctype>
- #include <fstream>
- #include <iostream>
- // Counts and returns the number of English vowel characters in an input stream.
- size_t count_vowels(std::istream &source) {
- size_t vowel_count = 0;
- for (char c; source >> c;) {
- c = std::tolower(c);
- if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
- ++vowel_count;
- }
- return vowel_count;
- }
- int main() {
- std::ifstream hamlet{"/srv/datasets/shakespeare-hamlet.txt"};
- // Preview of subtype polymorphism: A `std::ifstream` *is a* `std::istream`
- // (i.e., an input stream reading from a file is a specific kind of input stream)
- std::cout << "Hamlet: " << count_vowels(hamlet) << '\n';
- std::cout << "Hamlet again: " << count_vowels(hamlet) << '\n';
- {
- std::ifstream macbeth{"/srv/datasets/shakespeare-macbeth.txt"};
- std::cout << "Macbeth: " << count_vowels(macbeth) << '\n';
- // Lifetime of `macbeth` ends here. File will be closed.
- }
- std::ifstream othello{"/srv/datasets/shakespeare-othello.txt"};
- std::cout << "Othello: " << count_vowels(othello) << '\n';
- // std::cout is just a plain input stream:
- std::cout << "std::cin: " << count_vowels(std::cin) << '\n';
- // Lifetimes of `hamlet` and `othello` end here.
- // Will be closed in the opposite order of initialization (`othello`, then `hamlet`)
- }
Notes
RAII is a horrible acronym, but understanding its consequences in C++ is important.
scope_lifetime_practice.cpp (an opportunity to think and practice)
- scope_lifetime_practice.cpp
- /**
- * @file scope_lifetime_practice.cpp
- * @author Jeffrey Bergamini for CS 19 Boot Camp, jeffrey.bergamini@cabrillo.edu
- *
- * Some lunchtime practice!
- */
- #include <cctype> // `std::isprint()`
- #include <fstream> // `std::ifstream`
- #include <iostream> // `std::cout`
- int main(int argc, char **argv) {
- std::ifstream f1(argv[1]);
- std::ifstream f2(argv[2]);
- // TODO: Find all the printable characters unique present in one file and not the other.
- // Print each unique character and its ASCII number, one character per line, in ascending order.
- }
Notes
Having some data to test with is useful. I have many textual datasets available. If you have your program in a form that is executable in a terminal, the following commands should work for testing:
Command:
./a.out <(echo suitably) <(echo implausible)
Expected Output:
e 101 m 109 p 112 t 116 y 121
Command:
./a.out <(curl -s https://jeff.cis.cabrillo.edu/datasets/genius.txt) <(curl -s https://jeff.cis.cabrillo.edu/datasets/injust.txt)
Expected output:
' 39 , 44 - 45 . 46 J 74 M 77 j 106 k 107 v 118
Command:
./a.out <(curl -s https://jeff.cis.cabrillo.edu/datasets/shakespeare-hamlet.txt) <(curl -s https://jeff.cis.cabrillo.edu/datasets/shakespeare-macbeth.txt)
Expected Output:
" 34 # 35 $ 36 % 37 * 42 + 43 / 47 0 48 4 52 5 53 6 54 7 55 8 56 9 57 < 60 = 61 > 62 @ 64 J 74 U 85 X 88 Z 90 _ 95 j 106 ~ 126
Wednesday
TBD
Thursday
TBD
Friday
TBD