1、A First Book of ANSI C Fourth Edition,Chapter 7 Modularity Using Functions: Part II,A First Book of ANSI C, Fourth Edition,2,Objectives,Variable Scope Variable Storage Class Pass by Reference Case Study: Swapping Values Recursion Common Programming and Compiler Errors,A First Book of ANSI C, Fourth
2、Edition,3,Variable Scope,If variables created inside a function are available only to the function itself, they are said to be local to the function, or local variables Scope is the section of the program where the variable is valid or “known”,A First Book of ANSI C, Fourth Edition,4,Variable Scope
3、(continued),A First Book of ANSI C, Fourth Edition,5,Variable Scope (continued),A variable with a local scope has had storage set aside for it by a declaration statement made within a function body A variable with global scope is one whose storage has been created for it by a declaration statement l
4、ocated outside any function,A First Book of ANSI C, Fourth Edition,6,Variable Scope (continued),A First Book of ANSI C, Fourth Edition,7,Variable Scope (continued),A First Book of ANSI C, Fourth Edition,8,Variable Scope (continued),Program 7.1 produces the following output From main(): firstnum = 10
5、 From main(): secnum = 20 From valfun(): firstnum = 10 From valfun(): secnum = 30 From main() again: firstnum = 40 From main() again: secnum = 20 While a function is executing, only the storage area for the variables and parameters created by this function are automatically accessed,A First Book of
6、ANSI C, Fourth Edition,9,Variable Scope (continued),If a variable that is not local to the function is used by the function, the program searches the global storage areas for the correct name The scope of a variable does not influence the data type of the variable,A First Book of ANSI C, Fourth Edit
7、ion,10,Variable Scope (continued),A First Book of ANSI C, Fourth Edition,11,When to Use Global Declarations,The scoping rules for symbolic constants and function prototypes are the same as for variables When a symbolic constant has a general meaning that is applicable throughout an application, it m
8、akes good programming sense to declare it globally at the top of a source code file Coding a function prototype as a global makes sense when the function is used by a number of other functions in a source code file Doing so avoids repeating the prototype within each of the functions that will call i
9、t,A First Book of ANSI C, Fourth Edition,12,Misuse of Global Variables,Except for symbolic constants and prototypes, global variables should almost never be used By making a variable global, you instantly destroy the safeguards C provides to make functions independent and insulated from each other U
10、sing global variables can be especially disastrous in large programs with many user-created functions Because a global variable can be accessed and changed by any function following the global declaration, it is a time-consuming and frustrating task to locate the origin of an erroneous value,A First
11、 Book of ANSI C, Fourth Edition,13,Variable Storage Class,In addition to the space dimension represented by its scope, variables also have a time dimension Called the variables “lifetime” Where and how long a variables storage locations are kept before they are released can be determined by the stor
12、age class of the variable auto, static, extern, and register,A First Book of ANSI C, Fourth Edition,14,Variable Storage Class (continued),Examples:auto int num; static int miles; extern int price; register int dist; auto float coupon; static float yrs; extern float yld; auto char inKey;,A First Book
13、 of ANSI C, Fourth Edition,15,Local Variable Storage Classes,Local variables can only be members of the auto, static, or register storage classes auto is the default class used by C The term auto is short for automatic Storage for automatic local variables is automatically reserved each time a funct
14、ion declaring automatic variables is called As long as the function has not returned control to its calling function, all automatic variables local to the function are “alive”; that is, storage for the variables is available,A First Book of ANSI C, Fourth Edition,16,Output is: The value of the autom
15、atic variable num is 0 The value of the automatic variable num is 0 The value of the automatic variable num is 0,Local Variable Storage Classes (continued),A First Book of ANSI C, Fourth Edition,17,Local Variable Storage Classes (continued),A local variable declared as static causes the program to k
16、eep the variable and its value even when the function that declared it is done Once created, local static variables remain in existence for the life of the program Static variables are not initialized at run-time The initialization of static variables is done only once, when the program is first com
17、piled Some compilers initialize local static variables the first time the definition statement is executed rather than when the program is compiled,A First Book of ANSI C, Fourth Edition,18,Output is: The value of the static variable num is now 0 The value of the static variable num is now 1 The val
18、ue of the static variable num is now 2,Local Variable Storage Classes (continued),A First Book of ANSI C, Fourth Edition,19,Local Variable Storage Classes (continued),Register variables have the same time duration as automatic variables register int time; Registers are high-speed storage areas physi
19、cally located in the computers processing unit Application programs rarely, if ever, should use register variables Variables declared with the register storage class are automatically switched to auto if the compiler does not support register variables or if the declared register variables exceed th
20、e computers register capacity,A First Book of ANSI C, Fourth Edition,20,Global Variable Storage Classes,Global variables are created by declaration statements external to a function They exist until the program in which they are declared is finished executing Global variables are declared static or
21、extern extern int sum; static float yield; The purpose of the extern storage class is to extend the scope of a global variable declared in one source code file into another source code file,A First Book of ANSI C, Fourth Edition,21,Global Variable Storage Classes (continued),A First Book of ANSI C,
22、Fourth Edition,22,Global Variable Storage Classes (continued),A First Book of ANSI C, Fourth Edition,23,Global Variable Storage Classes (continued),Declaration statements containing the word extern do not create new storage areas; they only extend the scope of existing global variables The static gl
23、obal class is used to prevent the extension of a global variable into a second file The scope of a global static variable cannot be extended beyond the file in which it is declared Provides some privacy for static global variables,A First Book of ANSI C, Fourth Edition,24,Pass by Reference,In pass b
24、y value, a called function receives values from its calling function, stores the passed values in its own local parameters, manipulates these parameters appropriately, and directly returns, at most, a single value Passing an address is referred to as a function pass by reference, because the called
25、function can reference, or access, the variable using the passed address Also referred to as a call by reference when the term applies only to those parameters whose addresses have been passed,A First Book of ANSI C, Fourth Edition,25,Passing Addresses to a Function,Output is: num = 22 The address o
26、f num is 124484,A First Book of ANSI C, Fourth Edition,26,Storing Addresses,numAddr = A variable that can store an address is known as a pointer variable or pointer,A First Book of ANSI C, Fourth Edition,27,Storing Addresses (continued),A First Book of ANSI C, Fourth Edition,28,Storing Addresses (co
27、ntinued),A First Book of ANSI C, Fourth Edition,29,Using Addresses,Indirection operator: * *numAddr means the variable whose address is stored in numAddr Or, the variable pointed to by numAddr When using a pointer, the value obtained is always found by first going to the pointer for an address; this
28、 is called indirect addressing,A First Book of ANSI C, Fourth Edition,30,Using Addresses (continued),A First Book of ANSI C, Fourth Edition,31,Declaring and Using Pointers,In declaring a pointer variable, C requires that we also specify the type of variable that is pointed to int *numAddr; This decl
29、aration can be read in a number of ways: as the variable pointed to by numAddr is an integer, or as numAddr points to an integer,A First Book of ANSI C, Fourth Edition,32,Output is: The address stored in milesAddr is 1244872 The value pointed to by milesAddr is 22The value in miles is now 158,Declar
30、ing and Using Pointers (continued),A First Book of ANSI C, Fourth Edition,33,Declaring and Using Pointers (continued),A First Book of ANSI C, Fourth Edition,34,Passing Addresses to a Function,A First Book of ANSI C, Fourth Edition,35,Passing Addresses to a Function (continued),Sample run of Program
31、7.6: Enter a number: 24.6 The address that will be passed is 124484The address received is 124484 The value pointed to by xnum is: 24.60,A First Book of ANSI C, Fourth Edition,36,Passing Addresses to a Function (continued),A First Book of ANSI C, Fourth Edition,37,Add 20.2 to the value of the variab
32、le pointed to by xnum,Passing Addresses to a Function (continued),A First Book of ANSI C, Fourth Edition,38,Returns multiple values,Passing Addresses to a Function (continued),A First Book of ANSI C, Fourth Edition,39,Case Study: Swapping Values,A common programming requirement is the sorting of bot
33、h numeric values and text, such as names, in either ascending (increasing) or descending (decreasing) order Typically accomplished by comparing two values and then switching values if they are not in the correct order,A First Book of ANSI C, Fourth Edition,40,Requirements Specification,Write a C fun
34、ction that exchanges the values in two single-precision variables of its called function Thus, if the function has access to two variables of its calling function, the called function should switch the values in these variables,A First Book of ANSI C, Fourth Edition,41,Analyze the Problem,Input (arg
35、uments of the function): two addresses, of the two variables whose values are to be exchanged Output: change the values in the calling function using passed addresses Swapping the values of two variables is accomplished using the following algorithm: Store the first variables value in a temporary lo
36、cation Store the second variables value in the first variable Store the temporary value in the second variable,A First Book of ANSI C, Fourth Edition,42,Analyze the Problem (continued),A First Book of ANSI C, Fourth Edition,43,Analyze the Problem (continued),A First Book of ANSI C, Fourth Edition,44
37、,Code the Function,A First Book of ANSI C, Fourth Edition,45,Code the Function (continued),A First Book of ANSI C, Fourth Edition,46,Code the Function (continued),A First Book of ANSI C, Fourth Edition,47,Code the Function (continued),A First Book of ANSI C, Fourth Edition,48,Test and Debug the Prog
38、ram,The following sample run was obtained using Program 7.10, which completes the verification:Enter two numbers: 20.5 6.25Before the call to swap(): The value in firstnum is 20.50 The value in secnum is 6.25After the call to swap(): The value in firstnum is 6.25 The value in secnum is 20.50,A First
39、 Book of ANSI C, Fourth Edition,49,Recursion,Functions that call themselves are referred to as self-referential or recursive functions When a function invokes itself, the process is called direct recursion A function can invoke a second function, which in turn invokes the first function; this type o
40、f recursion is referred to as indirect or mutual recursion,A First Book of ANSI C, Fourth Edition,50,Mathematical Recursion,The definition for n! can be summarized by the following statements: 0! = 1 n! = n * (n-1)! for n = 1 This definition illustrates the general considerations that must be specif
41、ied in constructing a recursive algorithm: What is the first case or cases? How is the nth case related to the (n-1) case?,A First Book of ANSI C, Fourth Edition,51,Mathematical Recursion (continued),In pseudocode, the processing required is If n = 0factorial = 1 ElseFactorial = n * factorial(n - 1)
42、 In C, this can be written as int factorial(int n) if (n = 0)return (1);elsereturn (n * factorial(n-1); ,A First Book of ANSI C, Fourth Edition,52,Mathematical Recursion (continued),A First Book of ANSI C, Fourth Edition,53,How the Computation is Performed,A First Book of ANSI C, Fourth Edition,54,H
43、ow the Computation is Performed (continued),A First Book of ANSI C, Fourth Edition,55,How the Computation is Performed (continued),A First Book of ANSI C, Fourth Edition,56,Recursion versus Iteration,The recursive method can be applied to any problem in which the solution is represented in terms of
44、solutions to simpler versions of the same problem Any recursive function can be written in a nonrecursive manner using an iterative solution int factorial(int n) int fact;for(fact = 1; n 0; n-)fact = fact * n;return (fact); ,A First Book of ANSI C, Fourth Edition,57,Common Programming Errors,Using t
45、he same name for a local variable that has been used for a global variable Becoming confused about whether a parameter (or variable) contains an address or is an address Declaring a pointer as a function parameter and then forgetting to place the address operator, &, before the argument passed to th
46、e function when it is called Forgetting to specify the initial case when a recursive function is defined,A First Book of ANSI C, Fourth Edition,58,Common Compiler Errors,A First Book of ANSI C, Fourth Edition,59,Summary,Every variable used in a program has scope, which determines where the variable
47、can be used Every variable has a class Every variable has a data type, a value, and an address A pointer is a variable or parameter that is used to store the address of another variable If a parameter or variable is a pointer, then the indirection operator, *, must be used to access the variable who
48、se address is stored in the pointer,A First Book of ANSI C, Fourth Edition,60,Summary (continued),The address of a variable can be passed to a function When a called function receives an address, it has the capability of directly accessing the respective calling functions variable A recursive solution is one in which the solution can be expressed in terms of a “simpler” version of itself If a problem solution can be expressed repetitively or recursively with equal ease, the repetitive solution is preferable because it executes faster and uses less memory,