1 / 16

Funciones

Funciones. CONTENIDO Consideraciones sobre funciones Estructura de un programa en C Uso de funciones Paso de parámetros Punteros Ejemplo. Funciones. Todo programa C está construido en base a funciones.

aisha
Télécharger la présentation

Funciones

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 CONTENIDO • Consideraciones sobre funciones • Estructura de un programa en C • Uso de funciones • Paso de parámetros • Punteros • Ejemplo

  2. Funciones • Todo programa C está construido en base a funciones. • Las funciones permiten estructurar la codificación de los programas reduciendo su complejidad y como consecuencia, mejorando la eficiencia de su desarrollo. • Las funciones permiten la reutilización de código. • La subdivisión de un programa en varias funciones dependerá, en general, del número de tareas independientes y/o del número de veces que se repita o pueda repetirse una tarea.

  3. Funciones • Las funciones pueden devolver un valor. • Si no devuelve nada se declara de tipo void. • Si devuelve un valor, la función se declara del tipo de dato que coincide con el tipo del valor que se devuelve. (se verá más adelante). • Con independencia del número de funciones en que se descomponga un programa siempre debe existir una y sólo una función que se llame main( ), ya que cualquier programa C empieza ejecutándose por la citada función main(). • En este curso declararemos a la función main() de tipo void.

  4. Funciones tipo1 nombre_función1 (tipo11, tipo12, ...); tipo2 nombre_función2 (tipo21, tipo22, ...); ... tipoN nombre_funciónN (tipoN1, tipoN2, ...); Estructura general de un programa C en IP1 definiciones y declaraciones void main (void) { declaración de variables instrucciones } tipo1 nombre_función1 (tipo11 arg11, tipo12 arg12, ...) { declaración de variables instrucciones } tipo2 nombre_función2 (tipo21 arg21, tipo22 arg22, ...) ... tipoN nombre_funciónN (tipoN1 argN1, tipoN2 argN2, ...) { declaración de variables instrucciones }

  5. Funciones ¡ mismo tipo ! Definición de Función: (LEA vs C) LEA func nombre (e1:T1; ...; en:Tn) dev (r:Tr) Pre: {P(e1, e2, ..., en)} Post: {Q(e1, e2, ..., en, r)} cons definición de constantes var declaración de variables prin sentencias fin C Tr nombre (T1 e1, ..., Tn en) { Tr r; declaración de variables instrucciones return r; } return asigna un valor a la función

  6. Funciones El valor que tenga variable f cuando se ejecute la sentencia return será el valor que tome la función factorial Definición de Función: (ejemplo) LEA func factorial (n: entero) dev (f: entero) Pre: {n>=0} Post: {f=n!} var i: entero prin <f, i> := <1, 0> mientras i < n i := i + 1 f := f * i fmientras fin C int factorial (int n) { int f = 1, i = 0; while (i < n) { i++; f = f * i; } return f; }

  7. Funciones Llamada a una Función: (LEA vs C) LEA En una asignación: variable := nombre_función (lista de parámetros) Dentro de una expresión: E (x, nombre_función (lista de parámetros)) Dado que después de la ejecución de una función esta toma un valor, puede ser usada como una variable que almacena dicho valor y, por ejemplo, asignarla a una variable. C En una asignación: variable = nombre_función (lista de parámetros); Dentro de una expresión: E (x, nombre_función (lista de parámetros))

  8. Funciones Llamada a una Función: (ejemplo) LEA a, b, f, año, ndias: entero En una asignación: f := factorial (5) f := factorial (a) / factorial (a-b) Dentro de una expresión: si esBisiesto(año) ndias := 366 fsi C int a, b, f, anyo, ndias; En una asignación: f = factorial (5); f = factorial (a) / factorial (a-b); Dentro de una expresión: if (esBisiesto(anyo)) ndias = 366;

  9. Funciones C #include <stdio.h> int factorial (int); void main (void) { int fac; fac = factorial (7); printf (“Factorial de 7 = %d”, fac); } C int factorial (int n) { int f = 1, i = 0; while (i < n) { i++; f = f * i; } return f; } 7 5040 5040 Una función(en ejemplo: factorial), puede retornar en cada llamada un único valor a otra función que la invoca (en ejemplo: main). La palabra reservada returnpermite asignar este valor ala función invocada (en ejemplo: factorial ( )). C #include <stdio.h> int factorial (int); void main (void) { int fac; fac = factorial (7); 5040

  10. Funciones POR VALOR POR REFERENCIA PASO DE PARÁMETROS • Se utilizan como argumentos de entrada • Se utiliza como argumentos de salida o de entrada/salida. • Permite el comportamiento de una función como procedimiento. • Es necesario el uso de punteros.

  11. Funciones #include <stdio.h> float media_aritmética (int, int, int); void main (void) { int x, y, z; float media; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); media = media_aritmetica (x, y, z); printf (“La media vale %f\n”,media); } #include <stdio.h> float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; Memoria main 5.333 ... Memoria media_aritmética x a 0 3 3 float media_aritmética (int a, int b, int c) { a = a + b + c; return (a / 3.0); } float media_aritmética (int a, int b, int c) { y b 0 7 7 5,33 z c 0 6 6 media 0.0 3 7 6 5.33 Paso de parámetros por valor: Los valores de las variables o de las constantes que se escriben como argumentos en la invocación de una función, se copian en las direcciones de memoria reservada a los parámetros formales de la función invocada. #include <stdio.h> float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); media = media_aritmetica (x, y, z); #include <stdio.h> float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; printf (“\n Teclee tres números:”); scanf (“%d%d%d”, &x, &y,&z); #include <stdio.h> float media_aritmética (int, int, int); void main (void) { int x=0, y=0, z=0; float media=0.0; float media_aritmética (int a, int b, int c) { a = a + b + c; float media_aritmética (int a, int b, int c) { a = a + b + c; return (a / 3.0); 16 5.33...

  12. Funciones Paso de parámetros por referencia I: • En C no existen procedimientos, pero se puede conseguir que una función actúe como un procedimiento mediante el uso de punteros en los parámetros formales de la función. • Un puntero es una variable capaz de almacenar direcciones de memoria y mediante los operadores adecuados acceder a la información que contiene la dirección de memoriaa la que “apunta” en cada momento. • Operador * sirve para: • Declarar un puntero, (p.e.: int *pint, float *pf;) • Acceder la información apuntada por el puntero. • Operador & devuelve la dirección donde el compilador ubica una variable en la memoria.

  13. Funciones #include <stdio.h> void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); printf (“\n x= %d”, x); printf (“\n y= %d”, y); } #include <stdio.h> void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); printf (“\n x= %d”, x); printf (“\n y= %d”, y); #include <stdio.h> void intercambio (int *, int *); void main (void) { int x=5, y=8; Son punteros almacenan direcciones El contenido de lo apuntado por p1 Se pasan las direcciones p1 x 8A48 8 8 5 void intercambio (int *p1, int *p2) { int tmp; void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } void intercambio (int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; void intercambio (int *p1, int *p2) { 8A48 p2 8A4A 8 8 y 8 5 5 8A4A tmp ? Memoria main 5 5 5 5 Memoria intercambio Paso de parámetros por referencia II: Se pasan las direcciones de las variables que queremos sean modificadas por la función, de manera que dentro de la función definimos los correspondientes punteros que almacenan las citadas direcciones. #include <stdio.h> void intercambio (int *, int *); void main (void) { int x=5, y=8; intercambio (&x, &y); void intercambio (int *p1, int *p2) { int tmp; tmp = *p1;

  14. Funciones Contenido de la memoria ? i Variable 13B6 j ? 5FC4 ? p ? 13B6 Ejemplos de uso de operadores de punteros.- Se declaran dos variable enteras “i” y “j” y un puntero a entero “p” int i, j, *p; Suponemos que “i” y “j” se ubican en las direcciones 13B6 e 5FC4, respectivamente. operación i=15; 15 p=&i; (p “apunta” a i) 15 j=*p; (se accede a lo apuntado por p)

  15. Funciones Definición de Procedimiento: (LEA vs C) LEA proc nombre (ent e1:Te1; ...; en:Ten; sal s1:Ts1; ...; sm:Tsm; es r1:Tr1; ...; rp:Trp) Pre: {P(e1, ..., en, r1, ..., rp)} Post: {Q(e1, ..., en, s1, ..., sm, r1, ..., rp)} cons definición de constantes var declaración de variables prin sentencias exp (ei, si, ri, x) sentencias fin C typedef Ts1 * PTs1; ... typedef Tr1 * PTr1; ... void nombre (Te1 e1, ..., Ten en, PTs1 s1, ..., PTsm sm, PTr1 r1, ..., PTrp rp) { declaración de variables instrucciones exp (ei, *si, *ri, x); instrucciones }

  16. Funciones void MulDiv (int op1, int op2, Pint mul, Pfloat div) { assert (op2!=0) ; * mul = op1 * op2; * div = (1.0* op1) / op2; } Distinguir entre el operador “*” de multiplicación, y el operador “*” de contenido Llamadas por valor : “x” e “y” Llamadas por referencia: “m” y “d” printf (“\n Teclee dos números:”); Ejemplo de llamada y Definición de Procedimiento: #include <stdio.h> typedef int * Pint; typedef float * Pfloat; void MulDiv (int, int, Pint, Pfloat); void main (void) { int x, y, m; float d; printf (“\n Teclee dos números:”); scanf (“%d%d”, &x, &y); MulDiv (x, y, &m, &d); printf (“%d * %d=%d”, x, y, m); printf (“%d / %d =%f”, x, y, d); }

More Related