Está en la página 1de 22

04/10/2010

Tema 3. Programación estructurada y


modular
• Esquema

3.1. Introducción
3.2.
3 2 Estructuras de control elementales
3.2.1. Secuencia
3.2.2. Selección
3.2.3. Iteración
3.3. Técnicas de representación
3.3.1. Diagramas de flujo de control
3.3.2. Pseudocódigo
g
3.4. Programación Modular
3.4.1. Modularización funcional
3.4.2. Paso de parámetros
3.4.3. Sobrecarga de métodos

Fundamentos de Programación I 1
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

Tema 3. Programación estructurada y


modular
• Lectura recomendada
• Programación estructurada
- Muñoz
M ñ C Caro C
C., Niñ
Niño A
A. y Vi
Vizcaíno
í B Barceló
ló A
A. Introducción
I t d ió a lla
programación con orientación a objetos. Capítulo 4. Prentice-
Hall, 2002. Reimpresión 2007

- Introduction to Programming in Java (Princeton University).


Chapter 1. Elements of Programming:
http://www.cs.princeton.edu/introcs/10elements/

Fundamentos de Programación I 2
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

1
04/10/2010

Tema 3. Programación estructurada y


modular
• Lectura recomendada
• Programación modular
- Muñoz
M ñ C Caro C
C., Niñ
Niño A
A. y Vi
Vizcaíno
í B Barceló
ló A
A. Introducción
I t d ió a lla
programación con orientación a objetos. Capítulo 5. Prentice-
Hall, 2002. Reimpresión 2007

- Introduction to Programming in Java (Princeton University).


Chapter 2. Functions:
http://www.cs.princeton.edu/introcs/20functions/

Fundamentos de Programación I 3
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.1. Introducción (I)


• Teorema de estructura
– Bohm, C. and Jacopini, G, "Flow Diagrams, Turing Machines
and Languages with Only Two Formation Rules".
Communications of the ACM,, 9 ((5),366–371
), ((1966))

– Teorema de estructura: Todo programa con un único punto


de entrada y un único punto de salida, cuyas sentencias se
alcancen todas en algún momento y que no posea bucles
infinitos (programa propio) se puede construir con tres
constructores elementales: secuencia, selección y bucle.

• Constructores elementales
– Secuencia
– Selección
– Bucle

Fundamentos de Programación I 4
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

2
04/10/2010

3.1. Introducción (II)


• Concepto de programación modular:
– Descomposición de un problema complejo en
subproblemas más pequeños que se puedan resolver por
separado
p Abstracción p
procedimental

Fundamentos de Programación I 5
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2. Estructuras de control elementales


• Vamos a considerar una a una cada estructura de control
elementales
– Secuencia
– Selección
– Bucle

Fundamentos de Programación I 6
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3
04/10/2010

3.2.1. Secuencia
• Primera estructura de control elemental
int valor=0;
valor=valor+1;
System.out.println(valor);

Fundamentos de Programación I 7
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.2 Selección (I)


• Segunda estructura de control elemental
– Forma completa:

if (condición) {
---- bloque de sentencias ----
}
else {
---- bloque de sentencias ----
}

– Es posible así:

if (condición) {
---- bloque de sentencias ----
}

• Ejemplo a continuación
Fundamentos de Programación I 8
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

4
04/10/2010

import java.util.*;
class Condicion {
// Ejemplo de sentencia condicional if-else
public static void main(String[] args) {
int x;
Scanner leer =new Scanner(System.in);

// Lectura de datos
System.out.println("Introduzca un entero");
x=leer.nextInt();
System.out.println("Entero introducido "+x);

// Aplicación de la condición
if (x < 0) {
System.out.println("El numero es negativo");
}
else {
System.out.println("El numero es positivo");
} // Fin de la cláusula else
System.out.println("Fin del programa");
} // Fin método main
} // Fin clase Condicion

Fundamentos de Programación I 9
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.2 Selección (II)


• Además de la sentencia if en Java existe un operador
condicional que es un operador “ternario”, pues usa tres
operandos. Las sintaxis es:
condición ? expresión1
p : expresión2;
p

• El operador realiza un if-else abreviado equivalente a:


if (condición){
expresión1;
}
else {
expresion2;
}
• Ejemplo:
mayor= (n1 <n2) ? n2 : n1;

Fundamentos de Programación I 10
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

5
04/10/2010

3.2.2. Selección (III)


• Selección múltiple, sentencia switch
switch (expresión) {
case literal 1:
-- bloque
q 1--
break;
case literal 2:
-- bloque 2 --
break;
...
default:
-- bloque n --
}

• La expresión debe producir un valor de tipo int o char y el


literal debe ser del mismo tipo que el resultado de la expresión
Fundamentos de Programación I 11
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

import java.util.*;
class Switch {
public static void main(String [] args){
int numero;
Scanner leer =new Scanner (System.in);

// Lectura de datos
System.out.print("Introduzca un entero: ");
numero=leer nextInt();
numero=leer.nextInt();

switch (numero) {
case 1:
System.out.println("El numero es un 1");
break;
case 2:
System.out.println("El numero es un 2");
break;
default:
System.out.println("El numero no era ni 1 ni 2");

} // Fin switch

} // Fin método main


} // Fin clase

Fundamentos de Programación I 12
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

6
04/10/2010

3.2.2. Selección (IV)


• Combinación de estructuras de control
– Concatenación
– Anidamiento
• Concatenación

Estruct. 1

Estruct. 2

Estruct. 3

Fundamentos de Programación I 13
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.2. Selección (V)


• Anidamiento

Estruct. 1

Estruct. 2

Estruct. 3

Estruct. 4

Fundamentos de Programación I 14
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

7
04/10/2010

3.2.2. Selección (VI)


• Ejemplo con ifs concatenados
if (precio > 10.0) {
precio=precio*0.9;// Descuento del 10%
}
if (cantidad >5) {
cantidad++; // Regalo de un artículo
}

• Ejemplo con ifs anidados


if (precio >10.0) {
precio=precio*0.9; //Descuento del 10%
if (precio >20.0) {
cantidad++; // Artículo de regalo
} // Fin if interno
} // Fin if externo
Fundamentos de Programación I 15
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.3. Bucle (iteración) (I)


• Tres (dos) tipos de bucles
– Tipo while
– Tipo do-while
– Tipo for (while controlado por contador)

• Tipo while. Sintaxis:


while (condición) {
---- bloque de sentencias ----
}

• Condición al principio
• Se puede ejecutar cero veces

Fundamentos de Programación I 16
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

8
04/10/2010

3.2.3. Bucle (iteración) (II)


• Ejemplo

class Contador {
public static void main (String [] args) {
final int FIN=3;
int i=0,suma=0;

// Ejemplo de bucle while controlado por contador

while (i<=FIN) {
System.out.print("Contador= "+i);
suma=i+2;
System.out.println(" Suma= "+suma);
i i+1 // I
i=i+1; Incremento
t ddel
l contador
t d (i)
}
System.out.println("Valor del contador fuera del bucle=“
+i);
System.out.println("Valor final de suma= "+suma);
} //Fin método main
} // Fin clase Contador
Fundamentos de Programación I 17
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.3. Bucle (iteración) (III)


• Tipo do-while. Sintaxis

do {
---- bloque de acciones ----
} while (condición);

• Condición al final
• Siempre se ejecuta al menos una vez

Fundamentos de Programación I 18
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

9
04/10/2010

• Ejemplo

class Contador {
public static void main (String [] args){
final int FIN=3;
int i=0,suma=0;

// Ejemplo de bucle do-while controlado por contador


do {
System.out.print("Contador= "+i);
suma=i+2;
System.out.println(" Suma= "+suma);
i=i+1; // Incremento del contador (i)
} while (i<=FIN);
System.out.println("Valor del contador”
+” fuera del bucle= "+i);
System.out.println("Valor final de”
+” suma= “ + suma);
} //Fin método main
} // Fin clase Contador
Fundamentos de Programación I 19
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.3. Bucle (iteración) (IV)


• Tipo for (es un while controlado por contador). Sintaxis

for (inicialización; condición; incremento) {


----- bloque
q de sentencias -----
}
– El incremento se realiza después de ejecutar el bloque de
sentencias.

• Equivale a

inicialización;
while (condición) {
---- bloque de sentencias -----
incremento;
}

Fundamentos de Programación I 20
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

10
04/10/2010

• Ejemplo

class Contador {
public static void main (String [] args) {
final int FIN=3;
int i,suma=0;
// Ejemplo de bucle for

for(i=0;i<=FIN;i++) {
System.out.print("Contador= "+i);
suma=i+2;
System.out.println(" Suma= "+suma);
}

System.out.println("Valor del contador”


+” fuera del bucle= "+i);
System.out.println("Valor final de” + “ suma= "+suma);

} //Fin método main


} // Fin clase Contador
Fundamentos de Programación I 21
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.2.3. Bucle (iteración) (V)


• La variable contadora se puede declarar en el for. En ese caso
sólo existe dentro del for.
for(int i=0;i<=FIN;i++) {
System.out.println(" Valor del contador: "+i);
}

• Posibilidad de bucles infinitos (la condición siempre es


verdadera). Ejemplo:
int contador = 1;
final int LIMITE=25;
while (contador <= LIMITE) {
System.out.println(contador);
contador = contador - 1;
}

Fundamentos de Programación I 22
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

11
04/10/2010

3.3. Técnicas de representación


• Sirven para trabajar a mayor nivel de abstracción que el código

• Diagramas de flujo (de control)

• Pseudocódigo

Fundamentos de Programación I 23
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.3.1. Diagramas de flujo de control (I)


• Diagramas de flujo. Simbología

Terminador Flujo de control

Proceso Conector

Condición Conector fuera de página

Entrada/salida

Fundamentos de Programación I 24
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

12
04/10/2010

3.3.2. Diagramas de flujo de control (II)

• Ejemplo. Programa que suma


los 10 primeros enteros
positivos

Fundamentos de Programación I 25
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.3.3. Pseudocódigo (I)


• Pseudocódigo (lenguaje de especificación de algoritmos)
– Comienzo y fin
Inicio, Fin
– Asignación

– Selección
• If
Si(condición) entonces-Si_no-Fin_Si

• Switch
Según
g (
(variable)
) Hacer:
valor 1: --- bloque de sentencias 1 ---
valor 2: --- bloque de sentencias 2 ---
...
valor n: --- bloque de sentencias n ---
Fin_según
Fundamentos de Programación I 26
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

13
04/10/2010

3.3.3. Pseudocódigo (II)


• Bucles
– while
Mientras (condición) Fin_Mientras

– do-while
Haz-Mientras (condición)

– for
Para (valor inicial) mientras (condición)
i
incremento
t ((valor
l d
del
l i
incremento)
t )
Fin_Para

Fundamentos de Programación I 27
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.3.3. Pseudocódigo (III)


• Ejemplo. Suma de los enteros 1 a 10:
Inicio
suma←0
numero←1
Haz
suma←suma+numero
numero←numero+1
Mientras (numero≤10)
Escribe suma
Fin

Fundamentos de Programación I 28
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

14
04/10/2010

3.4. Programación Modular (I)


• Aproximación modular: divide y vencerás

Bloque de
sentencias

Programa
principal

Subprograma 1 Subprograma 2 Subprograma 3

a) Programa b) Programa modular


monolítico

Fundamentos de Programación I 29
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4. Programación Modular (II)


• Ejemplo:

Programa
principal

Entrada Procesamiento Salida

Fundamentos de Programación I 30
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

15
04/10/2010

3.4.1. Modularización funcional (I)


• Subprogramas, ventajas:
– Encapsulación de algoritmos

– Sabemos dónde acceder para realizar cambios en los algoritmos

– La creación de estos subprogramas implica la realización de una


auténtica abstracción procedimental. El subprograma realiza una
tarea y una vez programado lo podemos usar tantas veces como
haga falta, sin más que conocer qué datos necesita para trabajar y
qué resultado produce

– Evitan repetir el mismo código múltiples veces

Fundamentos de Programación I 31
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.1. Modularización funcional (II)


• En los lenguajes de programación tenemos:
– A) Subprogramas, subrutinas o procedimientos, si pueden
devolver más de un valor
– B) Funciones, si devuelven un único valor a través de su
identificador (como las funciones matemáticas)
– En los lenguajes orientados a objetos los dos conceptos se
funden dando lugar a los procedimientos (o métodos) que
pueden aplicar los objetos. Dada la orientación a objetos de
Java, hablaremos aquí exclusivamente de métodos. Los
métodos siempre realizan, aíslan una tarea concreta. Una
d fi i ió genérica
definición é i de
d método
ét d sería:
í

Un grupo de sentencias de programa identificadas con un


nombre.

Fundamentos de Programación I 32
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

16
04/10/2010

3.4.1. Modularización funcional (III)


• Funcionamiento de un método

Sentencia1; Sentencia 1;
Sentencia 2; Sentencia 2;
Ejecutar método; .
Sentencia 3; .
. .
. Sentencia n;
.
Sentencia m;
Método
Programa principal

• Un método es invocado desde otro método. Todo el


procesamiento parte del método principal (main)

Fundamentos de Programación I 33
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.1. Modularización funcional (IV)


• Un método acepta como entrada una serie de parámetros que
le pasa el método que lo invoca y puede devolver un valor a
través de su identificador. Este valor puede ser de un tipo
primitivo o un objeto. Si no devuelve nada se indica con la
palabra reservada void.
id En Java,
Java la sintaxis de un método es:

modificador tipo_a_devolver identificador_método (


tipo parámetro_1, ..., tipo parámetro_n){
---- bloque de sentencias ----
}

• Los métodos serán static (no vamos a crear objetos)


• Para invocar un método, en el caso general debemos crear un
objeto y luego usar el operador “.” (punto):

nombre_objeto.método(parámetros);

Fundamentos de Programación I 34
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

17
04/10/2010

3.4.1. Modularización funcional (V)


Puede haber tantos métodos como haga falta:

class Clase {
modificadores metodo1 ( ) {
–código del método 1--
}
modificadores metodo2 ( ) {
–código del método 2--
}
....
modificadores metodo3 ( ) {
–código
código del método 3--
3
}
modificadores main ( ) {
–código del main--
}
}
Fundamentos de Programación I 35
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.1. Modularización funcional (VI)


• Los métodos pueden devolver un valor y es necesario decir de qué
tipo es el valor que se devuelve (puede no devolver ninguno). Esto se
indica en la cabecera del método. Por ejemplo,
int factorial (int n){
---- bloque
bl de
d sentencias
t i ----
}

• Aquí se indica que el método va a devolver un entero de tipo int. Si


por el contrario el método no devolviera ningún valor el tipo de
retorno sería void y la cabecera del método sería:
void factorial (int n) {
---- bloque de sentencias ----
}

• Dentro del método debe indicarse qué es lo que éste devuelve. Esto
se consigue por medio de la sentencia return que puede tomar una
de dos formas,
return;
o
return expresión;
Fundamentos de Programación I 36
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

18
04/10/2010

3.4.1. Modularización funcional (VII)


import java.util.*;
class Circulo {
public static void main(String[] args) {
double radio, perimetro, superficie;
Scanner leer=new Scanner (System.in);
leer.useLocale(Locale.US);
( )

// Leyendo el radio
System.out.print(“Introduzca el radio: ”);
radio=leer.nextDouble();
System.out.println("El radio es: " +radio+" unidades");

// Determinando perímetro y superficie


perimetro=calcular_perimetro(radio);
superficie= calcular_superficie(radio);

// Salida de resultados
System.out.println("El perimetro es: " +perimetro+" unidades");
System.out.println("La superficie es: " +superficie+" unidades^2");
} // Fin método main
Fundamentos de Programación I 37
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.1. Modularización funcional (VIII)


public static double calcular_perimetro(double dato_radio) {
double valor;
valor=2.0*Math.PI*dato_radio;
return valor;

} // Fin método calcular_perimetro

public static double calcular_superficie(double dato_radio) {


return Math.PI*dato_radio*dato_radio;

} // Fin método calcular_superficie

} // Fin de la clase Tipo de retorno debe coincidir con la


variable que recibe la salida del método

Fundamentos de Programación I 38
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

19
04/10/2010

3.4.1. Modularización funcional (IX)


• Representación de la estructura modular del software.
Diagramas de estructura, ejemplo:

Programa Principal

Calcular_perímetro Calcular_superficie

• Cada módulo una tarea (cohesión)


• Alcance de las variables: variables locales y globales,
efectos colaterales

Fundamentos de Programación I 39
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.2. Paso de parámetros (I)


• Información que se pasa a un método: literales, variables u
objetos
• Definición del método (cabecera): parámetros formales
• Invocación al método: parámetros actuales (reales)

Invocación_método (actual1, actual2, …, actualn)

método (tipo formal1, tipo formal2, …, tipo formaln)

• Correspondencia por posición

Fundamentos de Programación I 40
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

20
04/10/2010

3.4.2. Paso de parámetros (II)


• Paso de parámetros:
– Por valor
– Por referencia

a) Por valor:
Se pasa una copia del valor de la variables
b) Por referencia:
Se pasa una referencia a la posición de memoria donde se
almacena el valor (los dos identificadores apuntan a la
misma zona de memoria):

Parámetro Zona de
actual memoria

Parámetro
formal

Fundamentos de Programación I 41
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.2. Paso de parámetros (III)


• En Java:
– Las variables de tipos primitivos se pasan por valor

– Los objetos se pasan por referencia (se incluyen las


matrices y las cadenas porque son objetos)

Fundamentos de Programación I 42
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

21
04/10/2010

3.4.3. Sobrecarga de Métodos (I)


• Algunos lenguajes, entre ellos Java, permiten usar el mismo
identificador de método para múltiples métodos. Esta capacidad se
denomina sobrecarga de métodos. La distinción entre los distintos
métodos se realiza a través de la lista de parámetros, usando distinto
número de ellos o distintos tipos de datos.

• El nombre del método junto con el tipo, orden y número de sus


parámetros es la “firma” del método. El tipo de retorno del método NO
es parte de la firma. Para que haya sobrecarga se debe usar el mismo
identificador para el método y el mismo tipo de retorno, pero distinta
firma. Ejemplo:

int metodo_1(int variable_1)


int metodo_1(double variable_1)
int metodo_1(int variable_1, double variable_2)
int metodo_1(double variable_2, int variable_1)

Fundamentos de Programación I 43
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

3.4.3. Sobrecarga de Métodos (II)


• Variante del ejemplo:

int metodo_1(int variable_1)


double metodo_1(int variable_1)

• Esto produce un error de compilación indicando que un


método no puede ser redefinido con un tipo de retorno
diferente (int en el primer caso y double en el segundo). Aquí
no hay sobrecarga.

• Utilidad de la sobrecarga: Realizar la misma tarea sobre


diferentes tipos de datos.

Fundamentos de Programación I 44
© C.Muñoz Caro & A. Niño-Universidad de Castilla-La Mancha

22

También podría gustarte