Introduction to Programming (in C++) Algorithms on sequences. Reasoning about loops: Invariants. Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept.

Slides:



Advertisements
Similar presentations
Introduction to Programming (in C++) Subprograms: procedures and functions Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science,
Advertisements

Introduction to Programming (in C++) Advanced examples Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
CSE 1301 Lecture 6B More Repetition Figures from Lewis, “C# Software Solutions”, Addison Wesley Briana B. Morrison.
Computer Science 1620 Loops.
1 9/29/06CS150 Introduction to Computer Science 1 Loops Section Page 255.
1 CIS 205 Practice Test George Lamperti A word that has a predefined meaning in a C++ program and cannot be used as a variable name is known as.
Starting Out with C++: Early Objects 5/e © 2006 Pearson Education. All Rights Reserved Starting Out with C++: Early Objects 5 th Edition Chapter 5 Looping.
1 9/15/06CS150 Introduction to Computer Science 1 Combined Assignments, Relational Operators, and the If Statement.
5-1 Flow of Control Recitation-01/25/2008  CS 180  Department of Computer Science  Purdue University.
1 Chapter 18 Recursion Dale/Weems/Headington. 2 Chapter 18 Topics l Meaning of Recursion l Base Case and General Case in Recursive Function Definitions.
Computer Science 1620 Programming & Problem Solving.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Java Software Solutions Foundations of Program Design Sixth Edition by Lewis.
CS150 Introduction to Computer Science 1
1 10/25/06CS150 Introduction to Computer Science 1 Reading from and Writing to Files.
Chapter 2 Recursion: The Mirrors. © 2005 Pearson Addison-Wesley. All rights reserved2-2 Recursive Solutions Recursion is an extremely powerful problem-
Chapter 2: Algorithm Discovery and Design
Introduction to Programming (in C++) Vectors Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Introduction to Programming (in C++) Introduction Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Introduction to Programming (in C++) Data types and visibility Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. Computer Science, UPC.
Introduction to Programming (in C++) Recursion Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Introduction to Programming (in C++) Data and statements Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Introduction to Programming (in C++) Conclusions Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
1 CS October 2008 The while loop and assertions Read chapter 7 on loops. The lectures on the ProgramLive CD can be a big help. Quotes for the Day:
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 122 – Data Structures Recursion Review.
True or False: Boolean Expression Boolean expression are expressions which evaluate to "true" or "false“ Primary operators to combine expressions: && (and),
Reasoning with invariants Jordi Cortadella Department of Computer Science.
Data types and their representation Jordi Cortadella Department of Computer Science.
Chars and strings Jordi Cortadella Department of Computer Science.
Prime numbers Jordi Cortadella Department of Computer Science.
Slides prepared by Rose Williams, Binghamton University ICS201 Lecture 19 : Recursion King Fahd University of Petroleum & Minerals College of Computer.
Recursion Textbook chapter Recursive Function Call a recursive call is a function call in which the called function is the same as the one making.
Recursion Jordi Cortadella Department of Computer Science.
Sequences Jordi Cortadella Department of Computer Science.
Search algorithms for vectors Jordi Cortadella Department of Computer Science.
Introduction to Programming (in C++) Loops Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Data structure design Jordi Cortadella Department of Computer Science.
Sudoku Jordi Cortadella Department of Computer Science.
First steps Jordi Cortadella Department of Computer Science.
Computer Science 1620 boolean. Types so far: Integer char, short, int, long Floating Point float, double, long double String sequence of chars.
Reusing computations Jordi Cortadella Department of Computer Science.
For loops, nested loops and scopes Jordi Cortadella Department of Computer Science.
Introduction to Programming (in C++) Sorting Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Introduction to Programming (in C++) Numerical algorithms Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Quiz 3 is due Friday September 18 th Lab 6 is going to be lab practical hursSept_10/exampleLabFinal/
Overview Go over parts of quiz? Another iteration structure for loop.
Introduction to Programming (in C++) Multi-dimensional vectors Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Copyright © 2000, Department of Systems and Computer Engineering, Carleton University 1 Introduction An array is a collection of identical boxes.
1 CS April 2010 while loops Reading: today: Ch. 7 and ProgramLive sections. For next time: Ch Prelim 2. Thursday evening, 7:30PM Watch.
C++ Programming Lecture 19 Strings The Hashemite University Computer Engineering Department (Adapted from the textbook slides)
Vectors Jordi Cortadella Department of Computer Science.
1 CS April 2010 while loops Reading: today: Ch. 7 and ProgramLive sections. For next time: Ch Prelim 2. Thursday evening, 7:30PM Watch.
Searching CSE 103 Lecture 20 Wednesday, October 16, 2002 prepared by Doug Hogan.
Functions Jordi Cortadella Department of Computer Science.
CS Class 04 Topics  Selection statement – IF  Expressions  More practice writing simple C++ programs Announcements  Read pages for next.
Combinatorial problems Jordi Cortadella Department of Computer Science.
CHAPTER 2.2 CONTROL STRUCTURES (ITERATION) Dr. Shady Yehia Elmashad.
Jordi Cortadella, Ricard Gavaldà, Fernando Orejas
Reasoning with invariants
Jordi Cortadella Department of Computer Science
For loops, nested loops and scopes
CS 213: Data Structures and Algorithms
Lecture 4B More Repetition Richard Gesick
Jordi Cortadella Department of Computer Science
Alternate Version of STARTING OUT WITH C++ 4th Edition
Jordi Cortadella Department of Computer Science
Let’s all Repeat Together
Jordi Cortadella Department of Computer Science
CS148 Introduction to Programming II
Introduction to Programming (in C++) Advanced examples
Programming Fundamental
Presentation transcript:

Introduction to Programming (in C++) Algorithms on sequences. Reasoning about loops: Invariants. Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC

Outline Algorithms on sequences – Treat-all algorithms – Search algorithms Reasoning about loops: invariants Introduction to Programming© Dept. CS, UPC2

Maximum of a sequence Write a program that tells the largest number in a non-empty sequence of integers. Introduction to Programming© Dept. CS, UPC3 // Pre: a non-empty sequence of integers is // ready to be read at cin // Post: the maximum number of the sequence has been // written at the output Assume the input sequence is: // Invariant: m is the largest number read // from the sequence elem: m:23 34

Maximum of a sequence int main() { int m; int elem; cin >> m; // Inv: m is the largest element read // from the sequence while (cin >> elem) { if (elem > m) m = elem; } cout << m << endl; } Introduction to Programming© Dept. CS, UPC4 Why is this necessary? Checks for end-of-sequence and reads a new element.

Reading with cin The statement cin >> n can also be treated as a Boolean expression: – It returns true if the operation was successful – It returns false if the operation failed: no more data were available (EOF condition) or the data were not formatted correctly (e.g. trying to read a double when the input is a string) The statement: cin >> n can be used to detect the end of the sequence and read a new element simultaneously. If the end of the sequence is detected, n is not modified. Introduction to Programming© Dept. CS, UPC5

Finding a number greater than N Write a program that detects whether a sequence of integers contains a number greater than N. Introduction to Programming© Dept. CS, UPC6 // Pre: at the input there is a non-empty sequence of // integers in which the first number is N. // Post: writes a Boolean value that indicates whether // a number larger than N exists in the sequence. Assume the input sequence is: // Invariant: “found” indicates that a value greater than // N has been found. num: N:23 found:false true

Finding a number greater than N int main() { int N, num; cin >> N; bool found = false; // Inv: found indicates that a number // greater than N has been found while (not found and cin >> num) { found = num > N; } cout << found << endl; } Introduction to Programming© Dept. CS, UPC7

Algorithmic schemes on sequences The previous examples perform two different operations on a sequence of integers: – Finding the maximum number – Finding whether there is a number greater than N They have a distinctive property: – The former requires all elements to be visited – The latter requires one element to be found Introduction to Programming© Dept. CS, UPC8

Treat-all algorithms A classical scheme for algorithms that need to treat all the elements in a sequence Introduction to Programming© Dept. CS, UPC9 Initialize (the sequence and the treatment) // Inv: The visited elements have been treated while (not end of sequence) { Get a new element e; Treat e; } visited not visited

Search algorithms A classical scheme for algorithms that need to find an element with a certain property in a sequence Introduction to Programming© Dept. CS, UPC10 bool found = false; Initialize; // Inv: “found” indicates whether the element has been // found in the visited part of the sequence while (not found and not end of sequence) { Get a new element e; if (Property(e)) found = true; } // “found” indicates whether the element has been found. // “e” contains the element.

Longest repeated subsequence Assume we have a sequence of strings cat dog bird cat bird bird cat cat cat dog mouse horse We want to calculate the length of the longest sequence of repetitions of the first string. Formally, if we have a sequence of strings we want to calculate Introduction to Programming© Dept. CS, UPC11

Longest repeated subsequence // Specification: see previous slide // Variable to store the first string. string first; cin >> first; string next; // Visited string in the sequence // Length of the current and longest subsequences int length = 1, longest = 1; // Inv: “length” is the length of the current subsequence. // “longest” is the length of the longest subsequence // visited so far. while (cin >> next) { if (first != next) length = 0; // New subsequence else { // The current one is longer length = length + 1; if (length > longest) longest = length; } // “longest” has the length of the longest subsequence Introduction to Programming© Dept. CS, UPC12

Search in the dictionary Assume we have a sequence of strings representing words. The first string is a word that we want to find in the dictionary that is represented by the rest of the strings. The dictionary is ordered alphabetically. Examples: dog ant bird cat cow dog eagle fox lion mouse pig rabbit shark whale yak frog ant bird cat cow dog eagle fox lion mouse pig rabbit shark whale yak We want to write a program that tells us whether the first word is in the dictionary or not. Introduction to Programming© Dept. CS, UPC13

Search in the dictionary // Specification: see previous slide // First word in the sequence (to be sought). string word; cin >> word; // A variable to detect the end of the search // (when a word is found that is not smaller than “word”). bool found = false; // Visited word in the dictionary (initialized as empty for // the case in which the dictionary might be empty). string next = “”; // Inv: not found => the visited words are smaller than “word” while (not found and cin >> next) found = next >= word; // “found” has detected that there is no need to read the rest of // the dictionary found = word == next; // “found” indicates that the word was found. Introduction to Programming© Dept. CS, UPC14

Increasing number We have a natural number n. We want to know whether its representation in base 10 is a sequence of increasing digits. Examples:  increasing  increasing 3  increasing  non-increasing Introduction to Programming© Dept. CS, UPC15

Increasing number (I) // Pre: n >= 0 // Returns true if the sequence of digits representing n (in base 10) // is increasing, and returns false otherwise bool increasing(int n) { // The algorithm visits the digits from LSB to MSB. bool incr = true; int previous = 9; // Stores a previous “fake” digit // Inv: n contains the digits no yet treated, previous contains the // last treated digit (that can never be greater than 9), // incr implies all the treated digits form an increasing sequence while (incr and n > 0) { int next = n%10; incr = next <= previous; previous = next; n /= 10; } return incr; } Introduction to Programming© Dept. CS, UPC16

Increasing number (II) // Pre: n >= 0 // Returns true if the sequence of digits representing n (in base 10) // is increasing, and returns false otherwise bool increasing(int n) { // The algorithm visits the digits from LSB to MSB. int previous = 9; // Stores a previous “fake” digit // Inv: n contains the digits no yet treated, previous contains the // last treated digit (that can never be greater than 9) and // all the previously treated digits form an increasing sequence while (n > 0) { int next = n%10; if (next > previous) return false; previous = next; n /= 10; } return true; } Exercise: write the function increasing(int n, int b) with the same specification, but for a number representation in base b. Introduction to Programming© Dept. CS, UPC17

Insert a number in an ordered sequence Read a sequence of integers that are all in ascending order, except the first one. Write the same sequence with the first element in its correct position. Note: the sequence has at least one number. The output sequence must have a space between each pair of numbers, but not before the first one or after the last one. Example Input: Output: The program can be designed with a combination of search and treat-all algorithms. Introduction to Programming© Dept. CS, UPC18

Insert a number in an ordered sequence int first; cin >> first; bool found = false; // controls the search of the location int next; // the next element in the sequence // Inv: All the read elements that are smaller than the first have been written // not found => no number greater than or equal to the first has been // found yet while (not found and cin >> next) { if (next >= first) found = true; else cout << next << “ ”; } cout << first; if (found) { cout << “ “ << next; // Inv: all the previous numbers have been written while (cin >> next) cout << “ “ << next; } cout << endl; Introduction to Programming© Dept. CS, UPC19

Counting words We have a sequence of characters representing a text that ends with ‘.’ We want to calculate the number of words in the text. A word is a sequence of letters. Words are separated by characters that are not letters. There could be an undefined number of separators before the first word and after the last word. Example: the text ¡¡ Today is Friday !! Alice, are we going out for dinner?. has 10 words. Introduction to Programming© Dept. CS, UPC20

Counting words // Pre: the input contains a sequence of // characters that ends with ‘.’ // Post: the number of words in the // sequence has been written at // the output. Introduction to Programming© Dept. CS, UPC21

Counting words char read_word(): // Pre: the last char from the input was a letter // Returns the next char that is not a letter. char next_word(char c): // Pre: c is the last non-letter char read from the input. // Returns the next char that is a letter or a ‘.’ Note: next_word will return c if it is a ‘.’ Introduction to Programming© Dept. CS, UPC22.. wordwordwordwordwordwordwordword read_word next_word

Counting words int main() { char c = next_word(‘ ‘); // A fake ‘ ‘ as parameter int count = 0; // Inv: count is the number of words in the treated part // of the input. c contains the first char in the // non-treated part while (c != '.') { count = count + 1; c = read_word(); c = next_word(c); // or: c = next_word(read_word()); } cout << count << endl; } Introduction to Programming© Dept. CS, UPC23

Counting words // Pre: c is the last non-letter char read from the input. // Returns the next char that is a letter or a ‘.’ char next_word(char c) { bool found = false; // Inv: found indicates that a letter has been found. // c is the last char read from the input while (c != '.' and not found){ c = cin.get(); found = is_letter(c); /* cin.get() returns the next char at the input. (cin>>c skips spaces and other separating chars) */ } return c; } Introduction to Programming© Dept. CS, UPC24

Counting words // Pre: c is the last non-letter char read from the input. // Returns the next char that is a letter or a ‘.’ char next_word(char c) { // a simpler solution // Inv: c is the last char read from the input while (c != '.' and not is_letter(c)) c = cin.get(); return c; } Introduction to Programming© Dept. CS, UPC25

Counting words // Pre: the last char from the input was a letter // Returns the next char that is not a letter. char read_word() { char c = cin.get(); // Next char after the first letter // Inv: c is the last char read from the input while (is_letter(c)) c = cin.get(); return c; } Introduction to Programming© Dept. CS, UPC26

Counting words // Returns whether c is a letter bool is_letter(char c) { return ('a' <= c and c <= 'z') or ('A' <= c and c <= 'Z'); } Introduction to Programming© Dept. CS, UPC27

REASONING ABOUT LOOPS: INVARIANTS Introduction to Programming© Dept. CS, UPC28

Invariants Invariants help to … – Define how variables must be initialized before a loop – Define the necessary condition to reach the post-condition – Define the body of the loop – Detect whether a loop terminates It is crucial, but not always easy, to choose a good invariant. Recommendation: – Use invariant-based reasoning for all loops (possibly in an informal way) – Use formal invariant-based reasoning for non-trivial loops Introduction to Programming© Dept. CS, UPC29

General reasoning for loops Initialization; // Invariant: a proposition that holds // * at the beginning of the loop // * at the beginning of each iteration // * at the end of the loop // Invariant while (condition) { // Invariant  condition Body of the loop; // Invariant } // Invariant   condition Introduction to Programming© Dept. CS, UPC30

Example with invariants Given n ≥ 0, calculate n! Definition of factorial: n! = 1  2  3  …  (n-1)  n (particular case: 0! = 1) Let’s pick an invariant: – At each iteration we will calculate f = i! – We also know that i  n at all iterations Introduction to Programming© Dept. CS, UPC31

Calculating n! // Pre: n ≥ 0 // Returns n! int factorial(int n) { int i = 0; int f = 1; // Invariant: f = i! and i  n while ( ) { // f = i! and i < n i = i + 1; f = fi; // f = i! and i  n } // f = i! and i  n and i ≥ n // f = n! return f; } Introduction to Programming© Dept. CS, UPC32 i < n

Reversing digits Write a function that reverses the digits of a number (representation in base 10) Examples:   91 3  3 0  0 Introduction to Programming© Dept. CS, UPC33

Reversing digits // Pre: n ≥ 0 // Returns n with reversed digits (base 10) int reverse_digits(int n) { int r; r = 0; // Invariant (graphical):  while ( ) { r = 10r + n%10; n = n/10; } return r; } Introduction to Programming© Dept. CS, UPC34 dddddd xyz zyx n r n > 0

Calculating   can be calculated using the following series: Since an infinite sum cannot be computed, it may often be sufficient to compute the sum with a finite number of terms. Introduction to Programming© Dept. CS, UPC35

Calculating  // Pre: nterms > 0 // Returns an estimation of  using nterms terms // of the series double Pi(int nterms) { double sum = 1; // Approximation of /2 double term = 1; // Current term of the sum // Inv: sum is an approximation of /2 with k terms, // term is the k-th term of the series. for (int k = 1; k < nterms; ++k) { term = termk/(2.0k + 1.0); sum = sum + term; } return 2sum; } Introduction to Programming© Dept. CS, UPC36

Calculating   = The series approximation: Introduction to Programming© Dept. CS, UPC37 ntermsPi(nterms)