Descargar la presentación
La descarga está en progreso. Por favor, espere
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). . . . Caja negra in_1 in_N out_1 In_2 Por sus poderes reunidos yo soy,… EL CAPITAN PLANETA capitan_planeta(agua, tierra, aire, fuego, corazon);
5
REPASO CLASE ANTERIOR . . . Declaración de la función (Prototipo).
Caja negra in_1 in_N out_1 In_2 Declaración de la función (Prototipo). tipo_retorno nombre_funcion(tipo_1,. . ., tipo_N); tipo_retorno nombre_funcion(tipo_1 param_1,. . ., tipo_N param_N) { intruccion_1; . . . instrucción_N; return expresion; } 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 Bloque 1 Ámbito local 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
Variables globales .vs. Variables locales
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); 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. 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
Almacenamiento de variables
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?
Comprender el problema. Definir entradas y salidas. Definir el funcionamiento de la función. Codificar la función. Declaración. Definición. Test de la función. Adaptación al programa principal
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. x Entradas y r Salida x potencia 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. x potencia 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. Prototipo int potencia(int,int); x potencia y r 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: <assert.h> <ctype.h> <errno.h> <float.h> <limits.h> <math.h> <setjmp.h> <signal.h> <stdarg.h> <stdef.h> <stdio.h> <string.h> <time.h> <stdlib.h> 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
Archivo de encabezado de la biblioteca estándar Detalles <assert.h> Contiene macros e información que agrega diagnósticos para depuración de programas <ctype.h> Contiene prototipos de función que comprueban ciertas propiedades de los caracteres y prototipos de función para convertir letras minúsculas a mayúsculas y viceversa. <float.h> Contiene los limites de tamaño de los números de punto flotante del sistema. <limits.h> Contiene los limites de tamaño de los números enteros del sistema. <math.h> Contiene los prototipos de las funciones de la biblioteca matemática. <stdio.h> Contiene los prototipos de las funciones de la biblioteca estándar de entrada/salida e información que utilizan. <stdlib.h> Contiene prototipos de función para conversión de números a texto, texto a números, asignación de memoria, números aleatorios y varias otras funciones de utilería. <string.h> Contiene prototipos de función para procesamiento de cadenas de caracteres. <time.h> Contiene prototipos de función y tipos para manipular la hora y la fecha.
22
¿COMO USAR UNA FUNCION? Algunos APIs:
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:
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: Función Descripción int isalpha(int c) Testea si el carácter es alfanumérico int isdigit(int c) Testea si el carácter es un digito entre 0 y 9 int isupper(int c) Testea si el carácter introducido es una letra mayúscula (A - Z). int islower(int c) Testea si el carácter introducido es una letra mayúscula (a - z). int isalnum(int c) Evalúa si el carácter introducido es una letra o digito. int iscntrl(int c) Testea si el carácter introducido es de control. int isxdigit(int c) Testea si el carácter es un digito hexadecimal int isprint(int c) Test de carácter imprimible incluyendo espacio. int isgraph(int c) Test de carácter imprimible excepto espacio. int isspace(int c) Test de carácter de espacio (espacio, avance de pagina, nueva línea, retorno de carro, tabulación, tabulación vertical) int ispuntc(int c) Testea por carácter de puntuación. int toupper(int c) Convierte a letras mayúsculas. int tolower(int c) Convierte a letras minúsculas.
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? "); } 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"); 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: Funciones matemáticas Función Descripción ceil(x) Redondea al entero mas cercano. fabs(x) Devuelve el valor absoluto de x. floor(x) Redondea por defecto al entero mas próximo. fmod(x,y) Calcula el residuo f en coma flotante para la división x/y. pow(x,y) Calcula x elevado a la potencia y. Si x es menor o igual que 0, y debe ser entero. Si x es igual a cero, y no puede ser negativo. sqrt(x) Devuelve la raíz cuadrada de x; x debe ser mayor o igual que cero.
27
FUNCIONES MATEMATICAS
Funciones trigonométricas Función Descripción acos(x) Calcula el coseno inverso del x. x debe estar entre -1 y 1. asin(x) Calcula el seno inverso del x. x debe estar entre -1 y 1. atan(x) Calcula el tangente inverso de x. atan2(x,y) Calcula el tangente inverso de dividir x entre y (x/y). sin(x) Calcula el seno del ángulo x. x se expresa en radianes. cos(x) Calcula el coseno del ángulo x. x se expresa en radianes. tan(x) Calcula el tangente del ángulo x. x se expresa en radianes.
28
FUNCIONES MATEMATICAS
Funciones logarítmicas y exponenciales. Función Descripción exp(x), expl(x) La función exp calcula el exponencial de x (con e = 2,718282), la variante expl calcula el exponencial utilizando un valor long double. log(x), logl(x) La función calcula el logaritmo natural de x, logl calcula el logaritmo natural de x siendo este un dato tipo long double. log10(x), log10l(x) Calcula el logaritmo en base 10 de x. logl, es la versión de la misma función para datos tipo long double. X debe tener valor positivo.
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? void incrementar_por_valor(int); 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++; incrementar_por_valor(y); incrementar_por_valor(x); Invocación de la función void incrementar_por_valor(int x) { x++; } Definición de la función
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; void incrementar_por_referencia(int *); Declaración de la función En la declaración después del tipo de dato se utiliza el operador asterisco unitario (*) para indicar que el paso será por referencia. incrementar_por_referencia(&y); incrementar_por_referencia(&x); 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. void incrementar_por_referencia(int *x) { *x = *x + 1; } 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.
33
PRINCIPALES DIFERENCIAS ENTRE EL PASO DE PARAMETROS POR REFERENCIA Y POR VALOR
Declaración void intercambiar1(int,int); void intercambiar2(int *,int *); Definición void intercambiar1(int x, int y){ int aux; aux = x; x = y; y = aux; } void intercambiar2(int *x, int *y){ aux = *x; *x = *y; *y = aux; Invocación int a = 3,b = 5; intercambiar1(a,b); intercambiar2(&a,&b); 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. Entrada (desde teclado) y salida (hacia pantalla) formateada Función Descripción scanf Lee una cadena formateada desde stdin (teclado). printf Imprime una cadena formateada a stdout (pantalla). #include <stdio.h> int main() { double a = ; float b = ; 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
Entrada y salida de caracteres (por teclado y pantalla) Función Descripción getchar Obtiene un carácter desde stdin (teclado). putchar Escribe un carácter a stdout (pantalla). gets Obtiene una cadena de caracteres desde stdin (teclado). puts #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. Entrada (desde teclado) y salida (hacia pantalla) formateada Función Descripción atof Convierte un string a double. atoi Convierte un string a entero. atol Convierte un string a long integer. #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. Entrada (desde teclado) y salida (hacia pantalla) formateada Función Descripción rand Genera un numero aleatorio. srand Inicializa un generador de números aleatorios. #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 Funciones para copiar Función Descripción strcpy Copia un string. strncpy Copia un numero determinado de caracteres de un string. Funciones para concatenar Función Descripción strcat Concatena strings. strncat Añade un numero determinado de caracteres a un string.
39
FUNCIONES CON CADENAS DE CARACTERES
Funciones para comparar Función Descripción strcmp Compara dos cadenas de caracteres. strncmp Compara un determinado numero de caracteres entre dos cadenas de caracteres. Funciones para buscar Función Descripción strpbrk Localiza un carácter en un string. strtok Divide un string en tokens. strcspn Revisa una primera cadena de caracteres hasta que encuentra la primera ocurrencia de uno de los caracteres obtenidos la otra cadena. strchr Localiza la primera ocurrencia de un string en una cadena de caracteres strrchr Localiza la ultima ocurrencia de un carácter en un string strstr Localiza un substring.
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() { 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); int factorial(int n) { if(n > 1) return n* factorial(n - 1); else return 1; } 1 return 1;
42
¿QUE SE PUEDE HACER CON FUNCIONES?
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.