Ejercicios (sin formularios) - if ... elseif ... else ... (1) - Soluciones

En esta página se muestran una parte de las soluciones de los ejercicios if .. elseif ... else ..., concretamente el fragmento PHP, sin el principio ni el final de la página que se puede dejar en un fragmento HTML. La solución completa se puede descargar de la página de soluciones.

if ... elseif ... else ... (1) 1 - Dos dados

<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);

print "  <p>\n";
print "    <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">\n";
print "    <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">\n";
print "  </p>\n";
print "\n";

if ($dado1 == $dado2) {
    print "  <p>Ha sacado una pareja de $dado1.</p>\n";
} else {
    print "  <p>No ha sacado pareja. El valor más alto es " . max($dado1, $dado2) . ".</p>\n";
}
?>

if ... elseif ... else ... (1) 2 - Juego: Dado más alto

<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);

print "        <td style=\"padding: 10px; background-color: red;\">";
print "          <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">";
print "        </td>\n";
print "        <td style=\"padding: 10px; background-color: blue;\">";
print "          <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">";
print "        </td>\n";

if ($dado1 > $dado2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($dado1 < $dado2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} else {
    print "        <td>Han empatado</td>\n";
}
?>

if ... elseif ... else ... (1) 3 - Juego: Dos dados más altos

Probablemente, la forma de resolver este ejercicio que primero viene a la cabeza es la siguiente, en la que compara sucesivamente:

<?php
$dado1a = rand(1, 6);
$dado1b = rand(1, 6);
$dado2a = rand(1, 6);
$dado2b = rand(1, 6);

print "        <td style=\"padding: 10px; background-color: red;\">\n";
print "          <img src=\"img/$dado1a.svg\" alt=\"$dado1a\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado1b.svg\" alt=\"$dado1b\" width=\"140\" height=\"140\">\n";
print "        </td>\n";
print "        <td style=\"padding: 10px; background-color: blue;\">\n";
print "          <img src=\"img/$dado2a.svg\" alt=\"$dado2a\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado2b.svg\" alt=\"$dado2b\" width=\"140\" height=\"140\">\n";
print "        </td>\n";

$total1 = $dado1a + $dado1b;
$total2 = $dado2a + $dado2b;

if ($dado1a == $dado1b && $dado2a == $dado2b) {
    if ($dado1a > $dado2a) {
        print "        <td>Ha ganado el jugador 1</td>\n";
    } elseif ($dado1a < $dado2a) {
        print "        <td>Ha ganado el jugador 2</td>\n";
    } else {
        print "        <td>Han empatado</td>\n";
    }
} elseif ($dado1a == $dado1b) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($dado2a == $dado2b) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} elseif ($total1 > $total2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($total1 < $total2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} else {
    print "        <td>Han empatado</td>\n";
}
?>

Otra forma de enfocar el ejercicio que será más útil cuando en posteriores ejercicios aumente el número de dados consiste en calcular unas variables intermedias que guarden la información sobre la pareja de dados obtenida por cada jugador. Esta variable valdrá 0 si el jugador no ha sacado pareja y valdrá el valor de la pareja si sí que ha sacado pareja.

<?php
$dado1a = rand(1, 6);
$dado1b = rand(1, 6);
$dado2a = rand(1, 6);
$dado2b = rand(1, 6);

print "        <td style=\"padding: 10px; background-color: red;\">\n";
print "          <img src=\"img/$dado1a.svg\" alt=\"$dado1a\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado1b.svg\" alt=\"$dado1b\" width=\"140\" height=\"140\">\n";
print "        </td>\n";
print "        <td style=\"padding: 10px; background-color: blue;\">\n";
print "          <img src=\"img/$dado2a.svg\" alt=\"$dado2a\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado2b.svg\" alt=\"$dado2b\" width=\"140\" height=\"140\">\n";
print "        </td>\n";

if ($dado1a == $dado1b) {
    $pareja1 = $dado1a;
} else {
    $pareja1 = 0;
}

if ($dado2a == $dado2b) {
    $pareja2 = $dado2a;
} else {
    $pareja2 = 0;
}

$total1 = $dado1a + $dado1b;
$total2 = $dado2a + $dado2b;

if ($pareja1 > $pareja2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($pareja1 < $pareja2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} else {
    if ($total1 > $total2) {
        print "        <td>Ha ganado el jugador 1</td>\n";
    } elseif ($total1 < $total2) {
        print "        <td>Ha ganado el jugador 2</td>\n";
    } else {
        print "        <td>Han empatado</td>\n";
    }
}
?>

El programa se podría simplificar utilizando la notación abreviada ... ? ... : ... y eliminado el anidamiento en el bloque if ... elseif ... else ...:

$pareja1 = ($dado1a == $dado1b) ? $dado1a : 0;
$pareja2 = ($dado2a == $dado2b) ? $dado2a : 0;

$total1 = $dado1a + $dado1b;
$total2 = $dado2a + $dado2b;

if ($pareja1 > $pareja2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($pareja1 < $pareja2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} elseif ($total1 > $total2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($total1 < $total2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} else {
    print "        <td>Han empatado</td>\n";
}

if ... elseif ... else ... (1) 4 - Tres dados

<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);
$dado3 = rand(1, 6);

print "  <p>\n";
print "    <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">\n";
print "    <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">\n";
print "    <img src=\"img/$dado3.svg\" alt=\"$dado3\" width=\"140\" height=\"140\">\n";
print "  </p>\n";
print "\n";

if ($dado1 == $dado2 && $dado1 == $dado3) {
    print "  <p>Ha sacado un trío de $dado1.</p>\n";
} elseif ($dado1 == $dado2 || $dado1 == $dado3) {
    print "  <p>Ha sacado una pareja de $dado1.</p>\n";
} elseif ($dado2 == $dado3) {
    print "  <p>Ha sacado una pareja de $dado2.</p>\n";
} else {
    print "  <p>El valor más alto es " . max($dado1, $dado2, $dado3) . ".</p>\n";
}
?>

if ... elseif ... else ... (1) 5 - Juego: Tres dados más altos

La solución propuesta calcula unas variables intermedias que guardan la información sobre el trío o la pareja de dados obtenida por cada jugador. La variable que guarda el trío valdrá 0 si el jugador no ha sacado trío y valdrá el valor del trío si sí que ha sacado trío. La variable que guarda la pareja valdrá 0 si el jugador no ha sacado pareja y valdrá el valor de la pareja si sí que ha sacado pareja.

<?php
$dado1a = rand(1, 6);
$dado1b = rand(1, 6);
$dado1c = rand(1, 6);
$dado2a = rand(1, 6);
$dado2b = rand(1, 6);
$dado2c = rand(1, 6);

print "        <td style=\"padding: 10px; background-color: red;\">\n";
print "          <img src=\"img/$dado1a.svg\" alt=\"$dado1a\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado1b.svg\" alt=\"$dado1b\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado1c.svg\" alt=\"$dado1c\" width=\"140\" height=\"140\">\n";
print "        </td>\n";
print "        <td style=\"padding: 10px; background-color: blue;\">\n";
print "          <img src=\"img/$dado2a.svg\" alt=\"$dado2a\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado2b.svg\" alt=\"$dado2b\" width=\"140\" height=\"140\">\n";
print "          <img src=\"img/$dado2c.svg\" alt=\"$dado2c\" width=\"140\" height=\"140\">\n";
print "        </td>\n";

if ($dado1a == $dado1b && $dado1a == $dado1c) {
    $trio1 = $dado1a;
} else {
    $trio1 = 0;
}

if ($dado2a == $dado2b && $dado2a == $dado2c) {
    $trio2 = $dado2a;
} else {
    $trio2 = 0;
}

if ($dado1a == $dado1b || $dado1a == $dado1c) {
    $pareja1 = $dado1a;
} elseif ($dado1b == $dado1c) {
    $pareja1 = $dado1b;
} else {
    $pareja1 = 0;
}

if ($dado2a == $dado2b || $dado2a == $dado2c) {
    $pareja2 = $dado2a;
} elseif ($dado2b == $dado2c) {
    $pareja2 = $dado2b;
} else {
    $pareja2 = 0;
}

$total1 = $dado1a + $dado1b + $dado1c;

$total2 = $dado2a + $dado2b + $dado2c;

// print "<p>1: Trío $trio1 - Pareja $pareja1 - Total: $total1</p>\n";
// print "<p>2: Trío $trio2 - Pareja $pareja2 - Total: $total2</p>\n";

if ($trio1 > $trio2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($trio1 < $trio2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} else {
    if ($pareja1 > $pareja2) {
        print "        <td>Ha ganado el jugador 1</td>\n";
    } elseif ($pareja1 < $pareja2) {
        print "        <td>Ha ganado el jugador 2</td>\n";
    } else {
        if ($total1 > $total2) {
            print "        <td>Ha ganado el jugador 1</td>\n";
        } elseif ($total1 < $total2) {
            print "        <td>Ha ganado el jugador 2</td>\n";
        } else {
            print "        <td>Han empatado</td>\n";
        }
    }
}
?>

Como en el ejercicio 3, el programa se podría simplificar utilizando la notación abreviada ... ? ... : ... (que en el caso de la pareja se podría anidar) y eliminado el anidamiento en el bloque if ... elseif ... else ...:

$trio1 = ($dado1a == $dado1b && $dado1a == $dado1c) ? $dado1a : 0;
$trio2 = ($dado2a == $dado2b && $dado2a == $dado2c) ? $dado2a : 0;

$pareja1 = ($dado1a == $dado1b || $dado1a == $dado1c) ? $dado1a : (($dado1b == $dado1c) ? $dado1b : 0);
$pareja2 = ($dado2a == $dado2b || $dado2a == $dado2c) ? $dado2a : (($dado2b == $dado2c) ? $dado2b : 0);

$total1 = $dado1a + $dado1b + $dado1c;
$total2 = $dado2a + $dado2b + $dado2c;

if ($trio1 > $trio2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($trio1 < $trio2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} elseif ($pareja1 > $pareja2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($pareja1 < $pareja2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} elseif ($total1 > $total2) {
    print "        <td>Ha ganado el jugador 1</td>\n";
} elseif ($total1 < $total2) {
    print "        <td>Ha ganado el jugador 2</td>\n";
} else {
    print "        <td>Han empatado</td>\n";
}