Methods and their Parameters |
|
As we saw in the previous lesson, a method performs an assignment that completes the operations of a class. The methods we used in the previous lesson relied on global variables to exchange information with other sections of the program. Sometimes, a method would need one or more values in order to carry its assignment. The particularity of such a value or such values is that another method that calls this one must supply the needed values. When a method needs a value to complete its assignment, such a value is called an argument.
Like a variable, an argument is represented by its type of value. For example, one method may need a character while another would need a string. Yet another method may require a decimal number. This means that the method or class that calls a method is responsible for supplying the right value, even though a method may have an internal mechanism of checking the validity of such a value. The value supplied to a method is typed in the parentheses of the method and it's called an argument. In order to declare a method that takes an argument, you must specify its name and the argument between its parentheses. Because a method must specify the type of value it would need, the argument is represented by its data type and a name. If the method would not return a value, it can be declared as void. Suppose you want to define a method that displays the side length of a square. Since you would have to supply the length, you can define such a method as follows: using System; public class NewProject { void DisplaySide(double Length) { } static void Main() { } } In the body of the method, you may or may not use the value of the argument. Otherwise, you can manipulate the supplied value as you see fit. In this example, you can display the value of the argument as follows: using System; public class NewProject { void DisplaySide(double Length) { Console.Write("Length: "); Console.WriteLine(Length); } static void Main() { } } In this case, remember to define the method as static if you plan to access it from Main(). In order to call a method that takes an argument, you must supply a value for the argument when calling the method; otherwise you would receive an error. Also, you should/must supply the right value; otherwise, the method may not work as expected and produce an unreliable result. Here is an example: using System; public class NewProject { static void DisplaySide(double Length) { Console.Write("Length: "); Console.WriteLine(Length); } static void Main() { DisplaySide(35.55); Console.WriteLine(); } } As mentioned already, a method that takes an argument can also declared its own variable. Such variables are referred to as local. A method can take more than one argument. When defining such a method, provide each argument with its data type and a name. The arguments are separated by a comma. |
|
Practical Learning: Passing Arguments |
using System; class Cylinder { static double GetTheRadius() { double rad; do { Console.Write("Radius: "); rad = double.Parse(Console.ReadLine()); if( rad < 0 ) Console.WriteLine("Please enter a positive number"); } while( rad < 0 ); return rad; } static double GetTheHeight() { double h; do { Console.Write("Height: "); h = double.Parse(Console.ReadLine()); if( h < 0 ) Console.WriteLine("Please enter a positive number"); } while( h < 0 ); return h; } static double CalculateBaseArea(double rad) { return rad * rad * Math.PI; } static double CalculateLateralArea(double rad, double hgt) { return 2 * Math.PI * rad * hgt; } static double CalculateTotalArea(double rad, double hgt) { return 2 * Math.PI * rad * (hgt + rad); } static double CalculateVolume(double rad, double hgt) { return Math.PI * rad * rad * hgt; } static void ProcessCylinder() { double Radius; double Height; double BaseArea; double LateralArea; double TotalArea; double Volume; Console.WriteLine("Enter the dimensions of the cylinder"); Radius = GetTheRadius(); Height = GetTheHeight(); BaseArea = CalculateBaseArea(Radius); LateralArea = CalculateLateralArea(Radius, Height); TotalArea = CalculateTotalArea(Radius, Height); Volume = CalculateVolume(Radius, Height); Console.WriteLine("\nCylinder Characteristics"); Console.WriteLine("Radius: {0}", Radius); Console.WriteLine("Height: {0}", Height); Console.WriteLine("Base: {0:F}", BaseArea); Console.WriteLine("Lateral: {0:F}", LateralArea); Console.WriteLine("Total: {0:F}", TotalArea); Console.WriteLine("Volume: {0:F}", Volume); } static void Main() { ProcessCylinder(); Console.WriteLine(); } } |
Enter the dimensions of the cylinder Radius: 35.96 Height: 30.28 Cylinder Characteristics Radius: 35.96 Height: 30.28 Base: 4062.46 Lateral: 6841.56 Total: 14966.49 Volume: 123011.33 |
Techniques of Passing Arguments |
Passing Arguments by Value |
When calling the methods that take one or more arguments, we made sure we provided the needed argument. This is because an argument is always required and the calling function or class must provided a valid value when calling such a method. |
Practical Learning: Passing Arguments By Value |
|
Consider the following program:
using System; public class Payroll { static void Earnings(double ThisWeek, double Salary) { ThisWeek = 42.50; Console.WriteLine("\nIn the Earnings() function,"); Console.Write("Weekly Hours = "); Console.WriteLine(ThisWeek); Console.Write("Salary = "); Console.WriteLine(Salary); Console.Write("Weekly Salary: = "); Console.WriteLine(ThisWeek * Salary); } static void Main() { double Hours, Rate; Rate = 15.58; Hours = 26.00; Console.WriteLine("In the Main() function,"); Console.Write("\nWeekly Hours = "); Console.Write(Hours); Console.Write("\nSalary = "); Console.WriteLine(Rate); Console.Write("Weekly Salary = "); Console.WriteLine(Hours * Rate); Console.WriteLine("\nCalling the Earnings() function"); Earnings(Hours, Rate); Console.Write("\nAfter calling the Earnings() function, "); Console.WriteLine("\nin the Main() function,"); Console.Write("\nWeekly Hours = "); Console.Write(Hours); Console.Write("\nSalary = "); Console.WriteLine(Rate); Console.Write("Weekly Salary = "); Console.WriteLine(Hours * Rate); Console.Write("\n"); } }
This would produce:
In the Main() function, Weekly Hours = 26 Salary = 15.58 Weekly Salary = 405.08 Calling the Earnings() function In the Earnings() function, Weekly Hours = 42.5 Salary = 15.58 Weekly Salary: = 662.15 After calling the Earnings() function, in the Main() function, Weekly Hours = 26 Salary = 15.58 Weekly Salary = 405.08 Press any key to continue
using System; class Exercise { static void Initializer(out double n) { n = 128.44; } public static void Main() { double Number = 15.25; Console.WriteLine("Number = {0}", Number); Initializer(out Number); Console.WriteLine("Number = {0}", Number); } }
This would produce:
Number = 15.25 Number = 128.44
Practical Learning: Passing Arguments By Reference |
using System; class Cylinder { static void GetTheRadius(ref double rad) { do { Console.Write("Radius: "); rad = double.Parse(Console.ReadLine()); if( rad < 0 ) Console.WriteLine("Please enter a positive number"); } while( rad < 0 ); } static void GetTheHeight(out double h) { do { Console.Write("Height: "); h = double.Parse(Console.ReadLine()); if( h < 0 ) Console.WriteLine("Please enter a positive number"); } while( h < 0 ); } static double CalculateBaseArea(double rad) { return rad * rad * Math.PI; } static double CalculateLateralArea(double rad, double hgt) { return 2 * Math.PI * rad * hgt; } static double CalculateTotalArea(double rad, double hgt) { return 2 * Math.PI * rad * (hgt + rad); } static double CalculateVolume(double rad, double hgt) { return Math.PI * rad * rad * hgt; } static void ProcessCylinder() { double Radius = 0.00; double Height = 0.00; double BaseArea; double LateralArea; double TotalArea; double Volume; Console.WriteLine("Enter the dimensions of the cylinder"); GetTheRadius(ref Radius); GetTheHeight(out Height); BaseArea = CalculateBaseArea(Radius); LateralArea = CalculateLateralArea(Radius, Height); TotalArea = CalculateTotalArea(Radius, Height); Volume = CalculateVolume(Radius, Height); ShowCylinder(Radius, Height, BaseArea, LateralArea, TotalArea, Volume); } static void ShowCylinder(double rad, double hgt, double BArea, double Lateral, double Total, double vol) { Console.WriteLine("\nCylinder Characteristics"); Console.WriteLine("Radius: {0}", rad); Console.WriteLine("Height: {0}", hgt); Console.WriteLine("Base: {0:F}", BArea); Console.WriteLine("Lateral: {0:F}", Lateral); Console.WriteLine("Total: {0:F}", Total); Console.WriteLine("Volume: {0:F}", vol); } static void Main() { ProcessCylinder(); Console.WriteLine(); } } |
Enter the dimensions of the cylinder Radius: 24.55 Height: 20.85 Cylinder Characteristics Radius: 24.55 Height: 20.85 Base: 1893.45 Lateral: 3216.16 Total: 7003.05 Volume: 39478.34 |
Method Overloading |
A typical program involves a great deal of names that represent variables and methods of various kinds. The compiler does not allow two variables to have the same name in the same function. Although two methods should have unique names in the same program, C# allows you to use the same name for different functions of the same program following certain rules. The ability to have various methods with the same name in the same program is referred to as overloading. The most important rule about function overloading is to make sure that each one of these methods has a different number or different type(s) of arguments. The moment of inertia is the ability of of a beam to resist bending. It is calculated with regard to the cross section of the beam. Because it depends on the type of section of the beam, its calculation also depends on the type of section of the beam. In this exercise, we will review different formulas used to calculate the moment of inertia. Since this exercise is for demonstration purposes, you do not need to be a Science Engineering major to understand it. We will illustrate method overloading through an exercise. |
Practical Learning: Overloading a Method |
using System; public class NewProject { // Rectangle static double MomentOfInertia(double b, double h) { return b * h * h * h / 3; } static void Main() { double Base, Height; Console.WriteLine("Enter the dimensions of the Rectangle"); Console.Write("Base: "); Base = double.Parse(Console.ReadLine()); Console.Write("Height: "); Height = double.Parse(Console.ReadLine()); Console.WriteLine("\nMoment of inertia with regard to the X axis: "); Console.WriteLine("I = {0}mm", MomentOfInertia(Base, Height)); Console.WriteLine(); } } |
Enter the dimensions of the Rectangle Base: 2.44 Height: 3.58 Moment of inertia with regard to the X axis: I = 37.3179390933333mm |
using System; public class NewProject { // Rectangle static double MomentOfInertia(double b, double h) { return b * h * h * h / 3; } // Semi-Circle static double MomentOfInertia(double R) { const double PI = 3.14159; return R * R * R * R * PI/ 8; } static void Main() { double Base, Height; double Radius; Console.WriteLine("Enter the dimensions of the Rectangle"); Console.Write("Base: "); Base = double.Parse(Console.ReadLine()); Console.Write("Height: "); Height = double.Parse(Console.ReadLine()); Console.WriteLine("\nMoment of inertia with regard to the X axis: "); Console.WriteLine("I = {0}mm", MomentOfInertia(Base, Height)); Console.Write("\nEnter the radius: "); Radius = double.Parse(Console.ReadLine()); Console.WriteLine("Moment of inertia of a semi-circle with regard to the X axis: "); Console.WriteLine("I = {0}mm", MomentOfInertia(Radius)); Console.WriteLine(); } } |
Enter the dimensions of the Rectangle Base: 4.25 Height: 2.55 Moment of inertia with regard to the X axis: I = 23.49028125mm Enter the radius: 5.35 Moment of inertia of a semi-circle with regard to the X axis: I = 321.717471644992mm |
Here are the formulas considered for a triangle:
As you can see, the rectangle and the triangle are using the same dimension types. This means that we can provide only the same kinds of arguments, the base and the height, to calculate the moment of inertia. This also means that the compiler will not allow us to write two methods that have the same name, the same number of arguments, and the same types of arguments because that would violate the rule of function overloading.
In order to overload the MomentOfInertia() function, we will add an argument that will never be used; this argument will serve only as a “witness” to set the difference between both versions of the function. This “witness” argument can be anything: an integer, a character, a string, a float, etc. For our example, we will make it a simple integer. To use the version applied to the triangle, we will provide this argument to overload the
MomentOfInertia() function. When called with only two arguments, the rectangle version will apply.
Change the file as follows:
using System; public class NewProject { // Rectangle static double MomentOfInertia(double b, double h) { return b * h * h * h / 3; } // Semi-Circle static double MomentOfInertia(double R) { const double PI = 3.14159; return R * R * R * R * PI/ 8; } // Triangle static double MomentOfInertia(double b, double h, int i) { return b * h * h * h / 12; } static void Main() { double Base = 7.74, Height = 14.38, Radius = 12.42; Console.WriteLine("Rectangle - Moment of inertia with regard to the X axis: "); Console.WriteLine("I = {0}mm", MomentOfInertia(Base, Height)); Console.WriteLine("\nSemi-Circle - Moment of inertia of a semi-circle with regard to the X axis: "); Console.WriteLine("I = {0}mm", MomentOfInertia(Radius)); Console.WriteLine("\nEnter the dimensions of the triangle"); Console.Write("Base: "); Base = double.Parse(Console.ReadLine()); Console.Write("Height: "); Height = double.Parse(Console.ReadLine()); Console.WriteLine("\nTriangle - Moment of inertia with regard to the X axis: "); Console.WriteLine("I = {0}mm", MomentOfInertia(Base, Height, 1)); Console.WriteLine(); } } |
Rectangle - Moment of inertia with regard to the X axis: I = 7671.78395376mm Semi-Circle - Moment of inertia of a semi-circle with regard to the X axis: I = 9344.28126291881mm Enter the dimensions of the triangle Base: 5.52 Height: 3.84 Triangle - Moment of inertia with regard to the X axis: I = 26.04662784mm |
|
||
Previous | Copyright © 2004-2012, FunctionX | Next |
|