Clase2 c

718 views
607 views

Published on

Fundamentos de Programación en C (II Parte)

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

  • Be the first to like this

No Downloads
Views
Total views
718
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
28
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Clase2 c

  1. 1. FUNCIONES Realizado por Mariela Curiel Universidad Simón Bolívar Junio, 2011Programación en C (II Parte) •05/06/2011
  2. 2.  La mejor forma de desarrollar y mantener un programa grande es construirlo a partir de piezas menores o módulos (divide y vencerás) Reutilización: uso de funciones existentes, como bloques de construcción, para crear nuevos programas. Al programar modularmente se facilita el mantenimiento de los programas. Funciones
  3. 3.  Como la mayoría de los lenguajes, C ofrece la posibilidad de programar con funciones.Sintaxis de una función: tiporetorno nombre_func(par1, par2,...){ variables locales código de la función }Funciones
  4. 4. Ejemplo de Definición de una FunciónTipo del valor de retorno Nombre de la función float promedio(float a, float b){ float prom; prom=(a+b)/2; return(prom); Argumentos o parámetros } Variable Local Valor de retorno
  5. 5. En C los programas se escriben combinando las funciones que el programador escribe, con funciones “pre-definidas” disponibles en la librería estándar de C.Funciones
  6. 6. Ejemplo: calcular el promedio de dos enteros float promedio(float a, float b){ float prom; Definición prom=(a+b)/2; return(prom); } main(){ float a=5,b=15,result; result=promedio(a,b); Llamada a la printf(”promedio=%f",result);función }
  7. 7. void cuadrados(){ int ciclo; for(ciclo=1;ciclo<10;ciclo++) printf("%dn",ciclo*ciclo);}main() { Si la función no retorna cuadrados();} ningún valor se debe usar como tipo de retorno el void y omitir de la función la instrucción return.Funciones VOID
  8. 8.  Una función pudiera no tener argumentos. En este caso también se utiliza la palabra reservada void en lugar de los argumentos. Los argumentos pueden ser constantes, variables o expresiones.Funciones: Argumentos
  9. 9. Ejemplos:int main(){ float a=5,b=15,result, c=1, d=2, x; Los argumentos son result=promedio(a,b); variables printf(”promedio=%f",result); … Los argumentos son expresiones x = promedio(a+b, c*d);}
  10. 10. Funciones: Parámetros oArgumentos Formales y Actuales float promedio(float x, float y){ float prom; prom=(x+y)/2; x,y son return(prom); Parámetros formales } main(){ float a=5,b=15,result, c=1, t=3; result=promedio(a,b); Parámetros result=promedio(c+t,40); Reales o result=promedio(a+b,c*t); } Actuales
  11. 11. float promedio(float, float);Un prototipo de función le indica al compiladorel tipo de dato regresado por la función, el númerode parámetros que la función espera recibir, los tiposde dichos parámetros y el orden en el cuál se esperan.Los prototipos de las funciones se suelen incluirEn los archivos .h (archivos de cabecera)Prototipo de una función
  12. 12. Los archivos de cabecera (con extensión .h) contienen los prototipos de función de todas las funciones utilizadas en el programa y las definiciones de varios tipos de datos y constantes.Funciones
  13. 13. /* Ejemplo de un archivo de cabecera (.h) */#define MAXEMP 20#define MAXLIN 80#define MAXNOMBRE 20typedef struct reg { int edad; int ttrabajo; char nombre[MAXNOMBRE];} emple;// prototipos de las funcionesextern int getline(char *, int, FILE *);void asignar(emple *, int, int, char *, int);
  14. 14. Cuando los argumentos se pasan por valor se efectúa una copia del valor del parámetro y ésta se pasa a la función (a través de la pila). Las modificaciones que realice la función a la copia no afectan los valores originales de la variable.Funciones: parámetros por valory referencia.
  15. 15. Cuando un argumento se pasa por referencia, el llamador permite que la función llamada modifique el valor de la variable.Funciones: parámetros por valory referencia.
  16. 16.  Ejemplos donde el pasaje de parámetros por valor es suficiente: ◦ sqrt(x), promedio(a,b), exp(x) …. La función trabaja con los valores, no necesita cambiar los argumentos. Ejemplo donde se necesita modificar la variable: ◦ strcat(str1, str2) // concatena la cadena de caracteres str2 al final de str1Funciones: parámetros por valory referencia.
  17. 17. Funciones (Pasaje de Parámetros) Por. defecto, en C el pasaje de parámetros es por valor, es decir los argumentos que se les pasan a las funciones son copias de los VALORES de las variables.
  18. 18. Funciones (Pasaje deParámetros)void swap(int i,int j){ int temp; . int x=3, y=4; temp = i; ... i = j; swap(x,y); j = temp; printf(“%d, %d”,x,y);} /* después de invocar a la función: x es 3 y es 4 */
  19. 19. En las siguientes láminas vamos a ilustrar qué pasa con las variables en la zona de memoria del llamador (función main) y en la pila utilizada por la función en un pasaje de parámetros por valor y referencia.Pasaje de Parámetros •05/06/2011
  20. 20. Memoria Principal (área de las variables del main) 1000 4 X 1004 5 Y 1008 - 15Posiciones de la main() {Memoria 78 int x=4,y=5 … Por valor swap(x,y) //swap (4,5) swap(&x,&y) // swap (1000, 1004) }
  21. 21. Memoria Principal 1000 4 X 1004 5 Y 1008 - 15Posiciones de la main() {Memoria 78 int x=4,y=5 … swap(x,y) //swap (4,5) Por referencia swap(&x,&y) // swap (1000, 1004) }
  22. 22. La función swap intercambia el valor de dosvariables, usando una tercera (temp)como temporal. void swap(int i,int j){ int temp; temp = i; i = j; j = temp; } •05/06/2011
  23. 23. Memoria del programa ppal (main).1000 4 Pila de la función 5 al momento de la llamada swap(x,y)10041008 - 15 8004 8008 4 Parámetros 8012 5 empilados y espacio temp para la variable local Pasaje de parámetros por valor
  24. 24. Memoria del programa ppal (main) después de la llamada pila de la función después del swap1000 41004 5 80041008 - 15 8008 5 8012 4 temp 4 Pasaje de parámetros Por valor
  25. 25. Memoria del programa ppal (main) después de la llamada pila de la función1000 4 después del swap1004 51008 - 15 8004 8008 5 8012 4 temp 4 Los valores se intercambian en la pila de la función pero las variables x, y permanecen intactas
  26. 26. Memoria del programa ppal.1000 41004 51008 - 15 pila de la función al momento de la llamada swap (&x, &y) 8004 8008 1000 8012 1004 tempPasaje deParámetros por referencia
  27. 27. Memoria del programa ppal (main) después de la llamada.1000 51004 41008 - 15 Pila de la función después de la llamada 8004 8008 1000 8012 1004 temp 4Pasaje deParámetros por referencia
  28. 28. Funciones y ArreglosLos arreglos de una dimensión pueden pasarse a las funciones como parámetros:float promedio(int size,float list[]){ int i; float suma=0.0; No es necesario for (i=0;i<size;i++) especificar suma+=list[i]; el tamaño return(sum/size);}La declaración float list[] le dice a C que list es un vector de floats. En este caso el parámetro size indica el tamaño del arreglo.
  29. 29. Funciones y ArreglosEjemplo de una llamada a la función promedio:int main() {float numeros = {3.0, 4.5, 2.1}, x;…x = promedio(3,numeros);…}
  30. 30. Funciones y ArreglosArreglos Multi-dimensionales:void printtable(int xsize,int ysize, float tabla[][5]){ int x,y; for (x=0;x<xsize;x++){ for (y=0;y<ysize;y++) printf("t%f",table[x][y]); printf("n"); }}float tabla[][5] le dice a C que la tabla es un arreglo de dimensión Nx5.
  31. 31. Ejemplo de una función que recibe como parámetroUn arreglos de dos dimensiones y la llamada a la misma. main(){ int array1[2][3]={{1,2,3},{4,5,6}}; printf(“Los valores del array1 sonn”); printArray(2,3, array1); // llamada } void printArray(int dx, int dy, int a[][3]) // definición { int i,j for (i= 0;i<dx; i++) { for(j=0; j < dy; j++) print(“%d”, a[i][j]; print(“n”); }
  32. 32. Funciones (Tipos de Variables)VARIABLES GLOBALES Están definidas FUERA de cualquier función (incluyendo el main() ) Existirán todo el tiempo que esté ejecutándose el programa. Se inicializan automáticamente en CERO cuando el programa comienza a ejecutarse. Son accesibles desde todas las funciones.
  33. 33. #include <STDIO.H>double una_funcion(void);double variable_global;main(){ double i ; printf("%f", variable_global ); /* 0 */ i = una_funcion() ; printf("%f", i ); /* 1 */ printf("%f", variable_global ); /* 1 */ variable_global += 1 ; printf("%f", variable_global ); /* 2 */ return 0 ;}double una_funcion(void){ return(variable_global += 1) ;}
  34. 34. Funciones (Tipos de Variables) VARIABLES LOCALES Las variables definidas DENTRO de una función, se denominan VARIABLES LOCALES o AUTOMATICAS. Se crean y destruyen automaticamente por la llamada y el retorno de una función respectivamente. Se ubican en la pila dinámica (stack) de memoria.
  35. 35.  Su visibilidad está limitada a la función donde son declaradas. No guardan relación con variables globales del mismo nombre. No se les pueda inicializar previamente, en consecuencia su valor inicial será indeterminado (basura).Funciones (Tipos de Variables)
  36. 36. double potencia(double val,unsigned exp){ double ret_val = 1.0; //var. locales int i; for(i = 0; i < exp; i++)ret_val *= val; return(ret_val);}float promedio(int size,float list[]){ int i; float suma=0.0; for (i=0;i<size;i++) suma+=list[i]; return(sum/size);}
  37. 37. Funciones (Tipos de Variables) VARIABLES LOCALES ESTATICAS  Son variables que mantienen su valor, entre una y otra llamada a la función sin por ello perder su ámbito de existencia.  Sedeclaran con la palabra clave static.
  38. 38. Funciones (Tipos de Variables)main() { void func(void){ void func(void); static int i=0; int n; i++; for(n=1;n<=4;n++) printf(“llamada func(); Nro. %d”, i)} }Al ejecutar el Llamada Nro. 1 Llamada Nro. 2main, se imprime. Llamada Nro. 3 Llamada Nro. 4
  39. 39. Funciones (Tipos de Variables)VARIABLES GLOBALES ESTATICAS Son variables inaccesibles al exterior del archivo fuente donde se encuentran definidas. static int a; main(){ }
  40. 40. Funciones (Tipos de Variables) VARIABLES DE REGISTRO  Son variables que se almacenan en los registros internos del CPU.  Se suelen usar registros para almacenar los contadores de los bucles (FOR, WHILE, etc). register int x; register char c;
  41. 41. VARIABLES EXTERNAS Son variables globales definidas en otro archivo. Para usarlas bastará con que se la DECLARE especificando que es EXTERNA a dicho módulo.Funciones (Tipos de Variables)
  42. 42. Archivo 1extern int sp; Archivo 2extern double val[];void push(double f) { int sp;... } double val[MAX]double pop(void){ ...} Funciones (Tipos de Variables)
  43. 43. Declaración: expone  Definición: aparte las propiedades de de exponer las una variable propiedades de una (principalmente su variable, también tipo) provoca que se leextern int sp; reserve:extern double val[]; int sp; double val[MAX]Funciones (Tipos de Variables)
  44. 44. A continuación unejemplo donde se usan todos los tipos de variables •05/06/2011
  45. 45. #include <stdio.h> void a(void) {void a(void); int x=25;void b(void); printf(“%d ”, x); printf(“%d ”, ++x);void c(void); }int x = 1; void b(void) {int main() { static int x=50; printf(“%d ”, x); Int x = 5; printf(“%d ”, ++x); printf(“%d ”,x)//5} a(); void c(void) { printf(“%d ”, x); b(); printf(“%d ”,x*10); c(); } a(); b();} Salida: 5 25 26 50 51 1 10 25 26 51 52

×