SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en...

21
Fundamentos de Informática ETSI Industrial 1 Universidad de Málaga José Antonio Gómez Ruiz 5.1. SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. 5.2. LAS FUNCIONES EN C / C++. 5.2.1. Definición de funciones. Parámetros formales y valor de retorno 5.2.2. Llamadas a funciones. Parámetros reales o actuales. 5.2.3. Declaración o prototipos de funciones. 5.3. USO DE PARÁMETROS: DE ENTRADA, SALIDA Y ENTRADA / SALIDA. 5.4. PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIA. 5.5. LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDAD. 5.6. FUNCIONES MATEMÁTICAS. Tema 5: Subprogramas Estructura y Contenidos Fundamentos de Informática ETSI Industrial 2 Universidad de Málaga José Antonio Gómez Ruiz Establecer la necesidad de la subprogramación Implementar subprogramas en C / C++: las funciones Diferenciar los conceptos de definición, declaración y llamada de funciones Diferenciar los distintos pasos de argumentos: por valor y por referencia Crear nuestras propias librerías de funciones En definitiva, descomponer problemas complejos en problemas más simples mediante la subprogramación Tema 5: Subprogramas OBJETIVOS

Transcript of SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en...

Page 1: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 1 Universidad de Málaga José Antonio Gómez Ruiz

5.1. SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES.

5.2. LAS FUNCIONES EN C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. USO DE PARÁMETROS: DE ENTRADA, SALIDA Y ENTRADA / SALIDA.

5.4. PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIA.

5.5. LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDAD.

5.6. FUNCIONES MATEMÁTICAS.

Tema 5: SubprogramasEstructura y Contenidos

Fundamentos de Informática ETSI Industrial 2 Universidad de Málaga José Antonio Gómez Ruiz

Establecer la necesidad de la subprogramación

Implementar subprogramas en C / C++: las funciones

Diferenciar los conceptos de definición, declaración y llamada de funciones

Diferenciar los distintos pasos de argumentos: por valor y por referencia

Crear nuestras propias librerías de funciones

En definitiva, descomponer problemas complejos en problemas más simples mediante la subprogramación

Tema 5: SubprogramasOBJETIVOS

Page 2: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 3 Universidad de Málaga José Antonio Gómez Ruiz

5.1. SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES.

5.2. Las funciones en C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. Uso de parámetros: de entrada, salida y entrada / salida.

5.4. Paso de parámetros: por valor y por referencia.

5.5. Localidad, anidamiento, ámbito y visibilidad.

5.6. Funciones matemáticas.

Tema 5: SubprogramasEstructura y Contenidos

Fundamentos de Informática ETSI Industrial 4 Universidad de Málaga José Antonio Gómez Ruiz

Las aplicaciones informáticas que habitualmente se desarrollansuelen tener suficiente complejidad y contener miles de líneas de código

Es necesario descomponer un programa en una serie de módulos mucho más pequeños, simples y manejables → modularización o diseño descendiente

Cada uno de esos módulos será un subprograma

Objetivos de la subprogramación:

Descomponer la complejidad del problema

Reutilización del código

Mayor legibilidad

Menos errores y más localizados si se producen

Facilidad para añadir nueva funcionalidad

SUBPROGRAMAS COMO ABSTRACCIÓN DE SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONESOPERACIONES

Page 3: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 5 Universidad de Málaga José Antonio Gómez Ruiz

Pasos naturales de la subprogramación:

Especificación detallada del problema

División del problema en subproblemas

Asignar estos subproblemas a subprogramas

¡Divide y vencerás!

Separación

Implementación

Abstracción QUÉ

CÓMO

escribir_cuadrado

for( i=1 ; i<= 4 ; i++ ){for( j=1 ; j<= 4 ; j++ )

cout << “*”;cout << “\n”;}

SUBPROGRAMAS COMO ABSTRACCIÓN DE SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONESOPERACIONES

Fundamentos de Informática ETSI Industrial 6 Universidad de Málaga José Antonio Gómez Ruiz

...escribir_cuadrado...escribir_cuadrado...escribir_cuadrado...

for( i=1 ; i<= 4 ; i++ ){for( j=1 ; j<= 4 ; j++ )

cout << “*”;cout << “\n”;

}

control→

←retorno

Llamadasmúltiples

Definiciónúnica

Expansión de Código:

Reutilizable, pero poco flexible: subtarea fija

SUBPROGRAMAS COMO ABSTRACCIÓN DE SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONESOPERACIONES

Page 4: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 7 Universidad de Málaga José Antonio Gómez Ruiz

...escribir_cuadrado(4)...escribir_cuadrado(5)...escribir_cuadrado(8)...

for( i=1 ; i<= ; i++ ){for( j=1 ; j<= ; j++ )

cout << “*”;cout << “\n”;

}

4

Subprograma:

Trozo de código que resuelve una subtarea de forma parametrizada

SUBPROGRAMAS COMO ABSTRACCIÓN DE SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONESOPERACIONES

Fundamentos de Informática ETSI Industrial 8 Universidad de Málaga José Antonio Gómez Ruiz

5.1. Subprogramas como abstracción de operaciones.

5.2. LAS FUNCIONES EN C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. Uso de parámetros: de entrada, salida y entrada / salida.

5.4. Paso de parámetros: por valor y por referencia.

5.5. Localidad, anidamiento, ámbito y visibilidad.

5.6. Funciones matemáticas.

Tema 5: SubprogramasEstructura y Contenidos

Page 5: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 9 Universidad de Málaga José Antonio Gómez Ruiz

Algunos lenguajes de programación tienen dos tipos distintos de subprogramas: procedimientos y funciones

Los subprogramas en el lenguaje C/C++ son sólo funciones

Un programa en C/C++ está estructurado en funcionesDe hecho, main es una función, la función principal del programa

Las funciones en programación son, de alguna manera, parecidas a las funciones matemáticas, pudiendo tener argumentos o parámetros

Ejemplo de función matemática: f(x)= 2 x + 5

− f es el nombre de la función, que tiene un argumento formal x

− La función f, una vez definida, puede usarse (ser llamada) en otras expresiones. Por ejemplo y = f(4) - 5

− Para determinar el valor de f(4) se sustituye el argumento formal x por el argumento actual (o real) 4: f(4)= 2 • 4 + 5 = 13

− Se dice entonces que la función f devuelve el valor 13

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Fundamentos de Informática ETSI Industrial 10 Universidad de Málaga José Antonio Gómez Ruiz

Definición de una función: consta de una cabecera y un cuerpoLa cabecera contiene el nombre de la función, la lista de parámetros formales separador por comas (nombres y tipos) y el tipo del resultado

El cuerpo de la función, consta del código necesario de lo que debe hacer la función y del valor que va a devolver

float Sumar (float num1, float num2)

{

float resp;

resp = num1 + num2;

return resp;

}

Tipo de resultado

Lista de Parámetros Formales separados por comas

Cuerpo de la función

Valor devuelto

Cabecera de la función

Identificador de la función (nombre)

Tipos compatibles

Variable local

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Page 6: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 11 Universidad de Málaga José Antonio Gómez Ruiz

La sentencia return viene acompañada de

una constante, una variable o cualquier expresión siempre y cuando sean de tipos compatibles con el que devuelve la función.

Puede haber más de un return en el cuerpo de una función (no es

aconsejable y sólo lo permitiremos en funciones recursivas)En cuanto se ejecute una sentencia return la función termina

Puede no haber return: la función no devuelve ningún valorEl tipo de devolución es void (vacío o nulo)

void escribir_cuadrado(unsigned lado){ int i,j;

for(i=1; i<=lado; i++){for(j=1; j<=lado; j++)

cout << “*”;cout << “\n”;

}}

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Fundamentos de Informática ETSI Industrial 12 Universidad de Málaga José Antonio Gómez Ruiz

Llamada a una función: Es la instrucción donde se invoca o se utiliza una determinada función.

La función A llama a la B

La instrucción de llamada provoca la ejecución de la función B sobre los valores (parámetros) que le indiquemos

Al acabar la función B, puede que nos devuelva unos resultados

Se realiza escribiendo el nombre de la función, seguido de los parámetros sobre los que operar. Estos parámetros se denominan parámetros reales

La llamada a una función puede hacerse en cualquier lugar donde pueda utilizarse una expresión del tipo de devolución de la función

AB

Llamada

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Page 7: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 13 Universidad de Málaga José Antonio Gómez Ruiz

Se crea una interfaz de comunicación entre la función llamante y la llamada, permitiendo el intercambio de información entre ellas

Los parámetros formales de una función no son obligatorios pero, si aparecen, deben tener cierta relación con los parámetros reales de una hipotética llamada a la misma:

El número de parámetros reales debe coincidir con el de parámetros formales

El i-ésimo parámetro real se corresponde con el i-ésimo formal

El tipo del i-ésimo parámetro real debe ser compatible que el del i-ésimo formal

Los parámetros de una función pueden ser de cualquier tipo

Los nombres de un parámetro formal y su correspondiente real pueden ser diferentes

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Fundamentos de Informática ETSI Industrial 14 Universidad de Málaga José Antonio Gómez Ruiz

void escribir_tabla(unsigned numero){ unsigned i;for(i=1; i<=10; i++)cout<< numero << “*” << i << “=” <<numero*i;

}

int mayor(int a,int b){ if (a>b)

return a;else

return b;}

int mayor(int a,int b){int mayor; if (a>b)

mayor = a;else

mayor = b;return mayor;}

int num=3;/*correctas*/escribir_tabla(5);escribir_tabla(num);escribir_tabla(num+4);/*incorrectas*/num=escribir_tabla(4);escribir_tabla(2,3);escribir_tabla(‘a’);

int x=3, y=-2, z;/*correctas*/z = mayor(x+2,y);x = mayor(-14,5-2);z = mayor(y,-10);cout << mayor(2,3);y = y + mayor(y,10); /*incorrectas*/mayor(-13,10);x = mayor(2,10,34);

Ejemplos de llamadas

Parámetros formalesParámetros reales

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Page 8: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 15 Universidad de Málaga José Antonio Gómez Ruiz

¿Dónde se definen las funciones en un programa en C / C++ ?

Existen dos maneras diferentes de definirlas:Antes de la función main(): − La función main()será la última del programa

− El resto de funciones se ordenarán en orden de aparición teniendo en cuenta que para llamar a una función debe estar definida previamente

Después de la función main():− La función main()será la primera del programa

− Antes de la función main() se incluirán los prototipos de todas las funciones

• Esto es imprescindible ya que, al definirse las funciones al final, se desconocerían sus características. Los prototipos declaran las características de las funciones y permite que se puedan llamar

− El orden de las definiciones de las funciones ya no es importantepuesto que están todos los prototipos declarados previamente y, por tanto, todas las funciones podrán llamar a todas las demás

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Fundamentos de Informática ETSI Industrial 16 Universidad de Málaga José Antonio Gómez Ruiz

Usaremos la segunda opción: pondremos la definición de las funciones después de la función main() y adelantaremos la declaración de las mismas mediante sus prototipos:

Evitaremos problemas de ámbitos al hacer las llamadas

Al tener todos los prototipos juntos se simplifica localizar las características de cada función

El prototipo de una función consiste en la cabecera de la misma TERMINADA EN UN PUNTO Y COMA

La misión de los prototipos es simplemente adelantar la información relativa al número y tipos de parámetros que acepta la función y el tipo que devuelve la misma

Por tanto, el prototipo no especifica el proceso el proceso a realizar. Lo hará la definición de la función

En el prototipo, el nombre de las variables puede omitirse

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Page 9: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 17 Universidad de Málaga José Antonio Gómez Ruiz

Ejemplos de

prototipos

válidosvoid escribir_tabla(unsigned numero){ unsigned i;for(i=1; i<=10; i++)cout<< numero << “*” << i << “=”<<numero*i;

}

int mayor(int a,int b){int mayor; if (a>b)

mayor = a;else

mayor = b;return mayor;}

long factorial(unsigned num){int i, fact = 1; for(i=2; i<= num; i++)

fact*=i;return fact;}

void escribir_tabla(unsigned numero);void escribir_tabla(unsigned );

int mayor(int a,int b);int mayor(int ,int );

long factorial(unsigned num);long factorial(unsigned );

LAS FUNCIONES EN LAS FUNCIONES EN C / C++C / C++

Fundamentos de Informática ETSI Industrial 18 Universidad de Málaga José Antonio Gómez Ruiz

Desarrolla los siguientes programas como ejemplo:

a) Se piden dos números naturales m y n. El programa mostrará todas las parejas de números amigos que hay en el intervalo [m,n]. Dos números son amigos si la suma de los divisores del primero (sin contarse el mismo) coincide con el segundo y viceversa. Nota: usa una función que, dado un número, devuelva la suma de sus divisores (sin contarse el mismo).

b) Se piden dos números naturales N e i. El programa mostrará el dígito de N que ocupa la í-ésima posición empezando por el dígito menos significativo. En caso de no poder obtenerlo (por que se salga del rango) mostrará -1. Nota: usa dos funciones, una que determine el número de dígitos de un número y otra que, dado un número y una posición, devuelva el dígito que ocupa esa posición dentro del número.

c) Se pide un número natural n y se imprimen por pantalla los n primeros números primos. El programa pregunta si se quiere repetir de nuevo el proceso. Nota: usa una función que, dado un número natural, devuelva 1 si es primo, 0 si no lo es.

EJEMPLOSEJEMPLOS

Page 10: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 19 Universidad de Málaga José Antonio Gómez Ruiz

5.1. Subprogramas como abstracción de operaciones.

5.2. Las funciones en C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. USO DE PARÁMETROS: DE ENTRADA, SALIDA Y ENTRADA / SALIDA.

5.4. Paso de parámetros: por valor y por referencia.

5.5. Localidad, anidamiento, ámbito y visibilidad.

5.6. Funciones matemáticas.

Tema 5: SubprogramasEstructura y Contenidos

Fundamentos de Informática ETSI Industrial 20 Universidad de Málaga José Antonio Gómez Ruiz

En programación se denomina interfaz a la combinación de los parámetros formales definidos en las funciones y los parámetros reales que se pasan en la llamada a la misma

Muchos de los errores en la subprogramación se presentan debido a una interfaz incorrecta

Datos de entrada ala función

Datos de salidade la función

USO DE LOS PARÁMETROS: E, S, E/SUSO DE LOS PARÁMETROS: E, S, E/S

Page 11: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 21 Universidad de Málaga José Antonio Gómez Ruiz

Parámetros de Entrada:

La función que llama pasa un valor que no puede ser modificado por la función llamada, sólo puede ser utilizado

El parámetro formal NO DEBE aparecer en la parte izquierda de una asignación dentro de la función

Parámetros de Entrada y Salida:

La función llamante pasa un valor que puede ser utilizado y modificado dentro de la función llamada

Cualquier cambio en el parámetro formal (dentro de la definición de la función) se reflejará en el parámetro real de la llamada

Parámetros de Salida:

La función llamante llamante no pasa un valor, sólo lo recibe

El parámetro formal SÓLO DEBE aparecer en la parte izquierda de una asignación dentro de la definición de la función

Cualquier cambio en el parámetro formal (dentro de la definición de la función) se reflejará en el parámetro real de la llamada

USO DE LOS PARÁMETROS: E, S, E/SUSO DE LOS PARÁMETROS: E, S, E/S

Fundamentos de Informática ETSI Industrial 22 Universidad de Málaga José Antonio Gómez Ruiz

Parámetros de Entrada:

Proporcionan información a la función llamada

discr

/* raíces ecuación 2do. grado*/discr = b*b-4.0*a*c;if (discr>0.0){x1 = (-b+raiz(discr))/(2.0*a);x2 = (-b-raiz(discr))/(2.0*a);}...

a b c? ??

-

x1? x2?

Ec2Grado

USO DE LOS PARÁMETROS: E, S, E/SUSO DE LOS PARÁMETROS: E, S, E/S

Page 12: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 23 Universidad de Málaga José Antonio Gómez Ruiz

Parámetros de Salida:

Devuelven información a la función que llama

discr

/* raíces ecuación 2do. grado*/discr = b*b-4.0*a*c;if (discr>0.0){x1 = (-b+raiz(discr))/(2.0*a);x2 = (-b-raiz(discr))/(2.0*a);}...

a b c? ??

-

x1? x2?

Ec2Grado

USO DE LOS PARÁMETROS: E, S, E/SUSO DE LOS PARÁMETROS: E, S, E/S

Fundamentos de Informática ETSI Industrial 24 Universidad de Málaga José Antonio Gómez Ruiz

Parámetros de Entrada / Salida:

Proporcionan y devuelven información

temporal

/* intercambia valores */temporal = a;a = b;b = temporal;

a b-

- -

Intercambiar

USO DE LOS PARÁMETROS: E, S, E/SUSO DE LOS PARÁMETROS: E, S, E/S

Page 13: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 25 Universidad de Málaga José Antonio Gómez Ruiz

5.1. Subprogramas como abstracción de operaciones.

5.2. Las funciones en C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. Uso de parámetros: de Entrada, Salida y Entrada / Salida.

5.4. PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIA.

5.5. Localidad, anidamiento, ámbito y visibilidad.

5.6. Funciones matemáticas.

Tema 5: SubprogramasEstructura y Contenidos

Fundamentos de Informática ETSI Industrial 26 Universidad de Málaga José Antonio Gómez Ruiz

Como acabamos de mostrar, el uso se puede hacer con los parámetros de las funciones puede ser de Entrada, Salida y de Entrada / Salida

Hay que establecer como se implementa la transmisión entre los parámetros formales y los parámetros reales en cada uno de esos usos

Las implementaciones posibles son:Paso por Valor:− Se realiza una COPIA del contenido del parámetro real en el

parámetro formal, siendo éstos VARIABLES INDEPENDIENTES

− Se utiliza con los parámetros de Entrada.

Paso por Referencia:− El parámetro formal obtiene una REFERENCIA al parámetro real

− Ahora NO SON DOS VARIABLES INDEPENDIENTES, son la misma con dos referencias distintas: el parámetro real y el formal.

− CUALQUIER CAMBIO en el parámetro formal (dentro de la función) SE REFLEJA en el parámetro real de la llamada

− Se utiliza con los parámetros de Salida y de Entrada / Salida

PASO DE PARÁMETROS: POR VALOR Y PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIAPOR REFERENCIA

Page 14: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 27 Universidad de Málaga José Antonio Gómez Ruiz

Por defecto, en el lenguaje C/C++, todo paso de parámetros(de los tipos vistos hasta el momento) se hace por valor

Por tanto, la modificación de un parámetro formal en la definición de la función, no afecta al parámetros real de la llamada

En un paso por valor un parámetro real puede ser una variable, constante o expresión siempre que sea compatible con el tipo del parámetro formal

Todos los ejemplos de definición de funciones y llamadas vistos hasta el momento implementan el paso por valor

PASO DE PARÁMETROS POR VALORPASO DE PARÁMETROS POR VALOR

Fundamentos de Informática ETSI Industrial 28 Universidad de Málaga José Antonio Gómez Ruiz

En un paso de parámetros por referencia un parámetro real sólo puede ser una variable que sea compatible con el tipo del parámetro formal

Usaremos el paso por referencia implementado en C++

En el prototipo y la cabecera de la función, el parámetro formal que se pase por referencia va precedido por el operador de dirección (&)

En la llamada a la función, el parámetro real que se pasa por referencia se pasa como en el paso por valor

El paso por referencia permite que una función puede devolver más de un valor a la función llamante

PASO PARÁMETROS POR REFERENCIAPASO PARÁMETROS POR REFERENCIA

Page 15: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 29 Universidad de Málaga José Antonio Gómez Ruiz

/* ordena tres números */#include <iostream>using namespace std;

int main(){

float num1, num2, num3, temp;cin >> num1 >> num2 >> num3;if (num1 > num2){

temp = num1;num1 = num2;num2 = temp;

}if (num1 > num3){

temp = num1;num1 = num3;num3 = temp;

}if (num2 > num3){

temp = num2;num2 = num3;num3 = temp;

}cout << num1 << num2 << num3;return 0;

}

PASO PARÁMETROS POR REFERENCIAPASO PARÁMETROS POR REFERENCIA

Fundamentos de Informática ETSI Industrial 30 Universidad de Málaga José Antonio Gómez Ruiz

/* Ordena tres números */#include <iostream>using namespace std;void ordena(float &n1, float &n2);

int main(){

float num1, num2, num3, temp;cin >> num1 >> num2 >> num3;ordena(num1 , num2);ordena(num1 , num3);ordena(num2 , num3);cout << num1 << num2 <<num3;return 0;

}

void ordena(float &n1, float &n2){

float temp;if (n1 > n2){ temp = n1;

n1 = n2;n2 = temp;

}}

quedan ligadas

PASO PARÁMETROS POR REFERENCIAPASO PARÁMETROS POR REFERENCIA

Page 16: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 31 Universidad de Málaga José Antonio Gómez Ruiz

/*Ecuación de 2ºgrado. Devolución de más de un valor */#include <iostream>using namespace std;

int ec2grado(float a, float b, float c, float &x1, float &x2);

int main(){

float a, b, c, sol1, sol2;cin >> a >> b >> c;if ( ec2grado(a, b, c, sol1, sol2) )

cout << “las soluciones son ” << sol1 << “ y ” << sol2;else

cout << “No tiene soluciones reales”;return 0;

}int ec2grado(float a, float b, float c, float &x1, float &x2){

float discr; int solreal = 0;discr = b*b-4.0*a*c;if (discr>=0.0){ solreal=1;

x1 = (-b+sqrt(discr))/(2.0*a);x2 = (-b-sqrt(discr))/(2.0*a);

}return solreal;

}

Devuelve tres valores

PASO PARÁMETROS POR REFERENCIAPASO PARÁMETROS POR REFERENCIA

Fundamentos de Informática ETSI Industrial 32 Universidad de Málaga José Antonio Gómez Ruiz

Ejercicio: Supongamos declaradas en main() , las siguientes variables:

float x, y;int m;char c;

Y tenemos una función con la siguiente cabecera:

void prueba(int a, float b, float &c, float &d, char &e);

¿Cuales de las siguientes llamadas son incorrectas? ¿Por qué?

prueba (m+3, 10.5, x, y, c);

prueba (m, 19, x, y);

prueba (35, sqrt(x), x, y, c);

prueba (m, -2.3, sqrt(2.5), y, ‘E’);

prueba (30, 10.2, x, x+y, c);

PASO DE PARÁMETROS: POR VALOR Y PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIAPOR REFERENCIA

Page 17: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 33 Universidad de Málaga José Antonio Gómez Ruiz

Ventajas Desventajas

Por valor

• Aísla• Evita efectos laterales• Permite constantes y

expresiones como parámetro real

• Utiliza más memoria

Por referencia

• Utiliza menos memoria • Solo permite variables como parámetro real

• Puede producir efectos laterales

CUADRO RESUMEN

PASO DE PARÁMETROS: POR VALOR Y PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIAPOR REFERENCIA

Fundamentos de Informática ETSI Industrial 34 Universidad de Málaga José Antonio Gómez Ruiz

Desarrollar, como ejemplo, un programa que pida dos números naturales y muestre el máximo común divisor (MCD) y el mínimo común múltiplo (mcm.) de ambos números.

Se definirá una función que reciba como parámetros dos números naturales y devuelva SIMULTÁNEAMENTE el MCD y el mcm.

Nota: para calcular el MCD de dos números naturales se puede usar el algoritmo de Euclides, el cual utiliza 2 variables que contendrán inicialmente a esos dos números, y tratará de hacer que el contenido de las dos variables llegue a ser el mismo. Para ello se deberá ir restando la menor a la mayor (depositando la resta en la mayor) hasta que ambas contengan el mismo valor, que será el MCD.

El mcm. se puede calcular según la siguiente propiedad: el MCD de dos números naturales multiplicado por su mcm, coincide con el producto de dichos números naturales.

PASO DE PARÁMETROS: POR VALOR Y PASO DE PARÁMETROS: POR VALOR Y POR REFERENCIAPOR REFERENCIA

Page 18: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 35 Universidad de Málaga José Antonio Gómez Ruiz

5.1. Subprogramas como abstracción de operaciones.

5.2. Las funciones en C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. Uso de parámetros: de Entrada, Salida y Entrada / Salida.

5.4. Paso de parámetros: por valor y por referencia.

5.5. LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDAD.

5.6. Funciones matemáticas.

Tema 5: SubprogramasEstructura y Contenidos

Fundamentos de Informática ETSI Industrial 36 Universidad de Málaga José Antonio Gómez Ruiz

En el lenguaje de programación C/C++ no existe el anidamiento de funciones, es decir, dentro del cuerpo de una función no se pueden definir otras funciones, sólo se pueden llamar

Todas las variables declaradas dentro del cuerpo de una función son variables locales a dicha función. Se crean cuando la función es llamada y se destruyen al finalizar la misma

Por tanto, el ámbito de una variable local es sólo el cuerpo de la función donde se ha declarado

Los parámetros formales de una función se comportan como variables locales en el cuerpo de la misma

LOCALIDAD, ANIDAMIENTO, ÁMBITO Y LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDADVISIBILIDAD

Page 19: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 37 Universidad de Málaga José Antonio Gómez Ruiz

Sólo permitiremos declarar variables al principio del cuerpo de las funciones

Con respecto al ámbito de las funciones, como utilizamos la declaración de las mismas antes de la función main(), se pueden llamar unas a otras sin restricción

Si no se utilizase el prototipo como declaración, tendrían que ser definidas en orden de manera que para que una función pudiese llamar a otra, la función llamada tendría que estar definida antes de la función que hace la llamada

LOCALIDAD, ANIDAMIENTO, ÁMBITO Y LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDADVISIBILIDAD

Fundamentos de Informática ETSI Industrial 38 Universidad de Málaga José Antonio Gómez Ruiz

Las variables globales son variables que se declaran fuera de la definición cualquier función. Aparecen al principio del programa, justo después de las sentencias del preprocesador

El ámbito de estas variables es global: se pueden utilizar en el cuerpo de cualquier función

El uso de variables globales está desaconsejadouso de variables globales está desaconsejado, especialmente en programadores noveles, debido a los efectos colaterales que se pueden producir.

Si existiesen variables globales y locales con el mismo identificador, el ámbito correspondería a la variable local

No utilizaremos variables globalesNo utilizaremos variables globales: toda la información que reciba una función lo hará a través de su interfaz

LOCALIDAD, ANIDAMIENTO, ÁMBITO Y LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDADVISIBILIDAD

Page 20: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 39 Universidad de Málaga José Antonio Gómez Ruiz

#include <iostream>using namespace std;

int a; /* variable global */

int func1( int );int func2( int );int func3( int );

int main(){ int x=3;

a=x-1; /* modifico la variable global */x=func1(a); a=func2(x); /* modifico la variable global */x=func3(a);cout << “x=” << x << “, a=” << a; return 0;

}

int func1(int a){ return a*a; }int func2(int x){ int a=1;

return a+x;}int func3(int x){ return a+x; }

x=10, a=5

LOCALIDAD, ANIDAMIENTO, ÁMBITO Y LOCALIDAD, ANIDAMIENTO, ÁMBITO Y VISIBILIDADVISIBILIDAD

Fundamentos de Informática ETSI Industrial 40 Universidad de Málaga José Antonio Gómez Ruiz

5.1. Subprogramas como abstracción de operaciones.

5.2. Las funciones en C / C++.

5.2.1. Definición de funciones. Parámetros formales y valor de retorno

5.2.2. Llamadas a funciones. Parámetros reales o actuales.

5.2.3. Declaración o prototipos de funciones.

5.3. Uso de parámetros: de Entrada, Salida y Entrada / Salida.

5.4. Paso de parámetros: por valor y por referencia.

5.5. Localidad, anidamiento, ámbito y visibilidad.

5.6. FUNCIONES MATEMÁTICAS.

Tema 5: SubprogramasEstructura y Contenidos

Page 21: SUBPROGRAMAS COMO ABSTRACCIÓN DE OPERACIONES. …janto/ftp/fundinf/trans_t5.pdf · Un programa en C/C++ está estructurado en funciones ¾ De hecho, maines una función, la función

Fundamentos de Informática ETSI Industrial 41 Universidad de Málaga José Antonio Gómez Ruiz

Todas se están en <math.h> excepto abs() que está en <stdlib.h>

Las funciones trigonométricas operan en radianes

arco tangentedouble atan(double)

arco cosenodouble acos(double)

arco senodouble asin(double)

tangentedouble tan(double)

cosenodouble cos(double)

senodouble sin(double)

raíz cuadradadouble sqrt(double)

Potenciadouble pow(double,double)

logaritmo decimaldouble log10(double)

logaritmo neperianodouble log(double)

exponencialdouble exp(double)

valor absolutoint abs(int)

FUNCIONES MATEMÁTICASFUNCIONES MATEMÁTICAS

Fundamentos de Informática ETSI Industrial 42 Universidad de Málaga José Antonio Gómez Ruiz

Tema 5: Subprogramas

FIN DEL TEMA