Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Subprogramas
Programación de Computadores
IWI-131-p1
Prof.: Teddy Alfaro Olave
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
1
Descomponiendo
Ejemplo
#include <stdio.h> include <stdio.h>
int max3(int n1, int n2, int n3) {
int main(int argc, char *argv[]) { if (n1>=n2 && n1>=n3)
int num1,num2,num3, max; return n1;
else
printf("ingrese 3 numeros\n"); if(n2>=n1 && n2>=n3)
scanf("%d %d %d",&num1,&num2,&num3); return n2;
else
if (num1>=num2 && num1>=num3) return n3; }
max=num1; int main( ) {
else int num1,num2,num3, max;
if(num2>=num1 && num2>=num3)
max=num2; printf("ingrese 3 numeros\n");
else scanf("%d %d %d",&num1,&num2,&num3);
max=num3;
max=max3(num1,num2,num3);
printf("el maximo es %d\n",max);
printf("el maximo es %d\n",max);
return 0;
} return 0; }
2
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 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);
3
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
4
Formato general
• La forma de declarar funciones es la siguiente. Si se
tratase de un prototipo no tendria cuerpo.
Declaración
tipo_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
5
Ejemplo de fibonacci
#include <stdio.h>
int fibonacci(int n) {
int v1=1,v2=1,i,suma; Toda función termina su
if(n==1||n==2)
return 1;
ejecución cuando
else { encuentra un return (el
for(i=3;i<=n;i++) { primero que encuentre),
suma = v1+v2;
v1=v2; en el cual debe devolver
v2=suma; el tipo de dato acorde al
}
return suma;
declarado que devuelve
} la función
}
int main( ) {
printf("fibonacci(%d) es %d\n",10,fibonacci(10));
return 0;
}
Ejercicio 1
• La función seno puede ser aproximada:
6
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
7
#include <algo.h>
Variables Globales
int global_i, global_j,global_k;
Variables Locales
int funcion1(int param1, char param2) De funcion1
{ int l_i,l_j; //cuerpo retornando un entero}
int main( ) {
Variables Locales
int i,j; float dec; char letra;
del main
i=funcion1(3,10);
dec=fucion2(i,10,i%2);
letra=funcion4( ); Parametro formal
fucion3(letra);
return 0; } Parametro actual
8
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
9
Determinar las salidas
int i,j,k; int main(){
i=0; j=1; k=2;
void p_uno(int p) { p_uno(10);
int i=10,a; printf("p:i %d\n",i);
a=j+k+i; printf("p:j %d\n",j);
printf("a es %d\n",a); k=13-f_uno(3,5);
j= a % p; printf("f:i %d\n", i);
} printf("f:funcion
%d\n",k);
int f_uno(int e1,int e2) {
int n,m; return 0;
i=100; }
return (e1*e2/j); a es 13
} p:i 0
p: j 3
f: i 100
f:funcion 8
Tipos de Funciones
1.- Funciones diseñadas para realizar operaciones
con 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.
10
Función main()
• Como ya se señaló, es la función principal
en un programa.
• Cuando se utiliza return, el programa
devuelve un código de terminación al
proceso de llamada (Sistema Operativo).
• El valor devuelto puede ser 0 que indica
terminación normal o cualquier otro valor
cuando se produce un error.
11
Paso de Parámetros por Valor
Se 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);
12
Ejemplo simple
#include <stdio.h> La función “procedimiento”
que requiere 2 parametros enteros
void procedimiento(int* x, int y) {
(*x)++; El paso del parámetro
y++; y es sólo por valor
printf("%d %d\n",*x,y);
} El paso del parámetro
x es por referencia
int main(){
int a=0,b=0; El primer parámetro es por referencia, se le entrega
procedimiento(&a,b); la dirección con “&a”, y todos los cambios hechos
printf("%d %d\n",a,b); en la variable x serán hechos también en la variable
return 0; a. El parámetro formal x es reemplazado totalmente
} por 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 intercambiados
void 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;
}
13
Volviendo al ejemplo 2
void 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;
}
14
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)
}
15
Funciones recursivas
A. Número natural:
I. 1 es un número natural
II. El sucesor de un número natural es un número natural
B. La función factorial, para enteros no negativos:
I. 0! = 1
II. Si n>0 entonces n! = n*(n-1)!
C. Máximo común divisor, para enteros positivos.
Mcd(m,n):
I. mcd(m,0) = m
II. Si n>0 entonces mcd(m,n) = mcd(n, m mod n)
D. Números de Fibonacci:
I. Fib( 0 )=1; Fib( 1 ) =1
II. Fib( n ) = Fib( n-1 ) + Fib( n-2 )
Ejemplos
double factorial(int n) { double fibonacci(int n) {
if (n==0) if(n==1 || n==0 )
return 0.0; return 1.0;
else else
return n*factorial(n-1); return fibonacci(n-1)+fibonacci(n-2);
} }
16
Punteros
• Un puntero es una referencia a una dirección de
memoria (que apunta a una dirección de memoria)
• Se declara como
tipo_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
12 100 b_puntero
100 a
int a; -
.
int *b_puntero;
.
b_puntero=&a; .
130 - valor
17
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.
programa argumento1 argumento2 ….
Línea de órdenes
18
Ejemplo 4
#include <stdio.h>
>>programa Alumno
Hola Alumno
>>programa
Ha olvidado escribir su nombre
19