Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Tema 3. Elementos de Programación Estructurada

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 44

Tema 3.

Elementos de
programación estructurada
C H R I S TO P H E R E X P Ó S I TO I Z Q U I E R D O
A I R A M E X P Ó S I TO M Á R Q U E Z
I S R A E L LÓ P E Z P L ATA
M A R Í A B E L É N M E L I Á N B AT I S TA
JOSÉ MARCOS MORENO VEGA
La programación estructurada
• La programación estructurada es aquel paradigma de programación que dice que todo programa puede
escribirse únicamente utilizando 3 estructuras básicas de control:
• Secuencial
• Selección
• Iteración

• Se basa en un teorema desarrollado por Boehm y Jacopini en 1966

• Define un problema como aquel compuesto por un determinado número de subproblemas mas sencillos
que el original

•Forma una estructura top-down, es decir, jerárquica


La programación estructurada
• En programación estructurada, el diseño del programa es
descendente.
Sentencia 1

• Las estructuras de control manejadas son limitadas a 3. Evita el


uso de las sentencias GOTO Sentencia 2

• El ámbito de las estructuras también se encuentra limitado


Sentencia 3

• Cualquier algoritmo en programación estructurada puede ser


representado mediante un diagrama de flujo
Ventajas
• El paradigma de programación estructurada está pensado para mejorar la calidad, claridad y tiempo de desarrollo

• Los programas pueden leerse de forma secuencial, por lo que son más fáciles de entender

• La estructura de los programas es muy clara

• Reduce el esfuerzo en pruebas. Facilita el seguimiento de los errores del programa gracias a su estructura mas sencilla

• El software creado es mas fácil de ampliar, ya que es mas sencillo

• Se elimina el código espagueti


Ejecución de un programa
• El flujo de ejecución de un programa se realiza de manera
lineal Sentencia 1

• Puede ser representado mediante un diagrama de flujo

• Existen estructuras que permiten cambiar esta linealidad Sentencia 2 Sentencia 3


• Condicionales.
• Bucles.
Condicionales
• Permite ejecutar un conjunto de sentencias si se cumplen una serie de condiciones lógicas

• Una condición lógica se puede considerar como una comprobación mediante operadores
relacionales que puede dar valores de true o false

• Fundamental a la hora de desviar el flujo del programa


Condicionales
• Las condiciones lógicas evalúan si unas determinadas variables o constantes cumplen con una
determinada restricción

• Se pueden anidar las diferentes evaluaciones mediante operadores lógicos


Operador relacional Operador lógico
< Menor que && And
> Mayor que || Or
<= Menor o igual que ! Not
>= Mayor o igual que
== Igual que
!= Distinto a
Condicionales
• And (&&) Op1 Op2 Resultado
false false false
false true false
true false false
true true true

• Or (||) Op1 Op2 Resultado


false false false
false true true
true false true
true true true

Op1 Resultado
• Not (!)
false true
true false
Condicionales
• Gracias a los operadores lógicos, se puede hacer un anidamiento de condiciones lógicas

• En este caso, es importante tener en cuenta la precedencia de los operadores

• Ejemplo: int a = 3; int b = 5; int c = 3; boolean d = true;


• (a == c) && (a < b) && d
• (a == c) && (a < b) && !d
• (a == c) && (a < b) || !d
• (a == c) && (a > b) || !d
• ((a == c) && (a > b)) || !d
Condicional if
• If: Ejecuta un conjunto de sentencias sólo si se da una Sentencia 1
condición
Cond

True False
Sentencia 2

Sentencia 3

Sentencia 4
Condicional if-else
• If: Ejecuta un conjunto de sentencias sólo si se da una
condición Sentencia 1

•If-Else: Igual que el if, pero con unas sentencias alternativas. True
Cond
False
Se pueden concatenar varios if y else

Sentencia 2 Sentencia 3
Condicional if-else
• Un if se define por la sentencia if(condición lógica) {}

• El bloque delimitado por llaves será el conjunto de sentencias Sentencia 1


que se ejecuten si la condición lógica tiene valor true

True False
Cond
• Opcionalmente, se puede añadir después del bloque del if la
sentencia else {}, cuyo bloque es el conjunto de sentencias
ejecutadas si el valor no se cumple
Sentencia 2 Sentencia 3

• Existe la opción de incluir la sentencia else if(condición lógica) {},


cuyo bloque se ejecuta si la sentencia if anterior no se cumple y la
condición lógica representada si
Condicional switch
• If: Ejecuta un conjunto de sentencias sólo si se da una
condición Sentencia 1

•If-Else: Igual que el if, pero con unas sentencias alternativas . Varia
ble
Se pueden concatenar varios if y else Val1 Val2 ValN

S2 S3 … SN
•Switch: Ejecuta un conjunto de sentencias dependiendo del
valor de una variable
Condicional switch
• Las condiciones se ejecutan dependiendo del valor de una
variable

• Se representa mediante la sentencia switch(variable) {}, siendo Sentencia 1


la variable entre paréntesis aquella cuyo valor se analiza

Varia
• Dentro del bloque del switch, se tienen las sentencias case valor: Val1
ble

{}, cuyo bloque se ejecuta si la variable analizada tiene ese valor. Val2 ValN
Cada bloque del case debe terminar con la sentencia break;
S2 S3 … SN

• Siempre se debe incluir la sentencia default: {}, cuyo bloque se


ejecuta cuando la variable no tiene ningun valor de los “cases”
anteriores
Condicionales en Java
If If-Else Switch
if (a < b) { if (a < b) { switch(a) {
System.out.println(“A es menor”); System.out.println(“A es menor”); case 1: {
System.out.println(“B es mayor”); } else { System.out.println(“Opción 1”);
} System.out.println(“A es mayor o igual”); break;
} }
case 2: {
Muestra “A es menor” si el valor de la variable a es menor al System.out.println(“Opción 2”);
Muestra los textos solo si el valor de la variable de la variable b. En caso contrario, muestra “A es mayor o break;
a es menor al de la variable b igual” }
default: {
System.out.println(“Resto”);
if (a < b) {
}
System.out.println(“A es menor”);
}
} else if (a > b) {
System.out.println(“A es mayor”);
Si la variable a vale 1, muestra “Opción 1”, si
} else {
vale 2, muestra “Opción 2”. Para el resto de
System.out.println(“SON IGUALES!”);
casos, muestra “Resto”.
}

Ejemplo de concatenación de if y else


Ejercicios de condicionales
1. Dado 2 números, mostrar el texto “Son iguales” sólo si los números son los mismos

2. Dados 2 números a y b, mostrar:


1. “los 2 son negativos” si a y b son menores a 0
2. “a es positivo, b es negativo” si a es mayor que 0 y b menor
3. “a es negativo, b es positivo” si a es menor que 0 y b mayor
4. “los 2 son positivos” si a y b son mayores a 0

3. Escribir el valor en letras de un número del 1 al 5 guardado en la variable a. En caso de no


estar en este rango, escribir “Número incorrecto”
Sentencias repetitivas (bucles)
• Permiten repetir un bloque de sentencias un número determinado de veces

• El número de veces que se repiten las sentencias de un bucle dependen de una condición lógica

• Muy utilizados cuando se desea un comportamiento repetitivo del programa

• Ahorra la escritura de código repetido

• Ejemplo:
• Escribe los números del 1 al 10
• Escribe los números del 1 al 1000000
Bucle for
• Repite un conjunto de instrucciones un número Sentencia 1
predeterminado de veces
i=0
i = i+1
i < 10
•El control de las iteraciones se realiza con una variable interna True False
del bucle Sentencia 2

Sentencia 3
• En este bucle se define:
• Valor inicial de la variable Sentencia 4
• Incremento de la variable en cada iteración
• Condición en la que termina el bucle
Ejemplo bucle for. Contar hasta 10
Cuenta:
1 Print(“Cuenta:”)
2
3 i=1
i = i+1
4 i <= 10

5 True False
6 Print(i)
7
8
9
10 Print(“Fin”)

Fin
Bucle while
• Repite un conjunto de instrucciones siempre que se cumpla Sentencia 1
una condición lógica definida
• Si la condición a evaluar tiene valor true, se ejecuta una iteración
de las sentencias del bucle Condición
• Si la condición tiene valor false, se termina el bucle True False
Sentencia 2

• Si la condición no se cumple desde un inicio, las sentencias Sentencia 3


dentro del bucle nunca se ejecutan
Sentencia 4

• Si la condición se cumple siempre, se pueden ocasionar


bucles infinitos
Ejemplo bucle while. Contar hasta 10
1
2 Cont = 1
3
4
Cont <= 10
5
6 True False
7 Print(Cont)
8
9 Cont = Cont + 1
10
Fin
Print(“Fin”)
Ejemplo bucle while infinito
1
3 Cont = 1
5
7
Cont != 10
9
11 True False
13 Print(Cont)
15
… Cont = Cont + 2

Print (“Fin”)
Bucle do-while
• Repite un conjunto de instrucciones siempre que se cumpla Sentencia 1
una condición definida
• Si la condición a evaluar tiene valor false, se termina el bucle
False
• Si la condición tiene valor true, se ejecuta una iteración de las Sentencia 2
sentencias del bucle
Sentencia 3

• Similar al bucle while. 1 diferencia: Condición


• La condición se comprueba al final de la estructura. En el bucle
while es al inicio True
Sentencia 4

• Al igual que el while, puede ocasionar bucles infinitos


Ejemplo bucle do-while. Contar hasta 10.
1
2 Cont = 1
3
4
Print(Cont)
5
False
6
Cont = Cont + 1
7
8
9 Cont > 10
10 True
Fin
Print(“Fin”)
Bucles en Java. Ejemplo contar hasta 10
For While Do-While

for (int i = 1; i <= 10; i++) { int i = 1; int i = 1;


System.out.println(i); while (i <= 10) { do {
} System.out.println(i); System.out.println(i);
System.out.println(“Fin”); i++; i++;
} } while (i <= 10);
System.out.println(“Fin”); System.out.println(“Fin”);
Bucles. Comparativa
Bucle for Bucle while Bucle do-while
• Utilizado cuando se quiere un número de • Utilizado cuando la condición de parada es • Utilizado cuando la condición de parada es
iteraciones concreto compleja compleja y se quiere al menos una ejecución

• Mejor opción para el recorrido de estructuras • Sólo ejecuta las sentencias mientras se • Sólo ejecuta las sentencias mientras se
de datos cumpla la condición cumpla la condición

• La condición se evalúa antes de las • La condición se evalúa después de las


sentencias sentencias

for (int i = 1; i <= 10; i++) { int i = 1; int i = 1;


System.out.println(i); while (i <= 10) { do {
} System.out.println(i); System.out.println(i);
System.out.println(“Fin”); i++; i++;
} } while (i <= 10);
System.out.println(“Fin”); System.out.println(“Fin”);
break y continue
• Permiten romper un bucle de distintas formas
• break: Si se ejecuta la sentencia break, la ejecución del bucle termina
for (int i = 1; i <= 10; i++) {
if (i == 5) break;
Muestra los números del 1 al 4
System.out.println(i);
}

• continue: Si se ejecuta la sentencia continue, la iteración actual termina, pero el bucle continua

for (int i = 1; i <= 10; i++) {


if (i == 5) continue; Muestra los números del 1 al 10,
System.out.println(i); excepto el 5
}
Ejercicios de sentencias repetitivas
1. Escribir los números del 1 al 100 que sean impares

2. Escribir los números incrementando desde 1 hasta que la suma de todos esos números sea
mayor a una variable entera x. Ejemplo:
1. X = 10; 1, 2, 3, 4, 5  1+2+3+4+5 = 15
2. X = 25; 1, 2, 3, 4, 5, 6, 7, 8  1+2+3+4+5+6+7+8 = 36
Buenas prácticas
• La indentación debe ser clara para los bucles. Se debe distinguir que sentencias están dentro de que
bucle
• Las llave abierta en un bucle se pone a la derecha de la condición o debajo. La llave cerrada, en su propia línea

• OJO a los bucles infinitos

• En un bucle for el número de la iteración lo tenemos en la variable interna. No usar otra para el
mismo cometido

• En un condicional switch:
• Incluir la opción default aunque no se utilice
• Todas las opciones de un switch deben finalizar en un break
Estructuras de datos
• Una estructura de datos es un conjunto de valores (normalmente del mismo tipo) agrupadas
bajo un mismo identificador

• Sirven para representar agrupaciones de forma lógica, así como para facilitar su acceso

• En Java existen un gran número de estructuras de datos para las distintas necesidades de
almacenamiento de datos

• Dominar el manejo de las estructuras de datos es una tarea fundamental para resolver
cualquier problema
Vectores unidimensionales
• Conjunto de datos agrupados e identificados por un mismo nombre
• Pueden ser de los mismos tipos de datos que cualquier variable (int, char, double, etc.)
• Se declaran siguiendo la forma tipo[] nombre = new tipo[tamaño];
int[] numeros = new int[10];

• El tamaño debe ser una constante entera


• A cada elemento se accede a través de un índice, empezando por el 0
• Pueden ser inicializados directamente. Ejemplo: int[] numeros = {1, 2, 3};

• Los vectores simples se caracterizan por ser:


• Unidimensionales
• Tamaño fijo
Vectores unidimensionales. Ejemplo
int numeros[7] = {30, 50, 70, -49, 1, 1357, 8};

0 1 2 3 4 5 6
30 50 70 -49 1 1357 8

numeros[0] numeros[2] numeros[4] numeros[6]

numeros[1] numeros[3] numeros[5]


Vectores multidimensionales
• Extienden los vectores unidimensionales a 2 o mas dimensiones

• Se declaran siguiendo la forma tipo[][] nombre = new tipo[tamaño1][tamaño2];, donde cada


grupo de corchetes representa una dimensión del vector
int[][] numeros = new int[10][15];

•Pueden ser inicializados directamente al igual que los vectores unidimensionales. Ejemplo:
int[][] numeros = {{1, 2, 3},
{4, 5, 6}};
Vectores multidimensionales. Ejemplo
int numeros[3][4] = {{30, 50, 70, 20} , {-49, 1, 1357, 8}, {33, -5, 37, 22}};

numeros[0][1] numeros[0][2] numeros[0][3]

numeros[0][0] 0 1 2 3
numeros[1][0] 0 30 50 70 20
1 -49 1 1357 8
numeros[2][0]
2 33 -5 37 22

numeros[2][3]
Ejemplo de bucles con vectores
/*Partimos de la existencia de un vector vec de enteros. Queremos mostrar sus valores de la forma
[indice] = valor */

//Tamaño del vector


int tam = vec.length;
//Con un bucle for
for (int i = 0; i < tam; i++) {
System.out.println(“[“ + i + “] = ” + vec[i]);
}
//Con un bucle while
int i = 0;
while (i < tam) {
System.out.println(“[“ + i + “] = ” + vec[i]);
i++;
}
Ejercicios de estructuras de datos
1. Leer todos los elementos de un vector simple de enteros y de tamaño 10

2. Leer todos los elementos de un vector simple de enteros y de tamaño 10. Cuando uno de los
elementos sea mayor a 20, dejar de leer.

3. Sumar todos los elementos de una matriz de tamaño 5x10


La clase String
• Como se ha visto, la clase String representa una cadena de caracteres

• Es una forma simplificada de representar un vector unidimensional de char.

• String cadena = “¡Hola!”;  char[] cadena = {‘¡’, ‘H’, ‘o’, ‘l’, ‘a’, ‘!‘};

0 1 2 3 4 5
¡ H o l a !

• cadena[2] = ‘o’
La clase String
• La clase String nos permite realizar muchas operaciones con cadenas de caracteres como
(partiendo del ejemplo String cadena = “Hola clase”;):
• Concatenación: cadena + “ “ + “¿Qué tal?”  “Hola clase ¿Qué tal?”
• Conocer el tamaño: cadena.size()  10
• Obtener subcadenas: cadena.substring(5, 9)  “clase”
• Dividir cadena: String[] palabras = cadena.split(‘ ’)  palabras[0] = “Hola”, palabras[1] = “clase”
• Y muchas mas cosas

• Java tiene una documentación muy completa de lo que se puede hacer con sus cadenas de
caracteres en https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
La clase Object
• En Java existe una clase especial llamada Object, que representa a cualquier clase del sistema

• Implícitamente, todas las clases en Java derivan de Object

• Puede utilizarse para representar cualquier elemento genérico

Object obj;
obj = 1;
System.out.println(obj);
obj = “Prueba”;
System.out.println(obj);
Las clases contenedoras
• En Java, los tipos básicos (int, double, char, etc.) tienen asociados un conjunto de clases que extienden sus
funcionalidades llamadas clases contenedoras

• Estas clases son muy parecidas en nombre a los tipos básicos asociados:
Primitivos Clase Contenedora Argumentos del Constructor
boolean Boolean boolean o String
byte Byte byte o String
char Character char
double Double double o String
float Float float, double o String
int Integer int o String
long Long long o String
short Short short o String
Las clases contenedoras
Funcionalidades
• ParseXXX(Object param): Convierte el elemento pasado por parámetro en el tipo del contenedor

Integer num = Integer.ParseInt(“32”); num = 32

• XXXValue(): Convierte el elemento de la clase contenedora al tipo indicado en el nombre de la función

Integer num = new Integer(32); num = “32”


String num = Integer.StringInt();

• ValueOf(): Convierte al tipo de la clase contenedora realizando las modificaciones necesarias

Integer num = Integer.valueOf(“101011”, 2); num = 43


Otras estructuras de datos
• Java tiene un gran número de librerías con las que manejar distintas estructuras de datos
• Facilitan en gran medida la labor al programador
• Vector dinámico: Vector que no tiene un tamaño fijo, ya que varía según el número de
elementos que se le han insertado

ArrayList<tipo> nombre = new ArrayList<>();

nombre

•Enlace: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Otras estructuras de datos
• Mapa: Permite almacenar los datos en parejas de clave-valor
• Los valores se buscan en el mapa a partir de la clave

HashMap<tipoClave, tipoValor> nombre = new HashMap<>();

nombre

•Enlace: https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
Otras estructuras de datos
• Conjuntos: Almacena elementos, sin un orden determinado. No permite elementos repetidos
HashSet<tipo> nombre = new HashSet<>();

nombre

•Enlace: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

También podría gustarte