Anteriormente, hemos hablado de cómo Cuis-Smalltalk reconoce los números racionales. Las cuatro operaciones aritméticas y las funciones matemáticas se implementan con mensajes unarios y binarios que comprenden los números racionales:
(15 / 14) * (21 / 5) ⇒ 9 / 2 (15 / 14) / ( 5 / 21) ⇒ 9 /2 (3 / 4) squared ⇒ 9 / 16 (25 / 4) sqrt ⇒ 5 / 2
Escribe el código para calcular la suma de los cuadrados de los inversos de los cuatro primeros números enteros.
Ejercicio 2.2: Suma de los cuadrados
Si la división entera de Cuis-Smalltalk devuelve un número racional, ¿cómo podemos obtener el resultado en decimal? Una opción es escribir el número como un literal de punto flotante, un Float. Este tipo de literal se escribe con la parte entera y la parte fraccionaria separadas por un punto «.»:
15.0 / 4 ⇒ 3.75 15 / 4.0 ⇒ 3.75
Otra opción es convertir un entero en un float con el mensaje
#asFloat. Es muy útil cuando el entero está en una variable:
15 asFloat / 4 ⇒ 3.75
También puedes pedir una división truncada para obtener un entero
utilizando el mensaje #//:
15 // 4 ⇒ 3
El resto de la división euclideana se calcula con el mensaje
#\\:
15 \\ 4 ⇒ 3
Cuis-Smalltalk tiene operaciones aritméticas para comprobar si un número entero es impar, par, primo o divisible por otro. Solo tienes que enviar el mensaje unario o la palabra clave adecuada al número:
25 odd ⇒ true 25 even ⇒ false 25 isPrime ⇒ false 23 isPrime ⇒ true 91 isDivisibleBy: 7 ⇒ true 117 isDivisibleBy: 7 ⇒ false 117 isDivisibleBy: 9 ⇒ true
Ejemplo 2.6: Pruebas con enteros
Con mensajes de palabras clave específicas, puede calcular el mínimo común múltiplo y el máximo común divisor. Un mensaje de palabra clave se compone de uno o más signos de dos puntos «:» para insertar uno o más argumentos:
12 lcm: 15 ⇒ 60 12 gcd: 15 ⇒ 3
En el juego Spacewar!, la estrella central es la fuente de un campo gravitatorio. Según la ley de la gravitación universal de Newton, cualquier objeto con masa –una nave espacial o un torpedo en el juego– está sujeto a la fuerza gravitatoria. La calculamos como un vector para tener en cuenta tanto su dirección como su magnitud. El fragmento de código del juego que se muestra a continuación muestra un cálculo mixto (simplificado) de escalares y vectores realizado con el envío de mensajes (véase la Figura 2.4):
-10 * self mass * owner starMass / (position r raisedTo: 3) * position
Ejemplo 2.7: Calcular el vector de la fuerza de la gravedad