148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se...

Post on 30-Sep-2020

7 views 0 download

Transcript of 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se...

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