educación, informática y demás

Ejercicios 20.02

Ejercicio 04

Crea un script llamado tabla.bat que recibirá por parámetro un número. Deberá calcular y mostrar la tabla de multiplicar del número pasado por parámetro.

Si no se pasa ningún valor por parámetro, se dará un mensaje de error y terminará la ejecución del script.

Solución

Para solucionar el problema planteado por el script tenemos que utilizar una función extra del interprete de comandos, habilitar la expansión retardada de variables y usarla.

La solución tiene buena pinta desde el punto de vista de algoritmos. En la línea 12, recorremos con un for los números del 1 al 10 con incrementos de 1 unidad utilizando el modificador /L del comando FOR. Esta información la tenemos disponible en la ayuda del comando for (help for).

Utilizamos un paréntesis para poder ejecutar varios comandos en cada vuelta o iteración del bucle for. En cada vuelta, la variable %%i tomará el valor i-esimo entre 1 y 10, con incrementos de 1 unidad.

Dentro del cuerpo del comando FOR, lo que hacemos es calcular el valor actual de la tabla de multiplicar y lo almacenamos en una variable llamada valor. Después mostramos la multiplicación y el valor correspondiente.

Si analizamos el código tiene pinta de funcionar correctamente. Sin embargo, no funcionará como esperamos.

Algo falla, sin embargo, después de analizarlo de nuevo, no tiene pinta de ser el algoritmo que hemos creado. Entonces, ¿cuál es el problema?.

Tiene pinta de algún tipo de comportamiento «anómalo». En este tipo de casos, deberíamos leer detenidamente la ayuda del comando o comandos implicados. Si nos fijamos, lo más probable es que el comando que no esté haciendo lo que esperamos sea el comando set. Así que leemos la ayuda.

Ahí está la explicación de porqué no hace lo que esperamos, por la expansión de las variables en la consola de comandos. Por defecto, la consola de comandos tiene deshabilitada la expansión retardada de variables. Esto significa que, si en un comando se expando o sustituye una variable por su valor, este valor se sustituirá en todo el comando por ese valor. Es decir, la primera vez que aparece se sustituye por el valor que tenga en ese momento, tanto en ese punto, como en todos los puntos en los que aparezca.

De esta forma, valor toma el valor 1 y, aunque dentro del cuerpo del bucle le asignemos otro valor, cuando se ejecuta el bucle for por primera vez, el interprete de comandos expande el valor de %valor% por su valor en el momento de ejecutar el bucle. Esta expansión temprana o actual, haría que nuestro bucle quedara como se muestra a continuación.

Si nos fijamos, se sustituye el valor de numero por el valor pasado por parámetro, en este caso un 4, y valor por el 1 que se le ha asignado.