Tema 6: Funciones (ampliación) Fundamentos de Informática ETSID Víctor Braquehais
Tema 6: Funciones (ampliación) Indice <ul><li>Revisión de conceptos básicos </li></ul><ul><li>Paso de parámetros por valor...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>El uso de funciones en los programas (programación mo...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>Para poder diseñar un programa que utilice funciones…...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En la definición de una función indicamos… </li></ul>...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En la definición de una función indicamos… </li></ul>...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En la definición de una función indicamos… </li></ul>...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>Ejemplo: Función que calcule la longitud de una circu...
Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En el momento de la llamada a la función indicamos… <...
Tema 6: Funciones (ampliación)   Revisión de conceptos básicos <ul><li>En el ejemplo anterior, podríamos hacer multitud de...
Tema 6: Funciones (ampliación)   Revisión de conceptos básicos <ul><li>Parámetros formales : </li></ul><ul><li>Son los que...
Tema 6: Funciones (ampliación)   Revisión de conceptos básicos <ul><li>Parámetros actuales : </li></ul><ul><li>Son los que...
Tema 6: Funciones (ampliación)   Revisión de conceptos básicos <ul><li>En el momento de realizar la llamada a un módulo, y...
Tema 6: Funciones (ampliación)  Paso de parámetros por valor <ul><li>Paso de parámetros por valor </li></ul><ul><li>Se rea...
Tema 6: Funciones (ampliación)  Paso de parámetros por valor <ul><li>Paso de parámetros por valor </li></ul><ul><li>Se uti...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Paso de parámetros por referencia </li></ul><ul>...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Supongamos las siguientes definiciones: </li></u...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Desde el punto de vista de las definiciones de v...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Desde el punto de vista de memoria, cuando defin...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>En el momento de realizar la llamada a la funció...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Desde el punto de vista de memoria, hacemos la l...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Cuando la función se esté ejecutando: </li></ul>...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Conclusiones: </li></ul><ul><ul><li>El parámetro...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Ejemplo </li></ul><ul><li>Un módulo que lea un v...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Ejemplo (cont) </li></ul><ul><li>Las llamadas de...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Ejercicio propuesto </li></ul><ul><li>Diseñar un...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Ejercicio propuesto </li></ul><ul><li>Utilizar l...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Solución </li></ul><ul><li>#include <stdio.h> </...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Solución (cont) </li></ul><ul><li>void SumaMatri...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Solución (cont) </li></ul><ul><li>void VerMatriz...
Tema 6: Funciones (ampliación)  Paso de parámetros por referencia <ul><li>Solución (cont) </li></ul><ul><li>void main(){ <...
Tema 6: Funciones (ampliación)  Variables globales y locales <ul><li>Tipos de variables </li></ul><ul><li>Globales : defin...
Tema 6: Funciones (ampliación)  Variables globales y locales <ul><li>Ambito de las variables </li></ul><ul><li>¿Dónde pued...
Tema 6: Funciones (ampliación)  Variables globales y locales <ul><li>Nomenclatura de una variable </li></ul><ul><ul><li>Ha...
Tema 6: Funciones (ampliación)  Variables globales y locales <ul><li>Ejemplo </li></ul><ul><ul><li>#include <stdio.h> </li...
Tema 6: Funciones (ampliación)  Variables globales y locales <ul><li>Efectos laterales </li></ul><ul><ul><li>Se producen c...
Upcoming SlideShare
Loading in …5
×

vecma2

752 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
752
On SlideShare
0
From Embeds
0
Number of Embeds
105
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

vecma2

  1. 1. Tema 6: Funciones (ampliación) Fundamentos de Informática ETSID Víctor Braquehais
  2. 2. Tema 6: Funciones (ampliación) Indice <ul><li>Revisión de conceptos básicos </li></ul><ul><li>Paso de parámetros por valor </li></ul><ul><li>Paso de parámetros por referencia </li></ul><ul><li>Variables globales y locales </li></ul>
  3. 3. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>El uso de funciones en los programas (programación modular) hace que estos sean más… </li></ul><ul><ul><li>Entendibles </li></ul></ul><ul><ul><li>Reaprovechables </li></ul></ul><ul><ul><li>Compactos </li></ul></ul><ul><ul><li>Genéricos </li></ul></ul>
  4. 4. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>Para poder diseñar un programa que utilice funciones… </li></ul><ul><ul><li>Definición de la función : indicamos cuales son las instrucciones que realizará, los parámetros que recibe o su valor de retorno </li></ul></ul><ul><ul><li>Llamada o invocación a la función : ejecutamos las instrucciones previstas, actuando sobre datos determinados o aprovechando el valor que retorna (si procede) </li></ul></ul>
  5. 5. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En la definición de una función indicamos… </li></ul><ul><ul><li>Tipo de datos que revuelve : indicamos si devuelve o no un determinado tipo de datos (valor). Si no devuelve ningún valor se indica con void, en caso que devuelva algo, el tipo de datos básico (int, char, float) </li></ul></ul><ul><ul><li>Nombre de la función : necesario para hacer la llamada </li></ul></ul>
  6. 6. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En la definición de una función indicamos… </li></ul><ul><ul><li>Lista de parámetros formales (opcional) : si la función acepta parámetros, debemos indicar una lista con todos ellos, indicando para cada uno el tipo de datos y su nombre </li></ul></ul><ul><ul><li>Instrucciones : conjunto de instrucciones que realizará la función </li></ul></ul>
  7. 7. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En la definición de una función indicamos… </li></ul><ul><ul><li>Valor de retorno (opcional) : si la función devuelve algún valor de retorno, mediante la clausula return indicamos el valor que se devuelve al punto desde el que se ha realizado la llamada </li></ul></ul>
  8. 8. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>Ejemplo: Función que calcule la longitud de una circunferencia </li></ul><ul><ul><ul><li>float longitud (float r) </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><li>return 2*PI*r; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><li>La función realiza el cálculo a partir de un valor de “r” genérico </li></ul><ul><li>Vale para cualquier circunferencia </li></ul>
  9. 9. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En el momento de la llamada a la función indicamos… </li></ul><ul><ul><li>Nombre de la función : indicamos cual es la función a la que llamamos </li></ul></ul><ul><ul><li>Lista de parámetros actuales (opcional): entre paréntesis podemos incluir una lista con los valores, variables o expresiones que pasamos como parámetros a la función en cada llamada </li></ul></ul>
  10. 10. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En el ejemplo anterior, podríamos hacer multitud de llamadas a la misma función, obteniendo distintos resultados </li></ul><ul><li>void main() </li></ul><ul><li>{ </li></ul><ul><li>float x=10; </li></ul><ul><li>printf(“%f”,longitud(3)); /* radio 3 */ </li></ul><ul><li>printf(“%f”,longitud(x)); /* radio 10 */ </li></ul><ul><li>printf(“%f”,longitud(x*3)); /* radio 30 */ </li></ul><ul><li>} </li></ul>
  11. 11. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>Parámetros formales : </li></ul><ul><li>Son los que se indican en el momento de la definición del módulo </li></ul><ul><li>Las instrucciones del módulo actúan sobre ellos </li></ul><ul><li>Funcionalmente tienen el mismo significado que una variable (tipo de datos, espacio en memoria, etc...) </li></ul>
  12. 12. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>Parámetros actuales : </li></ul><ul><li>Son los que se indican en el momento de la llamada al módulo </li></ul><ul><li>Solo se requiere que sean del mismo tipo de datos que el parámetro formal en la definición del módulo </li></ul><ul><li>Pueden ser: valores fijos, variables o expresiones que se evaluen a dicho tipo de datos </li></ul>
  13. 13. Tema 6: Funciones (ampliación) Revisión de conceptos básicos <ul><li>En el momento de realizar la llamada a un módulo, y antes de comenzar a ejecutarse sus instrucciones, se realiza el paso de parámetros </li></ul><ul><li>Existen dos tipos: </li></ul><ul><ul><li>Por valor </li></ul></ul><ul><ul><li>Por referencia </li></ul></ul>
  14. 14. Tema 6: Funciones (ampliación) Paso de parámetros por valor <ul><li>Paso de parámetros por valor </li></ul><ul><li>Se realiza una asignación de los valores de los parámetros actuales sobre los formales </li></ul><ul><li>Si la llamada es: (suponer que x vale 10) </li></ul><ul><li>resultado = longitud( x*3 ); </li></ul><ul><ul><li>1) Se evalua x*3: 10*3 -> 30 </li></ul></ul><ul><ul><li>2) Se asigna el valor 30 al parámetro formal “ r ” (r=30) </li></ul></ul><ul><ul><li>3) Comienza a ejecutarse la función </li></ul></ul>
  15. 15. Tema 6: Funciones (ampliación) Paso de parámetros por valor <ul><li>Paso de parámetros por valor </li></ul><ul><li>Se utiliza cuando los parámetros que proporcionamos a una función en el momento de la llamada son (o se evaluan) a tipos de datos básicos: int, float, char </li></ul><ul><li>En el ejemplo anterior, el parámetro (x*3) es una expresión que se evalua y da un resultado entero (si x tiene el valor 10, se evalua a 30) </li></ul>
  16. 16. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Paso de parámetros por referencia </li></ul><ul><li>Se consigue que el parámetro formal referencie (apunte) al parámetro actual </li></ul><ul><li>Las instrucciones del módulo que modifiquen el valor del parámetro formal, están realmente modificando el parámetro actual (variable) </li></ul><ul><li>Este tipo de paso de parámetros se realiza cuando se pasan como parámetros variables estructuradas: vectores, matrices y estructuras </li></ul>
  17. 17. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Supongamos las siguientes definiciones: </li></ul><ul><ul><li>void LeerVector(int v[]) </li></ul></ul><ul><ul><li>{ int i; </li></ul></ul><ul><ul><li>for (i=0;i<5;i++){ </li></ul></ul><ul><ul><li>printf(“Dame un elemento: ”); </li></ul></ul><ul><ul><li>scanf(“%d”,&v[i]); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>int main(){ </li></ul></ul><ul><ul><li>int vector[5]; </li></ul></ul><ul><ul><li>Int edades[5]; </li></ul></ul><ul><ul><li>LeerVector(vector); </li></ul></ul><ul><ul><li>LeerVector(edades); </li></ul></ul><ul><ul><li>… /... </li></ul></ul>
  18. 18. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Desde el punto de vista de las definiciones de variables: </li></ul><ul><li>int v[5] </li></ul><ul><li>Es un vector de 5 enteros, parámetro formal de la función LeerVector </li></ul><ul><li>int vector[5] </li></ul><ul><li>Es un vector de 5 enteros, una variable del programa principal </li></ul><ul><li>Es decir, aparentemente son dos variables de tipo vector en nuestro programa </li></ul>
  19. 19. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Desde el punto de vista de memoria, cuando definimos: </li></ul><ul><li>int vector[5] </li></ul><ul><li>Reservamos 5 posiciones de memoria donde se almacenarán cada uno de los 5 numeros enteros de la variable vector </li></ul>vector MEMORIA reservada
  20. 20. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>En el momento de realizar la llamada a la función: LeerVector(vector) </li></ul><ul><ul><li>Le pasamos como parámetro la variable “vector”, es decir hacemos un paso de parámetros por referencia </li></ul></ul><ul><ul><li>Esto significa que el parámetro formal “v” va a referenciar (apuntar) a la misma posición de memoria del parámetro actual “vector” </li></ul></ul><ul><ul><li>Es decir, solo hay una variable vector, pero con dos nombres (“v” y “vector”) </li></ul></ul>
  21. 21. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Desde el punto de vista de memoria, hacemos la llamada a la función: </li></ul><ul><li>El parámetro formal (v) está utilizando las mismas posiciones de memoria que el parámetro actual (vector) </li></ul>vector MEMORIA v reservada
  22. 22. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Cuando la función se esté ejecutando: </li></ul><ul><li>Realiza operaciones sobre su parámetro formal (v), por ejemplo, asignaciones </li></ul><ul><li>Realmente está modificando el parámetro actual (vector) ya que utilizan la misma zona de memoria </li></ul>vector MEMORIA v reservada 3 7
  23. 23. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Conclusiones: </li></ul><ul><ul><li>El parámetro actual y el formal apuntan a la misma zona de memoria. Podemos ver esto como una sola variable con dos denominaciones </li></ul></ul><ul><ul><li>Al hacer modificaciones sobre el parámetro formal, realmente se están haciendo sobre el actual al mismo tiempo </li></ul></ul><ul><ul><li>Como el parámetro actual puede ser distinto en sucesivas llamadas a la función, el parámetro formal se empareja cada vez con un parámetro actual distinto </li></ul></ul>
  24. 24. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Ejemplo </li></ul><ul><li>Un módulo que lea un vector de enteros </li></ul><ul><li>void LeerVector (int v[]) </li></ul><ul><li>{ </li></ul><ul><li>int i; </li></ul><ul><li>for (i=0;i<N;i++){ </li></ul><ul><li>printf(“Dame un elemento:”); </li></ul><ul><li>scanf(“%d”,&v[i]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  25. 25. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Ejemplo (cont) </li></ul><ul><li>Las llamadas desde el programa principal: </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>#define N 10 </li></ul><ul><li>void main(){ </li></ul><ul><li>int numeros[N],contadores[N]; </li></ul><ul><li>LeerVector(numeros); </li></ul><ul><li>LeerVector(contadores); </li></ul><ul><li>} </li></ul>
  26. 26. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Ejercicio propuesto </li></ul><ul><li>Diseñar un programa en C utilizando funciones que lea dos matrices cuadradas de 3x3 y calcule la suma de ambas. El programa deberá visualizar tanto las matrices originales como la matriz suma. </li></ul>
  27. 27. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Ejercicio propuesto </li></ul><ul><li>Utilizar las siguientes funciones: </li></ul><ul><ul><li>LeerMatriz : Debe poder leer los elementos de una matriz cualquiera </li></ul></ul><ul><ul><li>SumaMatrices : Debe poder calcular la suma de dos matrices sobre una tercera </li></ul></ul><ul><ul><li>VerMatriz : Debe poder visualizar por pantalla los elementos de una matriz cualquiera </li></ul></ul>
  28. 28. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Solución </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>#define N 3 /* Dimensión de las matrices */ </li></ul><ul><li>void LeerMatriz (int m[N][N]){ </li></ul><ul><li>int i,j; </li></ul><ul><li>for (i=0;i<N;i++) </li></ul><ul><li>for (j=0;j<N;j++){ </li></ul><ul><li>printf(“Dame un elemento: ”); </li></ul><ul><li>scanf(“%d”,&m[i][j]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  29. 29. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Solución (cont) </li></ul><ul><li>void SumaMatrices (int m1[N][N], int m2[N][N], int m3[N][N]){ </li></ul><ul><li>int i,j; </li></ul><ul><li>for (i=0;i<N;i++) </li></ul><ul><li>for (j=0;j<N;j++) </li></ul><ul><li>m3[i][j]=m1[i][j]+m2[i][j]; </li></ul><ul><li>} </li></ul>
  30. 30. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Solución (cont) </li></ul><ul><li>void VerMatriz (int m[N][N]){ </li></ul><ul><li>int i,j; </li></ul><ul><li>for (i=0;i<N;i++){ </li></ul><ul><li>for (j=0;j<N;j++) printf(“%5d”,m[i][j]); </li></ul><ul><li>printf(“ ”); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  31. 31. Tema 6: Funciones (ampliación) Paso de parámetros por referencia <ul><li>Solución (cont) </li></ul><ul><li>void main(){ </li></ul><ul><li>int matriz1[N][N], matriz2[N][N]; </li></ul><ul><li>int matriz_suma[N][N]; </li></ul><ul><li>LeerMatriz(matriz1); </li></ul><ul><li>LeerMatriz(matriz2); </li></ul><ul><li>SumaMatrices(matriz1,matriz2,matriz_suma); </li></ul><ul><li>VerMatriz(matriz1); </li></ul><ul><li>VerMatriz(matriz2); </li></ul><ul><li>VerMatriz(matriz_suma); </li></ul><ul><li>} </li></ul>
  32. 32. Tema 6: Funciones (ampliación) Variables globales y locales <ul><li>Tipos de variables </li></ul><ul><li>Globales : definidas en el programa principal </li></ul><ul><ul><li>void main() </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>int numeros[N],contadores[N]; </li></ul></ul><ul><ul><li>.../... </li></ul></ul><ul><li>Locales : definidas dentro del cuerpo de una función </li></ul><ul><ul><li>void LeerVector ( int v[] ) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>int i; </li></ul></ul><ul><ul><li>.../... </li></ul></ul><ul><li>NOTA : Los parámetros formales de una función pueden considerarse variables locales a dicha función </li></ul>
  33. 33. Tema 6: Funciones (ampliación) Variables globales y locales <ul><li>Ambito de las variables </li></ul><ul><li>¿Dónde puedo utilizar una variable? </li></ul><ul><li>Globales : se pueden utilizar en todo el programa (incluidas las instrucciones de cualquier módulo) </li></ul><ul><li>Locales : solamente pueden utilizarse en las instrucciones de la función donde han sido declaradas, o en funciones llamadas desde dicha función </li></ul>
  34. 34. Tema 6: Funciones (ampliación) Variables globales y locales <ul><li>Nomenclatura de una variable </li></ul><ul><ul><li>Hasta ahora, no era posible declarar dos variables con el mismo nombre (da un error de compilación) </li></ul></ul><ul><ul><li>Si se diseña un programa con funciones, pueden existir dos variables con el mismo nombre : una global y otra local </li></ul></ul>
  35. 35. Tema 6: Funciones (ampliación) Variables globales y locales <ul><li>Ejemplo </li></ul><ul><ul><li>#include <stdio.h> </li></ul></ul><ul><ul><li>float longitud ( float r ) /* r-Local */ </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>return 2*PI*r; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>void main(){ </li></ul></ul><ul><ul><li>float r=10 ; /* r-Global */ </li></ul></ul><ul><ul><li>printf(“%f”,longitud(r)); </li></ul></ul><ul><ul><li>} </li></ul></ul>
  36. 36. Tema 6: Funciones (ampliación) Variables globales y locales <ul><li>Efectos laterales </li></ul><ul><ul><li>Se producen cuando, desde una instrucción en una función, modificamos el valor de una variable global </li></ul></ul><ul><ul><li>Pueden tener efectos no deseados y hacer que el programa funcione mal </li></ul></ul><ul><ul><li>Si en una función existe un parámetro formal o una variable local con el mismo nombre que una global, sus instrucciones actuan sobre dicho parámetro o variable local, nunca sobre la global </li></ul></ul>

×