├── .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 | 
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 | [](https://twitter.com/joseluisgonsan)
30 | [](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 | [](https://www.typescriptlang.org/)
5 | [](https://airbnb.io/javascript)
6 | [](./LICENSE)
7 | 
8 |
9 |
10 | 
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 | [](https://twitter.com/joseluisgonsan)
79 | [](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
--------------------------------------------------------------------------------