Welcome to Lesson 11!

Learning Objectives
By the end of today's class, you should know...
  • What are some of the mistakes you could make when you write your conditional statements involving logical operators?
  • What is a loop?
  • What is a while loop?
  • What is the syntax of a while loop?
  • How does the syntax of a while loop compare to an if statement?
  • How do you use a while loop to count?

Announcements

  • Quiz 4 on Thursday
  • Return midterms before the break. 
  • Excellent midterm results!
    • As: 25 <-- 4 100% scores
    • Bs: 8
    • Cs: 4
    • Ds: 1
    • Fs: 3
  • Lab 6 due Friday at midnight


Pre-Assessment Activity


Review of Numbers, Operators and Precision:

  • With a partner: Write three equivalent statements to the one below, using the shortcuts described last class:
x = x + 1;
  • With a partner: Write one statement to print the following value to the console to 5 decimal places:
        const double PI = 3.1415927;

Review of Conditions Involving Logical Operators:
  • Imagine that a local radio station is holding a contest to give away a year's supply of free pet food to one lucky winner.
  • To win the contest, you must meet the following criteria:
    • You must be caller 19
    • The pet your own must be one of the following: dog, cat, rabbit
    • You must be between the ages of 18 and 65.
  • Which of the following test conditions will correctly determine the winner of the contest
a. if (numCaller = 19 && (pet = "rabbit" || pet = "cat" || pet = "dog") && (age >= 18 && age <= 65))
cout << "You are the winner!";

b. if (numCaller == 19 && (pet == "rabbit" || "cat" || "dog") && (age >= 18 && <= 65))
      cout << "You are the winner!";

c. 
if (numCaller == 19 || (pet == "rabbit" && pet == "cat" && pet == "dog") || (age >= 18 && age <= 65))
      cout << "You are the winner!";


d. 
if (numCaller == 19 && (pet == "rabbit" || pet == "cat" || pet == "dog") && (age >= 18 && age <= 65))
      cout << "You are the winner!";

e. 
if (numCaller == 19 && (pet == "rabbit" || pet == "cat" || pet == "dog") && (age >= 18 || age <= 65))
cout << "You are the winner!";
  • What will the following print to the console?

int age = 20;

bool is_student = true;

if (is_student || age > 21) {

    cout << "Fi!";

}

if (!is_student && age < 21) {

    cout << "Fo!";

}

if (is_student && age < 21) {

    cout << "Fum!";

}

Wrapping Up Conditionals

Conditional Pitfalls

  • Unfortunately, you can write many things in C++ that should be incorrect but end up working for some obscure reason
  • This means that you can code something that should create an error message but does not
  • Thus, a program may compile and run with no error messages but still be wrong
  • Since you may not realize that it is wrong, it can be hard to find and correct these types of errors

Strings of Inequalities

  • One common mistake is to use = when you meant to use ==
  • For example, look at the test condition in the following code:
    if (guess = 7) {
        cout << "*** Correct! ***\n";
    } else {
        cout << "Sorry, that is not correct.\n";
    }
    
  • Notice that the condition is really an assignment statement and not a test
  • You would think that it would fail to compile -- but it does not
  • However, it will not work as you might expect
  • A way to prevent this type of problem is to reverse the order of your test condition:
    if (7 = guess) {
  • Now the compiler will give you an error message and your code will not compile:
    guess.cpp: In function `int main()":
    guess.cpp:10: error: non-lvalue in assignment
    
  • However, if you correctly use == then your code will compile
    if (7 == guess) {

Strings of Inequalities

  • Do NOT use a string of inequalities like the following:
    int a = 5, b = 1, c = 10;
    if (a < b < c) {
        cout << "b is between a and c\n";
    } else {
        cout << "b is NOT between a and c\n";
    }
    
  • Your code may compile and run but give incorrect results
  • The test condition is evaluated by the computer from left to right
  • The first condition is a < b which evaluates to 0 (false)
  • The second condition is then 0 < c which evaluates to 1 (true)
  • Since the whole test condition evaluates to true you get an incorrect result
  • Instead, the correct way is to use && as follows:
    int a = 5, b = 1, c = 10;
    if (a < b && b < c) {
        cout << "b is between a and c\n";
    } else {
        cout << "b is NOT between a and c\n";
    }
    

Strings of Logical Operators

  • Logical expressions often read like "normal" English.
  • However, C++ requires more exactness than English
  • For example, the following code will compile and run but give wrong results:
    int guess;
    cout << "Enter a guess: ";
    cin >> guess;
    if (guess == 7 || 8) {
        cout << "*** Correct! ***\n";
    } else {
        cout << "Sorry, that is not correct.\n";
    }
    
  • The test condition is evaluated by the computer from left to right
  • The left hand side is (guess == 7) which can evaluate to either true or false
  • The right hand side is 8, which is interpreted as true by C++
  • Since (something or true) is always true, then the test condition always evaluates to true
  • Instead, the correct way is to use || as follows:
  • int guess;
    cout << "Enter a guess: ";
    cin >> guess;
    if (guess == 7 || guess == 8) {
        cout << "*** Correct! ***\n";
    } else {
        cout << "Sorry, that is not correct.\n";
    }
  • We will work more with test conditions and logical operators as we write programs containing loops.


Hand Back and Go Over Midterms


Introducing Loops

  • In your daily life, there are many actions that you repeat until some condition is met.
  • For example: 
    • You might run on the treadmill at the gym until 30 minutes are up.
    • You might wash dishes until the pile of dirty dishes is gone.
    • You might take classes every quarter until you receive your degree.
    • Can you think of any others?
  • When we write code, often times we find ourselves repeating statements.
  • Loops allow us to carry out repetitive steps in our code without having to re-write the same statements over and over.
  • These loops will run until some test condition is met, just like the examples above.
  • You wrote your first loops when you did your Hour of Code lab assignment.
    • When did you need loops in this assignment?

Simple Loops

  • loop is a block of code that can execute repeatedly
  • Whether or not a program repeats a block of code is determined by a test condition
  • The test condition is checked each time the loop executes
  • In general, loops have three components:
    • Initialization code
    • Test condition -- evaluated during the loop
    • Loop body with some way to change the test condition
  • There are three loop statements in C++:
    • for
    • while
    • do...while
  • We will start with the simplest of the three -- the while statement

While Loops

  • The simplest looping structure is the while statement
  • A while statement has a test condition and a body, like an if statement
  • Before each execution of the loop body, the while statement checks the test condition
  • If the test condition evaluates to true, then our program executes the body of the loop
  • When the program reaches the end of the loop body, it automatically returns to the while statement
  • Here is the syntax of a while loop:
initialization statement;

while (test){ 
 
    statements to repeat
}
  • For example:
string repeat = "y";
while ("y" == repeat) {
cout << "Do you want to play again? (y/n): "
cin >> repeat;
}
  • What does the while loop syntax remind you of?
  • The following flow chart shows how the while loop operates

Diagram of while Loop Operation

C++ while loop
Image source.

  • Let's look at an example.

Understanding the while Loop

  • The following looping application simulates the play of an exciting game
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main() {
    string repeat = "y";
    while ("y" == repeat) {
        cout << "\nPlaying an exciting game!\n";
        cout << "Do you want to play again? (y/n) ";
        cin >> repeat;
    }
    cout << "\nThanks for playing!\n";

    return 0;
}
  • Notice the structure of the code for the looping application
  • First was the statement to initialize the looping condition:
    string repeat = "y"; //gives the variable its starting value
  • Then came the while statement with the test condition
    while ("y" == repeat) 
  • The loop executes the body of the loop if and only if the condition evaluates to true
  • Another important part of the loop is the update statement: 
cin >> repeat; //changes the value of the variable
  • Most loops have these parts:
    • Initialization statement
    • Test condition
    • Update statement (allows the loop the option to fail)
  • Question: What would happen if I replaced the while loop with an if statement?
  • We will explore the while loop more in the next exercise.

Group Activity: Halloween Candy

  • As a class, we are going to act out the following while loops
While Loop 1:


int num_pieces_candy = 10;

instructor.fill_with_candy(Bag, num_pieces_candy);

instructor.hand_bag(first_student);

while (num_pieces_candy > 0)
{
    student.takeOnePieceCandy();
    student.passBag(next_student);
    num_pieces_candy--;
}


  • With your partner, discuss for the while loop above: 
    • What is/are the initialization statement(s)?
    • What is the loop test condition?
    • What are the statements that repeat?
    • Which statement will ultimately cause the test condition to fail?
  • Now, let's act out While Loop 1!
While Loop 2

instructor.fill_with_candy(Bag);
instructor.hand_bag(first_student);
while (Bag != empty)
{
    student.takeOnePieceCandy();
    student.passBag(next_student);
}
  • With your partner, discuss for the while loop above: 
    • How is the above while loop different from while loop 1
    • How many times will the statements inside while loop 2 execute?
    • Were you able to state an exact number for while loop 2?
  • Now, let's act out While Loop 2!


Activity 11.1: Counting Down...
  • Find a partner for pair programming.
  • Open up CodeBlocks and create a new C++ file named countdown.cpp.
  • Imagine we are at NASA Mission Control.
  • A new space ship is about to be launched.
  • Let's write a program that counts down until take off. See the sample output below:
NASA Mission Control readying for liftoff.
Initializing countdown from 10...
10
9
8
7
6
5
4
3
2
1
We have liftoff!
  • We are going to write this program in two ways.
Part 1: Repetition, Repetition, Repetition (10 pts)
  • The first program should use 13 cout statements to achieve the above output.
  • Let's get to work!
  • Add your name and section in appropriate block comments, include the iostream library and use the standard namespace.
  • Don't forget a main() function.
  • Declare an integer variable called countdown at the top of main and set it equal to 10.
  • Now, write a cout statement to output the following:
NASA Mission Control readying for liftoff.
  • Add another cout statement to print the following to the console:
Initializing countdown from 10...
  • Next, in a pair of statements, lets print the contents of countdown and then decrease its value by 1.
  • Add the following two statements to your code:
cout << countdown << endl;
countdown--;
  • You will need to repeat these two lines of code 10 times in your program.
  • Copy the two lines and then paste them into your program 9 more times.
  • You should have a very repetitive program by now!
  • Finally, add a cout statement to print out "We have liftoff!" below the numbers.
  • Run your code to make sure that your output is identical to my output above.
  • When you are finished and the program is working properly, upload it to Catalyst.

Part 2: Using a While Loop (10 pts)
  • Let's alter the above program to be written more efficiently with a loop.
  • First, take a look at your code.
  • Which part of the code is repetitive?
  • Hint: The repetitive lines will go inside the curly braces of the while loop.
  • We need a while loop to count down from the number entered by the user. Create a while loop that looks like this:
while (test will go here) {
    //statements
}
  • What should go inside the test?
countdown > 0
  • Why do you use > 0 here?
  • Inside the curly braces of the while loop, we need to print out the contents of the countdown variable and then decrease its value by 1.
  • Take one of your pairs of cout statement and variable decrement and place it in the curly braces of the while loop.
  • Now, you can erase the other 9 pairs of statements.
  • Finally, below your while loop, there should now be only one cout statement
  • Run your program to make sure it is working the same as before.
  • When you are finished, upload this new version to Catalyst.
  • If you finish early, work on your Lab 6 or answer the question from today's Wrap Up


Proper While Loop Formatting

About those Curly Braces

  • Like the if-statement, the curly braces of a while loop are optional
  • Technically, the while statement affects only the single statement that follows
  • We use curly braces to make that one statement into a block of statements
  • This allows us to put any number of statements within the body
  • Curly braces are not always required, but the best practice is to always include them

Program Style: Indent Statements Inside a Loop

  • It is important to format the loop code correctly:
    string repeat = "y";
    while ("y" == repeat) {
        // ... statements to repeat
        cin >> repeat;
    }
Also Accepted Style:
        string repeat = "y";
    while ("y" == repeat)
    {
        // ... statements to repeat
        cin >> repeat;
    }
  • Note how the repeated code is indented inside the loop
  • This lets us see easily which code is repeated and which is not
  • Also note the placement of curly braces
  • Different groups have different practices for placing curly braces in a loop statement


Wrap Up

With a partner, answer the following questions:
  • Label the different parts of the following while loop as: update statement, initialization or test condition.

int count = 1;

while (count <= 10) {

    cout << count << endl;

    count++;

}

  • Correct the loop below (hint it is missing something!). What will happen if you run the code BEFORE making the correction?

string repeat = "y";

while (repeat == "y") {

    cout << "Playing an exciting game!\n\n";

    cout << "Want to play again? (y/n): ";

}

  • Answer the questions from today's learning objectives.


Upcoming Assignments
  • Assignment 11 due Thursday at 3:20pm
  • Quiz 4 on Thursday
  • Lab 6 due Friday at midnight

~See You Thursday!~