1 Chapter 6 Looping Dale/Weems/Headington
2 l Physical order vs. logical order l A loop is a repetition control structure based on a condition. l it causes a single statement or block to be executed repeatedly While loop TRUE – execute the body, FALSE – exit loop Exits the loop only at the top Errors: = vs. == Semicolon at end of While Braces What is a loop?
3 While Statement SYNTAX while ( Expression ) {.. // loop body. } NOTE: Loop body can be a single statement, a null statement, or a block.
4 Two Types of Loops count controlled loops – executes a number of times loop control variable - initialize and test – multiple roles infinite loop – omit incrementation repeat a specified number of times event-controlled loops – termination depends on some event some condition within the loop body changes and this causes the repeating to stop
5 int count ; count = 4; // initialize loop variable while (count > 0) // test expression { cout << count << endl ; // repeated action count -- ; // update loop variable } cout << “Done” << endl ; Count-controlled Loop
6 Infinite loops Other loops: Do while For Looping problems are difficult to solve Easier to read than design Phases Loop entry Iteration – before each iteration – loop test After iteration – to statement following loop
7 myInfile contains 100 blood pressures Use a while loop to read the 100 blood pressures and find their total Count-Controlled Loop Example
8 ifstream myInfile ; int thisBP ; int total ; int count ; count = 0 ; // initialize while ( count < 100 ) // test expression { myInfile >> thisBP ; total = total + thisBP ; count++ ; // update } cout << “The total = “ << total << endl ;
9 Event-controlled Loops l Sentinel controlled – long lists of data keep processing data until a special value which is not a possible data value is entered to indicate that processing should stop l End-of-file controlled keep processing data as long as there is more data in the file l Flag controlled keep processing data until the value of a flag changes in the loop body
10 Examples of Kinds of Loops Count controlled loop Read exactly 100 blood pressures from a file. End-of-file controlled loop Read all the blood pressures from a file no matter how many are there.
11 Examples of Kinds of Loops Sentinel controlled loop Read blood pressures until a special value (like -1) selected by you is read. Flag controlled loop Read blood pressures until a dangerously high BP (200 or more) is read.
12 A Sentinel-controlled Loop l requires a “priming read” – read before first test l “priming read” means you read one set of data before the while l Another read at end of loop
13 // Sentinel controlled loop total = 0; cout << “Enter a blood pressure (-1 to stop ) ”; cin >> thisBP; while (thisBP != -1)// while not sentinel { total = total + thisBP; cout << “Enter a blood pressure (-1 to stop ) ”; cin >> thisBP; } cout << total;
14 End-of-File Controlled Loop l depends on fact that a file goes into fail state when you try to read a data value beyond the end of the file
15 total = 0; myInfile >> thisBP; // priming read while (myInfile) // while last read successful { total = total + thisBP; myInfile >> thisBP; // read another } cout << total; // End-of-file controlled loop
16 //End-of-file at keyboard total = 0; cout << “Enter blood pressure (Ctrl-Z to stop)”; cin >> thisBP; // priming read while (cin) // while last read successful { total = total + thisBP; cout << “Enter blood pressure”; cin >> thisBP; // read another } cout << total;
17 Flag-controlled Loops l you initialize a flag (to true or false) l use meaningful name for the flag l a condition in the loop body changes the value of the flag l test for the flag in the loop test expression
18 countGoodReadings = 0; isSafe = true; // initialize Boolean flag while (isSafe) { cin >> thisBP; if ( thisBP >= 200 ) isSafe = false; // change flag value else countGoodReadings++; } cout << countGoodReadings << endl;
19 Loops often used to l count all data values l count special data values l sum data values l keep track of previous and current values
20 Previous and Current Values l write a program that counts the number of != operators in a program file l read one character in the file at a time l keep track of current and previous characters
21 Keeping Track of Values (x != 3) { cout << endl; } FILE CONTENTS previous current count ( x 0 ! = 1 = ‘ ‘ 1 x ‘ ‘ 0 3 ) 1 ‘ ‘ 3 1 ‘ ‘ ! 0
22 int count; char previous; char current; count = 0 ; inFile.get (previous); // priming reads inFile.get(current); while (inFile) { if ( (current == ‘ = ‘) && (previous == ‘!’) ) count++; previous = current;// update inFile.get(current); // read another }
23 initialize outer loop while ( outer loop condition ) {... initialize inner loop while ( inner loop condition ) { inner loop processing and update }... } Pattern of a Nested Loop
24 Patient Data A file contains blood pressure data for different people. Each line has a patient ID, the number of readings for that patient, followed by the actual readings. ID howManyReadings
There were 432 patients in file. Read the data and display a chart Patient ID BP Average
26 Algorithm Uses Nested Loops l initialize patientCount to 0 l read first ID and howMany from file l while not end-of-file n increment patientCount n display ID n use a count-controlled loop to read and sum up this patient’s howMany BP’s n calculate and display average for patient n read next ID and howMany from file l display patientCount
27 To design a nested loop l begin with outer loop l when you get to where the inner loop appears, make it a separate module and come back to its design later
28 #include #include using namespace std; int main ( ) { int patientCount; // declarations int thisID; int howMany; int thisBP; int totalForPatient; int count; float average; ifstream myInfile;
29 myInfile.open(“A:\\BP.dat”); if (!myInfile ) // opening failed { cout > thisID >> howMany; // priming read
30 while ( myInfile ) // last read successful { patientCount++; cout << thisID; totalForPatient = 0; // initialize inner loop count = 0; while ( count < howMany) { myInfile >> thisBP; count ++; totalForPatient = totalForPatient + thisBP; } average = totalForPatient / float(howMany); cout << int (average +.5) << endl; // round myInfile >> thisID >> howMany; // another read }
31 cout << “There were “ << patientCount << “patients on file.” << endl; cout << “Program terminated.\n”; return 0; }
32 Information About 20 Books in Diskfile “A:\\myIn.dat” 3.98 P 7.41 H 8.79 P. Price of book Hardback or Paperback? WRITE A PROGRAM TO FIND TOTAL VALUE OF ALL BOOKS
33 #include // for cout #include // for file I/O using namespace std; int main (void) { float price ; // declarations char kind ; ifstream myInfile ; float total = 0.0 ; int count = 1; Program to Read Info about 20 Books From a Disk File
34 Rest of Program myInfile.open(“A:\\myIn.dat”) ; // count-controlled processing loop while ( count <= 20 ) { myInfile >> price >> kind ; total = total + price ; count ++ ; } cout << “Total is: “ << total << endl ; myInfile.close( ) ; return 0 ; }
35 Trace of Program Variables count price kind total ‘P’ ‘H’ ‘P’ etc so loop terminates
36 Complexity l is a measure of the amount of work involved in executing an algorithm relative to the size of the problem
37 Polynomial Times N N 0 N 1 N 2 N 3 constant linear quadratic cubic , ,000 1,000,000 1,0001 1,000 1,000,000 1,000,000,000 10, , ,000,000 1,000,000,000,000
38 Loop Testing and Debugging test data should test all sections of program l beware of infinite loops -- program doesn’t stop l check loop termination condition, and watch for “off-by-1” problem l use get function for loops controlled by detection of ‘\n’ character l use algorithm walk-through to verify pre- and postconditions l trace execution of loop by hand with code walk-through l use a debugger to run program in “slow motion” or use debug output statements
39 Program #2 - pg. 233 l Input integers larger than 1 - loop for entry l calculate sum of squares - 1 through that integer - inner loop l output results n declare variables n initialize variables to 0 n priming read-input n while loop - while >1 –count = 1 - loop control variable - input - outer variable l while count <= integer l calculate square l add to totaling variable l add to counting variable –output results n input next number n return 0
40 l Assignment #12 n pg prog warm-up exercises 1,4 n pg prog problems #2 l Assignment #13 n pg exam prep exercises - #2-7,9-14.