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