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

94
PROYECTO DE INVESTIGACION I Y I1 / CURSO DE ESTRUCTURA DE DATOS /’ ALUMNA :PZUARA DIAS MARIA ELENA. . 86324881 ASES0R:LOZANOMORENOHECTOR. DICIEMBRE I990

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

Page 1: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

PROYECTO DE INVESTIGACION

I Y I1

/ CURSO DE ESTRUCTURA DE DATOS /’

ALUMNA :PZUARA DIAS MARIA ELENA. . 86324881

ASES0R:LOZANOMORENOHECTOR.

DICIEMBRE I990

Page 2: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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.

Page 3: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 -

Page 4: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 .

Page 5: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

. 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

Page 6: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 7: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 8: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 9: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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._&_..

Page 10: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

--

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

Page 11: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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>

Page 12: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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>

< / > / = / <= / >= / #

& / @

Page 13: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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.

Page 14: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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.

Page 15: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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___

Page 16: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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.

Page 17: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 18: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 19: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 20: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 21: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

. 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.

Page 22: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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:

Page 23: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 :

Page 24: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 25: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 26: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

F o m a en que se ue en pantalla

26

Page 27: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

Estructuras de datos usadas en el Editor Gral ico (de Estructuras Secuenciales 1

I i

. crui mn t o -r

Page 28: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

[ 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

Page 29: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 30: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

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

Page 31: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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;

Page 32: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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--._.- . - .. - . -

Page 33: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 34: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

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

Page 35: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 .

Page 36: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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.

Page 37: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 38: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 39: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 40: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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);

Page 41: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

{ 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

Page 42: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 43: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 -- . ....

Page 44: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 45: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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>

Page 46: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 - -

Page 47: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 48: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

{ 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

Page 49: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 }

Page 50: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 51: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

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

Page 52: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 }

Page 53: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 54: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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.

Page 55: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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);

Page 56: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

( * * * * * * * * * * * * * )

{ 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

Page 57: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 58: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 59: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 60: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 61: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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;

Page 62: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 63: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 64: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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:

Page 65: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

- .

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

Page 66: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 67: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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)

Page 68: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 69: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

[ 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

Page 70: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 71: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 72: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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;

Page 73: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 74: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 75: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

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

Page 76: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 77: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

{ 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

Page 78: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 79: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 )

Page 80: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 }

Page 81: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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>

Page 82: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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);

Page 83: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

83

Page 84: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 85: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 86: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 87: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

<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 -. -.= .- - -,.-*.-..--.-..- --

Page 88: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 89: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 90: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 91: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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 ) ;

Page 92: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 93: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

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

Page 94: 148.206.53.233148.206.53.233/tesiuami/UAM7389.pdf · Cuando en los cursos de programación se aborda el tema de los Tipos de Datos Abstractos un problema que enfrentan los profesores

.

PROYECTO DE INVESTIGACION

I Y I1

CURSO DE ESTRUCTURA DE DATOS

ALUMNA : AZUARA DIAZ MARIA ELENA. 86324881

ASESOR : LOZANO MORENO HECTOR.

DICIEMBRE 1990

9Y