Poner colores

A todos nos gustan los colores y Pascal no se queda atrás, por eso para colocar colores a nuestros programas tenemos dos procedimientos. Uno para colorear las letras y otro para los fondos, estos son:

TextColor y TextBackground
Son muy fácil de usar pero podemos llegar a hacer un desastre, por eso tienes que ir recordando (o tratar) donde declaraste cada uno para saber a que parte del programa afecta.

Su declaración es muy sencilla, solo basta con recordar sus nombres y luego elegimos el color. Los colores los podemos escribir (en ingles) o ingresar su equivalencia en número.

De Dicho Soft

Declaración
          Textcolor (3);
          Textbackground (15);

Estos afectan a todo lo declarado a su continuación, ejemplo:

Program Color;
Uses Crt;
Begin
     Clrscr;
     Writeln ('Dicho Soft'); {Fondo negro y en letras gris claro, es la configuración por defecto}
     TextColor (15); TextBackground (7);
     Writeln ('Dicho Soft'); {Fondo gris claro y en letras blancas}
End.

Efecto Titilar
Un efecto que podemos complementar con TextColor es Blink, que hace que el texto titile o parpadee (Funciona cuando se esta ejecutando el programa en pantalla completa, esto se hace apretando Alt + Enter). Y se declara sumándole 128 al valor del color o agregando la palabra "Blink". TextColor (130); o TextColor (2 + Blink);.

Ejemplo
Estas son unas líneas de un código que escribí para un trabajo práctico, y que cumplen la función de dibujar en la pantalla un submenú del programa. Solo dibuja el fondo y las líneas del contorno, el texto se agrega por separado en otra parte del programa.
Aún no he explicado como se declaran Procedure y Function (Procedimientos y Funciones), por lo que puede que no entiendas las primeras dos líneas (o si), pero lo que sigue si tienes que entenderlo por que ya lo explique.

De Dicho Soft

El resultado de ejecutar este Procedure es el siguiente:

De Dicho Soft

Lo interesante de este Procedure es que puedo dibujar un submenú del tamaño que quiera y en cualquier parte de la pantalla, solo basta con  ir variando los números que le paso al Procedure (que son los valores de X, Y, F, C). Lo mismo para los colores (Color1, Color2, Color3).

En la próxima veremos procedimientos y funciones, como a mi me gusta explicar... directo al grano y con ejemplos para que se entienda.

Funciones útiles

Redondear y truncar

     Round (X); {X:Real, Resultado real (Entero más próximo que hay de X)}
     Y := Round (X);

     Trunc (X); {X:Real, Resultado entero (Saca los decimales de X)}
     Z := Trunc (X);

Ejemplo

Program RyT;
Uses Crt;
Var
     VR1, VR2 : Real;
     EN : Integer;
Begin
     Clrscr;
     VR1 := 123.43;
     VR2 := Round (VR1);
     EN := Trunc (VR2);
End. {Falta mostrar los resultados en pantalla}


Números aleatorios

     Random; ==> Genera números aleatorios entre 0 y 1.
     Random (X); ==> Genera números aleatorios entre 0 y X (X es un número entero).

Ejemplo

Program Ran;
Uses Crt;
Var
     X : Integer;
Begin
     Clrscr;
     Randomize; {Siempre hay que colocarlo cuando usamos Random}
     Write (Random (200));
End.


Incrementar - Decrementar (Muy útil)

     Inc (X); ==> Incrementa el valor de X en 1 unidad (Sustituto de "X := X + 1").
     Dec (X); ==> Decrementa el valor de X en 1 unidad (Sustituto de "X := X - 1").

¿Qué pasa si queremos incrementar o decrementar en dos o más unidades a X?
Sencillo:
             Inc (X,5); {Incrementa en 5 unidades a X}
             Dec (X,10); {Decrementa en 10 unidades a X}

Ejemplo

Program IyD;
Uses Crt;
Var
     X,Y,N : Integer;
Begin
     Clrscr;
     X := 0;
     Y := 25;
     For N := 1 to 5 do
          Begin
               Inc (X,2);
               Dec (Y,5);
          End;
End. {Resultados: X = 10, Y = 0}


Int y Frac

     Int (X); {X:Real, Resultado real (Devuelve la parte entera de X).
     Frac (X); {X:Real, Resultado real (Devuelve la parte decimal de X).

Ejemplo

Program IyF;
Uses Crt;
Var
     R : Real;
Begin
     Clrscr;
     R := Int (236.56); {R = 236.0}
     R := Int (-236.56); {R = -236.0}
     R := Frac (236.56); {R = 0.56}
     R := Frac (-236.56); {R = -0.56}
End.


Otras

     Abs (X); ==> Nos da el valor absoluto de X.
     Sqr (X);  ==> Devuelve el cuadrado de X.
     Sqrt (X); ==> Devuelve la raíz cuadrada de X.
     Exp (X); ==> Devuelve el exponencial de X.
     Ln (X);  ==> Devuelve el logaritmo natural de X.
     Sin (X);  ==> Devuelve el seno de X.
     Cos (X);  ==> Devuelve el coseno de X.
     Arctan (X); ==> Devuelve la cotangente de X.

For, While, Repeat

Estas tres estructuras son muy utilizadas en el lenguaje Pascal y se usan para repetir dos o varias veces, una o muchas sentencias definidas por nosotros. Pero hay que tener cuidado ya que podríamos crear un bucle infinito del cual nunca saldríamos.

Definamos cada estructura, la ayuda de Turbo Pascal 7 las define así:

For: esta sentencia hace que la sentencia de después del do se ejecute una vez por cada valor dentro del rango, del primero al ultimo.

While: contiene una expresión que controla la ejecución repetida de una sentencia singular o compuesta.

Repeat: las sentencias entre repeat y until se ejecutan en secuencia hasta que al final de una secuencia, la expresión booleana en verdadera (True).

Sintaxis

          For Variable := Primer número to Último número do
               Sentencia;

          For Variable := Primer número downto Último número do
               Sentencia;

          While Expresión do
               Sentencia;

          Repeat
               Sentencia;
               Sentencia;
               ...
               Sentencia;
          Until Expresión;


Aclaraciones

Tanto "Variable", "Primer número" como "Último número" deben ser de un tipo ordinal (ej: Integer). Con "to" el valor de "Variable" se incrementa en 1 para cada vez que se ejecute el bucle. Con "downto" es exactamente al revés, es decir se decrementa en 1.

En los while, la sentencia después del "do" se ejecuta mientras que la expresión contigua al while sea verdadera. El valor de la expresión se evalúa antes de que se ejecute la sentencia, por lo que si la expresión es falsa no se ejecuta la sentencia.

Para los repear hay que tener cuidado ya que las sentencias se va a ejecutar por lo menos una vez, por que la expresión se evalúa al final de estas. Las sentencias se ejecutarán hasta que la expresión sea verdadera.

Tanto para while como para repeat los valores de las expresiones se las va a modificar dentro de su estructura, si no fuera de esta manera nunca se saldría del bucle y se generaría un ciclo de nunca acabar. Por otro lado, si queremos escribir más de una sentencia en un for o un while debemos escribirlas entre begin y end, para repeat no hace falta por que ya están delimitadas por repeat y until.

Ejemplos de estructuras posibles

Caso 1

          For Variable := Primer número to Último número do
               Begin
                    Sentencia;
                    Sentencia;
                    ...
                    Sentencia;
               End;

Caso 2
          For Variable_1 := Primer número to Último número do
               For Variable_2 := Primer número to Último número do
                    For Variable_3 := Primer número to Último número do
                         For Variable_4 := Primer número to Último número do
                              Begin
                                   Sentencia;
                                   While Expresión do
                                         Begin
                                              Sentencia;
                                              Sentencia;
                                         End;
                                   Sentencia;
                              End;


Caso 3
          Repeat
               While Expresión do
                     Begin
                          For Variable := Primer número to Último número do
                               Begin
                                    Sentencia;
                                    Sentencia;
                                    ...
                                    Sentencia;
                              End;
                          Sentencia;
                          Sentencia;
                     End;
               Sentencia;
               Sentencia;
               ...
               Sentencia;
          Until Expresión;

Estos son distintos casos que podemos armar al ir combinado las distintas estructuras, no necesariamente puedes dar con una estructura de esta forma, solo son ejemplos. Fíjate donde coloco ";" y donde no. Si lo queremos complicar podríamos sumas unos IF y CASE, pero lo dejo para vos. No to olvides que la práctica lo es todo.


Veamos unos ejemplos


Program EjemploFor;
Uses Crt;
Var
     x : Integer;
Begin
     Clrscr; {Borra la pantalla}
     For x := 1 to 100
          Writeln (' Dicho Soft ');
     Readkey; {Se detiene el programa hasta que se presione una tecla}
End. {Escribe 100 veces "Dicho Soft" en la pantalla, podría ver puesto 1000000}


Program EjemploWhile;
Uses Crt;
Var
     Tecla : Char;
Begin
     Clrscr;
     Tecla := #13;  {Es la tecla Enter o Intro}
     While Tecla <> #27 do   {Tecla Escape}
          Begin
               Writeln (' Dicho Soft ');
               Tecla := Readkey;
          End;
End. {Escribe "Dicho Soft" mientras que la tecla pulsada sea distinta a Escape (#27)}


Program EjemploRepeat;
Uses Crt;
Var Tecla_2 : Char;
Begin
     Clrscr;
     Repeat
          Writeln (' Dicho Soft ');
          Tecla_2 := Readkey;
     Until Tecla_2 = #27;
End. {Escribe "Dicho Soft" hasta que se presione Escape. Si ponemos "<>" en el lugar del "=" escribe "Dicho Soft" mientras se presione la tecla Escape, cambia la cosa.}

If y Case

Estas estructuras son muy importantes. "If" especifica las condiciones bajo las cuales será ejecutada una o varias sentencias y la sentencia "Case", consiste en una expresión (el selector) y una lista se sentencias, cada una prefijada con un caso.

Sintaxis:
             If  (Expresión)
                 Then  Sentencia;

                      O

             If (Expresión)
                 Then Sentencia
                 Else Sentencia;

Si la expresión resulta verdadera se ejecuta la sentencia de "Then". 
En el otro caso si la expresión del "If" resulta falsa se ejecuta la sentencia de "Else", en caso contrario la de "Then". En esta siempre se va a ejecutar una u otra, pero nunca ambas.

Pero, ¿qué pasa si tenemos más sentencias?. La solución es la de encerrar todas las sentencias dentro de "Begin" y "End".

Veamos unos casos:

Caso 1

If (Expresión)  
     Then
          Begin 
               Sentencias; {Todas las que se necesiten; terminar con ";"}
          End  {Este "End" no termina con ";", porque luego está "Else"}
     Else Sentencia;

Caso 2

If (Expresión) 
     Then
          Begin 
               Sentencias;
          End  {Este "End" no termina con ";", porque luego está "Else"}
     Else 
          Begin
               Sentencias;
          End;  {Se cierra con ";"}

Si a las expresiones de estos casos se le interpone un "Not" (Para negar) se invertirían los resultados, por lo que si el resultado de la expresión resulta verdadera, como tenemos un "Not" delante, ese verdadero se convierte en falso. De esta manera pasaría a ejecutarse "Else" y no "Then".
Ejemplo:

If  Not (2 < 5)
     Then  Write ('2')
     Else Write ('5');

¿Qué nos está diciendo este ejemplo?. Bien si vemos 2 es menor a 5 por lo que el resultado sería verdadero, pero como tenemos un "Not" delante se niega el resultado que dando en falsa, por lo que se muestra en pantalla 5 y no 2. Si no estaría en "Not" se mostraría en pantalla el 2 y no el 5.

Aclaración
  • Sentencia: es una sola instrucción. Por ejemplo: Write (' Dicho Soft') o puede ser Readln (Nombre).
  • Sentencias: en un conjunto de instrucciones. Por ejemplo varios "Write" y "Read", etc;

Otros casos validos:

Caso 3

If (Expresión) 
     Then
          If (Expresión)
               Then  Sentencia
               Else 
                    Begin
                         Sentencias;
                    End
     Else 
          If (Expresión)
               Then 
                    Begin
                         Sentencias
                    End
               Else  Sentencia;

Caso 4

If (Expresión) 
     Then
          If (Expresión)
               Then
                    If (Expresión)
                         Then 
                              If (Expresión)
                                   Then
                                        Begin
                                             Sentencias
                                        End
                                   Else  Sentencia
                         Else Sentencia
               Else Sentencia
     Else Sentencia;


Estos dos casos son validos, para comprobarlo solamente hace falta colocar una expresión en cada "If".

Veamos "Case"

Sintaxis:

            Case (Expresión) of
                  Caso_1: Sentencia;
                  Caso_2:Sentencia;
                  Caso_N:Sentencia;
            End;

                            O

            Case (Expresión) of
                  Caso_1: Sentencia;
                  Caso_2: Sentencia;
                  Caso_N: Sentencia;
               Else Sentencia;
            End;

Un caso consiste en una o más constantes o rangos, separados por coma. La parte "Else" es opcional.

Por ejemplo:

Case Variable of
       'A' .. 'Z', 'a' .. 'z' : Write ('Letra.');
       '0' .. '9' : Write ('Número');
       '-','+','/','*' : Write ('Operador');
     Else Write ('Carácter especial');
End;

Si queremos colocar más de una sentencia debemos encerrarlas entre "Begin" y "End".
Ejemplo:

Case (Expresión) of
        Caso_1: Begin
                           Sentencias;
                      End;
        Caso_2: Begin
                           Sentencias;
                      End;
End;

Caso práctico

Imagínate si en tu programa quieres establecer distintas acciones para todos los número (enteros) que van desde 1 a 9. El número es ingresado por el usuario y obviamente nosotros no lo conocemos, ¿como determinarías que número ha sido ingresado?. Pues no queda otra que ir preguntando uno por uno hasta dar con el número ingresado.

Lo podemos hacer de dos formas:

Forma 1 (Con "If")

Program Forma_1;
Uses Crt;
Var
     N: Integer;
Begin
     Clrscr;
     Write ('Ingrese un número entero entre 0 y 9: '); Readln (N);
     If N = 0
        Then Acción_1
        Else 
           If N = 1
              Then Acción_2
              Else
                 If N = 2
                    Then Acción_3
                    Else 
                       If N = 3
                          Then Acción_4
                          Else
                             If N = 4
                                Then Acción_5
                                Else
                                   If N = 5
                                      Then Acción_6
                                      Else
                                         If N = 6
                                            Then Acción_7
                                            Else
                                               If N = 7
                                                  Then Acción_8
                                                  Else
                                                     If N = 8
                                                        Then Acción_9
                                                        Else 
                                                           If N = 9
                                                              Then Acción_10
                                                              Else  Writeln ('Ingresó un número equivocado.');
     Repeat Until Keypressed;
End.

Forma 2 (Con "Case")

Program Forma_2;

Uses Crt;
Var
     N: Integer;
Begin
  Clrscr;
  Write ('Ingrese un número entero entre 0 y 9: '); Readln (N);
  Case N of
           0: Acción_1;
           1: Acción_2;
           2: Acción_3;
           3: Acción_4;
           4: Acción_5;
           5: Acción_6;
           6: Acción_7;
           7: Acción_8;
           8: Acción_9;
           9: Acción_10;
      Else Writeln ('Ingresó un número equivocado.');
   End;
Repeat Until Keypressed;
End.


¿Con qué forma te quedas?, obviamente que en este caso particular nos conviene toda la vida la forma 2. A simple vista podemos ver que la complejidad es mucho menor y ni hablar de la diferencia de tiempo que se tarda en escribir cada una.
Así que ya sabes que camino tomar cuando tienes muchas acciones y una sola variable que decide cual se ejecutará. Pincha aquí para verlo integrado en un posible menú para un programa hecho en Pascal.