Calcular nota final de unidad y laboratorio - Ejercicio resuelto con JavaScript

JavaScript: calcular nota de estudiante con formulario (ejercicio resuelto)

Hoy vamos a resolver un ejercicio con JavaScript, HTML y CSS. La solicitud dice así:

Diseñar y desarrollar un formulario para calcular la nota de la unidad de una asignatura.El usuario debe enviar los datos mediante un formulario en HTML

 

Por medio de JavaScript procesar los datos recibidos y enviarlos a otra página donde debe imprimir el nombre del estudiante, el nombre de la asignatura y las notas obtenidas y el calculo de la nota del laboratorio, de la nota del parcial y de la unidad.

Evitar que el formulario se envíe si hay uno o más campos vacíos.

Calcular nota final de unidad y laboratorio - Ejercicio resuelto con JavaScript
Calcular nota final de unidad y laboratorio – Ejercicio resuelto con JavaScript

Si hay notas menores a 0.0 y/o mayores a 10.0 evitar que el formulario se envíe y mandar un alert al usuario para que corrija los datos.

  • Aplicar diseño mediante boostrap en css
  • Los datos deben solicitarse en una página e imprimirse en otra
  • Usar el session storage.

Datos a solicitar:

  1. Nombre del estudiante
  2. Carnet del Estudiante
  3. Nombre de la asignatura
  4. Nota del taller 1
  5. Nota del taller 2
  6. Nota del parcial

Datos a imprimir:

  1. Nombre del estudiante
  2. Carnet del Estudiante
  3. Nombre de la asignatura
  4. Nota del taller 1
  5. Nota del taller 2
  6. Nota final del laboratorio
  7. Nota del parcial
  8. Nota final de la unidad

Porcentajes a tomar en cuenta:

La nota de la unidad se divide en:

  • 40% laboratorio
  • 60% parcial

El laboratorio es el promedio de la nota de dos talleres

  • 50% taller 1
  • 50% taller 2

Veamos entonces la solución a este ejercicio propuesto de programación con JavaScript.

Solución del ejercicio

Primero veamos el formulario, es un simple formulario con varios input. No tiene action pero tiene un id que vamos a usar para obtener una referencia al mismo desde JavaScript:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Calcular nota de la unidad</title>
	<link href="./bootstrap.min.css" rel="stylesheet">
</head>

<body>
	<div class="container">
		<div class="row align-items-start">
			<form action="" id="formulario">
				<div class="col">
					<div class="mb-3">
						<label for="nombreEstudiante" class="form-label">Nombre:</label>
						<input type="text" class="form-control" id="nombreEstudiante"
							placeholder="Nombre del estudiante">
					</div>
					<div class="mb-3">
						<label for="carnetEstudiante" class="form-label">Carnet:</label>
						<input type="text" class="form-control" id="carnetEstudiante"
							placeholder="Carnet del estudiante">
					</div>
					<div class="mb-3">
						<label for="nombreAsignatura" class="form-label">Asignatura:</label>
						<input type="text" class="form-control" id="nombreAsignatura"
							placeholder="Nombre de la asignatura">
					</div>
					<div class="row">
						<div class="col">
							<div class="mb-3">
								<label for="notaTaller1" class="form-label">Nota del taller 1:</label>
								<input step="0.01" type="number" class="form-control" id="notaTaller1"
									placeholder="Nota del taller 1">
							</div>
						</div>
						<div class="col">
							<div class="mb-3">
								<label for="notaTaller2" class="form-label">Nota del taller 2:</label>
								<input step="0.01" type="number" class="form-control" id="notaTaller2"
									placeholder="Nota del taller 2">
							</div>
						</div>
						<div class="col">
							<div class="mb-3">
								<label for="notaParcial" class="form-label">Nota del parcial:</label>
								<input step="0.01" type="number" class="form-control" id="notaParcial"
									placeholder="Nota del parcial">
							</div>
						</div>
					</div>
					<button class="btn btn-success">Calcular</button>
				</div>
			</form>
		</div>

	</div>
	<script src="enviar.js"></script>
</body>

</html>

Por cierto, el formulario no tiene validaciones (ninguno dice required ni min o max) pues lo vamos a validar desde JavaScript con enviar.js.

Manejar envío de formulario

Desde JavaScript vamos a cancelar el evento del envío del formulario con preventDefault, luego vamos a recorrer los elementos del formulario, comprobar si son input y ver si todos están llenos.

Luego de comprobar que todos tienen valor, obtenemos los elementos de tipo numérico para validar que el valor está entre 0 y 10.

document.addEventListener("DOMContentLoaded", () => {
	const $formulario = document.querySelector("#formulario");
	const $notaTaller1 = document.querySelector("#notaTaller1"),
		$notaTaller2 = document.querySelector("#notaTaller2"),
		$notaParcial = document.querySelector("#notaParcial");
	$formulario.onsubmit = function (evento) {
		// Prevenir envío de formulario
		evento.preventDefault();
		// Recorrer elementos input y si alguno está vacío detenernos
		const elementos = $formulario.elements;
		for (const elemento of elementos) {
			if (elemento.tagName === "INPUT" && elemento.value === "") {
				return;
			}
		}

		// Hasta aquí todos los campos están llenos
		for (const $nota of [$notaTaller1, $notaTaller2, $notaParcial]) {
			const valor = parseFloat($nota.value);
			if (valor < 0 || valor > 10) {
				return alert(`El valor de ${$nota.placeholder} debe estar entre 0 y 10`);
			}
		}

		// Hasta aquí las notas son correctas
		const datos = {};
		for (const elemento of elementos) {
			if (elemento.tagName === "INPUT") {
				let valor = elemento.value;
				if (elemento.type === "number") {
					valor = parseFloat(elemento.value);
				}
				datos[elemento.id] = valor;
			}
		}
		sessionStorage.setItem("datosEstudiante", JSON.stringify(datos));
		window.location.href = "./imprimir.html";
	}
});

Finalmente creamos un diccionario vacío, recorremos el formulario de nuevo y vamos agregando los valores del formulario a un objeto que luego codificamos como JSON. Después de eso guardamos el JSON en sessionStorage y redireccionamos.

Es importante notar que la clave del diccionario será el id del input y su valor la propiedad value. Además, si el elemento es numérico su valor se convierte a flotante con parseFloat.

Lo he hecho de esta manera para que si se agregan más campos todo funcione de la misma manera y se siga guardando sin agregar más código.

Nos vemos en imprimir.html.

Imprimiendo valores

Ahora en la siguiente página debemos mostrar los valores. Recuerda que en realidad no enviamos el formulario, solo lo guardamos en sessionStorage y ahora lo vamos a recuperar para mostrar los datos.

Todos los datos se van a mostrar en un párrafo o encabezado, mismos que vamos a recuperar a través del ID:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Imprimir datos</title>

	<link href="./bootstrap.min.css" rel="stylesheet">
</head>

<body>
	<div class="container">
		<div class="row">
			<div class="col">
				<h2>Resultados</h2>
				<table class="table table-bordered">
					<tbody>
						<tr>
							<td><strong>Nombre</strong></td>
							<td colspan="2">
								<p id="nombreEstudiante"></p>
							</td>
						</tr>
						<tr>
							<td><strong>Carnet</strong></td>
							<td colspan="2">
								<p id="carnetEstudiante"></p>
							</td>
						</tr>
						<tr>
							<td><strong>Asignatura</strong></td>
							<td colspan="2">
								<p id="nombreAsignatura"></p>
							</td>
						</tr>
						<tr>
							<td><strong>Nota del taller 1</strong></td>
							<td><strong>Nota del taller 1</strong></td>
							<td><strong>Nota final de laboratorio</strong></td>
						</tr>
						<tr>
							<td>
								<p id="notaTaller1"></p>
							</td>
							<td>
								<p id="notaTaller2"></p>
							</td>
							<td>
								<p id="notaLaboratorio"></p>
							</td>
						</tr>
						<tr>
							<td><strong>Nota del parcial</strong></td>
							<td colspan="2">
								<p id="notaParcial"></p>
							</td>
						</tr>
						<tr>
							<td><strong>Nota final de la unidad</strong></td>
							<td colspan="2">
								<h3 id="notaFinal"></h3>
							</td>
						</tr>
					</tbody>
				</table>
				<button onclick="javascript:window.history.back();" class="btn btn-success">Volver al formulario</button>
			</div>
		</div>
	</div>

	<script src="imprimir.js"></script>
</body>

</html>

Todo está en una tabla pero los elementos que muestran la información son un header o un párrafo.

Luego desde JavaScript recuperamos el valor, calculamos y mostramos resultados:

document.addEventListener("DOMContentLoaded", () => {
	const datosEstudianteCodificados = sessionStorage.getItem("datosEstudiante");
	// No hay datos
	if (!datosEstudianteCodificados) {
		return alert("No hay datos guardados. Asegúrate de enviar el formulario");
	}
	const datosEstudiante = JSON.parse(datosEstudianteCodificados);
	const notaLaboratorio = (datosEstudiante.notaTaller1 + datosEstudiante.notaTaller2) / 2;
	const notaUnidad = (notaLaboratorio * 4 / 10) + (datosEstudiante.notaParcial * 6 / 10);
	document.querySelector("#nombreEstudiante").textContent = datosEstudiante.nombreEstudiante;
	document.querySelector("#carnetEstudiante").textContent = datosEstudiante.carnetEstudiante;
	document.querySelector("#nombreAsignatura").textContent = datosEstudiante.nombreAsignatura;
	document.querySelector("#notaTaller1").textContent = datosEstudiante.notaTaller1;
	document.querySelector("#notaTaller2").textContent = datosEstudiante.notaTaller2;
	document.querySelector("#notaParcial").textContent = datosEstudiante.notaParcial;
	document.querySelector("#notaLaboratorio").textContent = notaLaboratorio;
	document.querySelector("#notaFinal").textContent = notaUnidad;
});

Conclusión

Lo único que no coloqué fue el código de Bootstrap. Ese lo obtienes de getbootstrap.com o de cualquier otro lugar, además no afecta en el desarrollo del ejercicio.

Solo para que quede claro, la versión que yo utilicé fue Bootstrap v5.2.2.

Por aquí te dejo más tutoriales de JavaScript en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *