├── .gitignore ├── Ejercicios ├── Ejercicios01.pdf ├── Ejercicios02.pdf ├── Ejercicios03.pdf ├── Ejercicios04.pdf ├── Ejercicios05.pdf └── Ejercicios06.pdf ├── README.md ├── Soluciones ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── LICENSE ├── README.md ├── package.json ├── src │ ├── main-2-19.ts │ ├── main-2-20.ts │ ├── main-2-22.ts │ ├── main-2-29.ts │ ├── main-2-36.ts │ ├── main-2-37-mod.ts │ ├── main-2-37.ts │ ├── main-4-01-mod.ts │ ├── main-4-01.ts │ ├── main-4-02.ts │ ├── main-4-06.ts │ ├── main-sintaxis.ts │ ├── main.ts │ ├── mod-2-19.ts │ ├── mod-2-37.ts │ └── mod-4-01.ts ├── ts-init.sh ├── tsconfig.eslint.json └── tsconfig.json └── UD02.pdf /.gitignore: -------------------------------------------------------------------------------- 1 | *.pptx 2 | .DS_Store 3 | /Ejercicios/*.docx 4 | upload.sh 5 | -------------------------------------------------------------------------------- /Ejercicios/Ejercicios01.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/Ejercicios/Ejercicios01.pdf -------------------------------------------------------------------------------- /Ejercicios/Ejercicios02.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/Ejercicios/Ejercicios02.pdf -------------------------------------------------------------------------------- /Ejercicios/Ejercicios03.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/Ejercicios/Ejercicios03.pdf -------------------------------------------------------------------------------- /Ejercicios/Ejercicios04.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/Ejercicios/Ejercicios04.pdf -------------------------------------------------------------------------------- /Ejercicios/Ejercicios05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/Ejercicios/Ejercicios05.pdf -------------------------------------------------------------------------------- /Ejercicios/Ejercicios06.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/Ejercicios/Ejercicios06.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Programación - 02 Programación Estructurada y Modular 2 | 3 | Tema 02 Programación Estructurada y Modular. 1DAM. Curso 2021/2022. 4 | 5 | ![imagen](https://thesoftclix.com/wp-content/uploads/2019/09/unnamed-1.png) 6 | 7 | ## Contenidos 8 | 1. Tipos y Operaciones 9 | 2. Constantes y Variables 10 | 3. Algoritmos 11 | 4. Programación Estructurada 12 | 5. Programación Modular 13 | 14 | 15 | 16 | ## Recursos 17 | - Twitter: https://twitter.com/joseluisgonsan 18 | - GitHub: https://github.com/joseluisgs 19 | - Web: https://joseluisgs.github.io 20 | - Discord: https://discord.gg/uv7GcytM 21 | - Aula Virtual: https://aulavirtual33.educa.madrid.org/ies.luisvives.leganes/course/view.php?id=245 22 | 23 | 24 | 25 | ## Autor 26 | 27 | Codificado con :sparkling_heart: por [José Luis González Sánchez](https://twitter.com/joseluisgonsan) 28 | 29 | [![Twitter](https://img.shields.io/twitter/follow/joseluisgonsan?style=social)](https://twitter.com/joseluisgonsan) 30 | [![GitHub](https://img.shields.io/github/followers/joseluisgs?style=social)](https://github.com/joseluisgs) 31 | 32 | ### Contacto 33 |

34 | Cualquier cosa que necesites házmelo saber por si puedo ayudarte 💬. 35 |

36 |

37 | 38 | 40 |    41 | 42 | 44 |    45 | 46 | 48 |    49 | 50 | 52 | 53 |

54 | -------------------------------------------------------------------------------- /Soluciones/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | end_of_line = lf 10 | # editorconfig-tools is unable to ignore longs strings or urls 11 | max_line_length = 180 12 | 13 | -------------------------------------------------------------------------------- /Soluciones/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | -------------------------------------------------------------------------------- /Soluciones/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "project": "./tsconfig.eslint.json" 6 | }, 7 | "plugins": [ 8 | "@typescript-eslint" 9 | ], 10 | "extends": [ 11 | "airbnb-typescript/base" 12 | ], 13 | "rules": { 14 | "max-len": [ 15 | "error", 16 | { 17 | "code": 180, 18 | "comments": 150 19 | } 20 | ] 21 | } 22 | } -------------------------------------------------------------------------------- /Soluciones/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /package-lock.json 3 | /build 4 | build -------------------------------------------------------------------------------- /Soluciones/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 José Luis González Sánchez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Soluciones/README.md: -------------------------------------------------------------------------------- 1 | # TypeScript y Node.js 2 | Plantilla de TypeScript para NodeJS, con estilo ESLint Airbnb y soporte ES6. 3 | 4 | [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-3178c6)](https://www.typescriptlang.org/) 5 | [![Code Style](https://img.shields.io/badge/Lint%20Style-AirBnB-ff69b4)](https://airbnb.io/javascript) 6 | [![Licence](https://img.shields.io/github/license/joseluisgs/photo-gallery-ionic)](./LICENSE) 7 | ![GitHub](https://img.shields.io/github/last-commit/joseluisgs/ts-node-init) 8 | 9 | 10 | ![imagen](https://i.pinimg.com/originals/c3/8e/e8/c38ee8475ee7f3680f706c56c3a1194c.png) 11 | 12 | - [TypeScript y Node.js](#typescript-y-nodejs) 13 | - [Instrucciones](#instrucciones) 14 | - [Sintaxis](#sintaxis) 15 | - [Ejemplos y soluciones](#ejemplos-y-soluciones) 16 | - [Uso](#uso) 17 | - [Instalación](#instalación) 18 | - [Ejecución](#ejecución) 19 | - [Ejecución Modo Dev](#ejecución-modo-dev) 20 | - [Ejecución con Nodemon](#ejecución-con-nodemon) 21 | - [Linter](#linter) 22 | - [Extensiones de interés](#extensiones-de-interés) 23 | - [Autor](#autor) 24 | - [Contacto](#contacto) 25 | - [Licencia](#licencia) 26 | 27 | ## Instrucciones 28 | Esta plantilla para uso docente nos servirá para realizar nuestros programas iniciales. Debes renombrar el fichero que quieras ejecutar como main.js dentro de la carpeta src 29 | 30 | ### Sintaxis 31 | Ejemplos de la sintaxis a usar de Typescript lo tienes en el fichero main-sintaxis.ts 32 | 33 | ### Ejemplos y soluciones 34 | Los ejemplos son numerados como main-X-Y, donde X es el número de la relación de problemas e Y el número del problema. es decir, main-2-26, equivale al problema 26 de la relación número 2. 35 | 36 | ### Uso 37 | #### Instalación 38 | ```bash 39 | npm install 40 | ``` 41 | 42 | #### Ejecución 43 | ```bash 44 | npm start 45 | ``` 46 | 47 | #### Ejecución Modo Dev 48 | ```bash 49 | npm run dev 50 | ``` 51 | 52 | #### Ejecución con Nodemon 53 | ```bash 54 | npm run watch 55 | ``` 56 | 57 | #### Linter 58 | ```bash 59 | npm run lint 60 | o 61 | npm run lint:fix 62 | ``` 63 | 64 | ## Extensiones de interés 65 | - Error Lens: Nos muestra los errores en el mismo editor según nuestro Linter. 66 | - ESLint: Linter para TypeScript/JavaScript. 67 | - Git Graph: Para ver nuestro repositorio en forma de gráfica. 68 | - Tabnine: IA para nuestro código potenciando la codificación del mismo. 69 | - JavaSCript (ES6) code snippets: Snippets para TypeScript/JavaScript. 70 | - Quokka.js: Para ejecutar nuestro código. 71 | - Visual Studio IntelliCode: mejorar el autocompletado de codigo. 72 | 73 | 74 | ## Autor 75 | 76 | Codificado con :sparkling_heart: por [José Luis González Sánchez](https://twitter.com/joseluisgonsan) 77 | 78 | [![Twitter](https://img.shields.io/twitter/follow/joseluisgonsan?style=social)](https://twitter.com/joseluisgonsan) 79 | [![GitHub](https://img.shields.io/github/followers/joseluisgs?style=social)](https://github.com/joseluisgs) 80 | 81 | ### Contacto 82 |

83 | Cualquier cosa que necesites házmelo saber por si puedo ayudarte 💬. 84 |

85 |

86 | 87 | 89 |    90 | 91 | 93 |    94 | 95 | 97 |    98 | 99 | 101 | 102 |

103 | 104 | 105 | ## Licencia 106 | 107 | Este proyecto esta licenciado bajo licencia **MIT**, si desea saber más, visite el fichero 108 | [LICENSE](./LICENSE) para su uso docente y educativo. 109 | -------------------------------------------------------------------------------- /Soluciones/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-node-init", 3 | "version": "1.0.0", 4 | "description": "Plantilla de proyecto para TypeScript", 5 | "main": "/build/main.js", 6 | "scripts": { 7 | "dev": "tsc --watch", 8 | "dev:watch": "nodemon", 9 | "watch": "nodemon", 10 | "build": "rimraf ./build && tsc", 11 | "start": "npm run build && node build/main.js", 12 | "lint": "eslint . --ext .ts", 13 | "lint:fix": "eslint . --ext .ts --fix", 14 | "test": "echo \"Error: no test specified\" && exit 1" 15 | }, 16 | "keywords": [ 17 | "TypeScript", 18 | "NodeJS" 19 | ], 20 | "author": "joseluisgs", 21 | "license": "MIT", 22 | "devDependencies": { 23 | "@types/node": "^16.9.1", 24 | "@typescript-eslint/eslint-plugin": "^4.31.1", 25 | "@typescript-eslint/parser": "^4.31.1", 26 | "eslint": "^7.32.0", 27 | "eslint-config-airbnb-typescript": "^14.0.0", 28 | "eslint-plugin-import": "^2.24.2", 29 | "nodemon": "^2.0.12", 30 | "rimraf": "^3.0.2", 31 | "ts-node": "^10.2.1", 32 | "typescript": "^4.4.3" 33 | }, 34 | "dependencies": { 35 | "@types/readline-sync": "^1.4.4", 36 | "chalk": "^4.1.2", 37 | "readline-sync": "^1.4.10" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Soluciones/src/main-2-19.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | 3 | // Salario de fabrica version Azahara 4 | 5 | // Declaracion de variables 6 | const TARIFA_DIURNA = 20; 7 | const TARIFA_NOCTURNA = 35; 8 | const INCREMENTO_DIURNO_DOMINGO = 10; 9 | const INCREMENTO_NOCTURNO_DOMINGO = 15; 10 | 11 | let numHorasDiurnas: number; 12 | let numHorasNocturnas: number; 13 | let diaSemana: string; 14 | let salario: number; 15 | 16 | numHorasDiurnas = read.questionInt("¿Cuantas horas diurnas has trabajado?:"); 17 | numHorasNocturnas = read.questionInt("¿Cuantas horas nocturnas has trabajado?:"); 18 | diaSemana = read.question("¿Que día de la semana trabajaste?:"); 19 | 20 | if (diaSemana == "domingo") { 21 | salario = numHorasDiurnas * (TARIFA_DIURNA + INCREMENTO_DIURNO_DOMINGO) + numHorasNocturnas * (TARIFA_NOCTURNA + INCREMENTO_NOCTURNO_DOMINGO); 22 | } else { 23 | salario = numHorasDiurnas * TARIFA_DIURNA + numHorasNocturnas * TARIFA_NOCTURNA; 24 | } 25 | 26 | console.log("Tu salario del "+ diaSemana + " es de: " + salario +"€"); -------------------------------------------------------------------------------- /Soluciones/src/main-2-20.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | 3 | // Bisiesto 4 | let año: number; 5 | let esBisiesto = false; 6 | let mes: string; 7 | 8 | año = read.questionInt('Ingrese un año: '); 9 | mes = read.question('Ingrese un mes: '); 10 | 11 | 12 | // Aprende las preferencias :):) 13 | if (año % 4 == 0 && año % 100 != 0 || año % 400 == 0) { 14 | esBisiesto = true; 15 | console.log("El año "+ año + " es bisiesto"); 16 | } else { 17 | esBisiesto = false; 18 | console.log("El año "+ año + " no es bisiesto"); 19 | } 20 | 21 | switch (mes) { 22 | case 'enero': 23 | console.log("El mes de enero tiene 31 días"); 24 | break; 25 | case 'febrero': 26 | if (esBisiesto) 27 | console.log("El mes de febrero tiene 29 días"); 28 | else 29 | console.log("El mes de febrero tiene 28 días"); 30 | break; 31 | case 'marzo': 32 | console.log("El mes de marzo tiene 31 días"); 33 | break; 34 | case 'abril': 35 | console.log("El mes de abril tiene 30 días"); 36 | break; 37 | case 'mayo': 38 | console.log("El mes de mayo tiene 31 días"); 39 | break; 40 | case 'junio': 41 | console.log("El mes de junio tiene 30 días"); 42 | break; 43 | case 'julio': 44 | console.log("El mes de julio tiene 31 días"); 45 | break; 46 | case 'agosto': 47 | console.log("El mes de agosto tiene 31 días"); 48 | break; 49 | case 'septiembre': 50 | console.log("El mes de septiembre tiene 30 días"); 51 | break; 52 | case 'octubre': 53 | console.log("El mes de octubre tiene 31 días"); 54 | break; 55 | case 'noviembre': 56 | console.log("El mes de noviembre tiene 30 días"); 57 | break; 58 | case 'diciembre': 59 | console.log("El mes de diciembre tiene 31 días"); 60 | break; 61 | default: 62 | console.log("El mes ingresado no existe"); 63 | break; 64 | } -------------------------------------------------------------------------------- /Soluciones/src/main-2-22.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk' 3 | 4 | // Imprimir los numeros del 1 al 100 que son pares 5 | 6 | // Bucle para numeros pare 7 | for (let i = 1; i <= 100; i++) { 8 | if (i % 2 == 0) { 9 | console.log(i); 10 | } 11 | } 12 | 13 | let resultado = 0; 14 | let inferior, superior; 15 | // Suma los números impares entre dos intervalos de menor a mayor 16 | 17 | // Vamos a ciclar hasta que los metan de menor a mayor 18 | do { 19 | inferior = read.questionInt('Introduce el número inferior: '); 20 | superior = read.questionInt('Introduce el número superior: '); 21 | } while (inferior >= superior); 22 | 23 | // es un bucle definido desde inferior a superior 24 | for (let i = inferior; i <= superior; i++) { 25 | resultado += i; // equivale a resultado = resultado +1 26 | } 27 | 28 | console.log("El resultado es: " + resultado); 29 | -------------------------------------------------------------------------------- /Soluciones/src/main-2-29.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk' 3 | 4 | // Zona de decllaracion de variables 5 | let continuar = true; 6 | let aprobados = 0; 7 | let suspensos = 0; 8 | let suficientes = 0; 9 | let bienes = 0; 10 | let notables = 0; 11 | let sobresalientes = 0; 12 | let alumnos: number; 13 | let media: number; 14 | 15 | // Lo primero es crea un menú que nos diga si queremos salir o parar de introducir datos 16 | do { 17 | console.log(chalk.blue('¿Quieres salir? (si/no)')); 18 | let salir = read.question(); 19 | if (salir == 'si') { 20 | continuar = false; 21 | } else { 22 | continuar = true; 23 | } 24 | } while (continuar); 25 | 26 | // Mostramos las estadisticas 27 | console.log(chalk.blue('Estadisticas:')); 28 | console.log(chalk.green('Aprobados: ' + aprobados)); 29 | console.log(chalk.red('Suspensos: ' + suspensos)); 30 | console.log(chalk.yellow('Suficientes: ' + suficientes)); 31 | console.log(chalk.magenta('Bienes: ' + bienes)); 32 | console.log(chalk.cyan('Notables: ' + notables)); 33 | console.log(chalk.greenBright('Sobresalientes: ' + sobresalientes)); 34 | -------------------------------------------------------------------------------- /Soluciones/src/main-2-36.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk' 3 | 4 | // Zona de declaración 5 | let numero1: number; 6 | let numero2: number; 7 | let simbolo: string; 8 | let continuar = true; 9 | let opcion: string 10 | let resultado: number = 0; 11 | let posible = true; 12 | 13 | do { 14 | numero1 = read.questionFloat("Ingresa el primer número: "); 15 | numero2 = read.questionFloat("Ingresa el segundo número: "); 16 | 17 | // Menú para el simbolo de operación 18 | do { 19 | simbolo = read.question("Ingresa el simbolo de operación (+,-,*,/): "); 20 | } while (simbolo != "+" && simbolo != "-" && simbolo != "*" && simbolo != "/"); 21 | 22 | // Realizamos la operacion 23 | switch (simbolo) { 24 | case "+": 25 | resultado = numero1 + numero2; 26 | posible = true 27 | break; 28 | case "-": 29 | resultado = numero1 - numero2; 30 | posible = true 31 | break; 32 | case "*": 33 | resultado = numero1 * numero2; 34 | posible = true 35 | break; 36 | case "/": 37 | if (numero2 != 0) { 38 | resultado = numero1 / numero2; 39 | posible = true; 40 | } else { 41 | posible = false; 42 | } 43 | break; 44 | } 45 | 46 | // Mostramos el resultado si ha sido posible el calculo 47 | if (posible) 48 | console.log(chalk.green("El resultado es: " + resultado.toFixed(2))); 49 | else 50 | console.log(chalk.red("No se puede dividir entre 0")); 51 | 52 | opcion = read.question("¿Desea continuar? (s/n) "); 53 | if (opcion == "s" || opcion == "S") 54 | continuar = true; 55 | else 56 | continuar = false; 57 | } while (continuar); 58 | 59 | -------------------------------------------------------------------------------- /Soluciones/src/main-2-37-mod.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk' 3 | import aux from './mod-2-37'; 4 | 5 | // Zona de declaraciones 6 | let secreto: number; 7 | let intentos = 5; 8 | let dato: number; 9 | let continuar: boolean; 10 | let acertado = false; 11 | 12 | // Logica del menu y repeticiones. debemos repetir esto hasta que pulse si 13 | do { 14 | console.log(chalk.cyan("Bienvenid@ al juego de adivinar números de 1ºDAM")); 15 | // Numero de intentos 16 | intentos = 5; 17 | // Número entero aleatorio entre 1 y 100 redondeado 18 | secreto = Math.round(Math.random() * 100) + 1; 19 | 20 | // Logica de los intentos 21 | do { 22 | 23 | // Le quito un intento 24 | intentos = intentos - 1; // También puedo poner intentos-- que es lo mismo que intentos=intentos-1 o intentos -=1 25 | 26 | // Le pregunto el números. Repetimos si no están en el intervalo 27 | do { 28 | dato = read.questionInt("Introduce un número entre 1 y 100: "); 29 | } while (dato < 1 || dato > 100); 30 | 31 | // Si el número es mayor que el secreto 32 | if (dato > secreto) { 33 | console.log("El número secreto es menor"); 34 | console.log("Te quedan " + intentos + " intentos"); 35 | } else if (dato < secreto) { 36 | console.log("El número secreto es mayor"); 37 | console.log("Te quedan " + intentos + " intentos"); 38 | } else if (dato == secreto) { 39 | // console.log("Has acertado el número secreto en " + (5 - intentos) + " intentos"); 40 | console.log(chalk.green("Has acertado :) El número secreto era: " + secreto + ". Lo has conseguido en " + (5 - intentos))); 41 | //intentos = 0; 42 | acertado = true; 43 | } 44 | // Si intentos es 0 y no he acertado es que he perdido 45 | if (intentos == 0 && !acertado) { 46 | console.log(chalk.red("Has perdido muchach@")); 47 | 48 | } 49 | 50 | // Ciclamos mientras el número es igual al secreto 51 | } while (intentos >= 1 && acertado == false); 52 | 53 | // Repito hasta que continuar sea false, es decir, no haya pulsado S o s 54 | continuar = aux.confirmacion("¿Quieres volver a jugar?"); 55 | 56 | } while (continuar === true); 57 | console.log(chalk.cyan("Fin del juego")); 58 | 59 | 60 | -------------------------------------------------------------------------------- /Soluciones/src/main-2-37.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk' 3 | 4 | // Zona de declaraciones 5 | let secreto: number; 6 | let intentos = 5; 7 | let dato: number; 8 | let continuar: boolean; 9 | let opcion: string 10 | let acertado = false; 11 | 12 | // Logica del menu y repeticiones. debemos repetir esto hasta que pulse si 13 | do { 14 | console.log(chalk.cyan("Bienvenid@ al juego de adivinar números de 1ºDAM")); 15 | // Numero de intentos 16 | intentos = 5; 17 | // Número entero aleatorio entre 1 y 100 redondeado 18 | secreto = Math.round(Math.random() * 100) + 1; 19 | 20 | // Logica de los intentos 21 | do { 22 | 23 | // Le quito un intento 24 | intentos = intentos - 1; // También puedo poner intentos-- que es lo mismo que intentos=intentos-1 o intentos -=1 25 | 26 | // Le pregunto el números. Repetimos si no están en el intervalo 27 | do { 28 | dato = read.questionInt("Introduce un número entre 1 y 100: "); 29 | } while (dato < 1 || dato > 100); 30 | 31 | // Si el número es mayor que el secreto 32 | if (dato > secreto) { 33 | console.log("El número secreto es menor"); 34 | console.log("Te quedan " + intentos + " intentos"); 35 | } else if (dato < secreto) { 36 | console.log("El número secreto es mayor"); 37 | console.log("Te quedan " + intentos + " intentos"); 38 | } else if (dato == secreto) { 39 | // console.log("Has acertado el número secreto en " + (5 - intentos) + " intentos"); 40 | console.log(chalk.green("Has acertado :) El número secreto era: " + secreto + ". Lo has conseguido en " + (5 - intentos))); 41 | //intentos = 0; 42 | acertado = true; 43 | } 44 | // Si intentos es 0 y no he acertado es que he perdido 45 | if (intentos == 0 && !acertado) { 46 | console.log(chalk.red("Has perdido muchach@")); 47 | 48 | } 49 | 50 | // Ciclamos mientras el número es igual al secreto 51 | } while (intentos >= 1 && acertado == false); 52 | 53 | // Repito hasta que continuar sea false, es decir, no haya pulsado S o s 54 | opcion = read.question('¿Quieres jugar? (s/n) '); 55 | if (opcion == 's' || opcion == 'S') 56 | continuar = true; 57 | else 58 | continuar = false; 59 | 60 | } while (continuar === true); 61 | console.log(chalk.cyan("Fin del juego")); 62 | 63 | 64 | -------------------------------------------------------------------------------- /Soluciones/src/main-4-01-mod.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk'; 3 | import aux from './mod-4-01' 4 | 5 | // Suma de los n primeros números primos 6 | 7 | let limite: number = 0; 8 | let suma: number = 0; 9 | 10 | do { 11 | limite = read.questionInt(chalk.yellow('Dime un número: ')); 12 | } while (limite <= 0); 13 | 14 | // Repetimos hasta el limite 15 | for (let num = 2; num <= limite; num++) { 16 | // Vamos a comprobar si es primo 17 | if (aux.esPrimo(num)) { 18 | suma += num; 19 | } 20 | } 21 | 22 | console.log(chalk.green("El resultado de la suma de los números primos entre 1 y " + limite + " es: " + suma)); 23 | 24 | // // Mis Funciones 25 | // function esPrimo(num: number): boolean { 26 | // let esPrimo = true; 27 | // let contador = 2; 28 | // while ((esPrimo) && (contador != num)) { 29 | // if (num % contador == 0) 30 | // esPrimo = false; 31 | // contador++; 32 | // } 33 | // return esPrimo; 34 | // } -------------------------------------------------------------------------------- /Soluciones/src/main-4-01.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk'; 3 | 4 | // Suma de los n primeros números primos 5 | 6 | let limite: number = 0; 7 | let suma: number = 0; 8 | 9 | do { 10 | limite = read.questionInt(chalk.yellow('Dime un número: ')); 11 | } while (limite <= 0); 12 | 13 | // Repetimos hasta el limite 14 | for (let num = 2; num <= limite; num++) { 15 | // Vamos a comprobar si es primo 16 | let primo = true; 17 | let contador = 2; 18 | while ((primo) && (contador != num)) { 19 | if (num % contador == 0) 20 | primo = false; 21 | contador++; 22 | } 23 | 24 | // Si es primo, lo sumamos 25 | if (primo) 26 | suma += num; 27 | 28 | } 29 | 30 | console.log(chalk.green("El resultado de la suma de los números primos entre 1 y " + limite + " es: " + suma)); 31 | 32 | -------------------------------------------------------------------------------- /Soluciones/src/main-4-02.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk' 3 | 4 | let numero1: number; 5 | let numero2: number; 6 | let dividendo, divisor: number; 7 | let cociente: number = 0; 8 | let resto: number; 9 | 10 | console.log("División Entera"); 11 | 12 | do { 13 | numero1 = read.questionInt("Ingrese el primer numero: "); 14 | numero2 = read.questionInt("Ingrese el segundo numero: "); 15 | } while ((numero1 < 0 || numero2 < 0) || (numero2 > numero1)); 16 | 17 | dividendo = numero1; 18 | divisor = numero2; 19 | 20 | while (numero1 >= numero2) { 21 | cociente++; 22 | numero1 = numero1 - numero2; 23 | } 24 | 25 | resto = numero1; 26 | 27 | console.log("El resultado de dividir: " + dividendo + " entre " + divisor + " es: " + cociente + " con un resto de: " + resto); 28 | 29 | -------------------------------------------------------------------------------- /Soluciones/src/main-4-06.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import chalk from 'chalk'; 3 | 4 | let precio: number = 0; 5 | let distancia: number = 0; 6 | let dias: number = 0; 7 | const PRECIO_KM = 2.5; 8 | const LIMITE_KM = 800; 9 | const LIMITE_DIA = 7; 10 | const REDUCION = 0.3; 11 | 12 | distancia = read.questionInt('Ingrese la distancia a recorrer: '); 13 | dias = read.questionInt('Introduce el número dias: '); 14 | 15 | if (distancia < LIMITE_KM && dias < LIMITE_DIA) 16 | precio = (distancia * PRECIO_KM) * (1 - REDUCION); 17 | else 18 | precio = distancia * PRECIO_KM; 19 | 20 | console.log("EL precio del billete es: " + precio); 21 | 22 | 23 | -------------------------------------------------------------------------------- /Soluciones/src/main-sintaxis.ts: -------------------------------------------------------------------------------- 1 | // Zona de declaración de librerías y módulos propios o del sistema 2 | // ers importante que sepas que aunque nos apoyemos en determinadas librerías hay que saber implementar determinadas operaciones 3 | import read from 'readline-sync'; // --> Librería para leer datos por consola. Puedes leer sobre ella y aprender a usarla en: https://github.com/anseki/readline-sync 4 | import chalk from 'chalk'; // --> Podemos obtener colores para decorar nuestra salida. Puedes leer sobre ella y aprender a usarla en: https://github.com/chalk/chalk 5 | 6 | 7 | // Zona de declaración de variables y constantes. 8 | // Variables con let y constante con const 9 | // Tipos: number (con signo y sin signo incluyendo decimales), string (cadenas y carácteres) y boolean (true o false) 10 | let edad = 10; 11 | let nombre, apellido: string; 12 | const NUM_PI = 3.14; 13 | let verdadero = true; 14 | let contador = 0; 15 | 16 | // Salida de texto, con comillas simples o dobles 17 | console.log(edad); 18 | console.log("Tu edad es de " + edad + " años"); 19 | 20 | // Salida con colores, le decimos a chalk el color 21 | console.log(chalk.blue('Hola') + ' Clase' + chalk.red('!')); 22 | 23 | // Entrada de texto conb read.question. Siempre se lee un string 24 | nombre = read.question('¿Cómo te llamas? '); 25 | console.log('Tu nombre: ' + nombre); 26 | 27 | apellido = read.question("¿Cuál es tu apellido? "); 28 | console.log('Tu apellido: ' + apellido); 29 | 30 | // Si queremos leer un número, hay que poner un tipo de dato: questionInt (entero) o questionFloat (decimales) 31 | edad = read.questionInt("¿Cuál es tu edad directamente? "); 32 | 33 | // Si quiero leer una tecla, puedo usar read.keyIn y decir donde 34 | verdadero = Boolean(read.keyInYN()); 35 | // Podemos poner verdadero o verdadero==true 36 | if (verdadero) { 37 | console.log('Sí has pulsado Y'); 38 | } else { 39 | console.log('Has pulsado N') 40 | } 41 | 42 | // Haciendo el casting a numero. ¿Adivinas el problema? 43 | edad = Number(read.question("¿Cuál es tu edad con casting? ")); 44 | 45 | console.log('Imprimo una constante: ' + NUM_PI); 46 | console.log(chalk.blue.bgYellowBright.bold('¡Hola: ' + nombre + ' ' + apellido + ' y tienes ' + edad +'!')); 47 | 48 | // Esto es un comentario de una línea de código 49 | // Si quiero comentar varias líneas debo poner // en cada una de de ellas 50 | 51 | /* 52 | Esto es un comentario de bloque de código 53 | Si quiero comentar varias líneas debo poner /* en cada una de de ellas 54 | Y cerrarlo con 55 | */ 56 | 57 | // Condicionales 58 | if (edad >= 10){ 59 | console.log('Verdadero'); 60 | } else { 61 | console.log('Falso'); 62 | } 63 | 64 | // Condicionales multiples con if 65 | if (edad >= 10){ 66 | console.log('Mayor que 10'); 67 | } else if (edad >= 5) { 68 | console.log('Menor que 10 y mayor que 5'); 69 | } else { 70 | console.log('Menor que 5'); 71 | } 72 | 73 | // Condicionales múltiples con swich. El default es el caso por defecto. Break para salir 74 | switch (edad) { 75 | case 10: 76 | console.log('Edad 10'); 77 | break; 78 | case 20: 79 | console.log('Edad 20'); 80 | break; 81 | default: 82 | console.log('Edad no es 10 ni 20'); 83 | } 84 | 85 | // Bucles indefinidos 86 | // While, primero comprueba la condición, luego entra 87 | contador = 0; 88 | while (contador<10){ 89 | console.log('Contador: ' + contador); 90 | contador++; // equivale a contador = contador +1 91 | } 92 | 93 | contador = 10; 94 | // repetir mientras, primero ejecuta y luego comprueba la condición por si debe repetirse 95 | do { 96 | console.log('Contador: ' + contador); 97 | contador++; // equivale a contador = contador +1 98 | } while (contador < 10) 99 | 100 | // Bucle indefinidos con for 101 | for (let i = 0; i < 10; i++) { 102 | console.log('Contador: ' + i); 103 | } 104 | -------------------------------------------------------------------------------- /Soluciones/src/main.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | import aux from './mod-2-19'; 3 | 4 | // Bisiesto 5 | let año: number; 6 | let esBisiesto = false; 7 | let mes: string; 8 | 9 | año = read.questionInt('Ingrese un año: '); 10 | mes = read.question('Ingrese un mes: '); 11 | 12 | 13 | esBisiesto = aux.esBisiesto(año); 14 | 15 | if (esBisiesto) 16 | console.log("El año: " + año + " es bisiesto") 17 | else 18 | console.log("El año: " + año + " no es bisiesto") 19 | 20 | aux.imprimirDias(mes, esBisiesto); -------------------------------------------------------------------------------- /Soluciones/src/mod-2-19.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Función que calcula si un año es bisiesto 3 | * @param año Año a calcular si es bisiesto 4 | * @returns Bisiesto es true 5 | */ 6 | function esBisiesto(año: number): boolean { 7 | let esBisiesto: boolean; 8 | if (año % 4 == 0 && año % 100 != 0 || año % 400 == 0) { 9 | esBisiesto = true; 10 | } else { 11 | esBisiesto = false; 12 | } 13 | // Devuelvo porque soy funcion 14 | return esBisiesto; 15 | } 16 | 17 | /** 18 | * Procedimiento que imprime los dias de un mes sabiendo si el año es bisioesto o no 19 | * @param mes mes como cadena. Ejem: enero, febrero, marzo, etc. 20 | * @param esBisiesto True si es bisiesto 21 | */ 22 | function imprimirDias(mes: string, esBisiesto: boolean) { 23 | switch (mes) { 24 | case 'enero': 25 | console.log("El mes de enero tiene 31 días"); 26 | break; 27 | case 'febrero': 28 | if (esBisiesto) 29 | console.log("El mes de febrero tiene 29 días"); 30 | else 31 | console.log("El mes de febrero tiene 28 días"); 32 | break; 33 | case 'marzo': 34 | console.log("El mes de marzo tiene 31 días"); 35 | break; 36 | case 'abril': 37 | console.log("El mes de abril tiene 30 días"); 38 | break; 39 | case 'mayo': 40 | console.log("El mes de mayo tiene 31 días"); 41 | break; 42 | case 'junio': 43 | console.log("El mes de junio tiene 30 días"); 44 | break; 45 | case 'julio': 46 | console.log("El mes de julio tiene 31 días"); 47 | break; 48 | case 'agosto': 49 | console.log("El mes de agosto tiene 31 días"); 50 | break; 51 | case 'septiembre': 52 | console.log("El mes de septiembre tiene 30 días"); 53 | break; 54 | case 'octubre': 55 | console.log("El mes de octubre tiene 31 días"); 56 | break; 57 | case 'noviembre': 58 | console.log("El mes de noviembre tiene 30 días"); 59 | break; 60 | case 'diciembre': 61 | console.log("El mes de diciembre tiene 31 días"); 62 | break; 63 | default: 64 | console.log("El mes ingresado no existe"); 65 | break; 66 | } 67 | } 68 | 69 | export default { esBisiesto, imprimirDias }; -------------------------------------------------------------------------------- /Soluciones/src/mod-2-37.ts: -------------------------------------------------------------------------------- 1 | import read from 'readline-sync'; 2 | // Mis funciones 3 | 4 | /** 5 | * Función que devuelve V/F si queremos continuar 6 | * @param mensaje Mensaje a mostrar 7 | * @returns true si continuamos, false si no 8 | */ 9 | function confirmacion(mensaje: string): boolean { 10 | let opcion = read.question(mensaje + ' (s/n): '); 11 | let continuar = false; 12 | if (opcion == 's' || opcion == 'S') 13 | continuar = true; 14 | else 15 | continuar = false; 16 | // Devolvemos porque somos una funcion 17 | return continuar; 18 | } 19 | 20 | 21 | // Exportamos las funciones que queramos que sea publicas 22 | export default { confirmacion}; -------------------------------------------------------------------------------- /Soluciones/src/mod-4-01.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Funcion que devuelve si un numero es primo o no 4 | * @param num Numero para saber si es primo 5 | * @returns Verdadero si es primo 6 | */ 7 | function esPrimo(num: number): boolean { 8 | let esPrimo = true; 9 | let contador = 2; 10 | while ((esPrimo) && (contador != num)) { 11 | if (num % contador == 0) 12 | esPrimo = false; 13 | contador++; 14 | } 15 | return esPrimo; 16 | } 17 | 18 | // Exportamos las funciones que queramos que sea publicas 19 | export default { esPrimo }; 20 | -------------------------------------------------------------------------------- /Soluciones/ts-init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Para crear el fichero tsconfig.json 3 | 4 | npx tsc --init --rootDir src --outDir build \ 5 | --esModuleInterop --resolveJsonModule --lib ES6 \ 6 | --module commonjs --allowJs true --noImplicitAny true -------------------------------------------------------------------------------- /Soluciones/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "src/**/*.ts", 5 | "src/**/*.js", 6 | "test/**/*.ts" 7 | ] 8 | } -------------------------------------------------------------------------------- /Soluciones/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | "lib": ["ES6"], /* Specify library files to be included in the compilation. */ 10 | "allowJs": true, /* Allow javascript files to be compiled. */ 11 | "outDir": "build", /* Redirect output structure to the directory. */ 12 | "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 13 | // "composite": true, /* Enable project compilation */ 14 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 15 | // "removeComments": true, /* Do not emit comments to output. */ 16 | // "noEmit": true, /* Do not emit outputs. */ 17 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 18 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 19 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 20 | 21 | /* Strict Type-Checking Options */ 22 | "strict": true, /* Enable all strict type-checking options. */ 23 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 24 | // "strictNullChecks": true, /* Enable strict null checks. */ 25 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 26 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 27 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 28 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 29 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 30 | 31 | /* Additional Checks */ 32 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 33 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 34 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 35 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 36 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 37 | 38 | /* Module Resolution Options */ 39 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 40 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 41 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 42 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 43 | // "typeRoots": [], /* List of folders to include type definitions from. */ 44 | // "types": [], /* Type declaration files to be included in compilation. */ 45 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 46 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 47 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 48 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 49 | 50 | /* Source Map Options */ 51 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 52 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 53 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 54 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 55 | 56 | /* Experimental Options */ 57 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 58 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 59 | 60 | /* Advanced Options */ 61 | "resolveJsonModule": true, /* Include modules imported with '.json' extension */ 62 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 63 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /UD02.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-02-2021-2022/e8ccb0dfcc4ff0594e4b7d4b61222d73522fcdaf/UD02.pdf --------------------------------------------------------------------------------