Como hemos visto, se puede emplear la palabra "integer" para indicar que una variable se usará para almacenar un número entero. Pero además podemos afinar si queremos que este número entero permita almacenar números muy grandes o podemos optimizar para que ocupe poco espacio. También podemos utilizar números "reales" (con cifras decimales). Vamos a verlo...
Ciertas versiones de Pascal, como Turbo Pascal y FreePascal, permiten escoger entre varios tipos de números enteros, de modo que podemos elegir el más adecuado en caso de que queramos no desperdiciar espacio o de que prefiramos almacenar datos de gran tamaño. Estos son los tipos más habituales:
Tipo | Rango de valores | Ocupa |
Shortint | -128..127 | 8 bits (1 byte) |
Integer | -32768..32767 | 16 bits (2 bytes) |
Longint | -2147483648..2147483647 | 32 bits (4 bytes) |
Comp | -9.2·1018..9.2·18 | 64 bits (8 bytes) |
Byte | 0..255 | 8 bits (1 byte) |
Word | 0..65535 | 16 bits (2 bytes) |
Así, un "byte" sería un tipo de datos adecuado para la edad de una persona (que no puede ser negativa, ni podemos esperar que necesite valores por encima de 255), y un "integer" no sería adecuado para la población de un país (porque no necesitaríamos datos negativos, y claramente puede ser un número por encima de 32.767). No todos los tipos de datos estarán disponibles en todos los sistemas. Por ejemplo el tipo "comp" puede no estar en sistemas antiguos, cuyo procesador no tenga un coprocesador matemático (Intel 386 y anteriores, por ejemplo).
Un ejemplo, que pidiese a una persona su edad en años (para lo que bastaría un "byte") y que calculase una aproximación de su edad en meses, multiplicando por 12 (para lo que parece adecuado un "word") podría ser:
(* Enteros sin signo: byte y word *)
program Enteros1;
var
edad: byte;
meses: word;
begin
write('Dime tu edad: ');
readLn(edad);
meses := edad * 12;
writeLn('Aproximadamente tienes ', meses, ' meses');
end.
(* Ejemplo de ejecucion:
Dime tu edad: 20
Aproximadamente tienes 240 meses
*)
Ejercicio propuesto 1.6.1.1: Crea un programa que te pregunte dos números del 1 al 10 y escriba su suma. Escoge un tipo de datos que no desperdicie mucho espacio.
Ejercicio propuesto 1.6.1.2: Crea un programa que pida al usuario dos números enteros entre el -1000 y el 1000, calcule su producto su producto y lo guarde en una nueva variable, para finalmente mostrar dicho producto.
Ejercicio propuesto 1.6.1.3: Crea un programa que pida al usuario la cantidad de habitantes de su país y cantidad de provincias o estados. A partir de esos datos calculará una estimación de la cantidad media de habitantes en cada provincia o estado. Finalmente mostrará ese resultado en pantalla. Debe usar los tipos de datos más adecuados. Recuerda emplear "div" para calcular una división entera.
En general, en la mayoría de cálculos necesitaremos tener en cuenta las cifras decimales, no siempre podremos trabajar con números enteros. Para esos casos, el lenguaje Pascal nos permite usar un tipo llamado "real".
Por ejemplo, si queremos convertir de centímetros a metros, tendremos que dividir entre 100, de modo que obtendremos cifras decimales (a no ser que deseemos perder precisión y usemos "div"), y necesitaremos emplear números reales:
(* Numeros reales, primer contacto *)
program Reales1;
var
centimetros, metros: real;
begin
write('Dime la longitud, en centimetros: ');
readLn(centimetros);
metros := centimetros / 100;
writeLn('Equivalen a ', metros, ' metros');
end.
(* Ejemplo de ejecucion:
Dime la longitud, en centimetros: 32.8
Equivalen a 3.28000000000000E-001 metros
*)
A la hora de introducir datos, debemos usar un punto para separar la parte entera de la parte fraccionaria, no una coma. De igual modo, los resultados se mostrarán también con punto. Pero además el resultado es poco legible, porque en Pascal, los números reales se muestran en notación científica a no ser que indiquemos lo contrario. Un número como 3e2 o 3E+2 equivaldría a 3·102, es decir, 3·100 = 300, mientras que 3e-2 o 3.0E-002 indicaría que el resultado es 3·10-2, es decir, 3x0.01 = 0.03
Podemos hacer que resulte más legible si indicamos cuantas cifras totales y cuantas cifras decimales queremos que se muestren, haciendo:
write(numero:cifrasTotales:cifrasDecimales);
De modo que el ejemplo anterior se podría reescribir de la siguiente forma, para que mostrase 4 cifras decimales y 5 (o más) cifras en total:
(* Numeros reales y formato en pantalla *)
program Reales2;
var
centimetros, metros: real;
begin
write('Dime la longitud, en centimetros: ');
readLn(centimetros);
metros := centimetros / 100;
writeLn('Equivalen a ', metros:5:4, ' metros');
end.
(* Ejemplo de ejecucion:
Dime la longitud, en centimetros: 32.8
Equivalen a 0.3280 metros
*)
Ejercicio propuesto 1.6.2.1: Crea un programa que te pida dos números reales y muestre en pantalla el resultado de multiplicarlos.
Ejercicio propuesto 1.6.2.2: Pide al usuario dos números reales y muestra en pantalla el resultado de su división, con dos cifras decimales.
Ejercicio propuesto 1.6.2.3: Crea un programa que convierta de kilómetros a millas, usando la equivalencia 1 milla = 1619 metros. Debe mostrar el resultado con 3 cifras decimales.
Pero Turbo Pascal y FreePascal nos permiten emplear varios tipos de datos reales, con mayor o menor precisión y que ocupan más o menos espacio, para adecuarlos a nuestras necesidades:
Tipo | Rango de valores | Cifras | Ocupa |
real | 2.9e-39..1.7e38 | 11-12 | 6 bytes |
single | 1.5e-45..3.4e38 | 7-8 | 4 bytes |
double | 5.0e-324..1.7e308 | 15-16 | 8 bytes |
extended | 3.4e-4932..1.1e4932 | 19-20 | 10 bytes |
En todos estos datos, la precisión se mide en "cifras significativas", que son las cifras distintas de cero que hay al principio o al final del número: un número como 0.0002 tiene una cifra significativa, 33 tiene 2 cifras significativas, al igual que 33000, mientras que 33001 tiene 6 cifras significativas.
Ejercicio propuesto 1.6.2.4: Crea un programa que pida al usuario dos números reales con al menos 13 cifras de precisión y muestre el resultado de su división, con 8 cifras decimales.
En el lenguaje Pascal podemos encontrar ciertas funciones matemáticas incorporadas. Por ejemplo, "sqrt" nos sirve para calcular una raíz cuadrada:
(* Raiz cuadrada *)
program Raiz;
var
n: real;
begin
write('Dime un numero: ');
readLn(n);
writeLn('Su raiz es ', sqrt(n):2:1);
end.
(* Ejemplo de ejecucion:
Dime un numero: 4
Su raiz es 2.0
*)
De igual modo, existe otra función llamada "sqr", que calcula el cuadrado de un número.
Ejercicio propuesto 1.6.3.1: Crea un programa que te pida un número y calcule su raíz cuarta (la raíz cuadrada de su raíz cuadrada).
Ejercicio propuesto 1.6.3.2: Pide un número y calcula su cuarta potencia (el cuadrado de su cuadrado).
También puedes obtener números al azar: random(x) nos da un número entre 0 (incluido) y x (no incluido). Antes deberás usar "randomize", para dar una valor a la secuencia de números al azar a partir del valor actual del reloj interno del ordenador::
(* Numero al azar entre 0 y 9 *)
program Azar;
begin
Randomize;
writeLn('Numero al azar: ', random(10) );
end.
(* Ejemplo de ejecucion:
Numero al azar: 6
*)
Si debemos buscar un número entre dos valores cualesquiera, deberemos sumar una cantidad al valor de random. Por ejemplo, para obtener un número entre 10 y 30 usaríamos 10+random(21).
Ejercicio propuesto 1.6.3.3: Crea un programa que genere un número al azar entre 1 y 20 (ambos incluidos).
Ejercicio propuesto 1.6.3.4: Crea un programa que genere un número al azar entre 100 y 500 (ambos incluidos).
Si has estudiado trigonometría, quizá te alegre saber que puedes calcular senos (con la función "sin") y cosenos (con "cos"). Ambos datos esperan que entre paréntesis se les indique el ángulo, pero medido en radianes, no en grados (tampoco es un grave problema, la equivalencia es que 180 grados son PI radianes):
(* Coseno de 45 grados *)
program Coseno;
var
pi, angulo, resultado: real;
begin
pi := 3.1416;
angulo := pi / 4; (* 45 grados = PI / 4 radianes *)
resultado := cos(angulo);
writeLn('El coseno de 45 grados es ', resultado:4:3);
end.
(* Ejemplo de ejecucion:
El coseno de 45 grados es 0.707
*)
Ejercicio propuesto 1.6.3.5: Crea un programa que pida al usuario un ángulo en grados y muestre su seno y su coseno.
Ejercicio propuesto 1.6.3.6: Crea un programa que pida al usuario un ángulo en grados y muestre su tangente (seno / coseno).
Y si has trabajado con logaritmos y exponenciales, tendrás a tu disposición ln(x) para calcular logaritmos neperianos y exp(x) para calcular el valor de "e elevado a x".
(* Potencia: un numero elevado a otro *)
program Potencia;
var
base, exponente: real;
begin
write('Dime la base: ');
readLn(base);
write('Dime el exponente: ');
readLn(exponente);
writeLn('Su potencia es: ',
Exp(exponente * Ln(base)) );
end.
(* Ejemplo de ejecucion:
Dime la base: 2
Dime el exponente: 3
Su potencia es: 8.0
*)
Con la palabra "char" podemos indicar que una variable se usará para guardar un carácter (letra, número o símbolo). Cada carácter ocupa 1 byte:
(* Caracteres, toma de contacto *)
program Caracteres;
var
letra1, letra2: char;
begin
write('Dime una letra: ');
readLn(letra1);
write('Dime otra letra: ');
readLn(letra2);
writeLn('Las letras eran ', letra1, ' y ', letra2);
end.
(* Ejemplo de ejecucion:
Dime una letra: a
Dime otra letra: s
Las letras eran a y s
*)
Ejercicio propuesto 1.6.4.1: Crea un programa que te pregunte tres letras y luego las escriba en orden inverso.
Si queremos dar un valor a una variable de tipo "char" (lo usaremos dentro de poco, cuando empecemos a comprobar condiciones), deberemos usar comillas simples:
(* Caracteres y valores prefijados *)
program Caracteres2;
var
letra1, letra2: char;
begin
write('Dime una letra: ');
readLn(letra1);
letra2 := 'Z';
writeLn('Tu letra era ', letra1, ' y la mia ', letra2);
end.
(* Ejemplo de ejecucion:
Dime una letra: a
Tu letra era a y la mia Z
*)
Esos no son los únicos tipos de datos. Dentro de poco veremos que también podemos almacenar valores verdadero/falso, cadenas de texto, conjuntos... Pero esos datos de mayor complejidad los iremos viendo poco a poco, a medida que los vayamos necesitando.