====== 01 - Algoritmos y Pensamiento Computacional ======
Antes de escribir código en cualquier lenguaje de programación, lo más importante es aprender a **pensar como un programador**. Programar consiste principalmente en analizar un problema, descomponerlo en partes más pequeñas y diseñar una secuencia lógica de pasos para resolverlo.
===== 1. ¿Qué es un algoritmo? =====
Un **algoritmo** es un conjunto finito, ordenado e inequívoco de instrucciones que, al seguirse paso a paso, resuelve un problema o realiza una tarea determinada.
==== 1.1 El modelo Entrada - Proceso - Salida (IPO) ====
Cualquier algoritmo trabaja con tres elementos básicos:
* **Entrada (Input):** Los datos iniciales que recibe el algoritmo para poder trabajar.
* **Proceso:** La secuencia de pasos y operaciones que transforma los datos de entrada.
* **Salida (Output):** El resultado final que devuelve el algoritmo tras procesar la información.
==== 1.2 Características fundamentales ====
Para que una secuencia de pasos sea un algoritmo válido, debe ser:
* **Preciso:** Cada paso debe indicar exactamente qué hacer, sin ambigüedades.
* **Ordenado:** Las instrucciones deben tener una secuencia clara.
* **Finito:** Debe tener un inicio y un final (no puede quedarse en un bucle infinito).
* **Definido:** Si se ejecuta dos veces con la misma entrada, siempre debe obtenerse el mismo resultado.
**Algoritmo vs. Programa:** Un algoritmo es la **idea o lógica** para resolver un problema (puede escribirse en papel, en español o dibujarse). Un **programa** es la traducción de ese algoritmo a un **lenguaje de programación concreto** (como Java) para que lo ejecute un ordenador.
===== 2. Diagramas de Flujo con PlantUML =====
Un **diagrama de flujo** es la representación gráfica de un algoritmo mediante símbolos geométricos conectados por flechas que indican el orden de ejecución.
En el curso utilizaremos la sintaxis de los [[https://plantuml.com/es/activity-diagram-beta|diagramas de actividades de PlantUML]] para generar estos diagramas mediante texto.
==== 2.1 Simbología básica en PlantUML ====
^ Elemento ^ Sintaxis PlantUML ^ Descripción ^
| **Inicio** | ''start'' | Punto de partida del algoritmo |
| **Fin** | ''stop'' (o ''end'') | Punto final del algoritmo |
| **Acción / Paso** | '':Hacer algo;'' | Cualquier instrucción (pedir datos, calcular, mostrar resultados...) |
| **Decisión** | ''if (...) then (...) else (...) endif'' | Bifurcación según una condición |
=== Ejemplo básico ===
start
:Leer número de horas trabajadas;
:Calcular Sueldo = Horas * 15;
:Mostrar Sueldo;
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:Leer número de horas trabajadas;
:Calcular Sueldo = Horas * 15;
:Mostrar Sueldo;
stop
@enduml
===== 3. Las 3 Estructuras fundamentales de Control =====
Cualquier algoritmo, por complejo que sea, se construye combinando únicamente tres estructuras lógicas fundamentales:
==== 3.1 Estructura Secuencial ====
Las instrucciones se ejecutan de forma lineal, una detrás de otra, en el orden en que están escritas.
start
:Ingresar Base;
:Ingresar Altura;
:Area = (Base * Altura) / 2;
:Mostrar Area;
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:Ingresar Base;
:Ingresar Altura;
:Area = (Base * Altura) / 2;
:Mostrar Area;
stop
@enduml
==== 3.2 Estructura Condicional (Selección) ====
Permite tomar decisiones: el flujo se divide en dos caminos dependiendo de si se cumple o no una condición lógica (Verdadero / Falso).
=== Condicional Doble (Si / Sino) ===
start
:Leer Edad;
if (¿Edad >= 18?) then (Sí)
:Mostrar "Acceso concedido";
else (No)
:Mostrar "Acceso denegado";
endif
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:Leer Edad;
if (¿Edad >= 18?) then (Sí)
:Mostrar "Acceso concedido";
else (No)
:Mostrar "Acceso denegado";
endif
stop
@enduml
=== Condicional Simple (Si sin Sino) ===
start
:Leer Precio;
if (¿Tiene cupón de descuento?) then (Sí)
:Precio = Precio * 0.90;
endif
:Mostrar Precio final;
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:Leer Precio;
if (¿Tiene cupón de descuento?) then (Sí)
:Precio = Precio * 0.90;
endif
:Mostrar Precio final;
stop
@enduml
==== 3.3 Estructura Iterativa (Bucles o Repeticiones) ====
Permite repetir un conjunto de instrucciones mientras se cumpla una condición determinada.
=== Bucle Mientras (While) ===
Evalúa la condición **antes** de ejecutar el bloque de instrucciones.
start
:contador = 1;
while (¿contador <= 5?) is (Sí)
:Mostrar contador;
:contador = contador + 1;
endwhile (No)
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:contador = 1;
while (¿contador <= 5?) is (Sí)
:Mostrar contador;
:contador = contador + 1;
endwhile (No)
stop
@enduml
=== Bucle Hacer ... Mientras (Do-While / Repeat-Until) ===
Evalúa la condición **después** de ejecutar el bloque de instrucciones (se ejecuta **al menos una vez**).
start
repeat
:Leer número;
repeat while (¿número < 0?) is (Sí)
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
repeat
:Leer número;
repeat while (¿número < 0?) is (Sí)
stop
@enduml
=== Bucle Para / Desde (For) ===
Se utiliza habitualmente cuando se conoce de antemano el número exacto de iteraciones.
start
:i = 1;
while (¿i <= 10?) is (Sí)
:Mostrar i;
:i = i + 1;
endwhile (No)
stop
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:i = 1;
while (¿i <= 10?) is (Sí)
:Mostrar i;
:i = i + 1;
endwhile (No)
stop
@enduml
===== 4. Pseudocódigo =====
El **pseudocódigo** es una forma de expresar un algoritmo utilizando un lenguaje natural estructurado (en español) que imita la lógica de la programación real sin preocuparnos por la sintaxis estricta de un lenguaje como Java.
Sirve como paso intermedio entre el **diagrama de flujo** y el **código fuente**.
==== 4.1 Palabras reservadas comunes ====
* **Inicio / Fin:** Marcan los límites del algoritmo.
* **Leer:** Para pedir o solicitar datos al usuario (Entrada).
* **Escribir / Mostrar:** Para imprimir resultados en pantalla (Salida).
* **Si ... Entonces ... Sino ... FinSi:** Para tomar decisiones.
* **Mientras ... Hacer ... FinMientras:** Para crear bucles.
==== 4.2 Ejemplos ====
A continuación se presentan dos problemas clásicos resueltos en **Diagrama de Flujo (PlantUML)** y **Pseudocódigo**:
=== Ejemplo 1: Determinar si un número es Par o Impar ===
== Diagrama de Flujo (PlantUML) ==
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:Leer numero;
if (¿numero % 2 == 0?) then (Sí)
:Mostrar "El número es PAR font:bold";
else (No)
:Mostrar "El número es IMPAR font:bold";
endif
stop
@enduml
== Pseudocódigo ==
Algoritmo ComprobarParImpar
Escribir "Introduce un número entero:"
Leer numero
Si numero % 2 == 0 Entonces
Escribir "El número es PAR"
Sino
Escribir "El número es IMPAR"
FinSi
FinAlgoritmo
=== Ejemplo 2: Validar un PIN de acceso (Bucle con intentos) ===
== Diagrama de Flujo (PlantUML) ==
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:intentos = 0;
:claveCorrecta = 1234;
:claveIntroducida = 0;
while (¿claveIntroducida != claveCorrecta Y intentos < 3?) is (Sí)
:Leer claveIntroducida]
:intentos = intentos + 1;
endwhile (No)
if (¿claveIntroducida == claveCorrecta?) then (Sí)
:Mostrar "Bienvenido al sistema">;
else (No)
:Mostrar "Cuenta bloqueada por seguridad">;
endif
stop
@enduml
== Pseudocódigo ==
Algoritmo ValidarPIN
intentos <- 0
claveCorrecta <- 1234
claseIntroducida <- 0
Mientras claveIntroducida != claveCorrecta Y intentos < 3 Hacer
Escribir "Introduce tu PIN de 4 dígitos:"
Leer claveIntroducida
intentos <- intentos + 1
FinMientras
Si claveIntroducida == claveCorrecta Entonces
Escribir "Bienvenido al sistema"
Sino
Escribir "Cuenta bloqueada por seguridad"
FinSi
FinAlgoritmo
===== Ejercicios =====
Para resolver esta serie de ejercicios utilizaremos el entorno de desarrollo **IntelliJ IDEA**:
- **Creación del proyecto:** Abre IntelliJ IDEA y crea un nuevo proyecto base llamado **daw-prog**. Este proyecto único nos servirá para estructurar todos los ejercicios y pruebas del curso.
- **Organización por carpetas:** Dentro del proyecto, crea una carpeta/directorio dedicada a este tema (por ejemplo, ''01_Introduccion_PlantUML'').
- **Archivos de diagramas:** Para cada ejercicio, crea un archivo individual con la extensión **''.puml''** (por ejemplo, ''ejercicio01.puml''). Instala la extensión [[https://plugins.jetbrains.com/plugin/7017-plantuml4idea|plantuml4idea]] en IntelliJ para ver la vista previa del diagrama en tiempo real a la derecha de tu código.
- **Uso de Inteligencia Artificial (GitHub Copilot):** Como alternativa, podéis apoyaros en herramientas de IA integradas como **GitHub Copilot** para pedirle a la IA que genere el código PlantUML a partir de alguno de los enunciados o que convierta algún diagrama a código ejecutable para comprobar si vuestra lógica es correcta.
=== Ejercicio 1 ===
Pide al usuario una temperatura en grados Celsius (°C). Conviértela a Fahrenheit (°F) utilizando la fórmula: $°F = (°C \times 9/5) + 32$. Si la temperatura en Celsius es menor o igual a 0 °C, muestra además un mensaje de advertencia: "Alerta: Temperatura bajo cero". Finalmente, muestra la temperatura convertida.
=== Ejercicio 2 ===
Pide el número de horas trabajadas en el mes y el precio por hora. Calcula el salario bruto. Si el salario bruto supera los 1000 €, se le aplica un 15% de IRPF; en caso contrario, un 10%. Muestra por pantalla el salario bruto, la retención aplicada y el salario neto final.
=== Ejercicio 3 ===
Solicita una nota numérica de 0 a 10 (asume que el valor introducido es válido). El algoritmo debe mostrar la calificación correspondiente según la siguiente escala:
* Menor que 5: "Insuficiente"
* Entre 5 y 6.99: "Aprobado"
* Entre 7 y 8.99: "Notable"
* 9 o más: "Sobresaliente"
=== Ejercicio 4 ===
Pide al usuario que introduzca un año positivo. El programa debe determinar si el año es bisiesto o no. Recuerda la regla: un año es bisiesto si es divisible por 4, **excepto** los años múltiplos de 100, a no ser que también sean divisibles por 400. Muestra "Es Bisiesto" o "No es Bisiesto".
=== Ejercicio 5 ===
Una tienda aplica un 10% de descuento si la compra supera los 100 €. Además, los gastos de envío son gratuitos si el importe **tras aplicar el descuento** es mayor o igual a 80 €; de lo contrario, el envío cuesta 5 €. Pide el importe total inicial de la compra y muestra el desglose final: descuento aplicado, coste de envío y total a pagar.
=== Ejercicio 6 ===
Pide al usuario 3 notas numéricas. Si alguna de las notas introducidas es menor que 0 o mayor que 10, el programa debe mostrar inmediatamente un mensaje de error ("Nota no válida") y detenerse. Si todas las notas son válidas, calcula y muestra la nota media.
=== Ejercicio 7 ===
Diseña un sistema que pida una contraseña al usuario (la contraseña correcta es "1234"). El usuario tiene un máximo de 3 intentos. En cada intento fallido, el programa debe indicar cuántos intentos le quedan. Si acierta, muestra "Acceso concedido" y termina. Si agota los 3 intentos sin acertar, muestra "Cuenta bloqueada".
=== Ejercicio 8 ===
Pide al usuario un número $N$ positivo. Mediante un bucle, recorre todos los números enteros desde 1 hasta $N$. Para cada número, debe mostrar en pantalla el valor actual y si es "Par" o "Impar".
=== Ejercicio 9 ===
El programa debe pedir números enteros al usuario uno a uno de forma indefinida hasta que introduzca el número **0** (que actúa como condición de salida). Al finalizar, el programa debe mostrar:
1. La suma total de todos los números introducidos.
2. Cuántos números introdujo el usuario en total (sin contar el 0).
=== Ejercicio 10 ===
Simula un cajero que inicia con un saldo de 500 €. El usuario verá un menú interactivo continuo para realizar operaciones introduciendo un número:
* **1:** Consultar saldo.
* **2:** Ingresar dinero (pide la cantidad e incrementa el saldo).
* **3:** Retirar dinero (pide la cantidad; solo descuenta si hay saldo suficiente, si no, muestra "Error: Saldo insuficiente").
* **0:** Salir del cajero.
El menú debe repetirse indefinidamente hasta que el usuario elija la opción **0**.