BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


10. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS I.
10.2. UN PROGRAMA DE EJEMPLO.
10. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS I.
10.2. UN PROGRAMA DE EJEMPLO.
10. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS I.
10.2. UN PROGRAMA DE EJEMPLO.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Un programa de ejemplo.

Para entender estos conceptos básicos y la diferencia entre la programación estructurada haremos un programa que nos permita realizar la suma y multiplicación de dos números complejos, pero con el paradigma orientado a objetos, Para ellos usaremos las etapas vistas en el capítulo 1.4.

Enunciado: "Se desea hacer un programa que nos permita sumar y multiplicar dos números complejos y los muestre por pantalla."
‒ Analisis.

En esta parte se debe definir los tipos de objetos o clases, que intervienen, a grandes rasgos tenemos: El Número Complejo, y la Consola que está compuesta por el teclado y la pantalla, que se implementarán directamente con las rutinas write o writeln y read o readln. Para el tipo de objeto Numero Complejo, debemos definir sus atributos y comportamiento. Con lo cual tenemos lo siguiente:

Tipo de Objeto o Clase Atributos Comportamiento
Numero Complejo ParteReal.- Será el lugar en donde se almacenará la parte real de un numero complejo.
ParteImag.- Será el lugar en donde se almacenará la parte imaginaria de un numero complejo.
ObtReal.- Se encargará de obtener la parte real de un numero complejo.
ObtImag.- Se encargará de obtener la parte imaginaria de un numero complejo.
PonReal.- Se encargará de poner la parte real de un numero complejo en ParteReal.
PonImag.- Se encargará de poner la parte imaginaria de un numero complejo en ParteImag.
ObtCad.- Se encargará de convertir el numero complejo en una cadena de caracteres siguiendo el formato: a+bi.
PonCad.- Se encargará de convertir una cadena de caracteres en el formato a+bi, a un numero complejo.
Adición.- Permite sumarlo con otro numero complejo, reemplazando el actual. Multiplicación.-Permite multiplicarlo con otro numero complejo, reemplazando el actual.
‒ Diseño.

En esta parte se crean los algoritmos que definen el comportamiento de un tipo de objeto o clase, los objetos que se usarán y el algoritmo que definirá la interacción entre los objetos.

Para crear los algoritmos que definen el comportamiento de los tipos de objetos ya definidos en el análisis, usamos los siguientes Pseudocódigos:

Debido a que el enunciado nos pide sumar y multiplicar dos números, entonces se deben definir 3 objetos del tipo de objeto número complejo, Numero01, Numero02 y Resultado. Para la solución del problema, es decir para la interacción entre los objetos, el algoritmo sería el siguiente:

Tipo de Objeto o Clase Comportamiento Algoritmos

Numero Complejo

ObtReal.

Inicio

 ObtReal:=ParteReal

Fin

ObtImag.

Inicio

 ObtImag:=ParteImag

Fin

PonReal (n:double).

Inicio

 ParteReal:=n

Fin

PonImag (n:double).

Inicio

 ParteImag:=n

Fin

ObtCad(dec).

dec, indica los decimales que se quieren usar.

Inicio

 Str(ParteReal:0:dec,aux1)

 Str(ParteImag:0:dec,aux2)

 ObtCad := aux1 + '+' + aux2 + 'i'

Fin

PonCad(n:string).

Inicio

  aux:=n

  ParteReal:=0

  ParteImag:=0

  error:=0;

  if (aux[length(aux)]='i') y (Not(aux[length(aux)-1]in['0'..'9']))

     entonces aux:=Copy(aux,1,length(aux)-1)+'1i'

  Si aux[length(aux)]='i' entonces

    delete(aux,length(aux),1);

    Si aux[length(aux)] in ['0'..'9'] entonces

       i:=length(aux)

       encontro:=falso

       p:=0

       Mientras (no encontro) y (i>1) hacer

            Si aux[i]='+' o aux[i]='-' entonces

                encontro=verdadero

                p=i

            Fin Si

            i=i-1

       Fin Mientras

       PR:=Copy(aux,1,p-1)

       delete(aux,1,p-1)

       PI:=aux

       Val(PR,ParteReal,error)

       Val(PI,ParteImag,error)

       Si error<>0 entonces

           ParteReal:=0

           ParteImag:=0

       Fin Si

    Caso contrario

        Val(aux,ParteReal,error)

    Fin Si

  Fin Si

  PonCad:=error

Fin

Adición(n:NumeroComplejo).

Inicio

 PonReal(ObtReal+n.ObtReal)

 PonImag(ObtImag+n.ObtImag)

Fin

Multiplicación(n:NumeroComplejo).

Inicio

 PonReal((ObtReal*n.ObtReal)– (ObtImag*n.ObtImag))

 PonImag((ObtReal*n.ObtImag)+ (ObtImag*n.ObtReal))

Fin

Inicio
    Numero01.PonReal(4)
    Numero01.PonImag(3)
    Numero02.PonReal(6)
    Numero02.PonImag(2)
    Resultado.PonReal(Numero01.ObtReal)
    Resultado.PonImag(Numero01.ObtImag)
    Resultado.Adicion(Numero02)
    Escribir(Resultado.ObtCad(4))
    Resultado.PonReal(Numero01.ObtReal)
    Resultado.PonImag(Numero01.ObtImag)
    Resultado.Multiplicacion(Numero02)
    Escribir(Resultado.ObtCad(4))
Fin

En los algoritmos, tanto para el comportamiento de los tipos de objetos o clases, y para la solución del problema, estamos usando el punto para referirnos a los métodos que se usan en cada objeto.

‒ Implementación.

En la implementación de nuestro programa se hará uso de la directiva de compilación: {$mode objfpc}, que nos permite usar las opciones de la programación Orientada a Objetos, que ofrece el compilador. Además al usar esta directiva, este incluye por defecto la unidad objpas automáticamente después de cargar la unidad system, una de las consecuencias de incluir la unidad objpas es que el tipo de dato integer tendrá un tamaño de 4 bytes. Hay que tener presente que los parámetros de un método (función o procedimiento) no deben tener el mismo nombre que el atributo de una clase.

La implementación del Ejemplo se hará usando unidades en donde la unidad Complejos.pp, contendrá la definición del tipo de objeto o Clase TComplejo. El programa estará en el archivo SumMul.pp. A continuación, los códigos fuente correspondientes:


Descargar
{$codepage utf8}
{$mode objfpc}

Unit Complejos;
Interface

Type
  TComplejo = class
    ParteReal,ParteImag:double;
    Function ObtReal:double;
    Function ObtImag:double;
    Procedure PonReal(n:double);
    Procedure PonImag(n:double);
    Function ObtCad(dec:integer):string;
    Function PonCad(n:string):integer;
    Procedure Adicion(n:TComplejo);
    Procedure Multiplicacion(n:TComplejo);
  End;

Implementation

    Function TComplejo.ObtReal:double;
      Begin
        ObtReal:=ParteReal
      End;

    Function TComplejo.ObtImag:double;
      Begin
        ObtImag:=ParteImag
      End;

    Procedure TComplejo.PonReal(n:double);
      Begin
        ParteReal:=n;
      End;

    Procedure TComplejo.PonImag(n:double);
      Begin
        ParteImag:=n
      End;

    Function TComplejo.ObtCad(dec:integer):string;
      var aux1,aux2,p:string;
      Begin
        p:='';
          Str(ParteReal:0:dec,aux1);
          Str(ParteImag:0:dec,aux2);
        if ParteImag>=0 then p:='+';
          ObtCad := aux1 + p +  aux2 + 'i';
      End;

    Function TComplejo.PonCad(n:string):integer;
      Var aux:string;
          p,i,error:integer;
          PR,PI:string;
          encontro:boolean;
      Begin
       aux:=n;
       ParteReal:=0;
       ParteImag:=0;
       error:=0;
       if (aux[length(aux)]='i') and (Not(aux[length(aux)-1]in['0'..'9']))
          then aux:=Copy(aux,1,length(aux)-1)+'1i';
       if aux[length(aux)]='i' then
         Begin
           delete(aux,length(aux),1);
           if aux[length(aux)] in ['0'..'9']
              then Begin
                     i:=length(aux);
                     encontro:=false;
                     p:=0;
                     while (not encontro) and (i>1) do
                      Begin
                       if (aux[i]='+') or (aux[i]='-')
                         then Begin
                               encontro:=true;
                               p:=i
                              end;
                       i:=i-1
                      End;
                     PR:=Copy(aux,1,p-1);
                     delete(aux,1,p-1);
                     PI:=aux;
                     Val(PR,ParteReal,error);
                     Val(PI,ParteImag,error);
                     if error<>0 then
                       Begin
                         ParteReal:=0;
                         ParteImag:=0
                       End
                   End;
         End
       else
        Begin
         Val(aux,ParteReal,error);
        End;
       PonCad:=error
      End;

    Procedure TComplejo.Adicion(n:TComplejo);
      Begin
        PonReal(ObtReal+n.ObtReal);
        PonImag(ObtImag+n.ObtImag)
      End;

    Procedure TComplejo.Multiplicacion(n:TComplejo);
      var PR,PI:double;
      Begin
       PR:=(ObtReal*n.ObtReal)-(ObtImag*n.ObtImag);
       PI:=(ObtReal*n.ObtImag)+(ObtImag*n.ObtReal);
       PonReal(PR);
       PonImag(PI)
      End;

End.
Código fuente 1: Unidad Complejos.pp.
Descargar


Descargar
{$codepage utf8}
{$mode objfpc}
Uses Complejos;
Var Numero01,Numero02,Resultado:TComplejo;
Begin
   Numero01:=TComplejo.Create;
   Numero02:=TComplejo.Create;
   Resultado:=TComplejo.Create;

   Numero01.PonReal(3);
   Numero01.PonImag(5);
   Numero02.PonReal(5);
   Numero02.PonImag(2);

   Resultado.PonReal(Numero01.ObtReal);
   Resultado.PonImag(Numero01.ObtImag);
   Resultado.Adicion(Numero02);
   Writeln(Resultado.ObtCad(0));

   Resultado.PonReal(Numero01.ObtReal);
   Resultado.PonImag(Numero01.ObtImag);
   Resultado.Multiplicacion(Numero02);
   Writeln(Resultado.ObtCad(0));
End.
Código fuente 2: Programa SumMul.pp
Descargar

Tal como ya se explicó, la definición de una clase en freepascal es muy similar a la de un registro, con la diferencia de que este permite incluir rutinas dentro de su estructura.

Las clases en una unidad, se definen dentro de la sección de interfaz, y el código de los métodos, se escribe en la sección de implementación.

Al implementar el método de una clase, este se implementa de modo similar a como se implementa una función o procedimiento, pero colocando el nombre de la clase en el nombre de la función o procedimiento, separado por un punto.

En el programa que suma los números complejos, los objetos Numero01, Numero02 y Resultado se definen como variables de la clase TComplejo. Los objetos que se definen en el programa necesitan ser creados, es por ello que se hace uso del método Create, que toda clase tiene por defecto o por omisión. Este método se encarga de crear el objeto para ser usado más adelante en el programa. En realidad un objeto, es un puntero a un objeto que se crea en el montículo, y el método Create se encarga de crear el objeto en el montículo. El método Create se conoce como un constructor.

También se debe tener presente que los métodos de una clase, pueden tener como uno de sus parámetros, a un objeto de la propia clase, en este ejemplo se puede observar que los métodos Adición y Multiplicación, tienen el parámetro n, que es un objeto de la clase TComplejo.

Por otro lado, los atributos no se pueden usar como una variable de control en un bucle For-To-do o For-Downto-do. Si se necesita usar un bucle For dentro de un método, entonces la variable de control del bucle se debe declarar dentro del método, como una variable local o en su defecto usar una estructura Repeat-until o While-do, o declarar un atributo de clase, que son atributos que se comportan como variables globales, esto se verá más adelante. Los atributos no se pueden usar como variables de control debido a que un bucle For, sólo admite una variable global o una variable local para usarlo como una variable de control, y un atributo no es en realidad una variable, si no mas bien es un campo que pertenece a una clase, algo parecido a los registros, en donde los campos de un registro tampoco se pueden usar como variable de control de un bucle For.


Última revisión: 11/12/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.