Lecture 7: General Loops (Chapter 7)

Similar documents
CS 101: Computer Programming and Utilization

Loops! Loops! Loops! Lecture 5 COP 3014 Fall September 25, 2017

Computer Programming

Computer Programming

Loops / Repetition Statements

*Starting Out with C++: From Control Structures through Objects, 7/E* by *Tony Gaddis* COMPUTER PROGRAMMING LECTURE 05 LOOPS IMRAN IHSAN

5.1. Chapter 5: The Increment and Decrement Operators. The Increment and Decrement Operators. Looping. ++ is the increment operator.

LECTURE 5 Control Structures Part 2

Computer Programming. Basic Control Flow - Loops. Adapted from C++ for Everyone and Big C++ by Cay Horstmann, John Wiley & Sons

3/12/2018. Structures. Programming in C++ Sequential Branching Repeating. Loops (Repetition)

CS106X Handout 03 Autumn 2012 September 24 th, 2012 Getting Started

Repetition Structures

Condition-Controlled Loop. Condition-Controlled Loop. If Statement. Various Forms. Conditional-Controlled Loop. Loop Caution.

Introduction. C provides two styles of flow control:

Loops and Files. Chapter 04 MIT 12043, Fundamentals of Programming By: S. Sabraz Nawaz

Numerical Computing in C and C++ Jamie Griffin. Semester A 2017 Lecture 2

REPETITION CONTROL STRUCTURE LOGO

Chapter 5. Repetition. Contents. Introduction. Three Types of Program Control. Two Types of Repetition. Three Syntax Structures for Looping in C++

Unit 7. 'while' Loops

Copyright 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Slide 5-1

Chapter 5: Control Structures II (Repetition)

Week 2. Relational Operators. Block or compound statement. if/else. Branching & Looping. Gaddis: Chapters 4 & 5. CS 5301 Spring 2018.

o Counter and sentinel controlled loops o Formatting output o Type casting o Top-down, stepwise refinement

All copyrights reserved - KV NAD, Aluva. Dinesh Kumar Ram PGT(CS) KV NAD Aluva

Discussion 1H Notes (Week 3, April 14) TA: Brian Choi Section Webpage:

Chapter 3. More Flow of Control. Copyright 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Chapter 5: Prefix vs. Postfix 8/19/2018. The Increment and Decrement Operators. Increment and Decrement Operators in Program 5-1

(Refer Slide Time: 00:26)

The following expression causes a divide by zero error:

C++ Programming: From Problem Analysis to Program Design, Fourth Edition. Chapter 5: Control Structures II (Repetition)

Week - 01 Lecture - 03 Euclid's Algorithm for gcd. Let us continue with our running example of gcd to explore more issues involved with program.

Chapter Four: Loops. Slides by Evan Gallagher. C++ for Everyone by Cay Horstmann Copyright 2012 by John Wiley & Sons. All rights reserved

while for do while ! set a counter variable to 0 ! increment it inside the loop (each iteration)

Accelerating Information Technology Innovation

Unit 3 Decision making, Looping and Arrays

Multiple Choice (Questions 1 13) 26 Points Select all correct answers (multiple correct answers are possible)

CSI33 Data Structures

DELHI PUBLIC SCHOOL TAPI

1 Unit 8 'for' Loops

A Freshman C++ Programming Course

CHRIST THE KING BOYS MATRIC HR. SEC. SCHOOL, KUMBAKONAM CHAPTER 9 C++

Islamic University of Gaza Computer Engineering Dept. C++ Programming. For Industrial And Electrical Engineering By Instructor: Ruba A.

Chapter 5: Loops and Files

3 The L oop Control Structure

CS 221 Lecture. Tuesday, 11 October 2011

Lecture Transcript While and Do While Statements in C++

5.1. Chapter 5: The Increment and Decrement Operators. The Increment and Decrement Operators. The Increment and Decrement Operators

Names and Functions. Chapter 2

Chapter 5: Control Structures II (Repetition) Objectives (cont d.) Objectives. while Looping (Repetition) Structure. Why Is Repetition Needed?

CS 310 Advanced Data Structures and Algorithms

Subject: PIC Chapter 2.

Why Is Repetition Needed?

C++ Basics. Data Processing Course, I. Hrivnacova, IPN Orsay

Homework #3 CS2255 Fall 2012

Introduction to Programming

CS112 Lecture: Repetition Statements

C++ Programming: From Problem Analysis to Program Design, Third Edition

Le L c e t c ur u e e 3 To T p o i p c i s c t o o b e b e co c v o e v r e ed e Control Statements

ECE15: Introduction to Computer Programming Using the C Language. Lecture Unit 4: Flow of Control

CS2141 Software Development using C/C++ C++ Basics

CHAPTER 2.2 CONTROL STRUCTURES (ITERATION) Dr. Shady Yehia Elmashad

Computer Programming

Definition: A data structure is a way of organizing data in a computer so that it can be used efficiently.

3. Logical Values. Boolean Functions; the Type bool; logical and relational operators; shortcut evaluation

CS31 Discussion 1E. Jie(Jay) Wang Week3 Oct.12

Introduction to Programming

Multiple Choice (Questions 1 13) 26 Points Select all correct answers (multiple correct answers are possible)

Score score < score < score < 65 Score < 50

CS 101: Computer Programming and Utilization

Review: Exam 1. Your First C++ Program. Declaration Statements. Tells the compiler. Examples of declaration statements

Maciej Sobieraj. Lecture 1

Chapter 7. Additional Control Structures

Principles of Computer Science

Local and Global Variables

Name Section: M/W T/TH Number Definition Matching (8 Points)

Multiple Choice (Questions 1 14) 28 Points Select all correct answers (multiple correct answers are possible)

UEE1302(1066) F12: Introduction to Computers and Programming Function (II) - Parameter

C++ Quick Reference. switch Statements

Fundamentals of Programming CS-110. Lecture 2

Add Subtract Multiply Divide

Programming. C++ Basics

(6) The specification of a name with its type in a program. (7) Some memory that holds a value of a given type.

Object Oriented Software Design

CS313D: ADVANCED PROGRAMMING LANGUAGE

ECE 2574: Data Structures and Algorithms - Recursion Part I. C. L. Wyatt

ELEMENTARY NUMBER THEORY AND METHODS OF PROOF

Prepared by: Shraddha Modi

Lecture 10. Daily Puzzle

MODULE 2: Branching and Looping

C++ PROGRAMMING SKILLS Part 2 Programming Structures

Name Section: M/W T/TH Number Definition Matching (6 Points)

Computer Programming

C++ Programming Lecture 7 Control Structure I (Repetition) Part I

Chapter 4: Control Structures I (Selection) Objectives. Objectives (cont d.) Control Structures. Control Structures (cont d.

Computer Programming. Basic Control Flow - Decisions. Adapted from C++ for Everyone and Big C++ by Cay Horstmann, John Wiley & Sons

L o o p s. for(initializing expression; control expression; step expression) { one or more statements }

To become familiar with array manipulation, searching, and sorting.

Chapter 3. More Flow of Control. Copyright 2008 Pearson Addison-Wesley. All rights reserved.

ECE G205 Fundamentals of Computer Engineering Fall Exercises in Preparation to the Midterm

Problem Solving through Programming In C Prof. Anupam Basu Department of Computer Science & Engineering Indian Institute of Technology, Kharagpur

Transcription:

CS 101: Computer Programming and Utilization Jul-Nov 2017 Umesh Bellur (cs101@cse.iitb.ac.in) Lecture 7: General Loops (Chapter 7)

The Need for a More General Loop Read marks of students from the keyboard and print the average Number of students not given explicitly If a negative number is entered as marks, then it is a signal that all marks have been entered Examples Input: 98 96-1, Output: 97 Input: 90 80 70 60-1, Output: 75 The repeat statement repeats a fixed number of times => Not useful We need a more general statement while, do while, or for

Outline The while statement Some simple examples Mark averaging The break statement The continue statement The do while statement The for statement

The WHILE Statement while (condition) body next_statement 1. Evaluate the condition If true, execute body. body can be a single statement or a block, in which case all the statements in the block will be executed 2. Go back and execute from step 1 3. If false, execution of while statement ends and control goes to the next statement Each execution of the body = iteration

The WHILE Statement while (condition) body The condition must eventually become false, otherwise the program will never halt. Not halting is not acceptable. If the condition is true originally, then the value of some variable used in condition must change in the execution of body, so that eventually condition becomes false

WHILE Statement Flowchart Previous statement in the Program Condition False True Body Next statement in the Program

A Program That?????? main_program{ int x=10; while(x > 0){ cout << Iterating << endl;

A Program that DOES halt main_program{ int x=3; while(x > 0){ cout << Iterating << endl; First x is assigned the value 3 Condition x > 0 is TRUE So body is executed (prints Iterating) AFTER x-- is executed, the value of x is 2 x--;

And so on. till main_program{ int x=3; while(x > 0){ cout << Iterating << endl; x--; Again the condition is evaluated. For x with value 1, condition is still TRUE So execute this print iterating Decrement x Value now is 0

Exiting the loop main_program{ int x=3; while(x > 0){ cout << Iterating << endl; x--; Again the condition is evaluated. For x with value 0, condition is now FALSE So control goes outside the body of the loop Program exits

WHILE vs. REPEAT Anything you can do using repeat can be done using while (but not vice-versa) repeat(n){ any code Equivalent to int i=n; while(i>0){i--; any code OR int i = 0; while(i<n){any code; i++

#include<simplecpp> What happens in this loop? main_program{ int n = 5; repeat(n) { cout << "in loop" << endl; n++; while(n > 0){ cout << "in 2nd loop" <<endl; n++; What happens in this loop?

Mark Averaging Natural strategy 1. Read the next value 2. If it is negative, then go to step 5, if it is positive, continue to step 3 3. Add the value read to the sum of values read so far, Increment count of values read so far. 4. Go to step 1 5. Print sum/count A bit tricky to implement using while

Flowchart Of Mark Averaging vs. Flowchart Of While Start Previous statement in the program cin >> nextmark In the flowchart of mark averaging, the first statement to be repeated is Condition not the condition check nextmark>=0 statement to be repeated, is the condition True sum = sum + nextmark; count = count + 1; False In the flowchart of while, the first check True Body False Calculate and print average Flowchart of mark averaging Next statement in the Program Flowchart of WHILE

Fixing the discrepancy Start A Start A cin >> nextmark cin >> nextmark C nextmark>=0 False C nextmark>=0 False B True sum = sum + nextmark; count = count + 1; B sum = sum + nextmark; count = count + 1; A cin >> nextmark Original Modified

Program main_program{ float nextmark, sum = 0; int count = 0; cin >> nextmark; while(nextmark >= 0){ sum += nextmark; count++; cin >> nextmark; cout << sum/count << endl;

Remarks Often, we naturally think of flowcharts in which the repetition does not begin with a condition check. In such cases we must make a copy of the code, as we did in our example Also remember that the condition at the beginning of the while must say under what conditions we should enter the loop, not when we should get out of the loop. Write the condition accordingly Note that the condition can be specified as true, which is always true. This may seem puzzling, since it appears that the loop will never terminate. But this will be useful soon..

Nested WHILE Statements We can put one while statement inside another The execution is as you might expect. Example: int i=3; while(i > 0) { i--; int j=5; while(j > 0){ j--; cout << A ; cout << endl; What do you think this will print?

The BREAK Statement The break keyword is a statement by itself When it is encountered in execution, the execution of the innermost while statement which contains it is terminated, and the execution continues from the next statement following the while statement

Nested WHILE Statements We can put one while statement inside another The execution is as you might expect. Example: int i=3; while(i > 0) { i--; int j=5; while(j > 0){ j--; cout << A ; break; cout << endl; What do you think this will print?

Back to Mark Averaging main_program{ float nextmark, sum = 0; int count = 0; while(true){ cin >> nextmark; if(nextmark < 0) break; sum += nextmark; count++; cout << sum/count << endl; If break is executed, control goes here, out of the loop

The CONTINUE Statement continue is another single word statement If it is encountered in execution, the control directly goes to the beginning of the loop for the next iteration, skipping the statements from the continue statement to the end of the loop body

Example Mark averaging with an additional condition : if a number > 100 is read, discard it (say because marks can only be at most 100) and continue with the next number. As before stop and print the average only when a negative number is read

Code For New Mark Averaging main_program{ float nextmark, sum = 0; int count = 0; while (true){ cin >> nextmark; if(nextmark > 100) continue; if(nextmark < 0) break; sum += nextmark; count++; cout << sum/count << endl; If executed, the control goes back to condition evaluation

The DO-WHILE Statement Not very common Discussed in the book

The FOR Statement: Motivation Example: Write a program to print a table of cubes of numbers from 1 to 100 int i = 1; repeat(100){ cout << i << << i*i*i << endl; i++; This idiom: do something for every number between x and y occurs very commonly The for statement makes it easy to express this idiom, as follows: for(int i=1; i<= 100; i++) cout << i << << i*i*i << endl;

The FOR Statement for(initialization; condition; update) body initialization, update : Typically assignments condition : boolean expression Before the first iteration of the loop the initialization is executed Within each iteration the condition is first tested. If it fails, the loop execution ends. If the condition succeeds, then the body is executed. After that the update is executed. Then the next iteration begins

Flowchart for FOR Statement Previous statement in the program Initialization Condition False Body True Update Next statement in the Program

int i; for(i=0; i < 0; i++) cout << in loop << endl; What happens here?

int i; for(i=0; i > 0; i++) cout << in loop << endl; What happens here?

Definition of Repeat repeat(n) is same as for (int _iterator_i = 0, _iterator_limit = n; _iterator_i < _iterator_limit; _iterator_i ++) Hence changing n in the loop will have no effect in the number of iterations

Determining whether a number is prime main_program{ int n; cin >> n; bool found = false; for(int i=2; i < n &&!found; i++){ if(n % i == 0){ found = true; if(found) cout << "Composite.\n"; else cout << "Prime.\n";

Euclid's Algorithm For GCD Greatest Common Divisor (GCD) of positive integers m, n : largest positive integer p that divides both m, n Standard method: factorize m, n and multiply common factors Euclid s algorithm (2300 years old!) is different and much faster

Euclid s Algorithm Basic Observation: If d divides both m, n, then d divides m-n also, assuming m > n Converse is also true: If d divides m-n and n, then it divides m too => m, n, m-n have the same common divisors The largest divisor of m, n is also the largest divisor of m-n,n Observation: Instead of finding GCD(m,n), we might as well find GCD(n, m-n)

Example GCD(3977, 943) =GCD(3977-943,943) = GCD(3034,943) =GCD(3034-943,943) = GCD(2091,943) =GCD(2091-943,943) = GCD(1148,943) =GCD(1148-943,943) = GCD(205, 943) We should realize at this point that 205 is just 3977 % 943 (repeated subtraction is division) So we could have got to this point just in one shot by writing GCD(3977,943) = GCD(3977 % 943, 943)

Example Should we guess that GCD(m,n) = GCD(m%n, n)? This is not true if m or n = 0, since we have defined GCD only for positive integers. But we can save the situation, as Euclid did Euclid s theorem: If m>n>0 are positive integers, then if n divides m then GCD(m,n) = n. Otherwise GCD(m,n) = GCD(m%n, n)

Example Continued GCD(3977,943) = GCD(3977 % 943, 943) = GCD(205, 943) = GCD(205, 943%205) = GCD(205,123) = GCD(205%123,123) = GCD(82, 123) = GCD(82, 123%82) = GCD(82, 41) = 41 because 41 divides 82

Algorithm Our GCD Program input: values M, N which are stored in variables m, n. iteration : Either discover the GCD of M, N, or find smaller numbers whose GCD is same as GCD of M, N Details of an iteration: At the beginning we have numbers stored in m, n, whose GCD is the same as GCD(M,N). If n divides m, then we declare n to be the GCD. If n does not divide m, then we know that GCD(M,N) = GCD(n, m%n) So we have smaller numbers n, m%n, whose GCD is same as GCD(M,N)

Program For GCD main_program{ int m, n; cin >> m >> n; while(m % n!= 0){ int nextm = n; int nextn = m % n; m = nextm; n = nextn; cout << n << endl; // To We could store have n, done m%n the into assignment m,n, we with cannot just one variable // just as follows write m=n; n=m%n; WHY?? int r = m%n; m = n; n = r;

Remark It should be intuitively clear that in writing the program, we have followed the idea from Euclid s theorem and it should therefore be correct. However, having written the program, we should check this again

Termination and Correctness The questions to ask are: Does it terminate? Does it give the correct answer? For any program, it is essential to argue both these. This is done by defining Invariants Potential

Invariants Let M, N be the values typed in by the user into variables m, n We can make the following claim Just before and just after every iteration, GCD(m,n) = GCD(M,N) The values m and n change, M and N do not Loop Invariant: A property (describing a pattern of values of variables) which does not change due to the loop iteration.

Loop Invariant for GCD main_program{ int m, n; cin >> m >> n; // Assume M, N // Invariant: GCD(m,n) = GCD(M,N) // because m=m and n=n while(m % n!= 0){ int nextm = n; // the invariant may int nextn = m % n; // not hold after m = nextm; // these statements n = nextn; // Invariant: GCD(m,n) = GCD(M,N) // inspite of the fact that m, n have changed cout << n << endl;

Loop Invariant for GCD GCD(3977,943) m=m=3977, n=n=943 = GCD(3977 % 943, 943) = GCD(205, 943) = GCD(205, 943%205) m=205, n=943 = GCD(205,123) = GCD(205%123,123) m=205, n=123 = GCD(82, 123) = GCD(82, 123%82) m=205, n=123 = GCD(82, 41) m=82, n=41 = 41 because 41 divides 82

The Intuition Behind Loop Invariant // Invariant holds here while(m % n!= 0) { // Invariant holds at the start of the loop // The loop body may disturb the invariant // by changing the values of variables // but the invariant must hold at the start // of the next iteration // Hence invariant must be restored // Invariant must hold here too

The Intuition Behind Loop Invariant Previous statement in the program The invariant holds here before the execution every subsequent iteration Condition Body True The invariant holds here before the execution of the loop begins False The loop body may disturb the invariant but it must be restored before beginning the execution of the next iteration Next statement in the Program

Proof of the Invariant in GCD Program Clearly, the invariant is true just before the first iteration In any iteration, the new values assigned to m,n are as per Euclid s theorem, and hence the invariant must be true at the end, and hence at the beginning of the next iteration But the above argument applies to all iterations

Proof of Termination The only thing that remains is to show termination The value of the variable n must decrease in each iteration. (because, nextn = m%n which must be smaller than n), But n must always be a positive integer in every iteration: (because we enter an iteration only if m%n!= 0, and then set nextn = m%n) Thus n cannot decrease indefinitely, it cannot go below 1 n starts with the value N, thus the algorithm must terminate after at most N iterations This argument is called a potential function argument (Analogy: Potential energy drops as system becomes less active) You have to creatively choose the potential

Invariants in simple programs Correctness of very simple loops may be obvious, and it may not be necessary to write invariants etc. However, invariants can be written, and they still make our intent more explicit. Example: Cube table program Next

Invariants in the cube table program for(int i=1; i<=100; i++) cout << i << <<i*i*i<<endl; Invariant: Cubes until i-1 have been printed. True for every iteration! Potential: value of i: it must increase in every step, but cannot increase beyond 100. For programs so simple, writing invariants seems to make simple things unnecessarily complex. But invariants are very useful when programs are themselves complex/clever.

What is the Loop Invariant Here? unsigned int x; cin >> x; int y = 0; while (x!= y) y++; x >= y

What is the Loop Invariant Here? int j=9; for (int i=0; i<10; i++) j--; 0 <= i < 10 0 <= i <=10 i+j = 9 i+j=9, 0<=i<=10 NO Yes, but not precise (misses j) Yes, but not precise Yes, most precise

Is i+j=9 a Loop Invariant Here? Visit to the condition Value of i Value of j Loop body executed? j=9 1 0 9 Yes 2 1 8 Yes 3 2 7 Yes 4 3 6 Yes 5 4 5 Yes 6 5 4 Yes 7 6 3 Yes 8 7 2 Yes 9 8 1 Yes 10 9 0 No i=0 i < 10 True j-- i++ False

Remarks while, do while, for are the C++ statements that allow you to write loops repeat allows you to write a loop, but it is not a part of C++ It is a part of simplecpp; it was introduced because it is very easy to understand. Now that you know while, do while, for, you should stop using repeat

Remarks An important issues in writing a loop is how to break out of the loop. You may not necessarily wish to break at the beginning of the repeated portion. In which case you can either duplicate code, or use break