250 likes | 325 Views
Functions. Why use functions?. They can break your problem down into smaller sub-tasks (modularity). easier to solve complex problems They make a program much easier to read and maintain abstraction – we don’t have to know how a function is implemented to use it (printf, scanf, etc.).
E N D
Why use functions? • They can break your problem down into smaller sub-tasks (modularity). • easier to solve complex problems • They make a program much easier to read and maintain • abstraction – we don’t have to know how a function is implemented to use it (printf, scanf, etc.). • Generalize a repeated set of instructions • we don’t have to keep writing the same thing over and over .
Functions • A group of declarations and statements that is assigned a name • effectively, a named statement block . • usually return a value • A sub-program • when we write our program we always define a function named main • inside main we can call other functions • which can themselves use other functions, and so on…
Example - Square #include <stdio.h> double square(double a) { return a*a; } void main() { double num; printf("enter a number\n"); scanf("%lf",&num); printf("square of %g is %g\n",num,square(num)); } This is a function defined outside main Here is where we call the function square
Characteristics of Functions returnType name(argType1arg_name1, argType2,arg_name2, …) { function body; return value; }
Return Statement • Return causes the execution of the function to terminate and usually returns a value to the calling function. • The type of the value returned must be the same as the return-type defined for the function (or a ‘lower’ type). • If no value is to be returned, the return-type of the function should be set to ‘void’.
Factorial calculation example #include <stdio.h> int factorial(int n) { inti, fact = 1; for (i=2; i<=n; i++) fact *= i; return fact; } void main() { int num; printf("enter a number\n"); scanf("%d",&num); printf(“The factorial of %d is %d\n",num,factorial(num)); }
A Detailed Example Write a program that receives a nominator and a denominator from the user, and displays the reduced form of the number. For example: if the input is 6 and 9, the program should display 2/3.
Example – solution (step I) #include <stdio.h> int main(void) { int n, d; printf("Please enter nominator and denominator: "); scanf("%d%d", &n, &d); Calculate n’s and d’s Greatest Common Divisor printf("The reduced form of %d/%d is %d/%d", n, d, n/gcd, d/gcd); return 0; }
Example – solution (step II) #include <stdio.h> int main(void) { int n, d, g; printf("Please enter nominator and denominator: "); scanf("%d%d", &n, &d); g = gcd(n, d); printf("The reduced form of %d/%d is %d/%d", n, d, n/g, d/g); return 0; }
Example – solution (step III) /* Returns the greatest common divisor of its two parameters. Assumes both are positive. The function uses the fact that if r = mod(y, x) then the gcd of y and x equals the gcd of x and r. */ int gcd(int x, int y) { int tmp; while(x > 0) { tmp = x; x = y % x; y = tmp; } return y; }
The Great Void • Sometimes there’s no reason for a function to return a value • In these cases, the function return type should be ‘void’ • If the ‘return’ keyword is used within such a function it exits the function immediately. No value needs be specified. • If the function receives no parameters, the parameter list should be replaced by ‘void’.
Pass-by-value • Function arguments are passed to the function by copying their values rather than giving the function direct access to the actual variables • A change to the value of an argument in a function body will not change the value of variables in the calling function
Scope of variables • The scope of a variable is the boundaries within which it can be used in a program. • Normally variables are local in scope - this means they can only be used in the function where they are declared. • A variable declared within a function is unrelated to variables declared elsewhere, even if they have the same name • Global variables can be declared , which can be used in any function. • Global variables are a BAD PRACTICE.
Wrong way to do it int add_one(int b) { a=b+1; } void main() { int a=34,b=1; add_one(b); printf("a = %d, b = %d\n", a, b); return 0; }
Function swap void swap(int x, int y){ int temp; temp = x; x = y; y = temp; } void main() { int a=7,b=8; printf("a = %d, b = %d\n", a, b); swap(a,b); printf("a = %d, b = %d\n", a, b); }
Bad global variable use example #include<stdio.h> void printRow(int); int i, size; void main() { printf(“Please enter a size:\n”); scanf(“%d”, &size); for (i = 1; i <= size; i++) printRow(i); } void printRow(int length) { for(i = length; i <= size; i++) printf("*"); printf("\n"); } Variables here are global This program only prints ONE row of stars
Function Declaration • Most software projects in C are composed of more than one file. • We want to be able to define the function in one file, and to use it in all files. • For this reason, the function must be declared in every file in which it’s called, before it’s called for the first time. • the declaration contains: • the function name . • the data types of the arguments (their names are optional) . • the data type of the return value .
Function Declaration • stdio.h actually contains a large set of function declarations • The #include directive tells the compiler to insert these declarations into the file, so that these functions could be called
Function Declaration - Prototype #include <stdio.h> int factorial(int a); /* Function Declaration! – Prototype */ void main(){ int num; printf("enter a number\n"); scanf("%d",&num); printf("%d!=%d\n",num,factorial(num)); } int factorial(int a){ inti,b=1; for(i=1; i<=a; i++) b=b*i; return b; }
The math library • A collection of mathematical functions • Need to include the header file math.h (#include <math.h>) • Use functions of the library, e.g. double s,p; s=sqrt(p); • Declared in math.h : double sqrt ( double x );
The math library • sin(x), cos(x), tan(x) • x is given in radians • asin(x), acos(x), atan(x) • log(x) • sqrt(x) • pow(x,y) – raise x to the yth power. • ceil(x), floor(x) …and more
Passing arrays to functions • Functions can accept arrays as arguments. • Usually the array’s size also needs to be passed (why?). • For example - int CalcSum(int arr[], int size); • It is not necessary when the size of the array fix in a #define declaration. • Within the function, arr is accessed in the usual way.
Passing arrays to functions • Arrays can be passed to functions and have their values changed from within the function! • Unlike regular variables • This is possible because an array variable is actually an address and the function receive this address.
Two Dimensional Arrays • When passing a two-dimensional array to a function, it is necessary to indicate the size of the second dimension in the function header • But this does not mean the array’s size needn’t be passed as well int func(int arr[][4], int a); • Same was true when initializing the array double B[][2] = {{1,2}, {2,3}, {3,4}};