Skip to content

Commit b65d841

Browse files
authored
Merge pull request mouredev#7247 from wapastorv/main
#11 - JavaScript
2 parents c265b6a + 6dc9132 commit b65d841

File tree

2 files changed

+395
-0
lines changed

2 files changed

+395
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/* IMPORTANTE: Sólo debes subir el fichero de código como parte del ejercicio.
2+
*
3+
* EJERCICIO:
4+
* Desarrolla un programa capaz de crear un archivo que se llame como
5+
* tu usuario de GitHub y tenga la extensión .txt.
6+
* Añade varias líneas en ese fichero:
7+
* - Tu nombre.
8+
* - Edad.
9+
* - Lenguaje de programación favorito.
10+
* Imprime el contenido.
11+
* Borra el fichero.
12+
*/
13+
14+
/*const fs = require('fs');// Importamos el módulo fs para trabajar con ficheros.
15+
const fileName = 'wapastorv.txt';// Nombre del archivo que vamos a crear.
16+
const content = 'Nombre: William Pastor\nEdad: 26\nLenguaje de programación favorito: JavaScript'; // Contenido del archivo que vamos a crear.
17+
18+
fs.writeFile(fileName, content, (err) => { // Creamos el archivo con el contenido.
19+
if (err) {
20+
console.error('Error al crear el archivo:', err); // Si hay un error, lo mostramos por consola.
21+
return;
22+
}
23+
console.log('Archivo creado correctamente con el contenido:', content); // Si no hay errores, mostramos un mensaje de éxito.
24+
fs.readFile(fileName, 'utf8', (err, data) => { // Leemos el archivo creado.
25+
if (err) {
26+
console.error('Error al leer el archivo:', err); // Si hay un error, lo mostramos por consola.
27+
return;
28+
}
29+
console.log('Contenido del archivo:', data);// Si no hay errores, mostramos el contenido del archivo.
30+
fs.unlink(fileName, (err) => {// Borramos el archivo creado.
31+
if (err) {
32+
console.error('Error al borrar el archivo:', err);
33+
return;
34+
}
35+
console.log('Archivo borrado correctamente');
36+
});
37+
38+
});
39+
});*/
40+
41+
/* DIFICULTAD EXTRA (opcional):
42+
* Desarrolla un programa de gestión de ventas que almacena sus datos en un
43+
* archivo .txt.
44+
* - Cada producto se guarda en una línea del archivo de la siguiente manera:
45+
* [nombre_producto], [cantidad_vendida], [precio].
46+
* - Siguiendo ese formato, y mediante terminal, debe permitir añadir, consultar,
47+
* actualizar, eliminar productos y salir.
48+
* - También debe poseer opciones para calcular la venta total y por producto.
49+
* - La opción salir borra el .txt.
50+
*/
51+
52+
// Código extra aquí...
53+
const fs = require('fs'); // Importamos el módulo fs para trabajar con ficheros.
54+
const readline = require('readline'); // Importamos el módulo readline para leer la entrada por consola.
55+
const rl = readline.createInterface({ // Creamos una interfaz de lectura.
56+
input: process.stdin, // Establecemos la entrada estándar.
57+
output: process.stdout // Establecemos la salida estándar.
58+
});
59+
60+
const fileNameVentas = 'ventas.txt'; // Nombre del archivo que vamos a crear.
61+
const menu = `Menú:
62+
1. Añadir producto.
63+
2. Consultar productos.
64+
3. Actualizar producto.
65+
4. Eliminar producto.
66+
5. Calcular venta total.
67+
6. Calcular venta por producto.
68+
7. Salir.`; // Menú de opciones.
69+
const productos = []; // Array donde almacenaremos los productos
70+
71+
function addProduct() { // Función para añadir un producto.
72+
rl.question('Introduce el nombre del producto, la cantidad vendida y el precio (separados por comas): ', (answer) => {
73+
const [nombre, cantidad, precio] = answer.split(','); // Dividimos la respuesta en un array.
74+
productos.push({ nombre, cantidad: parseInt(cantidad), precio: parseFloat(precio) }); // Añadimos el producto al array.
75+
rl.question('Producto añadido correctamente. Pulsa cualquier tecla para continuar.', () => showMenu());}); // Mostramos el menú.
76+
}
77+
78+
function showProducts() { // Función para mostrar los productos.
79+
console.log('Productos:');
80+
productos.forEach((producto) => console.log(`${producto.nombre}, ${producto.cantidad}, ${producto.precio}`)); // Mostramos los productos.
81+
rl.question('Pulsa cualquier tecla para continuar.', () => showMenu());
82+
}
83+
84+
function updateProduct() { // Función para actualizar un producto.
85+
rl.question('Introduce el nombre del producto a actualizar: ', (nombre) => {
86+
const producto = productos.find((producto) => producto.nombre === nombre); // Buscamos el producto.
87+
if (!producto) { // Si no existe, mostramos un mensaje de error.
88+
console.log('Producto no encontrado.');
89+
return rl.question('Pulsa cualquier tecla para continuar.', () => showMenu());
90+
}
91+
rl.question('Introduce la nueva cantidad vendida y el nuevo precio (separados por comas): ', (answer) => {
92+
const [cantidad, precio] = answer.split(','); // Dividimos la respuesta en un array.
93+
producto.cantidad = parseInt(cantidad); // Actualizamos la cantidad.
94+
producto.precio = parseFloat(precio); // Actualizamos el precio.
95+
rl.question('Producto actualizado correctamente. Pulsa cualquier tecla para continuar.', () => showMenu());
96+
});
97+
});
98+
}
99+
100+
function deleteProduct() { // Función para eliminar un producto.
101+
rl.question('Introduce el nombre del producto a eliminar: ', (nombre) => {
102+
const index = productos.findIndex((producto) => producto.nombre === nombre); // Buscamos el índice del producto.
103+
if (index === -1) { // Si no existe, mostramos un mensaje de error.
104+
console.log('Producto no encontrado.');
105+
return rl.question('Pulsa cualquier tecla para continuar.', () => showMenu());
106+
}
107+
productos.splice(index, 1); // Eliminamos el producto.
108+
rl.question('Producto eliminado correctamente. Pulsa cualquier tecla para continuar.', () => showMenu());
109+
});
110+
}
111+
112+
function totalSale() { // Función para calcular la venta total.
113+
const total = productos.reduce((acc, producto) => acc + producto.cantidad * producto.precio, 0); // Calculamos el total.
114+
console.log(`Venta total: ${total}`); // Mostramos el total.
115+
rl.question('Pulsa cualquier tecla para continuar.', () => showMenu());
116+
}
117+
118+
function saleByProduct() { // Función para calcular la venta por producto.
119+
rl.question('Introduce el nombre del producto: ', (nombre) => {
120+
const producto = productos.find((producto) => producto.nombre === nombre); // Buscamos el producto.
121+
if (!producto) { // Si no existe, mostramos un mensaje de error.
122+
console.log('Producto no encontrado.');
123+
return rl.question('Pulsa cualquier tecla para continuar.', () => showMenu());
124+
}
125+
console.log(`Venta por ${producto.nombre}: ${producto.cantidad * producto.precio}`); // Mostramos la venta por producto.
126+
rl.question('Pulsa cualquier tecla para continuar.', () => showMenu());
127+
});
128+
}
129+
130+
function showMenu() { // Función para mostrar el menú.
131+
rl.question(menu, (option) => {
132+
switch (option) { // Según la opción seleccionada, llamamos a la función correspondiente.
133+
case '1':
134+
addProduct();
135+
break;
136+
case '2':
137+
showProducts();
138+
break;
139+
case '3':
140+
updateProduct();
141+
break;
142+
case '4':
143+
deleteProduct();
144+
break;
145+
case '5':
146+
totalSale();
147+
break;
148+
case '6':
149+
saleByProduct();
150+
break;
151+
case '7':
152+
fs.unlink(fileNameVentas, (err) => { // Borramos el archivo creado.
153+
if (err) {
154+
console.error('Error al borrar el archivo:', err);
155+
return;
156+
}
157+
console.log('Archivo borrado correctamente.');
158+
rl.close();
159+
});
160+
break;
161+
default:
162+
console.log('Opción no válida.'); // Si la opción no es válida, mostramos un mensaje de error.
163+
showMenu();
164+
}
165+
});
166+
}
167+
168+
fs.writeFile(fileNameVentas, '', (err) => { // Creamos el archivo.
169+
if (err) {
170+
console.error('Error al crear el archivo:', err);
171+
return;
172+
}
173+
console.log('Archivo creado correctamente.');
174+
showMenu();
175+
})
176+
177+
rl.on('close', () => console.log('¡Hasta luego!')); // Cuando se cierra la interfaz, mostramos un mensaje
178+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
/*
2+
* IMPORTANTE: Sólo debes subir el fichero de código como parte del ejercicio.
3+
*
4+
* EJERCICIO:
5+
* Desarrolla un programa capaz de crear un archivo XML y JSON que guarde los
6+
* siguientes datos (haciendo uso de la sintaxis correcta en cada caso):
7+
* - Nombre
8+
* - Edad
9+
* - Fecha de nacimiento
10+
* - Listado de lenguajes de programación
11+
* Muestra el contenido de los archivos.
12+
* Borra los archivos.
13+
*/
14+
const fs = require('fs');
15+
16+
// Datos para el archivo XML
17+
const data ={
18+
nombre: "William Pastor",
19+
ciudad: "Madrid",
20+
edad: 18,
21+
fechaDeNacimiento: "13-12-1993",
22+
listadoDeLenguajesProgramacion : ['JavaScript', 'Python']
23+
}
24+
25+
// Datos para el archivo XML
26+
// Convertir el objeto a una cadena XML (simplificado)
27+
const xmlString = `<persona>
28+
<nombre>${data.nombre}</nombre>
29+
<edad>${data.edad}</edad>
30+
<ciudad>${data.ciudad}</ciudad>
31+
<fechaDeNacimiento>${data.fechaDeNacimiento}</fechaDeNacimiento>
32+
<listadoDeLenguajesProgramacion>${data.listadoDeLenguajesProgramacion.join(',')}</listadoDeLenguajesProgramacion>
33+
</persona>`;
34+
35+
// Crear el archivo XML
36+
fs.writeFile('persona.xml', xmlString, (err) => {
37+
if (err) {
38+
console.error(err);
39+
} else {
40+
console.log('Archivo XML creado exitosamente');
41+
}
42+
});
43+
44+
fs.readFile('persona.xml', 'utf8', (err, data) => {
45+
if (err) {
46+
console.error(err);
47+
} else {
48+
console.log(data); // Imprime el contenido del archivo XML
49+
}
50+
});
51+
// Convertir el objeto a una cadena JSON
52+
const jsonString = JSON.stringify(data);
53+
54+
// Crear el archivo JSON
55+
fs.writeFile('persona.json', jsonString, (err) => {
56+
if (err) {
57+
console.error(err);
58+
} else {
59+
console.log('Archivo JSON creado exitosamente');
60+
}
61+
});
62+
// Leer archivo JSON
63+
fs.readFile('persona.json', 'utf8', (err, data) => {
64+
if (err) {
65+
console.error(err);
66+
} else {
67+
const jsonData = JSON.parse(data);
68+
console.log(jsonData); // Imprime el contenido del archivo JSON como un objeto
69+
}
70+
});
71+
72+
/* DIFICULTAD EXTRA (opcional):
73+
* Utilizando la lógica de creación de los archivos anteriores, crea un
74+
* programa capaz de leer y transformar en una misma clase custom de tu
75+
* lenguaje los datos almacenados en el XML y el JSON.
76+
* Borra los archivos.
77+
*/
78+
79+
// Clase Persona
80+
class Persona {
81+
constructor(nombre, edad, ciudad, fechaDeNacimiento, listadoDeLenguajesProgramacion) {
82+
this.nombre = nombre;
83+
this.edad = edad;
84+
this.ciudad = ciudad;
85+
this.fechaDeNacimiento = fechaDeNacimiento;
86+
this.listadoDeLenguajesProgramacion = listadoDeLenguajesProgramacion;
87+
}
88+
}
89+
90+
// Leer el archivo XML
91+
92+
fs.readFile('persona.xml', 'utf8', (err, data) => {
93+
if (err) {
94+
console.error(err);
95+
} else {
96+
// Convertir XML a JSON
97+
const xml2js = require('xml2js');
98+
xml2js.parseString(data, (err, result) => {
99+
if (err) {
100+
console.error(err);
101+
} else {
102+
const personaXml = result.persona;
103+
const persona = new Persona(
104+
personaXml.nombre[0],
105+
parseInt(personaXml.edad[0]),
106+
personaXml.ciudad[0],
107+
personaXml.fechaDeNacimiento[0],
108+
personaXml.listadoDeLenguajesProgramacion[0].split(',')
109+
);
110+
console.log(persona);
111+
}
112+
});
113+
}
114+
});
115+
116+
// Leer el archivo JSON
117+
fs.readFile('persona.json', 'utf8', (err, data) => {
118+
if (err) {
119+
console.error(err);
120+
} else {
121+
const jsonData = JSON.parse(data);
122+
const persona = new Persona(
123+
jsonData.nombre,
124+
jsonData.edad,
125+
jsonData.ciudad,
126+
jsonData.fechaDeNacimiento,
127+
jsonData.listadoDeLenguajesProgramacion
128+
);
129+
console.log(persona);
130+
}
131+
});
132+
133+
// Borrar los archivos (opcional)
134+
fs.unlink('persona.xml', (err) => {
135+
if (err) {
136+
console.error(err);
137+
} else {
138+
console.log('Archivo XML eliminado');
139+
}
140+
});
141+
fs.unlink('persona.json', (err) => {
142+
if (err) {
143+
console.error(err);
144+
} else {
145+
console.log('Archivo JSON eliminado');
146+
}
147+
});
148+
149+
// Otra forma de hacerlo
150+
151+
152+
/*
153+
const fs = require('fs');
154+
const xml2js = require('xml2js');
155+
156+
class Persona {
157+
constructor(nombre, edad, hobbies, ciudad, pais) {
158+
this.nombre = nombre;
159+
this.edad = edad;
160+
this.hobbies = hobbies;
161+
this.ciudad = ciudad;
162+
this.pais = pais;
163+
}
164+
}
165+
166+
function unificarDatos(xmlData, jsonData) {
167+
const personaXml = new Persona(
168+
xmlData.persona.nombre[0],
169+
parseInt(xmlData.persona.edad[0]),
170+
xmlData.persona.hobbies[0].hobby
171+
);
172+
const personaJson = new Persona(
173+
jsonData.nombre,
174+
jsonData.edad,
175+
[], // Inicializamos hobbies como un array vacío
176+
jsonData.ciudad,
177+
jsonData.pais
178+
);
179+
180+
// Combinar hobbies:
181+
personaUnificada = { ...personaXml, ...personaJson };
182+
personaUnificada.hobbies = [...personaXml.hobbies, ...personaJson.hobbies];
183+
184+
return personaUnificada;
185+
}
186+
187+
// Leer el archivo XML
188+
fs.readFile('persona.xml', 'utf8', (err, xmlData) => {
189+
if (err) throw err;
190+
191+
// Convertir XML a JSON
192+
xml2js.parseString(xmlData, (err, result) => {
193+
if (err) throw err;
194+
195+
// Leer el archivo JSON
196+
fs.readFile('persona.json', 'utf8', (err, jsonData) => {
197+
if (err) throw err;
198+
199+
jsonData = JSON.parse(jsonData);
200+
201+
// Unificar los datos
202+
const personaUnificada = unificarDatos(result, jsonData);
203+
console.log(personaUnificada);
204+
205+
// Borrar los archivos (opcional)
206+
/*fs.unlink('persona.xml', (err) => {
207+
if (err) throw err;
208+
console.log('Archivo XML eliminado');
209+
});
210+
fs.unlink('persona.json', (err) => {
211+
if (err) throw err;
212+
console.log('Archivo JSON eliminado');
213+
});
214+
});
215+
});
216+
});
217+
*/

0 commit comments

Comments
 (0)