curso de estructura de datos

Anuncio
PROYECTO DE INVESTIGACION
I Y I1
/
CURSO DE ESTRUCTURA DE DATOS /’
ALUMNA :PZUARA DIAS MARIA ELENA.
.
86324881
ASES0R:LOZANOMORENOHECTOR.
DICIEMBREI990
Cuando en los cursos de programación
se aborda el tema de los Tipos de Datos
Abstractos un problema que enfrentan los
profesores es encontrar un método eficaz
para que los alumnos entiendan y manejen
este concepto.
Una método que emplean la mayoria de
los profesores es el representar l o s
diferentes tipos de datos
abstractos
graficamente.
#
Este trabajo es una herramienta para
facilitar la comprensión, impiementación
y uso de los Tipos de Datos Abstactos.
INDICE
1. CONCEPTOS BASICOS.
1.1. TIPOS DE DATOS.
1.2. ESTRUCTURAS DE DATOS.
1.3. TIPOS DE DATOS ABSTRACTOS.
2. QUE ES EL CURSO DE ESTRUCTURAS DE DATOS.
3. PLANTEAMIENTO DE LAS NECESIDADES.
3.1. LENGUAJE DEL CED.
3.2. EDITOR DE ESTRUCTURAS DE DATOS.
3.3. EDITOR DE TEXTO Y COMPILADOR.
3.4. INTERPRETE.
4. DESARROLLO DEL PROYECTO.
4.1. LENGUAJE.
4.2. EDITOR DE ESTRUCTURAS DE DATOS.
4.3. EDITOR DE TEXTO Y COMPILADOR.
4.4. INTERPRETE.
5. IMPLEMENTACION.
4.1. LENGUAJE.
4.2. EDITOR DE ESTRUCTURAS DE DATOS.
4.3. EDITOR DE TEXTO Y COMPILADOR.
6. FIN DEL PROYECTO.
3
-
1. CONCEPTOS BASICOS*
1.1. TIPOS DE DATOS.
En los leguajes de programacion el tipo de dato es el
conjunto de valores que puede tomar una variable. Por ejemplo en
Pascal :
Tipos Basicos
VAR Ap
:
INTEGER
Ap puede tomar valores del
de los números enteros.
conjunto
VAR Exito
:
BOOLEAN
Exito puede
tomar
los
booleanos TRUE y FALSE
valores
VAR Num
:
REAL
Niim
VAR Car
:CHAR
puede tomar valores del conjunto
de los números reales.
Car puede tomar valores del conjunto
del caracter O al 2 5 5 .
.
1.2.
ESTRUCTURAS DE DATOS.
Las Estructuras de Datos son un conjuntos de variables que
constituyen a su vez una nueva variable. Podemos agrupar las
variables de diversas formas. Un arreglo es una estructura
constituida por una sucesión de celdas (donde las celdas guardan
el valor de un tipo de dato simple o compuesto). Un regitro es una
celda constituida por un conjunto de celdas llamadas campos, l o s
campos de un registro pueden ser de distintos tipos. Si el valor
de una celda se interpreta como la conexión de una celda con otra
se podria decir que es de tipo apuntador.
1 . 3 . TIPOS
DE DATOS ABSTRACTOS.
Una de las caracteristicas principales
de
una
buena
programación es que esta sea modulada y que no resuelva un
problema de manera exclusiva sino que resuelva el problema con
condiciones de entrada mas generales. Una manera para lograr esto
es encapsular parte de un algoritmo de tal forma que este
encapsulado sea la vez un algoritmo para resolver un problema mas
especifico. Si en algun momento se requiere hacer un cambio en la
solución del problema se puede buscar el algoritmo que soluciona
la parte especifica y ahi hacer los cambios.
El usar Tipos de Datos Abstractos es una manera
encapsular ciertas partes de nuestros procesos.
formal de
Podemos decir que un Tipo de Dato Abstracto (TDA) es un
modelo matemático con una serie de operaciones definidas en ese
modelo. Las operaciones de un TDA puede tener como operandos no
solo el TDA definido sino otros TDAs, asi como el resultado no es
siempre un TDA.
Los
TDA son generalizaciones de los
tipos
de
datos
primitivos, al igual que su operaciones son generalizaciones de
las operaciones primitivas.
5
- .
- .
-
u
t
2. QUE ES EL CURSO DE ESTRUCTURAS DE DATOS.
El tema de TDAs generalmente se da en el -Curso de Estructuras
de Datos- por lo que se tomó este nombre para el programa
propuesto.
El Curso de
las herramientas
operaciones en
proporcionar un
ejecución de las
ellas.
.
Estructuras de Datos (CED) debera proporcionar
necesarias para implementar TDAs y depurar sus
forma grafica en un monitor. Tambien debera
interprete capaz de detectar fallas en
la
operaciones y los procesos implementados con
.
#
3 . PLANTEAMIENTO DE LAS NECESIDADES.
.
Para obtener un programa que cumpla con las necesidades antes
descritos se establecieron los siguientes requerimientos que se
deben satisfacer:
.
-Lenguaje propio que permita implementar operaciones con
los tipos de datos mas comunes.
-Editor de Textos que funcione de manera interactiva con
el compilador del lenguaje correspondiente.
.
.
.
-Editor de TDAs para reemplazar el pizarron del salon de
clase donde se representan graficamente las operaciones
de l o s TDAs.
#
-Interprete para
depurar
en
forma
grafica
operaciones codificadas en el lenguaje propio.
-.
6
las
3.1. LENGUAJE DEL CED.
0
.
Para la codificacion
implementara un lenguaje
lenguaje sencillo muy facil
o C ya que la gramatica del
mas comunes.
.
de las operaciones de los TBA se
estructurado propio. Este sera
un
de recodificar a lenguajes como Pascal
leguaje se basara en ellos por ser l o s
0
.
I
.
El CED requiere de una gramatica relativamente sencilla pero
que satisfaga sus necesidades. Las caracteristicas de la
gramatica deberán permitir
- Manejar el Tipo simple
ENTERO
- Manejar las Estructuras de Datos
ARREGLO
MATRIZ
REGISTRO
APUNTADOR
- La recursión de procedimientos y funciones.
- Paso de parametros.
.
- Permitir una buena programacion.
3
3.2.
EDITOR DE ESTRUCTURAS DE DATOS.
,
/
Sera un editor grafico en el que las representaciones de los
Tipos de Datos mas comunes se podrán manejar de igual forma que
sobre el pizarrón de un salón de clases.
Igual que en el salón de clases se podrán ejecutar operaciones
tales como recorres un arreglo, insertar o borrar un nodo sin
necesidad de codificar procedimiento alguno. El editor grafico
debera contar con teclas funcionales que realicen operaciones
especificas como crear un nodo, crear una liga, direccionar las
ligas, y otras operaciones básicas para implementar l a s operaciones
de l o s TDAs, tanto en representacion ligada como secuencia1 (Todas
las operaciones que ejecute el
editor
seran
instrucciones
simples,es decir, que hagan una sola cosa a la vez).
0
.
.
3 . 3 . EDITOR DE TEXTOS Y COMPILADOR.
.
.
.
El CED contara con un Compilador interactivo con un Editor de
Textos. El Editor de Textos debera cumplir con las facilidades mas
comunes en los editores.
Antes de poder interpretar un procedimiento este debe estar
libre de errores tanto semántica como sintácticamente, es por eso
que se considera incluir un compilador (sin generacion de codigo)
interactivo con el Editor.
.
8
.
3.4.
INTERPRETE.
Parte fundamental.
El interprete ejecutara en forma gráfica l o s procedimientos
codificados por el usuario. Si los TDAs estan implementados con
memoria dinarnica (Apuntadores) el interprete detectara si se
pierde alguna conexión.
.
Parte Opcional.
Una segunda parte propuesta para el interprete sera darle la
capacidad de validar las operaciones con TDAs fundametales: En el
caso de que especifique que se trata de un TDA fundamental, cuando
la operación no corresponda al TDA el interprete indicará el
error. El CED contara con un conjunto de operaciones para los TDAs
que se le definan. Cuando se trate de un TDA fundamental buscara
el nombre de cada procedimiento que ejecute en el conjunto y si
el
encuentra
una
operación
del
mismo
nombre
validara
proc-dimiento.
.
Como cada operación de un TDA es un encapsulado no se
validarln las operaciones internas sino el resultado reflejado en
las salidas de las mismas. A continuación se enlistan los TDAs que
se consideran definir en el CED
TIPOS DE DATOS FUNDAMENTALES.
- Lista lineales
Listas ligadas
Listas doblemente ligadas
Pilas
Colas
Colas Dobles
Colas Circulares
- Arboles Binarios
- Colas de prioridad
-_
9
.
...... - -
...
. d._&._..
.. .
.
-
.
-.
. ... ...._
_.
-
.-
--
4 . DESARROLLO DEL PROYECTO*
4.1. LENGUAJE.
Para crear un leguaje primeramente es necesario proponer
.
gramatica que cubra
las
necesidades
establecidas
en
una
el
planteamiento.
GRAMATICA.
Programa
:= PROGRAMA <NomIdent> <DecVar> <ListaDef> <Cuerpo>
DecVar
:=
DeCTipo8
:= TIPO <ListaTipos> / &
UnTipo
:= <IndetTipo> = ARREGLO [ <Numero> ]
<DecTipos> <DecVariables> /
<DecVariables> <DecTipos>
<IdentTipo> = MATRIZ [ <Numero>
<IdentTipo> = <Registro> /
<IdentTipo> = <Celda>
,
/
<Numero> ] /
Registro
:= REGISTRO <ListaVars> FIN
Celda
:= APUNT <ListApunt> FIN
LiatApunt
:= INFO = <NomIdent> ; APUNT = <ListaIdent> /
APUNT
DecVariables
:=
=
<ListaIdent> ; INFO = <NomIdent>
VAR <ListaVars> / ¿B
10
Listavare
Vars
Proced
:=
PROCEDIMIENTO <NomProc> ( <Listparam> )<DecVar>
<ListaDef> <Cuerpo>
Funcion
:=
FUNCION <NumFunc> ( <ListParm> ) : <Tipo>
<DecVar> <ListaDef> <Cuerpo>
ListParm
:=
<Params> / <Params> ; <Listaparm>
Params
:=
VAR Wars> / Wars>
LiataIdent
:=
<NomIdent> / <NomIdent>
Tipo
:=
ENTERO / <IdentTipo>
ListaDef
:=
<Def> <ListaDef> / <Def>
Def
:=
<Proced> / <Funcion> /
Cuerpo
:=
COMIENZA <ListaInst> FIN
ListaInet
:=
<inst> / <Inst> ;
Inst
:=
SI <ExpBool> ENTONCES <CuerpoInst>
.( OTRO <CuerpoInst> ) /
MIENTRAS <ExpBool> HAZ <CuerpoInst> /
REPITE <ListaInst> HASTA <ExpBool> /
PARA <Asignadon> HASTA <Exp> HAZ <CuerpoInst> /
<Instsimples>
,
<ListaIdent>
8
<ListaInst>
.
Instsimples
<NoaiProc> ( <ListaExp> ) /
<Asignacion> / CREA ( <Ident> )
REGRESA ( <Exp> ) / LIBERA ( <Ident> ) /
-
-
Asignacion
<Ident>
<Ident>
ExpBool
NOT ( <ExpBooleana> ) / ( NOT ( <ExpBooleana> ) )
/ <ExpBooleana>
ExpBooleana
<Camp> / <Camp> <Conect> <ExpBoolena> /
( <Camp> <Conect> <ExpBooleana> )
Comp
<Comparacion> / ( Comparacion> )
Comparacion
<Exp> <OperRel> <Exp>
EXP
<Term> <Expl>
Expl
<OperAd> <Term> <Expl> /
Term
<Fact> <Terml>
Term1
<OperMul> <Fact> <Terml> / &
Fact
<Ident> / <NomFunc> ( <ListaExp> ) / <Numero> /
( <EXP> 1
ListaExp
<Exp> / <Exp>
OperRel
< / > / = / <= / >= / #
Conect
& / @
<Exp> / <Ident>
ESNULO ( <Exp> )
NULO /
&
, <ListaExp>
OperAd
:=
- / +
OperMul
:=
*
CuerpoInst
:=
<Inst> / <Cuerpo>
Ident
:=
cSecNombA.> /
cSecNomb.> /
<NomIndet> [ <Exp> , <Exp> 3
<NomIdent> [ <Exp> ] /
cNomIdent>
SecNomb-
:=
<NomIdent> 4
SecNomb
:=
/ /
cNomIdent>
.
h .
<SecNomb>
)
<Ident>
NomIdent
:=
<Letra>cLetrasODigO-> / <Letra>
LetrasODigO-
:=
<Letra> / <Dig> / -
Letra
:=
[A..Z,a..z]
:= [ 0 . . 9 ]
Numero
:= <Dig> / <Dig> <Numero>
IdentTipo, NomProc, NomFunc := <NomIdent>
NOTA:
La Constante NULO y la función ESNULO son validos tanto
Apuntadores como para Enteros.
para
CARACTERISTICAS DEL LENGUAJE.
.
El lenguaje permitira que los tipos definidos se hereden de
un procedimiento a aquellos procedimientos que se definan dentro
de este.
.
Debido a que en el proyecto se intenta motivar a una buena
programacion se considera que no es
recomendable utilizar
variables globales y si es correcto el uso de parametros por lo
que la misma gramatica no permite procedimientos y funciones sin
parametros y al hacer el analisis se considera que las variables
no son hereditarias de un procedimiento a otro (no existen
variables globales, solo locales).
.
#
0
Para facilitar el manejo de la memoria se considera que la
celda inicial de un arreglo es la [ O ] y la final es [Lim-1] y la
inicial de una matriz es la [O,O] y la final es la [Limx-1,Limy-1]
.
Los tipos de variables que podra manejar seran:
-ARREGLOS DE ENTEROS.
-MATRICES DE ARREGLOS.
-APUNTADORES CON UN CAMPO
APUNTADORES.
-REGISTOS.
~
ENTERO
Y
LOS
DEMAS
CAMPOS
4.3. EDITOR DE ESTRUCTURAS DE DATOS.
En el Editor de Estructuras de Datos se pueden representar
tanto estructuras ligadas como secuenciales, un tipo de estructura
a la vez cuando se trate de representaciones ligadas y varios
cuando se trate de representaciones secuenciales.
Las operaciones elementales que
Estructuras son las siguientes:
realiza
el
Editor
de
SECUENCIALES:
- Crear un Arreglo de Enteros de longitud N.
- Crear una Matriz de Enteros de longitud N
*
M.
- Eliminar una Estructura Secuencia1 (Arreglo o Matriz).
- Dar valor a los campos de tipo entero.
LIGADAS:
- Crear n una Celda con na campo para
-
la información
de tipo Entero y con N de tipo Apuntador al mismo tipo
de Celda.
Eliminar un Celda.
Direccionar uno de los Apuntadores de una Celda a
otra.
Poner un Apuntador a NULO.
Dar valor a los campos de tipo entero.
IS
-
--.
I
_
_
_
-
,
_
I
-
4.3.
EDITOR DE TEXTOS Y COMPILADOR.
#
El Editor de textos cuenta con la opcion de Compilado. Para
ei análisis sintáctico y semántico se recurrio ai análisis
descendente recursivo.
4.4.
INTERPRETE.
No Desarrollada.
5 . IMPLEMENTACION.
5 . 1 . LENGUAJE.
#
El lenguaje ya esta definido en l a seccion de DESARROLLO.
Prowrrmri
PROORAMA
NombProu
DeoUrr
C
U
I
r
P
O
D.0Urri
eaT i POS
eoUrrirbler
D
o
C
U r r i r b l I.
DeoTipor
DecUariablesi
Listrurri
L i s trUrrr I
U r r r :
i8trId.n
b
Proordi
P R O C E D I HI ENT
Currpo
LirtaPar~~
ListaDef
DeeriJar
F u n c i on :
FUNCION
NoMFunc
Cuerpo
ListaParM:
nul 1
ParaMs:
Uarr
Li
s taI d e n t 3
ListaParaM
L i s taD e f
i
c urrpm I
cow r m
za
FIN
istrlnrt
L irtrInrti
nul 1
__
Inste
PA R A
Clrianraion
Cuorpo I n st
ENTONCES
ExpBool
MIENTRAS
Exp
HñZ
ExpBool
LirtrInrt
Instsimplo.
I
1'
E
x
pBool
A
CurrpoInst
null
'
CuorpoInst
I n s t s 1 m p l 0s i
ListrExp
REGRES A
I
fisirnroion
>
3
1
I
ExpBoolornrr
COMP
Conmot
EwpBoolmrna
3
Coneat
COMP
<
E X P
Exp
0pmrRo1
EXP
Expr
Expí
T e r M
Expí:
Expí
OperFSd
Cis i wn &ai
on
I
Idont
I
ESNULO
ExP
N U L OI
Ex]
C
w
w
A
.
L i st r T i p a s :
127992
I
IdmntTipo
MCITRIZ
NUMOP0
REGISTRO
CIPUNT
ListrUrrs
FIN
L i 8 t Flpun t
FIN
1
CIRREQLO
Tipo:
IdrntTipo
ENTERO
TerMí:
Opcrilu 1
Fact
TerMi
nul 1
Fact:
c
NoMFunc
Nu~oro
istaExp
I d e n t INUMerO
ListrExpi
\
21.
Lirtfipunfi
N O MI d o n t
NoMIdent
LirtrIdont
RPUNT
Li
I trD O f
INFO
I
nul 1
P r o c e d I Funcion
I
I Proced
ExpBooli
NOT
ExpBooleana
>
ExpBooleana
ExpBooleana
Numoroi
OporRol
I
< I> I =
/ < =>
I =#I
Conect:
r
n
OperFSd:
I Funcion
-
I
CurrpoInrt:
Idrnt:
nul 1
i
N O MI dmn t
Exp
h.
3
NomIdrnt
A.
Nowbidant:
Lrtrr
Letra/Dii/-
Letra:
Diu:
nul1
t
5 . 2 . EDITOR DE ESTRUCTURM DE DATOS.
.
Se codifico en Pascal con la version 5 . 5 . de Borland.
Programa ejecutable : CEDGTDAS.
Unidades Utilizadas :
Comunes a Estructuras Ligadas y Secuenciales
HerrCons
HerrGral
GrafTipo
GrafCapt
GrafColor
GrafEdit
GrafHerr
GrafMarco
Manejo de Estructuras Ligadas
GrafNEdit (Unidad Principal)
GrafNList
GrafNMve
GrafNodo
Manejo de Estructuras Secuenciales
GrafSEdit (Unidad Principal)
GrafSArr
GrafSList
GrafSMve
24
Estructuras de datos usadas en e1
Editor Graf ico ( de Estructuras 1 igadas 1
I
I
I
I
7-
I
I
I
1
r'
1 A r N o d o IAPNodo I[ A p N o d o IA p N o d o IIApNodo IApNodo
I
I
I
I
I
I
F o m a en
que
se ue en pantalla
26
Estructuras de datos usadas en el
Editor Gral ico (de Estructuras Secuenciales 1
I
i
-r
. crui mn t o
[ Realizado por Azuara oiaz Maria Elena.
)
[
Curso de Estructuras h Datos.
Editor de Estructuras de Datos.
Cuerpo principal del Editor
}
USES
p.29
P.39
P 42
P 59
Graph,GrafTipo,HerrCons,GrafMarco,GrafNEdit,GrafSEdit;
var
Reg : Regcar;
~it~ap,~i,~2,~:
3 ,pointer;
PQ
Cod : integer;
BEGIN
{ CUERPO PRINCIPAL }
- 2 * x P i n i ) div 5;
MaxC := (Oetnaxx - 2*xPini) div 5;
GetWm(BitMap,ImageSize(1,1,10,10));
Reg.TDA := 2;
REPEAT
i f Reg.TüA = 1 then
MaxL := (GetwawY
Edicionti(BitHap,Pl,P.?,P3,P4,Cod,~)
else
EdicionS(BitHap,Pl,PZ,P3,P4,Cod,R.g);
ESC;
UNTIL Cod
-
CloseGraph;
Em.
( CUERPO PRINCIPAL )
28
UNIT
HerrCons;
CONST
E n t e r * 13;
C E n t e r = 10;
tab
=
Eec
Home = 2771;
Up
= 2772;
D m
= 2780;
End-
R i g t h = 2777;
Left
= 2775;
= 2783;
Pgüp
= 2773;
Backspace =
8;
Cñack
=127;
STab
=2715;
= 2779;
Ins = 2782;
Del
9;
= 27;
PgDn = 2781;
Ciiome = 27119;
CPgüp = 27132;
CPgDn
= 27118;
CEnd-
C R l g t h = 27116;
CLeft
= 27115;
= 27117;
-
F1 = 2759;
F2 = 2760;
F3 = 2761;
F4 = 2762;
F5 = 2763;
F6
E7 = 2765;
F8 = 2766;
F9 = 2767;
FlO= 2768;
F11= 2787;
F12= 2788;
SF1= 2784;
SF2= 2785;
SF3= 2786;
SF4= 2787;
SF5-
2788;
SF6= 2789;
SF7= 2790:
SF8-
2791;
S I 9 = 2792;
SFlO= 2793;
CF4= 2797;
CF5= 2798;
CF6= 2799;
W5= 27108;
Ap6= 27109;
CF1= 2794;
CF2= 2795;
CF3= 2796;
CF7= 27100;
CF8= 27101;
cP9= 27102; CFlO= 27103;
27104;
AF2= 27105;
AF3= 27106;
ñF7= 27110;
AF8= 27111;
AF9-
AFl-
I M P m N T A T f ON
AF4- 27107;
27112; AFlO= 27113;
2764;
.
UNIT HerrGral;
INTHiFACE
USES
Crt:
{
LeeCar : Regresa el codigo correepondle+n+e a l caracter e l
UM
t e c l a funcional de lo contrario l e sumo
98
que no
es
un 2700.
No despliega en pantalla el caracter.
PROCEDURE LeeCar(var car : char; var Codigo : integer);
[ Mensajes : Manda e s c r i b i r una cadena a p a r t i r de
la posicion ( x , y )
de una pantalla en modo texto
PROCEDURE Meneajea(Mens : string; x , y : integer);
{ ValStr : Considera
como cadena valida hasta ant-
de un espacio en blanco
}
F'üNCTIüN ValStr(Cad : s t r i n g ) : string;
{ Valor : Convierte e l procedimiento VAL
para un entem en Funcion
1
FUNCTION Valor(Cad : s u i n g ) : integer;
{ Caden : Recibe
un numero entero y l o regresa en
UM
cadena
1
FUNCTION Caden(Va1or : integer) : string;
{ PoiBig : E l siguiente pmcadimimto encuentra l a poslclón dm
en un renglbn tal que esa posición a-
un frame
mayor que <k?osAnterlor>
1
PUIiIcTIüii PoiSlg(Po.Antarior : integer; F r a w , R a g l o n : atring) : i n t q a ;
IWLEiSWi'ATION
UNIT GrafPipo;
{ Realizado por Azuara Diaz Maria Elena.
1
{ Curso de Estructuras de Datos.
Editor de Estructuras de Datos.
Definicion de l a s Estructuras empleadas en e l Editor.
}
INTERFACE
CONST
TamInfo = 12;
XPini
= 50;
{ Para Estructuras Ligadas }
AnchNodo= 4;
TamLiga.= 2;
TYPE
1
Para Estructuras Ligadas }
ApLista = -List;
RegInfo = Record
Dato
: integer;
Ligas : pointer
End;
List
= Record
x,y
: integer;
Sig
: ApLista;
NHs
: integer;
Info
: RegInfo
End;
ApCamN
= -CaminoN;
CaminoN = Record
Apx : ApLiata;
Apy : ApCamN
End;
( Para Estructuras Secuenciales }
~ p ~ a i =a -Camines;
~
Caminos = Record
P : pointer;
xp,yP : integer;
Tamx,Tamy : integer;
127992
Prev,Sig : ApC-;
End;
{
Para Todas las Estructuras }
RegCar = Record
xini,yini : integer;
CASE TDA : integer of
1
{Nodos)
: (Incx,Incy,üs,Lado : integer);
2,3 { Secuenciales } : (Elem : ApCam8);
End;
VAR
MaxL,MaxC : integer;
IMPLEMENTATION
32
. -..- .-
..
-
I--._.-
. . ..
..
- ..
..
. - . ---,_ . . . .
... ....___I_._.
-_.. -_
.
..
..
UNIT GrafCapt;
{ Realizado por Azuara Diaz Maria Elena.
}
{ Herramientas generales en modo Grafico.
)
{ Esta Unidad trata de manejar
el modo g r a f i c o de manera similar a l
texto para escritura y ventanas
1
INTERFACE
USES
HerrGral,HerrCons,EdTipos,Graph;
var
wherexG,
where-
: integer;
{ Variables que simularan
las funciones en modo
{ texto wfIEREx,w"IGy
}
}
Const
GrafColn<t = 10;
{ Todo
los procedtmientos
aqui
implwmntados
}
{ consideran l a pantalla con dimensiones:
{ GetnairX div GrafCol<t,GetMaxY
div GrafColTxt
{ y l a s coordenadas que manejan coaideran l a
{
{ GrafMens :
}
}
columna y e l renglon de <GrafColTxt> pixeles
Escribe un mensaje <mag> en l a s coordenadas (x,y) que en
pixeles serian (x*GrafColM,y*GrafColTxt)
y pondra una
l e t r a por columna y renglon
Si e l tamaño d e l mensaje es menor que <Tam> entonces completara el tamailo con espacios en blanco.
Cuando s e escribe borra l o que este anteriormente
<Color> : Para borra l o que quede debajo d e l tuocto es
necesario especificar e l Color de fondo
1
PROCEDURE GrafMens(msg : string; x,y,Tam,Color
: integer);
{ GrafCaptura : Captura una cadena cRenglon> en modo grafico (permite e l
uso de l a s teclas Ins,Del,BackSpace,ñlgth,Left
y teU3lina
l a captura con cualquier otra tecla funcional.
cCodigo> e s e l codigo de l a tecla con que termino.
<x,y> son l a s coordendas (No pixeles)
<Tipo> indica de que t i p o sera e l resultado &tenido
O : Cadena s i n blanco
(No p r i m i t e Capturar Blancos)
1 : Cadena
(Sin r e i t r i c c i o n e i
33
1
.
2 :
3 :
Entero
Red
(Solo permite Digitoil
(Solo digitoe y
'.*
cColor> es el Color de fondo
FUNCTION GrafCaptura(Reng1on : string; var Codigo : integer; x,y,Limx,Tipo,Color : integer) : string;
(
GrafAbreVent : Guarda en cP> la parte de la pantalla delimitada por
(x,y),(xZ,yZ)
cuando <Abre, es verdadero y Rscupera esa
misma parte de pantalla y libara cuando abre es falso
}
PRCCñDURE GrafAbreVent(Abre : boolean; x,y,x2,y2
: integer; var P : pointer);
IMPLEMENTATION
34
UNIT GrafColor;
USES
Graph,GrafCapt;
( Realizado por Azuara Diaz Maria Elena.
)
( Curso de Estructuras de Datos.
)
{
Esta Unidad tiene los procedimientos para averiguar si es monitor a color
o de dos colores
USA El Archivo CEDColor.CED.
Estos procedimientos se deben ejecutar en mod0 grafico.
}
{ Altacolor : Pregunta S i el monitor es monocromatico
y regresa l a respuesta
en <EaMono>.
1
PROCEDURE AltaColor(var ESMOnO : boolean);
{
BuscaColor : Busca en el archivo
entoces pregunta
si
es mono y a i no encuentra el arch.
1
PROCEDURE BuscaColor(var EaMono : boolean):
IMPLEHE~ATION
35
.
UNIT GrafEdit:
[ Realizado por Azuara DiaZ Maria Elena.
1
(
curso de Estructuras de Datos.
Editor de Estructuras.
Procedimientos comunes para l a Edicion de Estructuras Ligadas (Nodos) y
Secuenciales.
)
INTERFACE
USES
HerrCons,HerTGral,crt,Graph,GrafHerr,GrafCapt,GrafTipo;
TYPE
Arreglo = array [0..10] of string;
( CapturaOpc : Es un procedimiento que permite seleccionar un numero de
opcion copcion>.
<Arreglo> contiene la lista menscijeri de las posibles opciones.
<Tam> es el numero de opciones posibles ( 1 e= Opcion c= Tam)
Las teclas de movimiento de cursor (flechas) permiten cambiar
el numero de opcion ya sea un numero arriba o abajo y se
desplegara el mensaje de la opcion siempre en las coord (x,y)
Para terminar l a captura se debe usar F1 o ESC y regresara el
numero de opcion que este actual y el codigo de escape <Cod>
)
PROCEDURE Capturaopc(var Opcion,Cod : integer: x,y,Tam : integer; Arr : Arreglo);
{
PideInfo : Captura un entero, mandando el mensaje : CMüG>+'[
19
l a s coord (x,y).
Regresa el entero en <Info> y el codigo de escape en <Cod>.
Para terminar de capturar el dato se debe usar EUl'Eñ o E X .
PROCEDURE PideInfo(MSG : string; var Cod,Info : integer;x,y : integer);
( InicRegCar :
TDA
S i
-_
determina la estructura que se esta manejando
TDA = 1 (Nodos)
: Numero de ligas que tiene el nodo ( := <Es>)
Reg.Hs
Reg.Lado : S i Lado = -1 se pintaran las ligas del lado i z q .
S i Lado
=
1 s e pintaran laa l i g a s d e l lado der.
S i Lado
=
O tendran que ser Hs = 2 y se pintaran
las l i g a s una de cada lado.(
:= <Lado>)
Reg.Incx : Es e l desplazamiento que hara e l cursor para moverse
de un elemento a otro en e l mimo renglon.
Siempre y
cuando e l desplazamiento no se este haciendo de solo
una columna.
Reg.Incy : Es el desplazamiento que hAra e l cursor para moverse
un renglon
S i TDA = 2 , 3 ( Arreglos o Matrices )
Reg.Elem
: Apunta a l elemento en que se esta posicionado por lo
que s e debe i n i c i a l i z a r Nulo
Tambien tiene e l control para l a pantalla
Reg.yini,
Reg.xini : Como s e p u d e recorrer l a pantalla hacia l a izq. y
hacia a r r i b a x i n i y yini indican e l numaro de columna
y renglon en e l que supuestamnte empieza l a pantalla
(los i n i c i a l i z a en 1 )
PROCEDLlRE Inicia~izaRegCar(TüA,€is,Lado
: integer;
var Reg : RegCar);
{ InicVar : I n i c i a l i z a los paramentros en 1
}
PROCEDURE InicVar(var x,y,Inc : integer);
{ DefineEstruc :
Manda l o s m n s a j e s para preguntar s i se cambia de
estructura Ligada a secuencia1 o visceversa
TDA =
1 Se considera Ligada
TDA <> 1 Se considera Secuencia1
Captura TDA terminando con ESC,ENTER o F1
}
PROCEDURG DefineEstruc(var
TDA : integer);
PROCEDURE MensError(Error : s t r i n g ) ;
IMPLJMENTATION
Gramerr;
UNIT
{
Realizado por Amara Diaz Maria Elena.
1
{ Curso de Estructuras de Datos.
Editor de Estructuras de Datos.
Herramientas generales.
)
{ Aqui estan los procedimientos
m6a generalee: los que pasan de coord.
en pixeles a columna ó renglón ( y viseversa),
e l que regresa l a s coord. del extremos superior i z q . de
un nodo
y un proced. que devuelve el tamaiio de un nodo dependiendo de
e l número de l i g a s .
}
INTERFACE
USES
GrafTipo.Crt;
{ CoordPant : Recibe una columna o renglón cCoord> y l a columna o renglón
i n i c i a l en pant. c I n i > y retorna l a coordenada correspondiente
en pantalla a esa columna o renglón
1
FUNCTION
CoordPant(Coord,Ini : integer) : integer;
{ CoordColRen : Recibe una cCoord> en pixeles y l a columna o reng16n i n i c i a l
en pant. < I n i > y retorna l a columna o el renglón correspondiente
a esa coordenada.
}
FUNCTION
CoordColRen(Coord,Ini : integer) : integer;
PRCCEDURG CoordNodo(Col,Linea,Incx,Incy : integer; var x , y : integer);
FüNCTION
TamNodo(H8 : integer) : integer;
{ ActCoord : Cuando
el cursor ya no corresponde a l a s coordenadas visibles
en pantalla actualiza l a coordenada de i n i c i o en pantalla
o sea l a columna y l a l i n e a a p a r t i r de donde se cadenza a
dibujar
PROCH)URG
ActCoord(x,y : integer; var Reg : RegCarl;
IMPLEMENTATION
UNIT GrafMarco;
{
Realizado por Azuara Diaz Maria Elena.
)
{ Curso
de Estructura de Datos.
Editor de Estructuras de datos.
Herramientas para el Editor de Estructuras
)
{ Aqui
se encuentra el procedimiento que inicializa el modo gráfico.
1
{
Tiene los procedimientos que manejan el marco de la pantalla del
editor de estructuras
{
Tiene el Get y Put del cursor
)
INTERFACE
USES
GrafColor,HerrGral,Graph,GrafPipo,GrafCapt,GrafBerr;
{
Como cuerpo principal de esta unidad.estala inicializacion del modo
grafico (Inicializa) y
la
verificacion del Color del monitor (BuacaColor)
)
{
Inicializa : Inicializa el modo grafico.
)
PROCEDURE Inicializa;
{
IniDraw : Incializa el modo para el trazo
k
PROCEDURE Inibraw(Color,LineStyle,Pattern,Thicknems: word):
{
GetMarco : Gurda pedazos de pantalla que serian las cuatro partes
exteriorea del cuadro donde se editan los !rDAn (Marco
que no cambia).
P1 = Parte Superior
P2 Parte Inferior
P3 = Parte Lateral Izquierda
P4 Parta Lateral Derecha
-
39
.
...
.
-ucI
.
-
-P
A-
. .. ... - _.”._-
-
- . ..-
. .
.
_-. .-
. .. ,
‘
I
PROCEDURE GetMarco(var Pl,P2,P3,P4 : pointer);
{ PutMarco : Recupera en pantalla
el marco que esta guardado en los P i
1
PROCEDURE PutMarco(var Pl,PZ,P3,P4
{ FreeMarc0 : l i b e r a
: pointer);
los Pi's
1
PROCEDURE FreeMarco(var Pl,PZ,P3,P4
{
arco
: pointer);
: Pinta un marco en e l que vienen l a s instrucciones para editar
un TDA.
S i ya s e llamo este procedimiento es necesario l i b r e r a l o s P i
antes de mandarlo llamar nuevamente.
ccasoz indica si se t r a t a de Mensajes de una estructura ligada (=i)
o una estructura secuencia1 ( < > 1 ) .
Los mensajes para cada caso ya estan definidos dentro d e l
procedimiento.
Los Pi's guardaran e l marco con un Cgetmarco> despues de pintar
loa mnsajes y un recuadro.
}
PROCEDURE Marco(var Pl,P2,P3,P4 : pointer; Caso : integer);
{ Get : Guarda en <BitMap> el pedazo de pantalla donde se pondra el cur801
(x,y) son l a s coordendas d e l cursor pero hay que pasarlas a coord
de pantalla restando ( x i n i , y i n i )
PROCEDURE Get(x,y,xini,yini
{ Put : Recupera l o que
: integer; var BitMap : pointer);
tenia l a pantalla antes de poner el Cursor
1
PROCEDURE Put(x,y,xini,yini
: integer; v a r BitMap : pointer);
{ Cursor : Dibuja un cursor.
( x , y ) son las coordendas d e l cursor pero hay que pasarlas a coord
de pantalla restando ( x i n i , y i n i )
1
PROCEDURE Cursor(x,y,xini,yini : integer);
-_
{ GetCursor : Guarda la imagen del lugar a donde se posicionará el cursor
cx,yz y lo dibuja. (Procedimientos Get y Cursor)
)
PROCEDURE GetCursor(var BitMap : pointer; x,y,xini,yini
(
: integer);
Cuadro : Pinta un rectangulo relleno en las coordenadas (x,y),(xl,yl)
}
PROCEDURE Cuadro(FillColor,Pattern: word; X,y,Xl,yl: integer);
{
DibInfo : Pinta l a informacion <Dato> del Elemento en l a s coord. (x,y)
I
PROCEDURE DibInfo(Dato,x,y : integer);
IMPLEMENTATION
41
UNIT
GrafNEdit;
{ Realizado
por Azuara Diaz Maria Elena.
k
de Estructuras de Datos.
Editor de Estructuras.
Procedimiento para l a Edicion de Estructuras Ligadas (Nodos)
( Curso
1
INTERFACE
USES
HerrCons,HerrCral,crt,Graph,GrafBdit,GrafCapt,GraPTlpo,GraMerr,GrafMarco,
GrafNMve,GrafNodo,GrafNList;
PROCEDURE EdicionN(var BitMap,Pl,PZ,P3,PI : pointer; var
(
Edicion de
Cod :
integer; var Reg : Regcar);
!KIM Ligados
)
PROCEDURE EdicionN(var BitMap, U,PZ,P3,PI : pointer; var Cod : integer; var Reg : Regcar);
(
Edicion de TDAa Ligados
}
var
x,y,
Inc : integer;
PROCEDURE:InicVarParaNodoe(var
{
Cam : ApCamN; var Reg : Regcar; La&,Bs
var NodoIni,NodoPin : ApLista);
Eatds variables son usadas por e l editor de emtructuras ligadas
1
BEGIN
Numtlijo :- O;
NodoIni := Nil;
NodoFin := Nil;
Cam := Nil:
InicializaRogCar(~.n>A,La&,Ei,~)
END;
42
: integer; var NumIlijo : integer;
PñüCEDURE Reinicia(ALigas,ALado : integer; var x,y,NucBijo : integer; var Reg : RegCar;
var NodoIni,NodoPin : ApLista; var Cam : ApCamW);
{ Da
valores iniciales a
todas
las variable
l
BEGIN
HazNulo( Cam) ;
InicVar(x,y,Inc);
InicVarParaNodos(Cam,Reg,ALigas,AL~o,NucBijo,N~oIni,Nod~in);
clearviewport;
PutMarco(Pl,PZ,P3,PQ);
GetCursor(BitMap,x,y,Reg.xini,Reg.yini)
END;
PIEOCEDURE MueveCursorN(var x.y,Inc : integer; var Reg : RegCar; Cod : integer; var Cam : ApCamN);
{
Dependiendo de l a tecla de movimiento (<Cod>)actualiza el valor de
cx> o de cy> sumandole o restandole un valor el cual se determina por CIno. Estructuras Ligadas
1
var
Aw,Auy : integer:
PROCEDURG Actcursor (var x,y,Inc : intqer; var Reg : RegCar; Cod : integer; var Cam : ApCam);
{
Dependiendo de l a tecla de movimiento (<Cod>) actualiza el
valor de ex> o de <y> sumandole o r-tandole un valor el cual
se determina por a n o .
1
var
Despx,Despy : integer;
PROCEDURE DeapActual(var Inc,Despx,Despy : integer; var Reg : RegCar);
{
Si < I n 0 = 1 entonces el dosplazamineto ser6 de una sola
columna o renglon, de lo contrario sora de nodo a nodo
1
ñEOIN
i f Inc = 1 then
BEGIN
~ e a p x:= rmg.Ino<;
Deapy := Reg.Incy
END
else
2t3
.
....
c
-.. .
-
- --e.-
. ..
....
.
. . .-
-
-
1
-
.
-
--_-.__
--_-
1_
_._._
.
BEGIN
Daepx := 2;
Daepy := 2
END
END;
{ ACT CURSOR )
BEGIN
DespActual(Inc,Despx,Despy,Reg);
CASE Cod of
Rigth : x := x + Despx;
Left : if x > Despx then X := X - Despx;
Up
: if y D Despy then y := y - DeSpy;
Down : y := y + Despy;
END;
END;
{ ACT CURSOR }
BEGIN
{ MUEVE CURSOR N 1
A w := x ;
luy := y;
Actcursor (x,y,Inc,Reg,Cod,Cam);
CursEnPantN(Aux,Auy,x,y,Reg,Cam,BitMap,Pl,PZ,P3,P4)
END;
{ MUEVIS CURSOR N }
PROCEDURE
{
InsertaNodo (var x,y : integer; var ñeg : RegCar; v a r Cam : AS-);
Entran las coordenadas donde se encuemtra el cursor <x,y>, los
datos necesarios para crear y dibujar un nodo (Sin ligas) <Ha,
Lado,TDA = Reg> y El apuntador a todos los nodos <Cam.
Busca las coordenadas en las listas y s i no estan entoncem lo crea.
t
var
Lista
Dib,EnC
:
ApCamN;
: boolean;
FUNCTIOFI InsertaEnLista(var Lista : ApLista; Posx,Pory,Hs : integer) : boolean;
var
Nodo : Aptista;
Enc : boolean;
BEGIN
AntLocX(Poax,Lista,Nodo,Enc);
i f Enc then
InsertaEntieta := falw
else
BEGIN
InwrtLista(Nodo,Lista,Posx,PoPyrB.);
InS.rtaGnLi6ta
:= true
END
END;
PROCEDURE:CursoryNodo(var x,y : integer; Reg : RegCar);
el cursor de l a posición donde se encuentra.
Dibuja el nodo y pone el cursor en el extremo superior izquierdo
del nodo
[ Quita
}
BEGIN
Put( Y,y,Reg.xini,Reg. yini,BitMap) ;
Dimodo( OiX,Y,Reg);
if (Reg.xini > x) or (x + TamWodo(Reg.Hs) > Reg.xini + MaxC 1 )
(Reg.yini > y) or (y + AnchNodo > Reg.yini + MaxL - 1) then
PutMarco(Pl,PZ,P3,P4);
-
OX
GetCursor(BitMap,x,y,Reg.xini,Reg.yini)
END;
BEGIN
[ INSERTA NODO }
Dib := true;
AntLocY(y,Cam,Lista,Enc);
i f Enc than
i f Lista
Nil then
Dib := InsertaEnLista(Cam-.Apx,x,y,Rog.Ea)
else
Dib := InsertaBntista(Liita^.Apy^.Apx,x,y,Reg.Es)
else
InaertCam(L i s t a , Cam,x,y,Reg .Hs ) ;
i f Dib then
-
CursoryNodo(x,y,Reg)
else
ninsError('Ya Exiitm Nodo En Esta Poiicion');
END;
[ INBEIITAMXXI}
PROCEDUR~ ~liminamdo(var x,y : integer; Reg : Regcar; vaccarti : A S H ;var NI,NF : A p L i i t a ) ;
{
Entran la8 coordenadas donde se encuontra el curnor <x,y>, loci
datos neceurioci para eliminar y borrar un nodo <Es,Lado,TDA = Reg>
y entra por ultimo el apuntador a todos los nodos <Cam>.
Busca las coordenadas en las listas y si estan entonceo lo elimina y
borra.
)
var
Lista
Nodo
Eli,Enc
: ApCamN;
: ApLista;
: boolean;
BEGIN
Eli := true;
PosLocY ( y ,Cam ,Lista) ;
if Lista = Nil then
Eli := false
else
BEGIN
A~~LocX(X,L~S~~~.A~X,NO&,E~C);
if not Enc then
Eli := false
else
BEGIN
if (Nodo = NI) then NI := Nil;
if (Ncüo = NF) then NF := Nil;
DelNodo(Cam,Lista,Nodo)
END
END;
if Eli then
BEGIN
RecCaminoN(iwg.xini,Reg.yiní,Reg.xini
+ MMC
GetCursor(BitMap,x,ylReg.xini,Reg.yini)
END
else
MensError('No Existe Nodo En Esta Posicionl);
END;
-
1,Reg.yini + MaxL - l,Reg,Cam,Pi,PZ,P3,P4);
PROCEDURE CambiaDeap(var x,y,Inc : integer; var Reg : RegCar; var Cam : ApCamN);
(
Cambia el valor de <Inc>, si <In0 queda igual a 1 entonces actualiza
las COOrdEMdaS cx,y> de modo que queden en la esquina superior izq.
del nodo más cercano
)
var
POSX,POS~: integer;
BEGIN
Inc :* abn(1nc
-
1);
46
-
.
_
I
-
-
.
if Inc = 1 then
CoordNodo(x,y,Reg.Incx,Reg.Incy,Poax,Poiiy)
else
BEGIN
POSX := x t 1; { ¿¿¿ x nud 2 <> o ??? }
POSY := y
END:
CursEnPantN(x,y,Posx,Posy,Reg,Cam,BitMap,Pl,P2,P3,P4);
x := posx:
y := POSY
END;
PROCEDURE
{
PonLiga(var x,y,NUmiiijo : integer; var
Cam : ApCanW;
var NodoIni,NodoFin : ApLista);
Con las coordenadas cx,y> encuentra el nodo al que se va a unir la
liga que anteriormente debio de haberse inicializado, los une, dibuja la liga y les da valores nulos a los parametros que indica union de la liga de un nodo con otro ( CNodoIni>,<Numtlijo>y
cNodoFin> )
var
Fin : boolean:
BEGIN
FinLiga(x,y,Reg,Ca,NodoFin);
uneIniFin(NumHijo,NodoIni,NodoFin,Fin);
Put(x,y,Reg.xini,Reg.yini,BitMap);
if (NumHijo > O ) and (NodoIni
Nil) and (NodoFin C> N i l ) then
if Fin then
BEGIN
DihNodoyLigas(Reg.xini,Reg.yini,Reg.xini
t HaxC - 1,Reg.yini + Maxi,
if (Reg.xin1 > x) or (x t TamNodo(Reg.Hs) > Reg.xini + MaxC - 1 ) or
(Reg.yini > y) or (y t AnchNodo > Reg.yini t MaxL - 1 ) then
PutE(arco(Pl,PZ,P3,P4)
-
l,Reg,NodoIni);
END
else
RecCami~N(Reg.xini,Reg.yini,Reg.xini
t
MaxC
-
1,Reg.yini
t
GetCursor(BitMap,x,y,Reg.xini,Reg.yini);
NumHijo := O;
NodoIni := Nil;
NodoFin := Nil
END;
-_
PRXEDURE QuitaLiga(x,y : integer; var Reg : Regcar; var Cam : ApCamN);
47
MaxL
-
l,Reg,Cam,Pl,P2,P3,P4);
{
Localiza el nodo y el númro de liga sobre el cual esta psicionado
el cursor y s i es que apunta a un nodo la libera.
}
var
Nodo : ApLista;
NumHijo : integer;
BEGIN
InicioLiga(x,y,Nuijo,Reg,cam,Nodo);
if (Nodo c> N i l ) and (Numüijo > O) then
EliminaLiga( Nuu¿lijo,Nodo);
RecCaminoN(Reg.xini,Reg.yini,Reg.xini t M w C
GetCursor(BitMap,x,y,Reg.xini,Reg.yini)
END:
-
1,Reg.yini
t
MaxL
- l,Reg,Cam,Pl,PZ,P3,P4);
PROCEDURE DefineNodo(var x.y : integer; var Reg : RegCar; var Cam : ApCamN; var
{
Aqui se pide que se especifique el numero de Ligas que tendra el
nodo y de que lado (Izq = -1 o Der = 1) las quiere dibujadas.
se trata de dos l i g a s por default se asignara una de cada lado
(Lado = O)
Si
Para aceptar los cambios se debe usar la tecla F1 y para camcelar
10s Cambios F10
En caso de que se den nuevos valores reinicializara l a s variables
del control del <Reg> y b r a nulo a <Cam> para comenzar una nueva
edicion. Otras variables necesarias para editar TDAs Ligado. son
El <Nü>, <NI> y <NF> que son Numero de hijo, Nodo Inicial y Nodo
final que indican inicio y fin de l a liga a insertar, que tambien
hay que reiniciar.
)
var
ALigas,ALado,yl,Cod : integer;
const
Arr : Arreglo
= ('DERECHO
','IZQUI~','',"
,
,
'*
#
l',l',ll,'l);
,"
FUNCTION OpcALado(ALado : boolean; Opc : integer) : integer;
{
Toma como referencia el Arreglo de opcionea Para -ir
del que dibujaran las ligas
S i <&ado>
es cierto pasa de Opcion a Lado y de Lado
a Lado
el Lado
a
opcion
Nü :
integer; var N1.W
: ApLista);
BEGIN
if ALado then
if Opc = O then
OpcALado := 1
{ Pasa de Opcion de Menu a Lado }
{
Derecho
{
Izquierdo }
}
else
OpcALado :- -1
{ Pasa de Lado a Opcion de nuiu }
else
if Opc = 1 then
OpcALado := O
{
Derecho
}
else
OpcALado := 1
{ Izquierdo }
END;
PROCEDURG CapturaLado(var Lado,Ccd : integer; Arr : Arreglo);
var
üpcion : integer;
BEGIN
Opcion := OpcALado(false,Lado);
CapturaOpc(Opc1on,Codd,50,(Ge~Y)
dlv GrafColTxt,L,Arr);
Lado := OpcALado(true,opcion);
END;
PROCEDURE MenaDefNodo(Lado : integer; var y : intager);
{
Manda los mensajes para capturar la deflnicion de un nuevo nodo
<y> es e l renglon donde se capturaran los datos
}
var
Tam : integer;
BEGIN
y := (GetMaxY) dlv GrafColTxt;
Tam := ( G e m ) dlv GrafColTxt;
GrafMens('La6 Estructuras que esten en e l Editor
SUM
GrafMene('ESC : Canceiar
GrafMens( 'Define Nodo
Numero De Ligas [
Lado ['+Arr[OpcALado(falae,Lado)]+']',l,y,T~,BLACK);
]
END;
-..
BEGIN
{
DEFIRE NODO }
borradas ii!ii*,l,y-2,Tsm,BLA~);
P1 : Aceptar',l,y-l,Tsm,BLACX);
ALigas := Reg-ns;
ALado := Reg.Lado;
MensDefNodo(Reg.Lado,yi);
REPEAT
REPEAT
ALigas := Valor(GrafCaptura(Cadem(ALigas),Cod,35,yl,2,2,BLAC));
UNTIL (Cod = E m ) or (Cod = ESC) or (Cod = Pi);
i f cod = ENTER then
CapturaLado(ALado,Cod,Arr);
U m I L (Cod = ESC) or (Cod = Fl);
if ALigas = 2 then
ALado := O;
i f Cod <> ESC then
Reinicia(ALigaa,ALado.x,y,MI,Reg,NI,NF,Cam)
else
PutMarco(Pl,PL,P3,P4)
{ DEFINE N O M ) }
END;
PROCEDURE CambiaInfo(var x,y : integer; Reg : RegCar; var Cam : ApCamN);
{
Pide la info-ion
que va a reemplazar e l contenido del nodo dondi)
se encuentre e l cursor
1
var
Cod,Dato : integer;
Mens : string;
FUNCTION PonInfo(Pon : boolean; var x,y : integer; ~ e :
g RegCar; var cam : ~ p c a m ~var
; Dato : integer) : baol..n;
(
Entran las coordenadas donde se encuentra el cursor <x,y>, los
datos necesarios para enconbar un nodo al que ae cmbiara e l
1nfo.dato por e l paramtro <Dato> en e l caso de que <Pon> sea
cierto. s i <Pon> em falso regresara la info-ion
del nodo
que se encuentre el las cwrdemadaa del cursor.
<PonInfo> sera cierto siempre y cuando haya un nodo en las
coordenadas del cursor
var
Lista
Nodo
Enc
: ApCamM;
: ApLista;
: boolean;
BEGIN
PonInfo := false;
PosLocY(y,Cani,Liata);
5Q
.
if L i s t a C> Nil then
BEOIN
PosLocX(x,Liata-.Apx,Nodo);
PonInfo := Nodo c> Nil;
if Nodo <> Nil then
if Pon then
BEGIN
Nodo-.Info.Dato := Dato;
üibNodo(Dato,Nodo^.x,Nodo-.y,Reg);
PutMarco(Pl,PZ,P3,PQ);
END
else
Dato := Nodo-.Info.Dato
END;
END;
BEGIN [ CAMBIA INFO }
Cod := ESC;
if PonInfo(false,x,y,Reg,Cam,Dato) then
BEGIN
PideInfo('1ntroduzca Dato ',Cod,Dato,l,GetMaxY div GrafcolTxt);
PutllsrcO(Pl,Pz,P3,P4);
END
else
MenaError('No Exiate Campo Entero En Esta POSiCiOn');
if Cod <> ES€ then
if PonInfo(true,x,y,Reg,Cam,Dato) then;
END;
[ CAMBIA INFO )
var
Car : char;
Numirijo : integer;
NodoIni,NodoFin : ApLista;
Cam : ApCamN;
BEGIN
[ EDICION N }
Cam := Nil;
Marco(Pl.PZ,P3,PO,Reg.TDA);
Reinicia(l,l,x,y,NumBijo,Reg,NodoIni,NodaFin,Cam);
BEPEAT
LeeCar(Car,Cod);
CASE Cod of
Rtgth,Left,Up,Dam,
PgUp,PgDn
Ins
--
: MueveCureorN(x,y,Inc,Reg,Ccd,Cam);
: if Inc = 1 then
51
--
.
A
-~....
,
.
.
..
..
.-.
. _..
... .-
__ - - .-
-.
127992
InsertaNodo (x,y,Reg,Cam)
else
MensError('Antea de Insertar Cambie Desplazamiento');
Del
F7
FB
F9
Enter
F2
F3
: if Inc = 1 then
EliminaNodo (x,y,Reg,Cam,NodoIni,NodaFin)
else
MsnsBrror('Antci. de Eliminar Cambie Desplazamiento');
: if Inc C> 1 then
InicioLiga(x,y,NumHijo,Reg,Cam,NodoIni)
else
MensError('Antes de Mucar Cambie Desplazamiento');
: PonLiga(x,y,Numüijo,Cam,NodoIni,NodaFin);
: QuitaLiga(x,y,Reg,Cam);
: CambiaOesp (x,y,Inc,Reg,Cam);
I : BEQIN
DefineEstruc(Reg.TüA);
if Reg.TDA = 1 then
Defindodo(x,y,Reg,Cam,NumHijo,NodoIni,NodoFín)
END;
: CambiaInfo(x,y,ñeg,Cam)
END
UNTIL (Cod = ESC) or (Reg.lDA <> 1);
FreaMarco(Pl,PZ.P3,PQ);
HazNulo(Cam);
{ EDICION N }
END;
END.
52
UNIT GrafNList;
{
Realizado por Azuara Diaz Maria Elena
1
{ Curso de Estructuras de Datos.
Editor de Estructura6 de Datos.
Herramientas para e l manejo de l a s l i g a s d e l TDAa Ligados.
)
{ En esta unidad s e encuentran l o s procedimientos para e l manejo
de l i g a 8 :
Localización, inserción, borrado, etc.
en ningún mmento Se dibujan en pantalla
}
INTERFACE
USES
GrafHerr,GrafTipo;
TYPE
SacaroMeter = (Saca,Mete);
{ LigasTam : Regresa e l tamaílo requerido
para un numero <HE> de apuntadores
)
FUNCTION LigasTam(Hs : integer) : word;
{ LigasDesp : Calcula e l desplazamiento para encontrar e l numero de l i g a
}
FUNCTION LigasDesp(NumHij0 : integer) : integer;
{ LigasElem : Esta funcion s i r v e para
simular l a s entradas y salidas a l a s
l i g a s de un nodo teniendo un apuntador a memoria y el espacio
disponible para t o d a l a 8 l i g a s de un nodo.
<POS> e s e l apuntad-
I
a -ria.
<Option> es e l que indica s i se t r a t a de sacar l a informacion
d e l elemento o de d a r l e un nuevo valor.
<NumHijo> es e l numero de l i g a .
<Dato> es e l v a l o r que en algun caso ae l e dara a l a l i g a .
cLiga&leiS> siempre regresa e l valor de la l i g a <N-ijo>
1
FUNCTION LigasElemi(0pcion : SacaroHeter; Pos : pointer; Nuiñlijo : integer; Dato : pointer) : pointer;
-_
{ LigasNva : Reserva suficiente mmoria para numero
regresa un apuntador a ese regervado
}
53
<Hu> de apuntadores y
FUNCTION LigasNva(Hs : integer) : pointer;
: Libera l a memoria que se uso para un numero CHs> de apuntadores
{ LigasLibera
<P> e s e l apuntador a memoria.
1
PROCEDURg LigaaLibera(P : pointer; Hs : integer);
{ LigasVacia : Pone todas l i g a s apuntando a N i l
<P> es e l apuntador a l a primer l i g a .
<Ha> es e l numero de ligas
1
PROCñDURE LigasVacia ( v a r P : pointer; Hs : integer);
(************* 1
( Aqui
se encuentran l a s operaciones sobre l a s listas (en ningún momento
se dibujan).
}
{ CreaLista : Crea un nuevo
nodo inicializando su campos con valores
nulos con excepcion de sus coordenadas (x,y) l a s cuales
i n i c i a l i z a con l o s parametros.
<Ha> es el numero de Ligas que tendra e l nodo.
PROCEDURE CreaLista(var Nodo : ApLista; x,y,Hs : integer);
{ CreaCam : Crea una variable de t i p o ApCrmN e i n i c i a l i z a sus campoe
con valoren nulos.
}
PROCEDURE CreaCam(var Nodo : A S - ) ;
{ InsertLieta : Inserta
un nodo de cood. <x,y> despues de <Pos>, í.e,
<Pos-.sig> y si <pos> es nulo s e inaerta en l a primer
poaición de <Lista>.
'
s i <Lista> es nula se l e
hace apuntar a l nodo.
<He> es e l nurmm de Ligas que tendra e l nodo.
1
PROCEDUREInsertLista(var Po8,Lista : ApLista; x,y,as
{ InsertCam : Inserta
: integer):
un nodo de c o d . <x,y> despuea de <Pon>, i.e,
c~oa-.~py^.~py
x >s i <POS> ea nulo se iniluta en b
p r i m r posición de <Cam>.
si <cam> ea nulo se i n i c i l a i z a con <cam-.~pr = N&>.
<He> es e l numero de Ligas que tendra e l nodo.
PROCEDURE Insertcam(var Pos,Lista : ApCamN; x,y,Hs : integor);
{ DelNodo : Borra <Nodo> de l a <Lista> donde se encuentra.
si L i s t a se hace
nula y no hay mas l i s t a s entonces hace nulo a <Cam>
)
PROCEDURE DelNodo(var Cam, L i s t a : ApCamN; var Nodo : ApLista);
( AntLocX : Busca
un nodo con l a coordenada CX>, regresa en < E n 0 s i l o
encontro o no y regresa e l Nodo anterior a l encontrado o Nil
en < ~ o d o >
<Lista> entra para que se busque e l nodo en e l l a .
PROCEDURE AnUocX(x : integer; L i s t a : ApLista; var Nodo : ApLista; var Enc : boolean);
( AntLocX : Busca una L i s t a en l a que sus nodos tengan l a coordenada <y>,
regresa en < E n 0 s i l a encontro o no y regresa l a lista anterior
a l a l i s t a encontrada o N i l en <Nodo>
<Lista> entra para que se busque l a l i s t a en e l l a .
PROCEDURE AntLocY(y : integer; var Lista,Nodo : ApCamN; var Enc : boolean);
{ PosLocX : Busca un
nodo con la coordenada <x>, y regresa el Nodo o N i l
en <Nodo>
<Lista> entra para que se busque e l nodo en ella.
PROCEDURE PosLocX(x : integer; L i s t a : A s i s t a ; var Nodo : ApLiata);
{ PosLocX : Busca una L i s t a en l a que sus nodos tengan l a coordenada <y>,
Regresa l a l i s t a o N i l en <Nodo>
<Lista> entra para que se busque l a l i s t a en ella.
)
PROCEDURE PosLocY(y : integer; L i s t a : ApCamN; var Nodo : A p C a ) ;
{ HazNulaL : Elimina todos elementos de l a < l i s t a >
1
PROCEDURE HazNulaL(var
Lista : ApLista);
{ HazNulo : Elimina todos los e1
1
ntos del camino de busqueda <Cam>
?
PROCEDURE üazNulo( var Cam : ApCmN);
-_
(*************)
{ CalculaHijo : Regresa e l número de l i g a sobre e l que esta posicionado e l
cursor ( s o l o necesita l a coordenada <x> ya que anteríormsnte
se v e r i f i c o que e l cursor e s t a poslclonado sobre un nodo).
cPosx> es l a coord. en x de l a esquina superior Izquierda
del nodo.
PROCEDURE Calculaüljo(var x,Posx,Numüijo : Integer; Reg : RegCar);
{ InicioLiga : Entran l a s Coordenadas donde se encuentra e l cursor <x,y> y
los datos necesarios para encontrar e l nodo correspondiente
y s i lo encuentra regresa un apuntador a él y el número de
l i g a correspondiente a esas coordenadas. S i no l o encuentra
o l a s coordenadas no pertenecen a una l i g a regresa valores
nulos
PROCEDURE InicioLiga(var x,y,Numüijo : integer; var Reg : Regcar; var Cam : ApCamN;
var Nodo : ApLista);
{ FinLiga : S i l a s coordenadas estan en e l area de alguno de los nodo3
regresa un apuntador a é l , en o t r o caso regresa un apuntador
nulo.
}
PROCEDURE FlnLiga(var x,y : integer; R e g : RegCar; var Cam : ApCamN; var Nodo : ApLlsta);
{ UneIniFin
: A l a l i g a numero <Nmüijo> de *NodoIni> l a apuntara a
<NodoFin>
<NoEstaba> es c i e r t o si e l valor anterior de l a l i g a es N i l
}
PROCEDURE UneIniPin(Numüij0 : integer; var NcdoInl, NodoFln : ApLlsta; var NoEstaba : boolean);
{ EliminaLiga : Busca l a l i g a de <Nodo> con Su
Numüljo
* <Ntmñljo> y si l o
encuentra elimina esa l i g a .
1
P R O C E D W EliminaLiga(NuH1jo : integer: var Nodo : ApLista);
IMPLJB4ENTATION
UNIT GrafNMve;
{ Realizado por Azuara Diaz t4aria Elena.
{ Curso de Estructuras de Datos.
Editor de Estructuras de Datos.
Movimiento en pantalla para TDAs Ligados.
1
INTERFACE
{ RecCaminoN : Las coordenadas -=x,y>
, cx2,y2>
delimitan un rectangulo de
pantalla y solo l o s nodos que queden ahi serhn dibujados
de l o contrario solo se dibujaran l a s l i g a s (TüAa Ligados).
Aqui se hace el recorrido por niveles.
I
PROCEDURE RecCaminoN(x,y,xZ,yZ
: integer; var Reg : Regcar; Cam : ApCamN; var Pl,PZ,P3,P4 : pointer);
{ CursEnPant : Recibe l a s coordenadas donde se encontraba e l cursor y l a s
coords. a donde debe i r . S i estas Coordenadas no estan
actualiza cReg.xin> y CReg.yini> y reescribe l a pantalla
de lo contrarío solo mueve el cursor en pantalla.
{ CursEnPantN : Estructuras Ligadas
>
PROCEDURE CursEnPantN(xa,ya,x,y
IMPLEMENTATION
: integer; var R e g : Regcar; Cam : ApCamiU; var BitNap,P1,PZ1P3,P4
: pointer);
UNIT GrafNodo;
{
Realizado por Azuara Diaz Maria Elena.
>
{ Curso
de Estructura de Datos.
Editor de Estructuras de datos.
Herramientas para editar los nodos de los TDAs Ligados
>
1"ERFACE
USES
GrafNList,Graph,HerrGral,GrafMarco,GrafPipo,GrafHerr;
PROCEDURE DibWodo(Dato,xC,yC : integer; Reg : R a g C a ) ;
( El siguiente procedimiento maneja coordenadas de pantalla en pixeles
1
PROCEDURE DibNodoyLigas(lx,ly,lxl,lyl : integer; Reg : RegCar; NodoIni : ApLista);
IMPLEMENTATION
UNIT GrafSEdit;
[
Realizado por Amara Diaz nrirh Elena.
1
[
Curso de Estructuras de Datos.
Editor de Estructuras.
Procedimiento para la Edicion de Estructuras Secuencialeo
INTERFACE
USES
HerrCons,HerrOral,crt,Graph,GrafEdit,GrafCapt,GrafTipo,Gra~err,GrafMarco,
GrafSArr,GrafSLiat,GrafSMve;
PROCEDURE
[
EdicionS(var BitMap,PlrPZ,P3,P4: pointer; var Cod : integer; var Reg : Regcar);
Edicion de
lQAm
Secuenciales
}
IMPLEMENTATION
PROCEDURE EdicionS(var BitMap,PlIP2,P3,P4 : pintar; var Cui : integer; var Reg : Regcar);
{
Edicion de
"m
Secuenciales
1
var
x,y,
Inc : integer;
PRDCEDURE InicVarParaSec(var
{
Cam : ApcappS;
var Rsg : war);
Estas variablei son umadaa por el editor de eitructurai
Sec
1
BEGIN
Cam :- Nil;
InicializaRegCar(Reg.TDA,O,O,Reg)
m;
PiaXDtIRE Reinicia(var x , y : integer; var Rmg : Regcar; v . c
{
Da valores iniciales a todas las variable
Cam :
AN-);
BEGIN
HazNuloSec( Cam) ;
InicVar(x,y,Inc);
InicVarParaSec(Cam,Reg);
clearviewport;
PutMarcO(Pl,Pz,P3,P4);
GetCursor(Bi~p,x,y,Reg.xini,~g.yini)
END;
PR3CEDUñE MueveCursorS(va1: x,y,Inc : integer; var Reg : Regcar; Cod : integer; var Cam : ApCamS);
{ Dependiendo de l a t e c l a de movimiento (<Cod>) actualiza e l valor de
<x> o de <y> sumandole o restandole un valor el cual se determina
-
por < I f l o . Estructuras Secuenciales
1
PROCEDURE ACtCursor (var x,y,Inc : integer; ver Reg : Regcar; Cod : integer; var Cam : ApCams);
{ Dependiendo de l a t e c l a de movimiento (<Cod>) actualiza
el
valor de <x> o de <y> sumandole o restandole un valor el cual
se determina por a n o .
1
PRDcñDuRE CambiaElem(var x,y : integer; OtraElem : Apcams; var Reg : Regcar);
{ Cambia l a s coord. d e l cursor por l a s
de <OtroElem>
k
BEGIN
i f OtroElepp
(5
N i l then
BEGIN
x := otroElem-.xP;
y := OtroElsiP-.yP;
Reg-Elem :- Otro~lem
END
END:
PROCEDUFIE DespDeUno(Cod : integer; var x,y : in{ Mueve l a s coord. d e l cursor segun
var Cam : ApCamS; var Reg : ReqCar);
el codigo de l a s teclas de
movimiento y busca algun elemsnto que contenga l a s nuevas
I
.
coord. para asignarlo a <Reg.Elenv
1
BEGIN
CASE Cod of
Rigth : x :*
x + TamInfo;
Left
: if x > TamInfo then
DOwn
: y := y + AnchNodo;
x
:= x
- TamInfo;
: if y > AnchNodo then y := y
Up
END;
Reg.Elem := LocalizaElem(x,y,Cam);
END:
-
AnchNodo;
{ ACT CURSOR }
cod O f
PgDn
: if (Reg.Elan c> Nil) and (Reg.Elem-.Prw
CambiaEiem(x,y,Reg.Elem- .Prev,Reg):
PWP
: if (Reg.Elem <> Nil) and (Reg.Elem^.Sig
CenibiaElem(x,y,Reg.Elem-.Sig,Reg);
UP,DOWi,
Rigth,Left DenpDeUno(Cod,x,y,Cam,Reg)
END
(ACTCURSOR }
END;
BEGIN
CASE
C>
Nil) then
C>
Nil) then
.
{ MUEVE
BEGIN
Aux :=
CURSOR
8 }
x;
Auy := y;
Actcursor (x,y,Inc,Reg,Cod,Cam);
CuraEnPantS(Aux,Auy,x,y,Rog,Cam,BitHap,Pl,PZ,P3,P4~
( MUEVE
END;
P€üXEDüRE
CURSOR
S )
DefineBlem(var Taau,Tamy : integer);
var
cod,yl : integer;
PROCEDURE ?iensDefElem(var y : integer);
{ Manda 1-
meneajan para capturar la definicion de un nuwo Elm.
<y> es el renglon donde se capturaran loa datos
-..
1
var
Tam : integer;
BEGIN
y :- (GetMaxY) div GrafColTxt;
Tam :- (Getclaxx) div GrafColTxt;
GrafMens( * I , 1,y-Z,Tam,BLACX) ;
GrafMens('ESC : Cancelar
GrafMens(*Define El-nto
Dimension en
END:
X [
]
F1 : Aceptar',l,y-l,Tam,BLACK);
Dimension en Y [ ]',l,y,Tam,BLACK);
{ DEFINE ELEM )
BEGIN
Tamx :* O;
Tamy := O;
MensDefElem(y1);
REPEAT
Tan# := Valor(GrafCaptura(Caden(Taw),Cod,34,ylrZ,Z,BLACK));
if ( C o d <> ESC) and (Cod <> F1) then
Taniy
:= Valor(GrafCaptura(Caden(Tamy),Cod,55,y1,2,2,BLACK));
UNTIL
(Cod = ESC) or (Cod = Fl);
PutMarco(Pl,PZ,P3,P4)
END;
{ DEFINE ELEM }
PROCEDUPE InsertaSec(var x,y : integer; var Reg : RegCar; var Cam : ApCtuUS);
(
Entran las coordenadas donde se encuentra el cursor <x,y>, los
datoa necesarios para crmr y dibujar un Elemrnto
1
PROCEDURE CursoryElem(E1em : ApcamS; Reg : Regcar);
{
Quita el cursor de la posición donde me encuentra.
Dibuja el Elem. y pone el cursor en el extreipo nuperior
izquierdo
}
BEGIN
Put(x,y,Reg.xini,Reg.yini,BiWap);
with Elem- do
DtbBlam(xP,yP,Tamx,Tamy,Reg.xIni,Reg.yIni,P);
if (Reg.xini > x) or (x + E ~ I u I I * . TTamInfo
~~
7 Reg.xini t MaxC - 1) or
(Reg.yíni > y) or (y t Elem-.Tamy AnchNodo r-Reg.yini + NurL
1) then
PutMarCo(Pl,P2,P3,P4):
GetCursor(BitMap,x,y,Reg.xini,R.g.yini)
END;
-
62
BEGIN
(
INSERTA SEC
}
if LocalizaBlem(x,y,Cam) = Nil then
{ Evita
que se encimen
}
BEGIN
DefineElem(Tamx,Tamy);
if (Tam O ) and (Tamy > O ) then
BEGIN
InsertSlem(x,y,Tamx,Tamy,Cam);
Reg.Elem :* Cam;
CursoryEiem(Reg.Elem,Reg);
END
else
MensError('Una Dimension No Es Valida (Es Cero)');
END
else
MensError('Ya Existe Estructura En Esta Position*);
END;
{ INSERTA SEC 1
PI(OCEDUFiE EliminaSec(var x,y : integer; Reg : RegCar; var Cam : AS-);
{
Entran las coordenada. donde so encuentra el cursor Cx,y>, los
datos necesarios para eliminar y borrar un Elemsnto
BEGIN
if Reg.Elem c > Nil then
BEGIN
NuloSec(Reg.Elem,cM) ;
RecCaminoB(Reg,Cam,Pl,P2,P3,PI);
GetCuraor(BitMap,x,y,Req.x.ini,Reg.yini)
END
else
MensError('N0 Existe Estructura En Esta Posicion');
END;
PRDCEDURE CambiaDeep(var x,y,Inc : integer; var Reg : Regcar; var Cam : ApCamS);
{ Cambia
el valor de * L n o
}
BEGIN
Inc
:=
abs(1nc
-
1)
m;
63
PROCEDURE CambiaInfo(var x,y : integer; Reg : Regcar; var Cam : ApCamB);
{
Pide la informacion que va a reemplazar el contenida de la celda
donde se encuentre el cursor
var
Cod,Dato : integer;
Mens : string;
FUNCTION PonInfo(Pon : boolean; var x,y : integer; Reg
{
RegCar var Cam : ApCamS; var Dato : integer) : boolean;
Entran las coordenada6 donde 86 encuentra e l cursor cx,y>, los
datos necesarios para encontrar una celda en eso4 cwrd.
Si not <Pon> Regresa el <Dato> de la celda.
otro pone a la celda el <Dato>.
var
xl,yl,>i,yc : integer;
Exito : boolean;
BEGIN
xl := (x
y1 := (y
Exito :=
- Reg.Elem-.xP)
div TamInfo;
Reg.Elem-.yP) div AnchNodO;
( O e= xi) and (xi < Reg.Eleii-.TamPc) and
( O C- yl) and (y1 C Reg.Eleip-.Tq); { S i hay una Celda }
if Exit0 then
i f Pon then
BEGIN
Dato := MatrizElm(Mata,Ig.Elm~.P,xl,yl,Reg.Elm~.Tana,Dato);
w i t h Reg.Elem- do
BEGIN
Put(x,y,Reg.xiei,R.g.yini,BitMap);
xc :- CoordPant(xP,R.g.xini) + xl * TamInfo * 5;
yc := CwrdPant(yP,R.g.yini) t y1 * Anch~odo* 5;
Cuairo(l,l,xc,yc,xc t T m n f o * 5,yc t AnchUodo * 5 ) ;
DibInfo(MatriZBlQi(B.E.,P,xl,yl,TamPc,O),xc,yc);
oetcurwr(Bitnap,x,y,R~.xini,~.yini)
END;
PUtMarCO( P1,PZ,P3,PI);
Em
else
Dato := MatrizEiean(Saca,Reg.Elm- .P,xl ,y1,Rsg.Eleii- .Tamx,Dato);
PonInfo := Exito
END:
-
-
.
BEGIN ( CAMBIA INFO }
if Reg.Elem <> Nil then
BEGIN
if PonInfo(false,x,y,Reg,Cam,Dato) then
BEQIN
PideInfo('1ntroduzca Dato *,Cod,Dato,l,GetMaxY div GrafcolTxt);
PutMarco(Pl,P2,P3,P4);
if Cod
ESC then
if PonInfo(true,x,y,Reg,Cam,Dato) then:
END
END
else
MensError('No Existe campo Entero En Esta Position');
{ CAMBIA INFU )
END;
var
Car : char;
Cam : ApcamS;
EDICION S }
Nil:
Marco(Pl,P2,P3,PQ,Reg.'iDA);
Reinicia(x,y,Reg,Cam);
REPEAT
Le&ar( Car,Cod);
CASE Cod of
Rigth,Left,Up,Down,
BEGIN
{
Cam :=
PgUP,PgDn
Ins
: MueveCursorS( x ,y, Inc,Rep,Cod, Cam) ;
: Inser+aSec(x,y,Reg,Cam);
Del
: ElimiMB.c(x,y,Rep,Cam);
FZ
:
BEGIN
DefineED+ruc(Rsg.TDA);
if Reg.TDA e> 1 then
Pu+M.rco(Pl,PZ,P3,P4)
END;
: CambiaInfo(x , y,Rep,Cam)
F3
END
UNTIL (Cod = ESC) or (R.g.TDA = 1);
Fresniirco(Pl,PZ,P3,P4);
HazNul&ec( Cam);
{ EDICION 8 }
END;
END.
65
UNIT GrafSArr;
{ Realizado
por Azuara Diaz Maria
ElOM.
)
{ Curso de Estructuras de Datos.
Editor de Estructuras de Datos.
Manejo de memoria para simular arreglos y Matrices.
}
INTEñFACE
TYPE
SacaroMeter = (Saca,Mete):
{ ~ o d o sestos procediminetos consideran que se empieza en
columna ( 0 , O )
el renglon y
y los limites son (Tam-1,Tamy-1)
Un arreglo es una matriz con Tamy = 1
o Tarn# = 1
}
{ MatrizTam : Regresa e l tamaño de una matriz de enteros de dimensiones
í Tarn, TmY)
FUNCTION MatrizTam(Tamx,Tamy : integer) : word;
{ MatrizDesp : Calcula
el desplazamiento para encontrar el elemento de una
matriz en l a s coordenadas (x,y) en l a memoria.
}
FUNCTION Matrizüesp(x,y,Tam
{ MatrizElem
: integer) : integer:
: Esta funcion s i r v e para simular l a s atIntradaS y iaiidai de una
matriz teniendo en lugar de l a matriz un apuntador a memoria
y el espacio disponible para todos los elomentom de l a matriz.
<Pos> es e l apuntador a memria.
<Option> es e l que indica s i se t r a t a de sacar l a i n f o m i o n
del elemtanto o de darle un nuevo valor.
<x,y> son l a s coordsnadas de l a matriz eimulada.
<Tamxi es el nunari de elementos en x de l a matriz.
<Dato> es el valor que en algun c a w se le dara a l elamanto de
l a matriz.
<MatrizEleip> siempre regresa e l valor del elsmonto de lam
cwrd(x,y)
1
FUNCTICN MatrizElem(0pcion : SacarcNoter; Pos : pointer: x,yrTamx,Dato
{ MatrizNva : Reaerva suficiente w r i a para
: integer) : integer;
un matriz de entoros de
dimensiones (Taa#,Tamy) y regresa un apuntador a eae reservado
66
FUNCTION
(
MatriWva(Tamx,Tamy : integer) : pointer;
MatrizLibera : Libera l a memoria que se uso para una matriz de enteros de
dimensiones (Tamx,Taniy)
cP> es el apuntador a memoria.
PROCEDURE MatrizLibera(P : pointer; Tana,Tamy : integer);
{
MatrizVacia : Pone los elementos de una matiz con O.
cP> es el apuntador a la matiz
cTamx,Tamy> son las dimensiones de la matriz
1
PROCEDURE MatrizVacia (var P : pointer; Tana,Tamy : integer);
IMPLEMENTATION
6T)
UNIT GrafSList;
{ Curso de Estructuras de Datos.
Editor de Estructuras de Datos.
Manejo de Estructuras de Datos usadas para editar TDAs Secuenciales.
t
1-ACE
USES
GrafTipo,GrafSArr;
{ InsertaElem : Inserta
un Elemento en l a primer posicion de <Cam> dandole
a cam e l valor del nuevo elemento.
(x,y) seran l a s coord. del extremo superior i z q . del elem.
(Tam,Tamy) seran la8 dimen8iones del arreglo o matriz a l
que apunta e l nuevo elem.
1
PROCEDURE InsertElern(X,y,TBmx,Tamy : integer; var Cam : ApCamS);
{ ~ocaliza~lem
: Busca en toda
l a l i s t a c c a m algun elemonto que contenga
regresa N i l
l a s coord ( x , y ) . Si no existe algun elemento
en otro caso e l elemento.
1
FUNCTION LocalizaElem(x,y : integer; var C m : ApCamS) : ApCamS;
{ NuloSec : Elimina <Elem> camino de
busqueda <Cam>
)
PROCEDURG NuloSec( var Elm.Cam : A-);
{ IiazNuloSBc : Elimina todos los elementos del camino de busquedi <Cam,
t
PROCEDURE HazNuloSs( var Cam : A m ) ;
1MPLEHFNl"TION
68
.
[
Realizado por Azuara Diaz Maria Elena.
}
[
Curso de Estructuras de Datos.
Editor de Estructuras de Datos.
Movimiento en pantalla para TDAi Secuencialea.
1
INTñRFACE
USES
GrafHerr,Gra€Marco,Graph,GrafTipo,GrafSArr;
{
DibElem : Pinta un Arreglo o Matriz a partir de las cwrd (xP,yP).
1
PROCEDURE DibElem(xP,yP,Tamx,Tamy,xini,yini : integer; Elem : pointer);
{
RecCaminoS : Las coordenadas <x,y> , <XZ,yZ> delimitan un rectangUl0 de
pantalla y solo los Elementos que queden ahi serh dibujados
}
PROCEDUFS RecCaminoS(var Reg : Regar; Cam : ApCamS; var P1,PZIP3,P4 : pointer);
{
CursEnPant : Recibe las coordenadas donde se encontraba e1 cursor y las
coords. a donde dekm ir. S i estas coordenadas no emtan
actualiza cReg.xin> y <Rtag.yini> y reescribe la p a n t a l l a
de lo contrario solo mueve el cursor en pantalla.
}
{
1
CursEnPantS : Estructuras Secuencialos
PROCEDURE CursEnPantS(xa,ya,x,y : i n t e g e r ; var Reg : Regcar; C m : Apcam.; v a r Bitnap,Pl,P2,P3,P4 : pointer);
IMPLEMENTATION
5.3.
EDITOR DE TEXTO Y COMPILADOR.
#
Se codifico en Pascal con la version 5.5. de Borland.
Programa ejecutable : CEDEditor.
Unidades Utilizadas :
Comunes al Editor de Estructuras
HerrCons
HerrGral
Manejo del Editor de Texto
Ed
EdArchivo
EdAyuda
EdHerram
EdLinEdo
EdTDA
EdTipos
Manejo del Compilador
CSSint2 (Unidad Principal)
CSPalRes
Estructuras de datos usadas en e l
E d i t o r de Textos
Renglon
Renglon
I
*
Rensrlon
riMir Rinslon d i La
an t a l 1a
PRO6üAM CBüEditor:
{
Realizado por Azuara Diaz Maria Elena.
}
{
Curso de Estructuras de Datos.
Editor de Textos y Analizador del Lenguaje.
Cuerpo principal del Editor de Textos
1
USES
CSSintZ,HerrGral,Dos,EdArchiv,MenuUnid,E~erram,Ed,E~A,EdTipos,H~~ons,Crt;
CONST
Lx =
72;
Ly =
17;
ListaMenu : Mlist = (",'F2 Salvar
'F3 Leer
I,
I,
'F9 Compilar
'F4 Opciones
',
',
*
Terminar I ,
'S~C~','23~4'
9 1
, 1 1
, 1 , , t , , I ,, I ,t I,, 1,, ,
,1 , ,1 , , 1 . , ( 1, I )
;
OpcTerm = 5;
VAR
Ap,Numero : integer;
Nombre : Cadena;
ElTexto : Agrexto;
Resp : char;
Cabeza : Registro;
PROCEDURE VentMensBrror(mag : string);
ocurre algun tipo de error se abre una v e n a , manda el
mensaje <ma> y espera una tecla para cerrar la ventana
{ Cuando
i
var
Cod : integer;
Car : char;
BEGIN
AbreVent(9);
writeln( mag);
Mensajes('Presione una Tecla
LeeCar(Car,Cod);
CierraVent(1);
END;
...',7,2);
PROCEDURE NombreArch(var Nombre : Cadena; var Cod : integer);
{
Abre una ventana para pedir el nombre de un archivo. Este
se captura con datos que permite deslizamiento a la izquierda
de renglon en la captura y regresa un nombre valido de archivo
BEGIN
AbreVent ( 5 ) ;
Mensajes(' Archivo : ',l,l);
Datos(Nombre,Zl*ll,6,25,Cod);
Nombre := NomArchivo(Nambre)
END;
PROCEDURE Archivo(var Nombre : Cadena; var Texto : A p e x t o ) ;
{
Pide <Nombre>.
Abre el .irchivo correspondiente a <Nombre> y lo vacia en
una l i s t a doblemente ligada <=o>
var
Cod : integer;
PRüCEDURE AbreArch(Nombre : Cadana; var Texto : ApTexto);
{
ASIGNA LA INFOIPiUCION DEL ARCHIVO A IJNA VARIABLE DE TRABAJO }
var
Arch:Text;
Reng1on:Cadena;
AUX : A p e x t o ;
PROCEDURE CreaCaBText(var Arch : Text; var Reglon : Cadena; var Text0,Aux
BEGIN
if not Nulo(Text0) then iUziiulo(Texto);
Crea( Tmxto):
readln(Arch,ñenglon);
NRanglon(Texto,Ranglon);
A w := Texto
END;
BEGIN { ABRE ARCH
: ApTexto);
aesign(Arch,Nambre);
{SI-}
reset(Arch);
if Ioresult = 0 then
BEGIN
if not eof(Arch) then
I
CreaCa~~t(Arch,Renglon,Texto,Aw);
while not eof(Arch) do
BEGIN
readln(Arch,Renglon);
Insertañanglon(Texto);
NRengion( Texto, Renglon)
Em;
close(Arch);
Texto := Aux
END
else
BEGIN
if not Nulo(Text.0) then HazNulo(Text.0);
Crea( Texto)
END
(SI+}
END;
{ ABRBARCH }
BEüIN
( * ARCHIVO " )
NombreArch(Nombre,Cod);
if Cod <> Esc then
BEGIN
if not Nulo(Texto) then
HazNulo( Texto);
if N e e <> " thm
BEGIN
UnnoCnnto( 'üü -');
AbxmArch(Ncmbre,Tacto);
CierraVent(1)
END
else
Crea(Texto)
ENDI
CierraVent(1)
("ARCEIM *}
END;
PRüCEüURE Sslvar(var NcPbr0:Cade~; Taxto : -0);
(
-_
Guarda el <texto> ya -wrregido en dimco. s i el <NaPbre> no ea valido
manda un error y si es Nonibre nulo pide un nuevo nombre.
1
7Lf
.
var
Cod : integer;
PROCEDURE NombreGuardar(var Nombre : Cadena; var Cod : integer);
BEGIN
if Nombre = ' ' then
BEGIN
AbreVent( 5);
Mensajes( ' S a l v a r en : ' ,1,1);
Datos(Nombre,20+14,6,23,Cod);
Nombre := NomArchivo(Nombre);
CierraVent ( 1)
END
END;
PI(DCEDURE Asigna(Nombre : Cadena; var Texto : A p e x t o ) ;
{ ASIGm
AL ARCHIVO Y GüARüA EL TEXM }
EL -IRE
var
Arch : T e x t ;
BEGIN
asiign(Arch,NoPbrr);
{SI-)
rewrite(Arch);
{SI+)
if IoResult = O then
BEGIN
while not Nulo(Texto) do
BEGIN
writain(Arch,Reng(Tsxto)) ;
Texto:= ApDciwn(lbxto)
END;
ClOM(m h )
END
else
Ven+Plens&rror(' Nombra de Archivo Invalido');
END;
BEGIN
{ * SALVAR * }
NombreQuardar(Nombre,Cod);
75
if (Nombre <> ' * ) and (Cod <> ESC) than
BEGIñ
unilooento( W N
Mmpisro');
AsigM(Naihre,Texu>);
CierraVent(1)
END
I
END;
{*
SALVAR * }
PROCEDURE InicCabz(var Ap : intoger; var Cabeza : Registro; var
{
A w : ApTaxto);
Inicilaliza todas las variables del registro Cabeza que ea el
control d e l texto
)
BEGIN
Ap := 1;
i f Nulo(Aux) then
Crea(Aux);
Cabeza.Texto := A m ;
Cabeza.Linea := 1;
Cabeza.Superior := Cabeza.Texto;
Cabeza.ApInicia1 := 1;
END;
PROCEDURE RevisaCaso!var
Ap : intmger; var Noobre : Cadena; var ElTexto : A m o ; var RUBp : integer;
var Cabeza : Registro);
{
Revisa cual de las opciones parmitidas (Leer,Salvar,editar...)
selaccinada y la ejcuta
fue
)
var
Arch : Text;
ConLinEdo : boolean;
PRüCEDURE Canpilador(var ConLinEdo : boolean; var Ap : intager; v u Nm~bre: Cadena; var E l m o : ApTeXtO;
var Cata= : Regiitro);
{
Llama al cornpilador
1
var
ApAux,Error : integer;
PROCEDURE VentCoq(Vent : integer; Napbre : C~W~OM);
26
{
Abra una ventana donde ie desplegaran l a data de compilacion
1
BEGIN
AbreVent(Vent);
writeln;
writeln('
Archivo : ' ,Nmbre);
writeln;
writeln( '
Lineas Compiladas : ');
END;
I
PROCEDURE Press;
[
Press se llama si te&M
exitosamente la compilacion
)
var
Reap : char;
BEGIN
textcolor(white);
textbackground(b1ue);
gotoxy(2,e);
PRESIONE UNA TECLA
writeln( '
textcolor(white);
textbackground(b1ack);
Reap := readkey
END;
BEGIR
{ COMPILADOR }
Apñw :- 1;
Error := O;
Ventcanp(7,Nombre);
Programa(ApAux,Error,ElT.xto,C.b.u) ;
if Error <> O then
BEGIN
CierraVent( 1 ) ;
MenmError(ApAw,Error,Cateza.Lim);
Ap := ApAw;
ConLinBdo := false
END
else
BEGIN
Press;
CierraVent( 1)
77
I
I
PROCEDURE CambiaDir;
{
Pide un nuevo directorio y cambia el directorio actual
}
var
cod : integer;
Dir : Cadena;
BEGIN
AbreVent( 5 ) ;
GetDir(0,Dir);
Menscijea(l Directorio : ',l,l);
Datos(Dir,21+14,6,20,Cod);
{SI-)
ChDir(Dir);
if 1ORe.Ult
e> o then
VentMensError(' Directorio Invalid0
CierraVent( 1 ) ;
END;
i
');
PROCEDURE ~enuopc(varNambre : Cadena);
{ Aqui
se preantas funciones adicionales laa cuales son utiles para
la manipulacion de archivos
1
const
Listanonu : Mlist =
I ,
,
('l,'
Cambia Nombre
I. 1 1
1 1
1 1
* I 1 1 1 1
1 1
V
t
#
,
,
t
t
l
',I
I.
,
Cambiar Dir. ','ND',*',**,
,I
*
ll,*I,ll,ll);
var
Numero : integer;
cod : integer;
BEGIN
menu(Lis~u,blwrwhite,rod,white,bla~,blue,l{nirco),Z~tarP),45(po._x},3{~s~y},~or,~,N~O);
CASE 19uisrO O í
1 : BEGIN
N m b r W h ( Nombre,Cod);
Cierravent( 1) ;
=;
2 : CambiaDir;
END;
C ierra-Menu;
Cierra-Menu
END;
{ REVISA CASO }
BEGIN
ConLinEdo := true;
if Reip <> 4 then
Cierra-Menu;
CASE Resp of
4(F4)
3(F9)
:
2(F3)
:
BEGIN
Archivo(Nombre,ElTmcto);
InicCabr(Ap,Cabeza,ElT~to)
1{F2)
:
Salvar(Nombre,ElTexto);
MenuOpc(Noaibre);
: Compilador(ConLinEdo,Ap,Nombre,ElTexto,Cakeza);
END;
END:
if Resp
c> OpcTerm
then
EditorTexto(Ap,ElTexto,Lx,Ly,Nombre,Cabera,ConLinEdo)
END;
{
REVISA CASO 1
FWNCTION Verifica : boolean;
{
Anter de concluir l a cesion verifica que esta sea realmuite l a opcion
deseada
1
var
~ e s p: char;
Hum : integer;
BEGIN
AbreVant ( 5 ) ;
Mensajecr(*TSmUAAR E D I C I ~ (WN)
:1,1,1);
Leea ( Resp, Num) ;
Verifica := upcaw(Rcilp) = i s * ;
CierraVent(1)
END;
PROCEDURE Version;
{
)
Prewnta los ceditor y datos del programa
_-
var
Car : char;
Cod : integer;
BEGIN
AbreVent(8);
Menaajes('CUR50 DE ESTRUCTURAS',9,1);
Mensajes('
DE DATo9',9,2);
Mensajes(' EDITOR-COWILADüñ',9,4);
Version 1 .O ' ,9,5) ;
Mensajes( '
Mensajes('
Por Maria Elena Amara Diaz.',l,7);
LeeCar(Car,Cod);
CierraVent(1)
END;
BEGIN
{ CUERPO
PRINCIPAL )
Presentation(' EDITOR DEL CUR50 DE ESTRUCJXRUS DE DA=
Version;
V
1.0
MERU : Esc
');
ElTexto := Nil;
Nombre :=
'*;
InicCabz(Ap,Cabeza,EiTaxto);
REPEAT
menu(ListaHsnu,blue,white,red,white,black,blue,0{l3arco),~arm{~},4{~~x),Z{poa_y),~r,~to,lPuipar);
RBViI).~M(Ap,N~~,El~to,N~o,~~~);
if Numero = Opmarm then
if not Verifica then
Numero := 1;
UNTIL (Numero = OpcTerm);
if not Nulo(E1Texto) then
HazNulo(ElTexto);
CierraVent(2);
clrscr;
END.
{
CiJERPO PRINCIPAL }
UNIT Ed;
{ Realizado por Azuara Diaz Maria Elena.
}
[ Curso de Estructuras de Datos.
Editor de Textos y Analizador d e l Lenguaje.
Procedimiento para l a Edicion de textos.
1
( En esta unidad se encuentran los procesos que
se utilzan para l a
Edicion de un T e x t o representado en una lista doblemente ligada
d e string
( modo Texto ) .
)
INTERFACE
(
ModUnRenglon : En este procedimiento se realizan todos l o s cambios
que se deseen sobre un <Renglon>.
Permite e l delizamiento de pantalla hacia l a izquierda.
Incluye ademas e1 aprovrhamiento de teclas funcionales
como: Rigth, Left, Ins, Del, End, Home ,Backspace y Temdiici
l a edicion con cualquie otra t e c l a funcional.
Si cConFuno = 1 indica que se consideraran funciones
adicionales para e l manejo d e l renglon:
F10 : Centra renglon
F3
: I n i c i o de palabra
E2
: F i n de palabra
F4
: Elimina Palabra
F7
: Elimina todaa l a Palabras a l a derecha
CAP>
: Es e l n\llpoIo de caracter a p a r t i r del cual
<Modo>
: indica e l modo de escritura (1ns.SobreEsc)
s e empezara a capturar
<Cabeza> : Es el control d e l texto que s e maneja
<Coord>
: Es el control de l a linea de entdo que
<Cod>
: Regresa e l Codigo de l a ultima tecla usada
solo se pinta si <ConFuno = 1
( e l codigo con e l que termino)
PROCEDURE ModUnrenglon( var Renglon : Cadena; var Cabeza : Registro; ConPunc : integer;
var Ap,Codigo : integer; var Modo : &&a;
{ PosSig
: Localiza l a Ocurrencia de una <Frase> en un <Renglon>
pero buscando despuos de CPo.Anterior>
Coord : F4agCoord);
FUNCTION
PosSig(PosAoteri0r : integer; Fraae,ñenglon : Cadena) : integer;
I
{ 8-n
: Repite l a lectura de teclado hasta que reciba S/N/Esc
1
PROCEDURE s-n(var Resp:char);
{ Datos : Captura una Cadena (<Renglon>) en una sola linea
pero permite
deslizamiento hacia l a izquierda de renglon.
Hace un windm de ( x , y ) , ( x t l i m , y + l ) y captura a p a r t i r de l a
posicion ( 1 , Z ) d e l window.
S i l a primar t e c l a que
lee no es funcional borra reemplaza l a
cadena con e l caracter leido. Termina con ENTER o ESC.
Si termina l a captura con ESC entoncea regreaa l a cadena original.
<Cod> regresa e l Codigo con e l que termino
PROCEDURE Datos(var Renglon : Cadena; x,y,Lim : integer; var Cod : integer);
{ Reemplazar : s o l i c i t a l a f r a s a
a reemplazar, e l reemplazo y e l t i p o
de reemplazo (Globla o con verificacion individual)
Recibiendo un texto en una <Lista> doblemente l i g a d y
<Cabeza> que a8 control del texto lo va recorriendo y
reemplazando hasta que se cancela con ESC o Termina e l
Taxto.
Regresa CAP> = 1 y el texto en su i n i c i o .
PROCEDURE Reemplazar( var L i s t a : ApTexto; var Cabeza : Registro; var Ap : integer);
{ EditoTexto :
Recibe l a posicion <Ap> de i n i c i o y e l <Texto> a editar en
UM
l i a t a doblemnre ligada. el no
-
de columna8 y
renglones permitidos C L i m x y Limy>. E l nombn e Nanlv del
texto que se esta editando para poder deiplegarlo en l a
l i n e a de estado.
A d e m a de e l uno completo de la8 tsclae funcionalem de
cModUnRenglon> tiene l a s teclas :
Termina l a edicion con ESC
PROCEDURE EditorTexto
( V a r Ap : integer; var Texto : Aprcato; Liiia,Limy : integer; Namb : Cadena;
var Cabeza : Registro; CLE : boolean);
.
83
UNIT EdArchiv;
( Realizado por Azuara Diaz Maria Elena.
1
{ Curso de Estructuras de Datos.
Editor de Textos y Analizador d e l Lenguaje.
Procedimiento para l a validacion de nombru de archivos.
INTERFACE
USES
Dos ,EdTipos;
{ W a y : Pasa una cadena a mayusculas
1
FUNCTION AMay(Cad : s t r i n g ) : string;
{ SoloDrive : < D i o es un directorio completo.
Si en e l existe un Drive
l o regresa en l a funcion, en otro caso regresa nulo
FUNCTION SoloDrive(Dir : s t r i n g ) : string;
{ SoloDir
: < D i o es un directorio completo. RegrOM solo l o que
corresponde a l directorio s i e l Drive
1
FUNCTION SoloDir(Dir : s t r i n g ) : string;
{ NomReducido : Regresa solo e l drive y e l Nombre (sin directorio) del
archivo. Si <Ncpbre> no tiene drive regresa e l actual
1
FUNCTION Nomñeducido(Nombre : s t r i n g ) : string;
( Nomñrchivo : RegreM un nombre valido de archivo. Este s e u t i l i z a
despues de capturar e l nombre ya que puede no ser bien
teclead0
FUNCTION NaPArChiVO(N0mbKe : string) : string;
IMPLEMERTATION
UNIT EdAyuda;
{ Realizado por Azuara Diaz Maria Elena.
}
{
Curso de Estructuras de Datos.
Editor de Textos y Analizador d e l Lenguaje.
Procedimiento para l a Emision de Ayuda.
1
INTERFACE
USES
HerrGral,Crt, HerrCons, EUerram;
{ AyudaEd : Abre una ventana y despliega l a ayuda para e l editor de
textos en &o
Texto. CNumAy> es el numero de pantalla
de ayuda ( l a i n i c i a l es O )
1
PROCEDURE Ayudad ( N d y : integer);
IMPLEMENTATION
UNIT EdHerram;
{ Realizado por Azuara Diaz Maria Elena.
}
{ curso de Estructuras de Datos.
Editor de Textos y Analizador d e l Lenguaje.
Procedimiento para l a Edicion de textos.
}
INTERFACE
USES
HerrGral,EdTDA,EdTipos,Crt,PtoolsZ;
(
Corta : Escribe a p a r t i r del primar caracter d e l renglón pero solo l a
cantidad de caracteres indicada por <Limx>
}
PROCEDURE Corta(Reng1on : Cadena; Limx : integer);
( Los siguientes procedimientos sirven pera l a mrinipulación de pantalla:
EscPant : Reescribe l a pantalla a p a r t i r de l a l i n e a donde se encuentre
el cursor,
escribiendo loa renglones a p a r t i r
del
caracter
número cCabeza.ApInicial> y con un número de caracteres de
a
i o más <Cabeza.Limx>.
Los renglones comienzan a p a r t i r de Texto-.Renglon.
EscPantSup : Reescribe en pantalla a p a r t i r de l a primer posicion de
pantalla y a p a r t i r de Cabeza.Superior y poeiciona el cursor
en l a primer posición d e l renglón correepondients a Texto
RecPantIzqDer : La v a r i a b l e incr-to
indica si l a pantalla
se
va
recorrer hacia l a izquierda cIncrenmnto = -1> o hacia l a
a
de-
recha <Incremento = i>.
Actualiza
<Cabeza.ApInicial> = <Cabeza.ApIniciil> + Incremento.
Coloca e l cursor en l a primer posición de pantalla y llama
EscPant(Cabeza
, Caboza.Superior),
a
donde <Cabeza.Superior> e s
e l apuntador a l primer rengl6n v i s i b l e en l a pantalla.
Recoloca el cursor en su posición o r i g i n a l .
RecPantUpDam : La v a r i a b l e incremento indica s i l a pantalla
recorrer hacia a r r i b a <-1> o hacia abajo c1>.
--
Si Sube
<Cabeza.Superior> = Anterior de cCabeza.Supedor>
Si Baja
86
se
va
a
<Cabeza.Superior> = Siguiente de <Cabeza.Superior>
Coloca el cursor en
l a primer posición de pantalla y llama a
EscPant(Cab.za , Cabeza-Superior).
Recoloca el cursor en su posición original.
MueveApInicial : Actualiza
<Cabeza.ApInicial> = <Cabeza.ApIniciai> + Incremento.
Llama a RecPantUpDcwn(Cabeza,Incrr-rx,)
y coloca el cursor
el l a posición (x,y).
PRpCEDURE EscPant(Cabeza : Registro; Texto : ApTeXto);
PROCEDURE EscPantSup(Cabeza : Registro; Texto : Apexto);
PROCEDURE RecPantIzqDer(var Cabeza : Registro; Incremento : integer);
PROCEDURE RecPantUpDown(var Cabeza : Registro; Incremento : integer);
PROCEDURE MueveApInicial( var Cabeza : Registro; Increment0,x.y :integer);
{
Los siguientes procedimientos controlan las ventanas :
AbreVent
: Abre l a ventana definida con e l número <NU>.
CierraVent : Cierra <Nun> ventanas comenzando por la ultima en abrirse
y siguiendo e l orden contrario a l que se abrirron.
Preeentacion : Declara las ventanas que se usan en el programa y abre la
principal.
UnMomento : Abre una ventanita con el mensaje UN MíUENTo
1
PROCEDURE AbreVent(Num : integer);
PROCEDURE CierraVent(Num : integer);
PROCEDURE Preeentacion(Mensaje : Cadena);
PROCEDURE UnMomento(Mensaje : Cadena);
{
El siguiente procedimiento inicializa todos los campos de la variable
<Cabeza> :
)
PROCEDURE InicCab(var Cabeza : Registro; var A w : ApTexto; Lx, Ly : integer);
IMPL6116NTATION
87
-,.-*.-.--.-.-
.
.
.
--
-. . . . . . . . . .
_
I
I
. . . . . . . . . . .
-.
-.=
.-................
.-.
.......
,
UNIT EdLiWdO;
( Realizado por Azuara Diaz Maria Elena.
}
{
Curso de Estructuras de Datos.
Editor de Textos y Analizador del Lenguaje.
Procedimiento para l a Edicion de l a Linea de Estado.
}
INTERFACE
USES
Dos,EdTipos, C r t ;
{ Posiciones : Calculas l a s coordenadas de los Mensajes de l a linea
de estado los cuales los guarda en cCwrd>. Los calculoa
los hace considerando e l numero de columnas disponibles
para l a linea <Tam>
PROCEDURE Posiciones(Tam : integer; var Coord : RegCwrd);
[ EscMoü : Escribe ya sea <Mens> o < N u 0 en l a s coordenadas <x,y>.
E l <Tipo> indica s i se escribe una cadena o un numero
}
PROCEDURE EscMoD(Men6 : Cadena; Num,x,y,Tipo
: integer);
{ LineaEdo : Escribe La Linea de estado
}
PROCEDURE LineaEdo(x,y : integer; Modo : mode; C w r d : RegCwrd );
IMPLEMENTATION
UNIT EdlDA;
{ Realizado por Azuara Diaz Maria Elena.
1
[ Curso de Estructuras de Datos.
Editor de Textos y Analizador d e l Lenguaje.
Procedimiento para l a manipulacion de l a s Estructuras usadas en e l Editor.
}
INTERFACE
USES EdTipos;
{ Tiene los procedimientos para e l manejo de l a s
listas doblemente ligadas
que se u t i l i z a n para e l editor
FUNCTION
ApUp(Nod0 : ApTexto) : ApTexto;
FUNCTION
ApDm(Nodo : ApTexto) : Apexto;
FUNCTION Reng(Nod0 : ApTexto) : cadena;
FUNCTION
Nulo(Nod0 : ApTexto) : boolean;
PROCEDURE NApup(vsr Nodo : Apexto; Valor : A m o ) ;
PROCEDURE N A p ü m ( v a r Nodo : Apexto; Valor : ApTexto);
PROCEDURE NRenglon(var Nodo : ApTexto; Renglon : Cadena);
PROCEDURE Crea(var Nodo : ApTexto);
PROCEDURE InsertaRenglon(var Nodo : ApTexto);
PROCEDURE Libera(var Text0:Aptexto);
PROCEDURE HazNulo(var Texto : ApTexto);
PROCEDURE EliminaElNodo(var Texto : ApTexto);
IMPLEMENTATION
89
UNIT
EdTipos;
{ Realizado por Azuara Diez M a r í a EleM.
}
{ Curso de Estructuras de Datos.
Editor de Textos y Analizador d e l Lenguaje.
Declaracion de tipos usados en el Editor de Textos en modo Texto.
}
INTERFACE
CONST
MaxCol = 250;
TYPE
Cadena = string[251];
{ Renglon
ApTexto =-Texto;
t-0
Texto = Record
Renglon : Cadena;
ApUp,ApDown : ApTaxto
End;
Mode = (SobreEsc,Insertar);
Mov
{
Modo de escritura
= (1zq.Der);
Pos8 = ( I n i c i o , F i n ) ;
Registro = Record
Texto
: ApTexto;
{ Primer renglon de pantalla
}
Superior
{ Nodo Actual
)
ApInicial
: ApTexto;
: integer;
{ Primer caracter de Pantalla
}
Lim,Limy
: integer;
{ Limites de columna y Renglon }
Linea : integer
{ Numero de l i n e a actual
}
End;
RegCoord = Record
{ Coordenadas en X para l o s
1
{ menaajes de l a linea de Estado }
x,y,Modo,Arch : integer;
Nomb,Linea : Cadena
End;
IMPLEMENTATION
I
P r i n t e r , C ü P a i R m ,BdHuram, Crt,EdTlpom;
!ad5 = s t r i n g [ 5 ] ;
--
T
lecha = *-*;
n i a . B r r o r ( v á r A p : i n t e g e r ; E r r o r , Limw : i n t m g u ) ;
RXEDüñB Progrini.(
var Ap,ETTor : i n t . g r r ;
var L i s t a I n i : ApT*xto;
VU
c.bu : ~ i . ~ O ) ;
ST
T o t a l P a m = 20;
PalRea : array [l..TotalPalReS) of string[15IP
(
'PRXRAHA',
'DE',
'IMPORTA',
'TIPO',
WAR',
'PFtOCEDIMIIñNTD',
'FUNCIOI?'
,
'CELM',
'FIN',
'NOT',
'NULO',
'APUHT' ,
'PARA',
"ASTA',
'POR',
'HAZ',
'SI',
'EIWCNCES',
'OTRO',
'MIENTRAS* ,
'REPITE',
'LIBERA',
'CREA',
'REGRgSA',
'EWl'ERO',
'ARREGLO',
'MATRIZ',
'CCUIENW');
TotalSop = 21;
Separadores : array [l..Totalsep] of char =
I'
' #
.-.
1
.,
.
,,
*
I
':',
,,
'.I
'C.,
'>'
I r 1
'#'
'@'
'L'
'['
*I'
8 * 0
92
6 . FIN DEL PROYECTO.
8
.
Si bien se cumplieron la mayoria de las necesidades planteadas
para el proyecto, este esta en una etapa basica ya que el Curso de
Estructuras de Datos puede tener un gran alcance si se desarrollan
las etapas inconclusas y se amplian los requerimientos.
0
0
ADME - 1 9 9 0
93
.
PROYECTO DE INVESTIGACION
I Y I1
CURSO D E ESTRUCTURA DE DATOS
ALUMNA : AZUARA DIAZ MARIA ELENA.
86324881
ASESOR : LOZANO MORENO HECTOR.
DICIEMBRE 1990
9Y
Descargar