250 likes | 389 Views
Week 6 – Functions (2). Outline. Recall - sample application functions that do not return value functions that return a value Recall – global variable vs. local variable Passing parameters in functions :- Pass by value Functions that return more than one value
E N D
Week 6 – Functions (2) PGT 106 - C Programming
Outline • Recall - sample application • functions that do not return value • functions that return a value • Recall – global variable vs. local variable • Passing parameters in functions :- Pass by value • Functions that return more than one value • Sample application-functions that return more than one value • Passing parameters in functions :- Pass by reference • Sample application • Recursive function PGT 106 - C Programming
Sample application • Write a C program that reads item code and quantity, then calculates the payment. Use functions: • fnMenu – print item code menu • fnDeterminePrice – determine price based on item code • fnCalc-calculate payment • fnPrintResult– print payment Think!! Which function returns no value and which function returns a value. What argument names do I want to feed in as parameters and what to return??
Sample application #include <stdio.h> void fnMenu(); float fnDeterminePrice(int); float fnCalc(float,int); void fnPrintResult(float); int main() { int iCode,iQty; float fPrice,fPay; fnMenu(); printf("Enter item code and quantity: "); scanf("%d %d", &iCode,&iQty); fPrice = fnDeterminePrice(iCode); fPay = fnCalc(fPrice,iQty); fnPrintResult(fPay); return 0; } PGT 106 - C Programming
Code Item Price 1 Papaya 1.00 2 Melon 2.00 3 Durian 3.00 Others 4.00 Enter item code and quantity: 1 3 Payment is 3.00 *************************** Code Item Price 1 Papaya 1.00 2 Melon 2.00 3 Durian 3.00 Others 4.00 Enter item code and quantity: 9 3 Payment is 12.00 void fnMenu() { printf("Code\tItem\tPrice\n"); printf("1\tPapaya\t1.00\n"); printf("2\tMelon\t2.00\n"); printf("3\tDurian\t3.00\n"); printf("\tOthers\t4.00\n"); } float fnDeterminePrice(int iItemCode) { float fPricing; switch(iItemCode) { case 1:fPricing = 1.00;break; case 2:fPricing = 2.00;break; case 3:fPricing = 3.00;break; default:fPricing = 4.00; } return(fPricing); } float fCalc(float fItemPrice, int iQuality) { float fTotal; fTotal = fItemPrice*iQuantity; return(fTotal); } void fnPrintResult(float fPayment) { printf("Payment is %.2f\n", fPayment); }
#include <stdio.h> void fnMenu(); float fnDeterminePrice(int); float fnCalc(float,int); void fnPrintResult(float); int iCode,iQty; float fPrice,fPay; int main() { fnmenu(); printf("Enter item code and quantity:"); scanf("%d %d", &iCode,&iQty); fPrice= fnDeterminePrice(iCode); fPay=fnCalc(fPrice,iQty); fnPrintResult(fPay); return 0; } void fnMenu( ) { printf("Code\tItem\tPrice\n"); printf("1\tPapaya\t1.00\n"); printf("2\tMelon\t2.00\n"); printf("3\tDurian\t3.00\n"); printf("\tOthers\t4.00\n"); } float fnDeterminePrice(int iCode) { iCode--; switch(iCode) { case 1:fPrice=1.00;break; case 2:fPrice=2.00;break; case 3:fPrice=3.00;break; default:fPrice=4.00; } return(fPrice); } float fnCalc(float fPrice,int iQuantity) { fPay=fPay+1; fPay=fPrice*iQuantity; return(fPay); } void fnPrintResult(float fPay) { printf("Payment is %.2f\n", fPay); } Global Variable vs. Local Variable Output: Code Item Price 1 Papaya 1.00 2 Melon 2.00 3 Durian 3.00 Others 4.00 Enter item code and quantity: 1 4 Payment is 16.00 Output: Code Item Price 1 Papaya 1.00 2 Melon 2.00 3 Durian 3.00 Others 4.00 Enter item code and quantity: 3 1 Payment is 2.00 modification However, sometimes we need to do some modifications from inside a function; using global variable will make things worse!!! PGT 106 - C Programming
Pass by Value • If a parameter is passed by value, then the value of the original data is copied into the function’s parameter (scope: local variable(s)) • In other words, it (i.e. local variable) has its own copy of the data • changes to copy do not change original data • During program execution, it (i.e. local variable) will manipulate the data stored in its own memory space PGT 106 - C Programming
#include <stdio.h> void fnFun1(int,int);//function prototype int main(void) { int iA=5, iB=10; printf("Before fun 1\n“); printf(" iA = %d iB = %d\n”, iA,iB); fnFun1(iA, iB); //function call printf("\nAfter fun 1\n“); printf(" iA = %d iB = %d\n”, iA,iB); return 0; } void fnFun1(int iAA,int iBB)//function definition { iAA++; iBB--; printf("\n\nInside fun 1\n)"; printf(“iAA = %d iBB = %d\n”, iAA,iBB); } Output Before fnFun 1 iA = 5 iB = 10 Inside fnFun 1 iAA = 6 iBB = 9 After fnFun 1 iA = 5 iB = 10 Pass by Value (Example) PGT 106 - C Programming
Functions that return more than one value • When we talk about functions that return more than onevalue it also means that we want to pass arguments by reference • passes addresses (references), NOT value or data • allows direct manipulation • changes will affect original data PGT 106 - C Programming
Functions that return more than one value • There are cases where you need to manipulate the value of an external variable from inside a function, thus we pass the value by reference PGT 106 - C Programming
Sample application • Write a C program that calculates and prints average of 2 test marks. • Your program should have functions: • fnReadMarks – read 2 test marks • fnCalcAvg – calculate average of two test marks • fnPrint - print average PGT 106 - C Programming
#include <stdio.h> void fnReadMarks(float*,float*); float fnCalcAvg(float,float); void fnPrint(float); int main(void) { float fMarks1, fMarks2, fAvg; fnReadMarks(&fMarks1,&fMarks2); fAvg = fnCalcAvg(fMarks1,fMarks2); fnPrint(fAvg); return 0; } void fnReadMarks(float *fM1,float *fM2) { printf("Enter marks for test1 and test2 : "); scanf("%f %f", fM1,fM2); //notice no & } float fnCalcAvg(float fM1, float fM2) { return((fM1 + fM2)/2); } void fnPrint(float fAverage) { printf("\nAverage marks are :%.2f\n",fAverage); } Sample application Function that returns more than one value - arguments are passed by reference Output Enter marks for test1 and test2 : 70 80 Average marks are : 75.00 PGT 106 - C Programming
Pass by Reference • A function’s parameter that receives the location (memory address) of the corresponding actual variables • When we attach * (star) after the arg_type in the parameter list of a function, then the variable following that arg_type is passed by reference • It stores the address of the actual variable, NOT the value • During program execution to manipulate the data, the address stored will direct control to the memory space of the actual variable • Syntax: • In function protoype and function definition, put the * (star) after the data type Example : void fnReadMarks(float *,float *); • In function call, put the &(ampersand) before the argument name to be passed by reference Example : fnReadMarks(&fMarks1,&fMarks2); PGT 106 - C Programming
Pass by Reference • Pass by reference is useful in two situations: • when you want to return more than one value from a function • when the value of the actual parameter needs to be changed PGT 106 - C Programming
Sample application • Write a C program that reads character and calculates numbers of vowel and consonant • Your program should have function: • fnRead – read character • fnFindCountVC – determine and calculate number of vowel or consonant • fnPrint - print number of vowel or consonant PGT 106 - C Programming
#include <stdio.h> #include <string.h> char fnRead(); void fnFindCountVC(char, int*, int*); void fnPrint(int,int); int main() { char cCh, cChoice; int iCountV=0, iCountC=0; do { cCh = fnRead(); fnFindCountVC(cCh, &iCountV, &iCountC); printf("Do you want to continue? "); scanf("%c", &cChoice); getchar(); }while((cChoice == 'y') ||(cChoice =='Y')); fnPrint(iCountV,iCountC); return 0; } char fnRead() { char cCh1; printf("Enter character : "); scanf("%c", &cCh1); getchar(); return(cCh1); } void fnFindCountVC(char cCh1, int *iVowel, int *iConsonant) { switch(cCh1) { case 'A': case 'a': case 'E': case 'e': case 'I': case 'i': case 'O': case 'o': case 'U': case 'u': *iVowel = *iVowel +1;break; default: *iConsonant = *iConsonant + 1; } } void fnPrint(int iVowel, int iConsonant) { printf("Number of vowel : %d\n", iVowel); printf("Number of consonant : %d\n", iConsonant); } Enter character : f Do you want to continue?y Enter character : I Do you want to continue?y Enter character : k Do you want to continue?n Number of vowel : 1 Number of consonant : 2 Sample application Functions that “return” more than one value i.e. arguments are passed by reference
#include <stdio.h> void fnFun1(int, int*); //function prototype int main(void) { int iA=5,iB=10; printf("Before fun 1\n”); printf(“iA = %d iB = %d”,iA,iB); fnFun1(iA, &iB); //function call printf(“\n\nAfter fun 1\n”); printf(“iA = %d iB = %d\n”,iA,iB); return 0; } void fnFun1(int iAA, int * iBB)//function definition { iAA++; *iBB--; printf("\n\nInside fun 1\n”); printf(“iAA = %d iBB = %d”,iAA,iBB); } Output Before fun 1 iA=5 iB = 10 Inside fun 1 iAA = 6 iBB = 9 After fun 1 iA = 5 iB = 9 Pass by Reference (Example) PGT 106 - C Programming
Recursive Functions • Recursion is a term describing functions which are called by themselves (functions that call themselves) • Recursive function has two parts i.e. base case and not base case • If not base case, the function breaks the problem into a slightly smaller, slightly simpler, problem that resembles the original problem and • Launches a new copy of itself to work on the smaller problem, slowly converging towards the base case • Makes a call to itself inside the return statement • Eventually the base case gets solved and then that value works its way back up to solve the whole problem • Recursion is very useful in mathematical calculations and in sorting of lists PGT 106 - C Programming
Recursive Functions • Example: factorial n! = n * ( n – 1 ) * ( n – 2 ) * … * 1 • Recursive relationship: • ( n! = n * ( n – 1 )! ) • 5! = 5 * 4! • 4! = 4 * 3!… • Base case (1! = 0! = 1) PGT 106 - C Programming
Recursive Functions(Example) • Factorial 4 * 6 = 24 is returned Factorial(4) 3 * 2 = 6 is returned 4 * Factorial(3) 3 * Factorial(2) 2 * 1 = 2 is returned 2 * Factorial(1) Value 1 is returned 1 PGT 106 - C Programming
Recursive Functions(Example) • #include <stdio.h> • int fnFactorial(int); • void main() • { • int iN=4; • printf(“Factorial %d is %d“,n, fnFactorial(n)); • } • int fnFactorial(int iN) • { • if(iN <= 1) //base case • return 1; • else • return ( iN * fnFactorial(iN-1)); • } • Call function name itself PGT 106 - C Programming
Recursive Functions (Example) • Fibonacci series: 0, 1, 1, 2, 3, 5, 8... • Each number is the sum of two previous numbers • Example of a recursive formula: fib(n) = fib(n-1) + fib(n-2) PGT 106 - C Programming
f( 3 ) return f( 2 ) + f( 1 ) return f( 1 ) f( 0 ) return 1 + return 1 return 0 Recursive Functions (Example) • Diagram of Fibonacci function: PGT 106 - C Programming
Recursive Functions (Example) • Sample code for fibonacci function long fnFibonacci( long lN ) { if ( lN == 0 || lN == 1 ) //base case return lN; else return fnFibonacci( lN - 1 ) + fnFibonacci( lN – 2 ); } PGT 106 - C Programming
End Week 6 – Functions (2) Q & A! PGT 106 - C Programming