670 likes | 825 Views
Modular Programming With Functions. 1. Divide and Conquer. 4.1 Modularity. How do you solve a big/complex problem? Divide it into small tasks and solve each task. Then combine these solutions. 2. 4.1 Modularity (cont’d).
E N D
Divide and Conquer 4.1 Modularity • How do you solve a big/complex problem? • Divide it into small tasks and solve each task. Then combine these solutions. 2
4.1 Modularity (cont’d) • In C we use functions also referred to as modulesto perform specific tasks that we determined in our solution 3
Advantages of using modules • Modules can be written and tested separately • Modules can be reused • Large projects can be developed in parallel • Reduces length of program, making it more readable • Promotes the concept of abstraction • A module hides details of a task • We just need to know what this module does • We don’t need to know how it does it 4
4.2 Programmer Defined Functions • Every C program starts with main()function • Additional functions are called or invoked when the program encounters function names • Functions could be • Pre-defined library functions (e.g., printf, sin, tan) or • Programmer-defined functions (e.g., my_printf, area) • Functions • Perform a specific task • May take arguments • May return a single value to the calling function • May change the value of the function arguments (call by reference) 5
Function definition return_typefunction_name (parameters) { declarations; statements; } intmy_add_func(int a, int b) { int sum; sum = a + b; return sum; } 6
Programmer-Defined Functions Terminology • Function Prototype describes how a function is called int my_add_func(int, int); • Function Call result = my_add_func(5, X); • Function implementation int my_add_func(int a, int b) { … } • Function parameters • Formal parameters • Actual parameter • Formal parameters must match with actual parameters in order, number and datatype. • If the type is not the same, type conversion will be applied (coercion of arguments). But this might cause some errors (doubleint) so you need to be careful! 7
Example: Pre-defined Functions So far, we used several pre-defined functions! #include <stdio.h> #include <math.h> int main(void) { double angle; printf(“Input angle in radians: \n“); scanf(“%lf”, &angle); printf(“The sine of the angle is %f\n“, sin(angle) ); return 0; } double sin(double radian); double sin(double radian) { /* details of computing sin */ } 8
Example: Programmer-defined Functions #include <stdio.h> int main(void) { double x1,y1,x2,y2, dist; printf(“Enter x1 y1 x2 y2 :”); scanf(“%lf %lf %lf %lf”, &x1,&y1,&x2,&y2); dist =sqrt(pow((x2-x1),2) + pow((y2-y1),2)); printf(“Distance is %lf\n”, dist); return 0; } #include <stdio.h> double distance(double, double, double, double); int main(void) { double x1,y1,x2,y2, dist; printf(“Enter x1 y1 x2 y2 :”); scanf(“%lf %lf %lf %lf”, &x1,&y1,&x2,&y2); dist = distance(x1,y1,x2,y2); printf(“Distance is %lf\n”, dist); return 0; } double distance(double x1, y1,x2,y2) { return sqrt(pow((x2-x1),2) + pow((y2-y1),2)); } 9
Exercise (6,8) (-3,5) (4,-1) • Suppose you are given the coordinate points of a triangle as shown above, write a program that can find the length of each edge… • User enters: (x1, y1), (x2, y2), and (x3, y3) 10
Value Returning Functions • Function returns a single value to the calling program • Function definition declares the type of value to be returned • A returnexpression; statement is required in the function definition • The value returned by a function can be assigned to a variable, printed, or used in an expression 11
Void Functions • A void function may be called to • perform a particular task (clear the screen) • modify data • perform input and output • A void function does not return a value to the calling program • A return; statement can be used to exit from function without returning any value 12
Exercise: void function #include <stdio.h> void print_i_star(int i); main() { int i; for (i=1; i<=5; i++) { print_i_star( i ); } } void print_i_star(int i) { int j; for (j=1; j<=i; j++) printf(“*”); printf(“\n”); return; } • Write a program to generate the following output? * ** *** **** ***** for (i=1; i<=5; i++) { for (j=1; j<=i; j++) printf(“*”); printf(“\n”); } 13
Function name Return Type Parameter Declarations Declarations Statements Example: value returning function n!=n*(n-1)*…*1, 0! = 1 by definition int fact(int n) { int factres = 1; while(n>1) { factres = factres*n; n--; } return(factres); } 14
Example – use fact() #include <stdio.h> int fact(int n); /* prototype */ int main(void) { int t= 5,s; s = fact(t) + fact(t+1); printf(“result is %d\n”, s); return 0; } Function call 15
Example – execution of factorial function (cont’d) fact( 5 ) int fact(int n) { int factres = 1; while(n>1) { factres = factres*n; n--; } return(factres); } 16
Example – execution of factorial function (cont’d) int fact(int n) { int factres = 1; while(n>1) { factres = factres*n; n--; } return(factres); } 17
Example – execution of factorial function (cont’d) #include <stdio.h> int fact(int n); /* prototype */ int main(void) { int t= 5,s; s = 120 + fact(t+1); printf(“result is %d\n”, s); return 0; } Function call 18
Example – execution of factorial function (cont’d) fact( 6 ) int fact(int n) { int factres = 1; while(n>1) { factres = factres*n; n--; } return(factres); } t+1 19
Example – execution of factorial function (cont’d) int fact(int n) { int factres = 1; while(n>1) { factres = factres*n; n--; } return(factres); } 20
Example – execution of factorial function (cont’d) #include <stdio.h> int fact(int n); /* prototype */ int main(void) { int t= 5,s; s = 120 + 720; printf(“result is %d\n”, s); return 0; } result is 840 21
Example – reuse of factorial function • Write a statement to compute Enter X, Z, K, D … y=(fact(X)+fact(Z)*5)/(fact(K)-fact(D)); 22
Example – reuse of factorial function in another function • Write a select function that takes n and k and computes “n choose k” where int select(int n, int k) { return fact(n)/(fact(n-k)*fact(k)); } 23
Exercise • Write a function to compute maximum and minimum of two numbers int max(int a, int b) { if (a > b) return a; else return b; } int min(int a, int b) { if (a < b) return a; else return b; } 25
Exercise • Are following calls to max function valid? • What will be the result? int max(int a, int b); int min(int a, int b); int main() { int x = 2, y = 3, z = 7, temp; temp = max(x,y); temp = max(4,6); temp = max(4,4+3*2); temp = max(x,max(y,z)); } 26
Example for void function void print_date(int mo, int day, int year) { /*output formatted date */ printf(“%i/%i/%i\n”, mo, day, year ); return; } 27
Exercise • Write a function that takes score as parameter and computes and returns letter grade based on the scale below. 80-100 A 60-79 B 40-59 C 0-39 D 28
Solution char get_letter_grade(int score) { char grade; if ((score >= 80) && (score <=100)) grade = 'A'; else if ((score >= 60) && (score <= 79)) grade = 'B'; else if ((score >= 40) && (score <= 59)) grade = 'C'; else if ((score >= 0) && (score <= 39)) grade = 'D'; return grade; } 29
Exercise • Write a function to compute logba double log_any_base(double a, double b) { return log(a)/log(b); } 30
Exercise: Trace functions • What is the output of the following program #include <stdio.h> int function1(int x) { x = 2; printf("Out1 = %d\n",x); return(x+1); } int main() { int x = 4, y; y = function1(x); printf("Out2 = %d\n",x); printf("Out3 = %d\n",y); return 0; } Output Out1 = 2 Out2 = 4 Out3 = 3 31
Exercise • What is the output of the following program #include <stdio.h> void function2() { printf("In function 2\n"); } void function1() { function2(); printf("In function 1\n"); } void function3() { printf("In function 3\n"); function2(); } int main() { function1(); function3(); return 0; } Output In function 2 In function 1 In function 3 In function 2 32
Parameter Passing • Call by value • formal parameter receives the value of the actual parameter • function can NOT change the value of the actual parameter (arrays are an exception) • Call by reference • actual parameters are pointers (ch 5 and 6) • function can change the value of the actual parameter 33
Scope of a function or variable • Scope refers to the portion of the program in which • It is valid to reference the function or variable • The function or variable is visible or accessible #include <stdio.h> int fact(int n); /* prototype */ int main(void) { int t= 5,s; s = fact(t) + fact(t+1); printf(“result is %d\n”, s); return 0; } int fact(int n) { int factres = 1; while(n>1) { factres = factres*n; n--; } return(factres); } 34
Scope of a function or variable • Same variable name can be used in different functions #include <stdio.h> int fact(int n); /* prototype */ int main(void) { int t= 5,s; s = fact(t) + fact(t+1); printf(“result is %d\n”, s); return 0; } int fact(int t) { int s = 1; while(t>1) { s = s*t; t--; } return(s); } 35
Scope • Local scope • a local variable is defined within a function or a block and can be accessed only within the function or block that defines it • Global scope • a global variable is defined outside the main function and can be accessed by any function within the program file. 36
Global vs Local Variable #include <stdio.h> int z = 2; void function1() { int a = 4; printf("Z = %d\n",z); z = z+a; } int main() { int a = 3; z = z + a; function1(); printf("Z = %d\n",z); z = z+a; return 0; } Output Z = 5 Z = 9 37
Storage Class - 4 types Storage class refers to the lifetime of a variable • automatic - key word auto - default for local variables • Memory set aside for local variables is not reserved when the block in which the local variable was defined is exited. • external - key word extern - used for global variables • Memory is reserved for a global variable throughout the execution life of the program. • static - key word static • Requests that memory for a local variable be reserved throughout the execution life of the program. The static storage class does not affect the scope of the variable. • register - key word register • Requests that a variable should be placed in a high speed memory register. 38
void fun () { int a=6; a = a + 1; printf ("\nInside fun a = %d ", a); } void fun1 () { static int a; a = a + 1; printf ("\nInside fun1 a = %d ", a); } void fun (void); void fun1 (void); void fun2 (void); int count1=20; int main () { int count=5; fun (); fun (); fun1 (); fun1 (); fun2 (); fun2 (); printf ("\nIn main count = %d count1 = %d\n\n",count, count1); return 0; } void fun2 () { int count=10; count = count + 1; count1 = count1 + 1; printf ("\nInside fun2 count = %d count1=%d ", count, count1); }
4.4 Random Numbers • What is a random number? • Tossing a coin (0, 1) Rolling a die (1, 2,…6) • Min, Max, Avg, possible outcomes are equally likely or not, • Engineering problems require use of random numbers • How can you compute the area of an irregular shape? 41
Uniform Random numbers • All outcomes are equally likely • For example fair die, where each outcome has the same probability of 1/6, • So we can generate uniform random numbers between 1 and 6 by rolling a die. • What if we need random numbers in another range? For example, 1 and 100? 42
Uniform Random numbers (cont’d) • In Standard C library, we have a function rand() to generate random numbers between 0 and RAND_MAX • RAND_MAX is a system dependent constant (e.g., 32,767) defined in stdlib.h • What will be the output of the following printf(“%d %d %d\n”,rand(), rand(), rand()); • What will be the output, if we re-run the same program? 43
Pseudo-random Numbers • Computers generate random numbers using a seed number and an algorithm. • So, if you give the same seed, you will always get the same sequence of pseudo-random numbers • In Standard C library, we have a function srand(int seed) to give a new seed number 44
Example: generate 10 RNs #include <stdio.h> #include <stdlib.h> int main(void) { /* Declare variables. */ unsigned int seed; int k; /* Get seed value from the user. */ printf("Enter a positive integer seed value: \n"); scanf("%u",&seed); srand(seed); /* Generate and print ten random numbers. */ printf("Random Numbers: \n"); for (k=1; k<=10; k++) printf("%i ",rand()); printf("\n"); /* Exit program. */ return 0; } 45
RNs in a specified range [a b] • Generate a RN between 0 and 7 x = rand() % 8; • Generate a RN between 10 and 17 x = 10 + rand() % 8; int rand_int(int a,int b) { return rand()%(b-a+1) + a; } 46
Floating-Point RNs in a specified range [a b] • x = rand() / RAND_MAX will give a random number between 0.0 and 1.0 • x = rand() / RAND_MAX *(b-a) will give a RN between 0.0 and b-a • The value is then shifted into range [a b] by adding a double rand_float(double a,double b) { return ((double)rand()/RAND_MAX)*(b-a)+a; } 47
Example: HiLo Game /* Write a program that allows a user to play HiLo game. User wins if he/she can guess the number between 1-100 within at most 6 iterations */ #include <stdio.h> #include <stdlib.h> int rand_int(int a,int b); /* prototype */ void playHiLo( int s); int main(void) { unsigned int seed; /* Declare variables */ int secret; printf("Enter a positive integer seed value: \n"); scanf("%u",&seed); srand(seed); while(1){ secret = rand_int(1,100); playHiLo(secret); } return 0; } 48
int rand_int(int a,int b) { return rand()%(b-a+1) + a; } void playHiLo(int s) { int i, guess; for(i=1; i <=6; i++){ printf("Enter your guess : "); scanf("%d", &guess); if (guess > s) printf("It is Higher than secret\n"); else if (guess < s) printf("It is Lower than secret\n"); else { printf("Cong! you won\n"); return; } } printf("Sorry! Try again\n"); return; } 49
Exercise: Another “guess the number game” • Computer selects a random number s between [1000 9999] • User tries to guess it by entering g • Computer tells how many digits are in place, out of place, not in secret number • For example, if s is 6234 • User enters g as 7436, then computer says • 1 digit is in place • 2 digits are out of place • 1 digit is not in secret number • User keeps trying until he finds the secret number 50