====== 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. ==== 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. ==== 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. ==== 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 === ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ '':Leer número de horas trabajadas;''\\ '':Calcular Sueldo = Horas * 15;''\\ '':Mostrar Sueldo;''\\ ''stop'' | start :Leer número de horas trabajadas; :Calcular Sueldo = Horas * 15; :Mostrar Sueldo; stop | ===== 3. Las 3 Estructuras fundamentales de Control ===== Cualquier algoritmo, por complejo que sea, se construye combinando únicamente tres estructuras lógicas fundamentales: ==== A. Estructura Secuencial ==== Las instrucciones se ejecutan de forma lineal, una detrás de otra, en el orden en que están escritas. ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ '':Ingresar Base;''\\ '':Ingresar Altura;''\\ '':Area = (Base * Altura) / 2;''\\ '':Mostrar Area;''\\ ''stop'' | start :Ingresar Base; :Ingresar Altura; :Area = (Base * Altura) / 2; :Mostrar Area; stop | ==== B. 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) === ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ '':Leer Edad;''\\ ''if (¿Edad >= 18?) then (Sí)''\\ '' :Mostrar "Acceso concedido";''\\ ''else (No)''\\ '' :Mostrar "Acceso denegado";''\\ ''endif''\\ ''stop'' | start :Leer Edad; if (¿Edad >= 18?) then (Sí) :Mostrar "Acceso concedido"; else (No) :Mostrar "Acceso denegado"; endif stop | === Condicional Simple (Si sin Sino) === ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ '':Leer Precio;''\\ ''if (¿Tiene cupón de descuento?) then (Sí)''\\ '' :Precio = Precio * 0.90;''\\ ''endif''\\ '':Mostrar Precio final;''\\ ''stop'' | start :Leer Precio; if (¿Tiene cupón de descuento?) then (Sí) :Precio = Precio * 0.90; endif :Mostrar Precio final; stop | ==== C. 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. ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ '':contador = 1;''\\ ''while (¿contador <= 5?) is (Sí)''\\ '' :Mostrar contador;''\\ '' :contador = contador + 1;''\\ ''endwhile (No)''\\ ''stop'' | start :contador = 1; while (¿contador <= 5?) is (Sí) :Mostrar contador; :contador = contador + 1; endwhile (No) stop | === 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**). ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ ''repeat''\\ '' :Leer número;''\\ ''repeat while (¿número < 0?) is (Sí)''\\ ''stop'' | start repeat :Leer número; repeat while (¿número < 0?) is (Sí) stop | === Bucle Para / Desde (For) === Se utiliza habitualmente cuando se conoce de antemano el número exacto de iteraciones. ^ Código / Instrucciones ^ Diagrama de Flujo ^ | ''start''\\ '':i = 1;''\\ ''while (¿i <= 10?) is (Sí)''\\ '' :Mostrar i;''\\ '' :i = i + 1;''\\ ''endwhile (No)''\\ ''stop'' | start :i = 1; while (¿i <= 10?) is (Sí) :Mostrar i; :i = i + 1; endwhile (No) stop | ===== 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**. ==== 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. ==== Ejemplos Integrados ==== 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) === 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 === 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) === start :intentos = 0; :claveCorrecta = 1234; 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 === Pseudocódigo === Algoritmo ValidarPIN intentos <- 0 claveCorrecta <- 1234 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**.