18 septiembre 2014

Pascal - 5a: Constantes

5.1. Definición de constantes

5.1.1. Valores que no cambian

Cuando desarrollamos un programa, nos podemos encontrar con que hay variables que realmente "no varían" a lo largo de la ejecución de un programa, sino que su valor es constante.
Hay una manera especial de definirlas: con el especificador "const", que tiene el formato
const Nombre = Valor;
Cuando las declaramos, no será necesario indicar el tipo de datos, porque el compilador lo puede deducir:
const MiNombre = 'Nacho Cabanes'; 
const PI = 3.1415926535; 
const LongitudMaxima = 128; 
Ya en el cuerpo del programa, estas constantes se manejan igual que variables como las que habíamos visto hasta hora, con la diferencia de que no se nos permitirá cambiar su valor. Por tanto, es válido hacer
WriteLn(MiNombre); 
if Longitud > LongitudMaxima then ... 
OtraVariable := MiNombre; 
LongitudCircunferencia := 2 * PI * radio; 
pero no podríamos hacer
PI := 3.14; 
MiNombre := 'Nacho'; 
LongitudMaxima := LongitudMaxima + 10;
Con los pocos conocimientos que llevamos hasta ahora, las constantes nos resultarán especialmente útiles para indicar el tamaño máximo de un array, de modo que los cambios en el programa sean mínimos en caso de que decidamos usar un tamaño de array mayor o menor, como en este ejemplo:
(* CONST01.PAS, Const y arrays (01)   *)
(* Parte de CUPAS5, por Nacho Cabanes *)
 
Program Const01;
 
const
    MAXIMO = 5;
 
var
    datos: array[1..MAXIMO] of integer;
    i: integer;
 
begin
    for i := 1 to MAXIMO do
    begin
        write('Deme el dato ',i,': ');
        readLn(datos[i]);
    end;
 
    write('Los datos al reves son: ');
    for i := MAXIMO downto 1 do
        write(datos[i], ' ');
 
    writeLn;
end. 
 
Si decidimos que queremos trabajar con 10 datos, el único cambio sería el valor de la constante; el resto de programa se comportaría correctamente en cuanto recompilásemos.
Como se ve en este ejemplo, las declaraciones de constantes se hacen antes del cuerpo del programa principal, y generalmente antes de las declaraciones de variables.

5.1.2. Inicialización: Constantes "con tipo"

En Turbo Pascal (y Free Pascal), el identificador "const" tiene también otro uso menos habitual: definir lo que se suele llamar "constantes con tipo", que no son más que variables normales, pero a las que damos un valor inicial antes de que comience a ejecutarse el programa. Se usa
const variable: tipo = valor;
Un ejemplo más detallado sería:
(* CONSTTIPO.PAS, Constantes con tipo *)
(* Parte de CUPAS5, por Nacho Cabanes *)
 
Program ConstTipo;
 
const
    x: integer = 5;
    y: byte = 2;
 
begin
    writeLn('La suma de X e Y es: ', x+y);
 
    write('Nuevo valor para X? ');
    readLn(x);
 
    write('Nuevo valor para Y? ');
    readLn(y);
 
    writeLn('La nueva suma de X e Y es: ', x+y);
end. 
 
(* Ejemplo de ejecucion:
La suma de X e Y es: 7
Nuevo valor para X? 3
Nuevo valor para Y? 6
La nueva suma de X e Y es: 9
*)
 
La única ventaja real sobre el uso "habitual" de una variable es la legibilidad: en el mismo punto en el que se declara la variable, queda indicado cuál queremos que sea su valor inicial.
Ejercicio propuesto 5.1.2.1: Crea un programa que pida al usuario 10 números enteros y vaya calculando y mostrando su suma. No debes almacenar los datos en un array, y la suma debe guardarse en una variable que se haya inicializado a 0, usando una "constante con tipo".
Ejercicio propuesto 5.1.2.2: Crea un programa que pida al usuario 5 números enteros y vaya calculando y mostrando su producto. No debes almacenar los datos en un array, y el producto se debe guardar en una variable que se haya inicializado a 1, empleando una "constante con tipo".

5.1.3. Inicialización de arrays

Las "constantes con tipo" son especialmente útiles para dar valores iniciales a todo un array, indicando todos sus valores entre paréntesis y separados por comas, así:
(* CONSTTIPOARR.PAS, Constantes con tipo          *)
(* como forma de dar valores iniciales a un array *)
(* Parte de CUPAS5, por Nacho Cabanes             *)
 
program ConstTipoArr;
 
const
    diasMes : array[1..12] of byte =
        (31,28,31,30,31,30,  { Enero a Junio }
         31,31,30,31,30,31); { Julio a Diciembre }
 
var
    mes: byte;
 
begin
    write('Dime un numero de mes: ');
    readLn(mes);
 
    writeLn('Ese mes tiene ', diasMes[ mes ], ' dias');
end. 
 
(* Ejemplo de ejecucion:
Dime un numero de mes: 7
Ese mes tiene 31 dias
*)
 
No sólo se pueden emplear valores numéricos. Por ejemplo, también podemos crear un array de cadenas de texto, si delimitamos los valores entre comillas simples, de la siguiente manera:
(* CONSTTIPOARR2.PAS, Constantes con tipo         *)
(* como forma de dar valores iniciales a un array *)
(* Version con cadenas de texto                   *)
(* Parte de CUPAS5, por Nacho Cabanes             *)
 
Program ConstTipoArr2;
 
const
    nombreMes : array[1..12] of string =
        ('enero', 'febrero', 'marzo', 'abril',
         'mayo', 'junio', 'julio', 'agosto',
         'septiembre', 'octubre', 'noviembre', 'diciembre');
 
var
    mes: byte;
 
begin
    write('Dime un numero de mes: ');
    readLn(mes);
 
    writeLn('Ese mes se llama ', nombreMes[ mes ]);
end. 
 
(* Ejemplo de ejecucion:
Dime un numero de mes: 4
Ese mes se llama abril
*)
 
(Como siempre, más detalles y ejercicios propuestos en la página oficial del curso).