Subprogramas o funciones Definición de funciones. Declaración de la función (prototipo).

23
• Subprogramas o funciones • Definición de funciones. Declaración de la función (prototipo). • Argumentos de la función, pase por valor Función sin argumentos Función con argumentos, pasa el valor • Funciones que retornan un valor, con argumentos • Ámbito de las variables: globales, locales. TEORIA

description

CI2125 TEORIA semana 8. Subprogramas o funciones Definición de funciones. Declaración de la función (prototipo). Argumentos de la función, pase por valor Función sin argumentos Función con argumentos, pasa el valor - PowerPoint PPT Presentation

Transcript of Subprogramas o funciones Definición de funciones. Declaración de la función (prototipo).

Page 1: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

• Subprogramas o funciones

• Definición de funciones.

• Declaración de la función (prototipo).

• Argumentos de la función, pase por valor• Función sin argumentos• Función con argumentos, pasa el valor

• Funciones que retornan un valor, con argumentos

• Ámbito de las variables: globales, locales.

• Función main, y sus argumentos argc, argv

CI2125 TEORIA semana 8

Page 2: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

FUNCIONES: Motivación

Para resolver problemas complejos y/o de gran tamaño se debe utilizar el concepto de Reducción de Problemas.

El problema se descompone en subproblemas, los cuales a su vez se descomponen en otros subproblemas, ...

Hasta que el problema original queda reducido a actividades básicas.

La solución de estas tareas básicas, permite, aplicando razonamiento hacia atrás, la solución del problema final

En C, la solución de un problema se expresa por medio de un programa, la solución de un subproblema, por medio de una función.

Page 3: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

FUNCIONES en lenguaje C

Un programa en C esta constituido por un programa principal ( main ) y un conjunto de funciones.

El programa principal consta de pocas líneas, las cuales son generalmente llamadas a funciones.

La llamada a una función indica al procesador que debe continuar con el procesamiento de la función, una vez que esta concluye, el control regresa al punto en donde fue llamada en el programa principal.

C permite que una función pueda llamar a otras funciones.

Permite el concepto de “Recursividad”, una función que se llama a si misma.

Page 4: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

/* programa.c calculo del area … */

#include <stdio.h>

/* Declaración de la función, prototipo */float calculo_area( float b, float h);

void main()

{ … area= calculo_area(base,altura); …}

/* Definicion de la funcion */float calculo_area( float b, float h){ return b*h;}

Comentarios

Archivos cabeceras

Declaración funciónPuede estar en

archivo.h

Cuerpo main

Definición funciónPuede estar en otro

archivo.c

Definición / Declaracion de Funciones

Page 5: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Definición de Funciones Una función se define usando el siguiente prototipo:

tipo nombre_función( tipo1 arg1, tipo2 arg2,…, tipon argn) { /* declaracion de variables locales a la funcion */

/* cuerpo de la función */

return valor_mismo_tipo; }

Las funciones se comunican con el cuerpo principal, o con otras funciones a través de parámetros/argumentos, por Valor, por Referencia o por medio de variables globales (menos usadas)

El prototipo de la función debe declararse antes del cuerpo principal.

tipo nombre_función( tipo1 arg1, tipo2 arg2,…, tipon argn);

Page 6: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Definición de Funciones nombre_funcion: no se pueden usar mas que letras, números y el símbolo '_'. el nombre de la función debe empezar por una letra. El nombre de la función se usa para llamarla dentro del programa.

tipo: Cuando una función se ejecuta y termina debe devolver un valor. Este valor puede ser cualquiera de los tipos de variables que hemos visto o un tipo de dato definido por nosotros. El valor que devuelve la función suele ser el resultado de las operaciones que se realizan en la función, o si han tenido éxito o no. También podemos usar el tipo void cuando no se devuelve ningún valor.

Definición de variables: Dentro de la función podemos definir variables que sólo tendrán validez dentro de la propia función.

Cuerpo de la función: Aquí es donde va el código de la función.

return: La sentencia return se usa para devolver un valor en el nombre de la función del mismo tipo declarado arriba. El dato que se pone después de return es el dato que se devuelve. Puede ser una constante o una variable.

argi: argumentos: Estos son variables que se pasan como datos a una función. Deben ir separados por una coma. Cada variable debe ir con su tipo de variable.

Page 7: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Argumentos de la función, pase por valor

Función sin argumentos:

#include <stdio.h>

void hola_mundo( void ); /* lleva punto y coma aquí */

void main() { hola_mundo(); /* Llamamos a la función */ }

void hola_mundo( void ) /* No se debe poner punto y coma aquí */ { printf(“\n”); printf( “Hola Mundo\n" ); return; /* No hace falta devolver ningún valor, ni siquiera poner return */ }

Page 8: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Argumentos de la función, pase por valor

Función con argumentos, pasa el valor:

#include <stdio.h>

void compara( int a, int b );

int main(){ int num1, num2; num1 = 2, num3=5; compara( num1, num2 ); /* Llamamos a la función con sus dos arg’s */}

void compara( int a, int b ) /* argumentos a y b a la función */{ if ( a>b ) printf( "%i es mayor que %i\n" , a, b ); else printf( "%i es mayor o igual que %i\n", b, a );}

Page 9: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Argumentos de la función, pase por valorFunciones que retornan un valor, con argumentos

#include <stdio.h>

int compara( int a, int b ); /* prototipo, retorna un valor entero */

int main(){ int num1=2, num2=5, resultado; resultado = compara( num1, num2 ); /* guarda el valor que devuelve la función en resultado */ printf( "El mayor de los dos es %i\n", resultado );}

int compara( int a, int b ) /* argumentos a y b a la función */{ int mayor; /* Esta función define su propia variable*/ if ( a>b ) mayor = a; else mayor = b; return mayor;}

Page 10: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Argumentos de la función, pase por valorFunción Inútil !!, argumentos solo pasan su valor !!Una función en C no puede alterar las variables pasadas como argumentos.

#include <stdio.h>

void incrementa ( int variable );

main(){ int x = 33; incrementa (x);

/* x no resulta afectada, sigue valiendo 33 */ printf ( "la variable x vale ahora %d\n", x );}

/* función inútil */void incrementa ( int variable ){ variable ++;}

x 33

variable 33

Variable local variable

Variable local x

variable 34

Page 11: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Ámbitos de variables: Globales - Locales

Según el lugar donde son declaradas puede haber dos tipos de variables.

Globales:

Las variables permanecen activas durante todo el programa. Se crean al iniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas en cualquier función.

Locales:

Las variables son creadas cuando el programa llega a la función en la que están definidas. Al finalizar la función desaparecen de la memoria.

Si dos variables, una global y una local, tienen el mismo nombre, la local prevalecerá sobre la global dentro de la función en que ha sido declarada.

Dos variables locales pueden tener el mismo nombre siempre que estén declaradas en funciones diferentes.

Page 12: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Ámbitos de variables: Globales - Locales

#include <stdio.h>

int variable;void incrementa ( void );

main(){ int x = 33; variable = x; incrementa ();

/* x no resulta afectada, sigue valiendo 33 */ printf ( "la variable vale ahora %d\n", variable );}

/* función void, que cambia variable Global*/void incrementa ( void ){ variable ++;}

x 33

variable 34

Variable GLOBAL variable

Variable local x

variable

Variable GLOBAL variable

variable

Variable GLOBAL variable

33

Page 13: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Ámbitos de variables: Globales - Locales

#include <stdio.h>

int variable;void incrementa ( void );

main(){ int x = 33; variable = x; incrementa ();

/* x no resulta afectada, sigue valiendo 33 */ printf ( "la variable vale ahora %d\n", variable );}

/* función void, que cambia variable Global*/void incrementa ( void ){ int variable; /* variable local */ variable ++;}

x 33

variable Valor ?

Variable LOCAL variable

Variable local x

variable

Variable GLOBAL variable

variable

Variable GLOBAL variable

33

Page 14: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Cuando se pasa una variable a una función (paso por valor) no se puede cambiar el valor de esa variable en la función

Realizar una función que recibe dos argumentos y retornar como resultado los valores invertidos de las dos variables.

void permuta(int x, int y) {

int temp; temp = x; x = y; y = temp;

}El efecto de esta función no es el deseado, ya que las variables son pasadas por valor

temp Valor x

Variables locales x, y, temp

x

y

Valor y

Valor temp

PASAJE DE ARGUMENTOS POR VALOR

Page 15: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

PASAJE DE ARGUMENTOS POR VALOR

Uso de la función permuta en main … Las variables var1 y var2 no cambian a pesar de que permuta las usa, solo pasa el valor de las mismas, y no su referencia o dirección

#include <stdio.h>

void permuta(int x, int y)

void main(){ int var1=1, var2=2; printf(“ valor de var1= %d y var2= %d, var1, var2); permuta( var1, var2); printf(“ valor de var1= %d y var2= %d, var1, var2); }

Page 16: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

PASAJE DE ARGUMENTOS POR REFERENCIA

El nombre del arreglo es un apuntador constante a la dirección de memoria del primer elemento del arreglo

arreglo

arreglo[0]

arreglo[1]

arreglo[N]

. . .

Page 17: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

PASAJE DE ARGUMENTOS POR REFERENCIAVolvamos a ver el ejemplo de permutar dos variables en una función, usando un arreglo para almacenar los valores de las variables a permutar, y como pase por referencia

#include <stdio.h>

void PermutaArray( int x[] );

void main(){ int arreglo[] = { 1, 2 };

printf(“Antes: arreglo={%d,%d}\n”, arreglo[0], arreglo[1] ); PermutaArray( arreglo[]); printf(“Despues: arreglo={%d,%d}\n”, arreglo[0], arreglo[1] ); }

arreglo12

ANTES

arreglo21

DESPUES

Page 18: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

PASAJE DE ARGUMENTOS POR REFERENCIA

Volvamos a ver el ejemplo de permutar dos variables en una función, usando un arreglo para almacenar los valores de las variables a permutar, pase por referencia

void PermutaArray( int x[] ){ int aux; aux = x[0]; x[0] = x[1]; x[1] = aux;}

x12

Page 19: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

FUNCIONES RECURSIVAS

Una función recursiva es una función que se llama a si misma. Esto es un concepto complejo. Aquí veremos solo algunos ejemplos sencillos.

El problema que trata de resolver una función recursiva, se descompone en el caso mas simple, o Caso Base., en cuyo caso retorna un valor. Para los casos complejos, se divide el problema en una parte que la función sabe resolver y en otra parte parecida a si misma, por lo que realiza una llamada a si misma, pero con un valor menos complejo, hasta llegar al caso base.

Llegado a este punto, la función retorna un valor a la copia anterior de la función, y así sucesivamente, esta otra retorna otro valor a la anterior llamada, hasta llegar a la primera llamada que retorna un valor donde fue llamada inicialmente (main).

Page 20: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

FUNCIONES RECURSIVAS

Ejemplo: Factorial de un numero n >=0, n!

n! = n . ( n-1)!, donde 0!= 1 y 1!=1 son el caso base

En forma iterativa:

factorial = 1;for (i= numero; i >=1; i-- )

factorial = factorial * i;

En forma Recursiva: llamando a la función factorial( numero )

double factorial ( int numero ){ if ( numero < = 1 ) return 1; else return ( numero * factorial( numero-1) ) ;}

Page 21: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

FUNCIONES RECURSIVAS

5!

5 * 4!

4 * 3!

3 * 2!

2 * 1!

1

Veamos que pasa con cada llamada recursiva:

120

5 * 24

4 * 6

3 * 2

2 * 1

1

Secuencia de llamadas recursivas

Cuando llega a Caso Base, empieza el retorno de valores en cada llamadas de la función

Page 22: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Función “main”

La función main también acepta argumentos. Y retorna valor int o void

Sin embargo sólo se le pueden pasar dos argumentos.

int main( int argc, char *argv[] )

argc (argument count).

Es de tipo int e indica el número de argumentos que se le han pasado al programa.

argv (argument values)

Es un array de strings. En el se almacenan los parámetros. Normalmente, el primer elemento (argv[0]) es el nombre del programa con su ruta. El segundo (argv[1]) es el primer parámetro, el tercero (argv[2]) el segundo parámetro y así hasta el final.

Page 23: Subprogramas o funciones  Definición de funciones. Declaración de la función (prototipo).

Función “main”

#include <stdio.h>

int main( int argc, char *argv[]){ int i; for( i=0 ; i<argc ; i++ ) printf( "Argumento %d: %s\n", i, argv[i] ); return 1;}

Si salvamos este programa con el nombre “argumentos” y ejecutamos como:

c:\programas> argumentos hola amigos

La salida será:

Argumento 0: c:\programas\argumentos.exeArgumento 1: holaArgumento 2: amigos