Documente Academic
Documente Profesional
Documente Cultură
HolaMundo.pascal(online):Captulo9
Ms Siguienteblog
Crearblog Acceder
.c
.java
1 8 DE AG O STO DE 2 0 0 7
Captulo 9
.
Problema 3.2
Leer los datos correspondientes a dos circunferencias y luego los datos que corresponden a 10
puntos. Indicar cuantos puntos estn ubicados dentro del rea de cada una de las
circunferencias, cuantos estn en la interseccin, cuantos no estn en ninguna y cuantos
coinciden con el centro de cada una.
Recursos / Download
SZDelphi (por JDownloader)
Instalacin y uso de Delphi
1 Introduccin
2 Operadores
3 Procedimientos y Funciones
4 Corte de Control
5 Arrays
6 Archivos de Registros
7 Estructuras Dinmicas
8 Arboles y Recursividad
9 Teora de Objetos (intro)
EjemplosResueltos
Ahora en Video!
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
1/13
15/10/2015
HolaMundo.pascal(online):Captulo9
los datos de los 10 puntos identificados por sus coordenadas, y por cada punto analizamos si
est dentro de alguna, ninguna o de la dos circunferencias. Incrementamos los contadores que
correspondan y (luego del ingreso de los 10 puntos) mostramos los resultados.
Definimos tambin una funcin procesaCirc que recibe los datos de una circunferencia y los
datos de un punto, evala ese punto respecto de esa cirfunferencia e incrementa los
contadores en caso de ser necesario.
No al blog de Java
Super Baterista
Si hacemos un anlisis de los objetos que intervienen e interactan en el contexto de este
problema podremos identificar los siguiente objetos:
c1, c2 dos circunferencias, cada una identificada por su radio y por su centro
plano el plano que contiene a las dos circunferencias
pi 10 puntos identificados por sus coordenadas
Los objetos tienen atributos. Por ejemplo: c1 puede tener radio=10 y centro en (4, 2)
mientras que c2 puede tener radio=6 y centro en (3,7).
c1 y c2 son dos objetos del mismo tipo (son circunferencias) y por lo tanto tienen los mismos
atributos: un radio y un centro identificado por un par (x,y), pero con diferentes valores.
Decimos entonces que c1 y c2 son objetos de la misma clase o bien son instancias de la misma
clase: la clase Circunferencia.
Sitios Relacionados
PascAlgo (por Lic. Hugo Cuello)
Algoritmia.net
Clases y Objetos
Una clase es un tipo de datos (definido por el programador). Por lo tanto un objeto es una
variable cuyo tipo de datos es una clase.
El siguiente cdigo Pascal define dos objetos c1 y c2 cuyo tipo de datos es la clase
Circunferencia.
var c1,c2: Circunferencia;
En una clase podemos definir datos y operaciones. Los atributos de un objeto son datos y
(siguiendo con el problema) una operacin para la clase Circunferencia podra ser
procesarPunto. Es decir: un objeto circunferencia debera ser capz de recordar su radio y su
centro identificado por las coordenadas (x,y), y de evaluar y procesar un punto en relacin a s
mismo.
uCircunferencia.pas (versin 1, interface)
1:
2:
3:
4:
5:
6:
7:
8:
9:
unituCircunferencia;
interface
usesmath;
type
Circunferencia=class
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
2/13
15/10/2015
HolaMundo.pascal(online):Captulo9
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
private
//atributos
radio:real;
x,y:real;
public
//metodos
constructorcreate(r,cx,cy:real);
functionprocesarPunto(px,py:real):real;
end;
//continuamasabajoconlaseccionimplementation
En el cdigo anterior definimos la clase Circunferencia. Las clases tienen una parte privada
(identificada por la palabra private) y una parte pblica (identificada por la palabra public).
Generalmente los atributos se definen en la parte privada y los mtodos (operaciones
asociadas a los datos) se definen en la parte pblica.
Los mtodos pueden definirse como procedimientos o funciones. Adems existe un mtodo
especial: el contructor.
El Constructor
El constructor es un mtodo especial cuyo objetivo es permitir inicializar al objeto. Es decir:
en el contructor (generalmente) se reciben (como parmetro) los valores con los que se dar
valor a los atributos del objeto.
En otros lenguajes de programacin como C++ o Java el constructor obligatoriamente debe
tener el mismo nombre que la clase. Sin embargo, en Pascal puede tener cualquier nombre.
Simplemente se diferencia de los otros mtodos porque no se define como procedure ni como
function: se define como constructor. En todos los casos nosotros lo llamaremos create.
Por convensin cada clase ser definida en una unit de Pascal que tendr el mismo nombre de
la clase pero anteponiendo el prefijo u. Por eso en este caso la unit es: uCircunferencia.pas
Veamos la continuacin de uCircunferencia.pas donde analizaremos la implementacin de los
mtodos definidos en la clase.
uCircunferencia.pas (versin 1, implementation)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
implementation
//implementaciondelcontructor
constructorCircunferencia.create(r,cx,cy:real);
begin
radio:=r;//dentrodelosmetodostenemosacceso
x:=cx;//alosatributos(variablesde
y:=cy;//deinstanciadelaclase)
end;
//implementaciondelmetodoprocesarPunto
functionCircunferencia.procesarPunto(px,py:real):real;
vard:real;
begin
//siescentro
if((px=x)AND(py=y))thenbegin
procesarPunto:=0;
exit;
end;
//calculoladistanciaalcentro
d:=sqrt(power(pxx,2)+power(pyy,2));
//siestadentrodelareadelacircunferencia...
if(d<=radio)thenbegin
procesarPunto:=1;
exit;
end;
//elpuntocaefueradelarea
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
3/13
15/10/2015
HolaMundo.pascal(online):Captulo9
32: procesarPunto:=1;
33: end;
34:
35: end.
36:
Para escribir la implementacin de cada uno de los mtodos hay que hacer referencia a la
clase en donde el mtodo est definido. Por eso el prototipo se define as (como funcin):
function NombreClase.nombreMetodo(...): tipoRetorno;
o bien (si lo definimos como procedimiento):
procedure NombreClase.nombreMetodo(...);
usesuCircunferencia;
var
c1,c2:Circunferencia;//definimosdosobjetos
radio,x,y:real;
i:integer;
ret1,ret2:real;
contInterseccion,contFueraAmbas:integer;
contDentroC1,contDentroC2:integer;
contCentroC1,contCentroC2:integer;
contFueraC1,contFueraC2:integer;
begin
//inicializamosloscontadores
contInterseccion:=0;
contFueraAmbas:=0;
//...(asicontodoslosquefaltan...)
write('IngreseCircunferencia1(radio,x,y):');
readln(radio,x,y);
//instanciamoslaprimercircunferencia
c1:=Circunferencia.create(radio,x,y);
write('IngreseCircunferencia2(radio,x,y):');
readln(radio,x,y);
//instanciamoslasegundacircunferencia
c2:=Circunferencia.create(radio,x,y);
fori:=1to10dobegin
write('Ingresepunto',i,'(x,y):');
readln(x,y);
ret1:=c1.procesarPunto(x,y);
ret2:=c2.procesarPunto(x,y);
//analizamoslosresultados...
if((ret1<0)AND(ret2<0))thenbegin
contInterseccion:=contInterseccion+1;
continue;
end;
if((ret1>0)AND(ret2>0))thenbegin
contFueraAmbas:=contFueraAmbas+1;
continue;
end;
//:
//asiparatodaslasposibilidades
//:
end;
end.
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
4/13
15/10/2015
HolaMundo.pascal(online):Captulo9
En el programa principal que acabamos de ver instanciamos dos objetos circunferencia (c1 y
c2 en la lneas 24 y 30), luego leemos los 10 puntos e incovamos (por cada punto) el mtodo
procesarPunto en cada una de las dos circunferencias (lneas 36 y 37) e incrementamos los
contadores que corresponda segn los resultados ret1 y ret2.
Variables de Instancia
Los objetos, una vez creados decimos que estn instanciados. Llamamos instancia a un objeto
que h sido creado y (por lo tanto) sus atributos tienen valor. Por este motivo, decimos que los
datos definidos en la clase (atributos y todas las variables que podamos definir) son variables
de instancia. Cada objeto de la clase mantiene valores particulares para cada una de esas
variables.
unituCircunferencia;
interface
usesmath;
type
Circunferencia=class
private
radio:real;
x,y:real;
contCentro:integer;//contadordecentros
contDentro:integer;//cont.dentrodelarea
contFuera:integer;//cont.fueradelarea
public
constructorcreate(r,cx,cy:real);
functionprocesarPunto(px,py:real):real;
//metodosdeacceso
functiongetContCentro():integer;
functiongetContDentro():integer;
functiongetContFuera():integer;
end;
//continuamasabajoconlaseccionimplementation
Mtodos de Acceso
Las variables de instancia que definimos en la clase (en la seccin private) estn
encapsuladas. No pueden ser accedidas por fuera de la clase. Por lo tanto, la nica forma de
tener acceso al valor de las variables es a travs de mtodos de acceso que provea la misma
clase.
Por convensin estos mtodos se deben llamar "get" seguido del nombre de la variable a la
permiten acceder.
En la clase Circunferencia definimos (hasta ahora) tres mtodos de acceso:
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
5/13
15/10/2015
HolaMundo.pascal(online):Captulo9
getContDentro // retorna el valor de la variable contDentro
getContFuera // retorna el valor de la variable contFuera
getContCentro // retorna el valor de la variable contCentro
implementation
constructorCircunferencia.create(r,cx,cy:real);
begin
radio:=r;
x:=cx;
y:=cy;
//loscontadoresdebeninicializarseencero
//elconstructoresunbuenlugarparahacerlo...
contCentro:=0;
contDentro:=0;
contFuera:=0;
end;
functionCircunferencia.procesarPunto(px
,py:real):real;
vard:real;
begin
//siescentro
if((px=x)AND(py=y))thenbegin
contCentro:=contCentro+1;
procesarPunto:=0;
exit;
end;
//calculoladistanciaalcentro
d:=sqrt(power(pxx,2)+power(pyy,2));
//siestadentrodelareadelacircunferencia
if(d<=radio)thenbegin
contDentro:=contDentro+1;
procesarPunto:=1;
exit;
end;
//elpuntocaefueradelarea
contFuera:=contFuera+1;
procesarPunto:=1;
end;
functionCircunferencia.getContCentro():integer;
begin
//simplementeretornamoselvalordelcontador
getContCentro:=contCentro;
end;
functionCircunferencia.getContDentro():integer;
begin
//simplementeretornamoselvalordelcontador
getContDentro:=contDentro;
end;
functionCircunferencia.getContFuera():integer;
begin
//simplementeretornamoselvalordelcontador
getContFuera:=contFuera;
end;
end.
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
6/13
15/10/2015
HolaMundo.pascal(online):Captulo9
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
61:
62:
63:
64:
65:
usesuCircunferencia;
var
c1,c2:Circunferencia;
radio,x,y:real;
i:integer;
ret1,ret2:real;
//contInterseccionycontFueraAmbas
//losmanejamos"amano".
contInterseccion,contFueraAmbas:integer;
begin
//inicializamosloscontadores
contInterseccion:=0;
contFueraAmbas:=0;
write('IngreseCircunferencia1(radio,x,y):');
readln(radio,x,y);
c1:=Circunferencia.create(radio,x,y);
write('IngreseCircunferencia2(radio,x,y):');
readln(radio,x,y);
c2:=Circunferencia.create(radio,x,y);
fori:=1to10dobegin
write('Ingresepunto',i,'(x,y):');
readln(x,y);
ret1:=c1.procesarPunto(x,y);
ret2:=c2.procesarPunto(x,y);
//dentrodelasdos=>estaenlainterseccion
if((ret1<0)AND(ret2<0))thenbegin
contInterseccion:=contInterseccion+1;
continue;
end;
//fueradelasdos
if((ret1>0)AND(ret2>0))thenbegin
contFueraAmbas:=contFueraAmbas+1;
continue;
end;
end;
//pedimoslosdatosalacircunferenciac1
writeln('Circunferencia1:');
writeln('DentrodelArea:',c1.getContDentro());
writeln('FueradelArea:',c1.getContFuera());
writeln('Centros:',c1.getContCentro());
//pedimoslosdatosalacircunferenciac2
writeln('Circunferencia2:');
writeln('DentrodelArea:',c2.getContDentro());
writeln('FueradelArea:',c2.getContFuera());
writeln('Centros:',c2.getContCentro());
//mostramosloscontadoresque"llevamosamano"
writeln('Interseccion:',contInterseccion);
writeln('FueradeAmbas:',contFueraAmbas);
end.
unituCircunferencia;
interface
usesmath;
type
Circunferencia=class
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
7/13
15/10/2015
HolaMundo.pascal(online):Captulo9
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
private
radio:real;
x,y:real;
contCentro:integer;
contDentro:integer;
contFuera:integer;
public
constructorcreate(r,cx,cy:real);
constructorcreate();//sobrecarga
procedureingresarDatos();
functionprocesarPunto(px,py:real):real;
functiongetContCentro():integer;
functiongetContDentro():integer;
functiongetContFuera():integer;
end;
//continuamasabajoconlaseccionimplementation
Sobrecarga
Como podemos ver, ahora tenemos definidos dos constructores. Se llaman exactamente igual
(create) pero reciben diferentes argumentos. El primero recibe 3 parmetros de tipo real,
el segundo no recibe nada. Decimos entonces que sobrecargamos (en este caso) el constructor.
Podemos sobrecargar cualquier mtodo. Esto implica escribirlo ms de una vez pero con
diferente cantidad y/o tipos de parmetros.
uCircunferencia.pas (versin 3, implementation)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
implementation
constructorCircunferencia.create();
begin
//contructornulo...nohacemosnada
end;
constructorCircunferencia.create(r,cx,cy:real);
begin
//:
//todoloqueestaba...
//:
end;
procedureCircunferencia.ingresarDatos();
begin
write('IngreseCircunferencia(radio,x,y):');
readln(radio,x,y);
end;
//:
//acasiguieestandotodoloqueestaba...
//:
end.
usesuCircunferencia;
var
c1,c2:Circunferencia;
radio,x,y:real;
i:integer;
ret1,ret2:real;
contInterseccion,contFueraAmbas:integer;
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
8/13
15/10/2015
HolaMundo.pascal(online):Captulo9
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
begin
//inicializamosloscontadores
contInterseccion:=0;
contFueraAmbas:=0;
//instanciamosyleemos
c1:=Circunferencia.create();
c1.ingresarDatos();
//instanciamosyleemos
c2:=Circunferencia.create();
c2.ingresarDatos();
//:
//acasiguieestandotodoloqueestaba...
//:
end.
El prximo paso ser desligar al programa principal de la responsabilidad de leer los puntos a
mano. Para esto vamos a crear una clase Punto con dos atributos: x,y (sus cordenadas) y con
un mtodo ingresarDatos. Tambin tendremos que sobrecargar el mtodo procesarPunto de la
clase Circunferencia (que reciba dos valores tipo real) para que ahora reciba una instancia
de la clase Punto.
uPunto.pas
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
unituPunto;
interface
type
Punto=class
private
x,y:real;
public
constructorcreate();
procedureingresarDatos();
//metodosdeaccesoalosatributos
functiongetX():real;
functiongetY():real;
end;
implementation
//constructornulo...nohacenada...
constructorPunto.create();
begin
end;
procedurePunto.ingresarDatos();
begin
write('Ingresepunto(x,y):');
readln(x,y);
end;
functionPunto.getX():real;
begin
getX:=x;
end;
functionPunto.getY():real;
begin
getY:=y;
end;
end.
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
9/13
15/10/2015
HolaMundo.pascal(online):Captulo9
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
unituCircunferencia;
interface
usesmath,uPunto;
type
Circunferencia=class
private
radio:real;
x,y:real;
contCentro:integer;
contDentro:integer;
contFuera:integer;
public
//dosconstructures
constructorcreate(r,cx,cy:real);
constructorcreate();
procedureingresarDatos();
//dosprocesarPunto...
functionprocesarPunto(px,py:real):real;
functionprocesarPunto(p:Punto):real;
functiongetContCentro():integer;
functiongetContDentro():integer;
functiongetContFuera():integer;
end;
implementation
//:
//acasiguieestandotodoloqueestaba...
//:
functionCircunferencia.procesarPunto(p:Punto):real;
begin
//invocamoslaotraversiondeprocesarPunto
//pasandolelosvaloresxeydelpuntop
procesarPunto:=procesarPunto(p.getX(),p.getY());
end;
end.
usesuCircunferencia,uPunto;
var
c1,c2:Circunferencia;
p:Punto;//definimosunobjetodelaclasePunto
i:integer;
ret1,ret2:real;
contInterseccion,contFueraAmbas:integer;
begin
//inicializamosloscontadores
contInterseccion:=0;
contFueraAmbas:=0;
//instanciamosc1
c1:=Circunferencia.create();
c1.ingresarDatos();
//instanciamosc2
c2:=Circunferencia.create();
c2.ingresarDatos();
//instanciamosp
p:=Punto.create();
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
10/13
15/10/2015
HolaMundo.pascal(online):Captulo9
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
fori:=1to10dobegin
p.ingresarDatos();
ret1:=c1.procesarPunto(p);//recibeunpunto
ret2:=c2.procesarPunto(p);//:O)
//:
//todoloqueestabasigueestando...
//:
end;
end.
Ahora (para finalizar) intentaremos evitar que el programa principal se ocupe del contador de
puntos que pertenecen al rea interseccin y del contador de puntos que caen fuera de ambas
circunferencias.
La solucin ser crear una nueva clase: la clase Plano. El plano tendr dos circunferencias y la
responsabilidad de mantener los contadores que excedan las atribuciones de las circunferencias
que contiene.
uPlano.pas
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
unituPlano;
interface
usesuCircunferencia,uPunto;
type
Plano=class
private
c1,c2:Circunferencia;
contInterseccion,contFueraAmbas:integer;
public
constructorcreate(circ1,circ2:Circunferencia);
procedureprocesarPunto(p:Punto);
//metodosdeacceso
functiongetContInterseccion():integer;
functiongetContFueraAmbas():integer;
end;
implementation
constructorPlano.create(circ1,circ2:Circunferencia);
begin
//asignamoscirc1ycirc2alasvbles.deinstancia
c1:=circ1;
c2:=circ2;
//inicializamosloscontadores
contInterseccion:=0;
contFueraAmbas:=0;
end;
procedurePlano.procesarPunto(p:Punto);
varret1,ret2:real;
begin
//pasamoselpuntoacadacircunferencia
ret1:=c1.procesarPunto(p);
ret2:=c2.procesarPunto(p);
//incrementamosloscontadoresquecorresponda
if((ret1<0)AND(ret2<0))thenbegin
contInterseccion:=contInterseccion+1;
exit;
end;
if((ret1>0)AND(ret2>0))thenbegin
contFueraAmbas:=contFueraAmbas+1;
end;
end;
functionPlano.getContInterseccion():integer;
begin
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
11/13
15/10/2015
HolaMundo.pascal(online):Captulo9
54: getContInterseccion:=contInterseccion;
55: end;
56:end.
57: functionPlano.getContFueraAmbas():integer;
58: begin
59: getContFueraAmbas:=contFueraAmbas;
60: end;
61: end.
62:
usesuCircunferencia,uPunto,uPlano;
var
c1,c2:Circunferencia;
p:Punto;
pla:Plano;
i:integer;
begin
//instanciamosc1
c1:=Circunferencia.create();
c1.ingresarDatos();
//instanciamosc2
c2:=Circunferencia.create();
c2.ingresarDatos();
//instanciamoselplano
pla:=Plano.create(c1,c2);
//instanciamosunpunto
p:=Punto.create();
fori:=1to10dobegin
p.ingresarDatos();
pla.procesarPunto(p);
end;
writeln('Circunferencia1:');
writeln('Dentro:',c1.getContDentro());
writeln('Fuera:',c1.getContFuera());
writeln('Centro:',c1.getContCentro());
writeln('Circunferencia2:');
writeln('Dentro:',c2.getContDentro());
writeln('Fuera:',c2.getContFuera());
writeln('Centro:',c2.getContCentro());
writeln('FueradeAmbas:',pla.getContFueraAmbas());
writeln('Interseccion:',pla.getContInterseccion());
end.
No hay comentarios:
Publicar un comentario en la entrada
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
12/13
15/10/2015
Entrada ms reciente
HolaMundo.pascal(online):Captulo9
Pgina principal
Entrada antigua
http://holamundopascal.blogspot.mx/2007/08/capitulo9.html
13/13