Welcome to Lesson 12! Learning Objectives By the end of today's class, you should know...
Review ActivityReview of Conditions Involving Logical Operators:
b. if (numCaller == 19 && (pet == "rabbit" || "cat" || "dog") && (age >= 18 && <= 65)) 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!"; } Bad Logical Operators HumorIntroducing Loops
Simple Loops
|
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)
- Initialization statement
- 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: Candy Crush Loop
- As a class, we are going to act out the following while loops
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!
NASA Mission Control readying for liftoff.Initializing countdown from 10...10987654321We 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 Canvas.
- 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 Canvas.
- If you finish early, work on your Lab 6 or answer the question from today's Wrap Up
About those Curly Braces
- Like the
if
-statement, the curly braces of awhile
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; }
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
Applications of Loops
- Let's look at 4 common loop applications:
1. Indefinite Loops
Recall our looping application that simulated the play of an exciting game
|
#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;
}
|
- Loops of this type are called indefinite loops because you do not know in advance how many time the loop will execute
- This behavior is different from a counting loop where you know how many times the loop will execute before the loop starts
- With an indefinite loop we can solve a new set of problems
- Most problems solved with indefinite loops make use of
while
statements
- Another common use for indefinite loops is to process a sequence of inputs
- As an example, let us add up (sum) a series of numbers
- Every number is added to the sum
- We use a loop to repeat the input until the user decides to stop
- Since we do not know how many number the user will enter, we use an indefinite loop as shown below
|
#include <iostream>
using namespace std;
int main() {
double input = 1;
double sum = 0;
string repeat = "y";
cout << "I will add up numbers for you\n\n";
while ("y" == repeat) {
cout << "So far, sum = " << sum << endl;
cout << "Enter a number: ";
cin >> input;
sum = sum + input;
cout << "Another number? (y/n) ";
cin >> repeat;
}
cout << "Ending sum: " << sum << endl;
return 0;
}
|
3. Terminating the Input with a Sentinel
- Whenever we read a sequence of input values, we need to have some way of terminating the input loop
- We could use a separate variable and input statement as we have done before:
string repeat = "y"; while ("y" == repeat) { // ... statements to repeat cin >> repeat; }
- However, when entering numbers (or other data) repeatedly, answering an extra question each time through the loop becomes annoying
- One way to avoid asking an extra question is to use a sentinel value
- A sentinel is guard who watches for something to happen
- Similarly, a sentinel in a program watches for a specific sentinel value that signals termination of a loop
- To use a sentinel value, we must have a special value in the input
- Some commonly used sentinel values for numeric input are 0 or -1
- The following program is an update of the previous program to use a sentinel value to end the loop
- Question: What is the sentinel value for this loop?
Example Application Using a Sentinel Value for the Loop Test
#include <iostream>
using namespace std;
int main() {
double input = 1;
double sum = 0;
cout << "I will add up numbers for you\n\n";
while (input != 0) {
cout << "So far, sum = " << sum << endl;
cout << "Enter a number or 0 to exit: ";
cin >> input;
sum = sum + input;
}
cout << "Ending sum: " << sum << endl;
return 0;
}
|
4. Error Checking: Input Validation
- Another common use for indefinite loops is input validation
- Input validation combines a loop with one or more
if
statements - The input statement is placed inside the loop
- The
if
-statement tests for an incorrect input value - The loop repeats while the user's input contains an error
- Since we do not know how many times the loop must execute ahead of time, the loop is indefinite
- For example, the following program uses a loop to ensure a user enters a positive number
- The
if
statement is used to decide when to output an error message
Example of Input Validation Using a Loop
|
#include <iostream>
using namespace std;
int main() {
double input = 0.0; // initialize value
while (input <= 0) {
cout << "Enter a positive number: ";
cin >> input;
if (input <= 0.0) {
cout << "You must enter a positive number\n";
}
}
cout << "You entered: " << input << endl;
return 0;
}
|
- We will explore all of these applications in our programs as we continue to write loops.
Activity 12.2: Guessing Game The Final Round (10 pts)
- Copy the following program into Eclipse, save it as
loopy.cpp
, and then compile and run the starter program to make sure you copied it correctly.#include <iostream> using namespace std; int main() { int guess = 0; cout << "I'm thinking of a number between" << " 1 and 10.\nCan you guess it?\n\n" << "Enter your guess: "; cin >> guess; if (7 == guess) { cout << "*** Correct! ***\n"; } else { cout << "Sorry, that is not correct.\n"; cout << "Try again.\n"; } return 0; }
- Add the following code after the statement
int guess = 0;
and before thecout
statement:string repeat = "y";
This is the initialization code that we will use for the test condition that comes next.
- We want to repeat all the rest of the code in our program. For this we need to add a
while
statement such as:while ("y" == repeat) { // Place the rest of the code after the initialization // and before the return 0 between these curly braces. }
Statements inside the curly braces repeat while the test condition in the parenthesis,
("y" == repeat)
, evaluates to true.
- Inside
the while loop we need some way to change the test condition. We change
the test condition by letting the user enter a value for the
repeat
variable by adding the following code at the end of the loop just before the closing curly brace:cout << "\nDo you want to play again? (y/n) "; cin >> repeat;
Without these two statements our loop would have no way to exit. A loop with no way to exit is known as an infinite loop.
- Formatting a loop is important. Indent all the code within the curly braces of the while loop.
- As
a final part of our program, we add the infamous phrase: "Game Over".
Add the following statement after the closing curly brace of the while
loop:
cout << "Game over\n";
- Compile and run your program again and verify the output looks like:
I'm thinking of a number between 1 and 10. Can you guess it? Enter your guess: 3 Sorry, that is not correct. Try again. Do you want to play again? (y/n) y I'm thinking of a number between 1 and 10. Can you guess it? Enter your guess: 7 *** Correct! *** Do you want to play again? (y/n) n Game over
- Submit your program source code to Canvas.
- If you finish early, answer today's learning questions under Wrap Up or work on your Lab 6
Completed Program
- When finished, your application should look like the following. Note especially the extra indentation within the curly braces of the while loop.
Common Loop Pitfalls
- Loops have many pitfalls for the unwary
- The following are the most common problems you should look out for
Infinite Loops
- Common error: unintentional infinite loop
- For example, what is wrong with the following code?
1
2
3
4
5
6
7
8
9
10
11
12
13
| #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) ";
}
cout << "\nThanks for playing!\n";
return 0;
}
|
Missing Curly Braces
- Technically, the while loop executes a single statement after the parenthesis of the test condition
- However, we usually use curly braces
{ }
to expand the single statement - The curly braces let us put multiple statements in them
- For example, what is wrong with the following code?
{ }
to expand the single statement1
2
3
4
5
6
7
8
9
10
11
12
13
| #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;
}
|
Empty Statements
- Remember that statements are terminated by a semicolon
- Is the following a legal statement?
;
- This is known as an empty or null statement
- Empty statements are a common source of infinite loops
- For example, what is wrong with the following code?
;
#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;
} |
Wrap Up- With your partner, answer the questions from today's learning objectives
Upcoming Assignments- Assignment 12 due Tuesday at 9:20am on Canvas
- Lab 6 due Friday at midnight
- With your partner, answer the questions from today's learning objectives
Upcoming Assignments
- Assignment 12 due Tuesday at 9:20am on Canvas
- Lab 6 due Friday at midnight