360 likes | 442 Views
Functions. Exercise 5. Functions. a group of declarations and statements that is assigned a name effectively, a named statement block usually has a value a sub-program when we write our program we always define a function named main inside main we can call other functions
E N D
Functions Exercise 5
Functions • a group of declarations and statements that is assigned a name • effectively, a named statement block • usually has 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; } int main(void) { double num; printf("enter a number\n"); scanf("%lf",&num); printf("square of %g is %g\n",num,square(num)); return 0; } This is a function defined outside main Here is where we call the function square
Why use functions? • they can break your problem down into smaller sub-tasks • easier to solve complex problems • generalize a repeated set of instructions • we don’t have to keep writing the same thing over and over • printf and scanf are good examples… • they make a program much easier to read and maintain
Characteristics of Functions return-type name(arg_type1arg_name1,arg_type2arg_name2, …) { function body; return value; } int main(void) { … } double square(double a) { return a*a; }
Return Statement • Return causes the execution of the function to terminate and 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)
Exercise Write a program that gets a positive integer from the user and prints all the prime numbers from 2 up to that integer. (Use a function that returns 1 if its parameter is prime, 0 otherwise)
Solution is_prime_func.c
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
The Great Void • Calling ‘return’ in a function returning void is not obligatory • If the function receives no parameters, the parameter list should be replaced by ‘void’ (or just nothing)
Example void ShowHelp(void) { printf("This function explains what this program does…\n"); printf("Yadayadayada"); /* ... */ } int main(void) { char choice; printf("Please enter your selection: "); scanf("%c", &choice); if (choice==‘h’) ShowHelp(); else if /* Program continues … */ }
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 • Example – add_one.c
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main()memory state a b 34 1
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main()memory state a b 34 1
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main() memory state a b 34 1 add_one memory state b 1
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main()memory state a b 34 1 add_onememory state b 2
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main() memory state a b 34 1 add_one memory state b 2
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main() memory state a b 2 1
add_one – step by step int add_one(int b) { b=b+1; return b; } int main(void) { int a=34,b=1; a = add_one(b); printf("a = %d, b = %d\n", a, b); return 0; } main() memory state a b 2 1
Riddle me this int main(void) { int n; printf("enter a number\n"); scanf("%d",&n); printf("%d!=%d\n", n, factorial(n)); /* What will this print? */ printf("n = %d\n", n); return 0; } #include<stdio.h> int factorial(int n) { int fact = 1; while(n>1) { fact *= n; n--; } returnfact; }
Scope of variables • A variable declared within a function is unrelated to variables declared elsewhere, even if they have the same name • A function cannot access variables that are declared in other functions • Example – scope.c
int do_something(void) { int a; printf("Entered do_something\n"); a = 7; printf("In do_something, a = %d\n", a); printf("Exiting do_something\n"); return a; } int main(void) { int res, a = 34; printf("Entered main\n"); printf("In main, a = %d\n",a); res = do_something(); printf("do_something returned %d\n", res); printf("In main, a = %d\n", a); printf("Exiting main...\n"); return 0; } Scope.c
Wrong way to do it int add_one(int b) { a=b+1; } int main(void) { int a=34,b=1; add_one(b); printf("a = %d, b = %d\n", a, b); return 0; }
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
Function Declaration • 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: return_type Function_name(argument types);
Function Declaration #include <stdio.h> int factorial(int a); /* Function Declaration! */ int main(void){ int num; printf("enter a number\n"); scanf("%d", &num); printf("%d != %d\n", num, factorial(num)); return 0; } int factorial(int a){ int i, b = 1; for(i = 1; I <= a; i++) b = b*i; return b; }
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
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
Exercise Write a function that uses the formula in order to approximate . The function should accept an argument n which determines the number of terms in the formula. It should return the approximation of . Write a program that gets an integer n from the user, and approximate using n terms of the above formula.
Solution pi.c
Exercise Modify the previous function that approximates . The function should accept an argument specifying the desired accuracy, and keep adding terms until the contribution of the next term drops below this level. Write a program that gets a (small) double epsilon from the user, and approximates within this function.
Solution pi_eps.c
The debugger • Some programs may compile correctly, yet not produce the desirable results. • These programs are valid and correct C programs, yet not the programs we meant to write! • The debugger can be used to follow the program step by step and may help detecting bugs in an already compiled program.
The debugger’s common features • Setting breakpoints (a point where the execution stops): bring the cursor to desired line and press the palm icon or F9. A dark red dot appears near the line. • Executing a debugged run: Build->start debug->go or F5. The program will run and stop at the first breakpoint.
The debugger’s common features (cont.) • Stopping at a specific line: Bringing the cursor to the line and press ctrl+F10, or Build->start debug->go to cursor. The program will stop at that point. • Stepping to the next line – F10. • Entering a function – F11. • Seeing variable values – quickwatch and/or debug window at the bottom. • The yellow arrow indicates our whereabouts at any given moment.