Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos...

19
1 Subprogramas Programación de Computadores IWI-131-p1 Prof.: Teddy Alfaro Olave Departamento de Informática Universidad Técnica Federico Santa María Subprogramas Estrategia “divide y conquistarás” Un programa puede volverse complejo, esta complejidad puede ser abordada dividiendo el programa en subprogramas más pequeños y más manejables. Programación Top-Down. Conociendo nuestra meta, precedemos a dividir nuestro problema en tarea concurrentes

Transcript of Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos...

Page 1: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

1

Subprogramas

Programación de ComputadoresIWI-131-p1

Prof.: Teddy Alfaro Olave

Departamento de InformáticaUniversidad Técnica Federico Santa María

Subprogramas

• Estrategia “divide y conquistarás”• Un programa puede volverse complejo, esta

complejidad puede ser abordada dividiendo el programa en subprogramas más pequeños y más manejables.

• Programación Top-Down. Conociendo nuestra meta, precedemos a dividir nuestro problema en tarea concurrentes

Page 2: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

2

Descomponiendo

Program muy_grande;

Programa muy largo y complejo

SubPrograma1

SubPrograma2

SubPrograma3

Program muy_grande;

Ejecuta subPrograma1

Ejecuta subPrograma2

Ejecuta subPrograma1

Ejecuta subPrograma3

Ejemplo#include <stdio.h>

int main(int argc, char *argv[]) {int num1,num2,num3, max;

printf("ingrese 3 numeros\n");scanf("%d %d %d",&num1,&num2,&num3);

if (num1>=num2 && num1>=num3)max=num1;

elseif(num2>=num1 && num2>=num3)

max=num2;else

max=num3;

printf("el maximo es %d\n",max);

return 0;}

include <stdio.h>int max3(int n1, int n2, int n3) {

if (n1>=n2 && n1>=n3)return n1;

elseif(n2>=n1 && n2>=n3)

return n2;else

return n3; }int main( ) {

int num1,num2,num3, max;

printf("ingrese 3 numeros\n");scanf("%d %d %d",&num1,&num2,&num3);

max=max3(num1,num2,num3);

printf("el maximo es %d\n",max);

return 0; }

Page 3: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

3

Subprogramas en C• Existen 2 tipos de subprogramas: Las Funciones

y los Procedimientos.• Las funciones son un conjuntos de instrucciones

que deben devolver un resultado. En cambio un procedimiento sólo realiza un conjunto de instrucciones

• Para C, los procedimientos también los considera como funciones, solo que devuelven un resultado tipo void

• Una función es subprograma que representa una abstracción de una expresión compleja. Su utilización es similar a la matemática, recibe 0 o más parámetros, y devuelve un único resultado.

Prototipos de Función

• Todas las funciones deben ser declaradas antes de ser usadas.

• Este requisito se cumple mediante la utilización del prototipo

• Prototipo especifica la interfaz de datosinterfaz de datos de una función por:– Tipo que retorna– El tipo de sus parámetros– El numero de sus parámetros

• Ejemplo:int cuadrado(int i); int cuadrado(int);

Page 4: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

4

Los prototipos

• Nos permiten programar abstrayendonos de funciones que aun no hemos programado

• Además, proveen información para que el compilador pueda detectar problemas en la cantidad de paramentros, y en la no compatibilidad de tipos de datos

Ejemplo con Prototipoinclude <stdio.h>int max3(int , int , int ) ;int main( ) {

int num1,num2,num3, max;

printf("ingrese 3 numeros\n");scanf("%d %d %d",&num1,&num2,&num3);

max=max3(num1,num2,num3);

printf("el maximo es %d\n",max);

return 0; }int max3(int n1, int n2, int n3) {

if (n1>=n2 && n1>=n3)return n1;

elseif(n2>=n1 && n2>=n3)

return n2;else

return n3; }

include <stdio.h>int max3(int n1, int n2, int n3) {

if (n1>=n2 && n1>=n3)return n1;

elseif(n2>=n1 && n2>=n3)

return n2;else

return n3; }int main( ) {

int num1,num2,num3, max;

printf("ingrese 3 numeros\n");scanf("%d %d %d",&num1,&num2,&num3);

max=max3(num1,num2,num3);

printf("el maximo es %d\n",max);

return 0; }

Page 5: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

5

Formato general

• La forma de declarar funciones es la siguiente. Si se tratase de un prototipo no tendria cuerpo.

tipo_dato_r Nombre_funcion(tipo_dato1 parametro1,tipo_dato2 parametro2,

..........tipo_dato_n parametro_n)

{ cuerpo del subprograma retornando un resultado de tipo tipo_dato_r

}

Declaracióntipo_dato_r Nombre_funcion(tipo_dato1 parametro1,

.......tipo_dato_n parametro_n)

{ cuerpo del subprograma retornando un resultado de tipo tipo_dato_r }

• Nombre_funcion: es el identificar con el cual llamaremos a la función

• Parámetros: son el conjunto de valores que se necesitan para hacer el cálculo. Cada parametro tiene su tipo

• Tipo_dato_r: es el tipo de dato del resultado que se espera entre la función

Page 6: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

6

Ejemplo de fibonacci#include <stdio.h>

int fibonacci(int n) {int v1=1,v2=1,i,suma;if(n==1||n==2)

return 1;else {

for(i=3;i<=n;i++) {suma = v1+v2;v1=v2;v2=suma;

}return suma;

}}

int main( ) {printf("fibonacci(%d) es %d\n",10,fibonacci(10));return 0;

}

Toda función termina su ejecución cuando encuentra un return (el primero que encuentre), en el cual debe devolver el tipo de dato acorde al declarado que devuelve la función

Ejercicio 1

• La función seno puede ser aproximada:

La precisión del en esta serie infinita puede ser ajustada de acuerdo a n, es decir, mientras mayor sea el n más preciso.Se pide desarrollar un programa C, que permita calcular aproximación del seno de un determinado número y un ndado. Además del resultado de la aproximación, se debe mostrar el error real al compararla con la función sin( ) de C.Cree las fuciones potencia y factorial para ayudarse.

Page 7: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

7

Ejercicio 2

• Un número se dice palindrome si al invertir sus digitos se obtiene el mismo valor. Ejemplo 12321 es un número palíndrome.12345, no es palíndrome, ya que al invertirlo queda 54321.Realizar un programa C que determine si un número es palíndrome o no por medio de la creación y uso de una función llamada invierte

Manejos de Variables entre subprogramas

• Ya sabemos que cada variable tiene asociado su tipo de dato. Pero además debemos tener muy claro que existe otra clasificación: variables globales, variables locales, y parámetros formales. Esta última clasificación restringe a una variable en cuando o no puede ser accesada, y además su volatilidad (tiempo de vida).

Page 8: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

8

#include <algo.h>int global_i, global_j,global_k;

int funcion1(int param1, char param2){ int l_i,l_j; //cuerpo retornando un entero}

float funcion2(int param1,int param2, int param3){ char l_i; //cuerpo retornando un decimal}

char funcion4( ){ char c; int digit; //cuerpo retornando un caracter}

void funcion3(char param1){ flot s; //cuerpo de procedimiento, no retorna nada}

int main( ) {int i,j; float dec; char letra;i=funcion1(3,10);dec=fucion2(i,10,i%2);letra=funcion4( );fucion3(letra);return 0; }

Variables GlobalesVariables LocalesDe funcion1

Variable Localde funcion2

Variable LocalDe funcion3

Variables LocalesDe funcion4

Variables Localesdel main

Parametro formal

Parametro actual

Variables locales vs globales

• Variables Locales:– Está declarada dentro de la función y sólo está

disponible durante su ejecución.– Se crean cuando se entra a una función y se destruyen

cuando se sale.• Variables globales:

– Se declaran en el programa principal. Pueden ser utilizados por el programa y los subprogramas (funciones).

– Existen durante toda la vida del programa.

Page 9: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

9

Parámetro formal vs actual• Parámetros formales

– Corresponden a la difiniciones de los parámetros de una función, deben tener su tipo dato y sus nombres identificadores. Un parámetro formal se comporta como otra variable local dentro de la función.

• Parámetros actuales– Estos corresponden a los valores o expresiones con los

cuales es llamada la función. El parámetro formal es instanciado con el parámetro formal

Retorno de una función

• Una función retorna a la rutina que lo llamo cuando:– Se encuentra la llave que cierra la función– O cuando la sentencia de return es ejecutada

• Puede ser usada con o sin un valor asociado• Sin embargo, si la función fue declarada como

aquella que retorna un valor de un cierto tipo, entonces debe retornar un valor.

• Solo funciones declaradas con tipo void pueden usar el return sin valor

Page 10: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

10

Determinar las salidasint i,j,k;

void p_uno(int p) {int i=10,a;a=j+k+i;printf("a es %d\n",a);j= a % p;

}

int f_uno(int e1,int e2) {int n,m;i=100;return (e1*e2/j);

}

int main(){i=0; j=1; k=2;p_uno(10);printf("p:i %d\n",i);printf("p:j %d\n",j);k=13-f_uno(3,5);printf("f:i %d\n", i);printf("f:funcion

%d\n",k);

return 0;}

a es 13p:i 0p: j 3f: i 100f:funcion 8

Tipos de Funciones

1.- Funciones diseñadas para realizar operacionescon sus argumentos y devolver un valor basado en sus cálculos.

2.- Funciones que manipulan información y devuelven un valor que indica simplemente el éxito o el fallo de esa manipulación.

3.- Funciones que no tienen valor de vuelta explícito, es decir, es de tipo procedimiento y no genera un valor.

Page 11: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

11

Función main()

• Como ya se señaló, es la función principal en un programa.

• Cuando se utiliza return, el programadevuelve un código de terminación al proceso de llamada (Sistema Operativo).

• El valor devuelto puede ser 0 que indicaterminación normal o cualquier otro valor cuando se produce un error.

Argumentos de las funciones

funcion(param1, param2, param3, param4,....);• Los argumentos están definidos por los parámetros

formales, y utilizados con los parametros actuales. Es la manera de entregarle la información al subprograma.

• Se comportan como variables locales• El paso de los parámetros puede ser por valor o por

referencia

Page 12: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

12

Paso de Parámetros por ValorSe pasan valores desde el punto de invocación hacia la función. El parámetro formal es una variable local, mientras que el parámetro actual es una expresión que sustituye el correspondiente parámetro formal (sustitución por valor). Una vez finalizada la función se retorna a la siguiente instrucción de la invocación, sin provocar cambios en la variables de ambiente ( a excepción de la modificación directa de variables globales).

int max(int a, int b); k=max(u, v);

Paso de parámetros por Referencia

Se permite transferir información desde el punto de invocación hacia la función, y el retorno de resultados desde la función. Los resultados son entregados por medio de variables visibles o accesibles, llamados parámetros formales variables (precedidos por *). Se les llamas variables por referencia, ya que no se crea un nuevo espacio para el parámetro formal, sino que se hace una referencia a la variable actual durante la ejecución del procedimiento. El parámetro formal en este caso es sólo una variable muda.

int max(int *a, int *b); k=max(&u, &v);

Page 13: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

13

Ejemplo simple#include <stdio.h>

void procedimiento(int* x, int y) {(*x)++;y++;printf("%d %d\n",*x,y);

}

int main(){int a=0,b=0;procedimiento(&a,b);printf("%d %d\n",a,b);return 0;

}

La función “procedimiento”que requiere 2 parametros enteros

El paso del parámetro x es por referencia

El paso del parámetroy es sólo por valor

El primer parámetro es por referencia, se le entregala dirección con “&a”, y todos los cambios hechosen la variable x serán hechos también en la variablea. El parámetro formal x es reemplazado totalmentepor el parámetro actual a (misma dirección de memoria), por eso se que x es solo una variable muda

Ejemplo 3• Desarrollar una función intercambio, que reciva dos numeros

como parametro y los devuelva intercambiadosvoid intercambio(int *x, int *y){

int temp;temp=*x; *x=*y; *y=temp; printf(“\n x=%d y=%d temp=%d “,*x,*y,temp);

}main( ){

int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio (&a,&b); printf("a=%d b=%d\n",a,b); return 0;

}

Page 14: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

14

Volviendo al ejemplo 2void invierte(int* n) {

int tmp;tmp = *n;*n=0;while(tmp>0) {

*n = (*n)*10+tmp%10;tmp/=10;

}}

int main( ){int num;

scanf("%d",&num);invierte(&num);printf("invertiendo es %d\n",num);return 0;

}

Ejercicio, determine las salidasint i,j,k;

void p1(int* a, int* b) {int aux;aux=*a;*a=*b;*b=aux; }

void p2(int* a, int b) {if(*a>b)

*a=(*a)-b+j;else

b=b-(*a)/i; }

double f1(int x, int y) {x*=x;y*=y;return sqrt(x + y); }

int f2(int* u, int* v,int c) {int k=4;*v=(*u)+c;return (j+k)>((*u)+(*v) ); }

int main( ){i=1; j=0; k=0;p1(&i,&j);printf("%d %d %d\n",i,j,k);p2(&j,i+k);printf("%d %d %d\n",i,j,k);k++; i=k+1;printf("f1 es %f\n",f1(k,i));printf("%d %d %d\n",i,j,k);if(!(f2(&i,&k,3)))

printf("%d %d %d\n",i,j,k);return 0; }

0 1 0

0 2 0

F1 es 2.2361

2 2 1

2 2 5

Page 15: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

15

Invocación de funciones

• Recordar que las variables globales pueden ser accesadas por cualquier función

• Si en una función existe una variable local de igual nombre que una global, es la variable local con la que se trabaja

• Normalmente del main invocamos las funciones, pero cualquier función puede invocar a otra función que ya ha sido definida, incluso puede llamarse a si misma (recursividad).

Recursividad

• Función que se llama a si misma. Un objeto se dice recursivo si está definido en términos de sí mismo

void diez_veces(int v) {if(v==10)

return;else

diez_veces(v+1)}

Page 16: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

16

Funciones recursivasA. Número natural:

I. 1 es un número naturalII. El sucesor de un número natural es un número natural

B. La función factorial, para enteros no negativos:I. 0! = 1II. Si n>0 entonces n! = n*(n-1)!

C. Máximo común divisor, para enteros positivos. Mcd(m,n):

I. mcd(m,0) = mII. Si n>0 entonces mcd(m,n) = mcd(n, m mod n)

D. Números de Fibonacci:I. Fib( 0 )=1; Fib( 1 ) =1II. Fib( n ) = Fib( n-1 ) + Fib( n-2 )

Ejemplosdouble factorial(int n) {

if (n==0)return 0.0;

elsereturn n*factorial(n-1);

}

int mcd(int m,n) {if n==0

return m;else

return mcd(n,m%n)}

double fibonacci(int n) {if(n==1 || n==0 )

return 1.0;else

return fibonacci(n-1)+fibonacci(n-2);}

main( ){printf("factorial de 6 %f\n",factorial(4) );printf("mcd 54 18 es %d\n",mcd(54,18) );printf("fibonacci 7 es %f\n",fibonacci(7)

);}

Page 17: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

17

Punteros• Un puntero es una referencia a una dirección de

memoria (que apunta a una dirección de memoria)• Se declara comotipo_dato * nombre_variable;Se trabaja con dos operadores unarios: * , &• * retorna el valor de la variable localizada en la

dirección de memoria• & retorna la dirección de memoria del operando• Ejemplos

int *num;scanf(“%d”,&x);

Ejemplo

100

-

-

.

.

.

12 b_puntero

100 a

130 valor

int a;int *b_puntero;b_puntero=&a;

Page 18: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

18

Asignando Valores a través de Punteros

• Los punteros pueden ser usados al lado izquierdo de las sentencias de asignación

• Ejemplo:– Asignar un valor a la ubicación apuntada por el puntero

int *ptr;*ptr=101;

– Incrementar y decrementar en Punteros(*ptr)++;Recordar utilizar paréntesis alrededor de las expresiones

punteros.

Argumentos de main()

• El estándar ANSI define dos argumentos de main(): argc y argv.

• Permite pasar información al programa de C mediante argumentos de línea de órdenes.

• argc : contiene el número de argumentos, y es entero.

• argv : es un puntero a un arreglo de caracteres.

programa argumento1 argumento2 ….

Línea de órdenes

Page 19: Subprogramasnoell/IWI-131-p1/Tema7.pdf · 2004. 9. 1. · 3 Subprogramas en C • Existen 2 tipos de subprogramas: Las Funciones y los Procedimientos. • Las funciones son un conjuntos

19

Ejemplo 4#include <stdio.h>

main(int argc, char *argv[]){if(argc!=2){

printf(“Ha olvidado escribir su nombre\n”);return 1;

}printf(“Hola %s”,argv[1]);return 0;

}

>>programa AlumnoHola Alumno>>programaHa olvidado escribir su nombre