Date post: | 14-Dec-2015 |
Category: |
Documents |
Upload: | dustin-walton |
View: | 219 times |
Download: | 2 times |
Jozef Goetz, 2015
1
2002 Prentice Hall. All rights reserved.
Credits: 2011-2014 Pearson Education, Inc. All rights reserved.
Jozef Goetz, 2015
2
Chapter 7 - MethodsOutline
7.1 Introduction7.2 Packaging Code in C#7.3 static Methods, static Variables and Class Math7.4 Declaring Methods with Multiple Parameters7.5 Notes on Declaring and Using Methods7.6 Method Call Stack and Activation Records7.7 Argument Promotion and Casting7.8 The Framework Class Library7.9 Case Study: Random-Number Generation
7.9.1 Scaling and Shifting Random Numbers7.9.2 Random-Number Repeatability for Testing and
Debugging7.10 Case Study: A Game of Chance (Introducing Enumerations)7.11 Scope of Declarations7.10 Case Study: A Game of Chance (Introducing Enumerations)7.11 Scope of Declarations7.12 Method Overloading7.15 Recursion7.16 Passing Arguments: Pass-by-Value vs. Pass-by-Reference
Jozef Goetz, 2015
37.11 Scope of DeclarationsVariable and reference attributes:
1. name, 2. type, 3. size, 4. value, 5. scope, 6. duration
Scope Where an identifier can be referenced/accessed Local variable can only be used in a block declared
Class scope Begins at opening brace, ends at closing brace of class Methods and instance variables
Can be accessed by any method in class Repeated names causes previous to be hidden until scope ends
Block scope Begins at identifier's declaration, ends at terminating brace Have local variables and parameters of methods
When nested blocks and an outer block have an identifier defined; they need unique identifier names otherwise a syntax error
If local variable has same name as instance variable Instance variable "hidden”
Jozef Goetz, 2015
47.11 Scope of Declarations; Duration of Identifiers
Variable and reference attributes: name, type, size, value, duration, scope Duration (lifetime)
the period during which an identifier exists in memory
Automatic duration variables Created when program control reaches their declaration - local variables in a method
or in blocks, They should be initialized before they can be used Exist in block they are declared When block becomes inactive, they are destroyed
Static duration variables Created when defined and loaded into memory for execution Their storage is allocated and initialized when their classes are loaded into memory Exist until program ends
Local variables Created when declared Destroyed when the block exits
Instance variables are initialized by the compiler: Most variables are set to 0 All bool variables are set to false All reference variables are set to null
2002 Prentice Hall.All rights reserved.
Outline5
Scoping.cs
1 // Fig. 6.13 ed1 or 7.9 ed5 Scoping.cs2 // A Scoping example.3 4 using System;5 using System.Drawing;6 using System.Collections;7 using System.ComponentModel;8 using System.Windows.Forms;9 using System.Data;10 11 public class Scoping : System.Windows.Forms.Form12 {13 private System.ComponentModel.Container components = null;14 private System.Windows.Forms.Label outputLabel;15 16 public int x = 1; // instance variable17 18 public Scoping()19 {20 InitializeComponent();21 22 int x = 5; // variable local to constructor23 24 outputLabel.Text = outputLabel.Text +25 "local x in method Scoping is " + x;26 27 MethodA(); // MethodA has automatic local x;28 MethodB(); // MethodB uses instance variable x29 MethodA(); // MethodA creates new automatic local x30 MethodB(); // instance variable x retains its value31 32 outputLabel.Text = outputLabel.Text +33 "\n\nlocal x in method Scoping is " + x;34 }
This variable has class scope and can be used by any method in the class
This variable is local only to Scoping. It hides the value of the global variable
Will output the value of 5
Remains 5 despite changes to global version of x
2002 Prentice Hall.All rights reserved.
Outline6
Scoping.cs
35 36 // Visual Studio .NET-generated code37 38 public void MethodA()39 {40 int x = 25; // initialized each time a is called41 42 outputLabel.Text = outputLabel.Text +43 "\n\nlocal x in MethodA is " + x +44 " after entering MethodA";45 ++x;46 outputLabel.Text = outputLabel.Text +47 "\nlocal x in MethodA is " + x + 48 " before exiting MethodA";49 }50 51 public void MethodB()52 {53 outputLabel.Text = outputLabel.Text +54 "\n\ninstance variable x is " + x +55 " on entering MethodB";56 x *= 10;57 outputLabel.Text = outputLabel.Text + 58 "\ninstance varable x is " + x +59 " on exiting MethodB";60 }61 62 // main entry point for application63 [STAThread]64 static void Main() 65 {66 Application.Run( new Scoping() );67 }68 69 } // end of class Scoping
Uses the global version of x (1)
Uses a new x variable that hides the value of the global x
Will permanently change the value of x globally
Jozef Goetz, 2015
77.12 Method Overloading
Procedure/Method overloading allows procedure/methods with the same name
but different parameter set for each procedure/method
1.Parameter Types2. Order of parameters3. Number of parameters
Procedure/Methods cannot be distinguished by return type. The same signature and different return types result in a
syntax error.
Usually perform the same or closely related task On different data types
2002 Prentice Hall.All rights reserved.
Outline8
MethodOverload.cs
1 // Fig. 7.10: MethodOverload.cs2 // Using overloaded methods.3 4 using System;5 using System.Drawing;6 using System.Collections;7 using System.ComponentModel;8 using System.Windows.Forms;9 using System.Data;10 11 public class MethodOverload : System.Windows.Forms.Form12 {13 private System.ComponentModel.Container components = null;14 15 private System.Windows.Forms.Label outputLabel;16 17 public MethodOverload()18 {19 InitializeComponent();20 21 // call both versions of Square22 outputLabel.Text = 23 "The square of integer 7 is " + Square( 7 ) +24 "\nThe square of double 7.5 is " + Square ( 7.5 );25 }26 27 // Visual Studio .NET-generated code28
Two versions of the square method are called
2002 Prentice Hall.All rights reserved.
Outline9
MethodOverload.cs
Program Output
29 // first version, takes one integer30 public int Square ( int x )31 {32 return x * x;33 }34 35 // second version, takes one double36 public double Square ( double y )37 {38 return y * y;39 }40 41 [STAThread]42 static void Main()43 {44 Application.Run( new MethodOverload() );45 }46 47 } // end of class MethodOverload
One method takes an int as parameters
The other version of the method uses a double instead of an integer
2002 Prentice Hall.All rights reserved.
Outline10
MethodOverload2.cs
Program Output
1 // Fig. 7.11: MethodOverload2.cs2 // Overloaded methods with identical signatures and3 // different return types.4 5 using System;6 7 class MethodOverload28 {9 public int Square( double x )10 {11 return x * x;12 }13 14 // second Square method takes same number,15 // order and type of arguments, error16 public double Square( double y )17 {18 return y * y;19 }20 21 // main entry point for application22 static void Main()23 {24 int squareValue = 2;25 Square( squareValue );26 }27 28 } // end of class MethodOverload2
This method returns an integer
This method returns a double number
Since the compiler cannot tell which method to use based on passed values an error is generated
Jozef Goetz, 2015
As of Visual C# 2010 or 2012, methods can have optional parameters that allow the calling method to vary the number of arguments to pass.
An optional parameter specifies a default value that’s assigned to the parameter if the optional argument is omitted.
For example, the method headerpublic int Power( int baseValue, int exponentValue = 2)
specifies an optional second parameter.
You can create methods with one or more optional parameters.
All optional parameters must be placed to the right of the method’s non-optional parameters.
7.13 Optional Parameters
Jozef Goetz, 2015
When a parameter has a default value, the caller has the option of passing that particular argument.
public int Power( int baseValue, int exponentValue = 2)
specifies an optional second parameter.
Any call to Power must pass at least an argument for the parameter baseValue, or a compilation error occurs.
7.13 Optional Parameters (Cont.)
Jozef Goetz, 2015
Optionally, a second argument (for the exponentValue parameter) can be passed to Power.
Consider the following calls to Power:
Power()Power(10)Power(10, 3)
The first generates a compilation error because this method requires a minimum of one argument.
The second is valid because one argument (10) is being passed—the optional exponentValue is not specified in the method call.
7.13 Optional Parameters (Cont.)
Jozef Goetz, 2015
7.13 Optional Parameters
The last call Power(10, 3)is also valid -10 is passed as the required argument and 3 is passed as the optional argument.
In the call that passes only one argument (10), parameter exponentValue defaults to 2, which is the default value specified in the method’s header.
Each optional parameter must specify a default value by using an equal (=) sign followed by the value.
Jozef Goetz, 2015
•At least base Value must pass. •exponentValue is an optional parameter
Progr. Error 7.11: Declaring a non-optional parameter to the right of an optional one is a compilation error.
Jozef Goetz, 2015
Visual C# 2010/2012 provides a new feature called named parameters, which enable you to call methods that receive optional parameters by providing only the optional arguments you wish to specify.
Explicitly specify the parameter’s name and value —separated by a colon (:)—in the argument list of the method call. For example:
t.SetTime( hour: 12, second: 22 ); // sets the time to 12:00:22
t.SetTime( hour: 12, , second: 22 );// error
7.14 Named Parameters
Jozef Goetz, 2015
t.SetTime( hour: 12, second: 22 ); // sets the time to 12:00:22
The compiler assigns parameter hour the argument 12 and parameter second the argument 22.
The parameter minute is not specified, so the compiler assigns it the default value 0.
It’s also possible to specify the arguments out of order when using named parameters. The arguments for the required parameters must always be supplied.
t.SetTime(12); // sets the time 12:00:00 PMt.SetTime(12, 30); // sets the time 12:30:00 PMt.SetTime(12, , 30); // compilation error, C# doesn’t allow // skip an argument
7.14 Named Parameters
Jozef Goetz, 2015
187.15 Recursion
Fig. 7.13 Recursive evaluation of 5!, 5 factorial. A recursive def n! = n (n – 1)!
(a) Procession of recursive calls.
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
(b) Values returned from each recursive call.
Final value = 120
5! = 5 * 24 = 120 is returned
4! = 4 * 6 = 24 is returned
2! = 2 * 1 = 2 is returned
3! = 3 * 2 = 6 is returned
1 returned
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
•(a) Each time method calls itself with a slightly simple problem until converges on the base case. Continually breaks problem down to simpler forms.
•(b) then returns to the previous problem,
and a sequence of returns follows up the line until the original problem eventually returns the final
result to the caller.
While the number to be processed is greater than 1, the function calls itself
When the number is 1 or less (the base case), 1 is returned, and each function call can now return an answer until each call has been resolved
Jozef Goetz, 2015
19
General format formany recursive functions
if (some condition for which answer is known)
// base case
solution statement
else // general case
recursive function call
SOME EXAMPLES . . .
Jozef Goetz, 2015
20
Recursive Definition is a definition in which something is defined in terms of smaller
version of itself.
int Factorial ( int number ) // Recursive Solution// Pre: number is assigned and number >= 0.{ if ( number == 0) //(1) base case
return 1 ; //(2)else // general case
return number * Factorial ( number - 1 ) ; //(3) //includes the simpler problem}
Jozef Goetz, 2015
217.15 Recursion
Recursive method Calls itself (directly or indirectly) through another method Method knows how to solve only a simples case base case Method divides problem into
1. Base case2. Simpler problem
– Each time method calls itself with a slightly simple problem until converges on the base case,
Continually breaks problem down to simpler forms
Must converge on the base case in order to end recursion
Each method call remains open (unfinished) Finishes each call and then finishes itself
Jozef Goetz, 2015
22
int fact ( int number ) // Recursive Solution// Pre: number is assigned and number >= 0.{ if ( number == 0) //(1) base case return 1 ; //(2) else
// general case return number * fact ( number - 1 ) ; //(3)
//includes the simpler problem
} //(4)
Each method call remains open
Think of a recursive function as having infinitely many copies of itself
Every call to a recursive function has
Its own code
Its own set of parameters and local variables
After completing a particular recursive call
Control goes back to the calling environment, which is the previous call
2002 Prentice Hall.All rights reserved.
Outline23
FactorialTest.cs
1 // Fig. 7.14: FactorialTest.cs2 // Recursive Factorial method.3 4 using System;5 using System.Drawing;6 using System.Collections;7 using System.ComponentModel;8 using System.Windows.Forms;9 using System.Data;10 11 public class FactorialTest : System.Windows.Forms.Form12 {13 private System.ComponentModel.Container components = null;14 15 private System.Windows.Forms.Label outputLabel;16 17 public FactorialTest()18 {19 InitializeComponent();20 21 for ( long i = 0; i <= 10; i++ )22 outputLabel.Text += i + "! = " + 23 Factorial( i ) + "\n";24 }25
2002 Prentice Hall.All rights reserved.
Outline24
FactorialTest.cs
Program Output
26 // Visual Studio .NET-generated code27 28 public long Factorial( long number )29 {30 if ( number <= 1 ) // base case31 return 1;32 33 else34 return number * Factorial( number - 1 );35 }36 37 [STAThread]38 static void Main() 39 {40 Application.Run( new FactorialTest());41 }42 43 } // end of class FactorialTest
The Factorial method calls itself (recursion)
The recursion ends when the value is less than or equal to 1
Jozef Goetz, 2015
25Iterative Solution
int Factorial ( int number )
// Pre: number is assigned and number >= 0.
{
int fact = 1;
for (int i = 2; i <= number; i++)
fact = fact * i;
return fact ;
}
Jozef Goetz, 2015
26Example Using Recursion: The Fibonacci Sequence
Fibonacci series Each number in the series is sum of two previous numbers
e.g., 0, 1, 1, 2, 3, 5, 8, 13, 21…
Recursive formulafibonacci(0) = 0fibonacci(1) = 1fibonacci(n) = fibonacci(n - 1) + fibonacci( n – 2 )
Each invocation of the method that does not match one of the base cases results in two additional recursive calls to the method
fibonacci(0) and fibonacci(1) are base cases Golden ratio
The ratio of successive fibonacci numbers converges on a constant value near 1.618
Performance Fibonacci-style recursive methods exponentially generate method calls (result in an
exponential “explosion” of calls) – avoid recursive style for some problems Hinders performance
– Fib(30) has over 2.7 million method calls
– Fib(31) has over 4 million method calls
– Fib(32) has over 7 million method calls
Jozef Goetz, 2015
27Example Using Recursion: The Fibonacci Sequence
Fig. Set of recursive calls to method Fibonacci (abbreviated as F).
return 1 return 0
F( 1 ) F( 0 ) return 1
F( 3 )
F( 2 ) F( 1 )+return
return +
2002 Prentice Hall.All rights reserved.
Outline28
FibonacciTest.cs
1 // Fig. 6.16 ed1: FibonacciTest.cs2 // Recursive fibonacci method.3 4 using System;5 using System.Drawing;6 using System.Collections;7 using System.ComponentModel;8 using System.Windows.Forms;9 using System.Data;10 11 public class FibonacciTest : System.Windows.Forms.Form12 {13 private System.ComponentModel.Container components = null;14 15 private System.Windows.Forms.Button calculateButton;16 17 private System.Windows.Forms.TextBox inputTextBox;18 19 private System.Windows.Forms.Label displayLabel;20 private System.Windows.Forms.Label promptLabel;21 22 public FibonacciTest()23 {24 InitializeComponent();25 }26 27 // Visual Studio .NET-generated code28
2002 Prentice Hall.All rights reserved.
Outline29
FibonacciTest.cs
29 // call Fibonacci and display results30 protected void calculateButton_Click(31 object sender, System.EventArgs e )32 {33 string numberString = ( inputTextBox.Text );34 int number = System.Convert.ToInt32( numberString ); 35 int fibonacciNumber = Fibonacci( number );36 displayLabel.Text = "Fibonacci Value is " + fibonacciNumber;37 }38 39 // calculates Fibonacci number40 public int Fibonacci( int number )41 {42 if ( number == 0 || number == 1 )43 return number;44 else45 return Fibonacci( number - 1 ) + Fibonacci( number - 2 );46 }47 48 [STAThread]49 static void Main() 50 {51 Application.Run( new FibonacciTest() );52 }53 54 } // end of class FibonacciTest
The number uses the Fibonacci method to get its result
Calls itself twice, to get the result of the the two previous numbers
The recursion ends when the number is 0 or 1
2002 Prentice Hall.All rights reserved.
Outline30
FibonacciTest.cs Program Output
Exercise: Expand by displaying all generated numbers.
Exercise: Each number in the series is sum of the last one and the third from the last one.
e.g., 0, 1, 1, 1, 2, 3, 4, 6, 9, 13,…
First draw the sequence diagram for F(4).
Jozef Goetz, 2015
317.15 Recursion vs. Iteration
Iteration1. Uses repetition structures (for, while or do/while)2. Repetition through explicitly use of repetition structure3. Terminates when loop-continuation condition fails4. Controls repetition by using a counter5. No extra calls so it doesn’t consume additional memory
Recursion1. Uses selection structures (if, if/else or switch)2. Repetition through repeated method calls3. Terminates when base case is satisfied4. Controls repetition by dividing problem into simpler one5. Recursive calls take time and consume additional
memory
Both can have infinite loops
Jozef Goetz, 2015
32Recursion vs. Iteration (cont.)
Recursion
negatives: More overhead than iteration (time expensive) More memory intensive than iteration (the overhead of repeated method
calls) – memory space expensive Difficult to test and debug
positives: Recursion more naturally mirrors some problems Often can be implemented with only a few lines of code Can also be solved iteratively but may take large amount of code
Balance Choice between performance (iteration) and good software
engineering (recursion) Recursion usually more natural for some problems Modularizing programs in a neat, Hierarchical manner promotes good software engineering but it has a prize.
Jozef Goetz, 2015
337.16 Passing Arguments: Call-By-Value vs. Call-By-Reference
Passing by value Send a method a copy of the object
Changes to the called method’s copy don’t effect the original variable’s value When returned are always returned by value Set by value by default for value-type variables
Passing by reference Send a method the actual reference point (to the original object in
memory) Causes the variable to be changed throughout the program
When returned are always returned by reference No overhead of copying large data Weaken security, b/c the called function can corrupt the caller’s data
Note: The references themselves passed by value
The ref keyword specifies by reference The out keyword means a called method will initialize the reference variable
2002 Prentice Hall.All rights reserved.
Outline34
RefOutTest.cs
1 // Fig. 6.8 ed1 or 7.18 ed3 7.15 ed4 and ed5: RefOutTest.cs2 // Demonstrating ref and out parameters.3 // 3 methods to calculate the square of an integer 4 using System;5 using System.Windows.Forms;6 7 class RefOutTest8 {9 // x is passed as a ref int (original value will change)10 static void SquareRef( ref int x )11 {12 x = x * x;13 }14 15 // original value can be changed and initialized16 static void SquareOut( out int x )17 {18 x = 6;19 x = x * x;20 }21 22 // x is passed by value (original value not changed)23 static void Square( int x )24 {25 x = x * x;26 }27 28 static void Main( string[] args )29 {30 // create a new integer value, set it to 531 int y = 5;32 int z; // declare z, but do not initialize it33
When passing a value by reference the value will be altered in the rest of the program as well
Since x is passed as out the variable can then be initiated in the method
Since not specified, this value is defaulted to being passed by value. The value of x will not be changed elsewhere in the program because a duplicate of the variable is created.
Since the methods are void they do not need a return value.
2002 Prentice Hall.All rights reserved.
Outline35
RefOutTest.cs
34 // display original values of y and z35 string output1 = "The value of y begins as " 36 + y + ", z begins uninitialized.\n\n\n";37 38 // values of y and z are passed by reference39 RefOutTest.SquareRef( ref y ); // must use ref40 RefOutTest.SquareOut( out z ); // must use out41 42 // display values of y and z after modified by methods43 // SquareRef and SquareOut44 string output2 = "After calling SquareRef with y as an " +45 "argument and SquareOut with z as an argument,\n" +46 "the values of y and z are:\n\n" + 47 "y: " + y + "\nz: " + z + "\n\n\n";48 49 // values of y and z are passed by value50 RefOutTest.Square( y );51 RefOutTest.Square( z );52 53 // values of y and z will be same as before because Square54 // did not modify variables directly55 string output3 = "After calling Square on both x and y, " +56 "the values of y and z are:\n\n" +57 "y: " + y + "\nz: " + z + "\n\n";58 59 MessageBox.Show( output1 + output2 + output3, 60 "Using ref and out Parameters", MessageBoxButtons.OK,61 MessageBoxIcon.Information );62 63 } // end method Main64 65 } // end class RefOutTest
The calling of the SquareRef and SquareOut methods
The calling of the Square method by passing the variables by value
Jozef Goetz, 2015
Find Maximum (and Minimum) 36
Jozef Goetz, 2015
Extra: Find Maximum and Minimum 37
Jozef Goetz, 2015
Class to find MAX 38
Jozef Goetz, 2015
Driver to test CalculateMax()39