miércoles, 23 de marzo de 2011

Aplicación

Una unidad tiene una estructura muy similar a la de un programa.

La cláusula uses de la parte de interface sólo es necesaria cuando la unidad actual llame a otras unidades. Todos los procedimientos y funciones en la sección de interface deben ser definidos en la sección de implementación.

La cabecera de los procedimientos y funciones declarados en la parte de interface deben ser idénticos a la cabecera de las mismas funciones definidas en la parte de implementación; sin embargo, es posible escribir la cabecera en forma abreviada en la sección de implementación.

Unit utilidad; (* este nombre de la unidad debe coincidir con el nombre del

     archivo de programa *)

Interface

Uses

   Wincrt, Printer;

Procedure Frase (Texto : String);     

Implementation

Uses

       Printer;

Var

   MiVar : Integer

Procedure Frase;

Begin

   Clrscr;

   GotoXY ((80-Lenght (Texto)) div 2,1)

   Write (texto);

End.

Begin

   MiVar := 0

End.

Una vez que se dispone el código fuente de una unidad, se compila de igual forma que un programa, pero el archivo obtenido no es ejecutable directamente. Tiene la extensión TPU (Turbo Pascal Unit).

Para utilizar esa unidad dentro de un programa, debe incluir una sentencia uses para indiciar al compilador que está utilizando esa unidad.

            ProgramPrueba;

            Uses Utilidad;

Ejemplo:

Escribir una unidad que conste a su vez de un procedimiento para intercambiar los valores de dos variables, así como calcular su valor máximo.

Unit Demo1;

    * Cursos Idiomas Extranjero Estudia inglés, francés, italiano alemán o chino en el extranjero
     

Interface

   Procedure Intercambio (Var I,J : Integer);     

   Function Máximo (I, J : Integer) : Integer;
Implementation

   Procedure Intercambio;

   Var

      Aux : Integer;

   Begin

      Aux := I;

      I := J;

      J := Aux

   End;

Function Máximo;
Begin

   If  I>J then

      Maximo := I

   Else

      Maximo :=J

End;

End.

Una vez que lo haya escrito, guárdelo en disco con el nombre de Demo1.PAS, a continuación, compílelo hacia el disco. El código objeto se llamará Demo1.TPU. Esta unidad la utilizaremos en el siguiente programa:

Program Prueba;

Uses

   Demo1;

Var

      X,Y : Integer;

   Begin

      Write (`Introducir dos números enteros: `);

      Readln (X,Y);

      Intercambio (X,Y);

      Writeln (X,´ `,Y);

      Writeln (`El valor máximo es: `, Máximo (X,Y));

 End.

Unidades en Turbo Pascal

Introducción
Una unidad es un conjunto de constantes, tipos de datos variables, procedimientos y funciones. Cada unidad es como un programa independiente Pascal o bien una librería de declaraciones que se pueden poner en un programa y que permiten que éste se pueda dividir y compilar independientemente. Una unidad puede utilizar otras unidades y posee una parte que puede contener instrucciones de iniciación.

Una unidad contiene uno o más procedimientos, funciones constantes definidas  y a veces otros elementos. Se puede compilar, probar y depurar una unidad independientemente de un programa principal. Una vez que una unidad ha sido compilada y depurada, no necesita compilarse más veces, Turbo Pascal se encarga de enlazar  la unidad al programa que utiliza esa unidad, empleando siempre en esta tarea menor tiempo que en la propia compilación. Los procedimientos, funciones y constantes que se definen en una unidad pueden ser utilizados por cualquier futuro programa que escriba sin tener que ser declarados en el programa.

Las unidades tienen una estructura similar a los programas y en consecuencia requieren un formato estricto, y es preciso declararlas por el usuario como si se tratara de un programa o subprograma.

Turbo Pascal proporciona siete unidades estándar para el uso del programador: System, Graph, DOS, Crt, Printer, Turbo3 y Graph3. Las cinco primeras sirven para escribir sus programas y las dos últimas para mantener compatibilidad con programas y archivos de datos creados con la versión 3.0 de Turbo Pascal. Las siete unidades están almacenadas en el archivo TURBO/.TPL (librería de programas residente propia del programa Turbo Pascal). La versión 7.0 introdujo dos nuevas unidades WinDos y Strings.

Estructura de una unidad

Una unidad está constituida de cuatro partes: cabecera de la unidad, sección de interface (interfaz), sección implementation (implementación) y sección initialization (inicialización).

Formato:

Unit <identificador>

      Interface

      Uses <lista de unidades>;  (* opcional *)

            (* declaraciones públicas de objetos *) 
      Implementation

            (* declaraciones privadas *)

            (* definición de procedimientos y funciones públicos *)

begin

            (* código de inicialización *) (* opcional *)

end

Cabecera de la unidad

La cabecera de la unidad comienza con la palabra reservada unit, seguida por el nombre de la unidad (identificador válido). Es similar a una cabecera de programa, donde la palabra reservada unit reemplaza a la palabra reservada program. Por ejemplo para crear una unidad denominada MiUnidad se ha de utilizar la cabecera de la unidad, así:                     

                                               Unit MiUnidad;

El nombre de la unidad es arbitrario, pero debe coincidir con el nombre del archivo que contiene. Por ejemplo, si la unidad se denomina Test

                                               Unit Test;

El archivo que contiene el programa fuente de la unidad se debe llamar Test.PAS. Cuando turbo Pascal combina la unidad, le asigna la extensión TPU (Turbo Pascal Unit). Si el nombre de la unidad es diferente del nombre del archivo, el programa principal no podrá encontrar el archivo TPU (Turbo Pascal Unit). Si el nombre de la unidad es diferente del nombre del archivo, el programa principal no podrá encontrar el archivo TPU.

Una unidad creada por el usuario puede utilizar otras unidades, siempre que se incluyan en la cláusula uses que aparece inmediatamente después de la palabra interface, y separadas por comas.

Sección de interfaz

La sección de interface (interfaz) es la parte de la unidad que sirve para conectar dicha unidad con otras unidades y programas. Esta sección se conoce como "la parte pública" de la unidad, ya que todos los objetos que figuren en esta sección son visibles desde el exterior o exportables. Las restantes unidades y programas tienen acceso a la información contenida en la sección de interface.

En la interfaz de la unidad se pueden declarar constantes, tipos de datos, variables y procedimientos. Los procedimientos y funciones visibles a cualquier programa que utilice la unidad se declaran aquí, pero sus cuerpos, reales - implementaciones- se encuentran en la sección de implementación. La sección de interfaz indica a un programador cuáles procedimientos y funciones se pueden utilizar en un programa. La sección de implementación indica al compilador cómo implementarlos.

  Ejemplo de declaración

    * Clases de Italiano Aprende o mejora tu Italiano con el Método Conversacional ¡Inscríbete!
      Berlitz.com.mx/ItalianoEnlaces patrocinados

Unit Rayo;
Interface

      Uses

            DOS, Graph, Crt;  (* se utilizan las unidades DOS, Graph y Crt *)

      Var

            a, b, c : integer;

      Function Exponencial (a, b : integer) : real;

      Procedure  Dividir (x, y : integer; var cociente : integer);

Sección de implementación

La sección de implementación es estrictamente privada; su contenido no es exportable. Sólo los procedimientos o funciones que aparecen en la sección interface pueden ser invocados desde el exterior de la unidad. Esta sección contiene el cuerpo de los procedimientos y funciones declarados en la sección de interface.

Unit Rayo;
Interface

            Function Exponencial (A, B : Integer) : Real;

            Procedure Dividir (X, Y : Integer; Var Cociente : Integer);
Implementation             Function Exponencial (A, B : Integer) : Real;             Var

               P, I : Integer;

            Begin

               P := 1;

               For I := 1 to B do

                        P := P * ;

               Exponencial := P

            End;

             Procedure Dividir (X, Y : Integer; Var Cociente : Integer);

            Begin

               Cociente := X div Y

            End;

End.

Nótese que la declaración de una unidad está terminada por la palabra reservada End y un punto.

Sección de iniciación

La sección de iniciación puede contener instrucciones pero también puede estar vacía. Estas instrucciones sirven, por ejemplo, para iniciar variables. La ejecución de estas instrucciones se efectúa en el momento del lanzamiento o ejecución de un programa que utiliza la unidad antes de la ejecución de la primera instrucción del cuerpo del programa.

En la sección de iniciación se inicializa cualquier estructura de datos (variables) que utilice la unidad y las hace disponibles (a través del interface) al programa que las utiliza. Comienza con la palabra reservada begin seguida por una secuencia de sentencias y termina con "end. ".

La sección de iniciación debe llamarse antes de que el cuerpo del programa se ejecute.

Manipulación de datos tipo registro

Acceso a los campos de un registro

Se puede acceder a cada campo de un registro directamente utilizando un designador o selector de campo de la forma:

            NombreReg.NombreCampo

Los datos mostrados anteriormente en Empleado mediante una secuencia de sentencias de asignación:      

            Empleado.Nombre := `Chi-ki-tico´;

            Empleado.Edad := 34;

            Empleado.Domicilio := `Calle El Último Grito´;

            Empleado.Salario := 245320;

Una vez que los datos están almacenados en un registro, se pueden manipular de igual forma que otros datos en memoria.

            Write (Empleado.Nombre); (* Visualiza Chi-ki-tico *)

Operaciones sobre registros

Los procedimientos de lectura y escritura permiten únicamente números caracteres o cadenas. Un registro al ser una estructura compuesta (distintos tipos de datos) es preciso efectuar las operaciones de lectura y escritura individualmente.

Otra operación que se puede realizar entre registros es la asignación (copia del contenido de un registro en otro del mismo tipo). Si A y D son variables registro del mismo tipo, la sentencia:

                                   A := D

copia todos los valores asociados con el registro D al registro A.

Ejemplo:

Type

   Stock = record

                        Numeros : Integer;

                        Nombre : String[20];

                        Precio : Real;

                  end;

Var

   Articulo : Stock

 La sentencia WITH

La tarea de escribir el selector de campo completo cada vez que se referencia un campo de un registro es tediosa, sobre todo si el números es grande. La sentencia WITH permite referenciar el nombre del registro en su cabecera y posteriormente para llamar a algún campo sólo se necesita el nombre del campo y no el selector de campo completo, con el nombre del registro (por ejemplo, Edad en vez de Cliente.Edad).

   Curso Linux básico-medio Nivel certificación, 12 pagos y beca 50% alumnos y profesores
     
Sintaxis:

With Camporegistro do

         Begin

            (* Sentencias que hacen referencia a campos de Camporegistro *)

         End;

Camporegistro: Nombre o nombres de registros.

Sentencias: Relacionadas con los campos.

Ejemplo:

Program Ejemplo;

Type

   Empleado = record

                           Nombre : String [20];

                           Edad : Integer;

                           Empresa : String [30];

                         End;

Var

   Socio : Empleado;

   Deducciones : Real;

Begin

   With Socio do

      Begin

         Readln (Nombre);

         Neto := Salario - Deducciones;

         Writeln (Empresa);

      End;

End. 

Cadenas ("Strings")

Pascal, como cualquier otro lenguaje, debe tener la capacidad de procesar frases como "Presione ENTER para continuar", "Calculando...", "Proceso terminado", etc.

Los datos tipo char y string permiten la manipulación de datos no numéricos.

Una cadena de caracteres o string es una serie de caracteres cuya longitud (número de caracteres que contiene) puede variar de 1 hasta 255 caracteres. Turbo Pascal tiene el tipo de dato string que almacena información de texto. Este dato se puede almacenar en constantes y en variables de cadena. Una variable de cadena está declarada para la palabra string seguida de la longitud máxima de la cadena encerrada entre corchetes.

Declaración de una variable tipo string

Las variables de cadena se pueden declarar las de cualquier otro tipo, ya sea en la sección var o en type.

Si se declara como var, se hace de la siguiente manera:

Var

  Mensaje : string [80];

   Nombre : string [40];

Si la cadena es declarada como type, haríamos la declaración así:

Type

   Cadena80 = string [80];

   Cadena40 = string [40];

Var

   Mensaje : Cadena80;

   Nombre : Cadena40;

Es importante recordar que si se declara como Type inmediatamente después, dentro de las variables, se debe declarar una variable que haga referencia al Type.

Una vez declaradas las variables de cadena se pueden realizar asignaciones o bien operaciones de lectura / escritura en los programas.

Por ejemplo:

Program Ejemplo;

Var

   Mensaje = string[40];

Begin

   Mensaje := `Hola mis amigos, por favor estudien bastante´;

   Write (`Mi mensaje de hoy para ustedes es: `),Mensaje;

   Writeln;

   Write (`Presione enter...´);

   Readln

End.                      
Longitud de una cadena

Una cadena físicamente es una estructura de una secuencia de 0 hasta 255 caracteres de longitud. Sin embargo, la ocupación en memoria de una cadena es un número de bytes igual al de caracteres de la cadena más uno. Así la cadena:

`Programador´

tiene una longitud de 11 caracteres, entonces ocupará en memoria 12 bytes. Esto se debe a que el primer byte en una cadena, contiene la longitud de la cadena actualmente almacenada en memoria.

Cadenas (Strings)

    * Spa para parejas En el DF Consigue Spas para parejas En el DF & otras Ofertas. 50-90% Off!
   

Supongamos que esta palabra corresponde a un dato almacenado en la variable PUESTO que fue definida de la siguiente manera:

Var

      Puesto : String[20];

Sucede que, entonces, la longitud lógica de la variable será de 11 bytes pero la longitud física será de 20 bytes pues así fue definida.
 Asignación de cadenas

A las variables de cadena, como se ha visto, se pueden dar valores con una sentencia de asignación o con una sentencia de lectura (read). Ambas situaciones se pueden describir con la ecuación:

Destino                      fuente

Donde destino es la cadena a la que se da un valor y fuente es la expresión de cadena que contiene el correspondiente valor. Esta ecuación actúa como la sentencia de asignación que evalúa la cadena fuente y se almacena en la variable de la cadena destino.

Dependiendo del tamaño (longitud de la cadena) de las cadenas fuente y destino se pueden presentar tres casos diferentes que analizaremos a partir de la siguiente declaración de variables de cadena.

  Var

      Cad1  :  String [8];

      Cad2  :  String [11];

      Cad3  :  String [15];

      Cad4  :  String [11];

Las longitudes de la cadena destino y fuente son iguales

Supongamos que se ejecuta la sentencia

      Cad2 := `informatica´;

Este caso no presenta problemas, pues cada posición de cad2 se rellena con un carácter.

      Cad2        I           N         F         O         R         M         A         T          I           C         A

                        1          2          3          4          5          6          7          8          9          10       11

Lo mismo sucede si se ejecuta la sentencia

      Cad4 := Cad2;

 La longitud de la cadena destino  es mayor que la cadena fuente

Supongamos que ahora se ejecuta la sentencia

Cad3 := Cad2;

Resultará que Cad3 tiene 15 caracteres y sólo hay 11 caracteres en cad2. La cadena Cad3 seguirá teniendo una longitud máxima de 15 caracteres, pero sólo se almacenan en ella ahora 11 caracteres y su longitud actual será de 11.

      Cad3        I  N F O R M   A T I  C   A                                        longitud actual = 11

                        1 2 3  4  5 6   7 8 9 10 11  12  13  14  15             longitud máxima = 15
 La longitud de la cadena destino  es mayor que la cadena fuente

Supongamos que se trata de ejecutar ahora

Cad1 := Cad2;

En este caso, como Cad1 tiene una longitud de ocho caracteres, la cadena destino no se puede almacenar totalmente. En este caso se trunca la cadena destino y se almacenan en Cad1 los primeros ocho caracteres (de izquierda a derecha) de Cad2.

      Cad1        I  N F O R M   A T                                                     longitud actual = 11

                        1 2 3  4  5 6   7 8                                                     longitud máxima = 8

Parámetros

Un parámetro es un método para pasar información (valores a variables) del programa principal a un procedimiento y viceversa.

Un parámetro es, prácticamente, una variable cuyo valor debe ser ya sea proporcionado por el programa principal al procedimiento o ser devuelto desde el procedimiento hasta el programa principal. Por consiguiente, existen dos tipos de parámetros:

-         Parámetros de entrada: Sus valores deben ser proporcionados por el programa principal.

-         Parámetros de salida: Son parámetros cuyos valores se calcularán en el procedimiento y se deben devolver al programa principal para su proceso posterior.

4.2.2 Transferencia de información desde y/o hasta los procedimientos

Existen dos tipos de procedimientos:

-         Procedimientos sin parámetros: No existe comunicación entre el programa principal y los procedimientos ni viceversa.

-         Procedimientos con parámetros: Existe comunicación entre el programa principal y los procedimientos o entre dos procedimientos.

Ejemplo 1:

(Parámetros de entrada)

Procedure RecuadroDos (N : Integer);

Var

            J : Integer;

Begin

            For J := 1 to  N do

                        Write(`*´)

End;

Ejemplo 2:

(Parámetros de entrada/salida)

El procedimiento Geometria recibe la longitud y anchura de un rectángulo, calcula el área y perímetro del rectángulo y devuelve los valores obtenidos al programa principal.

Procedure Geometria (Longitud, Anchura : Real; Var Area, Perímetro : Real);

Begin

            Area := Longitud * Anchura;

            Perimetro := 2 * (Longitud + Anchura)

End;
 Parámetros actuales y formales

Las sentencias llamadas a procedimientos constan de dos partes: un nombre de procedimiento y una lista de parámetros llamados actuales:

            Nombreproc (pa1,pa2, pa3,...);

Los parámetros actuales pa1, pa2, pa3, ... deben tener unos valores que se pasan al procedimiento nombreproc.

En la declaración de un procedimiento cuando se incluyen parámetros, éstos se denominan parámetros formales o ficticios (pf1, pf2, pf3, ...). Ellos sirven para contener los valores de los parámetros actuales cuando se invoca el procedimiento.

            Procedure nombreproc (pf1, pf2, pf3, ...)

El valor de los parámetros actuales no se conoce cuando se declara el procedimiento, sin embargo, cuando se ejecuta la sentencia de llamada al procedimiento es preciso que tengan valores asignados, ya que en caso contrario se producirá un error.

Program Correspondencia;

Uses Wincrt;

Var

   X,Y,A,P : real;

Procedure Geometria (Longitud, Anchura : Real; Var Area, Perimetro : Real);

Begin (* Geometría *)

            Area := Longitud * Anchura;

            Perimetro := 2 * (Longitud + Anchura)

End;

Begin

            WriteLn ('Introducir longitud: ');

            Readln (X);

            WriteLn ('Introducir anchura: ');

            Readln (Y);

            Geometria (X,Y,A,P);  (* Llamada al procedimiento *)

            WriteLn ('El área es: ', A:6:2);

            WriteLn ('El perímetro es: ', P:6:2)

End.

Ciclos

Es una estructura de control que permite la repetición de una serie determinada de sentencias. Se le llama también bucle o lazo.
El cuerpo del ciclo o bucle contiene las sentencias que se repiten. Pascal proporciona tres estructuras o sentencias de control para especificar la repetición: while, repeat, for.
Nos ocuparemos de estudiar el ciclo FOR y el ciclo REPEAT.
3.4.1 La sentencia FOR
En numerosas ocasiones se puede desear un bucle que se ejecute un número determinado de veces, y cuyo número se conozca por anticipado. Para aplicaciones de este tipo se utiliza la sentencia FOR.
La sentencia FOR requiere que conozcamos por anticipado el número de veces que se ejecutan las sentencias que se encuentran dentro del ciclo.  El ciclo for se incremente automáticamente.
Sintaxis:
For variable := valor inicial to valor final do
       Sentencia;                     
Ejemplos:
1.
For c := 1 to 5 do
      Begin
            Write (`aa´);
            Write (`BB´)
      End;
Al ejecutarse, visualiza:
AaBBaaBBaaBBaaBBaaBB
For Caracter := `A´ to `Z´ do
       WriteLn (Caracter);
3. 4. 1. 1 Decremento del contador FOR (Downto)
El contador del ciclo se puede decrementar de uno en uno en lugar de incrementar. La sintaxis es la siguiente:
For variable := valor inicial downto valor final do
       Sentencia;         
Ejemplos:
For C :=  5 downto 1 do
      Begin
            Write (`C´);
            Writeln
      End;
Lo anterior produce la siguiente salida:
5
4
3
2
1
También podemos encontrar ciclos FOR anidados:
For m := 1 to 10 do
   begin
      For n := 10 downto 2 do
            WriteLn (m,n)
   end;
3.4.2 La sentencia REPEAT
Es una variante de la sentencia while. La sentencia REPEAT especifica un ciclo condicional que se repite hasta que la condición se hace verdadera.

Selección de acciones alternativas

 La sentencia IF

Puesto que las expresiones lógicas toman el valor verdadero o falso, se necesita una sentencia de control que indique a la computadora que ejecute una sentencia en caso de que la expresión sea verdadera y otra sentencia en el caso de que sea falsa. Esto se logra mediante la sentencia IF. El siguiente ejemplo describe su utilidad.

Ejemplo:

Program Numeros;
  Var

    Numero : Real;
  Begin

     Writeln (`Introduzca un número `);

     Read (Numero);

     If   Numero > 0.0 Then
            Begin

                 Writeln (`El número introducido es positivo´);

                 Readln
            End      Else             Begin

                Writeln (`El número introducido es negativo´);

                Readln

            End;

End.
 Sentencias IF anidadas

La sentencia que sigue a la palabra reservada then o else puede ser cualquiera, incluso otra sentencia if - then - else. Cuando existe una sentencia if - then - else dentro de otra sentencia if - then - else, se dice que dichas sentencias están anidadas.

Ejemplo:

Program Mayor;
  Uses

    Wincrt;      

Var

    A,B,C : Integer;

    Elmayor : Integer; 
  Begin

     Writeln (`Digite tres números enteros `);

     Readln (A,B,C);

     If   A > B Then

            If   A > C Then

                 Elmayor := A

            Else

                 Elmayor := C
     Else                     

            If   B > C Then

                 Elmayor := B

            Else

                 Elmayor := C;

    * Fundación Foro Educación a distancia Psicoterapias Cognitivas y Psicología Positiva
   

     Writeln (`El número mayor es: `,Elmayor)

End.
La sentencia CASE

La sentencia CASE se utiliza para elegir entre diferentes alternativas. Una sentencia CASE se compone de varias sentencias simples. Cuando un CASE se ejecuta, una y sólo una de las sentencias simples se selecciona y se ejecuta.

Ejemplo:

Program Cursor;

(* Este programa mueve el cursor a través de la pantalla mediante las teclas predefinidas, cuando se presiona otra tecla, emite un pitido de advertencia*)
  Uses

    Wincrt;      

Var

    X,Y : Integer;

    C : Char;
  Begin

     Clrscr;

      X := 40;

      Y := 10;

      GotoXY (X,Y);

      Write (`*´);

      Repeat

            C := Readkey;

            GotoXY (X,Y);

            Write (` `);

            Case C of

               `S´ : Y := Y - 1;

               `B´ : Y := Y + 1;

               `D´ : X := X + 1;

               `I´   : X := X - 1;

               `P´ :   Exit

            Else

               Write (Chr(7)

            End;  

            GotoXY (X,Y);

            Write (`*´)

      Until C = `P´       

End.