1 / 16

Functions Overview

Functions Overview. Functions are sequence of statements with its own local variables supports modularity, reduces code duplication Data transfer between function to be called and caller function by means of parameters currently one-way from caller function into function to be called

ona
Download Presentation

Functions Overview

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Functions Overview • Functions are • sequence of statements with its own localvariables • supports modularity, reduces code duplication • Data transfer between function to be called and caller function • by means of parameters • currently one-way • from caller function into function to be called • We will see how to return data back to the caller function

  2. Function Prototype (from 2.6) • Functions definition has two parts • function heading • name, parameters, return type • function body (local variables and statements within curly brackets) void display (string name) { cout << “Hello ” << name << endl; } • Like variables, a function must be declared before its first call • Problem of function declaration order • You cannot call a function before you declare it • SOLUTION: You may define function prototypes (a copy of the heading) at the beginning without function declarations

  3. Function Prototype – Example Problem • What is the problem below (program order.cpp) ? void Hi (string name){ cout << "Hi " << name << endl; Greetings();}void Greetings(){ cout << "Things are happening inside this computer" << endl;}int main(){ Hi("Fred"); return 0;} • Greetings() is called in Hi() but it is declared afterwards

  4. Function Prototype – Solution • Add function prototypes to the beginning (order2.cpp) #include <iostream>#include <string>using namespace std;void Hi(string);void Greetings();void Hi (string name){cout << "Hi " << name << endl; Greetings();}void Greetings(){cout << "Things are happening inside this computer" << endl;}int main(){ Hi("Fred"); return 0;} Prototypes Function Declarations

  5. Function Prototypes • *** Do not forget semicolon after the prototype definition *** • no semicolon after the parameters in normal definition • Sometimes prototypes are not necessary • if the order of function calls allows • but it is good programming practice to have them • Parameter names are not needed in prototypes • but it is OK if you have the parameter names • In #included files • we have the functions’ prototypes only • implementations of function bodies are in libraries or in other cpp files • they are linked together

  6. Functions that return values • Functions we’ve written so far are void functions • They do a job and return back to caller, but without a value • Parameters are used for one-way data transfer • into the function to be called • How about transfer a computed value out of a function? • to the main program or to other function (the caller) • Non-void functions can return values of any type • function call becomes an expression • when the function finishes, the function call is replaced by the returned value • this way, values computed in functions can be transferred into the caller functions • void function call is not used in an expression, i.e. no value is associated with a void function Head(); DoThat(); Verse("cow", "moo");

  7. Functions that return values • Example (see area_func_return.cpp): • suppose circlearea function takes the radius as parameter and returns the area. • In the program we call circlearea as an expression (you have to use the returned value somewhere) area = circlearea(r); cout << circlearea(12) << endl; if (circlearea(r/2) >= 100) { cout << “large circle” << endl; } circlearea(r); //syntax ok, but meaningless because //function call returned value is not used.

  8. Math library functions • Mathematical functions like square root, logarithm, sin, cos, etc. • Prototypes are in header file cmath #include <cmath> • Full list is in page 758 (Table F.1) – partial list is in table 4.5. • correction in Table F.1: int abs (int x) • Keep thesemathlibraryfunctions on your cheat-sheet for the exam • Example use of function sqrt • see usemath.cpp • how did we use sqrt function? • in cout as an expression • could we use sqrt in assignment? How? • yes, let’s do it. • what happens if value is negative? • try and see! • we can add some if statements to display an error message in case of negative value

  9. Function Syntax return-typefunc-name(parameters) { local variables statements } Example: Function to calculate volume of a sphere doubleSphereVol(double radius) { return4.0*radius*radius*radius*acos(-1)/3; } function body

  10. Function Syntax doubleSphereVol(double radius) { return4.0*radius*radius*radius*acos(-1)/3; } • Function heading/prototype shows return type. • return type can be any type (including string) • theoretically return type may be Robot too, but in practice Robot class is not designed to be used as the return type • you do not see any syntax error, but execution may be problematic. So do not return a Robot from a function • Function body may have several statements in it • return statement is used to determine the value returned fromfunction, so the expression after it must be of the return type • Function body must include at least onereturn statement • The return statement causes the function to exit immediately and to return the value after return • A function can have more than one return statements, but only one is executed when the function is called (see next example) • Only one return is a good programming style to have control of bigger functions

  11. Functions can return strings string WeekDay(int day) // precondition: 0 <= day <= 6 // postcondition: return "Sunday" for 0, // "Monday" for 1, // … "Saturday" for 6 { if (0 == day) return "Sunday"; else if (1 == day) return "Monday"; else if (2 == day) return "Tuesday"; else if (3 == day) return "Wednesday"; else if (4 == day) return "Thursday"; else if (5 == day) return "Friday"; else if (6 == day) return "Saturday"; } • A program piece that uses that function string dayName; int dayNum; cout << " enter day (0-6): "; cin >> dayNum; dayName = WeekDay(dayNum); • Which is/are correct use of WeekDay function? Why? cout << WeekDay(5) << endl; int j = WeekDay(0); cout << WeekDay(2.1) << endl; string s = WeekDay(22); WeekDay(3);

  12. Function documentation • Functions usually have a precondition • What conditions (e.g. value of parameters) must be true for the function to work as intended? • If there are no parameters, then no precondition • Some functions work for every parameter value • no precondition • Functions always have a postcondition • If precondition is satisfied what does the function do? What does the function return?

  13. Example – Compare cost of pizza sizes • Problem: Calculate and compare price per square inch of large and small size pizzas • Solution: • A function, say Cost, that takes the pizza radius and price as parameters and returns price per square inch • In main() • input radiuses and prices of large and small pizzas • calculate the per square inch costs by calling the cost function • display the results on screen • compare the unit costs to find out which one is best value • See pizza2.cpp

  14. Example - When is a year a leap year? • Every year divisible by four is a leap year • Except years divisible by 100 are not • Except years divisible by 400 are • Alternatively: • Every year divisible by 400 is a leap year • Otherwise, years divisible by 100 are not leap years • Otherwise, years divisible by 4 are leap years • Otherwise, not a leap year • Boolean function bool IsLeapYear(int year); // pre: year > 0 // post: return true if year is a leap year

  15. Implementation and use of leap year function bool IsLeapYear(int year)// precondition: year > 0// postcondition: returns true if year is a leap year, else returns false { if (year % 400 == 0) // divisible by 400 { return true; } else if (year % 100 == 0) // divisible by 100 { return false; } else if (year % 4 == 0) // divisible by 4 { return true; } return false;} int main(){ int year; cout << "enter a year "; cin >> year; if (IsLeapYear(year)) { cout << year << " has 366 days, it is a leap year" << endl; } else { cout << year << " has 365 days, it is NOT a leap year" << endl; } return 0;} Seeisleap.cpp

  16. There’s more than one way • No if/else necessary in the function body bool IsLeapYear(int year) // precondition: year > 0 // post: return true if year is a leap year { return ( year % 400 == 0 ) || ( year % 4 == 0 && year % 100 != 0); } • How does this work? • Is this version more efficient? • Are these two versions different from user perspective?

More Related