Вы находитесь на странице: 1из 58

TEMA 5

SUBPROGRAMAS
Elementos de Programacin I

Contenido del Tema


T T E E M M A A 5 5
5.1. Concepto. Tipos de parmetros 5.1.1. Subprogramas como abstraccin de operaciones. Aplicacin del diseo descendente. 5.1.2. Definicin y llamada a subprogramas. Parmetros formales y reales. 5.1.3. Paso de parmetros por valor y por referencia. 5.1.4. Procedimientos y funciones. 5.2. mbitos 5.2.1. Subprogramas anidados 5.2.2. Reglas de mbito 5.2.3. Diseo modular

Elementos de Programacin I

T T E E M M A A 5 5

5.1. Subprogramas.
Conceptos. Tipos de parmetros

Elementos de Programacin I

Subprogramas como abstraccin de operaciones


Diseo descendente: Un problema se divide en subproblemas para conseguir una resolucin ms sencilla. Pasos naturales para la subprogramacin:
Especificacin detallada del problema. Definicin de subproblemas. Asignar estos subproblemas a subalgoritmos.

Elementos de Programacin 4

Subprogramas como abstraccin de operaciones


Ejemplo: Ejemplo Leer una nota numrica e imprimir su calificacin. Pasos: Especificacin del problema Definicin de subproblemas.
Mdulo Principal

Obtener Nota

Imprimir calificacin

Elementos de Programacin 5

Subprogramas como abstraccin de operaciones

Elementos de Programacin 6

Subprogramas como abstraccin de operaciones


Asignar subproblemas a subalgoritmos Subproblema
Mdulo principal Obtener nota Imprimir calificacin

Subalgoritmo
Calificacin ObtenerNotaNumrica ImprimirCalificacin

Al cdigo correspondiente al mdulo raz o principal le llamaremos algoritmo principal y al cdigo de cada uno de los restantes mdulos subalgoritmo Elementos de Programacin 7

Subprogramas como abstraccin de operaciones


Algoritmo principal:
Algoritmo Calificacin VAR R nota INICIO ObtenerNotaNumrica ImprimirCalificacin FIN

Elementos de Programacin 8

Subprogramas como abstraccin de operaciones


Algoritmo Obtener_nota_numrica :
Algoritmo ObtenerNotaNumrica INICIO REPETIR Escribir("Introduzca la nota:") Leer(nota) HASTA QUE (nota >= 0) && (nota <= 10) FIN

Elementos de Programacin 9

Subprogramas como abstraccin de operaciones


Algoritmo ImprimirCalificacin INICIO SI nota == 10 ENTONCES Escribir("Matrcula de Honor") SINO SI nota >= 9 ENTONCES Escribir("Sobresaliente") SINO SI nota >= 7 ENTONCES Escribir("Notable") SINO SI nota >= 5 ENTONCES Escribir("Aprobado") SINO Escribir("Suspenso") FINSI FINSI FINSI FINSI FIN

Elementos de Programacin 10

Subprogramas como abstraccin de operaciones


Qu utilidad tiene la subprogramacin?
Descomponer la dificultad Dividir el trabajo Reutilizacin Facilidad de modificacin. Legibilidad

Pero el cdigo del ejemplo no es totalmente reutilizable. Deberamos hacer uso del concepto de llamada.

Elementos de Programacin 11

Definicin y llamada a subprogramas.


El algoritmo A llama al B
A
1

La instruccin de llamada 1 provoca la ejecucin del algoritmo B sobre los valores que le indiquemos. Al acabar el algoritmo B, puede que nos devuelva unos resultados
Elementos de Programacin 12

Definicin y llamada a subprogramas.


La llamada a un subprograma se realiza escribiendo el nombre del mismo, seguido de las expresiones sobre las que queremos que trabaje. De esta forma se crea una va de comunicacin entre la instruccin de llamada y el algoritmo llamado, facilitando el intercambio de info entre ellos. Pseudolenguaje: Llamada: identificador ( parmetros ) Definicin del subprograma:
Algoritmo [TIPO] identificador (parmetros) declaraciones INICIO sentencias FIN identificador

Elementos de Programacin 13

Parmetros reales y formales


Como la ejecucin de un algoritmo puede depender de algn valor, lo normal es que se le pase en la llamada. Para esto estn los parmetros. En la cabecera de la definicin de un subalgoritmo aparecern los parmetros formales.
Algoritmo [TIPO] nombre ( parmetros formales )

En la llamada al subalgoritmo estarn los parmetros reales (o actuales), que son expresiones separadas por comas.
nombre ( parmetros reales )

Elementos de Programacin 14

Parmetros reales y formales


Ejemplo: Algoritmo que encuentra todos los primos menores que un nmero dado.
Mdulo principal

Nivel 0

Primos_menores

Comprobar si un n esprimo

Nivel 1

Comprobar_si_es_primo

Elementos de Programacin 15

Parmetros reales y formales


Algoritmo Comprobar_si_es_primo VAR N contador B primo INICIO primo = VERDADERO contador = 2 MIENTRAS (contador < Num) Y primo HACER primo = NO (Num MOD contador == 0) contador = contador +1 FINMIENTRAS SI primo ENTONCES Escribir ( Num ) FINSI FIN Comprobar_si_es_primo

Elementos de Programacin 16

Parmetros reales y formales


Es algoritmo principal quedara: Algoritmo PrimosMenores VAR N Numero, cont INICIO Leer (Numero) PARA cont = 1 HASTA (Numero -1) HACER Comprobar_si_es_primo (cont) FINPARA FIN

Elementos de Programacin 17

Parmetros reales y formales


Algoritmo Comprobar_si_es_primo (Num) VAR N contador Este subalgoritmo debe B primo aceptar un valor del algoritmo INICIO principal primo = TRUE contador = 2 MIENTRAS (contador < Num) Y primo HACER primo = NO (Num MOD contador == 0) contador = contador +1 FINMIENTRAS SI primo ENTONCES Escribir ( Num ) FINSI FIN

Elementos de Programacin 18

Parmetros reales y formales


Algoritmo Comprobar_si_es_primo ( N Num) VAR N contador B primo Hay que especificar el tipo del dato que se INICIO va a obtener del programa que llame a este primo = TRUE subalgoritmo contador = 2 MIENTRAS (contador < Num) Y primo HACER primo = NO (Num MOD contador == 0) contador = contador +1 FINMIENTRAS SI primo ENTONCES Eescribir ( Num ) FINSI FIN

Elementos de Programacin 19

Parmetros reales y formales


Los parmetros son opcionales, pero si aparecen deben cumplir las reglas:
El nmero de parmetros formales debe coincidir con el de parmetros reales. El i-simo parmetro real se corresponde con el i-simo formal. El tipo del i-simo parmetro real debe ser igual que el del i-simo formal. Los parmetros de un subalgoritmo pueden ser de cualquier tipo. Los nombres de un parmetro formal y su correspondiente real pueden o no ser diferentes.

Elementos de Programacin 20

Parmetros reales y formales


Interfaz
En programacin se denomina interfaz a la combinacin de los parmetros formales definidos en el subprograma y los parmetros actuales que se pasan en la llamada. La mayora de los errores se presentan debido a una interfaz incorrecta.
Datos de entrada al subalgoritmo

Datos de salida del subalgoritmo

Elementos de Programacin 21

Parmetros: Entrada - Salida


Parmetros de entrada: La palabra E precede a los parmetros formales.
Esto ocurre en el ejemplo anterior.

Parmetros de entrada y salida: La palabra ES precede a los parmetros formales.


Cualquier cambio en el parmetro formal (dentro del subalgoritmo) se reflejara en el parmetro real.

Parmetros de salida: La palabra S precede a los parmetros formales.


Cualquier cambio en el parmetro formal (dentro del subalgoritmo) se reflejara en el parmetro real.

Tipo de la funcin:
La funcin puede devolver un valor de un tipo.

Elementos de Programacin 22

Parmetros: por valor y por referencia


Por valor (E):
Se realiza una copia del contenido del parmetro real en el parmetro formal, siendo stos variables independientes. Esto ocurre en el ejemplo anterior.

Por referencia (ES/S) :


El parmetro formal obtiene una referencia de real. Ahora no son dos variables independientes, son la misma. Cualquier cambio en el parmetro formal (dentro del subalgoritmo) se reflejara en el parmetro real.

Elementos de Programacin 23

Parmetros: por valor y por referencia


Ventajas
? Aisla ? Evita efectos laterales ? Permite constantes y expresiones como parmetro ? Utiliza menos memoria

Desventajas
? Utiliza ms memoria

Por Valor

Por Referencia

? Solo permite variable como parmetro real ? Puede producir efectos laterales

Elementos de Programacin 24

Parmetros: por valor y por referencia


Ejemplo:
Algoritmo EscrMdulo (E R p; ES R q) VAR R modulo INICIO Escribir("El mdulo del complejo",p,"+",q,"i es:") p = p * p q = q * q modulo = sqrt(p+q) Eescribir(modulo) FIN

nmero

El algoritmo principal realiza la siguiente llamada:


EscrMdulo (X, Y)

Elementos de Programacin 25

Parmetros: por valor y por referencia


Qu ocurre tras la llamada?
En la pantalla aparece el resultado. La variable X no habr cambiado. La variable Y valdr ahora Y2
El paso por referencia (ES o S) se tiene que usar con cuidado !
Elementos de Programacin 26

Parmetros: por valor y por referencia


Ejemplo: Ordenar tres nmeros (SIN SUBALGORITMOS)
Algoritmo Ordenar_3_nmeros VAR R Num1,Num2,Num3,temp INICIO Leer(Num1) Leer(Num2) Leer(Num3) SI Num1 > Num2 ENTONCES temp = Num1 Num1 = Num2 Num2 = temp FINSI SI Num1 > Num3 ENTONCES temp = Num1 Num1 = Num3 Num3 = temp FINSI SI Num2 > Num3 ENTONCES temp = Num2 Num1 = Num3 Num3 = temp FINSI Escribir(Num1,Num2,Num3) FIN

Elementos de Programacin 27

Parmetros: por valor y por referencia


Los subprogramas tienen una gran utilidad cuando se repite un mismo tipo de tratamiento. Ejemplo: Ordenar tres nmeros (CON SUBPROGRAMAS)
Algoritmo Ordenar (ES R x,y) VAR R temp INICIO SI x > y ENTONCES temp = x x = y y = temp FINSI FIN

Ordena dos nmeros

Elementos de Programacin 28

Parmetros: por valor y por referencia


Algoritmo Ordenar_3_nmeros VAR R Num1,Num2,Num3,temp INICIO Leer(Num1) Leer(Num2) Leer(Num3) Ordenar(Num1,Num2) Ordenar(Num1,Num3) Ordenar(Num2,Num3) Escribir(Num1,Num2,Num3) FIN

Algoritmo principal

Elementos de Programacin 29

Parmetros: por valor y por referencia


Ejercicio: Supongamos declaradas en un programa principal, las siguientes variables:
R x, y

Zm Cc

Y tenemos un subalgoritmo con la siguiente cabecera:


Algoritmo prueba (E Z a, b; ES R c, d; S C e)

Cuales de las siguientes llamadas son incorrectas? Por qu? prueba (m+3, 10, x, y, c) prueba (30, 10, m, x, c) prueba (m, 19, x, y) prueba (m, m*m, y, x, c) prueba (35, m*10, x, c, y) prueba (m, 10, 35.0, y, E) prueba (m, 3.5, x, y, c) prueba (30, 10, x, x+y, c) prueba (30, 10, c, d, e) prueba (m, m, x, y, c)

Elementos de Programacin 30

Procedimientos y funciones
Todos los algoritmos vistos hasta ahora son procedimientos:
Algoritmo nombre (parmetros formales) declaraciones INICIO acciones FIN

Declaracin

nombre (parmetros reales)

Llamada

Esta llamada constituye por si sola una accin o sentencia del algoritmo llamante
Elementos de Programacin 31

Procedimientos y funciones
Supongamos que queremos un subalgoritmo que calcule la raz cuadrada de un nmero; su cabecera sera:
Algoritmo RazCuadrada ( E R nmero; S Z resultado)

El subalgoritmo realiza una serie de acciones y devuelve un resultado ( y slo uno) al algoritmo llamante, es mejor utilizar otro tipo de subalgoritmo llamado funcin. Una funcin se declara de la forma:
Algoritmo R RazCuadrada (E R nmero) declaraciones INICIO acciones /* Entre ellas al menos una sentencia DEVOLVER */ FIN

Elementos de Programacin 32

Procedimientos y funciones
La llamada a una funcin no puede constituir por si sola una sentencia del algoritmo llamante ! Ejemplos de llamada:
resultado= RazCuadrada ( 34.5 ) resultado= 2.0 * RazCuadrada ( (23.0 / 2.3) +dato_real ) + 66.6

La llamada a una funcin debe aparecer dentro de alguna sentencia del algoritmo llamante, de forma que el valor devuelto se utilice de alguna forma.
Elementos de Programacin 33

Procedimientos y funciones
Las funciones que devuelven un valor lgico son especialmente tiles. Ejemplo:funcin que devuelve si un nmero es primo o no.
Algoritmo B EsPrimo ( E N Num) VARIABLES N contador B primo INICIO primo = TRUE contador = 2 MIENTRAS (contador < Num) Y primo HACER primo = NO (Num MOD contador == 0) contador = contador + 1 FINMIENTRAS DEVOLVER primo FIN

Elementos de Programacin 34

Procedimientos y funciones
Desde el algoritmo principal se puede invocar a la funcin de esta forma:
SI EsPrimo (numero) ENTONCES acciones SINO acciones FINSI

Elementos de Programacin 35

Procedimientos y funciones
Ejemplo: Algoritmo para calcular nmeros combinatorios.
?m ? ? ?n ? ? ? n! ? ? m! ?m ? n?!

Algoritmo N Factorial (E N nmero) VAR N contador, fact INICIO fact = 1 PARA contador = 1 HASTA nmero HACER fact = fact * contador FINPARA DEVOLVER fact FIN

Elementos de Programacin 36

Procedimientos y funciones
Algoritmo Combinatorios VAR N m,n INICIO Leer(m) Leer(n) Escribir(Factorial(m) DIV (Factorial(n) * Factorial(m-n))) FIN

Se puede resolver este problema de forma ms eficiente?

Elementos de Programacin 37

Funcin main() de C/C++


Cada programa C/C++ tiene una funcin main() que es un punto inicial de entrada al programa.
main() { /* Bloque de sentencias */ ... }

Un programa tiene una sola funcin main() . La funcin main() puede tener un tipo: devolver un valor. Ej: int main(){ /*Bloque sentencias*/ return 0; }
Elementos de Programacin 38

Funciones en C/C++
Tipo de resultado Lista de parmetros

float suma (float num1, float num2) { Cabecera de la float resp; Declaracin de funcin
variables

resp = num1 + num2; return resp; {


Valor devuelto

Elementos de Programacin 39

Llamada a una funcin en C/C++


void main() { ... func1(); func2(); ... return; } void func1() { ... return; } void func1() { ... return; }

Elementos de Programacin 40

Paso de parmetros por valor en C/C++


main() { int i=6; func_1(i); return; }

6 func_1(int i) { cout << i; i++; return; }

Elementos de Programacin 41

Paso de parmetros por referencia en C++


main() { int i=6; func_1(i); return; }

Se pasa la direccin de memoria de i


6 func_1(int& i) { cout << i; i++; return; } 7

Los cambios en func_1 afectan a i

Elementos de Programacin 42

Declaracin de una funcin en C/C++


Antes de que una funcin pueda ser invocada, debe ser declarada. Una declaracin de una funcin contiene slo la cabecera de la funcin (llamada prototipo ). tipo_resultado nombre (tipo1 param1, tipo2 param2, ...); Los nombres de los parmetros se pueden omitir: Ojo! double med (double , double ); double med (double x1, double x2);

Elementos de Programacin 43

Archivos de cabecera C/C++


Archivos conteniendo rutinas de biblioteca. Ejs: #include <iostream.h> #include <stdio.h> Archivos conteniendo declaraciones de variables y funciones externas a una funcin. Ej: #include c:\miprog\mifuncion.h puede contener declaraciones de variables/ctes, prototipos de funciones y funciones de un programa en C++ almacenado en mifuncion.cpp
Elementos de Programacin 44

T T E E M M A A 5 5

5.2. mbitos y reglas de alcance

Elementos de Programacin I

Subprogramas anidados
Desde el cuerpo de cualquier procedimiento o funcin se pueden realizar llamadas a otros procedimientos y/o funciones. Para poder invocar a un procedimiento es necesario que se haya declarado antes. Dnde puede estar declarado?
Antes que el algoritmo que realiza la llamada. Dentro de l, en su zona de declaraciones.

Elementos de Programacin 46

to ien m ida An

Subprogramas anidados
Reglas:
Algoritmo Principal
declaraciones vbles y ctes Algoritmo Sub1 vbles y ctes INICIO acciones FIN Algoritmo Sub2 vbles y ctes INICIO acciones FIN .......... Algoritmo Subn vbles y ctes INICIO acciones FIN

Dentro del cuerpo del algoritmo principal se pueden realizar llamadas a cualquier Subi. Dentro del cuerpo de un subalgoritmo Subi se podr llamar a un Subj siempre que j <= i (si j = i estamos ante la Recursividad ).

INICIO acciones FIN

Elementos de Programacin 47

Subprogramas anidados
Puede ser que un subalgoritmo Subi est declarado de la forma:
Algoritmo Subi vbles y ctes
Algoritmo Subi1 vbles y ctes INICIO acciones FIN Algoritmo Subi2 vbles y ctes INICIO acciones FIN .......... Algoritmo Subik vbles y ctes INICIO acciones FIN

Desde Subi se puede invocar a cualquier Subih. Desde un Subip se podr realizar llamadas a otro Subiq siempre que q <= p. Pero adems, tambin es aplicable que: Desde cualquier Subip se puede invocar a un Subj , siempre que j <= i. Si Subj est estructurado de forma similar a Subi: No es posible una llamada a ningn Subjh desde el cuerpo de Subi o desde el cuerpo de cualquier Subip

INICIO acciones FIN

Elementos de Programacin 48

Reglas de mbito
Variables globales:
Declaradas en un algoritmo principal. Son visibles tanto en su cuerpo como en el de los subalgoritmos declarados dentro de el. Declaradas en un subalgoritmo. Slo pueden utilizarse dentro de l. Una variable local a un subalgoritmo se puede considerar como global para con sus algoritmos. Cada vez que se invoca a un subalgoritmo sus variables locales comienzan con valores indefinidos. Cuando un subalgoritmo termina su ejecucin, los valores de sus variables locales se destruyen. Elementos de Programacin 49

Variables locales:

Reglas de mbito
Efecto lateral : Cualquier efecto de un algoritmo sobre otro, que no es a
travs de la interfaz definida explcitamente sobre ellos.
Programa principal y otros procedimientos

Parmetros

Procedimiento

Elementos de Programacin 50

Reglas de mbito
Reglas de mbito: Determinan donde puede ser accedido un identificador
dentro de un algoritmo.

1 2 3 4

Un identificador es accesible desde el cuerpo del algoritmo que lo declara y desde el cuerpo de los algoritmos anidados dentro de l, excepto los de la regla 3. El nombre de un subalgoritmo tambin es accesible desde su propio cuerpo. El mbito de un identificador no se extiende a ningn subalgoritmo anidado que contenga otro identificador con el mismo nombre (precedencia de nombre) El mbito de un parmetro formal es el mismo que el de una variable local del subalgoritmo.

Elementos de Programacin 51

Reglas de mbito
Ejemplo:
Algoritmo Principal VAR N A, D, C Algoritmo uno (ES N X, Y; E N D) VAR N I, J INICIO /* Sentencias de Uno */ FIN Algoritmo Dos (ES B M) VAR RL Algoritmo Tres (ES N S) INICIO /* Sentencias de Tres */ FIN INICIO /* Sentencias de Dos */ FIN INICIO /* Sentencias de Principal */ FIN

Elementos de Programacin 52

Reglas de mbito
Principal A D C Uno

I J X Y D Dos M L Tres S

Elementos de Programacin 53

Reglas de mbito
Algoritmos
Principal Uno Dos Tres
Principal, Uno, Dos Principal, Uno

Variables
? A, D, C (Principal)

? A, C (Principal) ? D, X, Y, I, J (Uno) (Principal) (Dos) (Principal) (Dos) (Tres)

Principal, Uno, Dos, Tres ? A, D, C ? M, L Principal, Uno, Dos, Tres ? A, D, C ? M, L ? S

Elementos de Programacin 54

Anidamiento de funciones en C/C++


... sencillamente... ... en C/C++ NO se permite el anidamiento de funciones.

Elementos de Programacin 55

Diseo modular
Una implementacin modular generalmente se sigue de una solucin desarrollada mediante diseo top-down . Ejemplo:
Procesar nmina
Id. Empleado

Ingresos Tot.

Calcular ingresos

Calcular retencin plan jubilacin

Calcular impuestos

Calcular retencin despus impuestos

SS

IRPF

Elementos de Programacin 56

Conceptos de diseo modular


Diseo top-down , de los ms genrico a lo ms especfico. Abstraccin procedural: el algoritmo es una caja negra. Abstraccin de datos: coleccin de datos junto con sus operaciones. Ocultacin de informacin: oculta detalles de los mdulos que deben ser privados: interfaz de comunicacin.

Elementos de Programacin 57

Bibliografa
Programacin en C++. Algoritmos, estructuras de datos y objetos. L. Joyanes. McGraw-Hill, 2000 Cmo programar en C/C++. H.M. Deitel, P.J. Deitel. Prentice Hall, 1995 Fundamentos de programacin. Algoritmos y estructuras de datos. L. Joyanes. McGraw-Hill. 1996 PASCAL. Introduccin al lenguaje y programacin estructurada. Koffman. Addison Wesley.1987 PASCAL y Estructuras de datos. N. Dale & S. Lilly. McGraw-Hill. 1992. Curso Interactivo de programacin en Pascal. L. Sommaruga y otros. McGraw-Hill. 1997.

Elementos de Programacin 58

Вам также может понравиться