CAPITULO 6

 

PROCEDIMIENTOS Y FUNCIONES ESTANDAR

 

 

Object Pascal provee una serie de procedimientos y funciones estándar básicas, son estas funciones las que nos proporcionan las herramientas necesarias para crear programas que manipulen nuestros datos de una manera eficiente y flexible ahorrándonos un gran esfuerzo de programación; además de brindarnos acceso a rutinas de bajo nivel (acceso a la máquina) de manera fácil y segura sin hacer necesario de nuestra parte un conocimiento elevado del software y hardware del computador.

 

Estas rutinas las podemos agrupar de la siguiente manera:

 

            Funciones aritméticas.

            Funciones escalares.

            Funciones de transferencia.

            Procedimientos y funciones para la manipulación de cadenas.

            Procedimientos y funciones para el manejo de archivos.

            Procedimientos y funciones para el manejo de variables dinámicas.

 

Los procedimientos de entrada y salida estándar ya han sido discutidos; en cuanto a los procedimientos y funciones para manipular archivos serán tratados en el Capítulo 8.

 

 

FUNCIONES ARITMETICAS.

 

Estas funciones nos permiten el trabajo matemático, son una librería de las funciones científicas más comunmente usadas, a continuación se comentan algunas de las más usadas.

 

            Abs(Num);

 

Retorna el valor absoluto de Num. El argumento Num puede ser entero o real.

 

 

            ArcTan(Num);

 

Retorna el ángulo, en radianes, cuya tangente es Num. El argumento Num puede ser real o entero y el resultado es real.

 

 

            Cos(Num);

 

Retorna el coseno de Num. El argumento Num debe estar expresado en radianes, y puede ser real o entero. El resultado es de tipo real.

 

 

            Exp(Num);

 

Retorna el exponencial de Num. El argumento Num puede ser entero o real. El resultado es de tipo real.

 

 

            Frac(Num);

 

Retorna la parte fraccional (parte decimal) de Num. El argumento Num puede ser real o entero. El resultado es real.

 

 

            Int(Num);

 

Retorna la parte entera de Num. Si Num >= 0, el resultado será el mayor entero menor o igual que Num. Si Num < 0, el resultado será el menor entero mayor o igual que Num. El argumento Num puede ser entero o Real. El resultado es Real.

 

 

            Ln(Num);

 

Retorna el logaritmo natural de Num. El argumento Num puede ser entero o real. El resultado es real.

 

 

            Sin(Num);

 

Retorna el seno de Num. El argumento Num debe estar expresado en radianes. El resultado es real.

 

 

            Sqr(Num);

 

Retorna el cuadrado de Num ( que es: Num * Num). El argumento Num puede ser real o entero. El resultado es del mismo tipo que el argumento.

 

 

            Sqrt(Num);

 

Retorna la Raíz cuadrada de Num. El argumento puede ser real o entero. El resultado es real.

 

 

            Random(Num);

 

Retorna un número aleatorio entre 0 y Num - 1. Num y el resultado son enteros. Si se omite el parámetro Num la función retorna un número aleatorio menor que 1, dando como  resultado un número  Real.

 

Igualmente se tiene el procedimiento:

 

            Randomize

 

El cual inicializa el generador de números aleatorios, produciendo una secuencia diferente de éstos; éste valor se obtiene de la cuenta del reloj interno del computador y se asigna a la variable predeclarada RandSeed -Entero largo-. Esta variable puede manipularse directamente para obtener una secuencia específica de números aleatorios.

 

Veamos este sencillo ejemplo que muestra cómo usar números aleatorios para simular una "caminata" al azar:

 

Cree una nueva aplicacion y añada un boton al cual asociar el siguiente código para el evento OnClick

 

 

 

procedure TForm1.Button1Click(Sender: TObject);

const

     avance = 2; // Magnitud del avance

var

     x, y  : integer;

 

begin

    Refresh;

    randomize;

 

    x := Width div 2;   // Centro de la pantalla

    y := Height div 2;

 

    Canvas.MoveTo(x,y); // Posiciona el apuntador gráfico

                        // en el centro de la forma

 

    repeat

        // Genera direccion del avance al azar en X y en Y

        x := x + (random(3) - 1) * avance;

        y := y + (random(3) - 1) * avance;

        // Se mueve a la nueva posicion trazando linea

        Canvas.LineTo(x,y);

 

        Application.ProcessMessages;

        Sleep(1);

    until FALSE;  // Ciclo "infinito"

   

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

   Halt;

end;

 

 

 

 

El codigo para el evento OnClose de la forma se hace necesario para poder terminar la ejecucion del programa y terminar la ejecucion del ciclo infinito: repeat ... until FALSE.

 

 

FUNCIONES ESCALARES

 

Estas funciones nos permiten manipular tipos escalares.

 

 

            Inc(VarOrd,número);

 

Incrementa en número veces el valor de la variable de tipo ordinal VarOrd; si el parámetro número se omite -éste es opcional-, el incremento es uno.

 

 

            Dec(VarOrd,número);

 

Decrementa en número veces el valor de la variable de tipo ordinal VarOrd; si el parámetro número se omite, el decremento es uno.

 

 

            Pred(Num);

 

Retorna el predecesor de Num (si existe). Num puede ser de tipo escalar.

 

 

            Succ(Num);

 

Retorna el sucesor de Num (si existe). Num puede ser de tipo escalar.

 

 

            Odd(Num);

 

Es una función booleana que retorna TRUE si Num es impar y FALSE si es par. Num debe ser de tipo entero.

 

 

 

FUNCIONES DE TRANSFERENCIA

 

 

Estos procedimientos y funciones son básicas para llevar datos de un tipo a otro; nos permiten por ejemplo convertir una cadena en un tipo numérico y viceversa, o procesar la entrada de parámetros en la línea de comando en los programas que usen esta opción.

 

 

            Chr(Num);

 

Retorna el carácter ASCII correspondiente al número ordinal Num que es un entero. Por ejemplo, Chr(65) retorna el carácter 'A'.

 

 

            Ord(Var);

 

Retorna el número ordinal de Var en el conjunto al cual pertenece. Var puede ser cualquier tipo escalar (excepto Real) y el resultado es de tipo entero. Por ejemplo, Ord('A') retorna el valor 65 (Ver en el Apéndice B los códigos ASCII).

 

 

            Round(Num);

 

Retorna el valor de Num redondeado (aproximado) al entero más próximo. Num debe ser real, y el resultado es un entero.

 

 

            Trunc(Num);

 

Trunca la parte fraccional (decimal) de Num. Num debe ser Real y el resultado es entero.

 

 

            ParamCount;

 

Es una función entera. Retorna el número de parámetros pasados al programa a través del buffer de la línea de comandos, se puede acceder a estos parametros por medio de la función:

 

 

            ParamStr(index);

 

donde index es el número de un parametro específico pasado en la línea de comando del DOS al invocar un programa que maneje esta opción; ésta función retorna una cadena; si index es cero o mayor que ParamCount la cadena retornada es vacía.

 

Los programas que toman parámetros directamente de la línea de comando son comunes en aplicaciones de consola.

 

 

            UpCase(ch);

 

Retorna el equivalente en mayúsculas del argumento Ch que deberá ser de tipo carácter. Si no hay mayúscula equivalente, el argumento es retornado sin cambio.

 

 

 

PROCEDIMIENTOS Y FUNCIONES PARA CADENAS

 

 

Para las definiciones y ejemplos dados a continuación, asumimos las siguientes declaraciones de variables:

 

          VAR

               St, Obj, Target      : String;

               Pos, N, errpos       : Integer;

               Value                : {  Real ó entera  }

 

 

 

            Concat(St1, St2...,StN);

 

Con esta función se obtiene el mismo resultado que con el operador  '+' para cadenas. Así:

           

            Si St1 = 'Object' y St2 = 'Pascal',

 

      Concat('Esto es ',St1,St2);

            Retorna: 'Esto es ObjectPascal'

            y es equivalente a : 'Esto es ' + St1 + St2;

 

 

 

            Copy(St,Pos,N);

 

Esta función copia N caracteres de la cadena de caracteres St, a partir de la posicion Pos.

 

 Ejemplo, si:  St= 'abcdef',  entonces

 

            Copy (St,3,2);        Retorna el valor 'cd'

      Copy (St,4,10);     Retorna el valor 'defg'

 

 

 

            Delete (St, Pos, N);

 

Borra N caracteres de la cadena St, partiendo desde la posición Pos. La suma:  Pos + N debe ser inferior al número de caracteres de St.

    

Ejemplo: si  St = 'abcedfg' entonces,

 

            Delete(St,2,4)                   =>        Dará a St un valor de 'afg'

            Delete(St,2,10)   =>        Dará a St un valor de 'a'

 

 

 

            Insert (Obj,target,Pos);

 

Inserta la cadena Obj en la cadena Target, a partir de la posicion Pos.

 

Ejemplo: si  St = 'abcdfg' entonces,

 

      Insert('xx',St,3);

            Dará a St el valor de 'abxxcdefg'

 

 

 

            Length(St);

 

Retorna la longitud, en caracteres, de la cadena St.

 

 

            Pos(Obj,Target);

 

Halla la posición de la primera ocurrencia de la cadena Obj en la cadena Target.

 

Ejemplo, si  St='abcdef',

 

      Pos('de',St)           Retorna el valor 4

            Pos('h' ,St)           Retorna el valor 0 (no existe )

 

 

 

            Str (Value, St);

 

Convierte el valor númerico de Value (variable real o entera) en una cadena, y asigna el resultado a St. Por ejemplo, si Value tiene el valor de 1234, entonces

 

            Str (value:5,St);

            dará a la cadena St el valor '1234'

 

 

 

            Val(St, Value, errpos);

 

Este procedimiento convierte la expresión cadena St en un valor entero o real  y  lo asigna a la variable Value (según el tipo de ésta). Errpos es una variable entera, cuyo valor después de realizada la operación de conversión, indicará si hubo error o no en ella (retorna la posición del primer carácter que no fué aceptado en la conversión).

 

            Si St1 = '234', St2 = '12x'

            e  I es una variable real o entera, entonces,

 

            Val (St1, I, errpos);

            Da a I el valor de 234 y a Errpos el valor 0

                                                       

            Val (St2, I, Result)

            Da a I un valor indefinido y a Result el valor 3

 

 

 

El siguiente programa ilustra cómo manipular cadenas aplicando algunas de las funciones vistas. El programa lleva números en base 10 a cualquier otra base y viceversa; ésta es una operación muy usada en diferentes tópicos de la programación de computadores.

 

En este programa se esboza además una función muy útil: elevar a una potencia n; ésta se ha definido usando logaritmos, recuerde que en Pascal sólo existe predefinida la función para elevar al cuadrado.

 

 

program Conversion_Bases;

{$APPTYPE CONSOLE}

uses

  SysUtils;

 

var

   eleccion             : char;

   numero, enbaseN      : string;

   Nbase                : byte;

   errpos, pos,

   modulo, long         : integer;

   decimal              : longint;

 

function simbolo(valor : byte) : char;

var

   cifra : string;

begin

     if valor > 9

        then result := chr(valor + 55)

        else result := chr(valor + 48);

end;

 

function valor(simbolo : char) : byte;

begin

    if ord(simbolo) > 57

       then result := ord(simbolo) - 55  // Alfabetico : 'A' .. 'Z'

       else result := ord(simbolo) - 48  // Númerico : '0' .. '9'

end;

 

function pot(base,exponente : byte) : longint;

begin

    if base = 0

       then result := 1

       else result := round(exp(exponente * ln(base)))

end;

 

begin

    WriteLn('BASES NUMERICAS');

    WriteLn('Transformar de base 10 a base  n    1');

    WriteLn('Transformar de base  n a base 10    2');

    ReadLn(eleccion);

    Write('Numero a transformar : '); ReadLn(numero);

 

    long := length(numero);

    for pos := 1 to long do

        numero[pos] := UpCase(numero[pos]);

 

    case eleccion of

    '1' : begin

             Write('A que base desea llevar ', numero,' ? ');

             Readln(Nbase);

             Val(numero, decimal, errpos);

             enbaseN := '';

 

             repeat

                 modulo  := decimal mod Nbase;

                 decimal := decimal div Nbase;

                 enbaseN := Concat(enbaseN, simbolo(modulo));

             until decimal < Nbase;

 

             enbaseN := Concat(enbaseN, simbolo(decimal));

             Write(numero, ' en base ', Nbase,' es ');

 

             for pos := length(enbaseN) downto 1 do

                 Write(enbaseN[pos]);

          end;

 

    '2' : begin

             Write('En que base se encuentra ',numero,' ? ');

             Readln(Nbase);

             decimal := 0;

 

             for pos := long downto 1 do

                 decimal := decimal +

                            pot(Nbase,long - pos) * valor(numero[pos]);

 

             WriteLn(numero,' en base 10 es ',decimal)

          end;

    else;

    end; // case

 

    ReadLn;

end.

 

 

 

PROCEDIMIENTOS VARIOS

 

 

Además de los anteriores, se tienen los siguientes procedimientos, que son permitidos en Object Pascal:

 

 

            Exit;

 

Termina la ejecución del procedimiento actual y pasa el control por fuera de este. Si el procedimiento actual es el programa principal, Exit causa la terminacion del mismo.

 

 

            Halt;

 

Detiene la ejecución de un programa, retornando al sistema operativo. Puede llevar un parámetro especificando un código de retorno del programa. Si no tiene parámetro, corresponde a Halt(0).

 

 

            Move(Var1, Var2, Num);

 

Realiza una copia masiva directamente en memoria del número de bytes especificados. Var1 y Var2 son de cualquier tipo, y Num es una expresión de tipo word. El procedimiento copia Num bytes desde el primer byte ocupado por la variable Var1, al bloque comenzado por el primer byte de Var2.

 

 

            FillChar(Var, Num, Valor); 

 

Llena un bloque de memoria con un valor -Valor- dado, de tamaño Num bytes, comenzando desde el primer byte ocupado por la variable Var. Var es de cualquier tipo, Num es una expresión entera, y Valor es del tipo Byte o char.

 

 

            Sizeof(Name);

 

Retorna el número de bytes ocupados en memoria por la variable o tipo Name. El resultado es entero.