jozef goetz, 2011 1 2011 pearson education, inc. all rights reserved. 2002 prentice hall. all...
TRANSCRIPT
Jozef Goetz, 2011
1
2011 Pearson Education, Inc. All rights reserved.
2002 Prentice Hall. All rights reserved.
Jozef Goetz, 2011
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, 2011
3
E pluribus unum.(One composed of many.) Virgil
Form ever follows function. Louis Henri Sullivan
O! call back yesterday, bid time return. William Shakespeare
Call me Ishmael. Herman Melville
Jozef Goetz, 2011
4
Answer me in one word. William Shakespeare
When you call me that, smile! Owen Wister
There is a point at which methods devour themselves. Frantz Fanon
Life can only be understood backwards; but it must be lived forwards. Soren Kierkegaard
Jozef Goetz, 2011
5Chapter 7: Methods Objectives To construct programs modularly from small pieces called
methods. To introduce the common math methods available in the Framework
Class Library. To be able to create new methods. To understand the mechanisms for passing information between
methods. To introduce simulation techniques that use random number
generation. How to use random-number generation to implement game-playing
applications To understand how the visibility of identifiers is limited to specific
regions of programs. To understand how to write and use methods that call themselves –
recursive methods The differences between passing method arguments by value
and by reference
Jozef Goetz, 2011
67.1 Introduction
To develop and maintain a large program Divide and conquer technique
= Construct a program from small pieces (modules)
Modules in C# are called methods and classes
– Each piece more manageable than original program
– Facilitate design, implementation, operation and maintenance of large programs
Jozef Goetz, 2011
77.2 Program Modules in C# Modules in C#
Methods and classes allow you to modularize an application by separating its tasks into reusable units.
Programs written by combining new methods and classes with "prepackaged" ones Available in the .NET Framework Class Library (FCL) =>
msdn.microsoft.com/en-us/library/ms229335.aspx
When possible, reuse FCL classes and methods. FCL provides several modules
Rich collection of classes and methods Mathematical calculations, input/output files, string manipulations..
When possible, reuse Framework Class Library classes and methods.
Programmers can also create modules e.g., programmer-defined methods
Methods Invoked by a method call Returns a result to calling method (caller) - hiding of implementation details Similar to a boss (caller) asking a worker (called method) to complete a task
Jozef Goetz, 2011
8
Dividing an application into meaningful methods makes the application easier to debug and maintain
Software Engineering Observation 7.2•To promote software reusability, every method should be limited to performing a single, well-defined task, and the name of the method should express that task effectively.
Error-Prevention Tip 7.1A small method that performs one task is easier to test and debug than a larger method that performs many tasks.
Software Engineering Observation 7.3If your method might be attempting to perform too many diverse tasks. It is usually best to break such a method into several smaller methods.
7.2 Packaging Code in C# (Cont.)
Jozef Goetz, 2011
Fig. 7.1 Hierarchical boss-method/worker-method relationship.
Note: The boss method – main doesn’t know how worker 1, worker 2 and worker 4 performs its designated work – hiding of implementation details.
worker 1 acts as a “boss method” to worker 4 and worker 5.
main
worker1 worker2 worker3
worker4 worker5
Dividing an application into meaningful methods makes the application easier to debug and maintain
Jozef Goetz, 2011
10
The code that calls a method is known as the client code. An analogy to the method-call-and-return structure is the
hierarchical form of management (Figure 7.1). The boss method does not know how the worker method performs
its designated tasks. The worker may also call other worker methods.
This “hiding” of implementation details promotes good software engineering.
Fig. 7.1 | Hierarchical boss-method/worker-method relationship. (Part 1 of 2.)
7.2 Packaging Code in C# (Cont.)
Jozef Goetz, 2011
117.3 Math Class Methods Static methods are available when no object of the class have been
created To declare a method as static, place the keyword static before the
return type in the method’s declaration. The Math class – located in namespace System
Allows the user to perform common math calculations Using methods
ClassName.MethodName( argument1, arument2, … ) List of methods are in Fig. 7.2
Console.WriteLine( Math.Sqrt( 900.0 ) ); Math.sqrt takes an argument of type double returns the square root of its
argument– Statement would print 30.0
All Math methods return data type double– Must be invoked using Math and dot operator (.)
Jozef Goetz, 2011
127.3 Math Class MethodsMethod Description Example Abs( x ) absolute value of x Abs( 23.7 ) is 23.7
Abs( 0 ) is 0 Abs( -23.7 ) is 23.7
Ceiling( x ) rounds x to the smallest integer not less than x
Ceiling( 9.2 ) is 10.0 Ceiling( -9.8 ) is -9.0
Cos( x ) trigonometric cosine of x (x in radians)
Cos( 0.0 ) is 1.0
Exp( x ) exponential method ex Exp( 1.0 ) is approximately 2.7182818284590451 Exp( 2.0 ) is approximately 7.3890560989306504
Floor( x ) rounds x to the largest integer not greater than x
Floor( 9.2 ) is 9.0 Floor( -9.8 ) is -10.0
Log( x ) natural logarithm of x (base e) Log( 2.7182818284590451 ) is approximately 1.0 Log( 7.3890560989306504 ) is approximately 2.0
Max( x, y ) larger value of x and y (also has versions for float, int and long values)
Max( 2.3, 12.7 ) is 12.7 Max( -2.3, -12.7 ) is -2.3
Min( x, y ) smaller value of x and y (also has versions for float, int and long values)
Min( 2.3, 12.7 ) is 2.3 Min( -2.3, -12.7 ) is -12.7
Pow( x, y ) x raised to power y (xy) Pow( 2.0, 7.0 ) is 128.0 Pow( 9.0, .5 ) is 3.0
Sin( x ) trigonometric sine of x (x in radians)
Sin( 0.0 ) is 0.0
Sqrt( x ) square root of x Sqrt( 900.0 ) is 30.0 Sqrt( 9.0 ) is 3.0
Tan( x ) trigonometric tangent of x (x in radians)
Tan( 0.0 ) is 0.0
Fig. 7.2 Commonly used Math class methods.
Math defines 2 Constants which are static but you don’t need to specify “static”:
Math.PI = 3.1415927535…Math.E = 2.7182818285…
Method arguments may be constants, variables or expressions.
Jozef Goetz, 2011
13
When objects of a class containing static variables are created, all the objects of that class share one copy of the class’s static variables.
Together the static variables and
instance variables
represent the fields of a class.
7.3 static Methods, static Variables and Class Math (Cont.)
Jozef Goetz, 2011
14
Why Is Method Main Declared static? The Main method is sometimes called the application’s entry
point.
Declaring Main as static allows the execution environment to invoke Main without creating an instance of the class.
When you execute your application from the command line, you type the application name, followed by command-line arguments that specify a list of strings separated by spaces.
The execution environment will pass these arguments to the Main method of your application.
7.3 static Methods, static Variables and Class Math (Cont.)
Jozef Goetz, 2011
15
Additional Comments about Method Main Applications that do not take command-line arguments
may omit the string[] args parameter.
The public keyword may be omitted.
You can declare Main with return type int (instead of void) to enable Main to return an error code with the return statement.
You can declare only one Main method in each class.
7.3 static Methods, static Variables and Class Math (Cont.)
Jozef Goetz, 2011
16
You can place a Main method in every class you declare.
However, you need to indicate the application’s entry point.
Do this by clicking the menu Project > [ProjectName] Properties... and selecting the class containing the Main method that should be the entry point from the Startup object list box.
7.3 static Methods, static Variables and Class Math (Cont.)
Jozef Goetz, 2011
17
C# doesn’t allow a static method to access non-static members of the same class directly.
A static method can call only other static methods of the same class directly and can manipulate only static variables in the same class directly.
7.4 Declaring and Using Methods
Jozef Goetz, 2011
187.4 Methods Modularize a program by packing code as a
method Variables declared inside methods are local
variables Known only in method defined
Parameters Communicate information between methods Are local variables
Benefits (motivation for modularizing a program with methods)
Divide and conquer makes Manageable program development
Software reusability Existing standardized methods are building blocks for new programs Abstraction - hide internal details (library methods)
Avoids code repetition – methods can be called from several locations
Jozef Goetz, 2011
19Method Definitions Method definition format:
return-value-type method-name( parameter-list )//method header { declarations and statements // method body
– Redeclaring a method parameter as a local variable in the method’s body is a compilation error.
}
Method-name: any valid identifier
Return-value-type: data type of the result Can return at most one value Omitting the return type in a method declaration is a syntax error.
void - method returns nothing
Parameter-list: comma separated list, declares parameters
Jozef Goetz, 2011
20Common Programming Error 7.8
Forgetting to return a value from a method that should return a value is a compilation error.
If a return type other than void is specified, the method must contain a return statement that returns a value consistent with the method’s return type.
Returning a value from a method whose return type has been declared void is a compilation error.
Jozef Goetz, 2011
21Method Definitions
For each parameter in the method definition: there must be parameter list compatible with the
ton type order and number,
of the corresponding argument in the method call
Jozef Goetz, 2011
22 Method Definitions
Writing a custom method Body
Contains the code of what the method does Contains the return value if necessary
All methods must be defined inside of a class Method cannot be defined inside another method
3 way to return control: program flow reaches 1. } - Reaching the function-ending right brace 2. return ; 3. return expression; // returns the resulting value to the caller
Each method should be limited to performing a single, well defined task, no longer that one page The name of the method (self-explanatory) should express that
task effectively.
Jozef Goetz, 2011
23Software Engineering Observation 7.4
A method that has many parameters may be performing too many tasks.
Consider dividing the method into smaller methods that perform the separate tasks.
As a guideline, try to fit the method header on one line if possible.
Jozef Goetz, 2011
24 Method Definitions
Until now, our programs have used methods of class Console to obtain: User input from the command line Output either to the command prompt or in messageBox Minuses: the command prompt can obtain only 1 value (or
series of the same data type) at a time from the user, and a msg dialog can display only 1 msg
GUI application can read multiple inputs simultaneously and display/output many pieces of data at once – see next program
2002 Prentice Hall.All rights reserved.
Outline25
Subtract.cs
1 // Fig. 6.3 ed1: SquareInt.cs - The windows application 2 // A programmer-defined Square method.3 // calculates of the integers from 1 to 10 4 using System; // includes basic data types5 using System.Drawing; // for graphics capabilities6 using System.Collections; // for complex data structures7 using System.ComponentModel; // controls component behavior8 using System.Windows.Forms; // for GUI development9 using System.Data; // for reading outside data10 11 // form used to display results of squaring 10 numbers12 public class SquareIntegers : System.Windows.Forms.Form13 {14 private System.ComponentModel.Container components = null;15
16 // label containing results17 private System.Windows.Forms.Label outputLabel;18 19 public SquareIntegers()20 {21 // Required for Windows Form Designer support22 InitializeComponent(); // to create objects23 24 int result; // store result of call to method Square25
Start of class SquareInteger. It implements System.Windows.Forms.Form
Start of the SquareIntegers method
This is the method’s variables. They can only be used within the method.
2002 Prentice Hall.All rights reserved.
Outline26
Subtract.cs
26 // loop 10 times27 for ( int counter = 1; counter <= 10; counter++ )28 {29 // calculate square of counter and store in result30 result = Square( counter );31 32 // append result to output string33 outputLabel.Text += "The square of " + counter + 34 " is " + result + "\n";35 }36 37 } // end SquareIntegers38 39 // Clean up any resources being used.40 protected override void Dispose( bool disposing )41 {42 // Visual Studio .NET-generated code for method Dispose43 }44 45 // Required method for Designer support46 private void InitializeComponent()47 {48 // Visual Studio .NET generated code49 // for method InitializeComponent50 }51
The main body of the SquareIntegers method
A call to the Square method. The counter variable is passed to it for use. The return value is stored in result
2002 Prentice Hall.All rights reserved.
Outline27
Subtract.cs
Program Output
52 // The main entry point for the application.53 [STAThread]54 static void Main() // no arguments55 {56 Application.Run( new SquareIntegers() );57 }58 59 // Square method definition60 int Square( int y )61 {62 return y * y; // return square of y63 64 } // end method Square65 66 } // end of class SquareIntegers
The Square method. Receives one integer and returns an integer
The method returns the passed variable multiplied by itself
Jozef Goetz, 2011
28Method Definitions (cont.)
When method call encountered Control is transferred from point of invocation to method
Returning control If nothing returned: return;
– Or until reaches right brace
If value returned: return expression;– Returns the value of expression
Example user-defined method:public int Square( int y )
{return y * y}
Jozef Goetz, 2011
29
1 // Fig. 7.3: MaximumFinder.cs Console application.
2 // User-defined method Maximum. Ch. 7.4 Declaring Methods with Multiple Parameters
3 using System;
4
5 public class MaximumFinder
6 {
7 // obtain three floating-point values and determine maximum value
8 public void DetermineMaximum()
9 {
10 // prompt for and input three floating-point values
11 Console.WriteLine( "Enter three floating-point values,\n"
12 + " pressing 'Enter' after each one: " );
13 double number1 = Convert.ToDouble( Console.ReadLine() );
14 double number2 = Convert.ToDouble( Console.ReadLine() );
15 double number3 = Convert.ToDouble( Console.ReadLine() );
16
17 // determine the maximum value
18 double result = Maximum( number1, number2, number3 );
19
20 // display maximum value
21 Console.WriteLine( "Maximum is: " + result );
22 } // end method DetermineMaximum
Outline
MaximumFinder.cs
23
24 // returns the maximum of its three double parameters
25 public double Maximum( double x, double y, double z )
26 {
27 double maximumValue = x; // assume x is the largest to start
28
29 // determine whether y is greater than maximumValue
30 if ( y > maximumValue )
31 maximumValue = y;
32
33 // determine whether z is greater than maximumValue
34 if ( z > maximumValue )
35 maximumValue = z;
36
37 return maximumValue;
38 } // end method Maximum
39 } // end class MaximumFinder
Enter three floating-point values, pressing 'Enter' after each one: 3.332.221.11Maximum is: 3.33
Jozef Goetz, 2011
30 1 // Fig. 7.4: MaximumFinderTest.cs
2 // Application to test class MaximumFinder.
3 public class MaximumFinderTest
4 {
5 // application starting point
6 public static void Main( string[] args )
7 {
8 MaximumFinder maximumFinder = new MaximumFinder();
9 maximumFinder.DetermineMaximum();
10 } // end Main
11 } // end class MaximumFinderTest Enter three floating-point values, pressing 'Enter' after each one: 3.33 2.22 1.11 Maximum is: 3.33 Enter three floating-point values, pressing 'Enter' after each one: 2.22 3.33 1.11 Maximum is: 3.33 Enter three floating-point values, pressing 'Enter' after each one: 1.11 2.22 867.5309 Maximum is: 867.5309
Outline
MaximumFinderTest.cs
2002 Prentice Hall.All rights reserved.
Outline31
MaximumValue.cs
1 // Fig. 7.3 ed1: MaximumValue.cs2 // Finding the maximum of three doubles using the FCL library4 using System; // in a single class5 6 class MaximumValue7 {8 // main entry point for application9 static void Main( string[] args )10 {11 // obtain user input and convert to double12 Console.Write( "Enter first floating-point value: " );13 double number1 = Double.Parse( Console.ReadLine() );14 // or use Convert.ToDouble ( Console.ReadLine() );15 Console.Write( "Enter second floating-point value: " );16 double number2 = Double.Parse( Console.ReadLine() );17 18 Console.Write( "Enter third floating-point value: " );19 double number3 = Double.Parse( Console.ReadLine() );20 21 // call method Maximum to determine largest value22 double max = Maximum( number1, number2, number3 );23 24 // display maximum value25 Console.WriteLine("\nmaximum is: " + max );26 27 } // end method Main
The program gets three values from the user
The three values are then passed to the Maximum method for use
Enter first floating-point value: 37.3Enter second floating-point value: 99.32Enter third floating-point value: 27.1928 maximum is: 99.32
2002 Prentice Hall.All rights reserved.
Outline32
MaximumValue.cs
Program Output
28 29 // Maximum method uses method Math.Max to help determine30 // the maximum value31 static double Maximum( double x, double y, double z )32 {33 return Math.Max( x, Math.Max( y, z ) );34 35 } // end method Maximum36 37 } // end class MaximumValue
Enter first floating-point value: 37.3Enter second floating-point value: 99.32Enter third floating-point value: 27.1928 maximum is: 99.32
The Maximum method receives 3 variables and returns the largest one
The use of Math.Max uses the Max method in class Math. The dot operator is used to call it.
Exc: Convert the console app. into the window application.
Jozef Goetz, 2011
33Common Programming Error 7.1
Declaring method parameters of the same type as
float x, y instead of float x, float y
is a syntax error —a type is required for each parameter in the parameter list.
Jozef Goetz, 2011
347.7 Argument Promotion Implicit Conversion or Coercion of arguments
Object is converted to a needed type implicitly Only done if complier knows no data will be lost Forcing arguments to appropriate type to pass to method
e.g., Console.WriteLine( Math.Sqrt( 4 ) );
– Evaluates Math.Sqrt( 4 ) and displays 2
– So it converts 4 to the double (which is required for the Sqrt arguments) value 4.0 before passing the value to Math.Sqrt without changing the value
C# does not allow narrowing without explicit cast operation
Explicit Conversion Object is manually converted Required if there could be a loss of data Widening conversion
Make an object that of a derived class more complex without losing data Narrowing conversion
Make an object that of a base class and cause some data loss– If y = 4.5 the method call – square( (int) y ) – explicitly casts (converts) the value of y to an integer, so it returns 16, not 20.25
Jozef Goetz, 2011
357.7 Argument Promotion
Promotion rules Specify how to convert types without data loss
Apply to
a mixed-type expression
primitive data-type values passed as arguments to methods
The type of each value in a mixed-type expression is
promoted to the “highest” type in the expression (actually, the expression uses a temporary copy of each value; the original values remain unchanged)
Jozef Goetz, 2011
367.7 Argument Promotion p.238, 935
Type size [byte] Can be Converted to Type(s) decimal 16 No possible implicit conversion to other simple types
double 8 No possible implicit conversion to other simple types
float 4 double
long 8 decimal, double, float
ulong 8 decimal, double, float
int 4 decimal, double, float, long
uint 4 decimal, double, float, long, ulong
short 2 decimal, double, float, int, long
ushort 2 decimal, double, float, int, uint, long, ulong
Bool 1 No possible implicit conversion to other simple types
Byte 1 decimal, double, float, int, uint, long, ulong, short or ushort
sbyte 1 decimal, double, float, int, long or short
char 1 decimal, double, float, int, uint, long, ulong, or ushort
Fig. 7.4 Allowed implicit conversions.
Jozef Goetz, 2011
37Value Types and Reference Types
Value types – they are portable across platform Contains data of the specified type: The buil-in values types: int, bool see previous slides
integral types: sbyte, byte, short, int, long etc. floating types: float and double decimal bool
Programmer created structs enumerations (Chapter 7)
Reference types Refererence to objects
Contain an address to a spot in memory where the data is Build-in reference types: string and object Programmer created
Classes (Chapter 10) Interfaces (Chapter 12) Delegates (Chapter 12)
All values are 32bit allowing cross-platform use
Jozef Goetz, 2011
387.8 C# Namespaces vs FCL
Namespace (used packages in Java) A group of classes and their methods
FCL (Framework Class Library) is composed of namespaces
Namespaces are stored in .dll files called assemblies Must add a reference to the appropriate assembly
– assembly reference namespace System are added automatically
A list of the FLC namespaces are in Fig. 7.5
Familiarize yourself with the classes and methods provided by the FCL msdn2.microsoft.com/en-us/library/ms229335.
.NET Framework, class library for info on all namespaces
Included in a program with the using keyword (import in Java)
Jozef Goetz, 2011
397.8 C# Namespaces
Jozef Goetz, 2011
407.8 C# Namespaces
Jozef Goetz, 2011
417.8 C# Namespaces
Jozef Goetz, 2011
42
.NET Framework Namespaces & Classes
Jozef Goetz, 2011
43
.NET Framework
Jozef Goetz, 2011
447.9 Random Number Generation
Class Random Within namespace System Truly random
The numbers are generated using an equations with a seed
– The seed is usually the exact time of day
randomObject.Next() Returns a number from 0 to Int32.MaxValue
– Int32.MaxValue = 2,147,483,647
randomObject.Next( x ) Returns a value from 0 up to but not including x
randomObject.Next( x, y ) Returns a number between x and up to but not including y
2002 Prentice Hall.All rights reserved.
Outline45
RandomInt.cs
1 // Fig. 7.6 ed4: RandomInt.cs2 // Random integers.3 4 using System;5 using System.Windows.Forms;6 7 // calculates and displays 20 random integers8 class RandomInt9 {10 // main entry point for application11 static void Main( string[] args )12 {13 int value;14 string output = "";15 16 Random randomInteger = new Random(); // located in System17 18 // loop 20 times19 for ( int i = 1; i <= 20; i++ ) 20 {21 // pick random integer between 1 and 622 value = randomInteger.Next( 1, 7 );23 output += value + " "; // append value to output24 25 // if counter divisible by 5, append newline26 if ( i % 5 == 0 )27 output += "\n";28 29 } // end for structure30
Creates a new Random object
Will set value to a random number from1 up to but not including 7
Format the output to only have 5 numbers per line
2002 Prentice Hall.All rights reserved.
Outline46
RandomInt.cs
Program Output
31 MessageBox.Show( output, "20 Random Numbers from 1 to 6",32 MessageBoxButtons.OK, MessageBoxIcon.Information );33 34 } // end Main35 36 } // end class RandomInt
Display the output in a message box
2002 Prentice Hall.All rights reserved.
Outline47
RollDie.cs
1 // Fig. 6.10ed1 or 7.7ed3: RollDie.cs //show it2 // Rolling 4 dice at a time and displays an image of 3 // each die in the window.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 using System.IO; // enables reading data from files11 12 // form simulates the rolling of 12 dice,13 // and displays them14 public class RollDie : System.Windows.Forms.Form15 {16 private System.ComponentModel.Container components = null;17 18 private System.Windows.Forms.Button rollButton;19 20 private System.Windows.Forms.Label dieLabel2;21 private System.Windows.Forms.Label dieLabel1;22 private System.Windows.Forms.Label dieLabel3;23 private System.Windows.Forms.Label dieLabel4;24 25 private Random randomNumber = new Random();26 27 public RollDie()28 {29 InitializeComponent();30 }31 32 // Visual Studio .NET-generated code33
2002 Prentice Hall.All rights reserved.
Outline48
RollDie.cs
34 // method called when rollButton clicked,35 // passes labels to another method36 protected void rollButton_Click( 37 object sender, System.EventArgs e )38 {39 // pass the labels to a method that will40 // randomly assign a face to each die41 DisplayDie( dieLabel1 );42 DisplayDie( dieLabel2 );43 DisplayDie( dieLabel3 );44 DisplayDie( dieLabel4 );45 46 } // end rollButton_Click47 48 // determines image to be displayed by current die49 public void DisplayDie( Label dieLabel )50 {51 int face = 1 + randomNumber.Next( 6 );52 53 // displays image specified by filename54 dieLabel.Image = Image.FromFile( 55 Directory.GetCurrentDirectory() + 56 "\\images\\die" + face +".gif" );57 }58 59 // main entry point for application60 [STAThread]61 static void Main() 62 {63 Application.Run( new RollDie() );64 }65 66 } // end class RollDie
Pass the labels to be assigned data
Will return a random integer from 1 up to 6
2002 Prentice Hall.All rights reserved.
Outline49
RollDie.cs Program Output
Jozef Goetz, 2011
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
Jozef Goetz, 2011
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
Jozef Goetz, 2011
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
2002 Prentice Hall.All rights reserved.
Outline53
RollDie2.cs
1 // Fig. 6.11 ed1 : RollDie2.cs2 // Rolling 12 dice with frequency chart.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 using System.IO;11 12 // displays the different dice and frequency information13 public class RollDie2 : System.Windows.Forms.Form14 {15 private System.ComponentModel.Container components = null;16 17 private System.Windows.Forms.Button rollButton;18 19 private System.Windows.Forms.RichTextBox displayTextBox;20 21 private System.Windows.Forms.Label dieLabel1;22 private System.Windows.Forms.Label dieLabel2;23 private System.Windows.Forms.Label dieLabel3;24 private System.Windows.Forms.Label dieLabel4;25 private System.Windows.Forms.Label dieLabel5;26 private System.Windows.Forms.Label dieLabel6;27 private System.Windows.Forms.Label dieLabel7;28 private System.Windows.Forms.Label dieLabel8;29 private System.Windows.Forms.Label dieLabel9;30 private System.Windows.Forms.Label dieLabel10;31 private System.Windows.Forms.Label dieLabel11;32 private System.Windows.Forms.Label dieLabel12;33 34 private Random randomNumber = new Random();
2002 Prentice Hall.All rights reserved.
Outline54
RollDie2.cs
35 36 private int ones, twos, threes, fours, fives, sixes;37 38 public RollDie2()39 {40 InitializeComponent();41 ones = twos = threes = fours = fives = sixes = 0; 42 }43 44 // Visual Studio .NET-generated code45 46 // simulates roll by calling DisplayDie for47 // each label and displaying the results48 protected void rollButton_Click( 49 object sender, System.EventArgs e )50 {51 // pass 12 labels to a method that will52 // randomly assign a face to each die53 DisplayDie( dieLabel1 );54 DisplayDie( dieLabel2 );55 DisplayDie( dieLabel3 );56 DisplayDie( dieLabel4 );57 DisplayDie( dieLabel5 );58 DisplayDie( dieLabel6 );59 DisplayDie( dieLabel7 );60 DisplayDie( dieLabel8 );61 DisplayDie( dieLabel9 );62 DisplayDie( dieLabel10 );63 DisplayDie( dieLabel11 );64 DisplayDie( dieLabel12 );65 66 double total = ones + twos + threes + fours + fives + sixes; 67
Sets all of the variables to 0
Pass the label to be assigned a random number
2002 Prentice Hall.All rights reserved.
Outline55
RollDie2.cs
68 // display the current frequency values69 displayTextBox.Text = "Face\t\tFrequency\tPercent\n1\t\t" + 70 ones + "\t\t" +71 String.Format( "{0:F2}", ones / total * 100 ) +72 "%\n2\t\t" + twos + "\t\t" + 73 String.Format( "{0:F2}", twos / total * 100 ) + 74 "%\n3\t\t" + threes + "\t\t" + 75 String.Format( "{0:F2}", threes / total * 100 ) + 76 "%\n4\t\t" + fours + "\t\t" + 77 String.Format( "{0:F2}", fours / total * 100 ) +78 "%\n5\t\t" + fives + "\t\t" + 79 String.Format( "{0:F2}", fives / total * 100 ) +80 "%\n6\t\t" + sixes + "\t\t" + 81 String.Format( "{0:F2}", sixes / total * 100 ) + "%";82 83 } // end rollButton_Click84 85 // display the current die, and modify frequency values86 public void DisplayDie( Label dieLabel )87 {88 int face = 1 + randomNumber.Next( 6 );89 90 dieLabel.Image = Image.FromFile( 91 Directory.GetCurrentDirectory() + 92 "\\images\\die" + face + ".gif" );93
Assign a random face to the label based on the number generated
Displays to the user the amount of times each dice number has shown up
2002 Prentice Hall.All rights reserved.
Outline56
RollDie2.cs
94 // add one to frequency of current face95 switch ( face )96 {97 case 1: ones++;98 break;99 100 case 2: twos++;101 break;102 103 case 3: threes++;104 break;105 106 case 4: fours++;107 break;108 109 case 5: fives++;110 break;111 112 case 6: sixes++;113 break;114 115 } // end switch116 117 } // end DisplayDie118 119 // The main entry point for the application.120 [STAThread]121 static void Main() 122 {123 Application.Run( new RollDie2() );124 } 125 126 } // end of class RollDie2
A switch statement is used to keep track of number of each die rolled
2002 Prentice Hall.All rights reserved.
Outline57
RollDie2.cs Program Output
Jozef Goetz, 2011
587.10 Example: Game of Chance
Craps simulation - the most popular games of chance A player has 2 dice. Each dice has six faces. The player must roll two dice on the first and all subsequent rolls
1. Roll dice first time If sum equals 7 or 11, the player wins on the first throw (called “craps”) If sum equals 2, 3 or 12, the player loses Any other sum (4, 5, 6, 8, 9, 10) is that player’s point
2. Keep rolling dice until… Sum matches player’s point
– Player wins Sum equals 7
– Player loses GUI controls
A GroupBox Holds other controls Manages/organizes them
A PictureBox Used to display a picture on the form
2002 Prentice Hall.All rights reserved.
Outline59
CrapsGame.cs
1 // Fig. 6.12 ed1: CrapsGame.cs2 // Craps Game3 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 using System.IO;11 12 public class CrapsGame : System.Windows.Forms.Form13 {14 private System.ComponentModel.Container components = null;15 25 private System.Windows.Forms.PictureBox imgPointDie1; //upper one16 private System.Windows.Forms.PictureBox imgPointDie2; //upper one17 private System.Windows.Forms.PictureBox imgDie2; //lower one18 private System.Windows.Forms.PictureBox imgDie1; //lower one19 20 private System.Windows.Forms.Label lblStatus;21 22 private System.Windows.Forms.Button rollButton;23 private System.Windows.Forms.Button playButton;24 26 27 private System.Windows.Forms.GroupBox fraPoint;28 29 // declare other variables30 int myPoint;31 int myDie1;32 int myDie2;33
imgDie1
imgPointDie1
2002 Prentice Hall.All rights reserved.
Outline60
CrapsGame.cs
34 public enum DiceNames35 {36 SNAKE_EYES = 2,37 TREY = 3,38 CRAPS = 7,39 YO_LEVEN = 11,40 BOX_CARS = 12,41 }42 43 public CrapsGame()44 {45 InitializeComponent();46 }47 48 // Visual Studio .NET-generated code49 50 // simulate next roll and result of that roll51 protected void rollButton_Click( 52 object sender, System.EventArgs e )53 {54 int sum;55 sum = rollDice(); //at least executed56 57 if ( sum == myPoint ) // Sum matches player’s point58 {59 lblStatus.Text = "You Win!!!";60 rollButton.Enabled = false;61 playButton.Enabled = true;62 }
Creates an enumeration of the constant values in craps
When the second rolled sum equals the first rolled sum the player wins
2002 Prentice Hall.All rights reserved.
Outline61
CrapsGame.cs
63 else64 if ( sum == ( int )DiceNames.CRAPS ) // = 765 {66 lblStatus.Text = "Sorry. You lose.";67 rollButton.Enabled = false;68 playButton.Enabled = true;69 }70 71 } // end rollButton_Click72 73 // simulate first roll and result of that roll74 protected void playButton_Click( 75 object sender, System.EventArgs e )76 {77 int sum;78 myPoint = 0;79 fraPoint.Text = "Point";80 lblStatus.Text = "";81 imgPointDie1.Image = null; //upper one82 imgPointDie2.Image = null; //upper one83 84 sum = rollDice();85
If the second roll equals CRAPS (7), then the player loses
2002 Prentice Hall.All rights reserved.
Outline62
CrapsGame.cs
86 switch ( sum )87 {88 case ( int )DiceNames.CRAPS: // = 789 case ( int )DiceNames.YO_LEVEN: 90 rollButton.Enabled = false; // disable Roll button91 lblStatus.Text = "You Win!!!";92 break;93 case ( int )DiceNames.SNAKE_EYES: // = 294 case ( int )DiceNames.TREY: // = 395 case ( int )DiceNames.BOX_CARS: // = 1296 rollButton.Enabled = false; 97 lblStatus.Text = "Sorry. You lose.";98 break;99 default:100 myPoint = sum;101 fraPoint.Text = "Point is " + sum;102 lblStatus.Text = "Roll Again";103 displayDie( imgPointDie1, myDie1 );//upper one104 displayDie( imgPointDie2, myDie2 );//upper one105 playButton.Enabled = false;106 rollButton.Enabled = true;107 break;108 109 } // end switch110 111 } // end playButton_Click112 113 private void displayDie( PictureBox imgDie, int face )114 {115 imgDie.Image = Image.FromFile( 116 Directory.GetCurrentDirectory() + 117 "\\images\\die" + face + ".gif" );118 }119
If on the first roll the players gets a 7 or an 11 they win
If the first roll is a 2, 3 or 12, the player loses.
Any other number allows the player to roll again
imgPointDie1
imgDie1
2002 Prentice Hall.All rights reserved.
Outline63
CrapsGame.cs
120 // simulates the rolling of two dice121 private int rollDice()122 {123 int die1, die2, dieSum;124 Random randomNumber = new Random();125 126 die1 = randomNumber.Next( 1, 7 );127 die2 = randomNumber.Next( 1, 7 );128 129 displayDie( imgDie1, die1 ); //lower one130 displayDie( imgDie2, die2 ); //lower one131 132 myDie1 = die1;133 myDie2 = die2;134 dieSum = die1 + die2;135 return dieSum;136 137 } // end rollDice138 139 // main entry point for application140 [STAThread]141 static void Main() 142 {143 Application.Run(new CrapsGame());144 }145 146 } // end of class CrapsGame
Generates two random numbers, one for each die
imgDie1
imgPointDie1
2002 Prentice Hall.All rights reserved.
Outline64
CrapsGame.cs Program Output
Jozef Goetz, 2011
65 1 // Fig. 7.10 ed3 or 7.8 ed4: CrapsTest.cs
2 // Application to test class Craps. – see next slides
3 public class CrapsTest
4 {
5 public static void Main( string[] args )
6 {
7 Craps game = new Craps();
8 game.Play(); // play one game of craps
9 } // end Main
10 } // end class CrapsTest Player rolled 2 + 5 = 7 Player wins Player rolled 2 + 1 = 3 Player loses
Outline
CrapsTest.cs
Player rolled 4 + 6 = 10 Point is 10 Player rolled 1 + 3 = 4 Player rolled 1 + 3 = 4 Player rolled 2 + 3 = 5 Player rolled 4 + 4 = 8 Player rolled 6 + 6 = 12 Player rolled 4 + 4 = 8 Player rolled 4 + 5 = 9 Player rolled 2 + 6 = 8 Player rolled 6 + 6 = 12 Player rolled 6 + 4 = 10 Player wins Player rolled 2 + 4 = 6 Point is 6 Player rolled 3 + 1 = 4 Player rolled 5 + 5 = 10 Player rolled 6 + 1 = 7 Player loses
Jozef Goetz, 2011
66 1 // Fig. 7.10 ed3 (or 7.8 ed4): Craps.cs Console application solution
2 // Craps class simulates the dice game craps.
3 using System;
4
5 public class Craps
6 {
7 // create random number generator for use in method RollDice
8 private Random randomNumbers = new Random();
9
10 // enumeration with constants that represent the game status
11 private enum Status { CONTINUE, WON, LOST }
12
13 // enumeration with constants that represent common rolls of the dice
14 private enum DiceNames
15 {
16 SNAKE_EYES = 2,
17 TREY = 3,
18 SEVEN = 7,
19 YO_LEVEN = 11,
20 BOX_CARS = 12
21 }
Outline
Craps.cs
(1 of 4)
Jozef Goetz, 2011
6722
23 // plays one game of craps
24 public void Play()
25 {
26 // gameStatus can contain CONTINUE, WON or LOST
27 Status gameStatus = Status.CONTINUE;
28 int myPoint = 0; // point if no win or loss on first roll
29
30 int sumOfDice = RollDice(); // first roll of the dice
31
32 // determine game status and point based on first roll
33 switch ( ( DiceNames ) sumOfDice )
34 {
35 case DiceNames.SEVEN: // win with 7 on first roll
36 case DiceNames.YO_LEVEN: // win with 11 on first roll
37 gameStatus = Status.WON;
38 break;
39 case DiceNames.SNAKE_EYES: // lose with 2 on first roll
40 case DiceNames.TREY: // lose with 3 on first roll
41 case DiceNames.BOX_CARS: // lose with 12 on first roll
42 gameStatus = Status.LOST;
43 break;
44 default: // did not win or lose, so remember point
45 gameStatus = Status.CONTINUE; // game is not over
46 myPoint = sumOfDice; // remember the point
47 Console.WriteLine( "Point is {0}", myPoint );
48 break;
49 } // end switch
Outline
Craps.cs
(2 of 4)
Player rolled 2 + 4 = 6Point is 6Player rolled 3 + 1 = 4Player rolled 5 + 5 = 10Player rolled 6 + 1 = 7Player loses
Jozef Goetz, 2011
6850
51 // roll part: while game is not complete – check status
52 while ( gameStatus == Status.CONTINUE ) // game not WON or LOST
53 {
54 sumOfDice = RollDice(); // roll dice again
55
56 // determine game status
57 if ( sumOfDice == myPoint ) // win by making point
58 gameStatus = Status.WON;
59 else
60 // lose by rolling 7 before point
61 if ( sumOfDice == ( int ) DiceNames.SEVEN )
62 gameStatus = Status.LOST;
63 } // end while
64
65 // display won or lost message
66 if ( gameStatus == Status.WON )
67 Console.WriteLine( "Player wins" );
68 else
69 Console.WriteLine( "Player loses" );
70 } // end method Play
Outline
Craps.cs
(3 of 4)
Player rolled 2 + 4 = 6Point is 6Player rolled 3 + 1 = 4Player rolled 5 + 5 = 10Player rolled 6 + 1 = 7Player loses
Player rolled 2 + 5 = 7Player wins
Player rolled 2 + 1 = 3Player loses
Jozef Goetz, 2011
6971
72 // roll dice, calculate sum and display results
73 public int RollDice()
74 {
75 // pick random die values
76 int die1 = randomNumbers.Next( 1, 7 ); // first die roll
77 int die2 = randomNumbers.Next( 1, 7 ); // second die roll
78
79 int sum = die1 + die2; // sum of die values
80
81 // display results of this roll
82 Console.WriteLine( "Player rolled {0} + {1} = {2}",
83 die1, die2, sum );
84 return sum; // return sum of dice
85 } // end method RollDice
86 } // end class Craps
Outline
Craps.cs
(4 of 4)
Player rolled 2 + 5 = 7Player wins
Player rolled 2 + 1 = 3Player loses
Jozef Goetz, 2011
70 1 // Fig. 7.10 ed3 (or 7.8 ed4): CrapsTest.cs
2 // Application to test class Craps.
3 public class CrapsTest
4 {
5 public static void Main( string[] args )
6 {
7 Craps game = new Craps();
8 game.Play(); // play one game of craps
9 } // end Main
10 } // end class CrapsTest Player rolled 2 + 5 = 7 Player wins Player rolled 2 + 1 = 3 Player loses
Outline
CrapsTest.cs
Player rolled 4 + 6 = 10 Point is 10 Player rolled 1 + 3 = 4 Player rolled 1 + 3 = 4 Player rolled 2 + 3 = 5 Player rolled 4 + 4 = 8 Player rolled 6 + 6 = 12 Player rolled 4 + 4 = 8 Player rolled 4 + 5 = 9 Player rolled 2 + 6 = 8 Player rolled 6 + 6 = 12 Player rolled 6 + 4 = 10 Player wins Player rolled 2 + 4 = 6 Point is 6 Player rolled 3 + 1 = 4 Player rolled 5 + 5 = 10 Player rolled 6 + 1 = 7 Player loses
Jozef Goetz, 2011
717.11 Scope of DeclarationsVariable and reference attributes:
1. name, 2. type, 3. size, 4. value, 5. scope, 6. duration
Scope Where 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, 2011
727.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.
Outline73
Scoping.cs
1 // Fig. 6.13 ed1 or 7.11 ed3: 7.9 ed4 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.
Outline74
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, 2011
757.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.
Outline76
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.
Outline77
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.
Outline78
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, 2011
As of Visual C# 2010, 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, 2011
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.)
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
Jozef Goetz, 2011
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.)
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
Jozef Goetz, 2011
7.13 Optional Parameters
The last call 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, 2011
•At least base Value must pass. •exponentValue is an optional parameter•Prog. Error 7.11: Declaring a non-optional parameter to the right of an optional one is a compilation error.
Jozef Goetz, 2011
Visual C# 2010 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
7.14 Named Parameters
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
Jozef Goetz, 2011
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.
7.14 Named Parameters
©1992-2011 by Pearson Education, Inc. All Rights Reserved.
Jozef Goetz, 2011
867.15 Recursion
Fig. 9.10 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,
•(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. Continually breaks problem down to simpler forms.
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, 2011
87
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, 2011
88
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, 2011
897.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, 2011
90Recursive Functions
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
Jozef Goetz, 2011
91
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
2002 Prentice Hall.All rights reserved.
Outline92
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.
Outline93
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, 2011
94Iterative 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, 2011
95Example 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, 2011
96Example 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.
Outline97
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.
Outline98
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.
Outline99
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, 2011
1007.15 Recursion vs. Iteration
Iteration Uses repetition structures (for, while or do/while) Repetition through explicitly use of repetition structure Terminates when loop-continuation condition fails Controls repetition by using a counter No extra calls so it doesn’t consume additional memory
Recursion Uses selection structures (if, if/else or switch) Repetition through repeated method calls Terminates when base case is satisfied Controls repetition by dividing problem into simpler one Recursive calls take time and consume additional memory
Both can have infinite loops
Jozef Goetz, 2011
101Recursion 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, 2011
1027.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.
Outline103
RefOutTest.cs
1 // Fig. 6.8 ed1 or 7.18 ed3 7.15 ed4: 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.
Outline104
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 );40 RefOutTest.SquareOut( out z );41 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, 2011
Extra: Find Maximum (and Minimum) 105
Jozef Goetz, 2011
Class to find MAX 106
Jozef Goetz, 2011
Driver to test CalculateMax()107
Copyright 2009. All rights reserved. Copyright 2012. All rights reserved. Foreign Corrupt Practices…
Jozef Goetz, 2012 1 © 2011-12 Pearson Education Copyright (c) 2007Prentice-Hall. All rights reserved