Dos ejercicios con todo lo visto hasta ahora: variables, operadores, texto,
if, match y ??. Son del estilo de la prueba: un archivo .php que se ejecuta en
la terminal con php archivo.php y tiene que imprimir exactamente la salida
indicada.
Cómo trabajarlos
Resuelve cada uno antes de abrir la solución. Cuando funcione con los valores del enunciado, cambia las variables y prueba los otros casos: un programa que solo funciona con un ejemplo no está terminado.
Ejercicio 1. Valor de la entrada
Un cine calcula el valor de una entrada con tres variables:
<?php
$edad = 20;
$esEstudiante = true;
$dia = 3; // 1 = lunes … 7 = domingoLas reglas:
| Caso | Precio |
|---|---|
| Menor de 12 años o de 65 años o más | $3.000 |
| Estudiante (y no está en el caso anterior) | $3.500 |
| Cualquier otra persona | $5.500 |
- Los miércoles se descuenta un 20% del precio.
- Si la edad es menor que 0 o mayor que 120, el programa imprime solo
Edad no válida. - Los montos se muestran con punto de miles:
$5.500.
Salida con los valores de arriba:
Precio base: $3.500
Descuento de miércoles: $700
Total: $2.800Con $edad = 70, $esEstudiante = true y $dia = 5 (la línea del descuento no
aparece):
Precio base: $3.000
Total: $3.000Pista
Una persona de 70 años que además es estudiante paga $3.000, no $3.500. Piensa en qué orden van las condiciones, como en el orden de las condiciones.
Solución
<?php $edad = 20; $esEstudiante = true; $dia = 3; if ($edad < 0 || $edad > 120) { echo "Edad no válida\n"; } else { if ($edad < 12 || $edad >= 65) { $precio = 3000; } elseif ($esEstudiante) { $precio = 3500; } else { $precio = 5500; } $descuento = 0; if ($dia === 3) { $descuento = intdiv($precio * 20, 100); } $total = $precio - $descuento; echo "Precio base: $" . number_format($precio, 0, ",", ".") . "\n"; if ($descuento > 0) { echo "Descuento de miércoles: $" . number_format($descuento, 0, ",", ".") . "\n"; } echo "Total: $" . number_format($total, 0, ",", ".") . "\n"; }
- La edad se revisa primero: si no es válida, no tiene sentido calcular nada.
- El caso de edad va antes que el de estudiante, porque es el más barato.
$descuentoparte en 0, así el total se calcula igual con o sin descuento.- Los precios son enteros:
intdivevita que aparezcan decimales.
Ejercicio 2. Ficha de notas
Con estas variables:
<?php
$nombre = null;
$nota1 = 5.5;
$nota2 = 4.8;
$nota3 = 5.4;
$asistencia = 70; // porcentajeEl programa imprime la ficha del estudiante:
- Si
$nombreno tiene valor, se muestraSin nombre. - El promedio de las tres notas, redondeado a un decimal y con coma.
- El concepto según el promedio:
Excelente(6,0 o más),Bueno(5,0 o más),Suficiente(4,0 o más) oInsuficiente. - La situación:
Aprobadosi el promedio es 4,0 o más y la asistencia es 75 o más.Reprobado por asistenciasi el promedio alcanza pero la asistencia no.Reprobado por notaen cualquier otro caso.
- Si alguna nota es menor que 1,0 o mayor que 7,0, imprime solo
Hay una nota fuera de rango.
Salida con los valores de arriba:
Estudiante: Sin nombre
Promedio: 5,2 (Bueno)
Situación: Reprobado por asistenciaCon $nombre = "Camila", notas 6.5, 6.0 y 6.2, y asistencia 90:
Estudiante: Camila
Promedio: 6,2 (Excelente)
Situación: AprobadoSolución
<?php $nombre = null; $nota1 = 5.5; $nota2 = 4.8; $nota3 = 5.4; $asistencia = 70; $nombre ??= "Sin nombre"; if ($nota1 < 1.0 || $nota1 > 7.0 || $nota2 < 1.0 || $nota2 > 7.0 || $nota3 < 1.0 || $nota3 > 7.0) { echo "Hay una nota fuera de rango\n"; } else { $promedio = round(($nota1 + $nota2 + $nota3) / 3, 1); $concepto = match (true) { $promedio >= 6.0 => "Excelente", $promedio >= 5.0 => "Bueno", $promedio >= 4.0 => "Suficiente", default => "Insuficiente", }; if ($promedio >= 4.0 && $asistencia >= 75) { $situacion = "Aprobado"; } elseif ($promedio >= 4.0) { $situacion = "Reprobado por asistencia"; } else { $situacion = "Reprobado por nota"; } echo "Estudiante: $nombre\n"; echo "Promedio: " . number_format($promedio, 1, ",", ".") . " ($concepto)\n"; echo "Situación: $situacion\n"; }
??=le da valor a$nombresolo si eranull.- Los paréntesis en
($nota1 + $nota2 + $nota3) / 3son obligatorios: sin ellos solo se divide la tercera nota.- Se redondea antes de elegir el concepto, para que el concepto calce con el número que se muestra.
- El concepto es un valor por cada rango:
match (true). La situación combina dos variables:if/elseif.
Errores comunes
| Síntoma | Causa | Solución |
|---|---|---|
| Una persona de 70 años que es estudiante paga $3.500 | La condición de estudiante va antes que la de edad | Ordena del caso más específico al más general |
| El promedio de 5,5, 4,8 y 5,4 da 12,1 | Faltan los paréntesis: solo se dividió la última nota | ($nota1 + $nota2 + $nota3) / 3 |
Promedio: 5.2 en vez de 5,2 | Se imprimió el número sin formato | number_format($promedio, 1, ",", ".") |
Warning: Undefined variable $precio | El $precio se creó dentro de un if que no se ejecutó | Revisa que todos los caminos le den valor, o dale uno antes |