1 / 40

Subroutines and Functions

Subroutines and Functions. Chapter 6 in Deitel, Deitel and Nieto. Resolution. Two definitions of “resolution” A solution … of a problem The act … of separating into constituent or elementary parts (Webster’s New Universal Unabridged Dictionary)

ruth-haley
Télécharger la présentation

Subroutines and Functions

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

E N D

Presentation Transcript


  1. Subroutines and Functions Chapter 6 in Deitel, Deitel and Nieto

  2. Resolution • Two definitions of “resolution” • A solution … of a problem • The act … of separating into constituent or elementary parts • (Webster’s New Universal Unabridged Dictionary) • One of the primary techniques for solving complex problems is “divide and conquer” • Break the problem into manageable pieces • Solve the pieces • Reassemble the pieces into a complete solution

  3. Modules • Modules are one of the “constituent parts” into which a programmer breaks Visual Basic code • Another “unit” of programming is the object

  4. Divide and Conquer Example

  5. Divide and Conquer Example Option Explicit Dim EmployeeName As String Dim Hours As Integer Dim Wage As Double Dim Salary As Double Private Sub cmdCalculate_Click() GetInfo CalculateWeeklySalary PrintResult End Sub They’re getting rid of the currency type so use double Problem broken into three modules These are “calls”

  6. The GetInfo Module Private Sub GetInfo() EmployeeName = txtFirstName.Text & _ " " & txtLastName.Text GetHours GetWage End Sub This module is further broken down into more modules

  7. GetHours Module Private Sub GetHours() If IsNumeric(txtHours.Text) Then Hours = CInt(txtHours.Text) Else MsgBox ("Please enter a number (e.g. 34)” _ & “for the Hours.") txtHours.Text = "" txtHours.SetFocus End If End Sub

  8. GetWage Module Private Sub GetWage() If IsNumeric(txtWage.Text) Then Wage = CDbl(txtWage.Text) Else MsgBox ("Please enter a number “ _ & “ (e.g. 7.95) for the Wage.") txtWage.Text = "" txtWage.SetFocus End If End Sub

  9. CalculateWeeklySalary Module Private Sub CalculateWeeklySalary() If Hours > 40 Then Salary = (Hours - 40) * 1.5 * Wage + _ 40 * Wage Else Salary = Hours * Wage End If End Sub

  10. PrintResult Module Private Sub PrintResult() lblSalary.Caption = EmployeeName & _ " earned " lblSalary.Caption = lblSalary.Caption & _ Format$(Salary, "currency") lblSalary.Caption = lblSalary.Caption & _ " the week of " & Date & "." End Sub

  11. Code maintenance • Modularization makes the code easier to maintain • If the way the data is obtained changes, we need only change the GetInfo module • If we alter the overtime rules, we need only change the CalculateWeeklySalary module • If we decide to cut an actual check, we need only change the PrintResult module

  12. Reduce Repeated Code • Another possible benefit of modules is the reduction of repeated code • A given module can be called more than once from more than one location in the code

  13. Select a Color Revisited Recall we must change the form’s backcolor property as well as the backcolor property of all the optionbuttons, and we must do that in click method of each of the optionbuttons To prevent a lot of repetition, we will use a subroutine

  14. Add Procedure Does not return anything so sub Used only by this form so private

  15. Add Procedure Result Or just type this; actually VB supplies the End Sub automatically

  16. Calling Subroutines Private Sub optBlue_Click() Color = vbBlue Call ColorForm End Sub Private Sub optGreen_Click() Color = vbGreen ColorForm End Sub Call ColorForm subroutine using keyword Call Call ColorForm subroutine without keyword Call

  17. Subroutine ColorForm Private Sub ColorForm() frmSelectColor.BackColor = Color optRed.BackColor = Color optBlue.BackColor = Color optGreen.BackColor = Color optYellow.BackColor = Color optCyan.BackColor = Color optMagenta.BackColor = Color End Sub Open parenthesis; close parenthesis

  18. Scope • If a variable is declared at the top of the module, it is referred to as global and is available to all of the modules belonging to the form • If a variable is declared within a module, it is referred to as local and is available only within that module

  19. What’s the difference? • Global variables should be fundamental to the problem and needed by several modules • Local variables are those that are needed in one or two modules only

  20. An Example • For example the i in For i=1 To n is only needed within the for loop within one module, so it should be declared locally • This way i cannot be confused with other counters in the problem (even if they are also called i) • Duplicate variable names can be a big problem in longer programs, proper use of scope limits the difficulty

  21. Passing a Parameter • To get local information from one module to another, one “passes” the information • The information that is passed is placed in the parentheses

  22. Passing a Parameter Option Explicit Private Sub Form_Load() Call optRed_Click End Sub Private Sub optBlue_Click() Call ColorForm(vbBlue) End Sub Look Ma, no global variables Passing a parameter

  23. Local ColorForm Private Sub ColorForm(Color As Long) frmSelectColor.BackColor = Color optRed.BackColor = Color optBlue.BackColor = Color optGreen.BackColor = Color optYellow.BackColor = Color optCyan.BackColor = Color optMagenta.BackColor = Color End Sub Passed variable and its type

  24. What has been gained? • First, the variable color is now local to ColorForm meaning that the variable color can be used elsewhwere in the program without problem • Second, the variable color (which corresponds to a memory location) exits only for the duration of ColorForm, so memory is freed up

  25. Information Hiding • “The process of hiding details of an object or function. Information hiding is a powerful programming technique because it reduces complexity. …. The programmer can then focus on the new object without worrying about the hidden details.” • “Information hiding is also used to prevent programmers from changing --- intentionally or unintentionally -- parts of a program.” • (http://www.webopedia.com)

  26. Multiple programmers • Most code is written by teams of coders • One should be able to use a module without detailed knowledge of how it works (its implementation) • If a module uses global variables, then someone using module must declare these variables • And if two modules use the same global variables, there can be conflicts

  27. To and Fro • We have seen how to get local information to a module, now we must consider how to get it back • VB distinguishes between subroutines and functions; the difference is that function return a value (send back some information) to whatever modules called it

  28. Weekly Salary Revisited

  29. New cmdCalculate_Click Option Explicit Private Sub cmdCalculate_Click() Dim EmployeeName As String Dim Hours As Integer Dim Wage As Double Dim Salary As Double All variables local now

  30. New cmdCalculate_Click (Cont.) Three functions return name, hours and wage respectively, note they are part of assignment statement EmployeeName = GetName() Hours = GetHours() Debug.Print Hours Wage = GetWage() Salary = CalculateWeeklySalary(Hours, Wage) Call PrintResult(EmployeeName, Salary) End Sub CalculateWeeklySalary now a function

  31. GetName Function Private Function GetName() As String GetName = txtFirstName.Text & " " _ & txtLastName.Text End Function Whatever you want returned assign to the function’s name Type of thing that gets returned

  32. GetHours Function Private Function GetHours() As Integer If IsNumeric(txtHours.Text) Then GetHours = CInt(txtHours.Text) Else MsgBox ("There was an error in the hours.") txtHours.Text = "" txtHours.SetFocus GetHours = 0 End If End Function Need to return something even if there was a mistake, better to test on validate method

  33. GetWage Function Private Function GetWage() As Double If IsNumeric(txtWage.Text) Then GetWage = CDbl(txtWage.Text) Else MsgBox ("There was an error in the Wage.") txtWage.Text = "" txtWage.SetFocus GetWage = 0 End If End Function

  34. CalculateWeeklySalary Function Private Function CalculateWeeklySalary(Hours As Integer, _ Wage As Double) As Double If Hours > 40 Then CalculateWeeklySalary = (Hours - 40) * _ 1.5 * Wage + 40 * Wage Else CalculateWeeklySalary = Hours * Wage End If End Function

  35. PrintResult Subroutine Private Sub PrintResult(EmployeeName As _ String, Salary As Double) lblSalary.Caption = EmployeeName & _ " earned " lblSalary.Caption = lblSalary.Caption & _ Format$(Salary, "currency") lblSalary.Caption = lblSalary.Caption & _ " the week of " & Date & "." End Sub

  36. VB Functions • VB has some built in functions such an • Abs(x) - return the absolute value of x • Exp(x) - return the exponential of x • Int(x) - return the integer part of x • Sgn(x) - return the sign of the number x • Rnd() - return a “pseudo-random” number between 0 and 1

  37. Random Numbers

  38. Random Numbers Option Explicit Private Sub cmdRandom_Click() txtRandomSingle.Text = Rnd() End Sub Private Sub cmdRandomInteger_Click() txtRandomInteger.Text = Int(Rnd() * 10 + 1) End Sub

  39. Random numbers Private Sub Command1_Click() txtRandomAB.Text = Int(Rnd() * (txtB.Text - txtA.Text + 1) + txtA.Text) End Sub

More Related