148.206.53.233148.206.53.233/tesiuami/uam7389.pdf · cuando en los cursos de programación se...
TRANSCRIPT
PROYECTO DE INVESTIGACION
I Y I1
/ CURSO DE ESTRUCTURA DE DATOS /’
ALUMNA :PZUARA DIAS MARIA ELENA. . 86324881
ASES0R:LOZANOMORENOHECTOR.
DICIEMBRE I990
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 los 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
VAR Exito
VAR Num
VAR Car
: INTEGER Ap puede tomar valores del conjunto de los números enteros.
: BOOLEAN Exito puede tomar los valores booleanos TRUE y FALSE
: REAL Niim puede tomar valores del conjunto de los números reales.
: CHAR Car puede tomar valores del conjunto del caracter O al 255 .
. 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, los 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 formal de encapsular ciertas partes de nuestros procesos.
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 Estructuras de Datos (CED) debera proporcionar
las herramientas necesarias para implementar TDAs y depurar sus operaciones en forma grafica en un monitor. Tambien debera proporcionar un interprete capaz de detectar fallas en la ejecución de las operaciones y los procesos implementados con ellas.
. #
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 los TDAs.
.
#
-Interprete para depurar en forma grafica las operaciones codificadas en el lenguaje propio.
-.
6
3.1. LENGUAJE DEL CED.
0
Para la codificacion de las operaciones de los TBA se implementara un lenguaje estructurado propio. Este sera un lenguaje sencillo muy facil de recodificar a lenguajes como Pascal o C ya que la gramatica del leguaje se basara en ellos por ser l os mas comunes.
. 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 graf ico 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 as operaciones de los 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 los 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
encuentra una operación del mismo nombre validara proc-dimiento.
Como cada operación de un TDA es un encapsulado no validarln las operaciones internas sino el resultado reflejado las salidas de las mismas. A continuación se enlistan los TDAs 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 -_
si el
se en que
9 - .- . ... . . . ._ _. - . . . . . - .
. ...... - - . . . . . d._&_..
--
4 . DESARROLLO DEL PROYECTO*
4.1. LENGUAJE.
Para crear un leguaje primeramente es necesario proponer una gramatica que cubra las necesidades establecidas en el planteamiento.
.
GRAMATICA.
Programa := PROGRAMA <NomIdent> <DecVar> <ListaDef> <Cuerpo>
DecVar := <DecTipos> <DecVariables> / <DecVariables> <DecTipos>
DeCTipo8 := TIPO <ListaTipos> / &
UnTipo := <IndetTipo> = ARREGLO [ <Numero> ] /
<IdentTipo> = MATRIZ [ <Numero> , <Numero> ] / <IdentTipo> = <Registro> / <IdentTipo> = <Celda>
Registro := REGISTRO <ListaVars> FIN
Celda := APUNT <ListApunt> FIN
LiatApunt := INFO = <NomIdent> ; APUNT = <ListaIdent> / APUNT = <ListaIdent> ; INFO = <NomIdent>
DecVariables := VAR <ListaVars> / ¿B
10
Listavare
Vars
Proced
Funcion
Lis tParm
Params
LiataIdent
Tipo
ListaDef
Def
Cuerpo
ListaInet
Inst
:= PROCEDIMIENTO <NomProc> ( <Listparam> )<DecVar> <ListaDef> <Cuerpo>
:= FUNCION <NumFunc> ( <ListParm> ) : <Tipo> <DecVar> <ListaDef> <Cuerpo>
:= <Params> / <Params> ; <Listaparm>
:= VAR Wars> / Wars>
:= <NomIdent> / <NomIdent> , <ListaIdent>
:= ENTERO / <IdentTipo>
:= <Def> <ListaDef> / <Def>
:= <Proced> / <Funcion> / 8
:= COMIENZA <ListaInst> FIN
:= <inst> / <Inst> ; <ListaInst>
:= SI <ExpBool> ENTONCES <CuerpoInst> .( OTRO <CuerpoInst> ) /
MIENTRAS <ExpBool> HAZ <CuerpoInst> / REPITE <ListaInst> HASTA <ExpBool> / PARA <Asignadon> HASTA <Exp> HAZ <CuerpoInst> / <Instsimples>
Instsimples
Asignacion
ExpBool
ExpBooleana
Comp
Comparacion
EXP
Expl
Term
Term1
Fact
ListaExp
OperRel
Conect
. <NoaiProc> ( <ListaExp> ) / <Asignacion> / CREA ( <Ident> )
REGRESA ( <Exp> ) / LIBERA ( <Ident> ) /
<Ident> - <Exp> / <Ident> - NULO / <Ident> ESNULO ( <Exp> )
NOT ( <ExpBooleana> ) / ( NOT ( <ExpBooleana> ) )
/ <ExpBooleana>
<Camp> / <Camp> <Conect> <ExpBoolena> / ( <Camp> <Conect> <ExpBooleana> )
<Comparacion> / ( Comparacion> )
<Exp> <OperRel> <Exp>
<Term> <Expl>
<OperAd> <Term> <Expl> / &
<Fact> <Terml>
<OperMul> <Fact> <Terml> / &
<Ident> / <NomFunc> ( <ListaExp> ) / <Numero> / ( <EXP> 1
<Exp> / <Exp> , <ListaExp>
< / > / = / <= / >= / #
& / @
OperAd := - / +
OperMul := * / /
CuerpoInst := <Inst> / <Cuerpo>
Ident := cSecNombA.> / cSecNomb.> / <NomIndet> [ <Exp> , <Exp> 3 <NomIdent> [ <Exp> ] / cNomIdent>
SecNomb- := <NomIdent> 4 h . <SecNomb> )
SecNomb := cNomIdent> . <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 para Apuntadores como para Enteros.
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 ENTERO Y LOS DEMAS CAMPOS APUNTADORES. ~
-REGISTOS.
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 realiza el Editor de Estructuras son las siguientes:
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
- Poner un Apuntador a NULO. - Dar valor a los campos de tipo entero.
otra.
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.
P r o w r r m r i NombProu D e o U r r PROORAMA
C U I r P O
D . 0 U r r i eaT i P O S eoUrrirbler
D o C U r r i rb l I. DeoTipor
DecUariablesi L i s t r u r r i
L i s trUrrr I
U r r r : i8trId.n
b
P r o o r d i PROCEDI HI ENT L i r t a P a r ~ ~
C u r r p o L i s t a D e f DeeriJar
Func i on : FUNCION NoMFunc L i s t a P a r a M
i Cue rpo L i s taD e f
L i s t a P a r M : n u l 1
P a r a M s : U a r r
L i s taI d e n t 3
c urrpm I
cow r m z a i s t r l n r t F I N
L i r t r I n r t i n u l 1
__
I n s t e
PA R A C l r i a n r a i o n E x p
E x p B o o l ENTONCES Cuorpo I n s t
MIENTRAS E x p B o o l H ñ Z
L i r t r I n r t
E A p B o o l x
I n s t s i m p l o .
C u r r p o I n s t 1 ' n u l l ' I C u o r p o I n s t I
I n s t s 1 m p l 0s i
L i s t r E x p >
REGRES A 3
I f i s i r n r o i o n 1
E x p B o o l o r n r r COMP Conmot E w p B o o l m r n a
3 C o n e a t
COMP
< E X P 0 p m r R o 1 E x p
E X P
Expr T e r M E x p í
E x p í : OperFSd E x p í
ESNULO C E x ] Cis i wn &a i o n I I w w I d o n t E x P
N U L O I A
. L i s t r T i p a s : 127992
I
I dmntT ipo
MCITRIZ N U M O P 0 N u ~ o r o
REGISTRO ListrUrrs F I N
CIPUNT L i 8 t Flpun t F I N
CIRREQLO 1
T i p o : I d r n t T i p o
ENTERO
T e r M í : Opcri lu 1 F a c t TerMi
nu l 1
F a c t : c
NoMFunc i s t a E x p
I d e n t I N U M e r O
L i s t r E x p i
\
21.
L i r t f i p u n f i NOM I don t
NoMIden t
I R P U N T L i r t r I d o n t I N F O -
L i I trD O f I
n u l 1
P r o c e d I Func i on
I I P r o c e d I F u n c i o n
ExpBooli NOT E x p B o o l e a n a >
E x p B o o l e a n a
E x p B o o l e a n a
Numoroi
O p o r R o l I <I >I= /<= I >=I #
C o n e c t :
rn OperFSd:
C u r r p o I n r t :
I d r n t :
i n u l 1
NOM I dmn t E x p 3
h. N o m I d r n t n u l 1 t A .
Nowbidant : L r t r r
L e t r a / D i i / -
L e t r a :
D i u :
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 Graf Tipo GrafCapt GrafColor GrafEdit GrafHerr GrafMarco
Manejo de Estructuras Ligadas GrafNEdit (Unidad Principal) Graf NList GrafNMve GrafNodo
Manejo de Estructuras Secuenciales GrafSEdit (Unidad Principal) Graf SArr Graf SLis t Graf SMve
24
Estructuras de datos usadas en e1
Editor Graf ico ( de Estructuras 1 igadas 1
I I I I 7- I
I
1
I
r' 1 A r N o d o IAPNodo I [ ApNodo I ApNodo I IApNodo 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
. crui mn t o -r
[ 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; ~ i t ~ a p , ~ i , ~ 2 , ~ 3 , P Q : pointer; Cod : integer;
BEGIN { CUERPO PRINCIPAL }
MaxL := (GetwawY - 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 if Reg.TüA = 1 then
Edicionti(BitHap,Pl,P.?,P3,P4,Cod,~) else
EdicionS(BitHap,Pl,PZ,P3,P4,Cod,R.g); UNTIL Cod - ESC; CloseGraph;
Em. ( CUERPO PRINCIPAL )
28
UNIT HerrCons;
CONST
Backspace = 8;
Cñack =127;
STab =2715;
Home = 2771;
End- = 2779;
Ins = 2782;
PgDn = 2781;
Ciiome = 27119;
CEnd- = 27117;
F1 = 2759; F2 = 2760;
E7 = 2765; F8 = 2766;
SF1= 2784; SF2= 2785;
SF7= 2790: SF8- 2791;
CF1= 2794; CF2= 2795;
CF7= 27100; CF8= 27101;
AFl- 27104; AF2= 27105;
ñF7= 27110; AF8= 27111;
E n t e r * 13; CEnter = 10;
tab = 9; Eec = 27;
Up = 2772; D m = 2780;
R i g t h = 2777; L e f t = 2775;
Del = 2783; Pgüp = 2773;
CPgüp = 27132; CPgDn = 27118;
CRlgth = 27116; C L e f t = 27115;
F3 = 2761; F4 = 2762; F5 = 2763; F6 - 2764;
F9 = 2767; FlO= 2768; F11= 2787; F12= 2788;
SF3= 2786; SF4= 2787; SF5- 2788; SF6= 2789;
SI9= 2792; SFlO= 2793;
CF3= 2796; CF4= 2797; CF5= 2798; CF6= 2799;
cP9= 27102; CFlO= 27103;
AF3= 27106; AF4- 27107; W5= 27108; Ap6= 27109;
AF9- 27112; AFlO= 27113;
IMPmNTAT f ON
.
UNIT HerrGral;
INTHiFACE
USES
C r t :
{ LeeCar : Regresa el codigo correepondle+n+e a l caracter e l 98 que no es UM tecla funcional de lo contrario le sumo un 2700.
No despliega en pantalla el caracter.
PROCEDURE LeeCar(var car : char; var Codigo : integer);
[ Mensajes : Manda escribir una cadena a partir 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 : string) : 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 lo regresa en UM cadena
1
FUNCTION Caden(Va1or : integer) : string;
{ PoiBig : E l siguiente pmcadimimto encuentra l a poslclón dm un frame en un renglbn tal que esa posición a- mayor que <k?osAnterlor>
1
PUIiIcTIüii PoiSlg(Po.Antarior : integer; Fraw,Raglon : 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 las Estructuras empleadas en e l Editor.
}
INTERFACE
CONST
TamInfo = 12;
XP in i = 50;
{ Para Estructuras Ligadas }
AnchNodo= 4;
TamLiga.= 2;
TYPE
1 Para Estructuras Ligadas }
ApLista = -List;
RegInfo = Record
Dato : integer;
Ligas : pointer
End;
L ist = 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 { N o d o s ) : (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 grafico 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 las coordenadas que manejan coaideran l a }
{ columna y e l renglon de <GrafColTxt> pixeles
{ GrafMens : Escribe un mensaje <mag> en las coordenadas (x,y) que en
pixeles serian (x*GrafColM,y*GrafColTxt) y pondra una
letra por columna y renglon
Si e l tamaño del mensaje es menor que <Tam> entonces com-
pletara el tamailo con espacios en blanco.
Cuando se escribe borra lo que este anteriormente
<Color> : Para borra l o que quede debajo del 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> es el codigo de l a tecla con que termino.
<x,y> son l a s coordendas (No pixeles)
<Tipo> indica de que tipo sera e l resultado &tenido
O : Cadena sin blanco (No pr imite Capturar Blancos)
1 : Cadena (Sin reitriccionei 1
33
.
2 : Entero 3 : R e d
(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 s i es mono y a i no encuentra el arch. entoces pregunta
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>+'[ 1 9 las 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 EX.
PROCEDURE PideInfo(MSG : string; var Cod,Info : integer;x,y : integer);
( InicRegCar : TDA determina la estructura que se esta manejando -_ S i TDA = 1 (Nodos)
Reg.Hs : Numero de ligas que tiene el nodo ( := <Es>) Reg.Lado : S i Lado = -1 se pintaran las ligas del lado izq.
S i Lado = 1 se pintaran laa l igas del lado der.
S i Lado =
las l i gas una de cada lado.( := <Lado>)
Reg.Incx : Es e l desplazamiento que hara e l cursor para moverse
Siempre y
O tendran que ser Hs = 2 y se pintaran
de un elemento a otro en e l mimo renglon.
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 se debe inicial izar Nulo
Tambien tiene e l control para l a pantalla
Reg.yini,
Reg.xini : Como se pude recorrer l a pantalla hacia l a izq. y
hacia arriba xini y yini indican e l numaro de columna
y renglon en e l que supuestamnte empieza l a pantalla
(los inicial iza en 1 )
PROCEDLlRE Inicia~izaRegCar(TüA,€is,Lado : integer; var Reg : RegCar);
{ InicVar : Inicial iza los paramentros en 1
}
PROCEDURE InicVar(var x,y,Inc : integer);
{ DefineEstruc : Manda los mnsajes para preguntar s i se cambia de
estructura Ligada a secuencia1 o visceversa
TDA =
TDA <> 1 Se considera Secuencia1
Captura TDA terminando con ESC,ENTER o F1
1 Se considera Ligada
}
PROCEDURG DefineEstruc(var TDA : integer);
PROCEDURE MensError(Error : string);
IMPLJMENTATION
UNIT Gramerr;
{ 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 las coord. del extremos superior i zq . de
un nodo
y un proced. que devuelve el tamaiio de un nodo dependiendo de
el número de ligas.
}
INTERFACE
USES
GrafTipo.Crt;
{ CoordPant : Recibe una columna o renglón cCoord> y l a columna o renglón
inicial en pant. cIni> 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 inicial
en pant. <Ini> 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 las coordenadas visibles en pantalla actualiza l a coordenada de inicio en pantalla
o sea l a columna y l a linea a partir 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.esta la inicializacion del modo grafico (Inicializa) y l a 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 - . . - . . .- . _- - . .- . . . , -‘I
. . . . . . - __ A- . ”.- . . - . . .. -ucI -P
PROCEDURE GetMarco(var Pl,P2,P3,P4 : pointer);
{ PutMarco : Recupera en pantalla el marco que esta guardado en los Pi
1
PROCEDURE PutMarco(var Pl,PZ,P3,P4 : pointer);
{ FreeMarc0 : l ibera los P i ' s
1
PROCEDURE FreeMarco(var Pl,PZ,P3,P4 : pointer);
{ arco : Pinta un marco en e l que vienen las instrucciones para editar
un TDA.
S i ya se llamo este procedimiento es necesario l i b r e r a los P i
antes de mandarlo llamar nuevamente.
ccasoz indica si se trata de Mensajes de una estructura ligada (=i) o una estructura secuencia1 (<>1) .
Los mensajes para cada caso ya estan definidos dentro del
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 las coordendas del cursor pero hay que pasarlas a coord
de pantalla restando (xini,yini)
PROCEDURE Get(x,y,xini,yini : integer; var BitMap : pointer);
{ Put : Recupera l o que tenia l a pantalla antes de poner el Cursor
1
PROCEDURE Put(x,y,xini,yini : integer; var BitMap : pointer);
{ Cursor : Dibuja un cursor.
(x,y) son las coordendas del cursor pero hay que pasarlas a coord de pantalla restando (xini ,yini )
-_ 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 as coord. (x,y)
I
PROCEDURE DibInfo(Dato,x,y : integer);
IMPLEMENTATION
41
UNIT GrafNEdit;
{ Realizado por Azuara Diaz Maria Elena.
k
( Curso de Estructuras de Datos. Editor de Estructuras. Procedimiento para l a Edicion de Estructuras Ligadas (Nodos)
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 Cod : integer; var Reg : Regcar);
( Edicion de !KIM Ligados
)
PROCEDURE EdicionN(var BitMap,
( Edicion de TDAa Ligados
}
var x , y , Inc : integer;
U,PZ,P3,PI : pointer; var Cod : integer; var Reg : Regcar);
PROCEDURE: InicVarParaNodoe(var Cam : ApCamN; var Reg : Regcar; La&,Bs : integer; var NumIlijo : integer; 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
PñüCEDURE Reinicia(ALigas,ALado : integer; var x,y,NucBijo : integer; var Reg : RegCar; var NodoIni,NodoPin : ApLista; var Cam : ApCamW);
{ D a 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 ano.
1
var Despx,Despy : integer;
PROCEDURE DeapActual(var Inc,Despx,Despy : integer; var Reg : RegCar);
{ Si <In0 = 1 entonces el dosplazamineto ser6 de una sola
1 columna o renglon, de lo contrario sora de nodo a nodo
ñEOIN i f Inc = 1 then
BEGIN ~ e a p x := rmg.Ino<; Deapy := Reg.Incy
END else
2t3 - - 1 - . - - - _ - . _ _ --_- 1_ _._._ . . . .- .... . - - . .. - -e.- .. .
c -- . ....
BEGIN Daepx := 2; Daepy := 2
END END;
BEGIN { ACT CURSOR )
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; var 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 : ApCamN; Dib,EnC : 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);
[ Quita el cursor de l a posición donde se encuentra. Dibuja el nodo y pone el cursor en el extremo superior izquierdo del nodo
}
BEGIN Put ( Y, y, Reg. xini ,Reg. yini, BitMap) ;
if (Reg.xini > x) or (x + TamWodo(Reg.Hs) > Reg.xini + MaxC - 1) OX
Dimodo( OiX,Y,Reg) ;
(Reg.yini > y) or (y + AnchNodo > Reg.yini + MaxL - 1) then PutMarco(Pl,PZ,P3,P4);
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)
Dib := InsertaBntista(Liita^.Apy^.Apx,x,y,Reg.Es) else
else InaertCam( Lista, 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 : ASH; var NI,NF : ApLi i ta) ;
{ 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 : ApCamN; Nodo : ApLista; Eli,Enc : 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 - 1,Reg.yini + MaxL - l,Reg,Cam,Pi,PZ,P3,P4); GetCursor(BitMap,x,ylReg.xini,Reg.yini)
END else
MensError('No Existe Nodo En Esta Posicionl); END;
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, di- buja la liga y les da valores nulos a los parametros que indica u- nion 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, - l,Reg,NodoIni); 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)
END
else RecCami~N(Reg.xini,Reg.yini,Reg.xini t MaxC - 1,Reg.yini t MaxL - l,Reg,Cam,Pl,P2,P3,P4);
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
{ 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 - 1,Reg.yini t MaxL - l,Reg,Cam,Pl,PZ,P3,P4); GetCursor(BitMap,x,y,Reg.xini,Reg.yini)
END:
PROCEDURE DefineNodo(var x.y : integer; var Reg : RegCar; var Cam : ApCamN; var Nü : integer; var N1.W : ApLista);
{ 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.
S i se trata de dos l igas por default se asignara una de cada lado (Lado = O)
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 as 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 ' , l l , ' l ) ;
FUNCTION OpcALado(ALado : boolean; Opc : integer) : integer;
{ Toma como referencia el Arreglo de opcionea Para -ir el Lado del que dibujaran las ligas S i <&ado> es cierto pasa de Opcion a Lado y de Lado a opcion a Lado
BEGIN if ALado then { Pasa de Opcion de Menu a Lado }
if Opc = O then OpcALado := 1 { Derecho }
OpcALado :- -1 { Izquierdo }
else
else { Pasa de Lado a Opcion de nuiu }
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 el 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 el Editor SUM borradas ii!ii*,l,y-2,Tsm,BLA~); GrafMene('ESC : Canceiar P1 : Aceptar',l,y-l,Tsm,BLACX); GrafMens( 'Define Nodo Numero De Ligas [ ] Lado ['+Arr[OpcALado(falae,Lado)]+']',l,y,T~,BLACK);
END;
-..
BEGIN { DEFIRE NODO }
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); UmIL (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) END; { DEFINE NOM) }
PROCEDURE CambiaInfo(var x,y : integer; Reg : RegCar; var Cam : ApCamN);
{ Pide la info-ion que va a reemplazar el contenido del nodo dondi) se encuentre el 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 el
1nfo.dato por el paramtro <Dato> en el 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 : ApCamM; Nodo : ApLista; Enc : boolean;
BEGIN PonInfo := false; PosLocY(y,Cani,Liata);
5Q
.
if Lista 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 : MueveCureorN(x,y,Inc,Reg,Ccd,Cam); Ins : if Inc = 1 then
5 1 -- -~ .... , . .. . . _. . ... .- __ - - . - - . .- . .. .--A
END.
52
1 2 7 9 9 2
Del
F7
FB
F9
Enter F2
InsertaNodo (x,y,Reg,Cam) else
MensError('Antea de Insertar Cambie Desplazamiento'); : if Inc = 1 then
EliminaNodo (x,y,Reg,Cam,NodoIni,NodaFin) else
MsnsBrror('Antci. de Eliminar Cambie Desplazamiento');
InicioLiga(x,y,NumHijo,Reg,Cam,NodoIni)
MensError('Antes de Mucar Cambie Desplazamiento');
: if Inc C> 1 then
else
: 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;
F3 : CambiaInfo(x,y,ñeg,Cam) END
UNTIL (Cod = ESC) or (Reg.lDA <> 1); FreaMarco(Pl,PZ.P3,PQ); HazNulo(Cam);
END; { EDICION N }
UNIT GrafNList;
{
1 { Curso de Estructuras de Datos.
Editor de Estructura6 de Datos.
Herramientas para e l manejo de las l igas del TDAa Ligados.
Realizado por Azuara Diaz Maria Elena
)
{ En esta unidad se encuentran los procedimientos para e l manejo de liga8 :
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 iga
}
FUNCTION LigasDesp(NumHij0 : integer) : integer;
{ LigasElem : Esta funcion sirve para simular las entradas y salidas a las
l igas de un nodo teniendo un apuntador a memoria y el espacio
disponible para t o d a l a8 l igas de un nodo.
<POS> es e l apuntad- a -ria. <Option> es el que indica s i se trata de sacar l a informacion
I
del elemento o de darle un nuevo valor.
<NumHijo> es e l numero de l iga.
<Dato> es e l valor que en algun caso ae le dara a l a l iga.
cLiga&leiS> siempre regresa e l valor de la l i ga <N-ijo>
1
FUNCTION LigasElemi(0pcion : SacaroHeter; Pos : pointer; Nuiñlijo : integer; Dato : pointer) : pointer;
-_ { LigasNva : Reserva suficiente mmoria para numero <Hu> de apuntadores y
regresa un apuntador a ese regervado
}
53
FUNCTION LigasNva(Hs : integer) : pointer;
{ LigasLibera : Libera l a memoria que se uso para un numero CHs> de apuntadores
<P> es e l apuntador a memoria.
1
PROCEDURg LigaaLibera(P : pointer; Hs : integer);
{ LigasVacia : Pone todas l igas apuntando a N i l
<P> es el apuntador a l a primer l iga.
<Ha> es el numero de ligas
1
PROCñDURE LigasVacia (var P : pointer; Hs : integer);
( * * * * * * * * * * * * * 1
( Aqui se encuentran las operaciones sobre las 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) las cuales
inicial iza con los 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 tipo ApCrmN e inicial iza sus campoe
con valoren nulos.
}
PROCEDURE CreaCam(var Nodo : AS-);
{ InsertLieta : Inserta un nodo de cood. <x,y> despues de <Pos>, í.e,
<Pos-.sig> y si <pos> es nulo se inaerta en l a primer
poaición de <Lista>. s i <Lista> es nula se le hace apuntar a l nodo.
<He> es e l nurmm de Ligas que tendra el nodo.
'
1
PROCEDURE InsertLista(var Po8,Lista : ApLista; x,y,as : integer):
{ InsertCam : Inserta un nodo de c o d . <x,y> despuea de <Pon>, i.e, c ~ o a - . ~ p y ^ . ~ p x > y s i <POS> ea nulo se iniluta en b pr imr posición de <Cam>.
si <cam> ea nulo se inici laiza 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 Lista se hace
nula y no hay mas l i s tas entonces hace nulo a <Cam>
)
PROCEDURE DelNodo(var Cam, Lista : ApCamN; var Nodo : ApLista);
( AntLocX : Busca un nodo con l a coordenada CX>, regresa en <En0 s i l o
encontro o no y regresa el Nodo anterior a l encontrado o Nil
en <~odo> <Lista> entra para que se busque e l nodo en e l la .
PROCEDURE AnUocX(x : integer; Lista : ApLista; var Nodo : ApLista; var Enc : boolean);
( AntLocX : Busca una Lista en l a que sus nodos tengan l a coordenada <y>,
regresa en <En0 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 la .
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; Lista : As i s t a ; var Nodo : ApLiata);
{ PosLocX : Busca una Lista 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; Lista : ApCamN; var Nodo : A p C a ) ;
{ HazNulaL : Elimina todos elementos de l a <lista>
1
PROCEDURE HazNulaL(var Lista : ApLista);
{ HazNulo : Elimina todos los e1 ntos del camino de busqueda <Cam>
1 ? -_ 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 (solo necesita l a coordenada <x> ya que anteríormsnte
se verif ico 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 las 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 iga correspondiente a esas coordenadas. S i no l o encuentra
o las coordenadas no pertenecen a una l iga regresa valores
nulos
PROCEDURE InicioLiga(var x,y,Numüijo : integer; var Reg : Regcar; var Cam : ApCamN;
var Nodo : ApLista);
{ FinLiga : S i las 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; Reg : 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 cierto 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 iga.
1
PROCEDW 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 os nodos que queden ahi serhn dibujados
de l o contrario solo se dibujaran las l igas (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 las coordenadas donde se encontraba e l cursor y las
coords. a donde debe ir. 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 : integer; var Reg : Regcar; Cam : ApCamiU; var BitNap,P1,PZ1P3,P4 : pointer);
IMPLEMENTATION
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 : RagCa ) ;
( 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 Cam : AN-);
{ Da valores iniciales a todas las variable
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 tecla 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 tecla 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. del cursor por l as 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- var Cam : ApCamS; var Reg : ReqCar);
{ Mueve l as coord. del cursor segun el codigo de las teclas de
movimiento y busca algun elemsnto que contenga las nuevas
I
.
coord. para asignarlo a <Reg.Elenv
1
BEGIN CASE Cod of
Rigth : x :* x + TamInfo; Left : if x > TamInfo then x := x - TamInfo; DOwn : y := y + AnchNodo; Up : if y > AnchNodo then y := y - AnchNodo;
END; Reg.Elem := LocalizaElem(x,y,Cam);
END:
BEGIN { ACT CURSOR }
CASE cod O f
PgDn : if (Reg.Elan c> Nil) and (Reg.Elem-.Prw C> Nil) then CambiaEiem( x,y,Reg.Elem- .Prev,Reg) :
P W P : if (Reg.Elem <> Nil) and (Reg.Elem̂ .Sig C> Nil) then CenibiaElem(x,y,Reg.Elem-.Sig,Reg);
UP,DOWi, Rigth,Left . DenpDeUno(Cod,x,y,Cam,Reg)
END END; (ACTCURSOR }
BEGIN { MUEVE CURSOR 8 }
Aux := x; Auy := y;
Actcursor (x,y,Inc,Reg,Cod,Cam); CuraEnPantS(Aux,Auy,x,y,Rog,Cam,BitHap,Pl,PZ,P3,P4~
END; ( MUEVE CURSOR S )
P€üXEDüRE 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 F1 : Aceptar',l,y-l,Tam,BLACK); GrafMens(*Define El-nto Dimension en X [ ] Dimension en Y [ ]',l,y,Tam,BLACK);
END:
BEGIN { DEFINE ELEM )
Tamx :* O;
Tamy := O;
MensDefElem(y1); REPEAT
Tan# := Valor(GrafCaptura(Caden(Taw),Cod,34,ylrZ,Z,BLACK)); if (Cod <> 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);
(Reg.yíni > y) or (y t Elem-.Tamy AnchNodo r-Reg.yini + NurL - 1) then if (Reg.xini > x) or (x + E~IuII*.T~~ TamInfo 7 Reg.xini t MaxC - 1) or
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 - Reg.Elem-.xP) div TamInfo; y1 := (y - Reg.Elem-.yP) div AnchNodO;
Exito := ( 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 Tmnfo * 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');
END; { CAMBIA INFU )
var Car : char; Cam : ApcamS;
BEGIN { EDICION S }
Cam := 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, PgUP, PgDn Ins : Inser+aSec(x,y,Reg,Cam); Del : ElimiMB.c(x,y,Rep,Cam); FZ : BEGIN
: MueveCursorS ( x , y, Inc , Rep, Cod, Cam) ;
DefineED+ruc(Rsg.TDA); if Reg.TDA e> 1 then
Pu+M.rco(Pl,PZ,P3,P4) END;
F3 : CambiaInfo( x, y, Rep, Cam) END
UNTIL (Cod = ESC) or (R.g.TDA = 1);
Fresniirco(Pl,PZ,P3,P4); HazNul&ec( Cam);
END; { EDICION 8 }
END.
65
UNIT GrafSArr;
{ Realizado por Azuara Diaz Maria E l O M .
)
{ 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 s estos procediminetos consideran que se empieza en el renglon y
columna (0 ,O) 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 : integer) : integer:
{ MatrizElem : Esta funcion sirve para simular las 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 trata de sacar l a i n f o m i o n
del elemtanto o de darle un nuevo valor.
<x,y> son las 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 el valor del elsmonto de lam
cwrd(x,y)
1
FUNCTICN MatrizElem(0pcion : SacarcNoter; Pos : pointer: x,yrTamx,Dato : integer) : integer;
{ MatrizNva : Reaerva suficiente w r i a para 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 la primer posicion de <Cam> dandole
a cam e l valor del nuevo elemento. (x,y) seran l a s coord. del extremo superior izq. del elem.
(Tam,Tamy) seran la8 dimen8iones del arreglo o matriz al
que apunta e l nuevo elem.
1
PROCEDURE InsertElern(X,y,TBmx,Tamy : integer; var Cam : ApCamS);
{ ~ocal iza~lem : Busca en toda l a l ista ccam algun elemonto que contenga
l as coord ( x , y ) . Si no existe algun elemento regresa N i l
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 pantal la
de lo contrario solo mueve el cursor en pantalla. }
{ CursEnPantS : Estructuras Secuencialos
1 PROCEDURE CursEnPantS(xa,ya,x,y : integer ; var Reg : Regcar; C m : Apcam.; var 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
R e n g l o n
R e n g l o n
riMir Rinslon d i La an t a l 1 a
I * R e n s r l o n
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 I ,
'F3 Leer I ,
'F9 Compilar ', 'F4 Opciones ', * Terminar I ,
'S~C~','23~4' 1 , t , I , I t I , 1 , 9 1 1 , 1 , 1 . ( 1 I , 1 1 , , , , , , , , , , , , , ) ;
OpcTerm = 5;
VAR
Ap,Numero : integer; Nombre : Cadena; ElTexto : Agrexto; Resp : char; Cabeza : Registro;
PROCEDURE VentMensBrror(mag : string);
{ Cuando ocurre algun tipo de error se abre una v e n a , manda el mensaje <ma> y espera una tecla para cerrar la ventana
i
var Cod : integer; Car : char;
BEGIN AbreVent(9); writeln( mag) ; Mensajes('Presione una Tecla ...', 7,2); LeeCar(Car,Cod); CierraVent(1);
END;
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 ista 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 : ApTexto);
BEGIN if not Nulo(Text0) then iUziiulo(Texto);
readln(Arch,ñenglon); NRanglon(Texto,Ranglon) ; A w := Texto
Crea( Tmxto) :
END;
BEGIN { ABRE ARCH
aesign(Arch,Nambre); {SI-} reset(Arch); if Ioresult = 0 then
BEGIN if not eof(Arch) then
CreaCa~~t(Arch,Renglon,Texto,Aw); while not eof(Arch) do
BEGIN readln(Arch,Renglon); Insertañanglon(Texto); NReng ion( Texto, Reng lon)
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) END; ( " A R C E I M * }
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
I
.
var Cod : integer;
PROCEDURE NombreGuardar(var Nombre : Cadena; var Cod : integer);
BEGIN if Nombre = ' ' then
BEGIN AbreVent( 5); Mensajes( ' Salvar 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 EL -IRE AL ARCHIVO Y GüARüA EL TEXM }
var Arch : Text;
BEGIN asiign(Arch,NoPbrr);
{SI-)
{SI+) if IoResult = O then
rewrite(Arch);
BEGIN while not Nulo(Texto) do
BEGIN writain(Arch,Reng(Tsxto) ) ; Texto:= ApDciwn(lbxto)
END; C l O M ( 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( WN 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 control del texto
que ea el
)
BEGIN
Ap := 1;
i f Nulo(Aux) then Crea(Aux);
Cabeza.Texto := Am; 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 ...) fue
selaccinada y la ejcuta )
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
I BEGIN
AbreVent(Vent); writeln; writeln(' Archivo : ' ,Nmbre) ; writeln; writeln( ' Lineas Compiladas : ');
END;
PROCEDURE Press;
[ Press se llama si te&M exitosamente la compilacion )
var Reap : char;
BEGIN textcolor(white); textbackground(b1ue); gotoxy(2,e);
textcolor(white); textbackground(b1ack); Reap := readkey
writeln( ' PRESIONE UNA TECLA
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 ;
PROCEDURE ~enuopc(var Nambre : Cadena);
{ Aqui se preantas funciones adicionales laa cuales son utiles para la manipulacion de archivos
1
const Listanonu : Mlist = ( ' l , ' Cambia Nombre ' , I Cambiar Dir. ','ND',*',**,
I , I . 1 1 1 1 1 1 * I 1 1 1 1 1 1 I. , I l l , * I , l l , l l ) ; , V t # , , t t l , *
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;
i
END; C ierra-Menu; Cierra-Menu
END;
BEGIN { REVISA CASO }
ConLinEdo := true; if Reip <> 4 then
Cierra-Menu;
4(F4) : MenuOpc(Noaibre); 3(F9) : Compilador(ConLinEdo,Ap,Nombre,ElTexto,Cakeza); 2(F3) : BEGIN
CASE Resp of
Archivo(Nombre,ElTmcto); InicCabr(Ap,Cabeza,ElT~to)
END;
1{F2) : Salvar(Nombre,ElTexto); 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);
Verifica := upcaw(Rcilp) = i s * ; CierraVent(1)
Leea ( Resp, Num) ;
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); Mensajes( ' Mensajes(' Por Maria Elena Amara Diaz.',l,7);
LeeCar(Car,Cod); CierraVent(1)
Version 1 .O ' ,9,5) ;
END;
BEGIN { CUERPO PRINCIPAL )
MERU : Esc '); Presentation(' EDITOR DEL CUR50 DE ESTRUCJXRUS DE DA= V 1.0
Version; 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); R B V i I ) . ~ M ( A p , N ~ ~ , E l ~ t o , 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 del 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 Texto representado en una lista doblemente ligada
d e string ( modo Texto ) .
)
INTERFACE
( ModUnRenglon : En este procedimiento se realizan todos los cambios
que se deseen sobre un <Renglon>.
Permite el 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 tecla funcional.
Si cConFuno = 1 indica que se consideraran funciones
adicionales para e l manejo del renglon:
F10 : Centra renglon
F3 : Inicio de palabra
E2 : F i n de palabra
F4 : Elimina Palabra
F7 : Elimina todaa l a Palabras a l a derecha
CAP> : Es el n\llpoIo de caracter a partir del cual
se empezara a capturar
<Modo> : indica e l modo de escritura (1ns.SobreEsc)
<Cabeza> : Es el control del texto que se maneja
<Coord> : Es el control de l a linea de entdo que
solo se pinta si <ConFuno = 1
<Cod> : Regresa e l Codigo de l a ultima tecla usada
( 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; Coord : F4agCoord);
{ PosSig : Localiza l a Ocurrencia de una <Frase> en un <Renglon>
pero buscando despuos de CPo.Anterior>
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), (xtlim,y+l) y captura a partir de l a
posicion ( 1 , Z ) del window.
S i l a primar tecla que lee no es funcional borra reemplaza l a
cadena con el caracter leido. Termina con ENTER o ESC.
Si termina l a captura con ESC entoncea regreaa l a cadena original.
<Cod> regresa el Codigo con e l que termino
PROCEDURE Datos(var Renglon : Cadena; x,y,Lim : integer; var Cod : integer);
{ Reemplazar : so l ic i ta l a frasa a reemplazar, e l reemplazo y e l tipo
de reemplazo (Globla o con verificacion individual)
Recibiendo un texto en una <Lista> doblemente ligad 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 inicio.
PROCEDURE Reemplazar( var Lista : ApTexto; var Cabeza : Registro; var Ap : integer);
{ EditoTexto : Recibe l a posicion <Ap> de inicio y el <Texto> a editar en
UM l iata doblemnre ligada. el n-o de columna8 y
renglones permitidos CLimx y Limy>. E l nombn e Nanlv del
texto que se esta editando para poder deiplegarlo en l a
linea de estado.
A d e m a de el uno completo de la8 tsclae funcionalem de
cModUnRenglon> tiene las 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 del Lenguaje.
Procedimiento para l a validacion de nombru de archivos.
INTERFACE
USES
Dos ,EdTipos;
{ Way : Pasa una cadena a mayusculas
1
FUNCTION AMay(Cad : string) : string;
{ SoloDrive : < D i o es un directorio completo. Si en e l existe un Drive
lo regresa en l a funcion, en otro caso regresa nulo
FUNCTION SoloDrive(Dir : string) : 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 : string) : 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 : string) : string;
( Nomñrchivo : RegreM un nombre valido de archivo. Este se uti l iza
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 del 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 in ic ia 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 del Lenguaje.
Procedimiento para l a Edicion de textos.
}
INTERFACE
USES
HerrGral,EdTDA,EdTipos,Crt,PtoolsZ;
( Corta : Escribe a partir del primar caracter del 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 partir de l a linea donde se encuentre
el cursor, escribiendo loa renglones a partir del caracter
número cCabeza.ApInicial> y con un número de caracteres de a
io más <Cabeza.Limx>.
Los renglones comienzan a partir de Texto-.Renglon.
EscPantSup : Reescribe en pantalla a partir de l a primer posicion de
pantalla y a partir de Cabeza.Superior y poeiciona el cursor
en l a primer posición del renglón correepondients a Texto
RecPantIzqDer : La variable incr-to indica si l a pantalla se va a
de- recorrer hacia l a izquierda cIncrenmnto = -1> o hacia l a
recha <Incremento = i>.
Actualiza
<Cabeza.ApInicial> = <Cabeza.ApIniciil> + Incremento.
Coloca el cursor en l a primer posición de pantalla y llama a
EscPant(Cabeza , Caboza.Superior), donde <Cabeza.Superior> es
e l apuntador a l primer rengl6n v is ib le en l a pantalla.
Recoloca el cursor en su posición original.
RecPantUpDam : La variable incremento indica s i l a pantalla se va a
recorrer hacia arriba <-1> o hacia abajo c1>.
Si Sube
--
<Cabeza.Superior> = Anterior de cCabeza.Supedor>
Si Baja
86
<Cabeza.Superior> = Siguiente de <Cabeza.Superior> Coloca el cursor en l a primer posición de pantalla y llama
EscPant(Cab.za , Cabeza-Superior). Recoloca el cursor en su posición original.
a
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 el 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 . . . . . . . . . . . . . . . . . . . . . . . . ................ .-. . . . . . . . ,
_II -. -.= .- - -,.-*.-..--.-..- --
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 las 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 las 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; Cwrd : RegCwrd );
IMPLEMENTATION
UNIT EdlDA;
{ Realizado por Azuara Diaz Maria Elena.
1
[ Curso de Estructuras de Datos.
Editor de Textos y Analizador del Lenguaje.
Procedimiento para l a manipulacion de las Estructuras usadas en el Editor.
}
INTERFACE
USES EdTipos;
{ Tiene los procedimientos para e l manejo de las listas doblemente ligadas
que se utilizan 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 NApüm(var 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 del Lenguaje.
Declaracion de tipos usados en el Editor de Textos en modo Texto.
}
INTERFACE
CONST
MaxCol = 250;
TYPE
Cadena = string[251];
ApTexto =-Texto;
Texto = Record
Renglon : Cadena;
ApUp,ApDown : ApTaxto
End;
Mode = (SobreEsc,Insertar);
Mov = (1zq.Der);
Pos8 = ( Inicio,Fin);
Registro = Record
Texto : ApTexto; { Primer renglon de pantalla }
Superior : ApTexto; { Nodo Actual )
ApInicial : integer; { Primer caracter de Pantalla }
Lim,Limy : integer; { Limites de columna y Renglon }
Linea : integer { Numero de linea actual }
End;
RegCoord = Record { Coordenadas en X para los 1 { menaajes de l a linea de Estado }
x,y,Modo,Arch : integer;
Nomb,Linea : Cadena
End;
IMPLEMENTATION
{ Renglon
t-0
{ Modo de escritura
I
P r inter ,CüPaiRm ,BdHuram, Crt,EdTlpom;
!ad5 = s t r i n g [ 5 ] ;
T lecha = *-* ;
--
n ia .B r ro r ( vá r Ap : i n tege r ; E r ro r , Limw : i n tmgu ) ; RXEDüñB Progrini.( var Ap,ETTor : i n t . g r r ; var ListaIni : ApT*xto; VU c.bu : ~ i . ~ O ) ;
ST TotalPam = 20;
PalRea : array [l..TotalPalReS) of string[15IP ( 'PRXRAHA',
'IMPORTA',
'TIPO', WAR',
'PFtOCEDIMIIñNTD', 'FUNCIOI?' , ' CELM' ,
'FIN',
'DE',
'NOT', 'NULO',
'APUHT' , 'PARA', "ASTA',
'POR',
'HAZ', ' S I ' ,
'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 - 1990
93
.
PROYECTO DE INVESTIGACION
I Y I1
CURSO DE ESTRUCTURA DE DATOS
ALUMNA : AZUARA DIAZ MARIA ELENA. 86324881
ASESOR : LOZANO MORENO HECTOR.
DICIEMBRE 1990
9Y