Prácticas con JavaScript
Aplicaciones Telemáticas, 2023-2024
Grado en Ingeniería Telemática
Escuela de Ingeniería de Fuenlabrada
Universidad Rey Juan Carlos
Estos ejercicios deberán estar escritos en ECMAScript 6, preparado para ejecutarse en node.js, en modo estricto.
Los enunciados te pedirán una o varias funciones. Para probarlas, incluye en el propio fichero diversas llamadas a cada función, con diversos valores. Muestra por salida estándar el resultado. Ejemplo:
'use strict'
function suma(x,y){
return(x+y);
}
let a,b;
a=2;
b=2;
console.log(suma(a,b));
a=0.15;
b=0.50;
console.log(suma(a,b));
a=-1;
b=0;
console.log(suma(a,b));
a=undefined;
b=0;
console.log(suma(a,b));
// (etc)
Naturalmente, cuando un enunciado pida una función que haga algo, esa función a su vez podrá llamar a todas las funciones necesarias para tener un diseño razonable.
Escribe en un fichero ~/at/practica03/test01.js
un programa JavaScript similar a los ejemplos de las transparencias (pero no igual) que haga conversiones entre distintos tipos de datos y que detecte el valor NaN.
Escribe en un fichero ~/at/practica03/test02.js
un programa JavaScript similar a los ejemplos de las transparencias (pero no igual) para probar ejemplos básicos de expresiones aritméticas y expresiones booleanas, con el doble igual y con el triple igual.
Escribe en un fichero ~/at/practica03/test03.js
un programa JavaScript similar a los ejemplos de las transparencias (pero no igual) con funciones que ilustren que en JavaScript el paso de valores a las funciones es por valor y no por referencia. También el uso de valores por omisión de un parámetro (al estilo ECMAScript 6).
Escribe en un fichero ~/at/practica03/test04.js
un programa JavaScript similar a los ejemplos de las transparencias (pero no igual) con una función sencilla con notación tradicional, y una función equivalente con notación flecha. Prueba la función flecha usándola como argumento de otra función.
Escribe un fichero ~/at/practica03/js01.js
que contenga:
Una función que reciba una distancia en metros y la devuelva en centímetros.
Una función que reciba una distancia en metros y la devuelva en pulgadas. (Una pulgada son 0.0254 metros)
Una función que reciba una distancia en metros y la devuelva en yardas. (Un yarda son 0.9144 metros)
Escribe en un fichero ~/at/practica03/convierte.js
un programa JavaScript que tenga una función que reciba dos parámetros:
Una distancia expresada en metros. Este parámetro podrá ser tanto un número como una cadena
Una cadena que podrá tomar los valores m
, cm
, in
o yd
.
Los valores han de ser exactamente estos y no otros similares. No se admiten variaciones en mayúculas/minúsculas o espacios. Si el programador omite este parámetro, tu programa deberá detectarlo.
La función devolverá
Una cadena (no un número) con la distancia de entrada, convertida a las unidades expresadas en el segundo argumento (metro, centímetro, pulgada o yarda).
Si ha habido algún problema con los parámetros de entrada, la función devolverá una cadena que empezará por Error:
(La primera letra en mayúscula), y que a continuación explicará la causa del error: que falten argumentos, que los argumentos sean incorrectos, etc
Si hay más de un error, es suficiente con que la función indique el primero que detecte.
OPTATIVA: Haz que la función describa todos los errores que puedan presentar los parámetros.
Escribe un fichero ~/at/practica03/buscaArrays.js
que contenga una función que reciba dos argumentos
Un array de arrays. Por ejemplo
[ [ 7, 8 ], [ 10, 12 ] ]
Un elemento. Por ejemplo 8.
La función devolverá un booleano indicando si el elemento está incluido o no en alguno de los arrays de segundo nivel. Como ya sabes, esta función podrá llamar a todas las funciones que necesite.
Para el ejemplo anterior,
El elemento 8 devolvería true.
El elemento 2 devolvería false.
El elemento [7,8] devolvería false. Ya que, aunque es un elemento de la lista de primer nivel, no lo es de una lista de segundo nivel.
La función comprobará que recibe exactamente dos parámetros, que el primero es un array, y que todos sus elementos también son arrays. Lanzará excepciones si corresponde.
Escribe un programa en JavaScript 6 llamado ~/at/practica03/quitaEspacios.js
que tenga una función que reciba una cadena, y que devuelva esa misma cadena, pero reemplazando los espacios por barras bajas (_). Observa que el nombre del programa es quitaEspacios.js
, en notación dromedario.
Si esta función no recibe exactamente un parámetro o ese parámetro no es una cadena, lanzará una excepción.
Escribe en un fichero ~/at/practica03/buscaObjeto.js
un programa en JavaScript que:
Tenga una función que cree y devuelva un plain object. Iniciando sus propiedades a partir de los parámetros de esa función, como los ejemplos siguientes:
crea_alumno(nombre, apellidos, dni, expediente);
crea_coche(marca, modelo, matricula);
crea_asignatura(id, nombre, titulacion, cuatrimestre);
Piensa una función similar a estas, pero no idéntica. Basta con una. Observa que el nombre del programa es buscaObjeto.js
, en notación dromedario, con una mayúscula (solo una) separando las palabras. Como en todos los ficheros de esta asignatura, si lo escribes de otra forma, aunque solo cambie una mayúscula, tu práctica será un no presentado.
Tenga otra función que reciba un array de objetos, y haga alguna búsqueda sobre ellos, devolviendo los que cumplan cierta condición. O la lista vacía si ninguno la cumple. Ejemplo:
A partir de una lista de objetos alumno, devolver una lista con todos los que tengan el dni 01234 (solo deberia ser uno, pero la función no lo tiene en cuenta).
A partir de una lista de coches, devoler todos los de marca Seat.
A partir de una lista de asignaturas, devolver todas las del primer cuatrimestre.
En estos ejemplos, 01234, seat o 1 serían un parámetro de la función de búsqueda, no un valor constante en esa función.
La función puede devolver una lista de los plain objects, enteros, tal cual. O puede devolver un identificador del objeto. Seguramente lo segundo sería preferible en un programa real, puedes hacerlo como te parezca mejor.
Escribe en un fichero ~/at/practica03/buscaCadena.js
un programa en JavaScript que tenga una función que:
Reciba dos parámetros, que serán cadenas. La primera cadena de longitud 1, la segunda de longitud arbitraria (lo que incluye la longitud 1)
Eleve las excepciones adecuadas si los parámetros no cumplen lo especificando en el punto anterior (no son dos, no son cadenas, la primera no es de longitud 1). Utiliza la función que has escrito en la práctica anterior.
Devuelve el número de veces que la primera cadena aparece en la segunda. Ejemplos
Para los parámetros "x", "xyz"
devolvería 1
Para los parámetros "1", "xyz"
devolvería 0
Para los parámetros "a", "ababA"
devolvería 2
Escribe en un fichero ~/at/practica03/valida.js
un programa JavaScript que tenga una función que indique si una contraseña tiene la fortaleza requerida
Recibirá los siguientes parámetros:
La contraseña.
La longitud mínima que deberá tener la contraseña para que se considere válida.
El número mínimo de minúsculas exigidas. Puede ser 0. Por letra minúscula entenderemos todas las letras inglesas minúsculas, mas la eñe minúscula. Las letras con tilde o con diéresis no las consideramos letras a estos efectos.
Ejemplo: si el número mínimo de minúsculas exigido es 2, la cadena ESPAña sería válida. Pero CAñóN no, porque la ó con tilde no se considera en este caso correcta (podría ser un carácter especial si así lo especificara el usuario de la librería)
El número mínimo de mayúsculas. Puede ser 0. Como en el apartado anterior, consideramos letra mayúscula todas las letras inglesas, más la eñe mayúscula. Y no consideramos letra las letras con tilde o con diéreses.
Del mismo modo, si se exigieran por ejemplo al menos 2 mayúsculas, espAÑA sería correcto tendría 3 mayúsculas. Pero ÑandÚ no, porque la Ú no la contaríamos como letra mayúscula.
El número mínimo de dígitos exigidos. (Puede ser 0)
El número mínimo de caracteres especiales exigido. (Puede ser 0)
Una cadena que contendrá todos los caracteres que serán considerados especiales. P.e.
,.-{}[]!"·$%&/()=?¿¡'
Si la contraseña contiene algún carácter especial no incluido en esta lista, se considerará incorrecta.
Si esta cadena que especifica lo que se considera especial contiene números o letras ordinarias, puedes hacer lo que prefieras: comprobarlo o no, dar un error, ignorarlo, considerarlo un carácter especial, etc
Devolverá
La cadena ok, en minúscula, si todos los parámetros son correctos, todos los caracteres de la contraseña son correctos y la contraseña tiene la fortaleza requerida.
En otro caso, una cadena de error. La cadena empezará por Error: (primera con mayúscula), y a continuación describirá el problema: la contraseña no tiene suficientes números, no tiene suficientes minúsculas, tiene un carácter especial no permitido, etc
Observaciones adicionales:
La función debe detectar si el programador que la usa se ha equivocado y alguno de los 7 parámetros es incorrecto
Por no ser del tipo adecuado. Por ejemplo que el programador que usa la librería exija una contraseña con jkrr minúsculas. (Esto no tiene sentido, jkrr es una cadena, no un número)
Por no ser un valor correcto. Por ejemplo negativo, o indefinido.
En estos casos, el programa levantará una excepción.
Observa que en este programa, como en cualquier otro que use las excepciones de forma razonable:
Cuando el usuario se equivoca, cosa bastante frecuente y no especialmente problemática, esta situación se describe en un parámetro de salida. No salta ninguna excepción.
Cuando quien se equivoca es el programador que usa la función, sí es un problema severo, que no debería suceder, y que debe provocar una excepción.
Para el punto 7 tendrás que hacer una función que cuente cuántas veces aparece en la contraseña cada uno de los caracteres de una cadena. Esta misma función te servirá para contar números, usando como cadena 1234567890. También para contar minúsculas, usando como cadena abcdefg... y mayúsculas con ABCDEFG... Reutiliza el código de la práctica anterior.
Sea un conjunto aleatorio de personas. ¿Cuál es la probabilidad de que al menos dos de ellas cumplan años el mismo día? La llamada paradoja del cumpleaños (https://es.wikipedia.org/wiki/Paradoja_del_cumplea%C3%B1os) nos dice que si hay al menos 23 personas, la probabilidad es superior al 50%. Si hay al menos 41, la probabilidad es superior al 90% y si son 57, superior al 99%.
Escribe un programa llamado ~/at/practica03/paradoja.js
que tenga:
Una función que tome como entrada una lista de fechas de cumpleaños, y añada a esa lista una nueva fecha aletoria. Puedes hacerlo de forma destructiva o no destructiva, como prefieras con tal de que funcione correctamente.
Una función que a partir de una lista de fechas de cumpleaños, indique cuántas personas tienen el mismo cumpleaños.
Una función que vaya generando estas listas, de tamaño incremental. Esto es: dos personas, tres, cuatro.... Y que se detenga cuando haya dos con el mismo cumpleaños.
Observaciones:
Naturalmente, puedes usar las funciones adicionales que veas conveniente.
Ignora los años bisiestos.
Aunque las personas indicamos nuestro cumpleaños en formato mes y dia, para este ejercicio es mucho más cómodo que, internamente, las funciones siempre manejen una fecha como un entero entre 1 y 365. Ejemplo: el 1 sería el 1 de enero, el 32 el 1 de febrero y el 365, el 31 de diciembre.
Escribe ejemplos que muestren el funcionamiento de tu código. Pero usando el formato mes y dia. Por tanto, necesitarás una función que apartir de una fecha como dia del año, devuelva mes y día. Esto es algo muy común en cualquier programa: usar cierto formato para el proceso interno, y un formato distinto para presentarlo a las personas. Esta conversión debe hacerse en el último momento, esto es, inmediatamente antes de presentase al usuario. Esta función puedes programarla a partir de lo visto en clase, o simplemente googlear un poco, hay muchos ejemplos en internet. En este caso, asegúrate de comprender bien el código que copias.
Ejecuta ~mortuno/revisa practicas at
para comprobar que los nombres de los programas son los correctos.