Chapter 15 Functions and graphing Bjarne Stroustrup www.stroustrup.com/Programming.

Slides:



Advertisements
Similar presentations
Chapter 16 Graphical User Interfaces
Advertisements

Chapter 15 Functions and graphing Bjarne Stroustrup
Chapter 8 Technicalities: Functions, etc. Bjarne Stroustrup
Chapter 13 Graphics classes Bjarne Stroustrup
Chapter 14 Graph class design Bjarne Stroustrup
Chapter 4 Computation Bjarne Stroustrup
Chapter 9 Technicalities: Classes, etc. Bjarne Stroustrup
Methods Java 5.1 A quick overview of methods
Chapter 15 Functions and graphing John Keyser’s Modification of Slides by Bjarne Stroustrup
Chapter 16 Graphical User Interfaces John Keyser’s Modifications of Slides by Bjarne Stroustrup
The C ++ Language BY Shery khan. The C++ Language Bjarne Stroupstrup, the language’s creator C++ was designed to provide Simula’s facilities for program.
Chapter 14 Graph class design John Keyser’s Modifications of Slides by Bjarne Stroustrup
1 Chapter Six Algorithms. 2 Algorithms An algorithm is an abstract strategy for solving a problem and is often expressed in English A function is the.
Chapter 15 Functions and Graphing
Introduction Exponential equations in two variables are similar to linear equations in two variables in that there is an infinite number of solutions.
Chapter 4 Methods F Introducing Methods –Benefits of methods, Declaring Methods, and Calling Methods F Passing Parameters –Pass by Value F Overloading.
Functions. COMP104 Lecture 13 / Slide 2 Review of Array: Bubble Sort for (j=0; j List[j+1]) swap(List[j], List[j+1]); }
Introduction to Java Programming, 4E Y. Daniel Liang.
CS 201 Functions Debzani Deb.
Chapter 4 Methods F Introducing Methods –Benefits of methods, Declaring Methods, and Calling Methods F Passing Parameters –Pass by Value F Overloading.
1 Chapter 5 Methods. 2 Introducing Methods A method is a collection of statements that are grouped together to perform an operation.
Topic 2A – Library Functions and Casting. CISC 105 – Topic 2A Functions A function is a piece of code which performs a specific task. When a function.
1 Topic 04 Methods Programming II/A CMC2522 / CIM2561 Bavy Li.
 2000 Prentice Hall, Inc. All rights reserved. Functions in C Outline 1Introduction 2Program Modules in C 3Math Library Functions 4Functions 5Function.
Mathcad Variable Names A string of characters (including numbers and some “special” characters (e.g. #, %, _, and a few more) Cannot start with a number.
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 14 Graphics class design Hartmut Kaiser
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 12 A display model Hartmut Kaiser
Programming for Artists ART 315 Dr. J. R. Parker Art/Digital Media Lab Lec 10 Fall 2010.
Chapter 8 Technicalities: Functions, etc. John Keyser’s Modifications of Slides by Bjarne Stroustrup
Jon Curwin and Roger Slater, QUANTITATIVE METHODS: A SHORT COURSE ISBN © Cengage Chapter 2: Basic Sums.
Chapter 2: Measurement and Units  2.1 Space and Time  2.2 Mass, Matter, and Atoms  2.3 Experiments and Data.
Functions in C Outline 1Introduction 2Program Modules in C 3Math Library Functions 4Functions 5Function Definitions 6Function Prototypes 7Header Files.
Chapter 13 Graphics classes Bjarne Stroustrup
Lecture 5 Introduction to Programming in C Arne Kutzner Hanyang University / Seoul Korea.
Chapter 4 Methods F Introducing Methods –Benefits of methods, Declaring Methods, and Calling Methods F Passing Parameters –Pass by Value F Overloading.
COMP102 Lab 091 COMP 102 Programming Fundamentals I Presented by : Timture Choi.
Chapter 4 Methods F Introducing Methods F Declaring Methods F Calling Methods F Passing Parameters F Pass by Value F Overloading Methods F Method Abstraction.
Week 2 - Wednesday.  What did we talk about last time?  C compilation model  Lab 1.
CSCE 121: Introduction to Program Design and Concepts Dr. J. Michael Moore Spring 2015 Set 12: A Display Model 1 Based on slides created by Bjarne.
Week 2 - Friday.  What did we talk about last time?  Base systems  C literals  Representations in memory.
Programming for Artists ART 315 Dr. J. R. Parker Art/Digital Media Lab Lec 10 Fall 2010.
Chapter 8 Technicalities: Functions, etc. Bjarne Stroustrup
1 Interfaces and Abstract Classes Chapter Objectives You will be able to: Write Interface definitions and class definitions that implement them.
CSCE 121: Introduction to Program Design and Concepts, Honors J. Michael Moore Spring 2015 Set 14: Plotting Functions and Data 1.
Chapter 14 Graph class design Bjarne Stroustrup
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 12 A display model Hartmut Kaiser
Excel 2007 Part (3) Dr. Susan Al Naqshbandi
The Math Class Methods Utilizing the Important Math Operations of Java!
1 Java Library Lecture 9 by Dr. Norazah Yusof. 2 Java Library Java has pre-defined classes that consist of the basic language classes in Java (organized.
1 Printing in Python Every program needs to do some output This is usually to the screen (shell window) Later we’ll see graphics windows and external files.
Chapter 14 Graph class design Bjarne Stroustrup
Chapter 4: Methods Method Structure Method Structure Declaring Methods Declaring Methods Calling Methods Calling Methods Passing Parameters Passing Parameters.
Operators and Expressions. Introduction C operators can be classified into a number of categories 1.Arithmetic(+, -, *, /, %) 2.Relational (, >=, ==,
Chapter 5 Methods F Introducing Methods F Declaring Methods F Calling Methods F Passing Parameters F Pass by Value F Overloading Methods F Method Abstraction.
Type casting Algorithm & flowchart
Chapter 14 Graph class design
Chapter 3 Methods.
Lecturer: Mukhtar Mohamed Ali “Hakaale”
Chapter 5 – Part 2 Methods Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved
Higher-Order Procedures
Functions.
Chapter 14 Graph class design
Chapter 13 Graphics classes
Chapter 5 Methods.
Chapter 12 A display model
Chapter 16 Graphical User Interfaces
Chapter 14 Graph class design
Chapter 4 Methods Introducing Methods Declaring Methods
Chapter 16 Graphical User Interfaces
Functions in C Math Library Functions Functions Function Definitions
Presentation transcript:

Chapter 15 Functions and graphing Bjarne Stroustrup

Abstract Here we present ways of graphing functions and data and some of the programming techniques needed to do so, notably scaling. Here we present ways of graphing functions and data and some of the programming techniques needed to do so, notably scaling. Stroustrup/Programming/20152

Note This course is about programming This course is about programming The examples – such as graphics – are simply examples of The examples – such as graphics – are simply examples of Useful programming techniques Useful programming techniques Useful tools for constructing real programs Useful tools for constructing real programs Look for the way the examples are constructed Look for the way the examples are constructed How are “big problems” broken down into little ones and solved separately? How are “big problems” broken down into little ones and solved separately? How are classes defined and used? How are classes defined and used? Do they have sensible data members? Do they have sensible data members? Do they have useful member functions? Do they have useful member functions? Use of variables Use of variables Are there too few? Are there too few? Too many? Too many? How would you have named them better? How would you have named them better? Stroustrup/Programming/20153

Graphing functions Start with something really simple Start with something really simple Always remember “Hello, World!” Always remember “Hello, World!” We graph functions of one argument yielding one value We graph functions of one argument yielding one value Plot (x, f(x)) for values of x in some range [r1,r2) Plot (x, f(x)) for values of x in some range [r1,r2) Let’s graph three simple functions: Let’s graph three simple functions: double one(double x) { return 1; } // y==1 double slope(double x) { return x/2; }// y==x/2 double square(double x) { return x*x; } // y==x*x Stroustrup/Programming/20154

Functions double one(double x) { return 1; } // y==1 double slope(double x) { return x/2; }// y==x/2 double square(double x) { return x*x; } // y==x*x Stroustrup/Programming/20155

How do we write code to do this? Simple_window win0 {Point{100,100},xmax,ymax,"Function graphing"}; Function s {one, -10,11, orig, n_points, x_scale,y_scale}; Function s2 {slope, -10,11, orig, n_points, x_scale,y_scale}; Function s3 {(square, -10,11, orig, n_points, x_scale,y_scale}; win0.attach(s);win0.attach(s2);win0.attach(s3); win0.wait_for_button( ); Stroustrup/Programming/20156 Function to be graphed Range in which to graph [x0:xN) “stuff” to make the graph fit into the window First point

We need some Constants const int xmax = win0.x_max();// window size (600 by 400) const int ymax = win0.y_max(); const int x_orig = xmax/2; const int y_orig = ymax/2; const Point orig {x_orig, y_orig}; // position of Cartesian (0,0) in window const int r_min = -10;// range [-10:11) == [-10:10] of x const int r_max = 11; const int n_points = 400;// number of points used in range const int x_scale = 20;// scaling factors const int y_scale = 20; // Choosing a center (0,0), scales, and number of points can be fiddly // The range usually comes from the definition of what you are doing Stroustrup/Programming/20157

Functions – but what does it mean? What’s wrong with this? What’s wrong with this? No axes (no scale) No axes (no scale) No labels No labels Stroustrup/Programming/20158

Label the functions Text ts {Point{100,y_orig-30},"one"}; Text ts2 {Point{100,y_orig+y_orig/2-10},"x/2"}; Text ts3 {Point{x_orig-90,20),"x*x"}; Stroustrup/Programming/20159

Add x-axis and y-axis We can use axes to show (0,0) and the scale We can use axes to show (0,0) and the scale Axis x {Axis::x, Point{20,y_orig}, xlength/x_scale, "one notch == 1"}; Axis y {Axis::y, Point{x_orig, ylength+20}, ylength/y_scale, "one notch == 1"}; Stroustrup/Programming/

Use color (in moderation) x.set_color(Color::red);y.set_color(Color::red); Stroustrup/Programming/201511

The implementation of Function We need a type for the argument specifying the function to graph We need a type for the argument specifying the function to graph using can be used to declare a new name for a type using can be used to declare a new name for a type using Count = int;// now Count means int using Count = int;// now Count means int Define the type of our desired argument, Fct Define the type of our desired argument, Fct using Fct = std::function ; // the type of a function // taking a double argument // and returning a double using Fct = std::function ; // the type of a function // taking a double argument // and returning a double std::function is a standard-library type std::function is a standard-library type Examples of functions of type Fct: Examples of functions of type Fct: double one(double x) { return 1; } // y==1 double slope(double x) { return x/2; }// y==x/2 double square(double x) { return x*x; } // y==x*x Stroustrup/Programming/201512

Now Define “Function” struct Function : Shape // Function is derived from Shape { // all it needs is a constructor: Function( Fct f,// f is a Fct (takes a double, returns a double) double r1, // the range of x values (arguments to f) [r1:r2) double r2, Point orig,// the screen location of Cartesian (0,0) Count count,// number of points used to draw the function // (number of line segments used is count-1) double xscale, // the location (x,f(x)) is (xscale*x, -yscale*f(x)), double yscale// relative to orig (why minus?) ); }; }; Stroustrup/Programming/201513

Implementation of Function Function::Function( Fct f, double r1, double r2,// range Point xy, Count count, double xscale, double yscale ) { if (r2-r1<=0) error("bad graphing range"); if (count<=0) error("non-positive graphing count"); double dist = (r2-r1)/count; double r = r1; for (int i = 0; i<count; ++i) { add(Point{xy.x+int(r*xscale), xy.y-int(f(r)*yscale)}); r += dist; }} Stroustrup/Programming/201514

Default arguments Seven arguments are too many! Seven arguments are too many! Many too many Many too many We’re just asking for confusion and errors We’re just asking for confusion and errors Provide defaults for some (trailing) arguments Provide defaults for some (trailing) arguments Default arguments are often useful for constructors Default arguments are often useful for constructors struct Function : Shape { Function(Fct f, double r1, double r2, Point xy, Count count = 100, double xscale = 25, double yscale=25 ); Count count = 100, double xscale = 25, double yscale=25 );}; Function f1 {sqrt, 0, 11, orig, 100, 25, 25};// ok (obviously) Function f2 {sqrt, 0, 11, orig, 100, 25};// ok: exactly the same as f1 Function f3 {sqrt, 0, 11, orig, 100};// ok: exactly the same as f1 Function f4 {sqrt, 0, 11, orig};// ok: exactly the same as f1 Stroustrup/Programming/201515

Function Is Function a “pretty class”? Is Function a “pretty class”? No No Why not? Why not? What could you do with all of those position and scaling arguments? What could you do with all of those position and scaling arguments? See for one minor idea See for one minor idea If you can’t do something genuinely clever, do something simple, so that the user can do anything needed If you can’t do something genuinely clever, do something simple, so that the user can do anything needed Such as adding parameters so that the caller can control precision Such as adding parameters so that the caller can control precision Stroustrup/Programming/201516

Some more functions #include // standard mathematical functions // You can combine functions (e.g., by addition): double sloping_cos(double x) { return cos(x)+slope(x); } Function s4 {cos,-10,11,orig,400,20,20}; s4.set_color(Color::blue); Function s5 {sloping_cos,-10,11,orig,400,20,20}; Stroustrup/Programming/201517

Cos and sloping-cos Stroustrup/Programming/201518

Standard mathematical functions ( ) double abs(double);// absolute value double abs(double);// absolute value double ceil(double d);// smallest integer >= d double ceil(double d);// smallest integer >= d double floor(double d);// largest integer <= d double floor(double d);// largest integer <= d double sqrt(double d);// d must be non-negative double sqrt(double d);// d must be non-negative double cos(double); double cos(double); double sin(double); double sin(double); double tan(double); double tan(double); double acos(double);// result is non-negative; “a” for “arc” double acos(double);// result is non-negative; “a” for “arc” double asin(double);// result nearest to 0 returned double asin(double);// result nearest to 0 returned double atan(double); double atan(double); double sinh(double);// “h” for “hyperbolic” double sinh(double);// “h” for “hyperbolic” double cosh(double); double cosh(double); double tanh(double); double tanh(double); Stroustrup/Programming/201519

Standard mathematical functions ( ) double exp(double);// base e double exp(double);// base e double log(double d);// natural logarithm (base e) ; d must be positive double log(double d);// natural logarithm (base e) ; d must be positive double log10(double);// base 10 logarithm double log10(double);// base 10 logarithm double pow(double x, double y);// x to the power of y double pow(double x, double y);// x to the power of y double pow(double x, int y);// x to the power of y double pow(double x, int y);// x to the power of y double atan2(double y, double x);// atan(y/x) double atan2(double y, double x);// atan(y/x) double fmod(double d, double m);// floating-point remainder // same sign as d%m double fmod(double d, double m);// floating-point remainder // same sign as d%m double ldexp(double d, int i);// d*pow(2,i) double ldexp(double d, int i);// d*pow(2,i) Stroustrup/Programming/201520

Why graphing? Because you can see things in a graph that are not obvious from a set of numbers Because you can see things in a graph that are not obvious from a set of numbers How would you understand a sine curve if you couldn’t (ever) see one? How would you understand a sine curve if you couldn’t (ever) see one? Visualization Visualization Is key to understanding in many fields Is key to understanding in many fields Is used in most research and business areas Is used in most research and business areas Science, medicine, business, telecommunications, control of large systems Science, medicine, business, telecommunications, control of large systems Can communicate large amounts of data simply Can communicate large amounts of data simply Stroustrup/Programming/201521

An example: e x e x == 1 + x + x + x 2 /2! + x 3 /3! + x 4 /4! + x 5 /5! + x 6 /6! + x 7 /7! + … Where ! means factorial (e.g. 4!==4*3*2*1) (This is the Taylor series expansion about x==0) Stroustrup/Programming/201522

Simple algorithm to approximate e x double fac(int n) { /* … */ }// factorial double term(double x, int n) // x n /n! { return pow(x,n)/fac(n); } double expe(double x, int n)// sum of n terms of Taylor series for e x { double sum = 0; for (int i = 0; i<n; ++i) sum+=term(x,i); return sum; } Stroustrup/Programming/201523

“Animate” approximations to e x Simple_window win {Point{100,100},xmax,ymax,""}; // the real exponential : Function real_exp {exp,r_min,r_max,orig,200,x_scale,y_scale}; real_exp.set_color(Color::blue);win.attach(real_exp); const int xlength = xmax-40; const int ylength = ymax-40; Axis x {Axis::x, Point{20,y_orig}, xlength, xlength/x_scale, "one notch == 1"}; Axis y {Axis::y, Point{x_orig,ylength+20}, ylength, ylength/y_scale, "one notch == 1"}; win.attach(x);win.attach(y);x.set_color(Color::red);y.set_color(Color::red); Stroustrup/Programming/201524

“Animate” approximations to e x for (int n = 0; n<50; ++n) { ostringstream ss; ss << "exp approximation; n==" << n ; win.set_label(ss.str().c_str()); expN_number_of_terms = n;// nasty sneaky argument to expN // next approximation: Function e([n](double x) { return expe(x,n); }, // n terms of Taylor series r_min,r_max,orig,200,x_scale,y_scale); r_min,r_max,orig,200,x_scale,y_scale);win.attach(e); win.wait_for_button();// give the user time to look win.detach(e);} Stroustrup/Programming/201525

Lambda expression What was this? What was this? ([n](double x) { return expe(x,n); }// n terms of Taylor series ([n](double x) { return expe(x,n); }// n terms of Taylor series It’s a lambda, aka lambda expression aka lambda function It’s a lambda, aka lambda expression aka lambda function It takes n from the context and makes a function object using it It takes n from the context and makes a function object using it we can only graph functions of one argument, we can only graph functions of one argument, so we had the language write one for us so we had the language write one for us ([n](double x) { return expe(x,n); } ([n](double x) { return expe(x,n); } Lambda expressions are important in modern C++ Lambda expressions are important in modern C++ A shorthand notation for defining function objects A shorthand notation for defining function objects Stroustrup/Programming/ Capture list starts with [ Argument declaration starts with ( lambda function body Starts with {

Demo The following screenshots are of the successive approximations of exp(x) using expe(x,n) The following screenshots are of the successive approximations of exp(x) using expe(x,n) Stroustrup/Programming/201527

Demo n = 0 Stroustrup/Programming/201528

Demo n = 1 Stroustrup/Programming/201529

Demo n = 2 Stroustrup/Programming/201530

Demo n = 3 Stroustrup/Programming/201531

Demo n = 4 Stroustrup/Programming/201532

Demo n = 5 Stroustrup/Programming/201533

Demo n = 6 Stroustrup/Programming/201534

Demo n = 7 Stroustrup/Programming/201535

Demo n = 8 Stroustrup/Programming/201536

Demo n = 18 Stroustrup/Programming/201537

Demo n = 19 Stroustrup/Programming/201538

Demo n = 20 Stroustrup/Programming/201539

Demo n = 21 Stroustrup/Programming/201540

Demo n = 22 Stroustrup/Programming/201541

Demo n = 23 Stroustrup/Programming/201542

Demo n = 30 Stroustrup/Programming/201543

Why did the graph “go wild”? Floating-point numbers are an approximations of real numbers Floating-point numbers are an approximations of real numbers Just approximations Just approximations Real numbers can be arbitrarily large and arbitrarily small Real numbers can be arbitrarily large and arbitrarily small Floating-point numbers are of a fixed size and can’t hold all real numbers Floating-point numbers are of a fixed size and can’t hold all real numbers Also, sometimes the approximation is not good enough for what you do Also, sometimes the approximation is not good enough for what you do Small inaccuracies (rounding errors) can build up into huge errors Small inaccuracies (rounding errors) can build up into huge errors Always Always be suspicious about calculations be suspicious about calculations check your results check your results hope that your errors are obvious hope that your errors are obvious You want your code to break early – before anyone else gets to use it You want your code to break early – before anyone else gets to use it Stroustrup/Programming/201544

Graphing data Often, what we want to graph is data, not a well-defined mathematical function Often, what we want to graph is data, not a well-defined mathematical function Here, we used three Open_polylines Here, we used three Open_polylines Stroustrup/Programming/201545

Graphing data Carefully design your screen layout Carefully design your screen layout Stroustrup/Programming/201546

Code for Axis struct Axis : Shape { enum Orientation { x, y, z }; Axis(Orientation d, Point xy, int length, int number_of_notches = 0,// default: no notches string label = ""// default : no label ); void draw_lines() const; void move(int dx, int dy); void set_color(Color);// in case we want to change the color of all parts at once // line stored in Shape // orientation not stored (can be deduced from line) Text label; Lines notches; }; Stroustrup/Programming/201547

Axis::Axis(Orientation d, Point xy, int length, int n, string lab) :label(Point(0,0),lab){ if (length<0) error("bad axis length"); switch (d){ case Axis::x: {Shape::add(xy);// axis line begin Shape::add(Point{xy.x+length,xy.y});// axis line end if (1<n) { int dist = length/n; int x = xy.x+dist; for (int i = 0; i<n; ++i) { notches.add(Point{x,xy.y},Point{x,xy.y-5}); x += dist; }} label.move(length/3,xy.y+20); // put label under the line break;} // … } Stroustrup/Programming/201548

Axis implementation void Axis::draw_lines() const { Shape::draw_lines();// the line notches.draw_lines();// the notches may have a different color from the line label.draw(); // the label may have a different color from the line } void Axis::move(int dx, int dy) { Shape::move(dx,dy);// the line notches.move(dx,dy);label.move(dx,dy);} void Axis::set_color(Color c) { // … the obvious three lines … } Stroustrup/Programming/201549

Next Lecture Graphical user interfaces Graphical user interfaces Windows and Widgets Windows and Widgets Buttons and dialog boxes Buttons and dialog boxes Stroustrup/Programming/201550