1 / 43

FUNCIONES EN C

FUNCIONES EN C. MENU DEL DIA. Repaso clase anterior. Funciones y variables. ¿Cómo trabajo con funciones? Funciones de biblioteca. Funciones de Carácter. Funciones Matemáticas. Paso de parámetros a una función. Paso de parámetros por valor. Paso de parámetros por referencia.

oliver
Download Presentation

FUNCIONES EN C

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. FUNCIONES EN C

  2. MENU DEL DIA • Repaso clase anterior. • Funciones y variables. • ¿Cómo trabajo con funciones? • Funciones de biblioteca. • Funciones de Carácter. • Funciones Matemáticas. • Paso de parámetros a una función. • Paso de parámetros por valor. • Paso de parámetros por referencia. • Principales diferencias entre el paso de parámetros por valor y por referencia. • Funciones de entrada y salida. • Funciones de la librería stdlib. • Funciones con cadenas de caracteres. • Funciones recursivas

  3. REPASO CLASE ANTERIOR #include <archivo_cabecera> protipo_funciones; declaracion_variables_globales; int main() {declaracion_variables_locales; funcion_1(); funcion_2(); . . . funcion_N(); return 0; } funcion_1() { codigo_funcion_1; } . . . funcion_N() { codigo_funcion_N; } #include <archivo_cabecera> declaracion_variables_globales; int main() { declaracion_variables_locales; instruccion_1; instruccion_2; . . . instruccion_N; return 0; }

  4. REPASO CLASE ANTERIOR • Función: • Nombre. (Con el cual es invocada). • Entradas . (Parámetros de la función). • Salida. (Valor de retorno si tiene). Por sus poderes reunidos yo soy,… EL CAPITAN PLANETA in_1 In_2 Caja negra . . . out_1 in_N capitan_planeta(agua, tierra, aire, fuego, corazon);

  5. REPASO CLASE ANTERIOR Declaración de la función (Prototipo). tipo_retornonombre_funcion(tipo_1,. . ., tipo_N); in_1 In_2 Caja negra . . . out_1 tipo_retornonombre_funcion(tipo_1 param_1,. . ., tipo_Nparam_N) { intruccion_1; . . . instrucción_N; return expresion; } in_N Definición de la función

  6. REPASO CLASE ANTERIOR Invocación de la función Declaración de la función Definición de la función

  7. REPASO CLASE ANTERIOR #include <archivo_cabecera> protipo_funciones; declaracion_variables_globales; int main() {declaracion_variables_locales; funcion_1(); funcion_2(); . . . funcion_N(); return 0; } funcion_1() { codigo_funcion_1; } . . . funcion_N() { codigo_funcion_N; } #include <archivo_cabecera> float suma(float,float); int main() { . . . float a= suma(2.3,4.1); . . . return 0; } float suma(float num1, float num2) { float res; res = num1 + num2; return res; }

  8. FUNCIONES Y VARIABLES • Ámbito: • Global. • Local (Bloque). • Ocultamiento de variables. Variable global a = 1. #include <stdio.h> #include <stdlib.h> int a, b = 1, c = 2; int main() { int d = 3, e = 3; { int f = 8; int g = 9; } return 0; } #include <stdio.h> #include <stdlib.h> int a=1; int main() { int a = 3; { int a = 5; } return 0; } Ocultamiento de la variable a, global por la variable local al bloque del main. a = 3. Ámbito global Caja negra Ámbito local Bloque 1 Bloque 2 Bloque 1 Bloque 2 Ocultamiento de la variable a, local a la función main por la variable local al bloque definido al interior del main. a = 5.

  9. FUNCIONES Y VARIABLES #include <stdio.h> #include <stdlib.h> int funcion(int); int a, b = 1, c = 2; int main() { int d = 3, e = 3, x = 2; int a = funcion(3); c = funcion(b); printf("x = %d\n"); b = funcion(x); printf("x = %d\n"); return 0; } int funcion(int x){ int b = 1; c = x + 1; } • Variables globales y las funciones: • Como una variable global es visible en todo el código puede ser accedidas y cambiadas desde cualquier parte incluyendo las funciones. • Variables globales y las funciones: • Cuando una variable local es declarada dentro de una función, y esta tiene el mismo el mismo nombre que una variable global previamente declarada, la variable local oculta a la global. • Los argumentos de una función son variables locales de la función. • Una función no puede ver variables locales que se encuentren fuera de su ámbito. Ámbito global Bloque 1 Ámbito local Bloque 2 • Variables globales .vs. Variables locales • La ventaja de usar variables globales radica en que facilita en intercambio de información entre funciones en un programa sin hacer uso de argumentos. • El uso de variables globales frente a las locales tiene 2 desventajas: • La función es mucho menos portable para otros programas. • Concepto de dominio local: Si una variable local definida dentro de una función tiene el mismo nombre que una variable global, solo la variable local es cambiada mientras se esta en la función.

  10. FUNCIONES Y VARIABLES Permanente (static): Sus valores se mantienen cuando termina la función. Una variable declarada como static dentro de una función, mantiene un valor a través de ejecuciones posteriores de la misma función. Una variable de este tipo se crea en tiempo de compilación. Almacenamiento de variables Temporal (auto): Sus valores se pierden cuando termina la función. Una variable de este tipo se crea en tiempo de ejecución. #include <stdio.h> #include <stdlib.h> void ejemplo_estatica(int); int main() { ejemplo_estatica(1); ejemplo_estatica(2); ejemplo_estatica(3); return 0; } void ejemplo_estatica(int llamada){ static int cuenta; if(llamada == 1) cuenta = 1; printf("El valor de la cuenta en la llamada # %d es: %d\n", llamada, cuenta); cuenta++; } La salida cuando una variable declarada dentro de una función sea estática o no depende del compilador

  11. ¿COMO TRABAJO CON FUNCIONES? Realizar una función que calcule el valor la potencia de un numero entero.

  12. ¿COMO TRABAJO CON FUNCIONES?

  13. ¿COMO TRABAJO CON FUNCIONES? • Comprender el problema • Esta etapa consiste en aterrizar el problema (entenderlo), antes de empezar puede ser útil formular preguntas como: • ¿Qué es lo que se busca? • ¿Cuáles son las entradas y salidas? • ¿Cómo se aborda el problema?

  14. ¿COMO TRABAJO CON FUNCIONES? Definir entradas y salidas Una vez aterrizado el problema el siguiente paso consiste en definir las entradas y salidas que tendrá la función. Muchas veces el enunciado del problema nos da esta información. potencia x Entradas y r Salida x r y

  15. ¿COMO TRABAJO CON FUNCIONES? Definir el funcionamiento de la función Esta parte es sumamente importante por que aquí es donde se definen el conjunto de instrucciones de la función encargados de procesar los función con los argumentos que se le pasan a esta. potencia x r y Instrucciones de asignación. Instrucciones de E/S. Instrucciones condicionales. Instrucciones repetitivas.

  16. ¿COMO TRABAJO CON FUNCIONES? Codificar la función Consiste en codificar la función en lenguaje C, básicamente esto es, codificar su prototipo y definición. potencia Prototipo int potencia(int,int); x r y int potencia(int x,int y) { int r = 1,i; for(i=1;i<=y;i++) { r *= x; } return r; } Definición

  17. ¿COMO TRABAJO CON FUNCIONES? Codificar la función

  18. ¿COMO TRABAJO CON FUNCIONES? Test la función Consiste en probar el correcto funcionamiento de la función anteriormente creada. Para ello esta se invoca en el main pasándole diferentes valores y comprobando que el valor retornado sea el correcto.

  19. ¿COMO TRABAJO CON FUNCIONES? Adaptación al programa principal Una vez que se comprueba el correcto funcionamiento de la función el siguiente paso consiste en emplearla en el programa principal siguiendo las especificaciones asignadas.

  20. FUNCIONES DE BIBLIOTECA • C ofrece una biblioteca estándar de funciones que proporcionan soporte para operaciones utilizadas con mas frecuencia. Estas funciones permiten realizar una operación con solo una llamada a una función (sin tener que escribir su código fuente). • Las funciones se dividen en diferentes grupos lo cuales se asocian a cada uno de los archivos cabecera mostrados a continuación: • Para usar una función determinada se debe incluir el archivo cabecera asociado al grupo a la cual esta pertenece, para ello se usa la directiva del preprocesador #include: stdio.h math.h

  21. FUNCIONES DE BIBLIOTECA

  22. ¿COMO USAR UNA FUNCION? • Anotaciones a tener en cuenta en el momento de usar funciones: • Consultar la documentación sobre la función (API): • Identificar entradas (que es lo que se le mete) y salidas (que es lo que devuelve). • Identificar que archivos cabecera se deben incluir para poder usarla. • Comprender que es lo que hace la función. • Identificar como usarla (su invocación). • Ver ejemplos para aclarar como usar la función consultada. • Adaptarla al problema particular Algunos APIs: http://www.cplusplus.com/reference/clibrary/ http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ http://www.cppreference.com/wiki/c/start http://c.conclase.net/librerias/

  23. FUNCIONES DE CARACTER El archivo cabecera <ctype.h> define un grupo de funciones y macros para la manipulación de variables tipo carácter. La siguiente tabla resume las principales funciones:

  24. FUNCIONES DE CARACTER Ejemplo: ¿Hacer un programa que lea un carácter por teclado y compruebe si es letra? #include <stdio.h> #include <ctype.h> int main() { char inicial; printf("Cual es su primer caracter inicial? " ); scanf ("%c",&inicial); while (!isalpha(inicial)) { puts("Caracter no alfabetico \n"); printf("Cual es su siguiente inicial? "); scanf ("%c",&inicial); } puts("Terminado!\n"); return 0; }

  25. FUNCIONES DE CARACTER Ejemplo: Hacer un programa que compruebe el sexo de un encuestado, el usuario debe digitar M para masculino y F para femenino. #include <stdio.h> #include <ctype.h> int main() { char resp; printf("Digite el sexo (F:Femenino o M: Masculino): " ) ; scanf ("%c",&resp); resp = toupper(resp); switch(resp) { case ‘F’: printf("Femenino\n"); break; case ‘M’: printf("Masculino\n"); break; default: printf("Opción invalida\n"); } return 0; }

  26. FUNCIONES MATEMATICAS El archivo cabecera <math.h>contiene la mayoría de las funciones numéricas para la realización de diferentes operaciones matemáticas:

  27. FUNCIONES MATEMATICAS

  28. FUNCIONES MATEMATICAS

  29. FUNCIONES MATEMATICAS Ejemplo: Hacer un programa que use varias funciones de la librería matemática. #include <stdio.h> #include <math.h.h> #define PI 3.14 int main() { double x = 2.0, y = 3.5, z; z = sqrt(pow(x,2)+3*x*pow(x+y,x-1)); printf("%lf",z); x = log(z); printf("%lf",x); y = tan(PI/2); printf("%lf",y); return 0; }

  30. PASO DE PARAMETROS A UNA FUNCION • En C existen dos formas de pasar parámetros a una función, estas son: • Por valor. • Por referencia. • Paso de parámetros por valor • Cuando se pasa un argumento utilizando una llamada por valor, se hace una copia del argumento y se pasa a la función llamada. En este caso, los cambios en la copia no afectan el valor de la variable original. • Este es el método de invocación por defecto. • En todos los ejemplos anteriormente estudiados el paso de parámetros se ha realizado por valor. • Paso de parámetros por referencia • A diferencia del paso de parámetros por valor, cuando se pasa un parámetro por referencia, la función accede y manipula directamente el argumento pasado (y no a una copia de este) de tal modo que la variable original puede ser modificada. • Este método es muy empleado para pasar arreglos y datos grandes como argumentos por su mayor eficiencia. Invocación de la función float x; int y; entrada(&x,&y); ... void entrada(float *x,int *y); saludo(8); ... void saludo(int x); Declaración de la función

  31. PASO DE PARAMETROS POR VALOR ¿Cuál serán los valores finales de las variables declaradas después de la ejecución del siguiente programa? Declaración de la función #include <stdio.h> #include <math.h> void incrementar_por_valor(int); int main() { int y = 3, x = 4; incrementar_por_valor(y); incrementar_por_valor(x); return 0; } void incrementar_por_valor(int x) { x++; } void incrementar_por_valor(int); Definición de la función Invocación de la función void incrementar_por_valor(int x) { x++; } incrementar_por_valor(y); incrementar_por_valor(x);

  32. PASO DE PARAMETROS POR REFERENCIA ¿Cuál serán los valores finales de las variables declaradas después de la ejecución del siguiente programa? #include <stdio.h> #include <math.h> void incrementar_por_referencia(int *); int main() { int y = 3, x = 4; incrementar_por_referencia (&y); incrementar_por_referencia(&x); return 0; } void incrementar_por_referencia(int *x) { *x=*x+1; } Declaración de la función void incrementar_por_referencia(int *); En la declaración después del tipo de dato se utiliza el operador asterisco unitario (*) para indicar que el paso será por referencia. Invocación de la función Cuando se invoca la función la variable pasada como argumento se debe preceder del operador ampersand (&). La única excepción a esto esta cuando a la función se pasan arreglos y cadenas de caracteres. incrementar_por_referencia(&y); incrementar_por_referencia(&x); Definición de la función Note el acceso a la variable pasada por referencia siempre se hace anteponiendo el operador asterisco unitario (*) a la variable pasada como parámetro, x para este caso. void incrementar_por_referencia(int*x) { *x = *x + 1; }

  33. PRINCIPALES DIFERENCIAS ENTRE EL PASO DE PARAMETROS POR REFERENCIA Y POR VALOR Ver código: ejemplo_ref_val.c

  34. FUNCIONES DE ENTRADA SALIDA El archivo cabecera <stdio.h>contiene funciones de utilidad para la entrada y salida de datos. #include <stdio.h> int main() { double a = 3.258966; float b = -2.5344; int c, d, e; char cadena[]="Simon dice que estos son los numeros", caracter = 'z'; printf("Despliegue de algunos datos\n"); printf("a = %10.2lf, b = %10.2f\n",a,b); printf("Digite 3 numeros enteros\n"); scanf("%d%d%d",&c,&d,&e); printf("%s: c = %+4d, d = %+4d, e = %+4d\ny que este es el caracter: %c\n",cadena,c,d,e,caracter); return 0; }

  35. FUNCIONES DE ENTRADA SALIDA #include <stdio.h> int main() { char sexo, nom_apell[60]; printf("Digite nombres y apellidos completos: \n"); gets(nom_apell); printf("Digite sel sexo (F para femenino, M para masculino): "); sexo = getchar(); printf("Usted "); puts(nom_apell); printf(" tiene sexo "); putchar(sexo); printf("\n"); return 0; }

  36. FUNCIONES DE LA LIBRERÍA STDLIB El archivo cabecera <stdlib.h>contiene funciones para manejo dinámico de memoria, generación de números aleatorios, comunicación con el ambiente, aritmética entera, búsqueda, ordenamiento y conversión. #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { char n1_c[5],n2_c[5]; int n1; double n2; printf("Digite los tres numeros (int,double): \n"); gets(n1_c); gets(n2_c); n1=atoi(n1_c); n2=atof(n2_c); printf("Los numeros metidos son: %d, %lf\n",n1,n2); return 0; }

  37. FUNCIONES DE LA LIBRERÍA STDLIB El archivo cabecera <stdlib.h>contiene funciones para manejo dinámico de memoria, generación de números aleatorios, comunicación con el ambiente, aritmética entera, búsqueda, ordenamiento y conversión. #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { int N, M, cant, i, aleatorio; printf("Digite la cantidad de números que desea generar: "); scanf("%d",&cant); printf("Digite los limites (primero el superior, luego el inferior): "); scanf("%d%d",&N,&M); srand(time(NULL)); // Inicializacion del generador for(i = 0; i < cant; i ++) { aleatorio = rand()%(N-M+1)+M; //Genera un numero entre M y N printf("%d ", aleatorio); } printf("\n", aleatorio); system("PAUSE"); return 0; }

  38. FUNCIONES CON CADENAS DE CARACTERES El archivo cabecera <string.h>contiene la mayoría de las funciones empleadas para la manipulación de cadenas de caracteres Declaración de variables

  39. FUNCIONES CON CADENAS DE CARACTERES

  40. FUNCIONES RECURSIVAS Una función recursiva es una función que se llama a si misma directa o indirectamente. Implica mas de una función 1 Indirecta main() { uno(); } uno() { dos(); } dos() { uno(); } 1 2 main() 2 4 3 4 uno() dos() Recursividad 3 La función se llama a si misma desde el propio cuerpo f() { if(condicion) return f(); else return v; } Directa

  41. FUNCIONES RECURSIVAS Un proceso recursivo debe tener una condición de terminación, ya que si esto no se da, puede continuar indefinidamente. x = 24; x = factorial(4); 24 = 4*6 return 4*factorial(3); 6 = 3*2 return 3*factorial(2); 2 = 2*1 return 2*factorial(1); 1 int factorial(intn) { if(n > 1) return n* factorial(n - 1); else return 1; } return 1;

  42. ¿QUE SE PUEDE HACER CON FUNCIONES?

More Related