1 / 62

Chapter 7 Functions

Chapter 7 Functions. Dale/Weems/Headington. Tópicos Capítulo 7. Writing a Program Using Functional Decomposition Writing a Void Function for a Task Using Function Arguments and Parameters Differences between Value Parameters and Reference Parameters Using Local Variables in a Function

holland
Download Presentation

Chapter 7 Functions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 7Functions Dale/Weems/Headington

  2. Tópicos Capítulo 7 • Writing a Program Using Functional Decomposition • Writing a Void Function for a Task • Using Function Arguments and Parameters • Differences between Value Parameters and Reference Parameters • Using Local Variables in a Function • Function Preconditions and Postconditions

  3. Funciones • Cada programa en C++ debe tener una función llamada “main” • La ejecución del programa siempre comienza con la función “main” • Cualquier otra función es un subprograma y necesita ser invocada (llamada)

  4. Function Calls (Llamadas de Funciones) Una función llama a otra utilizando el nombre de la función llamada seguido de los paréntesis () los cuales podrían incluir una lista de argumentos. Una llamada de función (“function call”) transfiere temporeramente control de la función que invoca a la función invocada.

  5. Function Call Syntax FunctionName ( Argument List ) La lista de argumentos (“argument list”) es una forma de las funciones poder comunicarse entre si y de pasar información. La lista de argumentos (“argument list”) puede contener o, 1 o más argumentos separados por coma, dependiendo de la función.

  6. Las Dos Partes de la Definición de una Función int Cube ( int n )heading { body return n * n * n ; }

  7. ¿Qué es el “heading”? Lista de parametros tipo de valor que devuelve nombre de la función int Cube ( int n )

  8. ¿ Qué es un prototipo (“prototype”)? Un prototipo se ve similar al “heading”, sin embargo termina con un punto y coma (;) y se necesita identificar en el, los tipos de datos de los parámetros que va a utilizar la función como tal. int Cube( int );// prototype

  9. Cuando se invoca una función… Se define una memoria temporera ( para los valores de los parámetros y cualquier variable local. También se define para el valor que devuelve si la función no es “void”). Entonces el flujo de control pasa al primer enunciado (“statement”) en el cuerpo (“body”) de la función invocada. Las demas instrucciones del cuerpo son invocadas hasta que ocurre una de las siguientes condiciones: return statement (con o sin un “return value”), or, se encuentra las llaves que indican el final del “body”. Entonces el control se devuelve a la función que invoco.

  10. #include <iostream> usingnamespace std; int Cube ( int ) ; // prototype void main ( ) { intyourNumber ; arguments intmyNumber ; yourNumber = 14 ; myNumber = 9 ; cout << “My Number = “ << myNumber ; cout << “its cube is “ << Cube (myNumber)<< endl ; cout << “Your Number = “ << yourNumber ; cout << “its cube is “ << Cube (yourNumber)<< endl ; }

  11. Para Compilar exitosamente… • Antes de que se invoque una función en el programa, el compilador debe procesar previamente el prototipo de la función o la definición de la función (“heading and body”)

  12. Una función de C++ puede devolver • En su enunciado, un valor del tipo especificado (llamado “return type”) en su “heading” y “prototype”. • Sin embargo, una función “void” no puede devolver ningún valor en sus enunciados.

  13. Escribir una función “void” llamada DisplayMessage ( ) que sea invocada de la función main ( ) para describir el índice de contaminación el cual recibe como parámetro. Tu ciudad clasifica los niveles de contaminación como: Menor que 35 como “Placentero”, 35 a 60 como “Desagradable”, y sobre 60 como “Peligroso”

  14. parametro void DisplayMessage( intindex ) { if ( index < 35 ) cout << “Pleasant”; else if ( index <= 60 ) cout << “Unpleasant”; else cout << “Health Hazard”; }

  15. Resto del Programa #include <iostream> using namespace std; voidDisplayMessage (int);// prototype int main ( ) argument { int pollutionIndex; cout << “Enter air pollution index”; cin >> pollutionIndex; DisplayMessage(pollutionIndex);// call return 0; } 15

  16. return; • Es válido solamente en el “body block”de las funciones que no sean “void” • Causa que el control deje la función y vuelva al bloque que la llamo dejando las subsequentes instruciones (si quedaban) sin ejecutarse.

  17. Los “Header files” contienen declaraciones de… • Definir constantes como.. const int INT_MAX = 32767; • Prototipos de funciones como… float sqrt( float ); • clases como…. string, ostream, istream • Objetos como…. cin, cout

  18. Programa con varias Funciones function prototypes main function Square function Cube function

  19. Funciones que devuelven un valor #include <iostream> int Square ( int ) ;// prototypes int Cube ( int ) ; using namespace std; int main ( ) { cout << “The square of 27 is “ << Square (27)<< endl; // function call cout << “The cube of 27 is “ << Cube (27)<< endl; // function call return 0; } 19

  20. Resto del Programa int Square ( intn )// header and body { return n * n; } int Cube ( intn )// header and body { return n * n * n; }

  21. Una función “void” se invoca ella sola #include <iostream> voidDisplayMessage ( int ) ; // prototype using namespace std; int main ( ) argument { DisplayMessage(15);// function call cout << “Good Bye“ << endl; return 0; } 21

  22. Una función “void” no devuelve un valor parameter void DisplayMessage ( intn ) { cout << “I have liked math for “ << n << “ years” << endl ; return ; }

  23. Lista de Parametros • Es el medio que utiliza una función para compartir datos con el bloque que contiene la llamada

  24. Clasificación por Localización Argumentos Parametros Siempre aparecen en el “function call“ dentro del bloque que llama. Siempre aparece en la función “heading”, o en la función “prototype”.

  25. Algunos Términos importantes • use el termino “actual parameters” para los argumentos • algunos libros se refieren a los parámetros como “formal parameters”.

  26. 4000 Argumento en el Bloque que llama 25 age “Value Parameter”“Reference Parameter” La dirección de memoria (4000) del argumento se pasa a la función cuando es invocada. El valor (25) del argumento se pasa a la función Cuando es invocada. En este caso, el argumento puede ser una variable, constante, o expresión. En este caso, el argumento debe ser una variable. 26

  27. Por “default”, los parametros…simples (como int, char, float, double) son siempre parametros por valor (“value parameters”), a menos que se haga algo para cambiar eso. Para obtener un parámetro por referencia (“reference parameter”) se necesita poner un & despues de tipo de dato en la función “heading” y “prototype”.

  28. Cuando usar Parámetros por Referencia (“Reference Parameters”) • Los parámetros por referencia deben ser usados cuando se quiere modificar el valor de una de las variables del bloque que invoca sin que se asigne el valor al volver de la llamada.

  29. Utilizar un Parámetro por Referencia • Es como darle a alguien la llave de la casa. • La llave puede ser usada por la otra persona para cambiar el contenido de la casa.

  30. 4000 25 age MEMORIA EN EL “MAIN PROGRAM” Si sólo se pasa una copia del valor 25 a una función, se le llama “pass-by-value”y la función no será capaz de cambiar el contenido de age. Seguirá siendo 25 cuando el control vuelva a la función que invoco.

  31. 4000 25 age MEMORIA EN EL “MAIN PROGRAM” PERO, si pasas la dirección (4000), de age a la función, se le llama “pass-by-reference”y la función será capaz de cambiar el contenido de age. Puede ser 23 o 90 cuando se devuelva el control.

  32. “Pass-by-reference” también se le llama . . . • “pass-by-address”, o • “pass-by-location”

  33. Ejemplo de “Pass-by-Reference” Queremos encontrar 2 raizes cuadradas de una ecuación cuadrática con coeficientes a,b,c. Escribiremos un prototipo para una función “void” llamada GetRoots( ) con 5 parámetros. Los primeros 3 parámetros son tipo float. Los próximos 2 son parámetros por referencia de tipo float.

  34. // prototype void GetRoots ( float , float , float , float& , float& ); Ahora escribiremos la definición de la función utilizando esta información. Esta función usa 3 valores de entrada (a,b,c) que vienen del bloque que invoca. Calcula como resultado dos valores que tiene que devolver. Esos valores son las dos raizes cuadradas de la ecuación cuadrática con coeficientes a,b,c.

  35. Definición de la Función void GetRoots( floata, floatb, floatc, float& root1, float& root2){floattemp; // local variabletemp = b * b - 4.0 * a * c;root1 = (-b + sqrt(temp) ) / ( 2.0 * a );root2 = (-b - sqrt(temp) ) / ( 2.0 * a ); return;} 35

  36. #include <iostream> #include <fstream> #include <cmath> voidGetRoots(float, float, float, float&, float&); usingnamespace std; void main ( ) { ifstream myInfile; ofstream myOutfile; floata, b, c, first, second; intcount = 0; ...... // open files while ( count< 5 ) { myInfile >> a >> b >> c; GetRoots(a, b, c, first, second); //call myOutfile << a << b << c << first << second << endl; count++ ; } // close files ...... } 36

  37. “Pass-by-value” “incoming” value of argument CALLING BLOCK FUNCTION CALLED

  38. “incoming” valor original del argumento “Pass-by-reference” CALLING BLOCK FUNCTION CALLED “outgoing” Valor cambiado del argumento O,

  39. “Pass-by-reference” El argumento no tiene valor todavía cuando ocurre la llamada CALLING BLOCK FUNCTION CALLED “outgoing” Nuevo valor del argumento

  40. El Flujo de Datos Determina el Mecanismo para pasar los Datos Parameter Data Flow Passing-Mechanism Incoming /* in */ Pass-by-value Outgoing /* out */ Pass-by-reference Incoming/outgoing Pass-by-reference /* inout */

  41. Preguntas • ¿Porqué se utlizan las funciones para las tareas? Para acortar la cantidad de detalles en el modulo principal (encapsulation). • ¿Puede una función llamar a otra función? Si • ¿Puede una función llamarse a si misma? Si, eso se llama recursión.

  42. Más Preguntas • ¿Hace diferencia los nombres que se utilizan para los parámetros? • NO. Solo se utilizan en el “body”. • ¿Los nombres de los parámetros y argumentos tienen que ser los mismos? NO. • ¿ Qué ventaja hay en eso? Ninguna, eso tiende a confundir.

  43. Ejemplo – escribe el prototipo y definnición de función para… • Una función void llamadaGetRating( ) con un parámetro de referencia de tipo char • La función repetídamente pide al usuario que entre un caracter por el teclado hasta que una de estas letras se entre: E, G, A, P que representan “Excellent”, ”Good”, ”Average”, ”Poor”.

  44. void GetRating( char& ); // prototype void GetRating (char& letter) { cout << “Enter employee rating.” << endl; cout << “Use E, G, A, or P : ” ; cin >> letter; while ( (letter != ‘E’) && (letter != ‘G’) && (letter != ‘A’) && (letter != ‘P’) ) { cout << “Rating invalid. Enter again: ”; cin >> letter; } } 44

  45. ¿Qué es un driver? • Es un programa corto (main) cuyo único propósito es llamar una función que se haya escrito. De este modo se puede determinar si cumple con las especificaciones y trabaja como se desea. • Escriba un “driver”para la función GetRating( )

  46. #include <iostream> voidGetRating( char& ); // prototype usingnamespace std; int main( ) {charrating; rating = ‘X’; GetRating(rating);// call cout << “That was rating = “ << rating << endl; return 0; } 46

  47. Un “Assertion” • es un “truth-valued statement”que puede ser cierto o falso (no necesariamente in código de C++) EJEMPLOS studentCount > 0 sum is assigned && count > 0 response == ‘y’ or ‘n’ 0.0 <= deptSales <= 25000.0 beta == beta @ entry * 2

  48. “Preconditions” y “Postconditions” • El “precondition” es un “assertion” que describe todo lo que la función requiere para ser cierto al momento de la función ser invocada. • El “postcondition” describe el estado en el momento que la función termina de ejecutarse. • El que llama es responsable de cotejar la “precondition”, y la función llamada, la “postcondition”. EJEMPLO . . .

  49. Function con “Postconditions” void GetRating ( /* out */char& letter) // Precondition: None // Postcondition: User has been prompted to enter a character // && letter == one of these input values: E,G,A, or P { cout << “Enter employee rating.” << endl; cout << “Use E, G, A, or P : ” ; cin >> letter; while ( (letter != ‘E’) && (letter != ‘G’) && (letter != ‘A’) && (letter != ‘P’) ) { cout << “Rating invalid. Enter again: ”; cin >> letter; } } 49

  50. Función con Preconditions y Postconditions void GetRoots( /* in */ floata, /* in */ floatb, /* in */ floatc, /* out */ float& root1, /* out */ float& root2 ) // Precondition: a, b, and c are assigned // && a != 0 && b*b - 4*a*c != 0 // Postcondition: root1 and root2 are assigned // && root1 and root2 are roots of quadratic with coefficients a, b, c {floattemp; temp = b * b - 4.0 * a * c; root1 = (-b + sqrt(temp) ) / ( 2.0 * a );root2 = (-b - sqrt(temp) ) / ( 2.0 * a ); return; } 50

More Related