Tema 7c Entrada y salida de funciones. Funciones Funcion Entradas SalidasTareas.

Post on 22-Jan-2016

227 views 0 download

Transcript of Tema 7c Entrada y salida de funciones. Funciones Funcion Entradas SalidasTareas.

Tema 7c

Entrada y salida de funciones

Funciones

Funcion

Entradas SalidasTareas

Funciones

Funcion

int promedio(int n1, int n2, int n3){…

}

FuncionesRecibir entradas

Realizar calculos, tranformaciones, etc.

Preparar resultado

Entregar resultados

Validar entradas

Funciones

• En este tema nos centraremos en– La recepción y validacion de entradas.– Los detalles del cuerpo de la funcion– La preparacion y entrega de la salida.

• Partiremos por la salida por ser más simple.

Salida de una función

• Una función realiza transformaciones y calculos sobre las entradas para generar una salida.

• Una vez que se ejecutan todos los pasos necesarios la salida es “devuelta” a quien invocó a la función.

• La devolución de la salida implica el termino de la función– Una vez devuelto el resultado, el programa sigue su

ejecucion justo despues de la invocación.

Salida de una función

• Una función debe definir el tipo de dato que devuelve– int

– double

– char

– void

– etc.

• El valor que devuelva debe ser consecuente con el tipo de dato especificado.

La instrucción “return”

• Para indicar el valor “devuelto” por la función, se utiliza la palabra reservada return.

• Return indica que ha llego el momento de entregar la salida al invocador– Es necesario entregar el valor a devolver– Implica el termino de la función

La instrucción “return”

return <sentencia> ;

Palabra reservada Fin de instruccion

return <variable>return <valor>return <var1><operador><var2>etc…

La instrucción “return”

return suma;

return 0;

return contador>1;

return suma-4;

return (a = = b);

La instrucción “return”

double pi(){ return 3.1415;}

void main(){…printf(“El valor de pi es %f\n”,pi()); …

}

13

2

4

La instrucción “return”

double pi(){ return 3.1415;}

void main(){printf(“El valor de pi es %f\n”,pi());

}

double pi(){ return 3;}

double pi(){ return “3.1415”;}

La instrucción “return”

• La instrucción return debe entregar un valor acorde al tipo especificado en la declaración

• Además, indica el termino de la función– Una vez invocado, no se ejecutan mas

instrucciones de la función.– ¿Tiene sentido entonces definir instrucciones

despues de ella?

Ejemplo 1

int leerNumero(){int n=0;scanf(“%d”,&n);return n;

}

int leerNumero(){int n=0;scanf(“%d”,&n);return n;printf(“ok”);

}Nunca se ejecuta

Ejemplo 2int leerPositivo(){

int n=0;scanf(“%d”,&n);if(n>0)

return n;}

int leerPositivo(){int n=0;scanf(“%d”,&n);if(n>0)

return n;else{

printf(“error”);return 0;

}}

¿Y si n<=0?

Ejemplo 3double leerInteres(){

double i=0;printf(“Interes?[0-100]%:”);scanf(“%lf”,&i);if(i<0)

return 0;i= i/100;return i;

}

void main(){double i1=0,i2=0;i1=leerInteres();//usuario ingresa -1i2=leerInteres();//usuario ingresa 56printf(“Intereses: %f y %f”, i1,i2);

}

12

4

5

6

7

8

3

10

11

12

13

9

14

15

Retorno de void

• Si la función especifica un tipo de retorno “void” puede utilizar a “return” sin especificar un valor.

• Sirve para terminar la ejecucion de una función.

• Si no se utiliza ningun “return”, la función termina con el cierre de llave (‘}’)

Retorno de void

void escribirMucho(){int i=0;for(i=0;;i=i*2){

printf(“%d-”,i);if(i%7==0)

return;}

}

Retorno en “main”

• Si la funcion main se define como void, return termina la aplicación

• Main se puede definir con devolución entera– El sistema operativa interpreta este valor como

“ejecutado con éxito”, “termino forzoso” u otro.– Altamente dependiente del sistema operativo.

Retorno en “main”

int main(){double i1=0,i2=0;i1=leerInteres();if(i1==0)

return 0;i2=leerInteres();if(i1==0)

return 0;

printf(“Intereses: %f y %f”, i1,i2);return 1;

}

Retorno en “main”

• Otra forma de poner termino a un programa es con la función “exit”.

• “exit” finaliza el programa desde cualquier parte (incluso dentro de funciones).

• “exit” recibe como parámetro el valor que se entrega al sistema operativo.– Si se omite, por norma se entrega un cero.

Retorno en “main”double leerInteres(){

double i=0;

printf("Interes?[0-100]%:");

scanf("%lf",&i);

if(i<0)

exit(0);//return 0;

i= i/100;

return i;

}

void main(){

double i1=0,i2=0;

i1=leerInteres();

if(i1==0)

printf("Error");//return 0;

i2=leerInteres();

if(i1==0)

printf("Error");//return 0;

printf("Interes:%fy%f", i1,i2);

//return 1;

}

Cuerpo de una función

• El cuerpo de una función es un conjunto de instrucciones

• Se pueden definir variables locales– Estas variables solo son visibles dentro de la

función.– El función no puede afectar cosas fuera de ella.– Los nombres de variables debe ser únicos solo

dentro de ella.

Cuerpo de una función

• Variables globales– Son variables definidas fuera de toda función.– Cualquiera las puede leer y modificar.– Deben ser únicas a través de todo el programa.

• Las variable globales pueden sustituir la entrada y la salida!

Cuerpo de una funciónint x;void f(){

int y;x=1;

}

void g(){int z;y=z;

}Void h(){

int w;w=x;

}

Y no es accesibledesde aqui

Cuerpo de una funciónint n1,n2;double pa, pg;

void promedios(){pa = (n1+n2)/2;pg = sqrt(n1*n2);

}

void main(){n1=80;n2=30;promedios();printf("promedios: %.0f - %.0f\n",pa,pg);

}

Permite que la funciónentregue más de un valor

Entrada de una función

• Las entradas de una función se definen en forma de parámetros.

• Los parametros se definen por un nombre y un tipo.

• Actuan como variables locales de la función.

• Definen la forma en que la función debe ser invocada.

Entrada de una función

<retorno> <nombre>(<lista parametros>);

<tipo> nombre, <tipo> nombre, …

<nombre>(<lista valores>);

Entrada de una función

int f(int a, double d, char c){…

}

int main(){f(1, 1.0, ’1’);f(0);f(12.5, 12.5, ’a’);f(‘a’, 12, 12.5);

}

Bien!

Faltan parámetros

Error de tipos (funciona)

Parámetros en desorden

Entrada de una función#include <stdio.h>

void mostrarLinea(char c, int n){int i;for(i=0;i<n;i++)

printf("%c",c);printf("\n");

}void mostrarPorcentaje(double porc){

printf("%.2f%%\n",100*porc);}

void main(){mostrarLinea('*',6);mostrarPorcentaje(0.12345);mostrarLinea('*',6);

}

Entrada de una función

void mostrarPorcentajeYLineas(double porc,char c,int n)

{mostrarLinea(c,n);mostrarPorcentaje(porc);mostrarLinea(c,n);

}

void main(){mostrarPorcentajeYLineas(0.89766,'*',6);

}

Entrada de una función

• Al definir parámetros, definimos los valores que deben ser entregados al hacer la invocación.

• Los valores utilizados en la invocación se asignan a las variables que representan los parámetros.

• Este proceso se denomina “paso de parámetros”• ¿Qué pasa si se modifican estas variables?

Paso de parámetrosint validar(int n){

if(n>0 && n<10)return 1;

else{n=1;return 0;

}}

void main(){int i;printf("Ingrese numero: ");scanf("%d", &i);if(validar(i))

printf("%d esta ok\n",i);else

printf("%d esta mal\n",i);}

Paso de parámetros

• En el caso anterior, al modificar el parámetro, no pasa nada con la variable original.

• Esto se llama “paso por valor”• Es la forma por defecto• La función no puede modificar las variables

entregadas en la invocación.• ¿Cómo funciona scanf entonces?

Paso de parámetros

• Existe una segunda manera de pasar parametros

• Se denomina “paso por referencia”

• Esto permite modificar las variables entregadas en la invocación.

Paso de parámetrosint validar(int *n){

if((*n)>0 && (*n)<10)return 1;

else{(*n)=1;return 0;

}}

void main(){int i;printf("Ingrese numero: ");scanf("%d", &i);if(validar(&i))

printf("%d esta ok\n",i);else

printf("Estaba mal, pero lo arregle a %d\n",i);

}

Paso de parámetros

• El paso por referencia modifica– La definición de la función.– El cuerpo de la función.– La invocación de la función.

• Lo que sucede es que en vez de entregar el solo el valor de la variable de origen, se entrega la variable misma (una referencia a ella)

• A continuación veremos el significado de los operadores ‘*’ y ‘&’.

Paso de parámetros

132 45

Paso de parámetros

51

70

23

1288

Memoria

A

B

C

D

1

2

3

4

Dirección de la variable

Nombrede la variable

Valor de la variable

Paso de parámetros

51

70

23

1288

A

B

C

D

1

2

3

4

•A: la variable llamada A•A tiene un tipo definido (int).•Leer A entrega el valor almacenadoen la variable (51).•Modificar A cambia el valor almacenado.

•&A: extrae la dirección de la variable•A tiene un tipo definido (int).•Leer &A entrega la dirección donde se almacena la variable (1).•Modificar &A no es válido.

•*A: un puntero a alguna variable•A tiene un tipo definido (direccion o puntero a int).•Leer A entrega la dirección a la cual apunta A.•Leer *A entrega el contenido de la variable a la cual apunta A•Modificar *A modifica el contenido de la variable a la cual apunta A.

Paso de parámetrosint validar(int *n){

if((*n)>0 && (*n)<10)return 1;

else{(*n)=1;return 0;

}}

void main(){int i;printf("Ingrese numero: ");scanf("%d", &i);if(validar(&i))

printf("%d esta ok\n",i);else

printf("Estaba mal, pero lo arregle a %d\n",i);

}

Entrega la direccion dondese almacena i

Recibe un punteroa un variable int.Equivale a decirint* n

Consulta y modifica el contenido de la variable entrega por referencia (i)

Ejemplo 1

void intercambiar(int *a, int *b){

int temp;temp=*a;*a = *b;*b=temp;

}

void main(){int x,y;x=1;y=3;printf("Antes: %d - %d\n",x,y);intercambiar(&x,&y);printf("Despues: %d - %d\n",x,y);

}

Ejemplo 2void promedios(int n1, int n2, double* pa, double* pg){

*pa = (n1+n2)/2;*pg = sqrt(n1*n2);

}

void main(){int c1,c2;double pg, pa;c1=80;c2=30;promedios(c1,c2,&pa,&pg);printf("promedios: %.0f - %.0f\n",pa,pg);

}

Fin Tema 7c

Entrada y salida de funciones