jueves, 4 de diciembre de 2014

Curso 2014-15. Logo. Pasar parámetros a primitivas que esperan una lista

Empecé a utilizar MSWLogo para enseñar programación a alumnos de ESO hace solo un par de años. La razón es que los equipos disponibles en las aulas de Tecnología en las que he tenido la oportunidad de dar clase cuentan con pocos recursos (procesador, memoria RAM, etc.) para los estándares del momento de redactar esta entrada. Sin embargo, al no disponer de otros medios, simplemente me adapté y opté por un lenguaje que aparece en diversos libros de texto, sobre todo asociado al uso de controladoras ENCONOR y CNICE.

En las primeras sesiones, tras enseñar a usar el bucle REPITE n [instrucciones], uno de los aspectos más interesantes a la hora de crear nuestros propios procedimientos es la posibilidad de pasar parámetros al código. Eso permite transformar el habitual primer ejemplo de dibujar un cuadrado de un tamaño dado en algo más dinámico, pudiendo pasar el tamaño del lado a un procedimiento CUADRADO redefinido y al que llamaré CUADRADOL :lado. Veamos el código de ambos procedimientos:



Procedimiento CUADRADO
Procedimiento CUADRADOL :lado
para cuadrado
repite 4 [ av 60 gd 90]
fin
para cuadradol :lado
repite 4 [ av :lado gd 90]
fin
Construcción de un cuadrado de lado 60 con el procedimiento CUADRADO
Construcción de un cuadrado de lado 150 con el procedimiento CUADRADOL :lado


Cuando quise extender esta idea a otras primitivas, como la que define el grosor del cursor usando una lista de parámetros entre corchetes, me tropecé con una dificultad. PONGROSOR [tamaño] se debe escribir poniendo números entre corchetes, si los sustituyes por variables no funciona.

Ejemplo:
pongrosor [10 10] ; Establece el grosor del lápiz en 10, el valor por defecto es 1
pongrosor [:g :g] ; Da error

Este mismo problema  surge con otras primitivas como PONCOLORRELLENO [rojo verde azul] o PONPOS [posición]. Revisé el manual que estaba usando: "Manual MSWLOGO abreviado 0809 con hipervínculos.pdf" y busqué en Internet sin éxito otras referencias en las que simplemente no me dijeran que sustituir los números por variables no estaba permitido.
Al final, decidí analizar el problema con más detenimiento y me dí cuenta de que lo que diferenciaba la forma de pasar parámetros a estas primitivas de las otras que ya conocía, era la existencia de los corchetes que los delimitaban. Mirando en la referencia del lenguaje, se puede ver que las listas emplean la misma sintaxis, encerrando entre corchetes los elementos que las forman. Entonces probé a construir una lista y pasarla directamente como parámetro a PONGROSOR y ¡Eureka! ¡Funciona!

Ejemplo:
El siguiente procedimiento recibe como parámetro el grosor de la línea. Los paréntesis que rodean a la primitiva LISTA son opcionales, se han escrito para distinguir con mayor claridad lo que se pasa como parámetros a PONGROSOR.
para cuadradog :grosor
    bp
    pongrosor (lista :grosor :grosor)
    repite 4 [av 100 gd 90]
fin



domingo, 9 de noviembre de 2014

Curso 2014-15. Ejercicios sencillos de programación

En esta entrada solo voy a poner el enunciado de los ejercicios que se van a hacer en clase usando PSeInt. Para tener más información y ver cómo se ha trabajado la asignatura en cursos pasados conviene que uséis los siguientes enlaces:
También tenéis información muy completa y más detallada en el blog de Tecnologías de 3º. Hay muchos ejemplos resueltos, por lo que os recomiendo que empecéis por aquí:
Y por fin los enunciados de los programas que tenéis que escribir para practicar:
  • Programa que lee un número del teclado e indica si es par o impar
    • Modificación. El programa debe indicar también si el número es cero
    • Modificación. El programa debe indicar si el número es positivo o negativo
  • Programa que lee dos números del teclado e imprime el mayor de ellos
    • Modificación. El programa debe indicar si se ha introducido el mismo número las dos veces
  • Programa que lee tres números del teclado e imprime el mayor de ellos
  • Programa que lee tres números del teclado, los ordena y los imprime de mayor a menor
  • Programa que lee un número por teclado y calcula la suma de todos los números desde 0 hasta ese número (incluyéndolo)
    • Pregunta. ¿Qué número hay que teclear para que el programa de un error por desbordamiento?
    • Modificación. El programa debe admitir números negativos y hacer la suma con la correspondiente modificación
    • Pregunta. En el caso del programa modificado, ¿coincide el número que hace que el programa dé un error?
  • Programa que lee dos números por teclado y calcula la suma de todos los números desde el primero al segundo, incluyendo a ambos en el resultado final
  • Programa que calcule el factorial de un número
  • Programa para calcular las raíces de una ecuación de 2º grado
    •  Modificación. El programa no debe dar error si las raíces son imaginarias, sino que debe indicarlo y calcular el resultado correspondiente
  • Programa que lee caracteres del teclado, los muestra por pantalla y se detiene al pulsar la letra Q
  • Programa que lee números por teclado y calcula su media aritmética. El programa debe parar al teclear el cero. En la pantalla deben aparecer los siguientes datos: suma acumulada, número de datos introducido y media aritmética.

lunes, 29 de septiembre de 2014

Curso 2014-15. Sistemas de numeración en electrónica digital e informática (I)

Los sistemas que se emplean en informática y electrónica digital son: binario, octal, decimal y hexadecimal. Cada uno de estos sistemas está basado respectivamente en la base 2, base 8, base 10 y base 16. Todos son sistemas de numeración posicionales, lo que quiere decir que la posición que ocupa un dígito determina su valor.
Las posiciones incrementan su valor a partir de la coma decimal siguiendo una sencilla pauta. Veamos un ejemplo con nuestro familiar sistema decimal:

En base 10 las posiciones tienen los siguientes valores:


Nombre
Centenas de millar
Decenas de millar
Unidades de millar
Centenas
Decenas
Unidades
Potencia
105
104
103
102
101
100
Valor
100000
10000
1000
100
10
1







Ejemplo
1
2
0
4
9
8

El valor que representa el número se calcula multiplicando cada dígito por el valor que corresponde a su posición:
1·105+2·104+0·103+4·102+9·101+8·100=
=1·100000+2·10000+0·1000+4·100+9·10+8·1=
=120498

Cualquier valor se puede representar en cualquier base de numeración y, por tanto, se puede convertir a cualquiera de las otras bases. Esto incluye números reales con la coma separando la parte entera de la parte decimal. También es posible realizar las conocidas operaciones aritméticas en cualquiera de la bases: suma, diferencia, producto y división. La única condición es que los operandos deben estar todos en la misma base.


Si nos fijamos, en base 10, los dígitos que empleamos para componer una cantidad son 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Para representar el 10 necesitamos usar dos dígitos: el 1 y el 0.
En binario, base 2, solo disponemos de dos valores para representar cantidades, 0 y 1. Para representar el 2 en base 2 se emplean dos dígitos: 10. ¿Cómo funciona el cálculo de su valor? Pues igual que en cualquier sistema posicional, solo que ahora la base es 2. Veamos un ejemplo:

Nombre
No hay un nombre aceptado universalmente
Potencia
25
24
23
22
21
20
Valor decimal equivalente
32
16
8
4
2
1







Ejemplo
1
0
1
0
1
1

El valor que representa el número se calcula multiplicando cada dígito por el valor que corresponde a su posición:
1·25+0·24+1·23+0·22+1·21+1·20=
=1·32+0·16+1·8+0·4+1·2+1·1=
=43


Las otras dos bases de numeración que tenemos que ver funcionan exactamente igual. En base 8 los dígitos que podemos usar para representar cantidades son 0, 1, 2, 3, 4, 5, 6 y 7. En base 16 tenemos que añadir seis símbolos individuales para representar las cantidades entre 10 y 15. ¿Cómo lo resolvemos? Usando las letras A, B, C, D, E y F.


Veamos en una tabla las equivalencias entre los distintos sistemas de numeración para los números entre 0 y 31. He colocado las bases de numeración ordenadas por frecuencia de uso:



Decimal
Binario
Hexadecimal
Octal
0
0
0
0
1
1
1
1
2
10
2
2
3
11
3
3
4
100
4
4
5
101
5
5
6
110
6
6
7
111
7
7
8
1000
8
10
9
1001
9
11
10
1010
A
12
11
1011
B
13
12
1100
C
14
13
1101
D
15
14
1110
E
16
15
1111
F
17
16
10000
10
20
17
10001
11
21
18
10010
12
22
19
10011
13
23
20
10100
14
24
21
10101
15
25
22
10110
16
26
23
10111
17
27
24
11000
18
30
25
11001
19
31
26
11010
1A
32
27
11011
1B
33
28
11100
1C
34
29
11101
1D
35
30
11110
1E
36
31
11111
1F
37