Day 03: Teaching myself C++

Vishal Rashmika published on
11 min, 2195 words

Categories: Cpp

NOTE:

I'm a self-taught programmer, who recently started a new adventure to learn C++ by reading a ton of other people's code and language documentations. This method might not work for all the people. Beacause it requires a certain degree of experience in a low-level or a mid-level programming language like C in order to read and learn a language like C++ from other people's code and language documentations. For me this was possible because, I had some experience using C which I learned for the course CS50x. First, I started with the scripts that Daniel Gakwaya, had released in his github repository The C 20 Masterclass source code. I will compose this blog post to demonstrate the lessons I learnt on my third day of analyzing his scripts.

1. Switch Statements

#include <iostream>
#include <string>


// Tools
const int Pen{ 10 };
const int Marker{ 20 };
const int Eraser{ 30 };
const int Rectangle{ 40 };
const int Circle{ 50 };
const int Ellipse{ 60 };


int main(){

    int tool {Eraser};

    switch (tool)
    {
        case Pen : {
             std::cout << "Active tool is Pen" << std::endl;
        }
        break;

        case Marker : {
             std::cout << "Active tool is Marker" << std::endl;
        }
        break;


        case Eraser :
        case Rectangle : 
        case Circle : {
             std::cout << "Drawing Shapes" << std::endl;
        }
        break;

        case Ellipse : {
             std::cout << "Active tool is Ellipse" << std::endl;
        }
        break;
    
        default: {
            std::cout << "No match found" << std::endl;
        }
            break;
    }
   
    return 0;
}

2. Math Functions

should include the #include <cmath>

2.1 Ceil() & floor()

std::cout << "Weight rounded to floor is : " << std::floor(7.7) << std::endl; //7
std::cout << "Weight rounded to ceil is : " << std::ceil(7.7) << std::endl; //8

2.2 abs()

  • returns the absolute value of an argument
std::cout << "Abs of weight is : " << std::abs(7.7) << std::endl; //7.7
std::cout << "Abs of savings is : " << std::abs(-5000) << std::endl; //5000

2.3 exp() (Exponential)

double exponential = std::exp(10);
std::cout << "The exponential of 10 is : " << exponential << std::endl;

2.4 pow() (Power)

std::cout << "3 ^ 4 is : " << std::pow(3,4) << std::endl;
std::cout << "9 ^ 3 is : " << std::pow(9,3) << std::endl;

2.5 sqrt() (Square Root)

std::cout << "The square root of 81 is : " << std::sqrt(81) << std::endl;

2.6 round()

std::cout << "3.654 rounded to : " << std::round(3.654) << std::endl; // 4
std::cout << "2.5 is rounded to : " << std::round(2.5) << std::endl; // 3
std::cout << "2.4 is rounded to : " << std::round(2.4) << std::endl; // 2

3. Output Formatting

3.1 std::endl

std::endl : places a new line character on the output stream. This is identical to placing '\n' on the output stream.

std::cout << "Hello World!" << std::endl;

3.2 std::flush

std::flush : flushes the output buffer to its final destination.

    std::cout << "This is a nice message...." << std::endl << std::flush;
    //After this std::flush, we're sure that at this line, the message has been sent 
    //to the stream. This may be important in some applications.

3.3 std::setw() (set width)

std::setw() : Adjusts the field with for the item about to be printed.

  • The setw() manipulator only affects the next value to be printed.
	//unformatted table
    std::cout << "Unformatted table : " << std::endl;
    std::cout << "Daniel" << " " << "Gray" << " 25" << std::endl;
    std::cout << "Stanley" <<" "  << "Woods" << " 33" << std::endl;
    std::cout << "Jordan" << " "  << "Parker" << " 45" << std::endl;
    std::cout << "Joe" << " " << "Ball" << " 21" << std::endl;
    std::cout << "Josh" << " " << "Carr" << " 27" << std::endl;
    std::cout << "Izaiah" << " " << "Robinson" << " 29" << std::endl;

    //formatted table
    int col_width{14};
    
    
    std::cout << std::setw(col_width) <<  "Lastname"  << std::setw(col_width) << "Firstname" << std::setw(col_width/2) << "Age" << std::endl;
    std::cout << std::setw(col_width) << "Daniel"  << std::setw(col_width) << "Gray" << std::setw(col_width/2) << "25" << std::endl;
    std::cout << std::setw(col_width) << "Stanley" << std::setw(col_width)  << "Woods" << std::setw(col_width/2) <<  "33" << std::endl;
    std::cout << std::setw(col_width) <<  "Jordan" << std::setw(col_width)  << "Parker" << std::setw(col_width/2) << "45" << std::endl;
    std::cout << std::setw(col_width) <<  "Joe" << std::setw(col_width) << "Ball" << std::setw(col_width/2) << "21" << std::endl;
    std::cout << std::setw(col_width) << "Josh" << std::setw(col_width) << "Carr" << std::setw(col_width/2) <<"27" << std::endl;
    std::cout << std::setw(col_width) << "Izaiah" << std::setw(col_width) << "Robinson" << std::setw(col_width/2) << "29" << std::endl;

3.4 justify

Justify : Values can be justified in their fields. There are three manipulators for adjusting the justification: left, right, and internal.

3.4.1 right justified

 col_width = 20;
    
    std::cout << std::right;
    std::cout << std::setw(col_width) <<  "Lastname"  << std::setw(col_width) << "Firstname" << std::setw(col_width/2) << "Age" << std::endl;
    std::cout << std::setw(col_width) << "Daniel"  << std::setw(col_width) << "Gray" << std::setw(col_width/2) << "25" << std::endl;
    std::cout << std::setw(col_width) << "Stanley" << std::setw(col_width)  << "Woods" << std::setw(col_width/2) <<  "33" << std::endl;
    std::cout << std::setw(col_width) <<  "Jordan" << std::setw(col_width)  << "Parker" << std::setw(col_width/2) << "45" << std::endl;
    std::cout << std::setw(col_width) <<  "Joe" << std::setw(col_width) << "Ball" << std::setw(col_width/2) << "21" << std::endl;
    std::cout << std::setw(col_width) << "Josh" << std::setw(col_width) << "Carr" << std::setw(col_width/2) <<"27" << std::endl;
    std::cout << std::setw(col_width) << "Izaiah" << std::setw(col_width) << "Robinson" << std::setw(col_width/2) << "29" << std::endl;
    

3.4.2 left justified

    col_width = 20;
    
    std::cout << std::left;
    std::cout << std::setw(col_width) <<  "Lastname"  << std::setw(col_width) << "Firstname" << std::setw(col_width/2) << "Age" << std::endl;
    std::cout << std::setw(col_width) << "Daniel"  << std::setw(col_width) << "Gray" << std::setw(col_width/2) << "25" << std::endl;
    std::cout << std::setw(col_width) << "Stanley" << std::setw(col_width)  << "Woods" << std::setw(col_width/2) <<  "33" << std::endl;
    std::cout << std::setw(col_width) <<  "Jordan" << std::setw(col_width)  << "Parker" << std::setw(col_width/2) << "45" << std::endl;
    std::cout << std::setw(col_width) <<  "Joe" << std::setw(col_width) << "Ball" << std::setw(col_width/2) << "21" << std::endl;
    std::cout << std::setw(col_width) << "Josh" << std::setw(col_width) << "Carr" << std::setw(col_width/2) <<"27" << std::endl;
    std::cout << std::setw(col_width) << "Izaiah" << std::setw(col_width) << "Robinson" << std::setw(col_width/2) << "29" << std::endl;
    

3.4.3 internal justified


    //Internal justified : sign is left justified , data is right justified
    std::cout << std::endl;
    std::cout << "Internal justified : " << std::endl;
    std::cout << std::right;
    std::cout << std::setw(10) << -123.45 << std::endl;
    std::cout << std::internal;
    std::cout << std::setw(10) << -123.45 << std::endl;

3.5 setfill

std::cout << std::endl;
    std::cout << "Table with fill characters :  " << std::endl;
    
    col_width = 20;
    
    std::cout << std::left;
    std::cout << std::setfill('*'); // The fill character
    std::cout << std::setw(col_width) <<  "Lastname"  << std::setw(col_width) << "Firstname" << std::setw(col_width/2) << "Age" << std::endl;
    std::cout << std::setw(col_width) << "Daniel"  << std::setw(col_width) << "Gray" << std::setw(col_width/2) << "25" << std::endl;
    std::cout << std::setw(col_width) << "Stanley" << std::setw(col_width)  << "Woods" << std::setw(col_width/2) <<  "33" << std::endl;
    std::cout << std::setw(col_width) <<  "Jordan" << std::setw(col_width)  << "Parker" << std::setw(col_width/2) << "45" << std::endl;
    std::cout << std::setw(col_width) <<  "Joe" << std::setw(col_width) << "Ball" << std::setw(col_width/2) << "21" << std::endl;
    std::cout << std::setw(col_width) << "Josh" << std::setw(col_width) << "Carr" << std::setw(col_width/2) <<"27" << std::endl;
    std::cout << std::setw(col_width) << "Izaiah" << std::setw(col_width) << "Robinson" << std::setw(col_width/2) << "29" << std::endl;
    
Table with fill characters :
Lastname************Firstname***********Age*******
Daniel**************Gray****************25********
Stanley*************Woods***************33********
Jordan**************Parker**************45********
Joe*****************Ball****************21********
Josh****************Carr****************27********
Izaiah**************Robinson************29********

3.6 boolalpha and noboolapha

control bool output format : 1/0 or true/false

  • noboolalpha : 0/1
  • boolalpha : True/False
bool condition {true};
    bool other_condition {false};
    
    std::cout << "condition : " << condition << std::endl;
    std::cout << "other_condition : " << other_condition << std::endl;
    
    std::cout << std::endl;
    std::cout << std::boolalpha;
    std::cout << "condition : " << condition << std::endl;
    std::cout << "other_condition : " << other_condition << std::endl;
    
    std::cout << std::endl;
    std::cout << std::noboolalpha;
    std::cout << "condition : " << condition << std::endl;
    std::cout << "other_condition : " << other_condition << std::endl;

4. Arrays

4.1 Declaration

int array_name[9]

char message4 [] {"Hello"};

char message [6] {"Hello"}; // 6 with the '\n'

4.2 Declare and initialize at the same time

// omit the size declaration
int class_sizes[] {10,12,15,11,18,17,23,56}; 

double salaries[5] {12.7, 7.5, 13.2, 8.1, 9.3};

4.3 Reading

std:: cout << " scores [0] : " << scores[0] << std::endl;
std:: cout << " scores [1] : " << scores[1] << std::endl;

4.4 Read Only Arrays

const int birds[] {10,12,15,11,18,17,23,56};

4.5 size of

   int scores [] {1,2,5};
   std::cout << "sizeof(scores) : " << sizeof(scores) << std::endl;  // 12
   std::cout << "sizeof(scores[0]) : " << sizeof(scores[0]) << std::endl;  // 4

5. Multi-Dimensional Arrays

5.1 2D Arrays

#include <iostream>

int main(){

    int packages [] [4] {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {3,4,5,6}
    };

    //Read data from a 2D array
    for(size_t i{0} ; i < 3; ++ i){
        for(size_t j{0}; j < 4 ; ++j){
            std::cout << packages[i][j] << "   ";
        }
        std::cout << std::endl;
    }

   //Use std::size to query the size of array dimensions
    for(size_t i{0} ; i < std::size(packages); ++ i){
        for(size_t j{0}; j < std::size(packages[i])  ; ++j){
            std::cout << packages[i][j] << "   ";
        }
        std::cout << std::endl;
    }

    return 0;
}

5.2 3D Arrays

#include <iostream>

int main(){

	//3D arrays are defined in the same way. We just use three sets of indexes
    // 3 lights per room, 5 rooms per house 7 houses per block
    int house_block [7] [5] [3] {
        {
            {1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15} 
        },
        {
            {16,17,18},{19,20,21},{22,23,24},{25,26,27},{28,29,30}  
        },
        {
            { 31,32,33},{34,35,36},{37,38,39},{40,41,42},{43,44,45} 
        },
        {
             {46,47,48},{49,50,51},{52,53,54},{55,56,57},{58,59,60}  
        },
        {
             {61,62,63},{64,65,66},{67,68,69},{70,71,72},{73,74,75} 
        },
        {
            {76,77,78},{79,80,81},{82,83,84},{85,86,87},{88,89,90}  
        },
        {
             {91,92,93},{94,95,96},{97,98,99},{100,101,102},{103,104,105} 
        }
    };

    for(size_t i{0}; i < std::size(house_block) ; ++i){

        for(size_t j{0} ; j < std::size(house_block[i]) ; ++j){

            for(size_t k{0} ; k < std::size(house_block[i][j]) ; ++k){

                std::cout << house_block[i][j][k] << "     ";
            }
        }
    }
   
	//For 3d and really any multi dimensional array , you have to specify
	//the number of elements in []'s , only the left most is not mandatory.
	//Below is the example for 3D reproduced.Omitting the 5 or the 3 or both
	//will cause a compile error.
    int house_block1 [] [5] [3] {
        
        {
            {1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15} 
        },
        {
            {16,17,18},{19,20,21},{22,23,24},{25,26,27},{28,29,30}  
        },
        {
            { 31,32,33},{34,35,36},{37,38,39},{40,41,42},{43,44,45} 
        },
        {
             {46,47,48},{49,50,51},{52,53,54},{55,56,57},{58,59,60}  
        }
          
    };

    return 0;
}

5.3 Multi-Dimensional Arrays with characters

#include <iostream>

int main(){

	const size_t name_length{15};
	
    char members [][name_length] {
        {'J','o','h','n'},
        {'S','a','m','u','e','l',},
        {'R','a','s','h','i','d'},
        {'R','o','d','r','i','g','e','z'}
    };

	//Better : Using C-string litterals
	//Compared to initialization with charactes with in '', this
	// is even easier to type. The entire string is a single entity 
	//you can manage easily.
    
    char members1 [][name_length] {
        "John",
        "Samuel",
        "Rashid",
        "Rodriguez"
    };
    
    //Printing out members1
    std::cout << "Printing out members1 (C-string literals) : " << std::endl;
    for (size_t i {0}; i < std::size(members1) ; ++i){
        std::cout << members1[i] << std::endl;
    }
    
    return 0;
}

6. Generating Random Numbers

#include <iostream>
#include <ctime>
#include <cstdlib>

int main(){

    std::srand(std::time(0)); // Seed

    int random_num = std::rand();
    std::cout << "random_num : " << random_num << std::endl; // 0 ~ RAND_MAX

    // Generate random numbers in a loop
    int random_num;
    for(size_t i {0} ; i < 20 ; ++i){
        random_num = std::rand();
        std::cout << "random_num " << i << ":" <<  random_num << std::endl; // 0 ~ RAND_MAX       
    }
    
    // Generate a range between 0 and 10
    int random_num =  std::rand() % 11;                  // [ 0 ~10]
    for(size_t i {0} ; i < 20 ; ++i){
        random_num = std::rand() % 11;
        std::cout << "random_num " << i << "  :   " <<  random_num << std::endl; // 0 ~ RAND_MAX       
    }

    // Generate a range between 1 and 10
    int random_num = std::rand() % 10 + 1 ; // [1~10]
    for(size_t i {0} ; i < 20 ; ++i){
        random_num = std::rand() % 10 + 1;
        std::cout << "random_num " << i << "  :   " <<  random_num << std::endl; // 0 ~ RAND_MAX       
    }
   
    return 0;
}

7. For Loops

for( unsigned int i{0} ; i < 10000 ;++i){
    //Whatever we want the loop to run
}

7.1 Multiple declaration

for (size_t i{0} , x {5}, y{22} ; y > 15 ; ++i , x+=5 , y-=1){
    std::cout << "i: " << i << ", x : " << x << ", y : " << y << std::endl;
}

7.2 Range Based For loops

int bag_of_values [] {1,2,3,4,5,6,7,8,9,10};

for (int value : bag_of_values){
    std::cout << " value : " << value << std::endl;
}
for (int value : {1,2,3,4,5,6,7,8,9,10}){
    std::cout << " value : " << value << std::endl;
}

8. While Loops

#include <iostream>

int main(){
    const size_t COUNT{100};
    size_t i{0}; // Iterator declaration

    while(i < COUNT ){ // Test
       std::cout << i << " : I love C++" << std::endl;

       ++i; // Incrementation 
    }
   
    return 0;
}

8.1 Do While Loops

#include <iostream>

int main(){
    const int COUNT{0};
    size_t i{0}; // Iterator declaration

    do{
        std::cout << i << " : I love C++" << std::endl;
        ++i; // Incrementation
    }while( i < COUNT);

    return 0;
}

9. Break & Continue Loops

    const size_t COUNT{20};

    for(size_t i{0} ; i < COUNT ; ++i ){

        if(i==5)
            continue;

        if(i == 11)
            break; // Breaks out of the loop
        std::cout << "i : " << i << std::endl;
    }

10. Pointers

10.1 Declaring

    //Declare and initialize pointer
    int* p_number {}; // Will initialize with nullptr
    double*  p_fractional_number{};

    //Explicitly initialize with nullptr
    int* p_number1{nullptr};
    int* p_fractional_number1{nullptr};

    //It doesn't matter if you put the * close to data type or to varible name
    int*  p_number2{nullptr};
    int * p_number3{nullptr};
    int  *p_number4{nullptr};

10.2 Assigning

    int int_var {43};
    int *p_int{&int_var};// The address of operator (&);

    //Can't cross assign between pointers of different types
    int *p_int1{nullptr};
    double double_var{33}; // Compile Error

11. File Reader

#include <iostream>
#include <fstream>
#include <string>

int main (){
    std::ifstream myfile;
    myfile.open("demo.txt");
    std::string myline;

    if ( myfile.is_open() ) {

        while ( myfile ) { // equivalent to myfile.good()
            std::getline (myfile, myline);
            std::cout << myline << '\n';
        }
        
    }
    else {
        std::cout << "Couldn't open file\n";
    }

return 0;      
}

Thats it for day 3, hope you enjoyed the content.