Chapter 5 Repetition and Loop Statements Lecture Notes Prepared By: Blaise W. Liffick, PhD Department of Computer Science Millersville University Millersville, PA
© 2004 Pearson Addison-Wesley. All rights reserved5-2 Control Structures Sequence Selection Repetition
© 2004 Pearson Addison-Wesley. All rights reserved Counting Loops and while Loop – a control structure that repeats a group of statements in a program Loop body – the statements that are repeated in a loop
© 2004 Pearson Addison-Wesley. All rights reserved5-4 Counter-Controlled Loop Repetition managed by a loop control variable whose value represents a count Counting Loop –Set loop control variable to an initial value of 0 –While loop control variable < final value … Increase loop control variable by 1
© 2004 Pearson Addison-Wesley. All rights reserved5-5 Counter-Controlled Loop Used when we can determine prior to loop execution how many loop repetitions will be needed to solve problem Number of repetitions should appear as the final count in the while condition
© 2004 Pearson Addison-Wesley. All rights reserved5-6 Listing 5.1 Program fragment with a loop
© 2004 Pearson Addison-Wesley. All rights reserved5-7 The while Statement - Example Loop Body –Compound statement –Gets an employee’s payroll data –Computes and displays employee’s pay After 7 weekly pay amounts are displayed, the statement following loop body executes –Displays message “All employees processed.”
© 2004 Pearson Addison-Wesley. All rights reserved5-8 The while Statement - Example countEmp = 0; –Sets initial value of 0, representing the count of employees processed so far Condition evaluated (countEmp < 7) –If true, loop body statements are executed –If false, loop body is skipped and control passes to the display statement (cout) that follows the loop body
© 2004 Pearson Addison-Wesley. All rights reserved5-9 The while Statement - Example countEmp = countEmp + 1; –Increments the current value of the counter by 1 After executing the last statement of the loop body –Control returns to the beginning of the while –The condition is reevaluated
© 2004 Pearson Addison-Wesley. All rights reserved5-10 Loop Repetition Condition Follows while reserved word Surrounded by parentheses When true, the loop body is repeated When false, exit the loop
© 2004 Pearson Addison-Wesley. All rights reserved5-11 Figure 5.1 Flowchart for a while loop
© 2004 Pearson Addison-Wesley. All rights reserved5-12 Loop Control Variable Initialize Test Update
© 2004 Pearson Addison-Wesley. All rights reserved5-13 while Statement Syntax Form while (loop repetition condition) statement; E.g. countStar = 0; while (countStar < n) { cout << “*”; countStar = countStar + 1; }
© 2004 Pearson Addison-Wesley. All rights reserved5-14 Loop Notes If the loop control variable is not properly updated, an infinite loop can result. If the loop repetition condition evaluates to false the first time it’s tested, the loop body statements are never executed.
© 2004 Pearson Addison-Wesley. All rights reserved Accumulating a Sum or Product in a Loop Loops often accumulate a sum or product by repeating an addition of multiplication operation.
© 2004 Pearson Addison-Wesley. All rights reserved5-16 Listing 5.2 Program to compute company payroll
© 2004 Pearson Addison-Wesley. All rights reserved5-17 Listing 5.2 Program to compute company payroll (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-18 Example – Compute Payroll Initialization statements totalPay = 0.0;// pay accumulator countEmp = 0;// loop control variable that // counts number of // employees processed Accumulation totalPay = totalPay + pay; // add next pay Incrementation countEmp = countEmp + 1;
© 2004 Pearson Addison-Wesley. All rights reserved5-19 Writing General Loops Process exactly 7 employees while (countEmp < 7) Process an indefinite number of employees; number of employees must be read into variable numberEmp before the while statement executes while (countEmp < numberEmp)
© 2004 Pearson Addison-Wesley. All rights reserved5-20 Multiplying a List of Numbers product = 1; while (product < 10000) { cout << product << endl;// display product so far cout << “Enter data item: “; cin >> item; product = product * item;// update product }
© 2004 Pearson Addison-Wesley. All rights reserved5-21 Conditional Loop 1.Initialize the loop control variable 2.While a condition involving the loop control variable is true 3.Continue processing 4.Update the loop control variable
© 2004 Pearson Addison-Wesley. All rights reserved5-22 Compound Assignment Operators General form of common operations variable = variable op expression; E.g. countEmp = countEmp + 1; time = time - 1; totalPay = totalPay + pay; product = product * item;
© 2004 Pearson Addison-Wesley. All rights reserved5-23 Special Assignment Operators += -= *= /= %= general form variable op= expression; E.g. countEmp += 1; time -= 1; totalPay += pay; product *= item;
© 2004 Pearson Addison-Wesley. All rights reserved5-24 The for Statement Especially useful for counting loops Form for (initializing expression; loop repetition condition; update expression) statement;
© 2004 Pearson Addison-Wesley. All rights reserved5-25 The for Statement E.g. for (countStar = 0; countStar < N; countStar += 1; cout << “*”;
© 2004 Pearson Addison-Wesley. All rights reserved5-26 Listing 5.3 Using a for statement in a counting loop
© 2004 Pearson Addison-Wesley. All rights reserved5-27 Formatting the for Statement Placement of expressions can be on one line or separate lines Body of loop indented Position of { } align with for keyword on separate lines (style for this book)
© 2004 Pearson Addison-Wesley. All rights reserved5-28 Increment and Decrement Operators Apply to a single variable Side effect - a change in the value of a variable as a result of carrying out an operation
© 2004 Pearson Addison-Wesley. All rights reserved5-29 Increment and Decrement Operators Prefix operator –E.g.m = 3; n = ++m; Postfix operator –E.g.m = 3; n = m++; Often used to update loop control variable
© 2004 Pearson Addison-Wesley. All rights reserved5-30 Listing 5.4 Function to compute factorial
© 2004 Pearson Addison-Wesley. All rights reserved5-31 Localized Declarations of Variables Commonly used for loop control variables Declared at point of first reference Value has meaning (i.e. can be referenced) only inside loop.
© 2004 Pearson Addison-Wesley. All rights reserved5-32 Example - Localized Variables string firstName; cout << “Enter your first name: “’ cin >> firstName; for (int posChar = 0; posChar < firstName.length( ); posChar++;) cout << firstName.at(posChar) << endl;
© 2004 Pearson Addison-Wesley. All rights reserved5-33 Listing 5.5 Converting Celsius to Fahrenheit
© 2004 Pearson Addison-Wesley. All rights reserved5-34 Listing 5.5 Converting Celsius to Fahrenheit (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-35 Output - Celsius to Fahrenheit Celsius Fahrenheit
© 2004 Pearson Addison-Wesley. All rights reserved5-36 Displaying a Table of Values setw( ) manipulator helps create neat columns It is a member function of the iomanip class. Requires the iomanip library to be included
© 2004 Pearson Addison-Wesley. All rights reserved5-37 Conditional Loops Used when you can’t determine before loop execution begins exactly how many loop repetitions are needed. The number of repetitions is generally stated by a condition that must remain true in order for the loop to continue.
© 2004 Pearson Addison-Wesley. All rights reserved5-38 Conditional Loop Initialize the loop control variable. While a condition involving the loop control variable is true Continue processing. Update the loop control variable
© 2004 Pearson Addison-Wesley. All rights reserved5-39 Case Study: Monitoring Oil Supply Problem We want to monitor the amount of oil remaining in a storage tank at the end of each day. The initial supply of oil in the tank and the amount taken out each day are data items. Our program should display the amount left in the tank at the end of each day and it should also display a warning when the amount left is less than or equal to 10 percent of the tank’s capacity. At this point, no more oil can be removed until the tank is refilled.
© 2004 Pearson Addison-Wesley. All rights reserved5-40 Case Study: Analysis Clearly, the problem inputs are the initial oil supply and the amount taken out each day. The outputs are the oil remaining at the end of each day and a warning message when the oil left in the tank is less than or equal to 10 percent of its capacity.
© 2004 Pearson Addison-Wesley. All rights reserved5-41 Case Study: Data Requirements Problem Constants CAPACITY = 1000// tank capacity MINPCT = 0.10// minimum % Problem Input float supply// initial oil supply Each day’s oil use
© 2004 Pearson Addison-Wesley. All rights reserved5-42 Case Study: Data Requirements Problem Output float oilLevel// final oil amount Each day’s oil supply A warning message when the oil supply is less than minimum.
© 2004 Pearson Addison-Wesley. All rights reserved5-43 Case Study: Data Requirements Program Variable float minOil// minimum oil supply Formulas Minimum oil supply is 10 percent of tank’s capacity
© 2004 Pearson Addison-Wesley. All rights reserved5-44 Case Study: Initial Algorithm 1.Get the initial oil supply. 2.Compute the minimum oil supply. 3.Compute and display the amount of oil left each day (implement as function monitorOil). 4.Display the oil left and a warning message if necessary.
© 2004 Pearson Addison-Wesley. All rights reserved5-45 Analysis for Function monitorOil Function monitorOil must display a table showing the amount of oil left at the end of each day. To accomplish this, the function must read each day’s usage and deduct that amount from the oil remaining. The function needs to receive the initial oil supply and the minimum oil supply as inputs (arguments) from the main function.
© 2004 Pearson Addison-Wesley. All rights reserved5-46 Function Interface for monitorOil Input Parameters float supply// initial oil supply float minOil// minimum oil supply Output Returns the final oil amount Local Data float usage // input from user - each day’s oil use float oilLeft // output from user - each day’s oil supply
© 2004 Pearson Addison-Wesley. All rights reserved5-47 Design of monitorOil The body of monitorOil is a loop that displays the oil usage table. We can’t use a counting loop because we don’t know in advance how many days if will take to bring the supply to the critical level. We do know the initial supply of oil, and we know that we want to continue to compute and display the amount of oil remaining (oilLeft) as long as the amount of oil remaining does not fall below the minimum. So the loop control variable must be oilLeft. We need to initialize oilLeft to the initial supply and to repeat the loop as long as oilLeft > minOil is true. The update step should deduct the daily usage (a data value) from oilLeft.
© 2004 Pearson Addison-Wesley. All rights reserved5-48 Initial Algorithm for monitorOil 1.Initialize oilLeft to supply. 2.While (oilLeft > minOil) 2.1Read in the daily usage. 2.2Deduct the daily usage from oilLeft 2.3Display the value of oilLeft
© 2004 Pearson Addison-Wesley. All rights reserved5-49 Listing 5.6 Program to monitor oil supply // File: oilSupply.cpp Displays daily usage and amount left in oil tank. #include using namespace std; float monitorOil(float, float); int main() { const float CAPACITY = 10000;// tank capacity const float MINPCT = 10.0; // minimum percent float supply; // input - initial oil supply float oilLeft; // output - oil left in tank float minOil; // minimum oil supply
© 2004 Pearson Addison-Wesley. All rights reserved5-50 // Get the initial oil supply. cout << "Enter initial oil supply: "; cin >> supply; // Compute the minimum oil supply. minOil = CAPACITY * (MINPCT / 100.0); // Compute and display the amount of oil left each day oilLeft = monitorOil(supply, minOil); // Display warning message if supply is less than minimum cout << endl << oilLeft << " gallons left in tank." << endl; return 0; } Listing 5.6 Program to monitor oil supply (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-51 float monitorOil(float supply, float minOil) { // Local data... float usage; // input from user - Each day's oil use float oilLeft;// Amount left each day oilLeft = supply; while (oilLeft > minOil) { cout << "Enter amount used today: "; cin >> usage; oilLeft -= usage; cout << "After removal of " << usage << " gallons, "; cout << "number of gallons left is " << oilLeft << endl << endl; } return oilLeft; } Listing 5.6 Program to monitor oil supply (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-52 Case Study: Testing To test the program, try running it with a few samples of input data. One sample should bring the oil level remaining to exactly 10 percent of the capacity. For example, if the capacity is 10,000 gallons, enter a final daily usage amount that brings the oil supply to 1,000 gallons and see what happens.
© 2004 Pearson Addison-Wesley. All rights reserved5-53 Case Study: Testing Enter initial oil supply: 7000 Enter amount used today: 1000 After removal of 1000 gallons, number of gallons left is 6000 Enter amount used today: 4000 After removal of 4000 gallons, number of gallons left is 2000 Enter amount used today: 1500 After removal of 1500 gallons, number of gallons left is gallons left in tank Warning - amount of oil left is below minimum!
© 2004 Pearson Addison-Wesley. All rights reserved Loop Design and Loop Patterns Sentinel-Controlled Loops 1. Read the first data item. 2. While the sentinel value has not been read 3. Process the data item. 4. Read the next data item. initialization Loop repetition condition update
© 2004 Pearson Addison-Wesley. All rights reserved5-55 Sentinel-Controlled Loops A sentinel is a specific predetermined value used to terminate one type of event- controlled loop It is the same type as the other data being processed It is outside the range of valid values for the data
© 2004 Pearson Addison-Wesley. All rights reserved5-56 Example: Sum Exam Scores 1.Initialize sum to zero 2.Read first score 3.While score is not the sentinel 4. Add score to sum 5. Read next score
© 2004 Pearson Addison-Wesley. All rights reserved5-57 Listing 5.7 A sentinel-controlled loop // File: sumScores.cpp // Accumulates the sum of exam scores. #include using namespace std; void displayGrade(int); int main() { const int SENTINEL = -1; int score; int sum; int count; int average;
© 2004 Pearson Addison-Wesley. All rights reserved5-58 // Process all exam scores until sentinel is read count = 0; sum = 0; cout << "Enter scores one at a time as requested." << endl; cout << "When done, enter " << SENTINEL << " to stop." << endl; cout << "Enter the first score: "; cin >> score; while (score != SENTINEL) { sum += score; count++; displayGrade(score); cout << endl << "Enter the next score: "; cin >> score; } Listing 5.7 A sentinel-controlled loop (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-59 cout << endl << endl; cout << "Number of scores processed is " << count << endl; cout << "Sum of exam scores is " << sum << endl; // Compute and display average score. if (count > 0) { average = sum / count; cout << "Average score is " << average; } return 0; } Listing 5.7 A sentinel-controlled loop (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-60 // Displays the letter grade corresponding to an exam // score assuming a normal scale. void displayGrade(int score)// IN: exam score { if (score >= 90) cout << “Grade is A” << endl; else if (score >= 80) cout << “Grade is B” << endl; else if (score >= 70) cout << “Grade is C” << endl; else if (score >= 60) cout << “Grade is D” << endl; else cout << “Grade is F” << endl; } Listing 5.7 A sentinel-controlled loop (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-61 Testing: sumScores Enter the scores one at a time as requested. When done, enter -1 to stop. Enter the first score: 85 Grade is B Enter the next score: 33 Grade is F Enter the next score: 77 Grade is C Enter the next score: -1 Number of scores processed is 3 Sum of exam scores is 195 Average score is 65
© 2004 Pearson Addison-Wesley. All rights reserved5-62 Calculating an Average Requires keeping a count of the number of values processed (e.g. count in sumScores) Counter is initialized to zero before loop begins Counter is incremented (e.g. count++; ) within loop body Counter is not the loop control variable in this case
© 2004 Pearson Addison-Wesley. All rights reserved5-63 Flag Controlled Loops 1. Set the flag to false. 2. While the flag is false 3. Perform some action. 4. Reset the flag to true if the anticipated event occurred. initialization Loop repetition condition update
© 2004 Pearson Addison-Wesley. All rights reserved5-64 Flag Controlled Loops Type bool variables often used as flags Flag initialized to false before loop entry Flag reset to true when a particular event occurs Note: because flag is initially false, the loop condition uses ! (not) operator to reverse the flag’s value
© 2004 Pearson Addison-Wesley. All rights reserved5-65 Listing 5.8 Function getDigit
© 2004 Pearson Addison-Wesley. All rights reserved The do-while Statement The do while statement is similar to the while loop, but the do while loop has the test at the end. General form: do { statement; } while ( expression ) ; Notice the iterative part executes before the loop-test)
© 2004 Pearson Addison-Wesley. All rights reserved5-67 Data-validation Loop do prompt for and read a data item while data item is not valid E.g. do { cout << “Enter number of employees: “; cin >> numEmp; } while (numEmp < 0);
© 2004 Pearson Addison-Wesley. All rights reserved5-68 Listing 5.9 Function getIntRange
© 2004 Pearson Addison-Wesley. All rights reserved5-69 do-while and Menus Often used to control a menu-driven program Display a list of choices for user to select from
© 2004 Pearson Addison-Wesley. All rights reserved5-70 Typical Menu List of edit operations: D - Delete a substring F - Find a string I - Insert a string R - Replace a substring Q - Quit Enter D, F, I, R, or Q as your selection:
© 2004 Pearson Addison-Wesley. All rights reserved5-71 Main Control Routine do Display the menu Read the user’s choice Perform the user’s choice Display the edited string while the choice is not Quit
© 2004 Pearson Addison-Wesley. All rights reserved5-72 Listing 5.10 Main function for text editor program
© 2004 Pearson Addison-Wesley. All rights reserved5-73 Listing 5.10 Main function for text editor program (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-74 Listing 5.11 Finding the largest value
© 2004 Pearson Addison-Wesley. All rights reserved5-75 Listing 5.11 Finding the largest value (continued)
© 2004 Pearson Addison-Wesley. All rights reserved Review of Loop Forms while –most commonly used when repetition is not counter controlled –condition test precedes each loop repetition –loop body may not be executed at all
© 2004 Pearson Addison-Wesley. All rights reserved5-77 Review of Loop Forms for –used to implement a counting loop –also convenient for other loops with simple initialization and update steps –condition test precedes the execution of the loop body –loop body may not be executed at all
© 2004 Pearson Addison-Wesley. All rights reserved5-78 Review of Loop Forms do-while –convenient when at least one repetition of the loop body is required
© 2004 Pearson Addison-Wesley. All rights reserved Nested Loops As with if statements, loop statements can be nested Each time outer loop is repeated, any inner loop is restarted - loop control components are reevaluated and all required iterations are performed
© 2004 Pearson Addison-Wesley. All rights reserved5-80 Listing 5.13 Nested for loop program
© 2004 Pearson Addison-Wesley. All rights reserved5-81 Listing 5.13 Nested for loop program (continued)
© 2004 Pearson Addison-Wesley. All rights reserved5-82 Listing 5.14 Displaying the multiplication table
© 2004 Pearson Addison-Wesley. All rights reserved5-83 Listing 5.14 Displaying the multiplication table (continued)
© 2004 Pearson Addison-Wesley. All rights reserved Debugging and Testing Programs Modern Integrated Development Environments (IDEs) include features to help you debug a program while it is executing. If you cannot use a debugger, insert extra diagnostic output statements to display intermediate results at critical points in your program.
© 2004 Pearson Addison-Wesley. All rights reserved5-85 Debugging Without a Debugger Insert diagnostic output statements –at locations where you suspect things are going wrong or other critical points in the code beginning and end of functions after complex calculations –to display intermediate results, e.g. variables affected by each major algorithm step Remove extra output statements when problem solved, or use // to “comment out”
© 2004 Pearson Addison-Wesley. All rights reserved5-86 Off-by-one Errors Common logic error - a loop that executes one time too many or one time too few Check initial and final values for loop control variables Check loop repetition condition Check loop boundaries during testing
© 2004 Pearson Addison-Wesley. All rights reserved5-87 Testing Thorough testing necessary Check all paths through decision statements and the number of iterations for loops Make enough test runs to verify that the program works properly for representative samples of all possible data combinations
© 2004 Pearson Addison-Wesley. All rights reserved Common Programming Errors Omitting braces ( { }) Omitting a closing brace ( } ) Infinite loop Misuse of = for == Bad sentinel value Using do-while instead of while Incorrect use of compound assignment Incorrect use of increment and decrement operators