Sunteți pe pagina 1din 252

LENGUAJES ALGORITMICOS NDICE

1. - Introduccin y conceptos bsicos. ................................................ 8


1.1. - Lenguaje................................................ 8 1.2. - Programacin. ...................................... 8 1.3. - Programa. ............................................. 8 1.4. - Lenguaje de programacin. .................. 9 1.4.1. Lenguaje Mquina................................ 9 1.4.10. Semntica. ..................................... 12 1.4.2. Lenguajes de Alto Nivel........................ 9 1.4.3. Traductores. ...................................... 9 1.4.3.1. Intrpretes. ...................................... 9 1.4.3.2. Compiladores. ................................ 9 1.4.4. Palabras reservadas........................ 10 1.4.5. Cdigo. ............................................ 10 1.4.5.1. - Cdigo fuente............................... 10 1.4.5.2. Cdigo objeto. .............................. 10 1.4.5.3. Cdigo ejecutable. ........................ 10 1.4.6. Compilacin. ................................... 10 1.4.7. Enlazado.......................................... 11 1.4.8. Libreras. ......................................... 11 1.4.8.1. Libreras preenlazadas. ................. 11 1.4.9. Sintaxis. ........................................... 11 1.5. - Sistema informtico o aplicacin........ 12 1.6. - Programador....................................... 12 1.7. - Tcnicas de programacin.................. 12 1.8. - Usuario. .............................................. 12

11. Introduccin a la Programacin Orientada al Objeto. ...............................................205


11.1. Introduccin. ...................................205 11.2. Vocabulario OOPS..........................206 11.3. Conceptos bsicos. ..........................206 11.4. Clarificando conceptos. ..................208 11.4.1. - Qu es una clase ? .....................208 11.4.2. - Qu es un objeto ? .....................209 11.4.3.- El concepto de herencia.................209 11.4.4.- El concepto de jerarqua................209 11.5. Conclusiones. ..................................210 11.5.1. Lo mejor. ......................................210 11.5.2. Lo peor. ........................................210 11.5.3. Posibles soluciones. .....................210

12. - Introduccin a la Programacin dirigida por eventos. .............................................211 13. - Documentacin de programas......................................215
13.1.- Manual del Sistema...........................215 13.2. - Manual del programa. .....................216 13.3. - Manual del usuario. .........................216

10. Introduccin a la Programacin Dirigida por los Datos......................................... 197


10.1. Programacin Cdigo-Fijo (HardCode). ..................................................... 197 10.2. Programacin Dirigida por los Datos (Data-Driven). ........................................ 198 10.3. Diccionario de datos. ..................... 202 10.4. Programacin de plantillas............ 202 10.4.1. - Qu es una plantilla ? ............... 202 10.4.2. Ventajas de una plantilla............. 203 10.4.3. Cuando utilizar una plantilla. ..... 203 10.4.4. Generadores de Cdigo............... 203 Realiz: Ing. Domingo Olivares Barrios

2. - Tipos y estructuras bsicas de datos. ........................13


2.1. - Dato. ....................................................13 2.2. - Tipos de datos. .....................................13 2.2.1. - Datos numricos. ..............................13 2.2.2. - Datos tipo carcter. ..........................13 2.2.3. - Datos alfanumricos, de cadena o string. ........................................................14 2.2.4. - Datos lgicos (booleanos). ...............14 2.3. - Constantes, variables y funciones........14 2.4. - Expresiones. .........................................14 2.4.1. - Expresiones aritmticas. ...................15 2.4.2. - Expresiones alfanumricas. ..............16 Pg. 1

2.4.3. - Expresiones lgicas (booleanas)...... 16 2.4.3.1. - Operadores de relacin.................. 16 2.4.3.2. - Operadores lgicos........................ 17 2.4.4. Reglas globales de prioridad o precedencia. ............................................. 18 2.5. - Arreglos (arrays)................................. 18 2.5.1. - Arreglos unidimensionales............... 18 2.5.2. - Arreglos bidimensionales................. 19 2.5.3. - Arreglos multidimensionales. .......... 19

5.3.4. - Estructura de " para hasta ". ............51 5.3.5. - Estructura de " hacer mientras ". .....53 5.3.6. - Estructura de " hacer hasta ". (repetir hasta).........................................................54

6. - Herramientas de programacin. ..............................56


6.1. - El contador. .........................................56 6.2. - El acumulador o sumador....................56 6.3. - La bandera o indicador. ......................57 6.4. - Salida de un programa por opcin. .....58 6.5. - Salida de un programa por centinela. .59 6.6. Subrutinas, procedimientos y funciones. ...................................................................59 6.6.1.- Subrutinas. .........................................59 6.6.2.- Procedimientos...................................63 6.6.3.- Funciones. ..........................................63 6.6.3.1.- Funciones Implcitas. ......................64 6.6.3.2.- Funciones de Usuario......................64 6.6.4.- Parmetros en procedimientos y funciones. ..................................................64 6.6.4.1.- Parmetros por valor. ......................64 6.6.4.2.- Parmetros por referencia (por variable).....................................................66 6.6.5.- Variables en procedimientos y funciones. ..................................................67 6.6.5.1.- Variables Globales. .........................67 6.6.5.2.- Variables Locales............................67 6.6.5.3.- Reglas de mbito.............................67 6.6.5.4.- Efectos laterales. .............................69 6.6.6.- Recursividad. .....................................71 6.7. - Encadenamiento de programas. ..........74

3. - Tcnicas de Programacin. ............................ 20


3.1. - Importancia......................................... 20 3.2. - Objetivo............................................... 20 3.3. - Estilos de programacin. .................... 20 3.4. La Notacin Hngara y otras convenciones. ........................................... 21

4. - Tcnica de diseo general o elemental. ................................... 27


4.1. - Fases de resolucin de problemas. ..... 27 4.2. - Simbologa de diagramas de bloques o diagramas de flujo de sistemas. ............... 33 4.3. - Simbologa de diagramas de flujo. ..... 34 4.4. - Recomendaciones para el desarrollo de diagramas................................................. 35 4.4.1. - Diagramas de bloques o diagramas de flujo de sistemas. ...................................... 35 4.4.2. - Diagramas de flujo. ......................... 35 4.5. - Resolucin de problemas aplicando la Tcnica de diseo general o elemental. ... 36

5. - Diagramas de flujo. ........... 48 5.1. - Tipos de diagramas de flujo................ 48 5.1.1. - Diagramas de flujo lineales. ............ 48 5.1.2. - Diagramas de flujo cclicos. ............ 48 5.2. - Estructuras de diagramas de flujo lineales. .................................................... 48 5.2.1. - Estructura de secuencia. .................. 48 5.2.2. - Estructura de decisin. .................... 49 5.2.3. - Ramificaciones. ................................ 49 5.3. - Estructuras de diagramas de flujo cclicos...................................................... 50 5.3.1. - Creacin de ciclos, iteraciones o bucles........................................................ 50 5.3.2. - Pasos de un ciclo o bucle................. 50 5.3.3. - Ciclos o bucles anidados. ................ 51
Realiz: Ing. Domingo Olivares Barrios

7. - Tcnica de diseo modular. ............................................75


7.1. - Fases de resolucin de problemas.......75 7.2. - Estructuras jerrquicas o en rbol. .....75 7.3. - Resolucin de problemas aplicando la Tcnica de diseo modular........................78

8. - Tcnica de diseo descendente. .................................100


8.1. - Fases de resolucin de problemas.....100 8.2. - Resolucin de problemas aplicando la Tcnica de diseo descendente. ..............102

Pg. 2

9. Introduccin a la programacin para gestin de archivos. .................................. 117


9.1. - Conceptos bsicos............................. 117 9.1.1. - Archivo. .......................................... 117 9.1.2. - Campo. ........................................... 117 9.1.3. - Registro. ......................................... 117 9.1.4. - Base de datos. ................................ 118 9.2. - Tipos de Archivos y accesos.............. 119 9.2.1. - Archivos secuenciales .................... 119 9.2.2. - Archivos directos............................ 119 9.2.3. Archivos indexados........................ 119 9.2.4. Otros tipos de archivos. ................ 120 9.3. Bases de datos. ................................. 120 9.3.1. - Qu es un SGBD ? ...................... 120 9.3.2. La independencia de los datos. ..... 121 9.3.3. Lenguajes y Bases de Datos. ......... 122 9.3.4. Los tres enfoques. .......................... 122 9.3.4.1. Enfoque jerrquico. .................... 122 9.3.4.2. Enfoque de red (Codasyl). .......... 124 9.3.4.3. Enfoque relacional...................... 125 9.3.5. Diseo de Bases de Datos. ............ 127 9.3.6. El modelo Entidad-Relacin.. ....... 128 9.3.7. Normalizacin. .............................. 131 9.3.7.1. Formas normales. ....................... 132 9.3.8. ndices y ordenaciones. ................. 135 9.3.9. Lenguajes de cuarta generacin (4GL). ................................................................ 137 9.4. Gestin de archivos de datos............ 138 9.4.1. Gestin de archivos secuenciales.. 142

9.4.2. Gestin de archivos directos. .........159 9.4.3. Gestin de archivos indexados.......174 9.4.4. Gestin de una base de datos relacional constituida por dos archivos..190

APENDICE A.............................222 APENDICE B.............................225 APENDICE C.............................227 BIBLIOGRAFIA.....................252


IMPRESIN DE UNA LISTA ENLAZADA ........................................237 INSERCIN EN UNA LISTA ENLAZADA. .......................................238 LIBRERIAS ...........................................222

OBJETIVOS. ..........................................7
PILAS, COLAS, COLAS DOBLES, RBOLES BINARIOS. .................246
PREFACIO......................................................5

PROGRAMACION SEGMENTADA
.................................................................225 PRLOGO ......................................................4

PUNTEROS Y LISTAS ENLAZADAS. ...................................229


S O L U C I O N E S ...................................218

SUPRESIN EN UNA LISTA ENLAZADA ........................................242 VARIABLES DINMICAS. ............227

Realiz: Ing. Domingo Olivares Barrios

Pg. 3

PRLOGO
Puesto que no se puede ser universal y saber todo lo que se puede saber acerca de todo, hay que saber poco de todo. Porque es mucho ms hermoso saber algo de todo que saber todo de una cosa. Blaise Pascal (Pensamientos, 37) Fue Confucio quien dijo, <<Lo que oigo lo olvido, lo que veo lo recuerdo, lo que hago lo comprendo>>. Este libro se ha escrito con esas ideas en mente. He llenado este libro de ejemplos, especialmente en el captulo <<soluciones>>, de manera que pueda ver y entender cmo las teoras y conceptos presentados son aplicables a situaciones de empresa de la vida real. El presente trabajo, lo inicie por Marzo de 1993, con la idea de hacer un manual que unificara criterios y se utilizara como gua para los maestros de una escuela donde, desde su fundacin, participe como catedrtico y finalmente como director administrativo. Sin embargo, en ese tiempo por diversas circunstancias, a pesar de que se estrenaba la materia de Lenguajes Algortmicos (la cual propuse que se implantara), ni el manual ni yo, tuvimos el tiempo ni la aceptacin suficiente, de mis compaeros, ni de la direccin acadmica, para presentarlo y mucho menos aplicarlo (en otras palabras, no les intereso); de tal manera que nicamente lo aplique1 a los grupos a los cuales imparta la primera materia de programacin, BASIC; puesto que anteriormente, no estaba contemplada la materia de Lenguajes Algortmicos o Algortmica (como le llaman algunos). En dicho manual, pretend recopilar lo aprendido en la escuela, la experiencia y algo de documentacin que tena a mano, en aquellos aos. Por azares de la vida, el trabajo se vio interrumpido, en varias ocasiones, por muchas y muy diversas causas. Aunque ese tiempo no se perdi, puesto que fui adquiriendo mayor experiencia en cuanto al desarrollo de programas y anlisis de sistemas, as como en lo que respecta a impartir clases en diversas escuelas y a muchos particulares; tambin fui acrecentando mis conocimientos en la diaria investigacin que esta motivada por la curiosidad y las ganas de aprender2. Todo esto, ha servido para enriquecer el que inicialmente se quera fuese un manual y, posteriormente se deseo desarrollarlo como un libro3. En ese punto, querido lector, usted dir despus de estudiarlo, si se logro el ltimo objetivo.

1 2

Como vena hacindolo aunque sin una estructura claramente definida-. Siempre he dicho que mi profesin es de las ms difciles, ya que ser ESTUDIANTE no es nada fcil. 3 Esto fue creando con fragmentos de diversas fuentes, notas, experiencias y memorias profesionales, sin nimo alguno de lucro. Y lo menciono por aquello de que alguien quiera hacer algn reclamo por los copyrights.

Realiz: Ing. Domingo Olivares Barrios

Pg. 4

PREFACIO
Durante todos estos aos en el rea de sistemas, he podido observar que a todos los estudiantes que inician la carrera de sistemas computacionales de cualquier nivel (tcnico o licenciatura), ms que tener problemas con los lenguajes de programacin (ms adelante veremos la definicin tcnica, por lo pronto, son idiomas que utilizamos para comunicarnos con la computadora), tienen muchos problemas con la LGICA. Respecto a esto, y fuera de los conceptos tericos puros e ideolgicos de la LGICA formal; y desde un punto de vista ms personal y prctico, podra decir (perdnenme los puristas) que la LGICA, es la forma estructurada y ordenada de nuestros pensamientos, ideas y acciones. Claro debe estar que, todos tenemos LGICA (lase pensamiento lgico), solo que algunos ms desarrollada que otros. Una prueba de ello es el hecho de que primero nos ponemos la ropa interior y despus el resto, o que, cuando tenemos la lengua de fuera, primero la metemos para cerrar la boca y no mordernos (salvo casos motivados por problemas de salud, en los cuales no tiene nada que ver la lgica y que sin embargo seguimos teniendo), ya que si no tuviramos LGICA, nos veramos ridculamente vestidos con la ropa interior por fuera, o sufriramos constantes mordidas de lengua, o no?. La LGICA al igual que los msculos de nuestro cuerpo, necesitamos ejercitarla, y esta por dems decir, que algunas personas tienen cuerpos atlticos y otras son muy delgadas o bien obesas; sin embargo, todos tenemos msculos. De la misma manera, todos tenemos LGICA, si bien, algunos al igual que estas personas que tienen cuerpos atlticos, tienen su LGICA gil, firme y bien desarrollada; otros, como las personas delgadas u obesas, la tenemos muy dbil, lenta o mal desarrollada. Y bien, siguiendo este ejemplo, podramos decir que para tener un cuerpo atltico (ignorando el aspecto de herencia en los genes, para no complicarnos el asunto) debemos ejercitar mucho nuestros msculos; pues, de la misma manera, para tener una LGICA gil, firme y bien desarrollada, debemos ejercitar nuestra mente. El desarrollo de nuestra lgica y habilidades de programacin es similar a la construccin de una casa: si empezamos con una base fuerte e incrementamos nuestro conocimiento de forma gradual, evitaremos muchos problemas a largo plazo. Piense en el presente libro como ese trabajo de base. En l aprenderemos a construir pequeas soluciones o programas para aplicar los conceptos de programacin fundamentales, y posteriormente aadir, a nuestros slidos conocimientos los conceptos de programacin avanzados. Podemos crear soluciones de muchas diferentes maneras para elaborar la misma tarea. No obstante, algunas maneras son mejores que otras. En este libro se explicar, paso a paso, la mejor manera para crear una solucin. La ventaja del aprendizaje por pasos consiste en que podremos ver por qu ciertas tareas se realizan de una manera particular y podremos entender cmo se ajustan las partes individuales afectando as a la totalidad. Podramos limitarnos simplemente a mostrar la solucin y decir Aqu est la solucin y explicarla, pero eso no servira de mucho a largo plazo. Existe un antiguo proverbio que dice, Dadle al hombre un pescado y lo alimentaris por un da, enseadle a pescar y lo alimentaris de por vida. En este caso quisiera ensearle a pescar. Este libro est dirigido a quienes quieren convertirse en diseadores de soluciones (desarrolladores de programas o programadores), y necesitan aprender los conceptos bsicos de programacin, as como desarrollar su lgica; y no a quienes ya son diseadores de soluciones o que son programadores expertos. Para convertirse en un diseador de soluciones, primero tendr que aprender las bases y comprender los conceptos que esconden algunos de los temas avanzados. Podremos considerar este Realiz: Ing. Domingo Olivares Barrios Pg. 5

libro como un escaln hacia libros de programacin avanzados y especificos para cada lenguaje. Adems de una buena lgica, un buen diseador de soluciones debe tener un conocimiento general slido sobre qu utilidades tiene un producto (traductor de algn lenguaje de programacin) y qu funcionalidad nos proporciona dicho producto. En este libro aprender a convertirse en un hbil diseador de soluciones y aprovechar las potentes utilidades de desarrollo de las tcnicas y estilos de programacin, con el fin de construir verdaderas soluciones de empresa reales con xito. Entendemos como <<soluciones de empresa reales>> el tipo de soluciones que han de tomar en cuenta los programadores y diseadores en su trabajo diario.

Realiz: Ing. Domingo Olivares Barrios

Pg. 6

OBJETIVOS.
El primero y ms directo es el de aportar una gua bsica y sencilla para que, cualquier persona que se interese y le agrade el rea de sistemas computacionales, aprenda, partiendo de la nada, a desarrollar soluciones (programas). Otro objetivo, no menos importante, es el de dar a conocer, a travs de los conceptos bsicos y una gran cantidad de ejercicios, las tcnicas de programacin. Aunque, en realidad, dejar satisfecho al lector que tenga en sus manos este libro y que estas lneas ayuden en su aprendizaje a quien ha puesto su confianza en l, es el mayor y principal objetivo de cualquier autor. Debo hacer notar que para comprender algunos conceptos de este libro, primero debe haberse tomado un pequeo curso previo de Introduccin a la Computacin y sera fantstico si se tomo un curso de algn Sistema Operativo previo, para comprender algunos de los conceptos, como son la memoria de la computadora, los componentes bsicos que la conforman, y su funcionamiento elemental, ya que el presente libro no pretende cubrir estos aspectos.

Realiz: Ing. Domingo Olivares Barrios

Pg. 7

1. - Introduccin y conceptos bsicos.


INTRODUCCION En el mundo de la computacin, uno de los aspectos ms importantes es la resolucin de problemas con la ayuda de la computadora, para agilizar los procesos y el manejo de informacin. Sin embargo debemos recordar que la computadora no puede resolver problemas por s sola, ya que solo es una mquina o dispositivo electrnico que nos es til como herramienta de trabajo, para el manejo de grandes cantidades de informacin; por esto, somos nosotros quienes debemos darle las instrucciones necesarias para que ella desarrolle los procesos que le indiquemos. Estas instrucciones deben tener un cierto orden y deben ser especificadas concienzudamente y bien detalladas. Para lo anterior, se siguen ciertas reglas para poder escribir las instrucciones que resuelvan un problema en particular. Es aqu donde entra el uso de los Lenguajes Algortmicos. Un lenguaje algortmico, es una forma de escribir las instrucciones u ordenes, en forma de pasos lgicos para resolver problemas especficos, en el lenguaje que normalmente utilizamos; siendo en nuestro caso, el espaol; de una manera sencilla y simple. La palabra ALGORITMICO, proviene de la palabra ALGORITMO4, que en una de sus definiciones bsicas nos dice que es: Un procedimiento paso a paso para resolver un problema en una cantidad determinada (finita) de tiempo. Por lo anteriormente descrito, se puede decir que la materia de Lenguajes Algortmicos es primordial, ya que nos ensea a resolver problemas, y as escribir las instrucciones para la computadora, y que sta realice los procesos. A continuacin y para entendernos mejor, se dan algunos conceptos bsicos utilizados en la computacin, y especficamente en el ambiente de los programadores. 1.1. - Lenguaje. Un lenguaje es un medio de comunicacin, que hace uso de smbolos, caracteres y palabras, para expresar ideas. 1.2. - Programacin. Es la actividad de desarrollar programas, que sern suministrados a la computadora. 1.3. - Programa. Es un conjunto de instrucciones, escritas en una secuencia lgica, en un lenguaje de programacin.

Algoritmia: f. Ciencia del clculo aritmtico y algebraico. Algoritmo: m. Conjunto ordenado y finito de operaciones que permiten la resolucin de un problema; p. Ej. La extraccin de raices cuadradas o el clculo de una suma, producto o divisin de nmeros. (Enciclopedia Textual Permanente Salvat).

Realiz: Ing. Domingo Olivares Barrios

Pg. 8

1.4. - Lenguaje de programacin. Es el conjunto de caracteres y reglas de utilizacin, aplicadas para desarrollar programas y comunicarnos con la computadora, para as darle las instrucciones adecuadas; y que sta desarrolle una determinada actividad o labor. 1.4.1. Lenguaje Mquina. Es el idioma de la computadora, y lgicamente, solo entendible por ella. Este lenguaje implica las instrucciones que son entendibles por la computadora. La computadora solo entiende o capta impulsos elctricos, los cuales procesa a travs de una compleja red de dispositivos electrnicos. Dichos impulsos elctricos, nosotros los humanos los representamos como circuitos apagados o encendidos, o bien 0 y 1; los cuales relacionamos con el sistema binario de numeracin (base 2). 1.4.2. Lenguajes de Alto Nivel. Es un lenguaje de programacin que utilizamos para comunicarnos con la computadora, el cual utiliza palabras o abreviaturas, casi siempre del idioma ingls (an no he visto un lenguaje que use palabras de otro idioma5). Estos lenguajes implican instrucciones fcilmente entendibles por cualquier programador, y que estn listas para ser traducidas a lenguaje mquina, por el programa traductor adecuado. 1.4.3. Traductores. En computacin, se define como traductor, a un programa cuya funcin es la de traducir las instrucciones en lenguaje de alto nivel a lenguaje mquina, para que sta efecte las operaciones que se le indican. 1.4.3.1. Intrpretes. Un intrprete, es un programa traductor, el cual debe permanecer en la memoria de la computadora para realizar la traduccin a lenguaje mquina de un programa escrito en lenguaje de alto nivel, as como su ejecucin simultnea. Muchos de estos lenguajes han desaparecido o bien, tienden a desaparecer. 1.4.3.2. Compiladores. Un compilador, es un programa traductor, el cual realiza la traduccin del programa escrito en lenguaje de alto nivel, durante un proceso llamado compilacin del cdigo fuente, obteniendo un cdigo objeto, el cual posteriormente, pasa al proceso de enlazado, para obtener un cdigo ejecutable
Salvo el caso de unos amigos de la escuela, cuya tarea era hacer un lenguaje compilado, y lo llamaron lenguaje LEPERO (Lenguaje en Espaol Pseudoestructurado pero Revuelto con Otros), el cual nunca terminaron totalmente, solo lo que necesitaron para aprobar, hasta donde tengo entendido.
5

Realiz: Ing. Domingo Olivares Barrios

Pg. 9

por la computadora. Al obtener el cdigo ejecutable, es posible ejecutar el programa sin necesidad de recurrir al compilador, puesto que el cdigo ejecutable es independiente y entendido directamente por la computadora, sin necesidad del compilador. 1.4.4. Palabras reservadas. Son aquellas palabras propias de un lenguaje de programacin, las cuales no pueden ser utilizadas para describir datos o informacin del usuario, es decir, nombres de variables, funciones o procedimientos de usuario. 1.4.5. Cdigo. Desde el punto de vista informtico, el Cdigo, son las instrucciones de un programa, escritas en un lenguaje de programacin. El proceso de traducir nuestro algoritmo (escrito en lenguaje comn) a cdigo fuente (escrito en un lenguaje de programacin) se denomina codificacin. 1.4.5.1. - Cdigo fuente. Son las instrucciones de un programa, escritas en un lenguaje de programacin de alto nivel. Normalmente el cdigo fuente es capturado en un programa editor de textos, que bien puede ser independiente al traductor o estar incluido dentro del mismo. 1.4.5.2. Cdigo objeto. Son las instrucciones de un programa, escritas en un formato intermedio de traduccin. Todos los compiladores generan el cdigo objeto a partir del cdigo fuente, como un paso intermedio para obtener el cdigo ejecutable. 1.4.5.3. Cdigo ejecutable. Son las instrucciones de un programa, escritas en lenguaje mquina, por un programa enlazador. Todos los compiladores generan el cdigo ejecutable a partir del cdigo objeto; y dicho cdigo ejecutable, como su nombre lo indica, puede ser ejecutado directamente por la computadora sin necesidad de recurrir al compilador o traductor. 1.4.6. Compilacin. Es el proceso de traduccin del cdigo fuente a un formato intermedio de traduccin, llamado cdigo objeto.

Realiz: Ing. Domingo Olivares Barrios

Pg. 10

1.4.7. Enlazado. Es el proceso de traduccin del cdigo objeto a cdigo ejecutable, por medio de un programa de enlazado o enlazador. Durante este proceso, las instrucciones, funciones y procedimientos escritos por el compilador en cdigo objeto se relacionan o enlazan con el cdigo ejecutable, que se encuentra en las libreras propias del lenguaje de programacin. Cdigo fuente
Compilador

Cdigo objeto

Enlazador

Cdigo ejecutable

Librera(s) 1.4.8. Libreras. Una librera de funciones es un archivo, normalmente con extensin.LIB, que contiene un conjunto de rutinas compiladas, que han sido diseadas para realizar una tarea en particular, y que el enlazador aade a los programas conforme ste las necesita. Las libreras pueden ser especficas para un tema (p. e. Grficos), para una aplicacin en particular, para un compilador (p. e. Clipper) o bien tener un carcter estndar, con funciones de todo tipo, reutilizables en cualquier aplicacin. Un compilador se acompaa, normalmente, de una o ms libreras que son las que contienen las funciones del lenguaje en general6. 1.4.8.1. Libreras preenlazadas. Son aquellas libreras que contienen mdulos objeto previamente enlazados, y por lo tanto sus instrucciones, funciones y procedimientos ya estn traducidos a lenguaje mquina. Normalmente son almacenados como archivos con extensin.PLL (Pre Linked Library) u otra similar. Algunos compiladores nos permiten crear archivos con libreras preenlazadas de forma que, al enlazar nuestra aplicacin final, el ejecutable ocupe una cantidad mnima debido a que toma una cantidad muy importante de aquello que necesita para trabajar de un archivo.PLL (Pre Linked Library). Dicho en otra forma, al compilar y enlazar nuestra aplicacin, solo se traducirn a lenguaje mquina aquellas instrucciones, funciones o procedimientos que no se encuentren en la librera preenlazada, puesto que, el resto ya estn enlazadas en el archivo PLL, y cuando se ejecute el programa, ste llamar a las funciones de la librera preenlazada y las ejecutar directamente. La ventaja de utilizar libreras preenlazadas, bsicamente es el ahorro de espacio en disco, sin embargo, por lo general el tiempo de carga de la aplicacin (inicializacin del programa) a memoria es mayor. 1.4.9. Sintaxis.
6

En el apndice A se trata con un poco ms de detalle el tema de las libreras. Sin embargo, se recomienda tratar estos temas cuando ya se tenga un poco ms de conocimientos acerca de la programacin avanzada.

Realiz: Ing. Domingo Olivares Barrios

Pg. 11

Son las reglas de escritura de las instrucciones del lenguaje de programacin. 1.4.10. Semntica. Son las reglas, normas o tcnicas que permiten dar legibilidad al cdigo de un programa, es decir, que permiten que el cdigo sea fcil de entender y comprender. 1.5. - Sistema informtico o aplicacin. Conjunto de programas que funcionan coordinados entre s, para el manejo de grandes volmenes de informacin. 1.6. - Programador. Es la persona que desarrolla programas para computadoras. 1.7. - Tcnicas de programacin. Conjunto de reglas o normas utilizadas para el desarrollo de programas. 1.8. - Usuario. Es cualquier persona que hace uso de una computadora.

Realiz: Ing. Domingo Olivares Barrios

Pg. 12

2. - Tipos y estructuras bsicas de datos.


2.1. - Dato. Un dato es la expresin general que describe los objetos con los cuales opera una computadora. A los datos se les puede considerar como la materia prima que se da a un proceso para obtener un producto terminado, llamado informacin. 2.2. - Tipos de datos. 2.2.1. - Datos numricos. Un tipo numrico es el conjunto de valores numricos, con los cuales podemos realizar operaciones aritmticas. Estos pueden representarse en dos formas distintas: - Tipo numrico entero (integer). - Tipo numrico real (real). El tipo numrico entero (integer), como su nombre lo indica son aquellos valores numricos que no cuentan con una parte fraccionaria o fraccin; y obviamente no tienen en su estructura el punto decimal o formato de fraccin. Ejemplos de tipos numricos enteros: 5, 3, 8, 23, El tipo numrico real (real), son aquellos valores numricos que incluyen en su estructura el punto decimal o formato de fraccin, y desde luego una parte fraccionaria o fraccin. Ejemplos de tipos numricos reales: 1.5, 2.34, 0.47, , 5 , Normalmente en las computadoras, los nmeros reales se representan en formato decimal (p. Ej. 1.5, 3.56, ); y en raras ocasiones en formato fraccionario (p. Ej. , 3, 1, ). 2.2.2. - Datos tipo carcter. El tipo carcter es el conjunto finito (limitado) y ordenado de caracteres que la computadora reconoce. Un tipo de dato carcter contiene un solo carcter. Los caracteres que reconocen las diferentes computadoras no son estndar; sin embargo, la mayora reconoce los siguientes caracteres alfabticos y numricos: - Caracteres alfabticos (A, B, C,..., Z, a, b, c,..., z). - Caracteres numricos (0,1,2,3,4,5,6,7,8,9). - Caracteres especiales (!, ", $, %, &, /, ...).

Realiz: Ing. Domingo Olivares Barrios

Pg. 13

2.2.3. - Datos alfanumricos, de cadena o string. Una cadena (string) de caracteres es una sucesin de caracteres que se encuentran delimitados por una comilla (apstrofo), dobles comillas, o corchetes ([]); segn el tipo de lenguaje de programacin. La longitud de una cadena de caracteres es el nmero de ellos comprendidos entre los separadores o delimitadores. 2.2.4. - Datos lgicos (booleanos). El tipo lgico (tambin denominado booleano) es aquel dato que solo puede tomar uno de dos valores: CIERTO o VERDADERO (true) y FALSO (false) Este tipo de datos se utiliza para representar las alternativas (SI / NO) a determinadas condiciones. Por ejemplo, cuando se pide si un valor entero es par, la respuesta ser verdadera o falsa, segn sea par o impar. 2.3. - Constantes, variables y funciones. CONSTANTES Son valores estticos, es decir, que no cambian, y se mantienen fijos durante la ejecucin de un programa. Pueden ser de cualquiera de los tipos de datos vistos anteriormente. Ejemplos: 23,Espaa, Verdadero. VARIABLES Una variable es un objeto o partida de datos cuyo valor puede cambiar durante la ejecucin de un programa. A estos objetos o partida de datos se les puede asignar un nombre, que ser el NOMBRE DE VARIABLE, para identificarlos. Ejemplos: Edad, Nombre, Salario. FUNCIONES Son un conjunto de operaciones predefinidas dentro de un lenguaje de programacin o por el programador. 2.4. - Expresiones. Las expresiones son combinaciones de constantes, variables, smbolos de operacin, parntesis y nombres de funciones especiales.

Realiz: Ing. Domingo Olivares Barrios

Pg. 14

2.4.1. - Expresiones aritmticas. Son semejantes a las formulas aritmticas. Las variables y constantes son numricas (reales o enteras) y las operaciones son las aritmticas. Los operadores aritmticos son los siguientes: + SUMA - RESTA * MULTIPLICACIN / DIVISIN ^, ** EXPONENCIACIN DIV DIVISIN ENTERA \,MOD MDULO (resto, residuo) Los cuales se rigen sobre la base de ciertas REGLAS DE PRIORIDAD o PRECEDENCIA, que permiten determinar el orden de las operaciones, y que se basan en reglas matemticas, las cuales son: A. - Las operaciones que estn encerradas entre parntesis se evalan primero. Si existen diferentes parntesis anidados (interiores unos a otros), las expresiones ms internas se evalan primero. B. - Las operaciones aritmticas dentro de una expresin suelen tener el siguiente orden de prioridad. 1. - Operador exponencial ^ o **. 2. - Operadores *, /. 3. - Operadores +, -. 4. - Operadores DIV y MOD. En caso de coincidir varios operadores de igual prioridad en una expresin encerrada entre parntesis o no, el orden de prioridad en este caso es de izquierda a derecha. Ejemplos: EXPRESION 5 DIV 2 5 MOD 2 4+6/2 (4+6)/2 ((3+5)/2^2)+1 4*2/4 2^2/4

OPERACIONES Divisin entera Mdulo o residuo 4+3 10/2 (8/2^2)+1 = (8/4)+1 = 2+1 8/4 4/4

RESULTADO 2 1 7 5 3 2 1

Realiz: Ing. Domingo Olivares Barrios

Pg. 15

2.4.2. - Expresiones alfanumricas. Son expresiones que incluyen asignaciones o funciones especiales, de datos carcter o de cadena (string). Ejemplo de concatenamiento.- Casa + segura = Casa segura 2.4.3. - Expresiones lgicas (booleanas). Una expresin lgica es una expresin que solo puede tomar uno de dos valores, ya sea VERDADERO o FALSO. Se denominan tambin EXPRESIONES BOOLEANAS en honor del matemtico britnico George Boole, que desarrollo el Algebra lgica, de Boole o Booleana. 2.4.3.1. - Operadores de relacin. Los operadores relacionales o de relacin permiten realizar comparaciones de valores de tipo numrico, carcter o de cadena. Los operadores de relacin sirven para expresar las condiciones en los algoritmos. Los operadores relacionales son: < MENOR QUE > MAYOR QUE = IGUAL QUE <= MENOR O IGUAL A >= MAYOR O IGUAL A <> DIFERENTE A Ejemplos: EXPRESION RELACIONAL 5<3 3<5 8>2 2>8 3=3 3=2 3 <= 5 6 <= 5 3 >= 5 6 >= 5 3 <> 3 3 <> 2 RESULTADO FALSO VERDADERO VERDADERO FALSO VERDADERO FALSO VERDADERO FALSO FALSO VERDADERO FALSO VERDADERO

Realiz: Ing. Domingo Olivares Barrios

Pg. 16

2.4.3.2. - Operadores lgicos. Los operadores lgicos o booleanos bsicos son NOT (no), AND (y) y OR (o), y nos permiten unir expresiones booleanas o de relacin. Las estructuras para el uso de los operadores lgicos son: Expresin Lgica 1 AND Expresin Lgica 2 Expresin Lgica 1 OR Expresin Lgica 2 NOT Expresin Lgica Los resultados del uso de los operadores lgicos se pueden observar en las siguientes TABLAS DE VERDAD: Expresin Lgica 2 Verdadera Falsa AND Falsa Resultados Expresin Verdadera Verdadera Falsa Falsa Falsa Lgica 1 Resultados Expresin Lgica 2 Verdadera Falsa OR Expresin Verdadera Verdadera Verdadera Resultados Falsa Verdadera Falsa Lgica 1 Resultados Resultado NOT Falsa Expresin Verdadera Falsa Verdadera Lgica Existe otro operador lgico, llamado XOR, que es utilizado en algunos lenguajes de programacin, y es considerado un OR exclusivo. Su tabla de verdad es la siguiente. Expresin Lgica 2 Verdadera Falsa XOR Verdadera Resultados Expresin Verdadera Falsa Falsa Verdadera Falsa Lgica 1 Resultados Como se puede observar, nicamente se obtiene un resultado verdadero cuando solo una de las expresiones lgicas es verdadera. Si las dos llegan a ser verdaderas el resultado es falsa; ya que una expresin verdadera excluye a la otra.

Realiz: Ing. Domingo Olivares Barrios

Pg. 17

2.4.4. Reglas globales de prioridad o precedencia. Como ya se menciono, para el caso de los operadores aritmticos, existen ciertas Reglas de Prioridad o Precedencia. Pero estas reglas de precedencia para operadores aritmticas, no son nicas ya que existen otras de mayor jerarqua, las cuales llamaremos REGLAS GLOBALES DE PRIORIDAD O PRECEDENCIA, ya que implican de manera general a las expresiones, las cuales para resolverse siguen el siguiente orden o precedencia: 1. Operaciones Aritmticas, Operaciones Alfanumricas. 2. Operaciones Relacionales. 3. Operaciones Lgicas. 2.5. - Arreglos (arrays). Un arreglo (array) es un conjunto limitado y ordenado de elementos similares (del mismo tipo de dato) que reciben el mismo nombre. La propiedad "ordenado" significa que el elemento primero, segundo, tercero, .., n-simo de un arreglo puede ser identificado por medio de un ndice o subndice. 2.5.1. - Arreglos unidimensionales. Es el tipo ms simple de arreglos, tambin reciben el nombre de VECTORES, solo cuenta con un subndice, es decir, solo tiene una dimensin, ya que solo contar con un nmero determinado de filas, o bien de columnas, nicamente. Para hacer referencia a un elemento se puede indicar de la siguiente manera: X(4) X[4]. Si representamos grficamente un vector con cuatro elementos, tendremos: Cuatro columnas,

Cuatro filas

NOTA: Debo anotar que la posicin 0 (cero), en los lenguajes de programacin se define automticamente como una posicin de arreglo vlida, de tal manera que si definimos un vector X(4) de, aparentemente, 4 posiciones, realmente representar un vector de 5 posiciones, que van desde X(0) hasta X(4). De la misma manera ser para los dems tipos de arreglos. Sin embargo, para no confundir al lector, tomaremos los

Realiz: Ing. Domingo Olivares Barrios

Pg. 18

conceptos matemticos sobre arreglos, con fines de explicacin, en los cuales no se considera la posicin 0. 2.5.2. - Arreglos bidimensionales. Estos arreglos tienen dos dimensiones, es decir, cuentan con un nmero determinado de filas y columnas; tambin reciben el nombre de MATRICES o TABLAS. Para hacer referencia de uno de sus elementos se deben utilizar dos subndices (A[f, c]). Si representamos grficamente una tabla con cinco filas y cuatro columnas tendremos: 1 2 3 4 5 2 3 4

2.5.3. - Arreglos multidimensionales. Cuando un arreglo cuenta con tres o ms subndices, se dice que es un arreglo multidimensional, ya que cuenta con mltiples dimensiones. Si representamos grficamente una matriz tridimensional con F filas, C columnas y N niveles tendremos:

F filas N niveles C columnas Cuando un arreglo tiene ms de tres dimensiones, no es posible representarlo grficamente, sin embargo, tanto matemticamente como en la computadora si es posible manejarlo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 19

3. - Tcnicas de Programacin.
3.1. - Importancia. El dominio y aplicacin de las tcnicas de programacin, es de gran importancia, ya que el uso de stas nos facilita en gran medida el desarrollo de programas que resolvern problemas prcticos, puesto que nos ayudan a determinar muchos aspectos y detalles durante la resolucin de problemas, y con esto se reducen los errores al mnimo, y se obtienen programas o aplicaciones en una menor cantidad de tiempo, mayor calidad, legibilidad y funcionalidad, ya que nos permite planificar, con mnimo error, los programas que hemos de desarrollar. 3.2. - Objetivo. Es el de economizar tiempo, disminuir la cantidad de errores que se pudieran presentar durante el desarrollo de una aplicacin o programa, y con esto reducir los costos de elaboracin de software. 3.3. - Estilos de programacin. El estilo en la construccin de programas, al igual que el estilo de escritura, no es una cosa que pueda adquirirse solo a partir del conocimiento de las reglas de sintaxis de un lenguaje y las tcnicas bsicas de programacin. El estilo en programacin como en otras actividades de la vida es una cuestin de gustos personales; sin embargo, en programacin es posible unir la inventiva y la ingeniosidad del programador con unas reglas de disciplina y orden en el diseo de programas. El estilo de la buena programacin est ntimamente unido con la legibilidad de los programas. La legibilidad de un programa es el criterio ms sencillo para evaluar la calidad de un programa; si el programa es fcil de leer, probablemente ser un buen programa; si es difcil de leer, no es un buen programa (Kernighan* y Planger. Software Tools. AddisonWesley, 1976). La legibilidad es la clave para la comprensin de un programa; un programa que no se puede comprender, no se le podr modificar ni mantener actualizado. Es muy importante distinguir entre legibilidad (semntica) y facilidad de escritura (sintaxis). Las tcnicas de programacin deben facilitar la escritura de programas y posteriormente facilitar su lectura. La escritura de algoritmos y su posterior codificacin conduce a la creacin de hbitos de programacin. La formacin de buenos hbitos de programacin, desde el inicio de su aprendizaje de programacin, ser, sin duda, uno de los puntos ms importantes en los que deber prestar atencin. La calidad de un programa se puede medir con diferentes parmetros; entre ellos destacaremos: A). - Un programa debe funcionar. Obviamente es la caracterstica ms simple e importante.

Realiz: Ing. Domingo Olivares Barrios

Pg. 20

B). - La documentacin. Desde luego debe contener en su cdigo los comentarios necesarios para explicar detalladamente su funcionamiento, as como la documentacin que se utilizo y desarrollo durante la fase de anlisis de los problemas. C). - La eficiencia. El programa debe ser ptimo, es decir, debe utilizar nicamente aquellos recursos de hardware (principalmente RAM, entre otros) estrictamente necesarios, y nunca desperdiciarlos; tambin debe ser rpido, es decir, debe procesar la informacin lo ms rpidamente posible. D). - Correccin. Debe ser fcil la localizacin de errores en el cdigo, y por ende, permitir realizar las correcciones necesarias en el menor tiempo posible. De ah que nuestra programacin debe ser estructurada (por ejemplo, tcnica modular o descendente, que se vern ms adelante), evitando saltos de una lnea del programa a otra, y tratando de hacerlo lo ms aproximado a un programa lineal, es decir, que se ejecute lnea a lnea sin saltos. E). - Flexibilidad. Debe estar estructurado de tal manera que permita realizar cambios o actualizaciones de manera rpida y sin modificar gran cantidad de cdigo. Esto con el fin de cubrir rpidamente las necesidades de los usuarios. F). - Fiabilidad. El proceso de la informacin y entrega de resultados del programa al usuario final debe ser totalmente confiable, ya que dicho usuario espera que los resultados que obtenga a travs de nuestros programas sean 100% correctos (A excepcin expresa de los errores de captura que el propio usuario pueda cometer, y que no pudiramos evitar). G). - La presentacin. El programa deber tener una presentacin agradable e intuitiva para el usuario, es decir, que las pantallas de intercambio de informacin (interfases) sean sencillas, ordenadas, fciles de comprender, y; en lo posible, con toques de colores e imgenes agradables al usuario. 3.4. La Notacin Hngara y otras convenciones. A la hora de desarrollar programas o sistemas, el algoritmo o cdigo puede a veces volverse complejo y terminar por ser bastante largo. Un algoritmo o cdigo largo y entrevesado puede resultar difcil de leer si necesitsemos depurarlo, o si lo que estamos es regresando a l, despus de una larga ausencia. Por ello a travs del tiempo y la experiencia de los primeros programadores, se han creado varias convenciones que facilitan la comprensin, y as poder seguir las acciones que nuestro programa va ejecutando. Pese a que no hemos escrito ningn algoritmo o cdigo hasta el momento, deberamos familiarizarnos con las convenciones que facilitarn la legibilidad de nuestro cdigo. Estas Realiz: Ing. Domingo Olivares Barrios Pg. 21

convenciones nos permiten hacer lo siguiente: Aadir comentarios a nuestro algoritmo o cdigo. Escribir mltiples sentencias en una sola lnea (dependiendo del lenguaje utilizado). Utilizar el carcter de continuacin de lnea (tambin dependiendo del lenguaje utilizado). Aplicar sangras sobre el cdigo, es decir, indentarlo o tabularlo.

Como primer punto tenemos que, los comentarios son lneas del programa que se introducen para dar legibilidad al cdigo y siempre son ignorados por los traductores. Para qu usarlos entonces? La finalidad es darle claridad al programa, expresando qu hace cada una de sus partes. Resulta recomendable agregar comentarios a nuestro algoritmo o cdigo, con el fin de explicar claramente el objetivo o tarea de un grupo de ordenes o instrucciones. En todos los lenguajes de programacin esta situacin ha sido contemplada; as por ejemplo tenemos que en BASIC y sus dialectos (perdn a los puristas por dialecto-) (por ejemplo: GWBASIC, Quick BASIC, Turbo BASIC, Visual BASIC, etc.), una lnea de comentario empieza con la palabra o sentencia REM, de REMark (-comentario- en ingls) o un apstrofe (), mientras que en los lenguajes xBase (por ejemplo: DBase, Clipper, Fox Base, Fox Pro, etc.) tenemos los caracteres *, //, /* */ &&, dependiendo del lenguaje xBase; en Pascal los caracteres (* *), y as por el estilo. Para el caso especifico de los algoritmos, es recomendable anotar y resaltar los comentarios; por eso algunos programadores acostumbramos diferenciarlos anotando un asterisco (*) al inicio del comentario, aunque cada programador resalta los comentarios como ms le parece y conviene. Los primeros libros de programacin (que conoc) y desde luego tambin los primeros programadores; acostumbraban anotar comentarios inclusive en el diagrama de flujo del programa7; pero en lo personal, me confunden ms y no me ayudan. Ejemplo: * Este es un comentario, y el que sigue tambin. * Lo que sigue son las primeras tres instrucciones de un programa. Instruccin 1 Instruccin 2 Instruccin 3 * A continuacin siguen otras dos instrucciones. Instruccin 4 Instruccin 5 * Este es el final del pseudo cdigo o algoritmo. En el segundo punto de la lista, se nos marca el uso de mltiples sentencias en una sola lnea, y aunque acortan un poco el cdigo y evitan que se vea excesivamente largo, en lo personal, a veces me pierdo y no visualizo las sentencias correctamente, pues me confunden y
No te preocupes si este trmino es nuevo para ti, son simplemente unos grficos representando un algoritmo o cdigo, mas adelante conocers su definicin exacta y hasta soars con ellos.
7

Realiz: Ing. Domingo Olivares Barrios

Pg. 22

pienso que es una sola instruccin; sin embargo, all queda la opcin para quien le guste usarla, y adems le sea posible programarla as, en el lenguaje que escoja y ms le guste. Pues no todos los lenguajes de programacin permiten esta caracterstica, algunos de los que si lo permiten son el BASIC y algunos de sus dialectos, as como Clipper y Pascal, entre otros. Ejemplo: Instruccin 1 Instruccin 2: Instruccin 3: Instruccin 4: Instruccin 5 Instruccin 6 Como puedes ver, solo ocupa tres lneas, y no seis, por lo cual se ve mas corto el pseudo cdigo. Para el tercer punto anotado, cabe hacer mencin que la mayora de los traductores entienden que cada mandato o funcin se va a poner en una sola lnea. Cuando el traductor se encuentra con un salto de lnea en la instruccin (carcter 13 <intro> del cdigo ASCII), a todos los efectos, sta ha finalizado. A medida que profundicemos en la programacin, veremos que las expresiones se pueden complicar cuanto queramos, a veces ms de lo que sera deseable. No es recomendable, por cuestin de legibilidad, que una lnea supere el margen derecho de nuestra pantalla cuando capturemos el cdigo fuente del programa. Para solventar este evento disponemos de un carcter especial, que vara dependiendo del lenguaje, el cual indica al traductor que el cdigo se corta en ese punto, pero el que viene en la o las siguientes lneas es continuacin de ste. (como ejemplo de carcter especial tenemos el punto y coma -;- en los lenguajes xBase). La ubicacin de este carcter especial, en la mayora de los casos, es flexible, pero no puede ponerse indiscriminadamente. Por ejemplo, las palabras reservadas o el nombre de las variables, no pueden cortarse. Ejemplo: Instruccin Larga; Continuacin de la Instruccin Larga Si se anotara en una sola lnea se escribira: Instruccin Larga Continuacin de la Instruccin Larga Sin embargo no es vlido hacer esto: Instr; uccin larga Por ltimo, tenemos la aplicacin de sangras al cdigo, es decir, indentacin o tabulacin. Esto se aplica para diferenciar el inicio y finalizacin de instrucciones compuestas, es decir, de aquellas instrucciones que dentro de su estructura o sintaxis pueden incluir otras Realiz: Ing. Domingo Olivares Barrios Pg. 23

instrucciones independientes a la compuesta. Ejemplo: Inicio de la Instruccin Compuesta 1 Instruccin 1 Instruccin 2 Instruccin 3 Continuacin de la Instruccin Compuesta 1 Instruccin 4 Instruccin 5 Fin de la Instruccin Compuesta 1 Instruccin Compuesta 2 Instruccin 6 Instruccin 7 Instruccin 8 Instruccin Compuesta 3 Instruccin 9 Instruccin 10 Fin de Instruccin Compuesta 3 Fin de Instruccin Compuesta 2 Como puede observarse las instrucciones 1 a 3 se ejecutarn dentro de la primera seccin de la Instruccin Compuesta 1 y las instrucciones 4 y 5 en la segunda parte de la misma; pues despus de esto termina la instruccin compuesta. La Instruccin Compuesta 2 incluye dentro de su estructura las Instrucciones 6 a 8 y la Instruccin Compuesta 3; cuya estructura incluye a su vez a las Instrucciones 9 y 10. Espero quede claro que es ms fcil revisar un grupo de instrucciones indentadas, pues fcilmente encontraremos el inicio y fin de las instrucciones compuestas. Como habrs notado, los humanos nos entendemos a fuerza de convenciones. La escritura de un programa es un asunto lleno de estas ceremonias. Por qu indentamos el cdigo? Por qu escribimos cosas en maysculas y cosas en minsculas? Las razones estn claras: para hacernos entender mejor. Este es el objetivo principal de cualquier sistema de notacin. Todo programador, de acuerdo a su estilo, ha empleado un sistema de notacin propio basado en las reglas que ms lo han ido convenciendo de los distintos mtodos que ha visto. Sin embargo, es recomendable ajustarse al estndar. Y este estndar no es ni ms ni menos que la notacin hngara, un invento malfico de un programador magiar que trabaja para Microsoft y que est a punto de conseguir que media humanidad escriba programas tal como a l le d la gana que lo hagan. Simonyi se llama el brbaro en cuestin, y sus reglas ya han sido asumidas por todos los productos de Microsoft y por bastantes de la competencia. Por lo tanto, es recomendable, intentar siempre ajustarnos al estndar y en este libro intentamos que se d el primer paso para ello. As, pues, hemos tomado las mismas normas de la notacin hngara que Nantucket (una empresa de software) ha asumido para algunos de sus productos. Esto no supone asumir dicha notacin en su totalidad. Esto es as porque Simonyi escribi sus convenciones pensando en el lenguaje C y este lenguaje tiene sus diferencias con otros lenguajes. Por ejemplo en C es Realiz: Ing. Domingo Olivares Barrios Pg. 24

obligatorio escribir todas las funciones del sistema en minsculas, y por ello, una norma de la notacin hngara es que todas estas funciones han de ir escritas en dicha tipografa. En otros lenguajes (por su traductor), cosas como esta no son necesarias. Por ello en el sistema de notacin que empleamos los mandatos y las funciones de las libreras del sistema se escriben con maysculas8. En fin, el conjunto de normas que seguimos son: 1. La primera letra de una variable siempre ha de escribirse en minscula y debe indicar el tipo de la misma: a Array b Codeblock (para lenguaje Clipper). c Cadena d Fecha l Lgica n Numrica o Objeto x Cualquier tipo 2. Los mandatos y funciones del sistema se escriben siempre en maysculas. Por ejemplo: RETORNAR (RETURN en ingls), FECHA() (DATE en ingls), etc. 3. Los nombres de cualquier objeto introducido por el usuario: variable, funcin, etc. Nunca deben separarse mediante el smbolo del subrayado sino poniendo en maysculas la primera letra de cada trozo de palabra con significado. Por ejemplo: DbMenu(), StrCount(), nFilaInicial, etc. (Tcnica WordMixing Mezcla de palabras-) Como has visto, la notacin hngara se trata de un sistema de convenciones de escritura de cdigo que hacen que los programas, sean ms legibles. A casi todos los traductores no les importa que una palabra, sea mandato, variable, funcin o lo que sea, est escrita en maysculas o minsculas (salvo en casos especficos del lenguaje, como C), con uno o ms blancos por delante o por detrs, etc. Al que s le importa es al que tiene que leer eso, es decir, a nosotros. Como en casi todas las normas, existen corrientes, la notacin hngara no poda ser menos. En algunos libros de programacin y lenguajes, por ejemplo; las obras realizadas y/o editadas por grupo EIDOS9, se sigue la llamada notacin gallega inversa, una mezcla del 95% de notacin hngara y un 5% de especifidades (de la cosecha del grupo EIDOS) y chanza (el
En general seguimos la adaptacin de la Notacin Hngara para Clipper realizada por Robert DiFalco en Reference (Clipper) Vol. V, nm. 5, de mayo de 1991 y por Antonio Linares en clippeRmana nm. 3, de julio de 1991. Grupo EIDOS es una empresa especializada en el rea de lenguajes xBase. Sus actividades abarcan la edicin de documentacin tcnica (entre la que destacan la revista clippeRmana as como varios libros sobre productos de entorno xBase publicados a travs de Editorial RAMA, la formacin, la consultora, el desarrollo, la produccin y distribucin de productos software. Grupo EIDOS es VAR (Distribuidor Autorizado de Valor Aadido) y Centro de Formacin Autorizado de Computer Associates. Sus dos centros en Madrid y Valencia cubren la totalidad de los aspectos reseados. En el rea de la formacin, Grupo EIDOS ha organizado en Espaa en 1992 y 1993 los ENCUENTROS DE USUARIOS CLIPPER y en Argentina en 1993 (a travs de WorldNet, su representante en la zona) los PRIMEROS ENCUENTROS LATINOAMERICANOS DE USUARIOS CLIPPER; todos ellos con la asistencia de los ms cualificados desarrolladores en Clipper y el patrocinio de las principales empresas del sector. Asimismo, mantiene un aula de formacin permanente para programadores dentro de este mismo entorno.
9 8

Realiz: Ing. Domingo Olivares Barrios

Pg. 25

nombrecito es fruto de una mezcolanza entre la notacin polaca y una deferencia para uno de sus mejores amigos y colaboradores: Ramn Delgado, gallego l). A continuacin se muestran las normas seguidas por la notacin gallega inversa, en la que se podrn notar las similitudes y diferencias con relacin a la notacin hngara, y son: 1. Los nombres de las variables han de ir precedidos en minsculas por un identificador de su tipo: c Carcter o memo n Numrica l Lgica d Fecha (date) o Objeto (genrico) b CodeBlock (para lenguaje Clipper) x Tipo indeterminado (no conocido a priori) a Array ac Array de cadenas (todos los elementos tipo c) a Array de (todos los elementos de tipo ) Si la variable contiene un objeto especfico, del que conocemos su tipo (su clase), entonces usaremos como identificador 3 letras (consonantes) para representar ese tipo de Objeto: vntTest kktPrueba vnt -> Ventana kkt -> Kikito

2. Utilizacin de la tcnica WordMixing (mezcla de palabras) para diferenciar las distintas partes de un nombre. cEjemploTipico 3. No usar subrayados _ para separar esas partes de los nombres. 4. A todos los efectos, los nombres que demos a nuestras funciones y mtodos seguirn las mismas reglas de codificacin. A fin de cuentas tanto el nombre de una variable como el nombre de una funcin son smbolos que contienen un valor (unos lo tienen y otros lo generan). Aplicar indistintamente estas tcnicas en variables y funciones evitar un buen montn de errores. 5. Todos los mandatos se escribirn en maysculas. Cada programador tiene su propio mtodo o estilo, pero todo apunta hacia una unificacin de criterios, y esta notacin hngara (o la similar gallega inversa) es la de mayor aceptacin.

Realiz: Ing. Domingo Olivares Barrios

Pg. 26

4. - Tcnica de diseo general o elemental.


Esta tcnica es aplicable a cualquier tipo de problema que se presente, pero tiene el inconveniente de que, en el desarrollo de grandes sistemas, resulta muy poco recomendable su uso, ya que resultara confusa y laboriosa su aplicacin. Por lo tanto, es recomendable para proyectos en pequea escala o mdulos del proyecto. 4.1. - Fases de resolucin de problemas.

TECNICA DE DISEO GENERAL O ELEMENTAL


Las fases o pasos para resolver problemas con esta tcnica, y obtener programas en lenguajes de alto nivel, son: 1. - Determinar el objetivo o problema. 2. - Anlisis del problema: A) Determinar los datos de salida solicitados, y los datos de entrada necesarios. B) Determinar los pasos para resolver el problema. C) Comprender y detallar los pasos para resolver el problema. 3. - Desarrollar el diagrama de bloques o diagrama de flujo de sistemas. 4. - Disear el diagrama de flujo. 5. - Desarrollar el algoritmo o pseudo cdigo. 6. - Codificar el programa. 7. - Capturar la codificacin. 8. - Prueba y deteccin de errores. 9. - Depuracin del programa. 10. - Ejecucin y puesta en operacin del programa. A continuacin se explica detalladamente cada uno de los pasos indicados. 1. - Determinar el objetivo o problema. La determinacin de un objetivo o problema, generalmente lo hace el Ingeniero, Tcnico en Sistemas Computacionales o Programador Analista, el cual sobre la base de una serie de estudios (Anlisis de Sistemas), enfocados a la administracin de una empresa, detecta las fallas de sta y propone soluciones, las cuales sern los objetivos o problemas que resolver el Tcnico en Informtica, Tcnico Programador o Programador de Computadoras. 2. - Anlisis del problema: A) Determinar los datos de salida solicitados, y los datos de entrada necesarios. Para resolver este paso nos apoyaremos en el punto 1, y definiremos que es lo que se nos esta pidiendo, es decir, "hacia donde vamos"; y determinaremos que es lo que necesitamos para obtener lo que se nos pide, en otras palabras, "de donde Realiz: Ing. Domingo Olivares Barrios Pg. 27

partiremos". B) Determinar los pasos para resolver el problema. Aqu, debe pensarse como se resolvera el problema a mano, paso a paso, y anotarlos. Se debe tener el cuidado de revisar los pasos especificados. C) Comprender y detallar los pasos para resolver el problema. Se desglosaran todos y cada uno de los pasos listados en el punto anterior, tratando de que se detallen todos los aspectos, y posibles casos que se pudiesen presentar. 3. - Desarrollar el diagrama de bloques o diagrama de flujo de sistemas. El diagrama de bloques es la representacin grfica, de manera general, de la resolucin de un problema. Para resolver este punto nos apoyaremos en el paso 2b. Ms adelante veremos todo lo relacionado con los diagramas de bloques. 4. - Disear el diagrama de flujo. Un diagrama de flujo es la representacin grfica de la resolucin de un problema. Para resolver este punto nos apoyaremos en el paso 2c. Posteriormente veremos con mayor detalle el tema de diagramas de flujo. 5. - Desarrollar el algoritmo o pseudo cdigo. En este caso, el algoritmo o pseudo cdigo se considera como la traduccin del diagrama de flujo a instrucciones en lenguaje comn, es decir, el que utilizamos cotidianamente. Por ejemplo, en nuestro caso, el espaol. Dependiendo del estilo de programacin que se tenga, se pueden usar palabras reservadas de algn lenguaje de programacin, mezcladas con palabras del lenguaje que comnmente utilizamos. 6. - Codificar el programa. La codificacin de un programa, puede ser considerada como, la traduccin de las instrucciones en lenguaje comn a un lenguaje de programacin, es decir, la traduccin del algoritmo o pseudo cdigo a un lenguaje de programacin. A continuacin se muestra un cuadro con las instrucciones ms comnmente utilizadas al programar, as como sus equivalentes en algunos lenguajes de programacin.

Realiz: Ing. Domingo Olivares Barrios

Pg. 28

Lenguaje Basic Lenguaje Pascal Print Write (imprimir) (escribir) Input Read (introducir) (leer) If-Then-Else If-Then -Else-; (Si-Entonces-Sino) (S-Entonces-Sino) En caso On-goto Case Of (Segn-ir a) (Caso de) Para-Hasta-Siguiente For-To-Next For-To-; (Para-Hasta-Siguiente) (Para-Hasta-;) Hacer Mientras While-Wend While-Do-; (Mientras-FinMientras) (Mientras-Hacer-;) Hacer Hasta Do-Until (Hacer-Hasta)

Lenguaje Comn Desplegar (en pantalla) Introducir (por teclado) S-Entonces-Sino

Lenguaje Clipper Say (decir) Get-Read (tomar-leer) If-Else-EndIf (SSino-FinS) Do Case (Hacer en caso) For-To-Next
(Para-Hasta-Siguiente)

Lenguaje C Printf (imprimir) Scanf (examinar) If-Else-; (SSino-;) Switch-Case


(Interruptor-Caso)

Do While-EndDo
(Hacer-Mientras-FinHacer)

For(){}; (Para()-{}-;) While-; (Mientras-;) Do-while-;


(Hacer-Mientras-;)

Como se puede observar, cada instruccin en lenguaje comn tiene su equivalente en cada uno de los lenguajes de programacin mencionados en la tabla. A continuacin dar una breve descripcin del uso de cada instruccin, sin embargo debo anotar, que cada una de las instrucciones se ver con mayor detalle a continuacin, claro est, sin profundizar en ningn lenguaje de programacin, pues no es el objetivo. La instruccin Desplegar tiene como objetivo mostrar informacin en la pantalla de la computadora. La instruccin Introducir tiene como objetivo el indicarle a la computadora que tome, recoja o lea datos del teclado. La instruccin S-entonces-sino es utilizada para ejecutar grupos de instrucciones dependiendo del resultado que arroje una expresin lgica, es decir, S la expresin lgica es verdadera entonces ejecuta el primer grupo de instrucciones sino es as ejecuta el segundo grupo de instrucciones. La sentencia En Caso, es utilizada para ejecutar un grupo de instrucciones especfico dependiendo del valor o condicin de una o ms variables en una expresin lgica, o bien, del resultado de una o ms expresiones lgicas. La sentencia Para-Hasta-Siguiente, tiene como objetivo ejecutar un grupo de instrucciones o sentencias un determinado nmero de veces. La sentencia Hacer-Mientras, es similar a la anterior, pero en este caso el nmero de veces que se ejecute el grupo de instrucciones es indeterminado y depender del resultado de una expresin lgica, la cual se evala primero. La sentencia Hacer-Hasta, es parecida a la anterior pero, en esta, se evala la expresin lgica despus de que se ejecuto el grupo de instrucciones al menos una vez. 7. - Capturar la codificacin. La captura de la codificacin es la introduccin de las instrucciones escritas en un lenguaje de programacin, en la computadora. Este trabajo normalmente lo realiza el personal

Realiz: Ing. Domingo Olivares Barrios

Pg. 29

de Captura de datos, o bien el auxiliar del programador, cuando se labora en una empresa de gran tamao, y que en su estructura estn considerados estos puestos; pero si no es as, la realiza el Tcnico o Ingeniero que desarrollo los programas. Cuando el programador ya tiene suficientes horas de vuelo, inclusive omite todos los puntos anteriores y directamente codifica al vuelo, sin embargo, es recomendable, para el principante no omitir ningn paso, hasta que se sienta lo suficientemente experimentado para hacerlo. Y, an cuando un programador tenga suficiente experiencia, siempre es aconsejable desarrollar los pasos anteriores, inclusive an cuando ya tenga funcionando el programa en el sistema, puesto que todo eso servira como documentacin del programa y sustentar la informacin global de un sistema ms complejo. 8. - Prueba y deteccin de errores. Una vez que se ha codificado un programa, es necesario probarlo, para ello introduciremos datos que sern procesados y de los cuales previamente conocemos el resultado; para esto debemos realizar el proceso a mano con cuando menos, dos series de datos de entrada hasta obtener los resultados finales. El objetivo de dichas pruebas es la deteccin o localizacin de errores en nuestro programa. TIPOS DE ERRORES Existen dos tipos de errores, del programador, que se pueden presentar durante el desarrollo de un programa: Errores de sintaxis y errores de lgica. Los primeros, la mayora de las veces son fciles de detectar y localizar, ya que la mayora de los traductores nos indican, aproximadamente, donde est el error. Estos errores generalmente se cometen durante la captura de la codificacin, y casi nunca alteran la lgica del programa, aunque en ocasiones puede existir un error de sintaxis que no detecte el traductor y altere la lgica de nuestros programas, pero esto resulta ser en casos muy raros (en lo personal me paso en una ocasin con GwBasic). En el segundo caso, con los errores de lgica, debemos preocuparnos un poco mas, ya que estos errores son difciles de detectar y localizar, y vienen de malos planteamientos en la resolucin del problema, as que en caso de presentarse, deberemos revisar la resolucin del problema desde el principio y los planteamientos que se especificaron al inicio de la resolucin, hasta localizar el error. Por ltimo, otro tipo de errores, no imputables al programador, que debemos contemplar y prever, son los que se generan en tiempo de ejecucin (cuando la aplicacin o programa est en marcha),. En tiempo de ejecucin, si el usuario intenta una operacin que el sistema o programa no puede realizar, entonces se produce lo que se conoce como un error en tiempo de ejecucin. Supongamos, por ejemplo, que vamos a hacer que nuestra aplicacin vuelque (grabe) alguna informacin a un disco flexible, o incluso a otro disco fijo (tambin llamado duro). Qu tipos de errores podramos anticipar? Que dicha unidad no exista, que el disco se encuentre lleno o que el disco no se encuentre formateado. Puede que queramos escribir cdigo que se refiera a un archivo de datos y luego renombremos el archivo sin actualizar nuestro cdigo: aunque nuestra sintaxis sea correcta, resulta que el objeto o archivo no existe y se producir un error en tiempo de ejecucin. Realiz: Ing. Domingo Olivares Barrios Pg. 30

Los errores en tiempo de ejecucin son habitualmente ms difciles de arreglar que los errores de sintaxis, simplemente porque los errores en tiempo de ejecucin pueden ser ocasionados por mltiples razones. Adems, las fuentes de los errores en tiempo de ejecucin no siempre sern obvias; a menudo tendremos que hacer algunas verificaciones para encontrarlos. Por ejemplo, puede darse el caso de que una aplicacin funcione bien bajo ciertas circunstancias, puede que no lo haga si un usuario introduce de manera accidental un tipo de datos errneo. Tendremos que ser capaces de crear rutinas de tratamiento de errores para interceptar dichos errores en tiempo de ejecucin y actuar de manera especifica sobre ellos, dependiendo del tipo que sean. CONTROL DE ERRORES EN TIEMPO DE EJECUCION. Al controlar los errores en tiempo de ejecucin, haremos que nuestra aplicacin sea ms tolerante con los errores que se encuentre. Podremos tratar estos errores utilizando rutinas de tratamiento de errores, haciendo as que nuestra aplicacin parezca ms robusta y permitiendo salidas de programa ms elegantes cuando se produzca lo inesperado. Las aplicaciones que controlan errores en tiempo de ejecucin podrn manejar los errores de usuario ms comunes sin necesidad de parar la aplicacin. Cuanto ms habilidad tengamos de anticipar los errores convencionales (tales como que nuestra aplicacin est esperando que el usuario introduzca un nmero y ste introduce un carcter) y protegernos frente a ello, menos posibilidades tendr nuestra aplicacin de interrumpirse. Por ejemplo, en una situacin en la cual nuestra aplicacin est esperando que el usuario introduzca un nmero, podramos utilizar una rutina de tratamiento de errores que solicite al usuario a que inserte un nmero en vez de un carcter alfabtico. CIERRE DE LA APLICACIN EN FORMA ADECUADA. En aquellas ocasiones en las que una rutina de tratamiento de errores no pueda resolver un error en tiempo de ejecucin, todava podr ejecutar importantes acciones, tales como cerrar cualquier archivo de datos abierto (y potencialmente guardando considerables cantidades de datos que de manera contraria se perderan). En el ejemplo anterior, si el usuario no introduce un nmero cuando se le solicita, la aplicacin se podra cerrar, de tal manera que no le est preguntando continuamente al usuario que introduzca un nmero. Procure generar salidas delicadas al crear su rutina de tratamiento de errores. En otras palabras, para prever los errores en tiempo de ejecucin, debemos pensar en los posibles errores que podra generar el usuario e intentar hacer programas a prueba de usuarios novatos, por no decir lo que me decan mis maestros (ah te lo dejo a la imaginacin). 9. - Depuracin del programa. La depuracin de un programa, es en s, el proceso de localizacin y correccin de los errores detectados. Cuando se ha localizado un error de sintaxis, basta con colocar el cursor donde el traductor nos lo indica, y corregirlo de acuerdo a la sintaxis de la instruccin. Cuando se ha detectado un error de lgica, el proceso de depuracin resulta ser muy complicado ya que, es muy poco probable (casi imposible) que un error de sintaxis haya modificado la lgica de nuestro programa, pero aun as, lo primero que debemos hacer es obtener un listado impreso del programa para revisarlo a conciencia, y en caso de ser necesario Realiz: Ing. Domingo Olivares Barrios Pg. 31

hacer una "corrida de escritorio" (simular manualmente la ejecucin de cada instruccin) directamente con la codificacin del programa (la corrida ser nicamente con el segmento que realiza el proceso en s). Otra forma de localizar un error de lgica, es intercalar algunas instrucciones de despliegue, en algunos puntos del programa, tratando de que se nos muestren los valores de las variables que utilizamos y en las cuales se nos muestra el error (dichas instrucciones sern temporales). En l ultimo de los casos, para detectar un error, ejecutaremos una a una las instrucciones del programa para observar los resultados que arroja; y si con esto no se localiza el error, se deber revisar en su totalidad la resolucin del problema desde el primer punto, hasta eliminar todos los errores. Actualmente, la gran mayora de los traductores traen consigo, una opcin llamada Depurador, que, sinceramente nos ayuda bastante si lo sabemos aprovechar; pues nos permite ejecutar instruccin por instruccin y ver los valores almacenados en cada variable, entre otras muchas facilidades que nos brinda. Despus de una depuracin, se deber probar nuevamente el programa, y depurarlo si existen errores, y as sucesivamente, hasta que el programa funcione correctamente, y no se detecte ningn error de sintaxis o de lgica, o se crea que se hayan previsto los posibles errores en tiempo de ejecucin que se pudieran presentar. En la actualidad debemos considerarnos afortunados, ya que los traductores cuentan con una opcin para depurar10 o eliminar errores, y estas opciones nos permiten llevar un seguimiento del contenido de las variables en nuestro programa, as como ejecutar lnea a lnea el mismo, con el fin de evitar las corridas de escritorio y encontrar ms rpidamente los errores11, para corregirlos al momento. 10. - Ejecucin y puesta en operacin del programa. Una vez que se ha probado el programa y no se han detectado errores de ningn tipo; antes de integrarlo a un sistema de informacin, debemos ejecutarlo a manera de prueba, durante un buen perodo de tiempo, con copias de la informacin utilizada en el sistema, para evitar que la informacin original pueda ser daada por algn error que haya pasado desapercibido. Despus que el programa ha estado funcionando correctamente, trabajando con copias de la informacin del sistema, y arrojado resultados satisfactorios, entonces podremos integrarlo al sistema principal de informacin, para que pueda trabajar con la informacin original y complementar el sistema, resolviendo as el problema planteado.

Debug en ingls. Proviene de BUG, que significa bicho, y con la preposicin DE, podra traducirse textualmente como desbichar, quitar bichos, o literalmente quitar errores. 11 Bugs en ingls, que aunque quiere decir bichos, se tomo para denominar tcnicamente as a los errores, los cuales se consideran como plagas, tales como la de los insectos o bichos.

10

Realiz: Ing. Domingo Olivares Barrios

Pg. 32

4.2. - Simbologa de diagramas de bloques o diagramas de flujo de sistemas. Aunque hay muchos tipos y formas de diagramas de bloques, as como smbolos, a continuacin se presentarn los ms utilizados, as como el significado o descripcin que le dan la mayora de los programadores. SIMBOLO DESCRIPCIN Proceso Automtico Proceso Manual Almacenamiento en medio magntico en general (archivos) Almacenamiento fsico (archivo fsico manual)

Almacenamiento en medio magntico (disco duro o fijo)

Almacenamiento en medio magntico (cinta magntica) Entrada/Salida general de informacin Salida de informacin, reporte por impresora

Realiz: Ing. Domingo Olivares Barrios

Pg. 33

4.3. - Simbologa de diagramas de flujo. De la misma manera que en el punto anterior, aunque hay muchos tipos y formas de diagramas de flujo, as como smbolos, a continuacin se presentarn los ms conocidos, as como el significado o descripcin que le dan la mayora de los programadores. SIMBOLO DESCRIPCIN OPERACION

ENTRADA/SALIDA DE INFORMACION (ARCHIVOS)

SALIDA DE DATOS POR IMPRESORA

CONECTOR

TOMA DE DECISION

SUBRUTINA (PROCEDIMIENTO O FUNCION)

ENTRADA DE DATOS POR TECLADO

INICIO/FIN DEL DIAGRAMA

SALIDA DE DATOS POR PANTALLA

CONECTOR FUERA DE PGINA

Realiz: Ing. Domingo Olivares Barrios

Pg. 34

4.4. - Recomendaciones para el desarrollo de diagramas. 4.4.1. - Diagramas de bloques o diagramas de flujo de sistemas. RECOMENDACIONES PARA EL DESARROLLO DE DIAGRAMAS DE BLOQUES O DIAGRAMAS DE FLUJO DE SISTEMAS Realmente, no se puede decir que exista alguna regla escrita acerca de la diagramacin, pero si se establecen ciertas recomendaciones, como las que se indican: 1. - No interceptar (cruzar) lneas de flujo de informacin. 2. - Usar claves dentro de los smbolos, y especificar la nomenclatura correspondiente. 4.4.2. - Diagramas de flujo. RECOMENDACIONES PARA EL DISEO DE DIAGRAMAS DE FLUJO 1. El smbolo de inicio y fin, solo se utilizara dos veces, al principio y al final del diagrama. 2. La lnea de flujo debe "tocar" tanto al smbolo del que sale como al smbolo al que llega. 3. Pueden existir varios conectores de "salida", pero solo uno de "llegada"; con el mismo carcter o smbolo dentro de ellos. 4. El carcter que esta dentro del conector de salida debe ser igual al carcter dentro del conector de llegada, donde continuara el flujo del diagrama. 5. Al diagramar trataremos siempre que el flujo sea de arriba hacia abajo y de izquierda a derecha. 6. A cualquier smbolo solo llegara una lnea de flujo y saldr de ste una lnea de flujo; con excepcin del smbolo de toma de decisin, al cual llega una lnea de flujo y salen dos de l; y tambin el conector y el smbolo de inicio y fin, del cual solamente saldr una lnea o llegara una lnea de flujo. 7. No interceptar (cruzar) lneas de flujo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 35

4.5. - Resolucin de problemas aplicando la Tcnica de diseo general o elemental. EJEMPLO DE RESOLUCION DE PROBLEMAS USANDO LA TECNICA DE DISEO GENERAL O ELEMENTAL 1. - Determinar el objetivo o problema. (Deber especificarse por el maestro el problema en s). - Disear un programa que solicite los siguientes datos de un empleado: Ficha, nombre, puesto, antigedad, sueldo diario, das trabajados; que calcule y muestre el sueldo total neto a pagar, as como las cuotas por pagar por el patrn por sus prestaciones sobre su sueldo total bruto: un 3 % del Seguro Social, 1 % de Apoyo a la Educacin, 5 % de Infonavit, 2 % de I.S.P.T. (Impuesto Sobre Productos del Trabajo; y 3 % del SAR (Sistema de Ahorro para el Retiro. S el empleado tiene 5 aos o ms de antigedad, se le dar un bono del 5 % sobre su sueldo total bruto. 2. - Anlisis del problema: A) Determinar los datos de salida solicitados, y los datos de entrada necesarios. DATOS DE SALIDA: Total neto a pagar, salario total a pagar, Cuotas del I. M. S. S., de Apoyo a la Educacin, del Infonavit, del S.A.R., Retencin del I.S.P.T., Importe del Bono. DATOS DE ENTRADA: Nombre, puesto, antigedad, salario diario, das trabajados. B) Determinar los pasos para resolver el problema. 1. 2. 3. 4. 5. Solicitar los datos del empleado. Calcular el salario total a pagar. Calcular las cuotas por pagar. Calcular el Total Neto a Pagar. Mostrar los importes del sueldo total neto a pagar, sus prestaciones y deducciones.

C) Comprender y detallar los pasos para resolver el problema. 1. Inicializar variables. 2. Pedir el Nombre. 3. Pedir el Puesto. 4. Pedir la Antigedad. 5. Pedir el Salario Diario. 6. Pedir los Das Trabajados. 7. nSalarioTotalAPagar = nDiasTrabajados*nSalarioDiario 8. nImss = nSalarioTotalAPagar * 0.03 9. nApoyoEducacin = nSalarioTotalAPagar * 0.01 10. nInfonavit = nSalarioTotalAPagar * 0.05 11. nSar = nSalarioTotalAPagar * 0.03 12. nIspt = nSalarioTotalAPagar * 0.02 Realiz: Ing. Domingo Olivares Barrios Pg. 36

13. nAntigedad => 5 aos ? SI: nBono = nSalarioTotalAPagar * 0.05 NO: nBono = 0 14. nTotalAPagar = nSalarioTotalAPagar + nBono 15. Mostrar: nImss 16. Mostrar: nApoyoEducacin 17. Mostrar: nInfonavit 18. Mostrar: nSar 19. Mostrar: nIspt, nBono 20. Mostrar: nSalarioTotalAPagar 21. Mostrar: nTotalAPagar. 1. Desarrollar el diagrama de bloques. Datos del Empleado Calculo del Sueldo
Calculo de las deducciones y prestaciones Total de deducciones, prestaciones y Total a Pagar

Realiz: Ing. Domingo Olivares Barrios

Pg. 37

2. Disear el diagrama de flujo. INICIO 1 2

INICIALIZAR VARIABLES

Salario Diario:

nInfonavit = nSalTotAPag * 0.05

Dame los siguientes datos:

nSalDia

nSar = nSalTotAPag * 0.03

Nombre:

Das Trabajados:

nIspt = nSalTotAPag * 0.02

cNombre

nDiasTrab nAntig >= 5 ?

NO

Puesto:

nSalTotAPag = nDiasTrab * nSalDia

SI
nBono = nSalTotAPag * 0.05

cPuesto
nImss = nSalTotAPag * 0.03 Antigedad: nApEduc = nSalTotAPag * 0.01

3
nTotNetoAPagar = nSalTotAPag + nBono

nAntig

Resultados:, IMSS:; nImss, ISPT:; nIspt, SAR:; nSar, Ap. Educ.:; nApEduc, Infonavit:; nInfonavit, Bono:; nBono, Sal. Total a Pagar:; nSalTotAPag, Tot. Neto a Pagar:; nTotNetoAPagar

FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 38

3. Desarrollar el algoritmo o pseudo cdigo. NOTA: Por esta nica ocasin, tanto en el algoritmo como en las codificaciones que se veran a continuacin, se resaltan en rojo las palabras reservadas y los operadores; as mismo se resaltan en azul los nombres de variables. El objetivo es que establezcas la relacin entre las palabras utilizadas en el algoritmo y su equivalente en los diferentes lenguajes de programacin. 1. Inicializar variables. 2. Desplegar "Dame los siguientes datos:" 3. Desplegar "Nombre:" 4. Introducir cNombre 5. Desplegar "Puesto:" 6. Introducir cPuesto 7. Desplegar "Antigedad:" 8. Introducir nAntig 9. Desplegar "Salario Diario:" 10. Introducir nSalDia 11. Desplegar "Das Trabajados:" 12. Introducir nDiasTrab 13. nSalTotAPag = nDiasTrab * nSalDia 14. nImss = nSalTotAPag * 0.03 15. nApEduc = nSalTotAPag * 0.01 16. nInfonavit = nSalTotAPag * 0.05 17. nSar = nSalTotAPag * 0.03 18. nIspt = nSalTotAPag * 0.02 19. S nAntig >= 5 entonces nBono = nSalTotAPag * 0.05 sino nBono = 0 20. nTotNetoAPagar = nSalTotAPag + nBono 21. Desplegar Resultados: 22. Desplegar IMSS:; nImss 23. Desplegar ISPT:; nIspt 24. Desplegar SAR:; nSar 25. Desplegar Ap. Educ.:; nApEduc 26. Desplegar Infonavit:; nInfonavit 27. Desplegar BONO:; nBono 28. Desplegar Sal. Total a Pagar:; nSalTotAPag 29. Desplegar Tot. Neto a Pagar:; nTotNetoAPagar 30. FIN. 6. - Codificar el programa. Esta actividad se realiza cuando se domina algn lenguaje de programacin, por ejemplo Basic, Pascal, C, Clipper, etc. A continuacin presentare la codificacin del programa anterior en algunos lenguajes. Realiz: Ing. Domingo Olivares Barrios Pg. 39

Lenguaje Basic.
10 REM Programa EJEMGBAS.BAS 20 REM Mtodo de Diseo General o Elemental. 30 REM Programa Principal. 40 REM *********************************************************************** 50 REM Inicializando variables. 60 REM *********************************************************************** 70 CNOMBRE$="":CPUESTO$="":NANTIG=0:NSALDIA=0:NDIASTRAB=0:NSALTOTAPAG=0 80 NIMSS=0:NAPEDUC=0:NINFONAVIT=0:NSAR=0:NISPT=0:NBONO=0:NTOTNETOAPAGAR=0 90 CLS 'Borra la pantalla 100 REM *********************************************************************** 110 REM Solicitud de datos al usuario. 120 REM *********************************************************************** 130 PRINT "Dame los siguientes datos:" 140 PRINT "Nombre:"; 150 INPUT CNOMBRE$ 160 PRINT "Puesto:"; 170 INPUT CPUESTO$ 180 PRINT "Antigedad:"; 190 INPUT NANTIG 200 PRINT "Salario Diario:"; 210 INPUT NSALDIA 220 PRINT "Dias Trabajados:"; 230 INPUT NDIASTRAB 240 REM *********************************************************************** 250 REM Clculos de ingresos y cuotas. 260 REM *********************************************************************** 270 NSALTOTAPAG = NDIASTRAB * NSALDIA 280 NIMSS = NSALTOTAPAG * .03 290 NAPEDUC = NSALTOTAPAG * .01 300 NINFONAVIT = NSALTOTAPAG * .05 310 NSAR = NSALTOTAPAG * .03 320 NISPT = NSALTOTAPAG * .02 330 IF NANTIG >= 5 THEN NBONO = NSALTOTAPAG * .05 ELSE NBONO = 0 340 NTOTNETOAPAGAR = NSALTOTAPAG + NBONO 350 REM *********************************************************************** 360 REM Despliegue de Resultados. 370 REM *********************************************************************** 380 PRINT "Resultados:" 390 PRINT "IMSS: ";NIMSS 400 PRINT "ISPT: ";NISPT 410 PRINT "SAR: ";NSAR 420 PRINT "Apoyo a la Educacin: ";NAPEDUC 430 PRINT "INFONAVIT: ";NINFONAVIT 440 PRINT "Bono: ";NBONO 450 PRINT "Salario Total a Pagar: ";NSALTOTAPAG 460 PRINT "Total Neto a Pagar: ";NTOTNETOAPAGAR 470 END 'Fin del programa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 40

Lenguaje Quick Basic. (Podramos considerar ste, como un dialecto del Basic).
REM REM REM REM Programa EJEGQBAS.BAS Mtodo de Diseo General o Elemental. Programa Principal. Inicializando variables.

cNombre$ = "": cPuesto$ = "": nAntig = 0: nSalDia = 0: nDiasTrab = 0 nSalTotAPag = 0: nImss = 0: nApEduc = 0: nInfonavit = 0: nSar = 0: nIspt = 0 nBono = 0: nTotNetoAPagar = 0 CLS 'Borra la pantalla. REM Solicitud de datos al usuario. PRINT PRINT INPUT PRINT INPUT PRINT INPUT PRINT INPUT PRINT INPUT "Dame los siguientes datos:" "Nombre:"; cNombre$ "Puesto:"; cPuesto$ "Antigedad:"; nAntig "Salario Diario:"; nSalDia "Das Trabajados:"; nDiasTrab

REM Clculos de ingresos y deducciones. nSalTotAPag = nDiasTrab * nSalDia nImss = nSalTotAPag * .03 nApEduc = nSalTotAPag * .01 nInfonavit = nSalTotAPag * .05 nSar = nSalTotAPag * .03 nIspt = nSalTotAPag * .02 IF nAntig >= 5 THEN nBono = nSalTotAPag * .05 ELSE nBono = 0 END IF nTotNetoAPagar = nSalTotAPag + nBono REM Despliegue de Resultados. PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT END "Resultados:" "IMSS: "; nImss "ISPT: "; nIspt "SAR: "; nSar "Apoyo a la Educacin: "; nApEduc "INFONAVIT: "; nInfonavit "Bono: "; nBono "Salario Total a Pagar: "; nSalTotAPag "Total Neto a Pagar: "; nTotNetoAPagar

Realiz: Ing. Domingo Olivares Barrios

Pg. 41

Lenguaje Pascal. PROGRAM Ejemplo; (* Programa EJEGPASC.PAS *) (* Mtodo de Diseo General o Elemental. *) (* Programa Principal. *) (* Especificacin del dispositivo o unidad de salida *) USES CRT; (* Usar el monitor Catodic Ray Tube, Tubo de Rayos Catdicos- *) (* Declarando variables. *) VAR cNombre cPuesto nAntig nSalDia nDiasTrab nSalTotAPag nImss nApEduc nInfonavit nSar nIspt nBono nTotNetoAPagar BEGIN (* Inicio *) (* Inicializando variables. *) nAntig nSalDia nDiasTrab nSalTotAPag nImss nApEduc nInfonavit nSar nIspt nBono nTotNetoAPagar := := := := := := := := := := := 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; : : : : : : : : : : : : : STRING[10]; STRING[10]; REAL; REAL; REAL; REAL; REAL; REAL; REAL; REAL; REAL; REAL; REAL;

CLRSCR; (* Borra la pantalla *) (* Solicitud de datos al usuario. *) WRITELN('Dame los siguientes datos:'); WRITE('Nombre: '); READLN(cNombre); WRITE('Puesto: '); READLN(cPuesto); WRITE('Antigedad: '); READLN(nAntig); WRITE('Salario Diario: '); READLN(nSalDia); WRITE('Das Trabajados: '); READLN(nDiasTrab); (* Clculos de ingresos y deducciones. *)

Realiz: Ing. Domingo Olivares Barrios

Pg. 42

nSalTotAPag := nDiasTrab * nSalDia; nImss := nSalTotAPag * 0.03; nApEduc := nSalTotAPag * 0.01; nInfonavit := nSalTotAPag * 0.05; nSar := nSalTotAPag * 0.03; nIspt := nSalTotAPag * 0.02; IF nAntig >= 5 THEN nBono := nSalTotAPag * 0.05 ELSE nBono := 0; nTotNetoAPagar := nSalTotAPag + nBono; (* Despliegue de Resultados. *) WRITELN('Resultados:'); WRITELN('IMSS: ',nImss:10:2); WRITELN('ISPT: ',nIspt:10:2); WRITELN('SAR: ',nSar:10:2); WRITELN('Apoyo a la Educacin: ',nApEduc:10:2); WRITELN('INFONAVIT: ',nInfonavit:10:2); WRITELN('Bono: ',nBono:10:2); WRITELN('Salario Total a Pagar: ',nSalTotAPag:10:2); WRITELN('Total Neto a Pagar: ',nTotNetoAPagar:10:2); END.

Realiz: Ing. Domingo Olivares Barrios

Pg. 43

Lenguaje Clipper12.
FUNCTION Ejemplo() * Programa EJEGCLIP.PRG * Mtodo de Diseo General o Elemental. * Programa Principal. * Declarando e Inicializando variables. LOCAL cNombre := " ", cPuesto := " ",; nAntig := 0, nSalDia := 0, nDiasTrab := 0, nSalTotAPag := 0,; nImss := 0, nApEduc := 0, nInfonavit := 0, nSar := 0,; nIspt := 0, nBono := 0, nTotNetoAPagar := 0 CLS //Borra la pantalla. * Solicitud de datos al usuario. @ 1,10 @ 2,10 @ 2,30 @ 3,10 @ 3,30 @ 4,10 @ 4,30 @ 5,10 @ 5,30 @ 6,10 @ 6,30 READ SAY SAY GET SAY GET SAY GET SAY GET SAY GET "Dame los siguientes datos:" "Nombre:" cNombre "Puesto:" cPuesto "Antigedad:" nAntig "Salario Diario:" nSalDia "Das Trabajados:" nDiasTrab

* Clculos de ingresos y deducciones. nSalTotAPag := nDiasTrab * nSalDia nImss := nSalTotAPag * .03 nApEduc := nSalTotAPag * .01 nInfonavit := nSalTotAPag * .05 nSar := nSalTotAPag * .03 nIspt := nSalTotAPag * .02 IF nAntig >= 5 nBono := nSalTotAPag * .05 ELSE nBono := 0 END IF nTotNetoAPagar := nSalTotAPag + nBono * Despliegue de Resultados. @ 8,10 SAY "Resultados:" @ 9,10 SAY "IMSS: " Aunque algunos programadores van muy lejos negndole el ttulo de lenguaje a Clipper, eso es una verdad a medias. La mayora sabemos que los programas generados por Clipper son en realidad P-CODE, es decir pseudo cdigo (muy optimizado por cierto), que se interpreta en tiempo de ejecucin, en lugar de ejecutarse directamente. Ese posible defecto no resta valor alguno a una de las mejores y mas potentes herramientas de programacin existentes en el mercado. Tanto que inclusive ha incursionado en las tendencias de programacin orientada al objeto y programacin dirigida por eventos, logrando con esto crear aplicaciones incluso para ambiente Windows. En el presente ejemplo, se utilizo la versin 5.2e
12

Realiz: Ing. Domingo Olivares Barrios

Pg. 44

@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ RETURN

9,35 SAY nImss 10,10 SAY "ISPT: " 10,35 SAY nIspt 11,10 SAY "SAR: " 11,35 SAY nSar 12,10 SAY "Apoyo a la Educacin: " 12,35 SAY nApEduc 13,10 SAY "INFONAVIT: " 13,35 SAY nInfonavit 14,10 SAY "Bono: " 14,35 SAY nBono 15,10 SAY "Salario Total a Pagar: " 15,35 SAY nSalTotAPag 16,10 SAY "Total Neto a Pagar: " 16,35 SAY nTotNetoAPagar

Realiz: Ing. Domingo Olivares Barrios

Pg. 45

C++ /* Programa EJEMGC.C


Mtodo de Diseo General o Elemental. Programa Principal. */ #include <stdio.h> /* Incluir archivo stdio.h stANDARd iNPUT oUTPUT. hEADING- */ /* Encabezado Normal o Universal de Entrada Salida*/ main () /* Inicio del programa principal */ { /* Declarando e inicializando variables. */ char cNombre[10]; char cPuesto[10]; float nAntig = 0; float nSalDia = 0; float nDiasTrab = 0; float nSalTotAPag = 0; float nImss = 0; float nApEduc = 0; float nInfonavit = 0; float nSar = 0; float nIspt = 0; float nBono = 0; float nTotNetoAPagar = 0; /* Solicitud de datos al usuario. */ printf("Dame los siguientes datos:\n"); printf("Nombre: "); scanf("%s",cNombre); printf("Puesto: "); scanf("%s",cPuesto); printf("Antigedad: "); scanf("%f",&nAntig); printf("Salario Diario: "); scanf("%f",&nSalDia); printf("Das Trabajados: "); scanf("%f",&nDiasTrab); /* Clculos de ingresos y deducciones. */ nSalTotAPag = nDiasTrab * nSalDia; nImss = nSalTotAPag * 0.03; nApEduc = nSalTotAPag * 0.01; nInfonavit = nSalTotAPag * 0.05; nSar = nSalTotAPag * 0.03; nIspt = nSalTotAPag * 0.02; if(nAntig >= 5) nBono = nSalTotAPag * 0.05; else nBono = 0; nTotNetoAPagar = nSalTotAPag + nBono; /* Despliegue de Resultados. */ printf("Resultados:\n"); printf("IMSS: %f\n",nImss); printf("ISPT: %f\n",nIspt); printf("SAR: %f\n",nSar);

Realiz: Ing. Domingo Olivares Barrios

Pg. 46

printf("Apoyo a la Educacin: %f\n",nApEduc); printf("INFONAVIT: %f\n",nInfonavit); printf("Bono: %f\n",nBono); printf("Salario Total a Pagar: %f\n",nSalTotAPag); printf("Total Neto a Pagar: %f\n",nTotNetoAPagar); } /* Fin del programa. */

7. - Capturar la codificacin. Esta actividad, consiste en introducir las instrucciones del programa ya codificado, en la computadora. Generalmente, cuando ya se tiene un poco de experiencia en la programacin, el programador captura directamente el cdigo. En el disquete que acompaa a esta obra, vienen los cdigos fuentes del programa de ejemplo, as como los ejecutables del mismo, en su respectivo lenguaje. 8. - Prueba y deteccin de errores. Se realiza esta actividad, tras terminar la captura del programa. 9. - Depuracin del programa. Es la correccin de los errores detectados durante las pruebas efectuadas en la actividad anterior. 10. - Ejecucin y puesta en operacin del programa. Despus de estar probado el programa, y de estar ejecutndolo durante un tiempo, a prueba, con copias de la informacin original, el programa se incorpora al sistema principal, donde trabajara con informacin original.

Realiz: Ing. Domingo Olivares Barrios

Pg. 47

5. - Diagramas de flujo.
5.1. - Tipos de diagramas de flujo. 5.1.1. - Diagramas de flujo lineales. Los diagramas de flujo lineales, son aquellos en los cuales, el conjunto de instrucciones se ejecutan una sola vez. INICIO

OPERACIN 1

OPERACIN 2

OPERACIN 3

FIN 5.1.2. - Diagramas de flujo cclicos. Los diagramas de flujo cclicos, son aquellos en los cuales, un conjunto de instrucciones o todas se ejecutan una cantidad determinada o indeterminada de veces. 5.2. - Estructuras de diagramas de flujo lineales. 5.2.1. - Estructura de secuencia. Una estructura de secuencia se representa ya sea por medio del smbolo de proceso o el smbolo de proceso predefinido (subrutinas, procedimientos o funciones). Tambin es posible tener smbolos mltiples de proceso o de proceso predefinido dentro de una sola estructura de secuencia. Sin embargo, existe solo una entrada a una estructura de secuencia y una salida a partir de sta; ste es un punto muy importante que se cumple para todas las estructuras. En la siguiente figura se muestra una estructura de secuencia que contiene pasos mltiples.

Realiz: Ing. Domingo Olivares Barrios

Pg. 48

5.2.2. - Estructura de decisin. El smbolo de decisin representa una decisin que se efecta y las rutas lgicas alternativas que deben seguirse como resultado. Existe una entrada a un smbolo de decisin y dos salidas a partir de l; sin embargo, sigue existiendo solo una entrada a la estructura de decisin y una salida a partir de esta. El smbolo de decisin es solo una parte de la estructura de decisin. Este punto se muestra en la siguiente figura.

5.2.3. - Ramificaciones. Un tipo comn de decisin en varios sentidos depende de la forma en que el contenido de una variable cambia, y las diversas opciones que se presenten, este es el caso de la estructura "EN CASO", en la cual puede tomarse una de varias Realiz: Ing. Domingo Olivares Barrios Pg. 49

ramificaciones, dependiendo del contenido de una variable o del resultado de una expresin booleana.

CONDICION

CONDICION

CONDICION

CONDICION

CONDICION

5.3. - Estructuras de diagramas de flujo cclicos. 5.3.1. - Creacin de ciclos, iteraciones o bucles. En diagramas de flujo en donde se estn leyendo registros o datos mltiples (las ms de las veces) siempre se efecta una ramificacin de regreso a la verificacin de BANDERA-FIN despus de leer otro registro al final de la rutina PROCESO. Este proceso de re-utilizar el mismo conjunto de lgica para cada registro que se procesa es un ejemplo de CICLO. La creacin de ciclos consta de ejecutar cualquier serie de instrucciones en forma repetida. Sin embargo, los ciclos no tienen que incluir toda la rutina de PROCESO; pueden cubrir solo una pequea parte de la rutina (PROCESO u otra). En algunas ocasiones a los bucles tambin se les llama como ANILLOS. 5.3.2. - Pasos de un ciclo o bucle. En cualquier proceso de ciclo estn presentes algunos pasos estndar. Estos pasos, excepto el primero, pueden encontrarse en casi cualquier orden que se necesite para producir el efecto deseado. La principal diferencia es en cuanto a la parte del ciclo en que se efectan la modificacin y la prueba, lo que provocara que el ciclo se conozca como controlado desde el inicio o controlado desde la salida. Dependiendo del lenguaje que se este utilizando para implantar el diagrama de flujo, el proceso de inicializacin, modificacin y prueba tal vez requiera dos o ms instrucciones reales de programacin para lograr las acciones necesarias. 1. Inicializacin: Paso en el que se da un valor inicial a los elementos. Estos elementos se utilizaran para determinar cuando puede concluir el ciclo. Esto puede implicar trasladar un valor como UNO a un rea. 2. Procesamiento: Paso o pasos en el ciclo en los que el procesamiento real presente dentro del ciclo se efecta. 3. Modificacin: Paso del ciclo en que efecta algn tipo de alteracin al elemento que se inicializo en el paso 1. Esto podr ser sumar UNO a un contador, leer el siguiente registro disponible o modificar el valor de alguna Realiz: Ing. Domingo Olivares Barrios Pg. 50

variable. 4. Prueba: Paso del ciclo en el que se prueba el valor de un elemento (como determinar si el registro es de datos o el valor de un contador ha excedido un valor dado) para determinar si el ciclo debe continuarse o concluirse. 5.3.3. - Ciclos o bucles anidados. Tambin es posible que un diagrama de flujo contenga mltiples ciclos y que un ciclo este dentro de otro ms grande. Cuando un ciclo esta dentro de otro ms grande, se dice que el que se encuentra en el interior esta anidado. 5.3.4. - Estructura de " para hasta ". Esta estructura es muy especial ya que el nmero de ciclos que se efectuaran es, normalmente, fijo; y se basa en la verificacin de una variable numrica; ejecutndose el proceso hasta que dicha variable numrica excede el nmero establecido de ciclos.
ENTRADA

V=I
V > F

VERDADERO

SALIDA
FALSO

INC

PROCESO

En este tipo de bucle, a la VARIABLE (V) numrica se le asigna el valor INICIAL (I) a la cual se le sumara el INCREMENTO (INC) despus de cada ejecucin de las instrucciones del PROCESO hasta que alcance un valor mayor que el valor FINAL (F).

Realiz: Ing. Domingo Olivares Barrios

Pg. 51

El smbolo aqu presentado, es exclusivo de este tipo de bucle; desglosndolo se tendra el siguiente diagrama de flujo:
ENTRADA

V=I A
VERDADERO

V>F
FALSO

SALIDA

PROCESO

INC

A Como es de notar, el primer diagrama es ms compacto, razn por la cual es el ms utilizado cuando se hace necesario diagramar este tipo de bucle. El algoritmo se escribira de la siguiente manera: ESPAOL Entrada PARA V = I HASTA F INCREMENTO INC PROCESO SIGUIENTE Salida INGLS Entrada FOR V = I TO F STEP INC PROCESO NEXT Salida

Donde la sentencia SIGUIENTE (NEXT), implica que automticamente se suma INC al valor de la variable V y regresa el flujo del programa a la sentencia PARA (FOR) donde se evala la condicin. En este punto, a propsito y de ahora en adelante, se mostrar el algoritmo de las estructuras bsicas, en el idioma ingls, para dar una aproximacin a lo que ser el cdigo en algn lenguaje de programacin, ya que ser comn el manejo de este idioma en casi todos los lenguajes de programacin.

Realiz: Ing. Domingo Olivares Barrios

Pg. 52

5.3.5. - Estructura de " hacer mientras ". Estas estructuras se utilizan para procesos cclicos. En la siguiente figura se muestra la estructura "hacer mientras" (do while while do), en donde el proceso se realiza mientras la condicin en el smbolo de toma de decisin es verdadera; y cuando resulta ser falsa, se sale del ciclo. ENTRADA A
NO CONDICION

SALIDA

SI PROCESO

A En el segmento de diagrama mostrado, el PROCESO se realizara mientras la CONDICION sea verdadera (SI); cuando sea falsa (NO), se dar por terminado el ciclo o bucle y se saldr de esa lnea de lgica. El algoritmo se escribira de la siguiente manera: ESPAOL Entrada HACER MIENTRAS Condicin=Verdadera PROCESO FIN MIENTRAS Salida INGLS Entrada DO WHILE Condicin=Verdadera PROCESO END WHILE Salida

El equivalente al conector A del diagrama es el FIN MIENTRAS (END WHILE); y esto implica que dicha sentencia hace que regrese el flujo del programa a la sentencia HACER MIENTRAS (DO WHILE) donde se evala la condicin.

Realiz: Ing. Domingo Olivares Barrios

Pg. 53

5.3.6. - Estructura de " hacer hasta ". (repetir hasta) Esta estructura es similar a la estructura "hacer mientras", solo que la prueba de la condicin se efecta despus de realizar, al menos una vez, el proceso. En la siguiente figura se muestra la estructura "hacer hasta" (repeat until - repetir hasta). ENTRADA A PROCESO

CONDICION

NO

SI SALIDA En el segmento de diagrama mostrado, el PROCESO se REPETIRA HASTA que la condicin sea verdadera (SI); y si sta es falsa (NO), se efectuar nuevamente el PROCESO. Como se puede observar, al estar la evaluacin de la condicin despus del proceso, esto asegura que el PROCESO se realice forzosamente, como mnimo, una vez. El algoritmo se escribira de la siguiente manera: ESPAOL Entrada REPETIR PROCESO HASTA Condicin=Verdadera Salida Otra forma podra ser: ESPAOL Entrada HACER PROCESO INGLS Entrada DO PROCESO INGLS Entrada REPEAT PROCESO UNTIL Condicin=Verdadera Salida

Realiz: Ing. Domingo Olivares Barrios

Pg. 54

VUELTA HASTA Condicin=Verdadera Salida

LOOP UNTIL Condicin=Verdadera Salida

La sentencia HASTA o VUELTA HASTA, adems de evaluar la Condicin; en caso de que sea falsa regresara el flujo del programa a la instruccin REPETIR o HACER, si es verdadera, saldr del bucle. O bien, como caso especial, y usando lgica inversa: Entrada HACER PROCESO MIENTRAS Condicin=Falsa Salida Que tambin podra quedar como: Entrada HACER PROCESO MIENTRAS Condicin<>Verdadero Salida Entrada DO PROCESO WHILE Condicin<>Verdadero Salida Entrada DO PROCESO WHILE Condicin=Falsa Salida

Y como puede observarse, cuando la condicin alcance el valor Verdadero, terminar el bucle. En otras palabras, mientras la condicin sea falsa, se ejecutar el bucle, y en cuanto sea verdadera, como en los casos anteriores, se saldr del bucle.

Realiz: Ing. Domingo Olivares Barrios

Pg. 55

6. - Herramientas de programacin.
Las herramientas de programacin, como le llamamos algunos programadores, no son otra cosa que aquellos conceptos y operaciones bsicas de lgica utilizadas en los programas; las cuales son frmulas lgicas muy sencillas, frecuentemente utilizadas en cualquier programa. 6.1. - El contador. Un contador es una variable numrica cuyo valor se incrementa o decrementa en una cantidad constante en el flujo de un programa, y normalmente se utiliza en los bucles. Su estructura es la siguiente: VARIABLE CONTADOR = VARIABLE CONTADOR + INCREMENTO Ejemplos: nC = nC + 1 Cuenta de uno en uno. nValor = nValor + 2 Cuenta de dos en dos. nNum = nNum + 3 Cuenta de tres en tres. 6.2. - El acumulador o sumador. Un acumulador o sumador es una variable numrica cuyo valor se incrementa o decrementa en una cantidad variable, representada por otra variable, en el flujo de un programa, y normalmente se utiliza en los bucles. Su estructura es la siguiente: VARIABLE ACUMULADOR = VARIABLE ACUMULADOR + VARIABLE INCREMENTO Ejemplos: nC = nC + nS nValor = nValor + nCant nNum = nNum + nPar

Realiz: Ing. Domingo Olivares Barrios

Pg. 56

6.3. - La bandera o indicador. Es una variable de tipo booleano o, en ocasiones, tipo carcter, la cual solo adquiere uno de dos valores, considerndolos como 0 (apagado) false, y 1 (encendido) true. Dicha variable se utiliza en estructuras de control en una bifurcacin condicional, tal y como se muestra en el siguiente ejemplo: ENTRADA

BANDERA = Valor lgico 1

PROCESO A

BANDERA Operador lgico Valor lgico 2

NO SI

PROCESO B

SI NO

A A

SALIDA La aplicacin prctica de una BANDERA o INDICADOR, es la de condicionar una accin dentro de nuestro programa, tal y como se muestra en el diagrama. Se dice que la BANDERA se enciende (TRUE o 1) cuando se ha logrado una condicin o resultado y se apaga (FALSE o 0) en caso contrario. Cuando el valor de la BANDERA es modificada, se efectuar o no un proceso alternativo, o bien se sale o no, de un bucle o programa. En el diagrama del ejemplo, se inicializa la variable BANDERA a un Valor lgico 1 (TRUE o FALSE, 1 o 0), posteriormente se realiza el PROCESO A, el cual dentro de su lgica modifica o no el valor de la variable BANDERA, y al terminar el PROCESO A, se compara el valor de la variable BANDERA con el Valor lgico 2 (TRUE o FALSE, 1 o 0), y dependiendo del resultado que arroje se ejecutara o no, el PROCESO B alternativo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 57

6.4. - Salida de un programa por opcin. En este tipo de herramienta, se establece una rutina, que consiste en preguntar al usuario si desea continuar con un proceso o finalizar, inmediatamente se verifica la respuesta y se ejecuta la accin correspondiente, que es continuar con la ejecucin del proceso o finalizar. El siguiente diagrama muestra uno ejemplo de esta salida. ENTRADA A

PROCESO

Desea Continuar (S/N) ?

cRespuesta

cRespuesta = S

SI A

NO SALIDA

En el despliegue se colocara el mensaje de acuerdo al proceso que se este desarrollando, y en la toma de decisin el carcter puede ser N, aunque esto invertira el orden de las salidas (SI y NO).

Realiz: Ing. Domingo Olivares Barrios

Pg. 58

6.5. - Salida de un programa por centinela. Una salida por centinela, se establece cuando una condicin o condiciones se cumplen o no, lo cual genera en su caso la finalizacin del programa o no, dependiendo de la condicin que establezca el programador. A continuacin se ilustra un diagrama mostrando la lgica de operacin de una salida por centinela.

ENTRADA A

PROCESO

SI NO CONDICIN

NO SI

SALIDA En el diagrama, el PROCESO puede solicitar datos por teclado o bien leer datos de un archivo, y cuando se tome un dato determinado, este se compara en la CONDICIN el cual contendr un valor determinado, y en funcin del resultado de la expresin lgica (CONDICION) se saldr o no del programa. 6.6. Subrutinas, procedimientos y funciones. 6.6.1.- Subrutinas. Una Subrutina, es un grupo de instrucciones que efecta una parte identificable del programa general. Y normalmente se crean para evitar la codificacin repetitiva de grupos de instrucciones a lo largo del programa. Son ejemplos representativos de elementos que podran encontrarse en subrutinas: 1. Rutinas de mantenimiento. 2. Rutinas de encabezado. 3. Rutinas de clculo. 4. Rutinas de procesamiento de tablas. 5. Rutinas de edicin. 6. Inicializar variables o Colocar contadores en cero. El diagrama que sigue, muestra en lneas discontinuas lo que sera el flujo de un Realiz: Ing. Domingo Olivares Barrios Pg. 59

programa que llama a una subrutina. ENTRADA

PROCESO

SUBRUTINA A

SUBRUTINA A PROCESO DE LA SUBRUTINA RETORNO

PROCESO

SUBRUTINA A

PROCESO C

SALIDA Como se puede observar en el diagrama, la llamada a la Subrutina transfiere el flujo del programa a otro punto donde inicia la Subrutina, y al trmino de esta, se retorna automticamente el flujo a la instruccin que sigue del lugar donde se hizo la llamada. Las subrutinas pueden ser internas o externas. Las internas, estn fsicamente en el programa y este las utiliza en el procesamiento. Las subrutinas externas las usa el programa pero no son fsicamente parte de l y de alguna forma debe efectuarse el acceso a ella para que puedan utilizarse.

Realiz: Ing. Domingo Olivares Barrios

Pg. 60

Archivo de Cdigo de Programa con llamada a Subrutina Interna. INICIA CODIGO DEL PROGRAMA. INICIA CODIGO DE LA SUBRUTINA INTERNA. FIN DEL CODIGO DE LA SUBRUTINA INTERNA. CONTINUA CODIGO DEL PROGRAMA. LLAMADA A LA SUBRUTINA FIN DEL CODIGO DEL PROGRAMA.

Archivo de Cdigo de Programa con llamada a Subrutina Externa. INICIA CODIGO DEL PROGRAMA. CONTINUA CODIGO DEL PROGRAMA. LLAMADA A LA SUBRUTINA FIN DEL CODIGO DEL PROGRAMA.

Archivo Independiente de Cdigo que contiene las instrucciones de la Subrutina Externa. INICIA CODIGO DE LA SUBRUTINA EXTERNA. FIN DEL CODIGO DE LA SUBRUTINA EXTERNA.

Las subrutinas internas pueden ser abiertas o cerradas. Las primeras se escriben dentro de la lgica principal del programa, por lo general como parte de la rutina PROCESO, mientras que las cerradas estn fuera de la lgica principal del programa (pero siguen siendo parte de este) y debe efectuarse una ramificacin hacia ellas a fin de ejecutarlas. Las subrutinas cerradas normalmente se utilizan para las tres subrutinas principales (indicadas en la lista al inicio de este tema) en la lgica de lnea principal y cuando la rutina debe ejecutarse en varios puntos del Realiz: Ing. Domingo Olivares Barrios Pg. 61

programa para evitar la redundancia. Sin las subrutinas cerradas, el proceso realizado por la subrutina necesitara volverse a realizar o a codificar en cualquier parte en que se deseara efectuar la rutina. La forma de representar en diagrama de flujo los dos tipos se muestra en la siguiente figura:
Archivo de Cdigo de Programa con Subrutina Abierta. INICIA CODIGO PRINCIPAL DEL PROGRAMA. INICIA CODIGO DE LA SUBRUTINA ABIERTA. FIN DEL CODIGO DE LA SUBRUTINA ABIERTA. CONTINUA CODIGO DEL PROGRAMA. LLAMADA A LA SUBRUTINA FIN DEL CODIGO DEL PROGRAMA.

Archivo de Cdigo de Programa con Subrutina Cerrada. INICIA CODIGO DE LA SUBRUTINA CERRADA. FIN DEL CODIGO DE LA SUBRUTINA CERRADA. INICIA CODIGO PRINCIPAL DEL PROGRAMA. CONTINUA CODIGO DEL PROGRAMA. LLAMADA A LA SUBRUTINA FIN DEL CODIGO DEL PROGRAMA.

Y por ltimo, debo mencionar que se pueden pasar o transferir datos del programa principal a la subrutina a travs de variables, y sta a su vez puede regresar valores al programa principal a travs de las mismas u otras variables. Tambin es posible que una subrutina llame a otra subrutina, y sta a su vez pueda llamar a otra, y as sucesivamente; teniendo como lmite las caractersticas del lenguaje o de memoria del equipo. Hasta este punto, hemos visto las subrutinas que fueron el intento de los primeros programadores para estructurar los programas; y aunque este comentario haga parecer que stas Realiz: Ing. Domingo Olivares Barrios Pg. 62

son teoras pasadas, no es as, puesto que los mismos conceptos son aplicables a los procedimientos y funciones, los cuales veremos a continuacin.13 6.6.2.- Procedimientos. Un Procedimiento, es similar a una subrutina, puesto que tambin es un grupo de instrucciones que efecta una parte identificable del programa general, y normalmente se crean para evitar la codificacin repetitiva de grupos de instrucciones a lo largo del programa, as mismo tienen caractersticas parecidas en cuanto al paso o transferencia de datos y las llamadas a otros procedimientos. Pero a diferencia de las subrutinas, el paso o transferencia de datos se da a travs de variables llamadas parmetros. El objetivo de estos parmetros es la de aislar de cierta manera los datos manipulados para evitar errores, confusiones y creacin de excesivos nombres de variables, as como permitir la re-usabilidad del cdigo. Generalmente los procedimientos son llamados para su ejecucin cual si fueran instrucciones del lenguaje y, no retornan o devuelven ningn valor al programa principal o procedimiento que los llama. 6.6.3.- Funciones. Una Funcin en un lenguaje de programacin realiza una serie de operaciones automticamente, al llamarla por su nombre especfico. Algunos ejemplos de funciones son las funciones trigonomtricas, tales como el Seno, Coseno, Tangente, o las funciones matemticas como el logaritmo natural de un nmero; entre otras. Una de las caractersticas ms importantes de las funciones, es que podemos pasarle o transferirle datos, los cuales procesan y nos devuelven uno o ms resultados. Los datos que se transfieren son conocidos como parmetros, y en algunos casos van encerrados entre parntesis. Principalmente se usan cuando se quiere devolver por lo menos un valor a la funcin, programa o procedimiento llamador. En algunos lenguajes, generalmente en una Funcin, el nombre actual de la Funcin, es el identificador de la variable que transmite el valor de vuelta. En cualquier lenguaje de programacin se cuenta con al menos los siguientes tipos de funciones: Alfanumricas, de fecha, y matemticas. Algunos lenguajes permiten al usuario crear sus propias funciones, a las cuales se les nombra comnmente como Funciones de Usuario. Generalmente las funciones pueden ser llamadas desde cualquier punto de un programa e inclusive pueden ser pasadas como parmetros a una instruccin o funcin del lenguaje.

13

Antes debo comentar que las subrutinas son utilizadas en algunos lenguajes tales como el BASIC, los cuales no estn plenamente orientados a la programacin estructurada, tal como PASCAL por ejemplo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 63

6.6.3.1.- Funciones Implcitas. Una funcin implcita es aquella que ya se encuentra incluida dentro de la estructura del lenguaje de programacin, y tiene su nombre definido, por lo tanto, solo es necesario llamarlas para que se ejecuten cuando las necesitemos. 6.6.3.2.- Funciones de Usuario. Una Funcin de usuario, es similar a una subrutina, puesto que tambin es un grupo de instrucciones que efecta una parte identificable del programa general, y normalmente se crean para evitar la codificacin repetitiva de grupos de instrucciones a lo largo del programa, as mismo tienen caractersticas parecidas en cuanto al paso o transferencia de datos y las llamadas a otros procedimientos o funciones. Pero a diferencia de las subrutinas y al igual que en los procedimientos, el paso o transferencia de datos se da a travs de parmetros. 6.6.4.- Parmetros en procedimientos y funciones. Los parmetros pueden ser pasados a los procedimientos o funciones por referencia (por variable) o por valor. Las variables dadas al procedimiento o funcin al llamarlo se llaman parmetros actuales. El procedimiento o funcin se escribe usando nombres de variables, llamadas parmetros formales, listadas en sus cabeceras. 6.6.4.1.- Parmetros por valor. El paso de un parmetro por valor a un procedimiento o funcin, sucede cuando solo se pasa el valor de una variable origen a otra variable destino, y sta ltima puede ser modificada en su contenido, lo cual no afectar al contenido de la variable origen. En otras palabras, le pasamos una copia del valor, y por tanto, si el procedimiento o funcin modifica el valor de la copia, el valor original no se modificar. A continuacin se presenta un diagrama describiendo lo anterior:

Realiz: Ing. Domingo Olivares Barrios

Pg. 64

Inicio del Cdigo del Programa Principal. VariableOrigen = 5 LlamadaAlProcedimientoA(VariableOrigen) Desplegar Variable Origen Parmetro Actual Fin del Cdigo del Programa Principal.

VariableOrigen

Este cuadro representa el rea de memoria donde se almacena el valor de VariableOrigen.

Cabecera del Procedimiento o Funcin

Parmetro Formal Este cuadro representa el rea de memoria donde se almacena el valor de ParmetroPorValor. El cual es una copia del original. Como puedes observar, la modificacin del valor se realiza en el rea de memoria donde se almaceno la copia del valor, y no en el rea de memoria donde tenemos el valor original. Esto es til cuando no queremos que se modifique el valor original o inicial.

LlamadaAlProcedimiento(ParmetroPorValor) Inicio del Cdigo de un Procedimiento o Funcin. ParametroPorValor = ParametroPorValor+2 Fin del Cdigo de LlamadaAlProcedimiento Retorno (RETURN) al Programa Principal.

5
ParmetroPorValor

7
ParmetroPorValor

Realiz: Ing. Domingo Olivares Barrios

Pg. 65

6.6.4.2.- Parmetros por referencia (por variable). El paso de un parmetro por referencia (variable) a un procedimiento o funcin, sucede cuando se pasa el valor de una variable origen a otra variable destino, y sta ltima cuando se modifica en su contenido altera el contenido de la variable origen. En otras palabras, le pasamos el original del valor, y por tanto, si el procedimiento o funcin modifica el parmetro o variable destino, el valor original se modificar. Tambin se podra decir que a la misma direccin de memoria en la que se almacena el valor original, se le asigna un segundo nombre de variable, por tanto, al hacer referencia al primer nombre o al segundo, indistintamente se estar usando la misma direccin de memoria. A continuacin se presenta un diagrama describiendo lo anterior:
Inicio del Cdigo del Programa Principal. VariableOrigen = 5 LlamadaAlProcedimientoA(VariableOrigen) Desplegar Variable Origen Parmetro Actual Fin del Cdigo del Programa Principal.

Este cuadro representa el rea de memoria donde se almacena el valor de la VariableOrigen.

VariableOrigen

VariableOrigen

5
ParmetroPorVariable

7
ParmetroPorVariable

Cabecera del Procedimiento o Funcin

Parmetro Formal

LlamadaAlProcedimiento(ParmetroPorVariable) Inicio del Cdigo de un Procedimiento o Funcin. ParametroPorVariable = ParametroPorVariable+2 Fin del Cdigo de LlamadaAlProcedimiento Retorno (RETURN) al Programa Principal.

Este cuadro representa el rea de memoria donde se almacena el valor del ParmetroPorValor. El cual es una copia del original.

Como puedes observar, los dos nombres de variables hacen referencia a la misma posicin de memoria, por lo tanto, al modificar el valor de ParmetroPorVariable, tambin se modificara el valor de VariableOrigen, puesto que ambos nombres de variables apuntan a la misma posicin de memoria.

Realiz: Ing. Domingo Olivares Barrios

Pg. 66

Como ltimas notas con relacin a los parmetros, debo comentar que es posible usar los mismos nombres de variables en los parmetros actuales y los formales, ya que esto por lo general, no creara confusin al interprete del lenguaje, sin embargo, en la vida real es poco prctico pues podra crearnos confusiones a nosotros; y adems, creo que resultara til usar las siguientes reglas para determinar si un parmetro debe ser por valor o por referencia (por variable). 1. Si el procedimiento o funcin lee valores o calcula valores que el procedimiento, funcin o programa que le llama necesita usar, estos parmetros deben ser parmetros por referencia (por variable). 2. Si el procedimiento o funcin lee valores o calcula valores que el procedimiento, funcin o programa que le llama necesita para darlo a otro procedimiento o funcin, estos parmetros tienen que ser parmetros por referencia (por variable). 3. Los nombres de archivo pasados como parmetros deber ser parmetros por referencia (por variable). 4. Todos los dems parmetros deben ser por valor. (Salvo aquellas excepciones propias de cada lenguaje de programacin). 6.6.5.- Variables en procedimientos y funciones. Puesto que ya conocemos la definicin de variable y todas sus caractersticas, solo resta decir, que las variables tambin cuentan con un mbito de utilizacin, es decir, estas pueden ser utilizadas por todo el programa (Variables Globales) o solamente por segmentos (procedimientos o funciones) de dicho programa (Variables Locales). 6.6.5.1.- Variables Globales. Cualquier variable declarada en el cuerpo del programa principal es conocida por cualquier procedimiento o funcin que no declare una variable con el mismo nombre. 6.6.5.2.- Variables Locales. Estas variables son las que los procedimientos o funciones necesitan para s mismos. Las variables contadoras son ejemplos de variables que se necesitan frecuentemente dentro de un procedimiento o funcin. 6.6.5.3.- Reglas de mbito. Cualquier variable o constante definida en un bloque se conoce (llamada global) en cualquier procedimiento que est dentro de ese bloque. Examinemos el programa TRASPONER en trminos de bloques definidos y veamos lo que esto significa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 67

PROGRAMA Trasponer VARIABLE Primera PROCEDIMIENTO SaltarBlancos

PROCEDIMIENTO ObtenerPrimera VARIABLE Ch PROCEDIMIENTO ImprApellido VARIABLE Ch PROCEDIMIENTO EncontrarUltimo PROCEDIMIENTO SaltarNombre

PROCEDIMIENTO Imprimir

DIAGRAMA DE MBITOS

En este ejemplo Primera es una variable conocida o utilizable en cualquier procedimiento puesto que est definida en el PROGRAMA PRINCIPAL (Trasponer). La variable local Ch definida en ImprApellido es global a EncontrarApellido, SaltarNombre e Imprimir puesto que ImprApellido, SaltarNombre e Imprimir estn definidas dentro del procedimiento ImprApellido. Las reglas que gobiernan dnde se conocen esos identificadores se llaman reglas de mbito. El mbito de la variable Ch definida en ImprApellido incluye a ImprApellido, SaltarNombre e Imprimir. Por qu entonces usamos la lista de parmetros? Porque una buena prctica en programacin es que la comunicacin entre los mdulos de nuestros programas debe establecerse explcitamente. Esto limita la posibilidad de que un mdulo interfiera accidentalmente con otro. En otras palabras, a cada procedimiento o funcin se le da slo lo que necesita saber. Los buenos programas se escriben usando este principio. Hay algunos casos en los que es correcto referenciar globalmente a variables. En ejemplos posteriores veremos algunos de esos casos en los que es aceptable referenciar a variables globales. Si se declara el mismo nombre de variable (identificador) en un procedimiento o funcin y en el programa principal, no hay confusin. La declaracin de una variable local en un procedimiento o funcin hace que se desconozca a la variable global del mismo nombre. Llamamos a esto precedencia de nombre.

Realiz: Ing. Domingo Olivares Barrios

Pg. 68

6.6.5.4.- Efectos laterales. Puesto que las listas de parmetros de los procedimientos o funciones pueden ser muy complicadas segn la eleccin de parmetros por valor y por referencias (por variables), se puede tener la tentacin de referenciar directamente variables globales sin pasarlas a travs de las listas de parmetros. No hacerlo! Es un mal hbito. Puede conducir a cometer errores que son extremadamente difciles de localizar. Si la comunicacin entre mdulos de programas se reduce a las listas de parmetros y todas las variables que no sean de salida son parmetros por valor, cada mdulo queda aislado de lo que suceda en otras partes del programa. En otras palabras, el cdigo en un procedimiento no debe tener efectos laterales a otras partes del programa, excepto a travs de una interfase bien definida en la lista de parmetros. Otra forma de decir esto es que los procedimientos slo deben usar las variables definidas en su lista de parmetros formales o en su propia seccin de declaracin de variables. Crear mdulos independientes con una clara interfase de comunicacin.
Programa principal Y Otros procedimientos Efectos Laterales Lista de parmetros Interface de comunicacin Otros mdulos

Un procedimiento tpico

Mdulo

EFECTOS LATERALES

Se deben evitar los efectos laterales porque normalmente es difcil seguir el flujo de ejecucin. Por otra parte, las funciones se utilizan cuando se va a devolver un valor simple. Sin embargo, si una funcin tiene parmetros por referencia (variable) en la lista de parmetros formales, los correspondientes parmetros actuales pueden indudablemente ser cambiados. El enviar o cambiar ms de un valor en una llamada a funcin se llama un efecto lateral de la funcin y debe evitarse. Una buena regla es: No poner nunca parmetros por referencia (variable) en la lista de parmetros formales de una funcin. Si debe tenerlos, entonces debera usar un procedimiento y no una funcin. De hecho puede usar tantos parmetros por valor como necesite. Otro ejemplo de un efecto lateral es cuando un procedimiento o funcin Realiz: Ing. Domingo Olivares Barrios Pg. 69

referencia directamente a una variable global y no lo hace a travs de su lista de parmetros formales. Recordar, la comunicacin entre mdulos de un programa debe reducirse a las listas de parmetros formales y actuales. El siguiente ejemplo ilustra los dos tipos de efectos laterales.
PROGRAMA Inesperado(Entrada, Salida) VARIABLES A, B FUNCION Lateral (VARIABLES X, Y) INICIO (* Lateral *) X=X+Y A=X+1 Lado = X + A FIN (* Lateral *) INICIO (* Principal *) A=0 B=1 Despliega(Lateral(A,B)) Despliega(Lateral(A,B)) Despliega(Lateral(B,A)) Despliega(Lateral(B,A)) FIN (* Principal *)

Es lgico esperar que las primeras dos sentencias de despliegue produzcan la misma salida y las segundas dos sentencias de despliegue produzcan la misma salida tambin. Es decir, se espera que una funcin devuelva el mismo resultado cuando tiene la misma entrada. Desdichadamente, la funcin LATERAL tiene efectos laterales y no devuelve el mismo valor para dos llamadas sucesivas idnticas. Hagamos un recorrido del algoritmo y veamos lo que sucede.
Sentencia A B X Y LATERAL

(Valores iniciales) LATERAL(A,B) (cuando se llama) X=X+Y A=X+1 LATERAL = X + A

0 0 1 2 2

1 1 1 1 1

? 0 1 2 2

? 1 1 1 1

? ? ? ? 4

Lo que se imprime

LATERAL(A,B) (cuando se llama) X=X+Y A=X+1 LATERAL = X + A

2 3 4 4

1 1 1 1

2 3 4 4

1 1 1 1

? ? ? 8

Lo que se imprime

Realiz: Ing. Domingo Olivares Barrios

Pg. 70

LATERAL(A,B) (cuando se llama) X=X+Y A=X+1 LATERAL = X + A

4 4 6 6

1 5 5 5

1 5 5 5

4 4 6 6

? ? ? 11

Lo que se imprime

LATERAL(A,B) (cuando se llama) X=X+Y A=X+1 LATERAL = X + A

6 5 5 6 6 11 11 6 12 11 11 12 12 11 11 12

? ? ? 23

Lo que se imprime

Debido a que el primer parmetro es un parmetro por referencia (por variable), cuando se cambia el parmetro formal tambin se cambia el parmetro actual. Puesto que A se referencia globalmente, la funcin est cambiando tambin cada vez. Como puede verse por la salida de la funcin LATERAL (valores marcados con negritas), no slo se devuelven valores diferentes para la misma entrada, sino que ni siquiera se sigue una pauta. 6.6.6.- Recursividad. En algunos lenguajes de programacin, (p. e. Pascal), se permite que una funcin o procedimiento se llame a s mismo. La habilidad de una funcin o procedimiento de llamarse a s mismo se llama recursividad. La recursividad es una poderosa caracterstica de los lenguajes que lo permiten y se utilizar en los trabajos ms avanzados. Para el principiante, significa slo que no debe usarse el nombre de una funcin en una expresin en el cuerpo de esta funcin. Por tanto se debe definir y usar una variable local y asignar al nombre de la funcin el valor de la variable local antes de salir de la funcin. Por si le pica la curiosidad, se incluye un ejemplo recursivo. Lenguajes como el Pascal no tienen un operador de exponenciacin, por lo que vamos a escribir una funcin para calcular: Xn Donde X y n son enteros positivos no nulos. La frmula es: Xn = X * X*X**X n veces Otra forma de escribir esta relacin sera: Xn = X * (X*X**X) (n-1) veces Si conocemos Xn-1, podemos calcular Xn puesto que Xn = X(Xn-1). De la misma Realiz: Ing. Domingo Olivares Barrios Pg. 71

forma podemos reducir Xn-1 a: Xn = X*(X*(X**X)) (n-2) veces Si conocemos lo que vale Xn-2, podemos calcular Xn-1 y entonces calcular Xn puesto que Xn es igual a X(X(Xn-2)). Podemos continuar este proceso hasta que la expresin ms interior sea X1. Conocemos lo que es X1, su valor es X. Expresamos este razonamiento mediante la siguiente funcin recursiva POTENCIA, la cual tiene dos parmetros, nX y nN. FUNCION Potencia(nX, nN : Enteros) : Enteros INICIO (* Potencia *) SI nN = 1 ENTONCES Potencia = nX SINO Potencia = nX * Potencia(nX, nN-1) FIN DEL SI FIN. Cada llamada a la funcin POTENCIA pone los parmetros actuales en la interfase de comunicacin para la versin a la que se est llamando. El valor para X ser el mismo para cada versin de POTENCIA, pero el valor de N se disminuir en 1 por cada llamada hasta que N-1 sea igual a 1. La llamada a la funcin PTENCIA cuando N es 1 para la cadena de llamadas, porque ahora POTENCIA puede dar un valor. A POTENCIA se le asigna un valor (X para ser exactos) el cual se pasa a la versin de la funcin POTENCIA que hizo la ltima llamada. El valor de POTENCIA para esa versin puede ahora calcularse y pasarse a la versin que la llam a ella. Esto contina hasta que el valor de POTENCIA puede pasarse a la llamada original. Veamos lo que hace una llamada a POTENCIA con X = 2 y N = 3. La sentencia: nNum = POTENCIA(2,3) En el cuerpo del programa asigna el valor devuelto por la llamada a la variable nNum. El valor devuelto por POTENCIA y asignado a nNum debe ser 8 (23 es 2 x 2 x 2). Para ilustrar el proceso supongamos que cada llamada a POTENCIA crea una versin completa de POTENCIA. Cada caja en el siguiente diagrama representa el algoritmo para POTENCIA listado anteriormente, junto con los valores de los parmetros actuales para esa versin. Use el diagrama y el cdigo para ver por s mismo que la funcin POTENCIA hace lo que se supone que debe hacer. Cada versin POTNECIA va a la interfase de comunicacin para obtener los valores que se le dejan en ella. No hay confusin sobre qu nN se est usando porque nN es un parmetro formal.

Realiz: Ing. Domingo Olivares Barrios

Pg. 72

NNum = Potencia(2,3) El valor devuelto es 8 Llamada a POTENCIA(2,3) FUNCION Potencia nX nN

2
Llamada a POTENCIA(2,2)

3
El valor devuelto es 4

FUNCION Potencia nX nN

2
Llamada a POTENCIA(2,1)

El valor devuelto es 2

FUNCION Potencia nX nN

Realiz: Ing. Domingo Olivares Barrios

Pg. 73

Aquellos que encuentren este ejemplo no slo claro como el cristal, sino adems obvio, sigan adelante y utilicen la recursividad. Es una tcnica poderosa. El resto no se debe sentir intimidado. El comprender la recursividad no es uno de los objetivos de este tema. Deben continuar en informtica, ms adelante estudiarn sin ninguna duda la recursividad con detenimiento. 6.7. - Encadenamiento de programas. El encadenamiento de programas consiste en realizar programas que se "llamen" entre s, y se ejecuten. Esto se realiza creando un archivo que contenga el programa principal y los dems los programas auxiliares o complementarios. No todos los lenguajes de programacin permiten esta caracterstica, pero si permiten la inclusin de archivos, es decir, en un archivo se almacena el programa principal y en otro u otros los procedimientos o subrutinas adicionales (subrutinas externas), los cuales pueden ser llamados desde el archivo que contiene el programa principal al compilar el programa principal, y quedar incluidos en el programa objeto.

Realiz: Ing. Domingo Olivares Barrios

Pg. 74

7. - Tcnica de diseo modular.


Esta tcnica de programacin es recomendable para el desarrollo de sistemas de informacin complejos, ya que podemos combinarla con cualquier otra tcnica conocida (p. e. La tcnica de diseo elemental), para facilitar el desarrollo de una aplicacin. 7.1. - Fases de resolucin de problemas. TECNICA DE DISEO MODULAR Esta tcnica se basa en el principio del "divide y vencers"; es decir, debemos desglosar o dividir un problema en partes o problemas ms pequeos (mdulos o bloques); y si alguna(s) de esta(s) parte(s), son aun grandes, trataremos de dividirlo aun ms. Es recomendable desarrollar un diagrama en rbol, colocando en la parte superior el problema principal, y despus colocar en niveles inferiores, las divisiones o mdulos de este problema. Despus que se ha desglosado un problema, empezaremos a resolverlo desarrollando los programas de cada mdulo, empezando desde los mdulos de nivel ms bajo y en un orden conveniente segn nuestro criterio. Para resolver cada mdulo, es recomendable aplicar la tcnica general o elemental de programacin; aunque podemos usar alguna otra tcnica particular. Pero siempre debemos evitar el tratar de resolver un mdulo o problema codificndolo directamente. En general, las fases o pasos de resolucin de problemas aplicando esta tcnica son: 1. Determinar el objetivo o problema. 2. Analizar el problema, describiendo de manera general los pasos para resolverlo, cada uno de los cuales ser un mdulo de primer nivel. 3. Dividir sucesivamente los mdulos, hasta que no se puedan dividir ms. 4. Desarrollar un diagrama en rbol, en el cual se indicaran los mdulos definidos previamente. 5. Resolver los mdulos de los niveles ms bajos hacia los mas altos aplicando cualquier tcnica de programacin, en un orden conveniente. 6. Agrupar los mdulos de acuerdo a cada rama del diagrama en rbol, codificarlos e integrarlos en un solo programa, o bien, a travs de "encadenamientos". 7.2. - Estructuras jerrquicas o en rbol. El rbol es una estructura fundamental en informtica, muy utilizada en todos sus campos, porque se adapta a la representacin natural de informaciones homogneas organizadas y de una gran comodidad y rapidez de manipulacin. Esta estructura se encuentra en todos los

Realiz: Ing. Domingo Olivares Barrios

Pg. 75

dominios (campos) de la informtica, desde la pura algortmica14 a la compilacin15 o incluso los dominios de la inteligencia artificial (rboles de juegos, rboles de decisiones, de resolucin, etc.). Las estructuras tipo rbol se usan principalmente para representar informacin con una relacin jerrquica entre sus elementos, como son rboles genealgicos, tablas, etc. Un rbol es un conjunto finito de uno o ms nodos tales que: 1. Existe un nodo especial denominado RAIZ del rbol. 2. Los nodos restantes se dividen en un nmero mayor o igual que cero, conjuntos; cada uno de los cuales es, a su vez, un rbol. Estos rboles se llaman sub-rboles del RAIZ (ramas).

14 15

Mtodos de clasificacin y bsqueda. rboles sintcticos para representar las expresiones o producciones posibles de un lenguaje.

Realiz: Ing. Domingo Olivares Barrios

Pg. 76

A continuacin se muestra un diagrama ejemplificando lo anterior. ESTRUCTURA JERRQUICA O EN RBOL.


NIVEL 0 RAIZ

NIVEL 1 Sub-rbol O Nodo Sub-rbol O Nodo Sub-rbol O Nodo Sub-rbol O Nodo

NIVEL 2

Sub-rbol O Nodo

Sub-rbol O Nodo

Sub-rbol O Nodo

Sub-rbol O Nodo

Sub-rbol O Nodo

ESPEJO
Sub-rbol O Nodo Sub-rbol O Nodo Sub-rbol O Nodo Sub-rbol O Nodo Sub-rbol O Nodo

NIVEL 2

Sub-rbol O Nodo NIVEL 1

Sub-rbol O Nodo

Sub-rbol O Nodo

Sub-rbol O Nodo

NIVEL 0

RAIZ

Realiz: Ing. Domingo Olivares Barrios

Pg. 77

7.3. - Resolucin de problemas aplicando la Tcnica de diseo modular. 1. Determinar el objetivo o problema. (Deber especificarse por el maestro, es el problema en s). - Disear un programa que solicite los siguientes datos de un empleado: Ficha, nombre, puesto, antigedad, sueldo diario, das trabajados; que calcule y muestre el sueldo total neto a pagar, as como las cuotas por pagar por el patrn por sus prestaciones sobre su sueldo total bruto: un 3 % del Seguro Social, 1 % de Apoyo a la Educacin, 5 % de Infonavit, 2 % de I.S.P.T. (Impuesto Sobre Productos del Trabajo; y 3 % del SAR (Sistema de Ahorro para el Retiro. S el empleado tiene 5 aos o ms de antigedad, se le dar un bono del 5 % sobre su sueldo total bruto. 2. Analizar el problema, describiendo de manera general los pasos para resolverlo, cada uno de los cuales ser un mdulo de primer nivel. 1. 2. 3. 4. 5. Solicitar los datos del empleado. Calcular el salario total a pagar. Calcular las cuotas por pagar. Calcular el Total Neto a Pagar. Mostrar los importes del sueldo total neto a pagar, sus prestaciones.

3. Dividir sucesivamente los mdulos, hasta que no se puedan dividir ms. NIVEL 0 MDULO PRINCIPAL Clculo del sueldo total neto a pagar a un empleado, as como las cuotas por pagar. NIVEL 1 1. 2. 3. 4. 5. Solicitar Datos del Empleado. Calcular Salario Total a Pagar. Calcular Cuotas por pagar. Calcular el Total Neto a Pagar. Mostrar Resultados.

NIVEL 2 1. Solicitar Datos del Empleado. 1.1. Etiquetas de Solicitud de Datos. 1.2. Captura de Datos. 2. Calcular Salario Total a Pagar. 3. Calcular Cuotas por pagar. 3.1. Calcular Cuota del IMSS. 3.2. Calcular Cuota de Apoyo a la Educacin. Realiz: Ing. Domingo Olivares Barrios Pg. 78

3.3. Calcular Cuota del Infonavit. 3.4. Calcular ISPT. 3.5. Calcular SAR. 3.6. Calcular el Bono por antigedad. 4. Calcular el Total Neto a Pagar. 5. Mostrar Resultados. 4. Desarrollar un diagrama de rbol, en el cual se indicarn los mdulos definidos previamente.

NIVEL 0

Clculo del sueldo total neto a pagar a un empleado, as como sus cuotas y retenciones.

NIVEL 1

Solicitar Datos del Empleado.

Calcular Salario Total a Pagar.

Calcular Cuotas y Retenciones.

Calcular el Total Neto a Pagar.

Mostrar Resultados.

Etiquetas de Solicitud de Datos. Captura de Datos.

Calcular Cuota del IMSS. Calcular Cuota de Apoyo a la Educacin. Calcular Cuota del Infonavit. Calcular ISPT. Calcular SAR.

NIVEL 2

Calcular el Bono por antigedad.

Realiz: Ing. Domingo Olivares Barrios

Pg. 79

5. Resolver los mdulos de los niveles ms bajos hacia los ms altos aplicando cualquier tcnica de programacin, en un orden conveniente. NIVEL 2 PROCEDIMIENTO Etiquetas de Solicitud de Datos. INICIO Desplegar "Dame los siguientes datos:" Desplegar "Nombre:" Desplegar "Puesto:" Desplegar "Antigedad:" Desplegar "Salario Diario:" Desplegar "Das Trabajados:" RETORNO PROCEDIMIENTO Captura de Datos. INICIO Introducir cNombre Introducir cPuesto Introducir nAntig Introducir nSalDia Introducir nDiasTrab RETORNO PROCEDIMIENTO Calcular Cuota del IMSS. INICIO nImss = nSalTotAPag * 0.03 RETORNO PROCEDIMIENTO Calcular Cuota de Apoyo a la Educacin. INICIO nApEduc = nSalTotAPag * 0.01 RETORNO PROCEDIMIENTO Calcular Cuota del Infonavit. INICIO nInfonavit = nSalTotAPag * 0.05 RETORNO

Realiz: Ing. Domingo Olivares Barrios

Pg. 80

PROCEDIMIENTO Calcular ISPT. INICIO nIspt = nSalTotAPag * 0.02 RETORNO PROCEDIMIENTO Calcular SAR. INICIO nSar = nSalTotAPag * 0.03 RETORNO PROCEDIMIENTO Calcular el Bono por antigedad. INICIO S nAntig >= 5 entonces nBono = nSalTotAPag * 0.05 sino nBono = 0 fin s RETORNO NIVEL 1 PROCEDIMIENTO Solicitar Datos del Empleado. INICIO Etiquetas de Solicitud de Datos. Captura de Datos. RETORNO PROCEDIMIENTO Calcular Salario Total a Pagar. INICIO nSalTotAPag = nDiasTrab * nSalDia RETORNO PROCEDIMIENTO Calcular Cuotas Por Pagar. INICIO Calcular Cuota del IMSS. Calcular Cuota de Apoyo a la Educacin. Calcular Cuota del Infonavit. Calcular ISPT. Calcular SAR. Calcular el Bono por antigedad. RETORNO Realiz: Ing. Domingo Olivares Barrios Pg. 81

PROCEDIMIENTO Calcular Total Neto a Pagar INICIO nTotNetoAPagar = nSalTotAPag + nBono RETORNO PROCEDIMIENTO Mostrar Resultados. INICIO Desplegar Resultados:; Desplegar IMSS:; nImss Desplegar ISPT:; nIspt Desplegar SAR:; nSar Desplegar Ap. Educ.:; nApEduc Desplegar Infonavit:; nInfonavit Desplegar BONO:; nBono Desplegar Sal. Total a Pagar:; nSalTotAPag Desplegar Tot. Neto a Pagar:; nTotNetoAPagar RETORNAR NIVEL 0 PROGRAMA Principal. (Clculo del sueldo total neto a pagar a un empleado, as como las cuotas por pagar).

INICIO Inicializar variables. Solicitar Datos del Empleado. Calcular Salario Total a Pagar. Calcular Cuotas por pagar. Calcular el Total Neto a Pagar. Mostrar Resultados. FIN 6. Agrupar los mdulos de acuerdo a cada rama del diagrama en el rbol, codificarlos e integrarlos en un solo programa, o bien, a travs de encadenamientos.

Realiz: Ing. Domingo Olivares Barrios

Pg. 82

Lenguaje Basic.
10 REM Programa EJEMGBAS.BAS 20 REM Mtodo de Diseo Modular. 30 '************************************************************************** 40 'Programa Principal. NIVEL 0. 50 '************************************************************************** 60 CLS 'Borra la pantalla. 70 'Inicializar variables. 80 CNOMBRE$ = "": CPUESTO$ = "": NANTIG = 0: NSALDIA = 0: NDIASTRAB = 0 90 NSALTOTAPAG = 0: NIMSS = 0: NAPEDUC = 0: NINFONAVIT = 0: NSAR = 0 100 NISPT = 0: NBONO = 0: NTOTNETOAPAGAR = 0 110 GOSUB 230 'Llamada a la subrutina: Solicitar Datos del Empleado. 120 GOSUB 290 'Llamada a la subrutina: Calcular Salario Total a Pagar. 130 GOSUB 340 'Llamada a la subrutina: Calcular Cuotas Por Pagar. 140 GOSUB 440 'Llamada a la subrutina: Calcular el Total Neto a Pagar. 150 GOSUB 490 'Llamada a la subrutina: Mostrar Resultados. 160 END 'FIN DEL PROGRAMA PRINCIPAL. 170 ' 180 ' 190 ' 200 '************************************************************************** 210 'Procedimientos de NIVEL 1. 220 '************************************************************************** 230 'SUBRUTINA: Solicitar Datos del Empleado. 240 ' 250 GOSUB 680 'Llamada a la subrutina: Desplegar Mensajes de Solicitud de Datos. 260 GOSUB 790 'Llamada a la subrutina: Captura de Datos. 270 RETURN 280 '************************************************************************** 290 'SUBRUTINA: Calcular Salario Total a Pagar. 300 ' 310 NSALTOTAPAG = NDIASTRAB * NSALDIA 320 RETURN 330 '************************************************************************** 340 'SUBRUTINA: Calcular Cuotas Por Pagar. 350 ' 360 GOSUB 880 'Llamada a la subrutina: Calcular Cuota del IMSS. 370 GOSUB 930 'Llamada a la subrutina: Calcular Cuota de Apoyo a la Educacin. 380 GOSUB 980 'Llamada a la subrutina: Calcular Cuota del Infonavit. 390 GOSUB 1030 'Llamada a la subrutina: Calcular ISPT. 400 GOSUB 1080 'Llamada a la subrutina: Calcular SAR. 410 GOSUB 1130 'Llamada a la subrutina: Calcular el Bono por Antigedad. 420 RETURN 430 '************************************************************************** 440 'SUBRUTINA: Calcular Total Neto a Pagar. 450 ' 460 NTOTNETOAPAGAR = NSALTOTAPAG + NBONO 470 RETURN 480 '************************************************************************** 490 'SUBRUTINA: Mostrar Resultados. 500 ' 510 CLS 'Borra la pantalla. 520 LOCATE 3, 10: PRINT "Resultados:" 530 LOCATE 4, 10: PRINT "IMSS: "; NIMSS 540 LOCATE 5, 10: PRINT "ISPT: "; NISPT 550 LOCATE 6, 10: PRINT "SAR: "; NSAR 560 LOCATE 7, 10: PRINT "Apoyo a la Educacin: "; NAPEDUC 570 LOCATE 8, 10: PRINT "INFONAVIT: "; NINFONAVIT 580 LOCATE 9, 10: PRINT "Bono: "; NBONO 590 LOCATE 10, 10: PRINT "Salario Total a Pagar: "; NSALTOTAPAG

Realiz: Ing. Domingo Olivares Barrios

Pg. 83

600 LOCATE 11, 10: PRINT "Total Neto a Pagar: "; NTOTNETOAPAGAR 610 RETURN 620 ' 630 ' 640 ' 650 '************************************************************************** 660 'Procedimientos de NIVEL 2. 670 '************************************************************************** 680 'SUBRUTINA: Desplegar Mensajes de Solicitud de Datos. 690 ' 700 CLS 'Borra la pantalla. 710 LOCATE 3, 10: PRINT "Dame los siguientes datos:" 720 LOCATE 4, 10: PRINT "Nombre:"; 730 LOCATE 5, 10: PRINT "Puesto:"; 740 LOCATE 6, 10: PRINT "Antigedad:"; 750 LOCATE 7, 10: PRINT "Salario Diario:"; 760 LOCATE 8, 10: PRINT "Dias Trabajados:"; 770 RETURN 780 '************************************************************************** 790 'SUBRUTINA: Captura de Datos. 800 ' 810 LOCATE 4, 30: INPUT CNOMBRE$ 820 LOCATE 5, 30: INPUT CPUESTO$ 830 LOCATE 6, 30: INPUT NANTIG 840 LOCATE 7, 30: INPUT NSALDIA 850 LOCATE 8, 30: INPUT NDIASTRAB 860 RETURN 870 '************************************************************************** 880 'SUBRUTINA: Calcular Cuota del IMSS. 890 ' 900 NIMSS = NSALTOTAPAG * .03 910 RETURN 920 '************************************************************************** 930 'SUBRUTINA: Calcular Cuota de Apoyo a la Educacin. 940 ' 950 NAPEDUC = NSALTOTAPAG * .01 960 RETURN 970 '************************************************************************** 980 'SUBRUTINA: Calcular Cuota de Infonavit. 990 ' 1000 NINFONAVIT = NSALTOTAPAG * .05 1010 RETURN 1020 '************************************************************************** 1030 'SUBRUTINA: Calcular ISPT. 1040 ' 1050 NISPT = NSALTOTAPAG * .02 1060 RETURN 1070 '************************************************************************** 1080 'SUBRUTINA: Calcular SAR. 1090 ' 1100 NSAR = NSALTOTAPAG * .03 1110 RETURN 1120 '************************************************************************** 1130 'SUBRUTINA: Calcular el Bono por Antigedad. 1140 ' 1150 IF NANTIG >= 5 THEN NBONO = NSALTOTAPAG * .05 ELSE NBONO = 0 1160 RETURN 1170 '************************************************************************** 1180 'FIN DEL CODIGO DEL PROGRAMA.

Lenguaje Quick Basic.


REM Programa EJEMQBAS.BAS

Realiz: Ing. Domingo Olivares Barrios

Pg. 84

REM Mtodo de Diseo Modular. 'Declaracin de PROCEDIMIENTOS (Mdulos). 'Mdulos de NIVEL 2. DECLARE SUB DECLARE SUB DECLARE SUB DECLARE SUB SINGLE) DECLARE SUB DECLARE SUB DECLARE SUB DECLARE SUB nSalTotAPag DesplegarMensajesDeSolicitudDeDatos () CapturaDeDatos (nAntig, nSalDia, nDiasTrab) CalcularCuotaDelIMSS (nImss AS SINGLE, nSalTotAPag AS SINGLE) CalcularCuotaDeApoyoALaEducacion (nApEduc AS SINGLE, nSalTotAPag AS CalcularCuotaDelInfonavit (nInfonavit AS SINGLE, nSalTotAPag AS SINGLE) CalcularISPT (nIspt AS SINGLE, nSalTotAPag AS SINGLE) CalcularSAR (nSar AS SINGLE, nSalTotAPag AS SINGLE) CalcularElBonoPorAntiguedad (nAntig AS SINGLE, nBono AS SINGLE, AS SINGLE)

'Mdulos de NIVEL 1. 'El mdulo INICIALIZAR VARIABLES, por ser muy sencillo se codifica 'directamente en el PROGRAMA PRINCIPAL (NIVEL 0). DECLARE SUB SolicitarDatosDelEmpleado (nAntig, nSalDia, nDiasTrab) DECLARE SUB CalcularSalarioTotalAPagar (nSalTotAPag, nDiasTrab, nSalDia) DECLARE SUB CalcularCuotasPorPagar (nImss AS SINGLE, nApEduc AS SINGLE, nInfonavit AS SINGLE, nIspt AS SINGLE, nSar AS SINGLE, nAntig AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE) DECLARE SUB CalcularElTotalNetoAPagar (nTotNetoAPagar AS SINGLE, nSalTotAPag AS SINGLE, nBono AS SINGLE) DECLARE SUB MostrarResultados (nImss AS SINGLE, nIspt AS SINGLE, nSar AS SINGLE, nApEduc AS SINGLE, nInfonavit AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE, nTotNetoAPagar AS SINGLE) 'PROGRAMA PRINCIPAL. 'Inicio del programa. CLS 'Borra la pantalla. 'Inicializar variables. cNombre$ = "": cPuesto$ = "": nAntig = 0: nSalDia = 0: nDiasTrab = 0 nSalTotAPag = 0: nImss = 0: nApEduc = 0: nInfonavit = 0: nSar = 0: nIspt= 0 nBono = 0: nTotNetoAPagar = 0 'Llamadas a los procedimientos CALL SolicitarDatosDelEmpleado(nAntig, nSalDia, nDiasTrab) CALL CalcularSalarioTotalAPagar(nSalTotAPag, nSalDia, nDiasTrab) CALL CalcularCuotasPorPagar(nImss, nApEduc, nInfonavit, nIspt, nSar, nAntig, nBono, nSalTotAPag) CALL CalcularElTotalNetoAPagar(nTotNetoAPagar, nSalTotAPag, nBono) CALL MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar) END 'Fin del programa. 'Mdulo de NIVEL 2. SUB CalcularCuotaDeApoyoALaEducacion (nApEduc AS SINGLE, nSalTotAPag AS SINGLE) nApEduc = nSalTotAPag * .01 NIVEL 0.

Realiz: Ing. Domingo Olivares Barrios

Pg. 85

END SUB 'Mdulo de NIVEL 2. SUB CalcularCuotaDelIMSS (nImss AS SINGLE, nSalTotAPag AS SINGLE) nImss = nSalTotAPag * .03 END SUB 'Mdulo de NIVEL 2. SUB CalcularCuotaDelInfonavit (nInfonavit AS SINGLE, nSalTotAPag AS SINGLE) nInfonavit = nSalTotAPag * .05 END SUB 'Mdulo de NIVEL 1. SUB CalcularCuotasPorPagar (nImss AS SINGLE, nApEduc AS SINGLE, nInfonavit AS SINGLE, nIspt AS SINGLE, nSar AS SINGLE, nAntig AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE) CALL CALL CALL CALL CALL CALL END SUB 'Mdulo de NIVEL 2. SUB CalcularElBonoPorAntiguedad (nAntig AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE) IF nAntig >= 5 THEN nBono = nSalTotAPag * .05 ELSE nBono = 0 END IF END SUB 'Mdulo de NIVEL 1. SUB CalcularElTotalNetoAPagar (nTotNetoAPagar AS SINGLE, nSalTotAPag AS SINGLE, nBono AS SINGLE) nTotNetoAPagar = nSalTotAPag + nBono END SUB 'Mdulo de NIVEL 2. SUB CalcularISPT (nIspt AS SINGLE, nSalTotAPag AS SINGLE) nIspt = nSalTotAPag * .02 END SUB 'Mdulo de NIVEL 1. SUB CalcularSalarioTotalAPagar (nSalTotAPag AS SINGLE, nDiasTrab AS SINGLE, nSalDia AS SINGLE) nSalTotAPag = nDiasTrab * nSalDia CalcularCuotaDelIMSS(nImss, nSalTotAPag) CalcularCuotaDeApoyoALaEducacion(nApEduc, nSalTotAPag) CalcularCuotaDelInfonavit(nInfonavit, nSalTotAPag) CalcularISPT(nIspt, nSalTotAPag) CalcularSAR(nSar, nSalTotAPag) CalcularElBonoPorAntiguedad(nAntig, nBono, nSalTotAPag)

Realiz: Ing. Domingo Olivares Barrios

Pg. 86

END SUB 'Mdulo de NIVEL 2. SUB CalcularSAR (nSar AS SINGLE, nSalTotAPag AS SINGLE) nSar = nSalTotAPag * .03 END SUB 'Mdulo de NIVEL 2. SUB CapturaDeDatos (nAntig AS SINGLE, nSalDia AS SINGLE, nDiasTrab AS SINGLE) LOCATE LOCATE LOCATE LOCATE LOCATE END SUB 'Mdulo de NIVEL 2. SUB DesplegarMensajesDeSolicitudDeDatos CLS 'Borra la LOCATE 3, 10: LOCATE 4, 10: LOCATE 5, 10: LOCATE 6, 10: LOCATE 7, 10: LOCATE 8, 10: END SUB 'Mdulo de NIVEL 1. SUB MostrarResultados (nImss AS SINGLE, nIspt AS SINGLE, nSar AS SINGLE, nApEduc AS SINGLE, nInfonavit AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE, nTotNetoAPagar AS SINGLE) CLS 'Borra la pantalla. LOCATE 3, 10: PRINT "Resultados:" LOCATE 4, 10: PRINT "IMSS: "; nImss LOCATE 5, 10: PRINT "ISPT: "; nIspt LOCATE 6, 10: PRINT "SAR: "; nSar LOCATE 7, 10: PRINT "Apoyo a la Educacin: "; nApEduc LOCATE 8, 10: PRINT "INFONAVIT: "; nInfonavit LOCATE 9, 10: PRINT "Bono: "; nBono LOCATE 10, 10: PRINT "Salario Total a Pagar: "; nSalTotAPag LOCATE 11, 10: PRINT "Total Neto a Pagar: "; nTotNetoAPagar END SUB pantalla. PRINT "Dame los siguientes datos:" PRINT "Nombre:"; PRINT "Puesto:"; PRINT "Antigedad:"; PRINT "Salario Diario:"; PRINT "Das Trabajados:"; 4, 5, 6, 7, 8, 30: 30: 30: 30: 30: INPUT INPUT INPUT INPUT INPUT cNombre$ cPuesto$ nAntig nSalDia nDiasTrab

'Mdulo de NIVEL 1. SUB SolicitarDatosDelEmpleado (nAntig AS SINGLE, nSalDia AS SINGLE, nDiasTrab AS SINGLE) CALL DesplegarMensajesDeSolicitudDeDatos CALL CapturaDeDatos(nAntig, nSalDia, nDiasTrab) END SUB

Realiz: Ing. Domingo Olivares Barrios

Pg. 87

Fin del cdigo del programa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 88

Lenguaje Pascal.
PROGRAM Ejemplo; (* Programa EJEMPASC.PAS *) (* Mtodo de Diseo Modular. *) (* Especificacin del dispositivo o unidad de salida *) USES CRT; (* Declarando variables. *) VAR nAntig, nSalDia, nDiasTrab, nSalTotAPag, nImss, nApEduc, nInfonavit, nSar, nIspt, nBono, nTotNetoAPagar : REAL; (* Mdulo de NIVEL 2 *) PROCEDURE DesplegarMensajesDeSolicitudDeDatos; BEGIN CLRSCR; (* Borra la pantalla *) GOTOXY(10,3); GOTOXY(10,4); GOTOXY(10,5); GOTOXY(10,6); GOTOXY(10,7); GOTOXY(10,8); END; (* Mdulo de NIVEL 2 *) PROCEDURE CapturaDeDatos(VAR nAntig, nSalDia, nDiasTrab: REAL); VAR cNombre cPuesto BEGIN GOTOXY(30,4); GOTOXY(30,5); GOTOXY(30,6); GOTOXY(30,7); GOTOXY(30,8); END; (* Mdulo de NIVEL 2 *) READLN(cNombre); READLN(cPuesto); READLN(nAntig); READLN(nSalDia); READLN(nDiasTrab); : STRING[10]; : STRING[10]; WRITELN('Dame los siguientes datos:'); WRITE('Nombre: '); WRITE('Puesto: '); WRITE('Antigedad: '); WRITE('Salario Diario: '); WRITE('Das Trabajados: ');

Realiz: Ing. Domingo Olivares Barrios

Pg. 89

PROCEDURE CalcularCuotaDelIMSS(VAR nImss: REAL; nSalTotAPag: REAL); BEGIN nImss := nSalTotAPag * 0.03; END; (* Mdulo de NIVEL 2 *) PROCEDURE CalcularCuotaDeApoyoALaEducacion(VAR nApEduc: REAL; nSalTotAPag: REAL); BEGIN nApEduc := nSalTotAPag * 0.01; END; (* Mdulo de NIVEL 2 *) PROCEDURE CalcularCuotaDelInfonavit(VAR nInfonavit: REAL; nSalTotAPag: REAL); BEGIN nInfonavit := nSalTotAPag * 0.05; END; (* Mdulo de NIVEL 2 *) PROCEDURE CalcularISPT(VAR nIspt: REAL; nSalTotAPag: REAL); BEGIN nIspt := nSalTotAPag * 0.02; END; (* Mdulo de NIVEL 2 *) PROCEDURE CalcularSAR(VAR nSar: REAL; nSalTotAPag: REAL); BEGIN nSar := nSalTotAPag * 0.03; END; (* Mdulo de NIVEL 2 *) PROCEDURE CalcularElBonoPorAntiguedad(VAR nBono: REAL; nAntig, nSalTotAPag: REAL); BEGIN IF nAntig >= 5 THEN nBono := nSalTotAPag * 0.05 ELSE nBono = 0; END; (* Mdulo de NIVEL 1 *) PROCEDURE SolicitarDatosDelEmpleado(VAR nAntig, SalDia, DiasTrab: REAL);

Realiz: Ing. Domingo Olivares Barrios

Pg. 90

BEGIN DesplegarMensajesDeSolicitudDeDatos; CapturaDeDatos(nAntig, nSalDia, nDiasTrab); END; (* Mdulo de NIVEL 1 *) PROCEDURE CalcularSalarioTotalAPagar(VAR nSalTotAPag: REAL; nDiasTrab, nSalDia: REAL); BEGIN nSalTotAPag := nDiasTrab * nSalDia; END; (* Mdulo de NIVEL 1 *) PROCEDURE CalcularCuotasPorPagar(VAR nImss, nApEduc, nInfonavit, nIspt, nSar, nBono: REAL; nSalTotAPag, nAntig: REAL); BEGIN CalcularCuotaDelIMSS(nImss, nSalTotAPag); CalcularCuotaDeApoyoALaEducacion(nApEduc, nSalTotAPag); CalcularCuotaDelInfonavit(nInfonavit, nSalTotAPag); CalcularISPT(nIspt, nSalTotAPag); CalcularSAR(nSar, nSalTotAPag); CalcularElBonoPorAntiguedad(nBono, nAntig, nSalTotAPag); END; (* Mdulo de NIVEL 1 *) PROCEDURE CalcularElTotalNetoAPagar(VAR nTotNetoAPagar: REAL; nSalTotAPag, nBono: REAL); BEGIN nTotNetoAPagar := nSalTotAPag + nBono; END; (* Mdulo de NIVEL 1 *) PROCEDURE MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar: REAL); BEGIN CLRSCR; GOTOXY(10,3);WRITELN('Resultados:'); GOTOXY(10,4);WRITELN('IMSS: ', nImss:6:2); GOTOXY(10,5);WRITELN('ISPT: ', nIspt:6:2); GOTOXY(10,6);WRITELN('SAR: ', nSar:6:2); GOTOXY(10,7);WRITELN('Apoyo a la Educacin: ', nApEduc:6:2); GOTOXY(10,8);WRITELN('INFONAVIT: ', nInfonavit:6:2); GOTOXY(10,9);WRITELN('Bono: ', nBono:6:2); GOTOXY(10,10);WRITELN('Salario Total a Pagar: ', nSalTotAPag:6:2); GOTOXY(10,11);WRITELN('Total Neto a Pagar: ', nTotNetoAPagar:6:2); END;

Realiz: Ing. Domingo Olivares Barrios

Pg. 91

(* INICIA PROGRAMA PRINCIPAL NIVEL 0 *) BEGIN (* Inicio *) (* Inicializar nAntig nSalDia nDiasTrab nSalTotAPag nImss nApEduc nInfonavit nSar nIspt nBono nTotNetoAPagar Variables *) := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0;

SolicitarDatosDelEmpleado(nAntig, nSalDia, nDiasTrab); CalcularSalarioTotalAPagar(nSalTotAPag, nDiasTrab, nSalDia); CalcularCuotasPorPagar(nImss, nApEduc,nInfonavit, nIspt, nSar, nBono, nSalTotAPag, nAntig); CalcularElTotalNetoAPagar(nTotNetoAPagar, nSalTotAPag, nBono); MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar); END. (* FIN DEL PROGRAMA *)

Realiz: Ing. Domingo Olivares Barrios

Pg. 92

Lenguaje Clipper. * Programa EJEMCLIP.PRG * Mtodo de Diseo Modular.


* PROGRAMA PRINCIPAL. NIVEL 0. Ejemplo() FUNCTION Ejemplo() /* Declarando variables */ LOCAL nAntig, nSalDia, nDiasTrab, nSalTotAPag, nImss, nApEduc,; nInfonavit, nSar, nIspt, nBono, nTotNetoAPagar /* Inicializando variables */ nAntig := 0 nSalDia := 0 nDiasTrab := 0 nSalTotAPag := 0 nImss := 0 nApEduc := 0 nInfonavit := 0 nSar := 0 nIspt := 0 nBono := 0 nTotNetoAPagar := 0 CLS //Borra la pantalla. SolicitarDatosDelEmpleado(@nAntig, @nSalDia, @nDiasTrab) CalcularSalarioTotalAPagar(@nSalTotAPag, nDiasTrab, nSalDia) CalcularCuotasPorPagar(@nImss, @nApEduc, @nInfonavit, @nIspt, @nSar,; @nBono, nSalTotAPag, nAntig) CalcularElTotalNetoAPagar(@nTotNetoAPagar, nSalTotAPag, nBono) MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono,; nSalTotAPag, nTotNetoAPagar) RETURN * Mdulos de NIVEL 1. FUNCTION SolicitarDatosDelEmpleado(nAntig, nSalDia, nDiasTrab) DesplegarMensajesDeSolicitudDeDatos() CapturaDeDatos(@nAntig, @nSalDia, @nDiasTrab) RETURN FUNCTION CalcularSalarioTotalAPagar(nSalTotAPag, nDiasTrab, nSalDia) nSalTotAPag := nDiasTrab * nSalDia RETURN FUNCTION CalcularCuotasPorPagar(nImss, nApEduc, nInfonavit, nIspt, nSar,; nBono, nSalTotAPag, nAntig) CuotaDelIMSS(@nImss, nSalTotAPag) CuotaDeApoyoALaEducacion(@nApEduc, nSalTotAPag) CuotaDelInfonavit(@nInfonavit, nSalTotAPag)

Realiz: Ing. Domingo Olivares Barrios

Pg. 93

CuotaISPT(@nIspt, nSalTotAPag) CuotaSAR(@nSar, nSalTotAPag) CuotaBonoPorAntiguedad(@nBono, nAntig, nSalTotAPag) RETURN FUNCTION CalcularElTotalNetoAPagar(nTotNetoAPagar, nSalTotAPag, nBono) nTotNetoAPagar := nSalTotAPag + nBono RETURN FUNCTION MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono,; nSalTotAPag, nTotNetoAPagar) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ RETURN * Mdulos de NIVEL 2. FUNCTION DesplegarMensajesDeSolicitudDeDatos; @ @ @ @ @ @ RETURN FUNCTION CapturaDeDatos(nAntig, nSalDia, nDiasTrab); LOCAL cNombre := ' @ 2,30 @ 3,30 @ 4,30 @ 5,30 @ 6,30 READ RETURN FUNCTION CuotaDelIMSS(nImss, nSalTotAPag) GET GET GET GET GET ', cPuesto := ' ' 1,10 2,10 3,10 4,10 5,10 6,10 SAY SAY SAY SAY SAY SAY "Dame los siguientes datos:" "Nombre:" "Puesto:" "Antigedad:" "Salario Diario:" "Das Trabajados:" 8,10 SAY "Resultados:" 9,10 SAY "IMSS: " 9,35 SAY nImss 10,10 SAY "ISPT: " 10,35 SAY nIspt 11,10 SAY "SAR: " 11,35 SAY nSar 12,10 SAY "Apoyo a la Educacin: " 12,35 SAY nApEduc 13,10 SAY "INFONAVIT: " 13,35 SAY nInfonavit 14,10 SAY "Bono: " 14,35 SAY nBono 15,10 SAY "Salario Total a Pagar: " 15,35 SAY nSalTotAPag 16,10 SAY "Total Neto a Pagar: " 16,35 SAY nTotNetoAPagar

cNombre cPuesto nAntig PICT '9999999.99' nSalDia PICT '9999999.99' nDiasTrab PICT '9999999.99'

Realiz: Ing. Domingo Olivares Barrios

Pg. 94

nImss := nSalTotAPag * 0.03 RETURN FUNCTION CuotaDeApoyoALaEducacion(nApEduc, nSalTotAPag) nApEduc := nSalTotAPag * 0.01 RETURN FUNCTION CuotaDelInfonavit(nInfonavit, nSalTotAPag) nInfonavit := nSalTotAPag * 0.05 RETURN FUNCTION CuotaISPT(nIspt, nSalTotAPag) nIspt := nSalTotAPag * 0.02 RETURN FUNCTION CuotaSAR(nSar, nSalTotAPag) nSar := nSalTotAPag * 0.03 RETURN FUNCTION CuotaBonoPorAntiguedad(nBono, nAntig, nSalTotAPag) IF nAntig >= 5 nBono := nSalTotAPag * 0.05 ELSE nBono := 0 END IF RETURN

* Fin del cdigo del programa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 95

Lenguaje C++.
/* Programa EJEMMC.C */ /* Mtodo de Diseo Modular. */ #include <stdio.h> /* Mdulos de NIVEL 2 */ /* Declaracin de funciones */ void void void void void void void void DesplegarMensajesDeSolicitudDeDatos(void); CapturaDeDatos(float *, float *, float *); CuotaDelIMSS(float *, float); CuotaDeApoyoALaEducacion(float *, float); CuotaDelInfonavit(float *, float); CuotaISPT(float *, float); CuotaSAR(float *, float); CuotaBonoPorAntiguedad(float *, float, float);

/* Mdulos de NIVEL 1 */ /* Declaracin de funciones */ void SolicitarDatosDelEmpleado(float *, float *, float *); void CalcularSalarioTotalAPagar(float *, float, float); void CalcularCuotasPorPagar(float *, float *, float *, float *, float *, float *, float, float); void CalcularElTotalNetoAPagar(float *, float, float); void MostrarResultados(float, float, float, float, float, float, float, float); /* Programa Principal. NIVEL 0 */ void main () /* Inicio del programa principal */ { /* Declaracin e inicializacin de variables */ float nAntig = 0; float nSalDia = 0; float nDiasTrab = 0; float nSalTotAPag = 0; float nImss = 0; float nApEduc = 0; float nInfonavit = 0; float nIspt = 0; float nSar = 0; float nBono = 0; float nTotNetoAPagar = 0; clrscr(); /* Borra la pantalla */ SolicitarDatosDelEmpleado(&nAntig, &nSalDia, &nDiasTrab); CalcularSalarioTotalAPagar(&nSalTotAPag, nDiasTrab, nSalDia); CalcularCuotasPorPagar(&nImss, &nApEduc, &nInfonavit, &nIspt, &nSar, &nBono, nSalTotAPag, nAntig); CalcularElTotalNetoAPagar(&nTotNetoAPagar, nSalTotAPag, nBono); MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar); } /* Mdulos de NIVEL 2 */ void DesplegarMensajesDeSolicitudDeDatos(void) { gotoxy(10,1); printf("Dame los siguientes datos:");

Realiz: Ing. Domingo Olivares Barrios

Pg. 96

gotoxy(10,2); gotoxy(10,3); gotoxy(10,4); gotoxy(10,5); gotoxy(10,6); }

printf("Nombre:"); printf("Puesto:"); printf("Antigedad:"); printf("Salario Diario:"); printf("Das Trabajados:");

void CapturaDeDatos(float *nAnt, float *nSal, float *nDias) { /* Declaracin de variables locales */ char cNombre[10]; char cPuesto[10]; float nA, nS, nD; /* Variables auxiliares para el paso de parmetros */ gotoxy(30,2); gotoxy(30,3); gotoxy(30,4); gotoxy(30,5); gotoxy(30,6); scanf("%s",&cNombre); scanf("%s",&cPuesto); scanf("%f",&nA); scanf("%f",&nS); scanf("%f",&nD);

/* Asignacin de valores a las variables que son parmetro por referencia o variable */ *nAnt = nA; *nSal = nS; *nDias = nD; } void CuotaDelIMSS(float *nIm, float nSalTotAPag) { *nIm = nSalTotAPag * 0.03; } void CuotaDeApoyoALaEducacion(float *nApEd, float nSalTotAPag) { *nApEd = nSalTotAPag * 0.01; } void CuotaDelInfonavit(float *nInfo, float nSalTotAPag) { *nInfo = nSalTotAPag * 0.05; } void CuotaISPT(float *nIs, float nSalTotAPag) { *nIs = nSalTotAPag * 0.02; } void CuotaSAR(float *nSa, float nSalTotAPag) { *nSa = nSalTotAPag * 0.03; } void CuotaBonoPorAntiguedad(float *nBon, float nAntig, float nSalTotAPag) { if(nAntig >= 5)

Realiz: Ing. Domingo Olivares Barrios

Pg. 97

*nBon = nSalTotAPag * 0.05; else *nBon = 0; } /* Mdulos de Nivel 1 */ void SolicitarDatosDelEmpleado(float *nAntig, float *nSalDia, float *nDiasTrab) { /* Declaracin de variables auxiliares para el paso de parmetros */ float nAnt,nSal,nDias; DesplegarMensajesDeSolicitudDeDatos(); CapturaDeDatos(&nAnt, &nSal, &nDias); /* Asignacin de valores a las variables que son par metro por referencia o variable */ *nAntig = nAnt; *nSalDia = nSal; *nDiasTrab = nDias; } void CalcularSalarioTotalAPagar(float *nSalTotAPag, float nDiasTrab, float nSalDia) { *nSalTotAPag = nDiasTrab * nSalDia; } void CalcularCuotasPorPagar(float *nImss, float *nApEduc, float *nInfonavit, float *nIspt, float *nSar, float *nBono, float nSalTotAPag, float nAntig) { /* Declaracin de variables auxiliares para el paso de parmetros */ float nIm, nApEd, nInfo, nIs, nSa, nBon; CuotaDelIMSS(&nIm, nSalTotAPag); CuotaDeApoyoALaEducacion(&nApEd, nSalTotAPag); CuotaDelInfonavit(&nInfo, nSalTotAPag); CuotaISPT(&nIs, nSalTotAPag); CuotaSAR(&nSa, nSalTotAPag); CuotaBonoPorAntiguedad(&nBon, nAntig, nSalTotAPag); /* Asignacin de valores a las variables que son par metro por referencia o variable */ *nImss = nIm; *nApEduc = nApEd; *nInfonavit = nInfo; *nIspt = nIs; *nSar = nSa; *nBono = nBon; } void CalcularElTotalNetoAPagar(float *nTotNetoAPagar, float nSalTotAPag, float nBono) { *nTotNetoAPagar = nSalTotAPag + nBono; } void MostrarResultados(float nImss, float nIspt, float nSar, float nApEduc,

Realiz: Ing. Domingo Olivares Barrios

Pg. 98

float nInfonavit, float nBono, float nSalTotAPag, float nTotNetoAPagar) { gotoxy(10,10); gotoxy(10,11); gotoxy(10,12); gotoxy(10,13); gotoxy(10,14); gotoxy(10,15); gotoxy(10,16); } printf("Salario Total a Pagar: %f",nSalTotAPag); printf("Cuota IMSS: %f",nImss); printf("Cuota de Apoyo a la Educacin: %f",nApEduc); printf("Cuota del Infonavit: %f",nInfonavit); printf("Cuota del SAR: %f",nSar); printf("Bono por antigedad: %f",nBono); printf("Total Neto a Pagar: %f",nTotNetoAPagar);

/* Fin del cdigo del programa*/

Realiz: Ing. Domingo Olivares Barrios

Pg. 99

8. - Tcnica de diseo descendente.


Esta tcnica, como la anterior, es recomendable para el desarrollo de aplicaciones complejas y de gran tamao; una de sus caractersticas principales es que evita la repeticin de bloques de instrucciones, economizando con esto tiempo de programacin y captura de la codificacin. 8.1. - Fases de resolucin de problemas. TECNICA DE DISEO DESCENDENTE Esta tcnica, tambin conocida como "top-down", nos permite usar una aproximacin del " divide y vencers " (no debe confundirse con Diseo Modular, que es similar). En otras palabras, un problema se divide en sub-problemas que sean manejables. Despus de resolver todos los sub-problemas tendremos una solucin del problema global. Lo que hacemos en el diseo descendente es ir de lo abstracto (nuestra descripcin o especificacin del problema) a lo particular (nuestro cdigo en lenguaje de programacin). Si la descripcin del problema es una descripcin en palabras vagamente establecida, entonces el primer paso es crear una descripcin funcional del problema. Es decir, una descripcin que establezca claramente lo que el programa ha de hacer. En muchos casos, esto significa un dialogo entre la persona que tiene el problema y el programador. Para resolver los problemas, comenzaremos subdividiendo el problema en un conjunto de sub-problemas. Luego, cada sub-problema se divide a su vez en sub-problemas. Este proceso contina hasta que no se puede dividir ms cada sub-problema. Estamos creando una estructura jerrquica, tambin conocida como estructura en rbol, de problemas y sub-problemas llamados mdulos funcionales. Los mdulos de un nivel pueden llamar a los mdulos del nivel inferior. Estos mdulos son los bloques bsicos nuestros programas. Dividiendo nuestro problema en sub-problemas, o segmentos, podemos resolver cada uno independientemente de los otros. Nuestro rbol de diseo contiene sucesivos niveles de refinamiento (ver figura). En la cabeza, o nivel 0, esta nuestra descripcin funcional del problema, los niveles inferiores son nuestros sucesivos refinamientos. Concretamente; las fases o pasos para la resolucin de problemas de esta tcnica son:  Analizar el problema.  Escribir el mdulo principal.  Escribir los mdulos restantes.  Re-ordenar y revisar lo que sea necesario. A continuacin se describen detalladamente los pasos anteriores: 1. Analizar el problema. Comprender el problema. Comprender lo que se da (ENTRADA) y lo que se pide (SALIDA). Especificar los formatos de ENTRADA / SALIDA. Pensar. Cmo se resolvera el problema a mano ? Establecer las estructuras de

Realiz: Ing. Domingo Olivares Barrios

Pg. 100

datos necesarias (s las hay). Desarrollar un algoritmo global o plan general de ataque. Listar las suposiciones (s las hay).

2. Escribir el mdulo principal. Utilizar el castellano o pseudo cdigo para establecer el problema en el mdulo principal. Usar nombres de mdulos para dividir el problema en reas funcionales. Si ste mdulo es demasiado largo (mas de 10 o 15 sentencias), esta en un nivel demasiado bajo de detalle. Introducir en este punto cualquier estructura de control que se necesite (tal como iteracin o seleccin). Revisar la lgica, s se necesita. Posponer los detalles a niveles inferiores. El mdulo principal puede cambiar en futuros refinamientos. No preocuparse si no se sabe como resolver un mdulo que no este escrito en este momento. Suponga que tiene un "amigo inteligente" que conoce la respuesta y pospngala hasta que se hagan mas refinamientos. Todo lo que tiene que hacer en el mdulo principal es dar los nombres de los mdulos del nivel inferior que suministren ciertas funciones. Utilizar nombres con significado para los mdulos.

3. Escribir los mdulos restantes. No hay un nmero fijo de niveles. Los mdulos de un nivel pueden especificar mas mdulos del nivel inferior. Cada mdulo debe estar completo, aunque los mdulos que l refiere estn sin escribir. Hacer sucesivos refinamientos en cada mdulo hasta que cada sentencia pueda traducirse directamente en una sentencia en lenguaje de programacin.

4. Re-ordenar y revisar lo que sea necesario. Planificar un cambio. No preocuparse por comenzar de nuevo. Pueden ser necesarios varios intentos y refinamientos. Volver atrs en las decisiones de diseo inapropiadas. Tratar de mantener la claridad. Expresarse simple y directamente. PERFIL DEL DISEO DESCENDENTE DESCRIPCION DE LA ENTRADA. DESCRIPCION DE LA SALIDA. ESTRUCTURAS DE DATOS. SUPOSICIONES (S LAS HAY) MDULO PRINCIPAL. MDULOS RESTANTES POR NIVELES.

Realiz: Ing. Domingo Olivares Barrios

Pg. 101

El producto final del diseo es el programa. El programa debe reflejar la estructura del diseo descendente realizado. El mdulo principal debe ser el programa principal. 8.2. - Resolucin de problemas aplicando la Tcnica de diseo descendente. - Disear un programa que solicite los siguientes datos de un empleado: Ficha, nombre, puesto, antigedad, sueldo diario, das trabajados; que calcule y muestre el sueldo total neto a pagar, as como las cuotas por pagar por el patrn por sus prestaciones sobre su sueldo total bruto: un 3 % del Seguro Social, 1 % de Apoyo a la Educacin, 5 % de Infonavit, 2 % de I.S.P.T. (Impuesto Sobre Productos del Trabajo; y 3 % del SAR (Sistema de Ahorro para el Retiro. S el empleado tiene 5 aos o ms de antigedad, se le dar un bono del 5 % sobre su sueldo total bruto. 1. Analizar el problema. El programa deber pedir los datos del empleado y posteriormente sobre la base de stos, deber calcular las cuotas por pagar por el patrn, as como el bono por antigedad, en caso de que tenga 5 aos o ms de antigedad; todo con base en su sueldo total bruto. DESCRIPCIN DE LA ENTRADA. Los datos de entrada son: DATO Nombre Puesto Antigedad Salario Diario Das Trabajados TIPO Alfanumrico (Carcter) Alfanumrico (Carcter) Numrico Numrico Numrico

DESCRIPCIN DE LA SALIDA. Los datos de salida son: DATO Cuota del IMSS Cuota del ISPT Cuota del SAR Cuota de Apoyo a la Educacin Cuota del Infonavit Bono por antigedad Salario Total a Pagar Total Neto a Pagar TIPO Numrico Numrico Numrico Numrico Numrico Numrico Numrico Numrico

Realiz: Ing. Domingo Olivares Barrios

Pg. 102

ESTRUCTURAS DE DATOS. VARIABLE Nombre Puesto Antigedad Sueldo Diario Das trabajados Cuota del IMSS Cuota del ISPT Cuota del SAR Cuota de Apoyo a la Educacin Cuota del Infonavit Bono por antigedad Salario Total a Pagar Total Neto a Pagar IDENTIFICADOR (NOMBRE DE VARIABLE) cNombre cPuesto nAntig nSalDia nDiasTrab nImss nIspt nSar nApEduc nInfonavit nBono nSalTotAPag nTotNetoAPagar TIPO Alfanumrico (Carcter) Alfanumrico (Carcter) Numrico Numrico Numrico Numrico Numrico Numrico Numrico Numrico Numrico Numrico Numrico

SUPOSICIONES (SI LAS HAY). En este caso supondremos que no habr ningn error en la captura, y por lo tanto no habr das trabajados, antigedades, y sueldos diarios; negativos. Ni tampoco habr otros tipos de errores por parte del usuario. NOTA: En el primer caso es obvio que no debe haber valores negativos, sin embargo, cuando se hace un programa ms profesional, se deben considerar todos los valores que podra tomar una variable, pues nunca sabremos que es lo que puede pensar y/o hacer el usuario con nuestro programa. Para el segundo caso, en el que supondremos que no habr otro tipo de error por parte del usuario, durante la captura; es para evitar confundirlo y adems, el crearnos una rutina de procesamiento de errores; que en la vida real es conveniente desarrollar para procesar todos aquellos errores que podamos imaginarnos que se podran generar en nuestros programas, e inclusive aquellos errores impredecibles, para darles una salida sencilla y elegante a nuestros programas. 2. Escribir el mdulo principal. NIVEL 0 Mdulo Principal. Calcular el Salario Total a Pagar, el Total Neto a Pagar y las cuotas por pagar.

Realiz: Ing. Domingo Olivares Barrios

Pg. 103

3. Escribir los mdulos restantes. NIVEL 1 a. b. c. d. e. Inicializar variables. Solicitar datos del empleado. Calcular el salario total a pagar. Calcular las cuotas por pagar. Mostrar resultados. NIVEL 2 a.1. cNombre = a.2. cPuesto = a.3. nAntig = 0 a.4. nSalDia = 0 a.5. nDiasTrab = 0 a.6. nImss = 0 a.7. nIspt = 0 a.8. nSar = 0 a.9. nApEduc = 0 a.10. nInfonavit = 0 a.11. nBono = 0 a.12. nSalTotAPag = 0 a.13. nTotNetoAPagar = 0 b.1. Etiquetas de Solicitud de datos. b.2. Captura de datos. c.1. Salario Total a Pagar = Salario Diario * Das Trabajados d.1. Cuota del Imss = Salario Total a Pagar * 0.03 d.2. Cuota de Apoyo a la Educacin = Salario Total a Pagar * 0.01 d.3. Cuota del Infonavit = Salario Total a Pagar * 0.05 d.4. Cuota del ISPT = Salario Total a Pagar * 0.02 d.5. Cuota del SAR = Salario Total a Pagar * 0.03 d.6. S Antigedad >= 5 entonces Bono por Antigedad = Salario Total a Pagar * 0.05 e.1. Desplegar Resultados:; e.2. Desplegar IMSS:; nImss e.3. Desplegar ISPT:; nIspt e.4. Desplegar SAR:; nSar e.5. Desplegar Ap. Educ.:; nApEduc e.6. Desplegar Infonavit:; nInfonavit e.7. Desplegar BONO:; nBono e.8. Desplegar Sal. Total a Pagar:; nSalTotAPag Realiz: Ing. Domingo Olivares Barrios Pg. 104

e.9. Desplegar Tot. Neto a Pagar:; nTotNetoAPagar NIVEL 3 a.1. cNombre = a.2. cPuesto = a.3. nAntig = 0 a.4. nSalDia = 0 a.5. nDiasTrab = 0 a.6. nImss = 0 a.7. nIspt = 0 a.8. nSar = 0 a.9. nApEduc = 0 a.10. nInfonavit = 0 a.11. nBono = 0 a.12. nSalTotAPag = 0 a.13. nTotNetoAPagar = 0 b.1.1. Desplegar "Dame los siguientes datos:" b.1.2. Desplegar "Nombre:" b.1.3. Desplegar "Puesto:" b.1.4. Desplegar "Antigedad:" b.1.5. Desplegar "Salario Diario:" b.1.6. Desplegar "Das Trabajados:" b.2.1. Introducir cNombre b.2.2. Introducir cPuesto b.2.3. Introducir nAntig b.2.4. Introducir nSalDia b.2.5. Introducir nDiasTrab c.1. Salario Total a Pagar = Salario Diario * Das Trabajados d.1. Cuota del Imss = Salario Total a Pagar * 0.03 d.2. Cuota de Apoyo a la Educacin = Salario Total a Pagar * 0.01 d.3. Cuota del Infonavit = Salario Total a Pagar * 0.05 d.4. Cuota del ISPT = Salario Total a Pagar * 0.02 d.5. Cuota del SAR = Salario Total a Pagar * 0.03 d.6. S Antigedad >= 5 entonces Bono por Antigedad = Salario Total a Pagar * 0.05 sino Bono = 0 e.1. Desplegar Resultados:; e.2. Desplegar IMSS:; nImss e.3. Desplegar ISPT:; nIspt e.4. Desplegar SAR:; nSar e.5. Desplegar Ap. Educ.:; nApEduc e.6. Desplegar Infonavit:; nInfonavit Realiz: Ing. Domingo Olivares Barrios Pg. 105

e.7. Desplegar BONO:; nBono e.8. Desplegar Sal. Total a Pagar:; nSalTotAPag e.9. Desplegar Tot. Neto a Pagar:; nTotNetoAPagar 4. Reordenar y revisar lo que sea necesario. Como se puede observar, sta tcnica es similar a la de diseo modular. Sin embargo, aqu no es necesario crear el diagrama de rbol, y esto resulta ser optativo. Tambin es de notar que al final obtenemos el algoritmo totalmente detallado como en el caso de la tcnica de diseo elemental, pero con la diferencia de que cada segmento est plenamente identificado, y por lo tanto, si el algoritmo resulta ser demasiado extenso, podemos crear procedimientos, como en el diseo modular, lo cual acortara el cdigo del programa principal y lo hara mas legible. Y por supuesto, ya teniendo el algoritmo en el nivel ms bajo, lo nico que queda es codificarlo, aunque bien podamos haberlo hecho desde otros niveles superiores, pero como lo que se pretende es ensear a programar y no a codificar en algn lenguaje especifico, por tal razn se muestra simplemente el algoritmo hasta su mnimo detalle. Queda para el programador principiante, a su gusto, cuando llegue a niveles muy bajos, el codificar directamente cuando ya domine un lenguaje de programacin. Puesto que el cdigo, para este ejemplo resulta ser muy pequeo, bien podramos obtener un cdigo como el del diseo elemental, o como el del diseo modular; y por qu no?, una mezcla de ambos como se muestra ms adelante; todo depender de los gustos y estilos de cada programador. Lenguaje Basic.
10 REM Programa EJEMDBAS.BAS 20 REM Mtodo de Diseo Descendente. 30 '************************************************************************** 40 'Programa Ejemplo. 50 '************************************************************************** 60 CLS 'Borra la pantalla. 70 ' 80 'Inicializar variables. 90 ' 100 CNOMBRE$ = "": CPUESTO$ = "": NANTIG = 0: NSALDIA = 0: NDIASTRAB = 0 110 NSALTOTAPAG = 0: NIMSS = 0: NAPEDUC = 0: NINFONAVIT = 0: NSAR = 0 120 NISPT = 0: NBONO = 0: NTOTNETOAPAGAR = 0 130 ' 140 GOSUB 390 'Llamada a la subrutina: Solicitar Datos del Empleado. 150 ' 160 'Calcular Salario Total a Pagar. 170 ' 180 NSALTOTAPAG = NDIASTRAB * NSALDIA 190 ' 200 'Calcular Cuotas Por Pagar. 210 ' 220 NIMSS = NSALTOTAPAG * .03 230 NAPEDUC = NSALTOTAPAG * .01 240 NINFONAVIT = NSALTOTAPAG * .05 250 NISPT = NSALTOTAPAG * .02 260 NSAR = NSALTOTAPAG * .03 270 IF NANTIG >= 5 THEN NBONO = NSALTOTAPAG * .05 280 '

Realiz: Ing. Domingo Olivares Barrios

Pg. 106

290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530 540 550 560 570 580 590 600 610 620 630 640 650 660 670 680 690 700 710 720 730 740 750 760 770 780 790 800 810

'Calcular el Total Neto a Pagar. ' NTOTNETOAPAGAR = NSALTOTAPAG + NBONO ' GOSUB 450 'Llamada a la subrutina: Mostrar Resultados. ' END 'FIN DEL PROGRAMA PRINCIPAL. ' ' '************************************************************************** 'SUBRUTINA: Solicitar Datos del Empleado. ' GOSUB 600 'Llamada a la subrutina: Desplegar Mensajes de Solicitud de Datos. GOSUB 710 'Llamada a la subrutina: Captura de Datos. RETURN '************************************************************************** 'SUBRUTINA: Mostrar Resultados. ' CLS 'Borra la pantalla. LOCATE 3, 10: PRINT "Resultados:" LOCATE 4, 10: PRINT "IMSS: "; NIMSS LOCATE 5, 10: PRINT "ISPT: "; NISPT LOCATE 6, 10: PRINT "SAR: "; NSAR LOCATE 7, 10: PRINT "Apoyo a la Educacin: "; NAPEDUC LOCATE 8, 10: PRINT "INFONAVIT: "; NINFONAVIT LOCATE 9, 10: PRINT "Bono: "; NBONO LOCATE 10, 10: PRINT "Salario Total a Pagar: "; NSALTOTAPAG LOCATE 11, 10: PRINT "Total Neto a Pagar: "; NTOTNETOAPAGAR RETURN ' '************************************************************************** 'SUBRUTINA: Desplegar Mensajes de Solicitud de Datos. ' CLS 'Borra la pantalla. LOCATE 3, 10: PRINT "Dame los siguientes datos:" LOCATE 4, 10: PRINT "Nombre:"; LOCATE 5, 10: PRINT "Puesto:"; LOCATE 6, 10: PRINT "Antigedad:"; LOCATE 7, 10: PRINT "Salario Diario:"; LOCATE 8, 10: PRINT "Dias Trabajados:"; RETURN '************************************************************************** 'SUBRUTINA: Captura de Datos. ' LOCATE 4, 30: INPUT CNOMBRE$ LOCATE 5, 30: INPUT CPUESTO$ LOCATE 6, 30: INPUT NANTIG LOCATE 7, 30: INPUT NSALDIA LOCATE 8, 30: INPUT NDIASTRAB RETURN '************************************************************************** 'FIN DEL CODIGO DEL PROGRAMA. '**************************************************************************

Realiz: Ing. Domingo Olivares Barrios

Pg. 107

Lenguaje Quick Basic.


REM Programa EJEDQBAS.BAS REM Mtodo de Diseo Descendente. 'Declaracin de PROCEDIMIENTOS. DECLARE SUB DesplegarMensajesDeSolicitudDeDatos () DECLARE SUB CapturaDeDatos (nAntig, nSalDia, nDiasTrab) DECLARE SUB SolicitarDatosDelEmpleado (nAntig, nSalDia, nDiasTrab) DECLARE SUB MostrarResultados (nImss AS SINGLE, nIspt AS SINGLE, nSar AS SINGLE, nApEduc AS SINGLE, nInfonavit AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE, nTotNetoAPagar AS SINGLE) 'PROGRAMA Ejemplo. 'Inicio del programa. CLS 'Borra la pantalla. 'Inicializar variables. cNombre$ = "": cPuesto$ = "": nAntig = 0: nSalDia = 0: nDiasTrab = 0 nSalTotAPag = 0: nImss = 0: nApEduc = 0: nInfonavit = 0: nSar = 0: nIspt= 0 nBono = 0: nTotNetoAPagar = 0 'Llamadas a los procedimientos CALL SolicitarDatosDelEmpleado(nAntig, nSalDia, nDiasTrab) 'Calcular Salario Total a Pagar nSalTotAPag = nDiasTrab * nSalDia 'Calcular Cuotas Por Pagar nImss = nSalTotAPag * .03 nApEduc = nSalTotAPag * .01 nInfonavit = nSalTotAPag * .05 nIspt = nSalTotAPag * .02 nSar = nSalTotAPag * .03 IF nAntig >= 5 THEN nBono = nSalTotAPag * .05 ELSE nBono = 0 END IF ' 'Calcular El Total Neto a Pagar ' nTotNetoAPagar = nSalTotAPag + nBono CALL MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar) END 'Fin del programa. SUB CapturaDeDatos (nAntig AS SINGLE, nSalDia AS SINGLE, nDiasTrab AS SINGLE) LOCATE LOCATE LOCATE LOCATE LOCATE 4, 5, 6, 7, 8, 30: 30: 30: 30: 30: INPUT INPUT INPUT INPUT INPUT cNombre$ cPuesto$ nAntig nSalDia nDiasTrab

Realiz: Ing. Domingo Olivares Barrios

Pg. 108

END SUB SUB DesplegarMensajesDeSolicitudDeDatos CLS 'Borra la LOCATE 3, 10: LOCATE 4, 10: LOCATE 5, 10: LOCATE 6, 10: LOCATE 7, 10: LOCATE 8, 10: END SUB SUB MostrarResultados (nImss AS SINGLE, nIspt AS SINGLE, nSar AS SINGLE, nApEduc AS SINGLE, nInfonavit AS SINGLE, nBono AS SINGLE, nSalTotAPag AS SINGLE, nTotNetoAPagar AS SINGLE) CLS 'Borra la pantalla. LOCATE 3, 10: PRINT "Resultados:" LOCATE 4, 10: PRINT "IMSS: "; nImss LOCATE 5, 10: PRINT "ISPT: "; nIspt LOCATE 6, 10: PRINT "SAR: "; nSar LOCATE 7, 10: PRINT "Apoyo a la Educacin: "; nApEduc LOCATE 8, 10: PRINT "INFONAVIT: "; nInfonavit LOCATE 9, 10: PRINT "Bono: "; nBono LOCATE 10, 10: PRINT "Salario Total a Pagar: "; nSalTotAPag LOCATE 11, 10: PRINT "Total Neto a Pagar: "; nTotNetoAPagar END SUB SUB SolicitarDatosDelEmpleado (nAntig AS SINGLE, nSalDia AS SINGLE, nDiasTrab AS SINGLE) CALL DesplegarMensajesDeSolicitudDeDatos CALL CapturaDeDatos(nAntig, nSalDia, nDiasTrab) END SUB pantalla. PRINT "Dame los siguientes datos:" PRINT "Nombre:"; PRINT "Puesto:"; PRINT "Antigedad:"; PRINT "Salario Diario:"; PRINT "Das Trabajados:";

Fin del cdigo del programa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 109

Lenguaje Pascal.
PROGRAM Ejemplo; (* Programa EJEDPASC.PAS *) (* Mtodo de Diseo Descendente. *) (* Especificacin del dispositivo o unidad de salida *) USES CRT; (* Declarando variables. *) VAR nAntig, nSalDia, nDiasTrab, nSalTotAPag, nImss, nApEduc, nInfonavit, nSar, nIspt, nBono, nTotNetoAPagar : REAL; PROCEDURE DesplegarMensajesDeSolicitudDeDatos; BEGIN CLRSCR; (* Borra la pantalla *) GOTOXY(10,3); GOTOXY(10,4); GOTOXY(10,5); GOTOXY(10,6); GOTOXY(10,7); GOTOXY(10,8); END; PROCEDURE CapturaDeDatos(VAR nAntig, nSalDia, nDiasTrab: REAL); VAR cNombre cPuesto BEGIN GOTOXY(30,4); GOTOXY(30,5); GOTOXY(30,6); GOTOXY(30,7); GOTOXY(30,8); END; PROCEDURE SolicitarDatosDelEmpleado(VAR nAntig, SalDia, DiasTrab: REAL); BEGIN DesplegarMensajesDeSolicitudDeDatos; CapturaDeDatos(nAntig, nSalDia, nDiasTrab); READLN(cNombre); READLN(cPuesto); READLN(nAntig); READLN(nSalDia); READLN(nDiasTrab); : STRING[10]; : STRING[10]; WRITELN('Dame los siguientes datos:'); WRITE('Nombre: '); WRITE('Puesto: '); WRITE('Antigedad: '); WRITE('Salario Diario: '); WRITE('Das Trabajados: ');

Realiz: Ing. Domingo Olivares Barrios

Pg. 110

END; PROCEDURE MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar: REAL); BEGIN CLRSCR; GOTOXY(10,3);WRITELN('Resultados:'); GOTOXY(10,4);WRITELN('IMSS: ', nImss:6:2); GOTOXY(10,5);WRITELN('ISPT: ', nIspt:6:2); GOTOXY(10,6);WRITELN('SAR: ', nSar:6:2); GOTOXY(10,7);WRITELN('Apoyo a la Educacin: ', nApEduc:6:2); GOTOXY(10,8);WRITELN('INFONAVIT: ', nInfonavit:6:2); GOTOXY(10,9);WRITELN('Bono: ', nBono:6:2); GOTOXY(10,10);WRITELN('Salario Total a Pagar: ', nSalTotAPag:6:2); GOTOXY(10,11);WRITELN('Total Neto a Pagar: ', nTotNetoAPagar:6:2); END; (* INICIA PROGRAMA PRINCIPAL Ejemplo *) BEGIN (* Inicio *) (* Inicializar nAntig nSalDia nDiasTrab nSalTotAPag nImss nApEduc nInfonavit nSar nIspt nBono nTotNetoAPagar Variables *) := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0; := 0;

SolicitarDatosDelEmpleado(nAntig, nSalDia, nDiasTrab); (* Calcular Salario Total a Pagar *) nSalTotAPag := nDiasTrab * nSalDia; (* Calcular Cuotas Por Pagar *) nImss := nSalTotAPag * 0.03; nApEduc := nSalTotAPag * 0.01; nInfonavit := nSalTotAPag * 0.05; nIspt := nSalTotAPag * 0.02; nSar := nSalTotAPag * 0.03; IF nAntig >= 5 THEN nBono := nSalTotAPag * 0.05 ELSE nBono := 0; (* Calcular El Total Neto a Pagar *) nTotNetoAPagar := nSalTotAPag + nBono; MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar); END. (* FIN DEL PROGRAMA *)

Lenguaje Clipper.

Realiz: Ing. Domingo Olivares Barrios

Pg. 111

* Programa EJEDCLIP.PRG * Mtodo de Diseo Descendente. * PROGRAMA PRINCIPAL. NIVEL 0. Ejemplo() FUNCTION Ejemplo() /* Declarando variables */ LOCAL nAntig, nSalDia, nDiasTrab, nSalTotAPag, nImss, nApEduc,; nInfonavit, nSar, nIspt, nBono, nTotNetoAPagar /* Inicializando variables */ nAntig := 0 nSalDia := 0 nDiasTrab := 0 nSalTotAPag := 0 nImss := 0 nApEduc := 0 nInfonavit := 0 nSar := 0 nIspt := 0 nBono := 0 nTotNetoAPagar := 0 CLS //Borra la pantalla. SolicitarDatosDelEmpleado(@nAntig, @nSalDia, @nDiasTrab) * Calcular Salario Total a Pagar nSalTotAPag := nDiasTrab * nSalDia * Calcular Cuotas Por Pagar nImss := nSalTotAPag * 0.03 nApEduc := nSalTotAPag * 0.01 nInfonavit := nSalTotAPag * 0.05 nIspt := nSalTotAPag * 0.02 nSar := nSalTotAPag * 0.03 IF nAntig >= 5 nBono := nSalTotAPag * 0.05 ELSE nBono := 0 END IF * Calcular El Total Neto a Pagar nTotNetoAPagar := nSalTotAPag + nBono MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono,; nSalTotAPag, nTotNetoAPagar) RETURN

FUNCTION SolicitarDatosDelEmpleado(nAntig, nSalDia, nDiasTrab) DesplegarMensajesDeSolicitudDeDatos() CapturaDeDatos(@nAntig, @nSalDia, @nDiasTrab)

Realiz: Ing. Domingo Olivares Barrios

Pg. 112

RETURN FUNCTION MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono,; nSalTotAPag, nTotNetoAPagar) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ RETURN FUNCTION DesplegarMensajesDeSolicitudDeDatos; @ @ @ @ @ @ RETURN FUNCTION CapturaDeDatos(nAntig, nSalDia, nDiasTrab); LOCAL cNombre := ' @ 2,30 @ 3,30 @ 4,30 @ 5,30 @ 6,30 READ RETURN * Fin del cdigo del programa. GET GET GET GET GET ', cPuesto := ' ' 1,10 2,10 3,10 4,10 5,10 6,10 SAY SAY SAY SAY SAY SAY "Dame los siguientes datos:" "Nombre:" "Puesto:" "Antigedad:" "Salario Diario:" "Das Trabajados:" 8,10 SAY "Resultados:" 9,10 SAY "IMSS: " 9,35 SAY nImss 10,10 SAY "ISPT: " 10,35 SAY nIspt 11,10 SAY "SAR: " 11,35 SAY nSar 12,10 SAY "Apoyo a la Educacin: " 12,35 SAY nApEduc 13,10 SAY "INFONAVIT: " 13,35 SAY nInfonavit 14,10 SAY "Bono: " 14,35 SAY nBono 15,10 SAY "Salario Total a Pagar: " 15,35 SAY nSalTotAPag 16,10 SAY "Total Neto a Pagar: " 16,35 SAY nTotNetoAPagar

cNombre cPuesto nAntig PICT '9999999.99' nSalDia PICT '9999999.99' nDiasTrab PICT '9999999.99'

Realiz: Ing. Domingo Olivares Barrios

Pg. 113

Lenguaje C++.
/* Programa EJEMDC.C */ /* Mtodo de Diseo Descendente. */ #include <stdio.h> /* Declaracin de funciones */ void DesplegarMensajesDeSolicitudDeDatos(void); void CapturaDeDatos(float *, float *, float *); void SolicitarDatosDelEmpleado(float *, float *, float *); void MostrarResultados(float, float, float, float, float, float, float, float); void main () /* Inicio del programa principal Ejemplo */ { /* Declaracin e inicializacin de variables */ float nAntig = 0; float nSalDia = 0; float nDiasTrab = 0; float nSalTotAPag = 0; float nImss = 0; float nApEduc = 0; float nInfonavit = 0; float nIspt = 0; float nSar = 0; float nBono = 0; float nTotNetoAPagar = 0; clrscr(); /* Borra la pantalla */ SolicitarDatosDelEmpleado(&nAntig, &nSalDia, &nDiasTrab); /* Calcular Salario Total a Pagar */ nSalTotAPag = nDiasTrab * nSalDia; /* Calcular Cuotas Por Pagar */ nImss = nSalTotAPag * 0.03; nApEduc = nSalTotAPag * 0.01; nInfonavit = nSalTotAPag * 0.05; nIspt = nSalTotAPag * 0.02; nSar = nSalTotAPag * 0.03; if(nAntig >= 5) nBono = nSalTotAPag * 0.05; else nBono = 0; /* Calcular El Total Neto a Pagar */ nTotNetoAPagar = nSalTotAPag + nBono; MostrarResultados(nImss, nIspt, nSar, nApEduc, nInfonavit, nBono, nSalTotAPag, nTotNetoAPagar); } /* Fin del programa principal */

Realiz: Ing. Domingo Olivares Barrios

Pg. 114

/* Inician las funciones */ void DesplegarMensajesDeSolicitudDeDatos(void) { gotoxy(10,1); gotoxy(10,2); gotoxy(10,3); gotoxy(10,4); gotoxy(10,5); gotoxy(10,6); } void CapturaDeDatos(float *nAnt, float *nSal, float *nDias) { /* Declaracin de variables locales */ char cNombre[10]; char cPuesto[10]; float nA, nS, nD; /* Variables auxiliares para el paso de parmetros */ gotoxy(30,2); gotoxy(30,3); gotoxy(30,4); gotoxy(30,5); gotoxy(30,6); scanf("%s",&cNombre); scanf("%s",&cPuesto); scanf("%f",&nA); scanf("%f",&nS); scanf("%f",&nD); printf("Dame los siguientes datos:"); printf("Nombre:"); printf("Puesto:"); printf("Antigedad:"); printf("Salario Diario:"); printf("Das Trabajados:");

/* Asignacin de valores a las variables que son par metro por referencia o variable */ *nAnt = nA; *nSal = nS; *nDias = nD; } void SolicitarDatosDelEmpleado(float *nAntig, float *nSalDia, float *nDiasTrab) { /* Declaracin de variables auxiliares para el paso de parmetros */ float nAnt,nSal,nDias; DesplegarMensajesDeSolicitudDeDatos(); CapturaDeDatos(&nAnt, &nSal, &nDias); /* Asignacin de valores a las variables que son par metro por referencia o variable */ *nAntig = nAnt; *nSalDia = nSal; *nDiasTrab = nDias; } void MostrarResultados(float nImss, float nIspt, float nSar, float nApEduc, float nInfonavit, float nBono, float nSalTotAPag, float nTotNetoAPagar) { gotoxy(10,10); gotoxy(10,11); gotoxy(10,12); gotoxy(10,13); gotoxy(10,14); gotoxy(10,15); gotoxy(10,16); printf("Salario Total a Pagar: %f",nSalTotAPag); printf("Cuota IMSS: %f",nImss); printf("Cuota de Apoyo a la Educacin: %f",nApEduc); printf("Cuota del Infonavit: %f",nInfonavit); printf("Cuota del SAR: %f",nSar); printf("Bono por antigedad: %f",nBono); printf("Total Neto a Pagar: %f",nTotNetoAPagar);

Realiz: Ing. Domingo Olivares Barrios

Pg. 115

/* Fin del cdigo del programa*/

Realiz: Ing. Domingo Olivares Barrios

Pg. 116

9. Introduccin a la programacin para gestin de archivos.


9.1. - Conceptos bsicos. En el mundo de la informtica existen muchas vertientes para la programacin, algunas son los programas para grficos, programas de paquete o paqueteras (p. e. Hojas de clculo, procesadores de texto, manejadores de bases de datos, etc.), programas utilitarios o utileras (antivirus, mantenimiento de discos, diagnostico de hardware, etc.), programas administrativos (contabilidad, inventarios, nminas, etc.) e inclusive sistemas operativos y traductores de lenguajes de programacin. Y, aunque existen en el mercado un sinnmero de programas desarrollados por infinidad de empresas de software; siempre es necesario que, para ciertos usuarios se desarrollen programas especificos de gestin de informacin, que manipulen dicha informacin con la ayuda de archivos de datos, equiparables y equivalentes a los archivos fsicos documentales, para la agilizacin de sus procesos administrativos. De ah que resulta imprescindible para todo programador, el conocimiento bsico de las operaciones elementales para la gestin de informacin almacenada en archivos. A continuacin se vern los conceptos bsicos. 9.1.1. - Archivo. Es un conjunto de informacin relacionada entre s. Normalmente, en informtica representamos un archivo como si fuera una tabla compuesta de columnas y filas. Tambin reciben el nombre de ficheros. Por ejemplo: Toda la informacin relacionada con estudiantes de una institucin educativa (Nombre, direccin, telfono, nivel o grado escolar, edad, calificaciones, etc.). 9.1.2. - Campo. Es un grupo de datos del mismo tipo, pertenecientes a un mismo archivo, y que se relacionan con sus respectivos elementos. Generalmente representamos los campos de un archivo como las columnas de una tabla. Por ejemplo: Los nombres de cada uno de los estudiantes de una institucin educativa. 9.1.3. - Registro. Son un conjunto de campos relacionados entre s, los cuales contienen informacin sobre un elemento particular.

Realiz: Ing. Domingo Olivares Barrios

Pg. 117

Comnmente se representan los registros de un archivo como filas de una tabla. Por ejemplo: El registro de inscripcin de un alumno, el cual contiene los siguientes campos: Nmero de control, nombre, grupo, grado o nivel escolar.

Representacin de un Archivo de Alumnos. Campo 1 Campo 2 Campo 3 Campo 4 Campo 5

Nombre del Campo

Nmero de Control 990701001 990602058 990503047 980402109

Nombre Francisco Fernndez Jimnez Julieta Campos Enrquez Armando Gutirrez Armas Edith Mijangos Lagos

Grupo 990701 990602 990503 980402

Turno Vespertino Matutino Matutino Vespertino

Grado 1 2 4 3

Registro

9.1.4. - Base de datos. Una base de datos es un conjunto de informacin. En sentido amplio, el trmino puede aplicarse a cualquier agregado de datos aunque ste no sea tratado de modo informtico. Por tanto, en dicho sentido amplio, son ejemplos de bases de datos nuestra agenda, la gua telefnica, un archivo (o fichero) con recetas de cocina, una biblioteca y, en general, cualquier cosa que podamos designar con el apelativo de conjunto de informacin. No obstante, cuando usamos el trmino base de datos desde una ptica informtica estamos dndole un significado algo ms restrictivo. Desde este nuevo punto de vista podemos definir una base de datos como un sistema de mantenimiento de registros basado en computadoras, es decir, un sistema cuyo propsito general es registrar y mantener informacin16. Como se ha visto anteriormente, los archivos son el recipiente informtico que contiene la informacin. Muchas veces se confunde el trmino base de datos con el trmino archivo (o fichero). Realmente son dos cosas distintas. En general, una base de datos es una coleccin de archivos, con alguna relacin interna entre ellos. Bien es cierto que pueden existir bases de datos que estn compuestas de un nico archivo, pero esto no es lo ms frecuente y, adems, en lo que a nuestra definicin respecta, esto no modificara las cosas.

Usamos la definicin de C. J. Date, una de las mximas autoridades mundiales en esta materia, en su obra Introduccin a los sistemas de bases de datos, publicada en nuestro idioma por Addison-Wesley Iberoamericana, Mxico, 1986.

16

Realiz: Ing. Domingo Olivares Barrios

Pg. 118

9.2. - Tipos de Archivos y accesos. Aunque en la actualidad se ha optado por el manejo masivo de las bases de datos, (que en conjunto con los sistemas gestores de bases de datos -SGBD- y los lenguajes con la estructura necesaria, nos brindan grandes facilidades y prestaciones); siempre es necesario conocer los tipos de archivos y sus modos de acceso. 9.2.1. - Archivos secuenciales Son archivos cuyos registros son almacenados consecutivamente, es decir, uno tras otro. En estos archivos, sus registros solo pueden ser accesados de manera secuencial, es decir, empezando por el primero, y siguiendo de uno en uno hasta el final del archivo. 9.2.2. - Archivos directos. En este tipo de archivo, la informacin tambin se almacena de manera secuencial, sin embargo, a cada registro se le asigna interna y automticamente un nmero al cual llamamos, nmero de registro; de tal manera que, para accesar la informacin de cualquier registro, simplemente se hace referencia al nmero de registro para acceder a l. Por lo tanto, los registros del archivo pueden ser accesados secuencialmente, o bien, directamente por su nmero de registro. 9.2.3. Archivos indexados. Los archivos indexados, podramos decir que son similares a los archivos directos, con la diferencia de que, siempre van acompaado de uno o ms archivos que contienen los datos del campo clave de bsqueda, es decir, su ndice. Dicho de otra manera, los archivos indexados tienen las mismas caractersticas que los archivos directos, es decir, los registros se almacenan de manera secuencial, y a cada uno se le asigna interna y automticamente un nmero de registro, pero paralelamente a stos se pueden crear uno o ms ndices. Podemos comparar estos ndices con los ndices que traen los libros, donde si se observa, por un lado se tiene el nombre del tema en un orden lgico (p. e. alfabtico o temtico) y por el otro el nmero de pgina donde se encuentra ubicado, y al consultar este ndice nos resulta ms rpido y fcil localizar el tema que nos interesa. De tal manera, imaginemos los ndices como una tabla con dos campos donde se almacenan los datos del campo clave para su bsqueda y el nmero de registro donde se localiza. Obviamente, para acceder a los registros de un archivo indexado o mejor dicho indizado (que sera lo correcto pues en espaol es ndice indizado- y no ndex del ingls indexado-), tenemos tres tipos de acceso que son: secuencia, directo e indizado.

Realiz: Ing. Domingo Olivares Barrios

Pg. 119

9.2.4. Otros tipos de archivos. As como los archivos anteriormente vistos, existen muchos ms tipos de archivos, que tienen relacin al tipo de software que se utilice para crearlos y modificarlos. Algunos de los ms comunes son los archivos de grficos, los de texto, de hoja de clculo, de presentaciones, de datos comprimidos, etc. Desde luego que la manera (o formato) en que se almacena la informacin en un archivo depende del software que se este utilizando, aunque sean del mismo tipo, y se pueden identificar por la extensin del mismo. Ejemplos: De archivos de grficos las extensiones ms comunes son JPG, GIF, PCX y BMP entre otras. De archivos de texto, lo son; DOC, TXT, WPS. 9.3. Bases de datos. En este punto, se tratara con mayor profundidad todo lo relacionado a las Bases de datos, pues se han difundido tanto debido a su las necesidades de los usuarios y programadores, que se tienen muchas opciones en el mercado para usar o crear un Sistema para la Gestin de Bases de Datos (SGBD). Pero 9.3.1. - Qu es un SGBD ? SGBD son las siglas de Sistema para la Gestin de Bases de Datos. Esta frase proviene de traducir al espaol Data Base Management System (DBMS). En general, podemos decir que todo aquello a lo que en informtica llamamos vulgarmente base de datos, no es tal sino un SGBD. En sentido estricto el trmino base de datos hace referencia slo al lugar donde est depositada la informacin (hablando desde la perspectiva del hardware como del software). En cambio, con SGBD hacemos referencia a la herramienta informtica que usamos para manejar dicha informacin. Grficamente podemos representar un SGBD como vemos en la figura. BASE DE DATOS

Vista 1 Vista 3

Usuario A Usuario B

Usuario X Vista 4 Usuario Y Usuario Z

Vista 5

Realiz: Ing. Domingo Olivares Barrios

Pg. 120

Lo que el grfico nos indica es que el conjunto de informacin contenida en la base de datos tiene la peculiaridad de hallarse integrado bajo un mismo sistema gestor, pero que, adems, dichos datos son accedidos de forma independiente por usuarios y aplicaciones, slo en la medida en que son necesarios para dichos usuarios y dichas aplicaciones. Es decir, el Usuario A necesita slo la porcin de datos designada como Vista 1; por tanto la base de datos revestir ante dicho usuario la peculiaridad de parecer que slo contiene el trozo de informacin manejado desde dicha vista. La aplicacin Y trabaja slo con los datos contenidos en la Vista 4, por tanto, en ningn momento alcanzar esta aplicacin a manejar datos situados fuera de esa vista. 9.3.2. La independencia de los datos. Podemos preguntarnos qu ventajas presenta la implantacin de un SGBD frente a la ms convencional gestin de archivos que podemos realizar desde cualquier lenguaje de programacin. La respuesta a esta pregunta es mltiple, ya que mltiples son las ventajas que un mtodo de trabajo posee sobre otro: a) En general un SGBD nos permite tener un control centralizado de toda la informacin que poseemos, independientemente de que cada aplicacin gestione un solo segmento de dicha informacin. b) Los archivos gestionados por diversas aplicaciones y no agrupados bajo una filosofa de una base de datos tienden a la redundancia, ya que en la construccin de cada programa tendemos a disearnos la estructura de datos necesarios para el mismo sin tener demasiado en cuenta los requerimientos de otras aplicaciones. De esta forma, cuando queremos darnos cuenta, tenemos un mismo dato repetido en diversos archivos, claves multiplicadas, etc. c) La existencia de un SGBD nos permite crear un sistema global y nico de seguridad, tanto para controlar los accesos al sistema, como para garantizar la salvaguarda de la informacin ante posibles deterioros de la misma. En general, podemos decir que aquello que diferencia a un SGBD de un sistema de archivos controlados de forma autnoma por diversas aplicaciones es que con el primero debemos garantizar la independencia de los datos. En general, las aplicaciones que construimos son dependientes de la informacin que manejan. Esto quiere decir que la aplicacin debe estar al tanto del sistema de almacenamiento empleado, de las claves de acceso a la informacin, etc. Un cambio en la ubicacin de ciertos datos o en la estructura de ndices no puede llevarse a cabo sin modificar igualmente las aplicaciones que gestionan los datos afectados por dichos cambios. No obstante, la independencia de los datos es, an, un objetivo a cubrir por los SGBD ms que una realidad, ya que la mayor parte de los sistemas gestores de bases de datos no han conseguido todava garantizar en su totalidad esta independencia.

Realiz: Ing. Domingo Olivares Barrios

Pg. 121

9.3.3. Lenguajes y Bases de Datos. Cada SGBD debe poseer la necesaria estructura de lenguajes que permita efectuar tanto las labores de diseo de la base de datos, como las de actualizacin, consulta y mantenimiento de la misma. En general, las labores de desarrollo de aplicaciones que realizan los programadores sobre el soporte de un SGBD, son efectuadas en uno o ms lenguajes anfitriones (host) de la base de datos. Estos son lenguajes convencionales como COBOL, C, PL/1, DBASE, CLIPPER, FOX BASE, VISUAL BASIC, VISUAL FOX PRO, VISUAL C++, etc. No obstante, estas herramientas deben poseer un sub-lenguaje de datos adecuado para tratar los objetos propios de la base de datos. De dicho sublenguaje se dice que est inmerso en el lenguaje anfitrin. En el sub-lenguaje de datos (DSL Data Sublanguage-) hemos de distinguir dos partes: El lenguaje para la definicin de datos (DDL Data Definition Language-) y el lenguaje para la manipulacin de datos (DML Data Manipulation Language-).

Anfitrin

Lenguajes en un SGBD
Sublenguaje de datos

Lenguaje para la definicin de datos

Lenguaje para la manipulacin de datos

Lenguajes de un SGBD. 9.3.4. Los tres enfoques. Los sistemas gestores de bases de datos se dividen segn el tipo de estructura de datos soportado por cada uno de ellos. En la actualidad los tres enfoques ms difundidos son el jerrquico, el de red y el relacional. 9.3.4.1. Enfoque jerrquico. Se parte de que la estructura de datos necesaria es un conjunto de registros diferentes, guardados en un nico archivo, y jerarquizados entre s mediante ligas. Supongamos el siguiente modelo para comprender mejor este enfoque: La empresa X posee una base de datos que contiene informacin de sus empleados y de los departamentos a los que estn adscritos. De cada departamento se guarda su cdigo, al que denominaremos COD y su nombre, al que denominaremos NOMBRE. De cada empleado se guarda su cdigo, al que Realiz: Ing. Domingo Olivares Barrios Pg. 122

denominaremos COD_EMP, su nombre, al que denominaremos NOM_EMP y su ciudad, a la que denominaremos CIUDAD. De este modo, el formato de los dos registros existentes ser: Departamento: Empleados: COD COD_E NOMBRE NOM_EMP CIUDAD

Supongamos ahora que nuestra empresa ficticia posee tres departamentos y ocho empleados. Estos datos se veran en un archivo jerrquico del siguiente modo: DEP PRODUCCION

01

JUAN BERMUDEZ 02 03 LUISA ALCAZAR JOSE PRIETO 04 DEP

CADIZ CORDOBA LOGROO MADRID

ANTONIO GARCIA

ADMINISTRACION

05 06

LUCIA CASTILLO ROBERTO GIMBERNAT 07 MARIA CIFUENTES

MURCIA BARCELONA GUADALAJARA

DEP 3 08

VENTAS

LUIS GARCIA

MADRID

Como vemos hay dos formatos de registro distintos, uno para los departamentos y otro para los empleados. El conjunto de registro de los empleados de un departamento se encuentra ligado jerrquicamente al registro correspondiente a dicho departamento. No obstante, ambos registros se encuentran contenidos en un mismo archivo. Este es un ejemplo muy simple de estructura jerrquica. No obstante, el rbol de ligas establecido entre los datos puede crecer mucho ms. Supongamos que definimos otra porcin de nuestro archivo donde anotamos los pagos mensuales que la empresa X da a sus empleados. El registro que definamos para Realiz: Ing. Domingo Olivares Barrios Pg. 123

contener esta informacin estara ligado al registro de empleado definido previamente. Las bases de datos jerrquicas estn muy difundidas en el mercado, sobre todo en grandes equipos. No obstante, dada la gran complejidad que presenta su manejo van siendo sustituidas cada vez ms por bases de datos tipo relacional. Incluso muchos sistemas concebidos desde el enfoque jerrquico son gestionados hoy de modo semirrelacional. 9.3.4.2. Enfoque de red (Codasyl). El enfoque de red es muy similar al jerrquico. Partimos tambin de las nociones de registro y enlace. La diferencia radica en que un elemento de inferior jerarqua puede tener varios elementos situados a un nivel superior del mismo. Esto no suceda as en las bases de datos jerrquicas donde la estructura de rbol impone que un elemento padre puede tener varios elementos hijo, pero no a la inversa. En las bases de datos gestionadas bajo el enfoque de red existen lo que se denominan registros conectores que son estructuras de datos que sirven para asociar otras dos diferentes estructuras dentro de un archivo. Siguiendo nuestro ejemplo anterior, supongamos que el pago de nmina a los empleados se realiza a travs de los departamentos. Supongamos tambin que el registro donde guardamos el importe de la nmina hace las funciones de uno de estos registros conectores y que en l registramos solamente el importe del pago que realiza el departamento a cada empleado. La red de los pagos efectuados por DEP1 se vera segn el grfico de la figura siguiente: DEP1

150

187

362

521

01

02

03

04

La estructura de registros en una Base de Datos Codasyl. Al igual que decamos con el enfoque jerrquico, el ejemplo aqu Realiz: Ing. Domingo Olivares Barrios Pg. 124

propuesto es el ms simple posible. Podemos comprender fcilmente la gran cantidad de tiempo que los diseadores de bases de datos, segn el enfoque de red, han de perder en construir la estructura de conectores y ligas necesarios para el buen manejo de los datos. Esta gran cantidad de tiempo, junto con la que se ha de gastar cuando han de hacerse modificaciones en el diseo de los registros, son los principales problemas que presentan este tipo de bases de datos. 9.3.4.3. Enfoque relacional. Aunque es posible que todava el enfoque relacional no sea el ms difundido en el mercado, s est claro que es el ms aceptado a un nivel terico, siendo tambin, casi sin duda, el modelo hacia el que caminan los SGBD. Bien es cierto que resulta muy difcil asegurar que un SGBD sea relacional al ciento por ciento, no obstante esto no es un obstculo para que las bases de datos gestionadas segn este enfoque sean las que ms fuerte pisan actualmente en el mundo de la informtica. El enfoque relacional se caracteriza porque la presentacin de los datos al usuario se produce en forma de tablas. En dichas tablas las filas o registros siempre deben tener un formato fijo y una idntica estructura. El enfoque relacional en bases de datos parte del modelo relacional en matemticas y, por tanto, son susceptibles de aplicar al mismo todas las formulaciones tericas que este ltimo presenta. Veamos a continuacin una tabla de equivalencias entre tres conceptos sinnimos y las diferentes maneras con que cada uno de ellos en su dominio nombra las realidades sobre las que trata. RELACION ARCHIVO TABLA Tupla Registro Fila Atributo Campo Columna Cardinalidad No. de Registro No. de Fila Grado No. de Campo No. de Columna Es muy importante resear que en el enfoque relacional no existe ningn otro componente que no sean tablas, contrariamente a lo que suceda en las bases de datos de tipo jerrquico o de red donde hemos encontrado otros componentes: ligas y conectores. Un principio cientfico ampliamente aceptado es que un sistema que puede explicar los mismos hechos con menos componentes es ms plausible que otro que lo haga con ms. Esto da ya algunas ventajas al enfoque relacional. La siguiente figura muestra el aspecto que presentar nuestra base de datos de ejemplo siguiendo una notacin de tipo relacional.

Realiz: Ing. Domingo Olivares Barrios

Pg. 125

EMPLEADOS COD_EMP NOM_EMP 01 JUAN BERMUDEZ 02 LUISA ALCAZAR 03 JOSE PRIETO 04 ANTONIO GARCIA 05 LUCIA CASTILLO 06 ROBERTO GIMBERNAT 07 MARIA CIFUENTES 08 LUIS GARCIA

CIUDAD CADIZ CORDOBA LOGROO MADRID MURCIA BARCELONA GUADALAJA RA MADRID

COD DEP1 DEP1 DEP1 DEP1 DEP2 DEP2 DEP2 DEP2

DEPARTAMENTOS COD NOMBRE DEP1 PRODUCCION DEP2 ADMINISTRACION DEP2 VENTAS NOMINAS MES 11 11 11 11 12 07

COD_EMP 01 02 03 04 07 08

IMPORTE 1,500.00 1,875.00 3,623.00 5,213.00 8,253.00 10,215.00

Nuestra Base de Datos de ejemplo segn el Modelo Relacional. Como podemos observar, las tres tablas anteriores contienen la misma informacin que hemos manejado en el captulo anterior para explicar los enfoques jerrquicos y de red. La informacin contenida en estas tablas est plenamente normalizada; esto quiere decir que no hay ambigedad en las definiciones de las columnas y que, adems, no existe ningn tipo de registro de longitud variable. Pinsese lo que sucedera si se intentase guardar el importe de la nmina en el archivo de empleados. Si reservamos un campo para introducir este dato, slo podremos guardar un importe, con lo que perderemos la riqueza de la informacin que nos supondra almacenar todos los pagos que se produjeran. Por otro lado, si tratamos de definir el registro de cada empleado con diversos campos para guardar cada uno de los pagos: IMPORTE1, IMPORTE2, IMPORTE3, etc. Difcilmente podramos prever de antemano el nmero de

Realiz: Ing. Domingo Olivares Barrios

Pg. 126

pagos posibles a realizar a cada empleado, por lo que la definicin de la estructura de columnas de nuestra base de datos quedara incompleta. Otra solucin creara una gran redundancia de informacin, ya que en cada registro grabado quedaran duplicados COD_EMP, NOM_EMP, CIUDAD y COD. Las tres tablas de nuestro ejemplo salvan estos escollos usando archivos independientes para cada parcela de la informacin que pueda ser susceptible de un tratamiento individualizado. Si posteriormente quisiramos obtener datos, producto de cruzar dos o ms tablas, bastara con relacionarlas por el campo comn que poseen: EMPLEADOS puede ser relacionada con DEPARTAMENTOS a travs del campo COD; NOMINA puede relacionarse con EMPLEADOS a travs del campo COD_EMP. Esto lo podemos ver en la siguiente figura:
DEPARTAMENTOS EMPLEADOS NOMINAS

COD NOMBRE

COD_EMP NOM_EMP CIUDAD COD

MES COD_EMP IMPORTE

Relaciones entre archivos de la base de datos de ejemplo. Supongamos que, llegado un momento, necesitsemos saber los pagos realizados a los empleados del departamento DEP2. Relacionando NOMINAS con EMPLEADOS a travs de COD_EMP podemos ver fcilmente que el nico empleado de DEP2 que tiene un registro de NOMINAS es el que posee un COD_EMP=07, siendo el importe del nico pago efectuado $8,253. 9.3.5. Diseo de Bases de Datos. La labor primera y fundamental con la que nos encontramos ante una base de datos es la de su diseo. Este parte de la observacin de la parcela del mundo real que deseamos informatizar para abstraer de ella el modelo de datos que necesitamos para formalizar el sistema de informacin que deseemos realizar. Para realizar esta labor de modelizacin se dispone de varias tcnicas. Nosotros vamos a explicar brevemente aqu dos de las ms usadas. El modelo entidad-relacin y el proceso de normalizacin. Antes de llevar a efecto la explicacin de estas dos tcnicas conviene que definamos algunos conceptos nuevos: ENTIDAD Es cada elemento u objeto del mundo real que debe pasar a formar parte del sistema de informacin que abordamos. Por ejemplo, los clientes, las facturas, etc. El Instituto Americano de Normalizacin ANSI/SPARC define a la entidad como una persona, lugar, cosa, concepto o suceso, real o abstracto, de Pg. 127

Realiz: Ing. Domingo Olivares Barrios

inters para la empresa. Las entidades suelen corresponderse con los nombres de una oracin. ATRIBUTO Es cada una de las caractersticas de que consta una entidad y que son de utilidad para el proceso de informatizacin. As, un cliente tiene como atributos su cdigo, su nombre, el total facturado, el porcentaje de descuento que le hacemos habitualmente, etc. VALOR Es un caso concreto de un atributo. As, por ejemplo, el valor 0017 para el atributo CODIGO DE CLIENTE, el valor 28/1287162 para el atributo NMERO DE SEGURIDAD SOCIAL.

El diseo de una base de datos es un proceso de abstraccin sucesiva de modo que partiendo del mundo real lleguemos a un diseo fsico pasando por un modelo de datos y un diseo lgico de los mismos. 9.3.6. El modelo Entidad-Relacin.. Este modelo engloba una serie de tcnicas para llevar adelante el proceso de diseo de una base de datos. Con l realizamos el paso que va desde la determinacin de las entidades del mundo real hasta la formalizacin del modelo de datos y una primera aproximacin al diseo lgico de la base de datos resultante. El mtodo empleado tiene dos fases claramente diferenciadas: 1) Consiste en representar, mediante un determinado conjunto de smbolos, las entidades, los atributos de las mismas y las interrelaciones que entre ellas existen. Con ello tenemos lo que venimos denominando modelo de datos. 2) Consiste en determinar el diseo de la base de datos basndonos en el modelo de datos hallado en el proceso anterior. Los smbolos empleados pueden verse en las siguientes figuras.

ENTIDAD

RELACION

ATRIBUTO
Los smbolos del modelo entidad-relacin. Realiz: Ing. Domingo Olivares Barrios Pg. 128

En general, con ellos poseemos una buena herramienta para efectuar el diseo de una base de datos. La primera labor a efectuar para ello es tomar papel y lpiz (o alguna herramienta informtica, si la poseemos) y tratar de representar todas las entidades que descubramos en la parcela del mundo real que debamos formalizar. A continuacin deberemos determinar las relaciones entre estas entidades y las restricciones que llevan consigo. Lo veremos mejor con un problema prctico. Veamos el siguiente enunciado de aplicacin: La empresa X desea gestionar la informacin relativa a sus empleados y departamentos. Un departamento normalmente consta de varios empleados y stos siempre estn adscritos a un solo departamento. Se desea mantener informacin sobre los datos de identificacin bsicos de los empleados: cdigo identificador, nombre, domicilio, fecha de ingreso y salario anual, as como el nombre literal de cada departamento y la planta en que se ubica en la empresa. Con este enunciado ya tenemos claramente diferenciadas dos entidades: EMPLEADO y DEPARTAMENTO. Entre ambas existe una relacin: Los empleados pertenecen a los departamentos. As, pues, a las don entidades hemos de aadirle una relacin, a la cual denominaremos Pertenece_a. Veamos ahora las restricciones de esta relacin. Un empleado pertenece como mnimo y como mximo a un departamento. Un departamento lo forman como mnimo 0 empleados y como mximo N empleados.

Con estos dos enunciados anteriores hemos descubierto lo que denominaremos la Cardinalidad en el modelo entidad-relacin. Esta se representa en el primer caso como (1,1) y en el segundo como (0,N). Cuando la N aparece slo asociada a una de las dos entidades relacionadas decimos que el grado de la relacin es de 1 a N. Esto se representa 1:N. Si la N hubiera aparecido en ambas entidades, la relacin sera N:M; lo que querra decir que para 1 ocurrencia de la primera entidad habra N ocurrencias de la segunda y viceversa. Cuando la N no aparece en ninguna de las dos entidades la relacin es 1:1. As pues, ya tenemos los tres tipos posibles de grado en una relacin. 1:1 1:N N:M Para un elemento de una entidad existe 1 elemento de la otra y viceversa. Para un elemento de una entidad existen N elementos de la otra. Para N elementos de una entidad existen M elementos de la otra y viceversa.

La representacin grfica final del modelo de datos de nuestra aplicacin puede verse en la siguiente figura.

Realiz: Ing. Domingo Olivares Barrios

Pg. 129

EMPLEADO

Pertenece_a

DEPARTAMENTO

CODIGO NOMBRE DOMICILIO F. INGRESO

CODIGO NOMBRE UBICACION

SALARIO

El modelo de datos de la aplicacin propuesta. El siguiente paso consiste en formar las tablas que necesitamos construir para gestionar la aplicacin que se nos demanda. Las reglas son:

Una entidad se corresponde con una tabla. En las relaciones 1:N la entidad de la N ocurrencias hereda la clave de la entidad de la ocurrencia nica. (Este es nuestro caso. La regla a lo que nos lleva es a que la clave identificadora del departamento el cdigo-, hayamos de llevarlo a la tabla del empleado, de modo que podamos relacionar a ambos a travs de l). Las relaciones N:M se convierten en una tabla cuyos atributos son como mnimo las claves de las dos entidades relacionadas. Pinsese por ejemplo en la relacin entre las entidades AULA y PROFESOR. Un profesor puede dar clase simultneamente en varias aulas y un aula puede esta ocupada a lo largo del da por varios profesores. Esta es una relacin N:M que se resuelve con una tabla donde guardamos las aulas, otra donde guardamos los profesores y una tercera (la proveniente de la relacin N:M donde guardamos la clave del aula, la del profesor as como cualquier otro atributo de inters para la relacin, como por ejemplo, el da y la hora en que se da una clase).

Realiz: Ing. Domingo Olivares Barrios

Pg. 130

Pues bien, usando estas reglas podemos tener ya la composicin de las tablas con las que nuestra aplicacin debe trabajar: EMPLEADO
CODIGO EMPLEADO NOMBRE EMPLEADO CODIGO DEPARTAMENTO

DEPARTAMENTO
CODIGO DEPARTAMENTO NOMBRE DEPARTAMENTO UBICACIN FISICA

CALLE Y NMERO CODIGO POSTAL CIUDAD


TELEFONO FECHA INGRESO SALARIO ANUAL

Con esto hemos visto, de manera excesivamente resumida, el uso del modelo entidad-relacin para disear una base de datos. Pinsese lo complejo de esta labor en bases de datos con centenas de entidades y relaciones. Disclpenos el lector novicio en bases de datos por el excesivo tecnicismo y el experimentado por resumir con tanta brevedad los conceptos. Como casi siempre, es difcil hallar el justo trmino medio. 9.3.7. Normalizacin. Lo habitual es que el modelo entidad-relacin sea la primera aproximacin que el analista hace al diseo de una base de datos. Tras este primer acercamiento siempre ha de venir otro ms profundo que sirve para depurar la estructura de datos definida y revisar posibles errores del modelo. Es lo que denominamos normalizacin. Antes de entrar en detalle con ella permtasenos realizar algunas definiciones previas: DEPENDENCIA FUNCIONAL. Dado un archivo, sean CAMPO1 y CAMPO2 dos campos de ese archivo. Diremos que CAMPO2 tiene dependencia funcional de CAMPO1 cuando dado un valor de CAMPO! Se obtiene un valor nico de CAMPO2, o que a cada valor de CAMPO2 le corresponde un nico valor de CAMPO1. DEPENDENCIA FUNCIONAL COMPLETA. Si en un archivo, CAMPO1 es un conjunto de campos, entonces diremos que CAMPO2 tiene una dependencia funcional completa de CAMPO1 cuando CAMPO2 tiene dependencia funcional de todo el conjunto de CAMPO1 y no tiene dependencia funcional de un subconjunto de CAMPO1. Cuando CAMPO1 consta de un nico atributo entonces coincide la dependencia funcional y la dependencia funcional completa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 131

CANDIDATO A CLAVE. Candidato a clave es un atributo o conjunto de atributos que identifica de forma unvoca un registro. Uno de los candidatos a clave es utilizado como clave principal o primaria. ATRIBUTO NO CLAVE. Es aquel que no forma parte de la clave o de un candidato a clave. DETERMINANTE. Es un atributo o un conjunto de atributos del que dependen otros atributos. Decimos que una relacin est normalizada cuando para cada fila de una determinada columna slo existe un valor individualizado y no un conjunto de valores. En nuestro ejemplo anterior vemos que en el fichero EMPLEADOS slo podemos asignar un valor a la columna CIUDAD para cada fila, es decir, para cada registro de un empleado distinto. La normalizacin nos permite estructurar los datos en relaciones y adems evita que los archivos de las bases de datos tengan redundancias, incoherencias o inconsistencias. 9.3.7.1. Formas normales. NO NORMALIZADO. Decimos que una relacin o archivo no est normalizada cuando sus diferentes atributos se encuentran en un formato ambiguo, sin distincin funcional y con longitud variable. Por ejemplo, si en una base de datos bancaria guardamos en el mismo registro los datos del titular de la cuenta y todos los movimientos asociados. 1. FORMA NORMAL (1NF). Una relacin esta en 1NF si y slo si sus atributos son no descomponibles, es decir, si dentro de un mismo campo guardamos informacin que no puede ser susceptible de una ulterior subdivisin. 2. FORMA NORMAL (2NF). Una relacin esta en 2NF cuando est en 1NF y cada atributo no clave tiene Dependencia Funcional Completa de la clave primaria. Una relacin que est en 1NF puede descomponerse en un conjunto de relaciones que estn en 2NF.

Realiz: Ing. Domingo Olivares Barrios

Pg. 132

3. FORMA NORMAL (3NF). Una relacin est en 3NF cuando est en 2NF y cada atributo no clave tiene dependencia no transitiva de la clave principal. O dicho de otra manera, cada atributo tiene dependencia nicamente de la clave, no existiendo dependencias entre atributos no clave. Veamos un ejemplo17: Tenemos una empresa con una lista de proveedores con los siguientes datos: CODIGO NOMBRE ESTADO Cdigo del proveedor. Nombre del proveedor. Coeficiente numrico que se asigna a cada proveedor en funcin del volumen de negocio con ste. Ciudad donde vive el proveedor. Pedido que se hace al proveedor (slo uno por cada pieza). Pieza que se le pide al proveedor. Nombre de la pieza. Color de la pieza. Peso de la pieza. Ciudad a la que se enva la pieza.

CIUDAD PEDIDO PIEZA NOMPIEZ COLOR PESO CIUPED

17

Los archivos del ejemplo estn tomados de la obra citada: C.J. Date. Op. Cit.

Realiz: Ing. Domingo Olivares Barrios

Pg. 133

El formato de la ficha que recoge esta informacin sera el siguiente: Cdigo: Proveedor: Estado: Ciudad: Pedidos: Pieza P1 P2 P3 . . . Cantidad 300 150 200 . . . Nombre N1 N2 N3 . . . Color Rojo Verde Azul . . . Peso 12 20 14 . . . Ciudad Pars Madrid Madrid . . . S1 Francisco Hernndez y Fernndez 20 Londres

La relacin estara formada por:


CODIGO NOMBRE ESTADO CIUDAD PIEZA CANTIDAD NOMPIEZ COLOR PESO CIUPED PEDIDO

Uno de los problemas que puede traer esta estructura de relacin es que al dar de ALTA a un proveedor, forzosamente tendremos que dar de alta a un pedido, de la misma manera que si damos de baja a un pedido corremos el riesgo de perder la informacin relativa a un proveedor, si ste tiene un solo pedido. Adems el atributo PEDIDO puede repetirse si un proveedor tiene ms de un pedido, con lo que tendramos que utilizar registros de longitud variable. No est en 1NF (1 Forma Normal) porque tiene el atributo PEDIDO que es descomponible. La falta de normalizacin de esta estructura puede corregirse usando el siguiente mtodo: REL 1A
CODIGO NOMBRE ESTADO CIUDAD

REL 1B
CODIGO PIEZA CANT NOMPIEZ COLOR PESO CIUPED

La clave de REL 1A es CODIGO y la de REL 1B es CODIGO+PIEZA. Estas dos relaciones ya estn en 1NF con lo que eliminamos los problemas anteriores, aunque todava posee otros no menos serios.

Realiz: Ing. Domingo Olivares Barrios

Pg. 134

Cuando damos de ALTA a una pieza, tambin tenemos que dar de alta a un pedido. Esto nos obliga a rellenar en blanco los atributos CODIGO, CANT, CIUPED. Al igual que si damos de baja un pedido perderemos la informacin relativa a esa pieza. A la hora de la modificacin de los datos de una pieza nos vemos en la obligacin de modificarlo tantas veces como pedidos de sta existan. REL 2A
CODIGO NOMBRE ESTADO CIUDAD

REL 2B
CODIGO PIEZA CANT CIUPED

REL 2C
PIEZA NOMPIEZ COLOR PESO

La clave de REL 2A es CODIGO, la de REL 2B es CODIGO+PIEZA, y la de REL 2C es PIEZA. La relacin REL 2 ya estaba en 2NF porque no tena clave compuesta. Las otras dos relaciones han surgido de la REL 1B que s tena clave compuesta y sin embargo no todos sus atributos dependan totalmente de ella. Los que slo dependan de PIEZA, y no de CODIGO, han dado lugar a la relacin REL 2C. Las tres relaciones estn tambin en 3NF pues no hay dependencias de atributos no clave entre s. Todos dependen nicamente de su clave principal. Las relaciones resultantes son sin duda mucho ms ptimas para el movimiento de datos. La potencia de un Gestor de Bases de Datos Relacinales estriba en la posibilidad de relacionar de forma automtica los diferentes archivos que sean producto de situar en Tercera Forma Normal una estructura de informacin no normalizada. 9.3.8. ndices y ordenaciones. La informacin que se guarda en los archivos de una base de datos se almacena de forma secuencial en los diferentes archivos de la misma, es decir, que cada registro se escribe fsicamente en un lugar posterior al ltimo escrito. Si nuestra base de datos es muy grande, la localizacin de un caso particular puede ser larga y tediosa, ya que tendramos que recorrernos desde el principio todos los registros de la misma hasta localizar aquel que estamos buscando. Los ndices estn pensados para solucionar este problema. Cada ndice suele guardarse en una tabla auxiliar donde se guarda el nmero de registro correspondiente a cada caso y el valor del ndice para ese caso. Para comprender esto mejor veamos un ejemplo:

Realiz: Ing. Domingo Olivares Barrios

Pg. 135

EMPLEADOS No. COD_EMP NOM_EMP Reg. 1 01 JUAN BERMUDEZ 2 02 LUISA ALCAZAR 3 03 JOSE PRIETO 4 04 ANTONIO GARCIA 5 05 LUCIA CASTILLO 6 06 ROBERTO GIMBERNAT 7 07 MARIA CIFUENTES 8 08 LUIS GARCIA INDICE POR NOMBRE NOM_EMP ANTONIO GARCIA JOSE PRIETO JUAN BERMUDEZ LUCIA CASTILLO LUISA ALCAZAR LUIS GARCIA MARIA CIFUENTES ROBERTO GIMBERNAT

CIUDAD CADIZ CORDOBA LOGROO MADRID MURCIA BARCELONA GUADALAJA RA MADRID

COD DEP1 DEP1 DEP1 DEP1 DEP2 DEP2 DEP2 DEP2

No. Reg. 4 3 1 5 2 8 7 6

ORDENACION POR INDICES En la figura anterior se nos muestra el archivo de empleados que ya hemos visto con anterioridad. Como puede verse, este archivo est ordenado por el cdigo de cada empleado. Para una mayor claridad, hemos anotado en l tambin el nmero de registro correspondiente a cada caso. Si nos interesara hacer bsquedas alfabticas por el nombre de cada empleado tendramos alguna dificultad, ya que no existe una ordenacin por este campo. En la figura podemos ver tambin qu aspecto tendra un ndice por nombre. Como podemos observar, este ndice lo concebimos como un archivo independiente donde guardamos solamente el valor de cada nombre y el nmero del registro que cada uno de ellos tiene en el archivo principal. Al estar alfabetizado el ndice las bsquedas son muy rpidas y si queremos acceder al caso completo bastar con dirigirnos al archivo principal por el nmero de registro contenido en la tabla ndice. Los ndices deben mantenerse de forma automtica por el SGBD o mediante las instrucciones pertinentes del sub-lenguaje de datos. Es decir, cada vez que actualicemos la informacin de la tabla principal debe existir algn sistema para que se produzca una Realiz: Ing. Domingo Olivares Barrios Pg. 136

actualizacin de la tabla ndice. Existen tambin otro tipo de ordenaciones provisionales que se realizan sobre archivos de trabajo, pero que no son mantenidas por el sistema sino que se realizan en el momento en que han de ser usadas sin ninguna implicacin posterior. Supongamos que la ordenacin alfabtica descrita no es frecuentemente usada por la aplicacin que gestiona los archivos ya vistos. No obstante, en un determinado momento necesitamos obtener un listado alfabtico de todos los empleados de la empresa, dicho listado difcilmente volver a ser necesario. En este caso habra que proceder a una de estas ordenaciones temporales que quedara destruida una vez emitido el correspondiente listado. Una de las labores preeminentes a la hora de realizar el diseo de una base de datos relacional es fijar por qu campos habrn de ser indexados los archivos. Un archivo ndice nos garantiza una enorme rapidez en el acceso a la informacin, por ello parece que podra ser interesante que todos los campos de nuestros archivos fueran ndices. Sin embargo los ndices ocupan tambin espacio en disco y han de ser controlados por el sistema como un archivo ms, esto puede crear ciertas limitaciones. Por ello han de fijarse como ndices slo aquellos campos que ms frecuentemente hayan de ser accedidos por sus correspondientes valores, dejando el resto sin indexar como campos susceptibles de ser ordenados de manera temporal por el segundo sistema descrito. Las ordenaciones tambin pueden realizarse por campos mltiples o por expresiones que contengan valores de campos. Por ejemplo, la tabla de empleados podra ordenarse por NOM_EMP+CIUDAD de modo que los empleados aparecieran por orden alfabtico para cada ciudad, o bien por los 20 primeros caracteres de NOM_EMP. 9.3.9. Lenguajes de cuarta generacin (4GL). Uno de los elementos tpicos que suelen incorporar los Gestores de Bases de Datos es lo que denominamos Lenguaje de Cuarta Generacin. Estos lenguajes estn diseados para facilitar el diseo rpido de aplicaciones y el fcil acceso a la informacin contenida en las bases de datos. Un lenguaje de cuarta generacin es un lenguaje anfitrin ms de entre los soportados por un SGBD, junto con los de tercera generacin: COBOL, etc. Sus caractersticas fundamentales son: Poseer un elevado nivel de ayudas a la programacin, lo que le hace accesible a usuarios o programadores no experimentados. Poseer generadores automticos de informes, pantallas, grficos e incluso aplicaciones completas. Estar basado en las pautas de la programacin estructurada. Poseer dos niveles de uso, uno avanzado para programadores basado en una estructura de mandatos similar a la de cualquier lenguaje convencional y otro, ms simple, enfocado a usuarios donde la mayora de las labores se desarrollan por mens o por la cumplimentacin de pantallas predefinidas. A veces es tambin una caracterstica la posesin de una interfaz de lenguaje natural para las consultas simples de los usuarios del sistema. Pg. 137

Realiz: Ing. Domingo Olivares Barrios

Como ejemplos tenemos los lenguajes llamados, Visuales, de los cuales, algunos tienen origen en los viejos lenguajes de programacin y conservan varias de sus caractersticas, tales como: Lenguaje Visual Visual Basic Visual C++ Delphi Visual Fox Pro Lenguaje Origen Basic C++ Pascal Fox Pro (o Fox Base), Dbase, Clipper

9.4. Gestin de archivos de datos. Antes de iniciar con el estudio de los diagramas y algoritmos para la gestin de archivos, debes saber que las operaciones de un sistema bsico de gestin de archivos (Sistema ABC) son Altas de registros, Bajas de registros, Consultas de registros y Cambios o Modificaciones de registros (sin olvidar la Creacin del Archivo, que se ver mas adelante); siendo cada operacin un mdulo del sistema. Este sistema bsico (que tambin algunos llamamos: de mantenimiento de registros) lo podemos representar en una estructura jerrquica como sigue:
Menu ABC

Altas

Bajas

Consultas

Modificaciones o Cambios

Dependiendo de los gustos de cada programador, cada mdulo puede ser independiente y presentar su propia pantalla de despliegue de datos, o bien, englobar en un solo mdulo dos o ms operaciones bsicas, por ejemplo: Consultas y Cambios. O bien, presentar en una pantalla, un listado de los registros y mediante teclas de funciones bien definidas, accesar a cada operacin bsica de mantenimiento de registros; con el propio estilo del programador. Una nota muy importante es el hecho de que existen dos tipos de Bajas de registros; una la llamaremos Baja Lgica y la otra Baja Fsica18. La Baja Lgica consiste en marcar el registro que se desea eliminar, para que el sistema lo considere como borrado, pero sin que los datos desaparezcan o se pierdan. Esto lo puede hacer el SGBD mediante una marca interna, o bien nosotros a travs de un campo al cual podramos llamar STATUS o CONDICION, el cual puede contener un tipo de dato Carcter o Lgico, segn sea posible o necesario. Una de las ventajas de la Baja Lgica, es la de poder recuperar registros que fueron borrados por error o bien aquellos que son necesarios reactivar por necesidades propias del proceso de informacin, y por el contra parte tenemos que una desventaja es el espacio en disco que ocupa. La Baja Fsica, como es de esperarse, consiste en eliminar totalmente el registro, es decir, borrar todos los datos de los campos relativos al registro deseado. La ventaja de hacer lo
La frase Baja Fsica es relativa, dado que la informacin en s, se maneja como si fuera un objeto en un plano conceptual, sin embargo, en el plano real, estos objetos al ser datos nicamente, no tienen volumen, peso o color, sino mas bien, los describen o representan.
18

Realiz: Ing. Domingo Olivares Barrios

Pg. 138

anterior es que economiza espacio en disco, sin embargo, una de sus peores desventajas es que resulta prcticamente imposible recuperar la informacin del registro. Normalmente en la gran mayora de los sistemas de gestin de archivos, se consideran los dos tipos de Bajas, y por lo general el procedimiento para dar de baja a uno o mas registros consiste en realizar primero una Baja Lgica de aquel o aquellos registros que se desean eliminar, y posteriormente, pasado un tiempo considerable, ejecutar un procedimiento de Baja Fsica para todos aquellos registros marcados como Baja Lgica. En otras palabras, primero se marcan los registros deseados para su borrado, y pasado un tiempo se eliminan definitivamente, uno por uno o por lote, todos los registros marcados como borrados. Como observacin primordial, debemos tener presente que todo Sistema ABC, debe incluir una rutina o instruccin de creacin del archivo. La operacin para crear un archivo lleva aparejada tanto la accin de dar nombre al mismo, a fin de que el sistema lo reconozca, como la de dotarlo con la necesaria estructura de registro segn nuestras conveniencias. Todo esto podemos dividirlo en las siguientes secuencias lgicas: 1. Identificar cada archivo mediante un nombre y el camino (ruta de acceso) necesario para su localizacin en el disco. 2. Indicar el nombre de cada campo. 3. Indicar el tipo de cada campo. 4. Indicar el tamao de cada campo. Una vez que tenemos pensado el nombre y la informacin que contendr nuestro archivo, debemos indicar cmo se va a guardar dicha informacin. La unin de todos estos campos dar como resultado un registro, de tal forma que podremos decir que un registro contiene toda la informacin referente a un objeto (objeto desde el punto de vista informtico puede ser una persona, una cosa, etc.). Un campo va a estar formado por una serie de especificaciones. Estas sern: Nombre de Campo Tipo de Campo Ancho de Campo Nmero de decimales del Campo

Nombre de Campo Es el nombre que le daremos a cada campo. Un nombre de campo esta limitado por las normas del traductor que usemos. Sin embargo, deber forzosamente empezar por una letra y podr contener letras, nmeros y el carcter especial _. Es aconsejable que el nombre sea significativo (descriptivo) respecto al dato que almacenar, para que as nos sea fcil de identificar a la hora de manipularlo. Tipo de Campo Deberemos indicar el tipo de dato que vamos a utilizar. Recordemos que en los traductores de los lenguajes de programacin se dispone por lo menos de dos tipos de campos:

Realiz: Ing. Domingo Olivares Barrios

Pg. 139

CARCTER. Los campos definidos con este tipo podrn contener todo tipo de caracteres, letras, nmeros, caracteres especiales y espacios en blanco. NUMERICO. Slo pueden contener nmeros, punto decimal y el signo negativo. Pueden ser nmeros enteros o decimales.

Sin embargo, deberemos especificar claramente los tipos de datos a utilizar en la estructura del archivo, de tal manera que, sepamos que formato utilizaremos para mostrar los datos. De ah tenemos que otros tipos de datos que debemos usar y que tambin son aceptados por algunos traductores, son: FECHA. Acepta valores de fecha. Su longitud es normalmente de 8 caracteres. Debemos tener cuidado, para el caso de que el traductor no reconozca este tipo de dato, de crearnos las rutinas necesarias para que este tipo solamente acepte fechas vlidas. Los formatos utilizados generalmente son: dd/mm/aa mm/dd/aa, segn la configuracin del traductor o bien que as lo desee el programador. LOGICO. Este tipo de campo tiene posibilidad de tomar dos valores, verdadero o falso. Para verdadero se introducir T, Y o S (True, Yes o Si) y para falso F o N (False, Falso o No). Su longitud es de 1 carcter. MEMO. Se utiliza para guardar textos de longitud variable. Los datos que introducimos en este campo, no se guardan en el archivo en el que definimos el campo, sino en otro de igual nombre por lo general. En el archivo donde se define el campo, se almacena una clave que relacionar el registro con el texto correspondiente en el archivo de texto.

Ancho de Campo

En este concepto se determinar la longitud que tendr el campo, no pudiendo sobrepasar los lmites segn su tipo, de acuerdo al traductor utilizado. Deberemos tener en cuenta que si un campo de tipo NUMERICO tiene decimales, al especificar el ancho, deberemos sumarle a los dgitos del nmero entero, el punto decimal y el nmero de decimales que llevar asociado. Supongamos que queremos guardar nmeros de la forma 999999.9999, para ello indicaremos que el ancho de este campo ser 11, ya que tenemos 6 dgitos para la parte entera, 1 para el punto decimal y 4 dgitos como parte decimal. Como ltima aclaracin a la hora de especificar el ancho de los campos, deberemos pensar siempre en el dato de mayor longitud que ser introducido en el archivo, y que no deberemos ni quedarnos cortos ni poner mayor longitud de la prevista. Por ejemplo supongamos que tendremos un campo Mes donde guardaremos los nombres de los distintos meses del ao, pues bien no deberemos asignar un ancho de 7

Realiz: Ing. Domingo Olivares Barrios

Pg. 140

caracteres, ya que ni Septiembre, ni Noviembre, ni Diciembre quedarn guardados completamente, y por el contrario tampoco diremos que tendr un ancho de 25 ya que el mes de nombre ms largo, Septiembre, solamente tiene 10 caracteres. Decimal de Campo Indicaremos aqu los decimales que contendr un campo de tipo numrico. Todas las especificaciones antes descritas podramos anotarlas en forma de una tabla como la que se muestra a continuacin. Nombre del Campo Tipo Ancho Decimales

Y como nota final, siempre deberemos crear un campo clave, por medio del cual accesaremos la informacin a un registro, de una manera rpida y precisa, por ejemplo: Nmero de Control (de un alumno), Nmero de Referencia (de una cuenta contable), Nmero econmico o Nmero de placas (de una unidad de transporte), Nmero de modelo o de serie (de aparatos diversos), Nmero de cdigo de barras (de artculos diversos), etc. Y por fin, despus de todo este mundo de conceptos, veremos los diagramas y algoritmos tpicos para la gestin de archivos. Para el lector que ha seguido paso a paso este manual notar que, los primeros diagramas as como sus algoritmos, tienen un diseo no estructurado, es decir, no usan una lgica lineal, la cual hara uso de bucles y no de saltos de una lnea a otra. Los segundos diagramas, como los algoritmos tienen un diseo estructurado, es decir, utilizan una lgica lineal, usando las instrucciones de bucles, en lugar de saltos de una lnea a otra. Esto se hizo as con el fin de presentar, lo ms simple posible, la lgica de gestin de archivos, desde los dos tipos de programacin, para que compare las diferencias, y desde luego, se tomen como base para iniciar la codificacin de programas para la gestin de archivos, puesto que tanto los diagramas como los algoritmos presentados a continuacin, son susceptibles de optimizaciones y adecuaciones al estilo de cada programador, aunque, la lgica general sea bsicamente la misma. Debo recordarle amable lector que es preferible el modelo estructurado.

Realiz: Ing. Domingo Olivares Barrios

Pg. 141

9.4.1. Gestin de archivos secuenciales. DISEO NO ESTRUCTURADO Diagrama de flujo:


INICIO

ALTAS. C

Inicializar Variables

Clave del Registro = Clave Capturada?

NO

SI
Existe el archivo?

Ir al siguiente registro

NO

Creacin del archivo.

La Clave YA existe.

SI
Abrir archivo

E A
Ir al Principio del archivo

B
Solicitar clave y datos. Ms datos? (S/N)

Clave y datos

Respuesta

D
Respuesta=S Fin de Archivo?

SI

SI

Grabar el nuevo registro

NO
Cerrar archivo

NO E
Leer registro.

FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 142

DISEO ESTRUCTURADO
INICIO

Inicializar Variables

Clave del Registro = Clave Capturada?

NO

SI
No Existe el archivo?

SI
Encontrado = Verdadero

Ir al siguiente registro

NO
Abrir archivo

Creacin del archivo.

D
La Clave YA existe.

Respuesta=S Encontrado=Falso

A F NO
Cerrar archivo

B
Respuesta=S

SI
FIN Solicitar clave y datos.

Clave y datos

D
No es Fin de Archivo?

F NO
No fue encontrado?

E NO
Ir al Principio del archivo Ms datos? (S/N)

SI SI
Leer registro. Grabar el nuevo registro Respuesta

C E Realiz: Ing. Domingo Olivares Barrios B Pg. 143

DISEO NO ESTRUCTURADO. Algoritmo: ALTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino Crear el archivo. 3. Abrir el archivo. 4. Desplegar solicitud de clave y datos. 5. Introducir clave y datos. 6. S es Fin de Archivo entonces - Grabar el nuevo registro - Ir al paso 11. 7. Leer registro 8. S Clave del Registro = Clave Capturada entonces - Desplegar La Clave YA existe. - Ir al paso 11. 9. Ir al siguiente registro. 10. Ir al paso 6 11. Ir al principio del archivo. 12. Desplegar Ms datos ? 13. Introducir Respuesta 14. S Respuesta=S entonces Ir al paso 4. 15. Cerrar el archivo. 16. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 144

DISEO ESTRUCTURADO. Algoritmo: ALTAS. 1. Inicializar Variables. 2. S No Existe el archivo entonces a. Crear el archivo. 3. Fin del S 4. Abrir el archivo. 5. Respuesta = S 6. Encontrado = Falso 7. Mientras Respuesta = S a. Desplegar solicitud de clave y datos. b. Introducir clave y datos. c. Mientras No sea Fin de archivo i. Leer registro. ii. S Clave del Registro = Clave Capturada entonces 1. Encontrado = Verdadero. 2. Desplegar La Clave YA existe. 3. Salida (del Mientras no sea Fin de archivo). iii. Fin del S. iv. Ir al siguiente registro. d. Fin del Mientras No sea Fin de archivo. e. S No fue Encontrado entonces i. Grabar el nuevo registro. f. Fin del S. g. Ir al Principio del archivo. h. Desplegar Ms datos? (S/N). i. Introducir Respuesta. 8. Fin del Mientras Respuesta = S 9. Cerrar Archivo. 10. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 145

DISEO NO ESTRUCTURADO Diagrama de flujo:


INICIO

BAJAS. (Baja Lgica). C

Inicializar Variables

Datos del registro. Dar de baja el registro?

Existe el archivo?

NO

Creacin del archivo.

Respuesta

SI
Respuesta=S Abrir archivo

NO

El archivo esta vacio

SI
Marcar y grabar el registro

B
Solicitar la clave.

A E

Clave.

Ir al Principio del archivo

D
Fin de Archivo?

SI

El registro NO existe

Otra Baja? (S/N)

NO
Respuesta Leer registro.

E
Respuesta=S

SI

Clave del registro = Clave Capturada?

NO
Ir al siguiente registro

NO
Cerrar archivo

SI C

A D
FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 146

DISEO ESTRUCTURADO Diagrama de flujo:


INICIO

BAJAS. (Baja Lgica). C

Inicializar Variables

Clave del registro = Clave Capturada?

NO
Ir al siguiente registro

Existe el archivo?

NO

Creacin del archivo.

SI
Encontrado = Verdadero

SI
Abrir archivo El archivo esta vacio Datos del registro. Dar de baja el registro?

Respuesta = S Encontrado = Falso

A A
Respuesta Cerrar archivo

B
Respuesta=S

NO

Respuesta=S

NO

SI
FIN Solicitar la clave.

SI
Marcar y grabar el registro

E
Clave. No fue encontrado? No es Fin de Archivo?

D NO

NO F

SI
El registro NO existe Otra Baja? (S/N)

SI
Leer registro.

G
Ir al Principio del archivo

Respuesta

Encontrado = Falso

C Realiz: Ing. Domingo Olivares Barrios F B Pg. 147

DISEO NO ESTRUCTURADO Algoritmo: BAJAS. (Baja Lgica). 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo - Desplegar El archivo esta vaco - Ir al paso 20. 3. Abrir el archivo. 4. Solicitar la Clave. 5. Introducir la Clave. 6. S es Fin de Archivo entonces - Desplegar El registro NO existe - Ir al paso 14. 7. Leer registro 8. S Clave del Registro = Clave Capturada entonces Ir al paso 11. 9. Ir al siguiente registro. 10. Ir al paso 6. 11. Desplegar los datos del registro. 12. Desplegar Dar de baja el registro? 13. Introducir Respuesta. 14. S Respuesta = S entonces Marcar y grabar el registro. 15. Ir al principio del archivo. 16. Desplegar Otra Baja ? 17. Introducir Respuesta 18. S Respuesta=S entonces Ir al paso 4. 19. Cerrar el archivo. 20. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 148

DISEO ESTRUCTURADO Algoritmo: BAJAS. (Baja Lgica). i. Inicializar Variables. ii. S Existe el archivo entonces 1. Abrir el archivo. 2. Respuesta = S 3. Encontrado = Falso 4. Mientras Respuesta = S a. Solicitar la Clave. b. Introducir la Clave. c. Mientras No sea Fin de Archivo i. Leer registro ii. S Clave del Registro = Clave Capturada entonces 1. Encontrado = Verdadero. 2. Desplegar los datos del registro. 3. Desplegar Dar de baja el registro? 4. Introducir Respuesta 5. S Respuesta = S entonces a. Marcar y grabar el registro. 6. Fin del S. 7. Salir (del Mientras No sea Fin de Archivo) iii. Fin del S. iv. Ir al siguiente registro. d. Fin del Mientras No sea Fin de Archivo. e. S No fue Encontrado entonces i. Desplegar El registro NO existe.. f. Fin del S. g. Ir al principio del archivo. h. Desplegar Otra Baja ? i. Introducir Respuesta j. Encontrado = Falso. 5. Fin del Mientras Respuesta = S iii. Sino 1. Crear el archivo 2. Desplegar El archivo esta vaco iv. Fin del S. v. Cerrar el archivo. vi. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 149

DISEO NO ESTRUCTURADO Diagrama de flujo:


INICIO

CONSULTAS. C

Inicializar Variables

Clave del registro = Clave Capturada?

NO

SI
Existe el archivo?

Ir al siguiente registro

NO

Creacin del archivo.

Datos del registro.

SI
Abrir archivo El archivo esta vacio

E
Ir al Principio del archivo

B
Solicitar la clave.

Otra consulta? (S/N)

Capturar la Clave.

Respuesta

D
Respuesta=S Fin de Archivo?

SI

SI

El registro NO existe

NO
Cerrar archivo

NO Leer registro. E A

FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 150

DISEO ESTRUCTURADO Diagrama de flujo: INICIO CONSULTAS. C

Inicializar Variables

Clave del registro = Clave Capturada?

NO
Ir al siguiente registro

Existe el archivo?

NO

Creacin del archivo.

SI
Encontrado = Verdadero

SI
Abrir archivo El archivo esta vacio Datos del registro.

E
Respuesta = S Encontrado = Falso

A A NO

B
Respuesta=S

No fue encontrado?

NO

Cerrar archivo

SI
El registro

SI
FIN Solicitar la clave.

NO existe

F
Ir al Principio del archivo

Clave.

D
No es Fin de Archivo?

Otra Consulta? (S/N)

NO

E
Respuesta

SI
Leer registro. Encontrado = Falso

B C Realiz: Ing. Domingo Olivares Barrios Pg. 151

DISEO NO ESTRUCTURADO Algoritmo: CONSULTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo - Desplegar El archivo esta vaco - Ir al paso 17. 3. Abrir el archivo. 4. Solicitar la Clave. 5. Introducir la Clave. 6. S es Fin de Archivo entonces - Desplegar El registro NO existe - Ir al paso 12. 7. Leer registro 8. S Clave del Registro = Clave Capturada entonces Ir al paso 11. 9. Ir al siguiente registro. 10. Ir al paso 6. 11. Desplegar los datos del registro. 12. Ir al principio del archivo. 13. Desplegar Ms datos ? 14. Introducir Respuesta 15. S Respuesta=S entonces Ir al paso 4. 16. Cerrar el archivo. 17. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 152

DISEO ESTRUCTURADO Algoritmo: CONSULTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces a. Abrir el archivo. b. Respuesta = S c. Encontrado = Falso d. Mientras Respuesta = S i. Solicitar la Clave. ii. Introducir la Clave. iii. Mientras No sea Fin de Archivo 1. Leer registro 2. S Clave del Registro = Clave Capturada entonces a. Encontrado = Verdadero. b. Desplegar los datos del registro. c. Salir (del Mientras No sea Fin de Archivo) 3. Fin del S. 4. Ir al siguiente registro. iv. Fin del Mientras No sea Fin de Archivo. v. S No fue Encontrado entonces 1. Desplegar El registro NO existe.. vi. Fin del S. vii. Ir al principio del archivo. viii. Desplegar Otra Consulta ? ix. Introducir Respuesta x. Encontrado = Falso. e. Fin del Mientras Respuesta = S 3. Sino a. Crear el archivo b. Desplegar El archivo esta vaco 4. Fin del S. 5. Cerrar el archivo. 6. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 153

DISEO NO ESTRUCTURADO

Diagrama de flujo:
INICIO

CAMBIOS. (Modificaciones). C
Datos del registro. Modificar el registro?

Inicializar Variables

Existe el archivo?

NO

Creacin del archivo.

Respuesta

Respuesta=S

NO

SI
Abrir archivo El archivo esta vacio

SI
Solicitar los datos del registro.

B
Solicitar la clave.

A
Datos del registro.

Capturar la Clave.

Grabar el registro

E
Ir al Principio del archivo

D
Fin de Archivo?

SI

El registro NO existe Ms datos? (S/N)

NO
Leer registro.

E
Respuesta

Clave del registro = Clave Capturada?

NO
Ir al siguiente registro

Respuesta=S

SI

NO
Cerrar archivo

SI C

A D
FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 154

DISEO ESTRUCTURADO

Diagrama de flujo:
INICIO

CAMBIOS. (Modificaciones). C

Inicializar Variables

Clave del registro = Clave Capturada?

NO
Ir al siguiente registro

Existe el archivo?

NO

Creacin del archivo.

SI
Encontrado = Verdadero

SI
Abrir archivo El archivo esta vacio Datos del registro. Modificar el registro?

Respuesta = S Encontrado = Falso

B
Respuesta=S

A A NO
Cerrar archivo Respuesta

Respuesta=S

NO

SI
FIN Solicitar la clave.

SI
Solicitar datos del registro.

Clave.

D E
No es Fin de Archivo?

Grabar el registro

NO

No fue encontrado?

NO G

SI
Leer registro.

SI F

C Realiz: Ing. Domingo Olivares Barrios Pg. 155

El registro NO existe

G
Ir al Principio del archivo

Otra modificacin? (S/N)

Respuesta

Encontrado = Falso

Realiz: Ing. Domingo Olivares Barrios

Pg. 156

DISEO NO ESTRUCTURADO Algoritmo: CAMBIOS. (Modificaciones). 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo - Desplegar El archivo esta vaco - Ir al paso 20. 3. Abrir el archivo. 4. Solicitar la Clave. 5. Introducir la Clave. 6. S es Fin de Archivo entonces - Desplegar El registro NO existe - Ir al paso 14. 7. Leer registro 8. S Clave del Registro = Clave Capturada entonces Ir al paso 11. 9. Ir al siguiente registro. 10. Ir al paso 6. 11. Desplegar los datos del Registro. 12. Desplegar Modificar el registro? 13. Introducir Respuesta. 14. S Respuesta = S entonces - Desplegar Solicitud de datos del registro. - Introducir los datos del registro. - Grabar el registro. 15. Ir al principio del archivo. 16. Desplegar Ms datos ? 17. Introducir Respuesta 18. S Respuesta=S entonces Ir al paso 4. 19. Cerrar el archivo. 20. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 157

DISEO ESTRUCTURADO Algoritmo: CAMBIOS. (Modificaciones). 1. Inicializar Variables. 2. S Existe el archivo entonces a. Abrir el archivo. b. Respuesta = S c. Encontrado = Falso d. Mientras Respuesta = S i. Solicitar la Clave. ii. Introducir la Clave. iii. Mientras No sea Fin de Archivo 1. Leer registro 2. S Clave del Registro = Clave Capturada entonces a. Encontrado = Verdadero. b. Desplegar los datos del registro. c. Desplegar Modificar el registro? d. Introducir Respuesta e. S Respuesta = S entonces i. Desplegar Solicitud de datos del registro. ii. Introducir los datos del registro. iii. Grabar el registro. f. Fin del S. g. Salir (del Mientras No sea Fin de Archivo) 3. Fin del S. 4. Ir al siguiente registro. iv. Fin del Mientras No sea Fin de Archivo. v. S No fue Encontrado entonces 1. Desplegar El registro NO existe.. vi. Fin del S. vii. Ir al principio del archivo. viii. Desplegar Otra Modificacin ? ix. Introducir Respuesta x. Encontrado = Falso. e. Fin del Mientras Respuesta = S 3. Sino a. Crear el archivo b. Desplegar El archivo esta vaco 4. Fin del S. 5. Cerrar el archivo. 6. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 158

9.4.2. Gestin de archivos directos. DISEO NO ESTRUCTURADO Diagrama de flujo: ALTAS. INICIO C

Inicializar Variables

El registro YA esta ocupado.

E NO
Creacin del archivo. Ms datos? (S/N)

Existe el archivo?

SI
Abrir archivo

Respuesta

A
Respuesta=S

SI

B
Solicitar el Nmero de registro y datos.

NO
Cerrar archivo

Nmero de registro y datos

FIN

D
Ir al registro y leerlo.

Registro vaco?

SI

Grabar los datos en el registro

NO C E

Realiz: Ing. Domingo Olivares Barrios

Pg. 159

DISEO ESTRUCTURADO Diagrama de flujo: ALTAS. INICIO

Inicializar Variables

Existe el archivo?

NO

Creacin del archivo.

SI
Abrir archivo

B Respuesta = S C NO

Respuesta=S

Cerrar archivo Registro vaco? FIN

SI

SI
Solicitar el Nmero de registro y datos.

Grabar los datos en el registro

NO
El registro YA esta ocupado.

Nmero de registro y datos

E
Ms datos? (S/N)

D
Ir al registro y leerlo.

Respuesta

Realiz: Ing. Domingo Olivares Barrios

Pg. 160

DISEO NO ESTRUCTURADO Algoritmo: ALTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino Crear el archivo. 3. Abrir el archivo. 4. Desplegar Solicitud del Nmero de registro y datos. 5. Introducir Nmero de registro y datos. 6. Grabar el nuevo registro 7. Ir al registro y leerlo. 8. S el Registro est Vaco entonces - Grabar los datos en el registro. - Ir al paso 10. 9. Desplegar El registro YA esta ocupado. 10. Desplegar Ms datos ? 11. Introducir Respuesta 12. S Respuesta=S entonces Ir al paso 4. 13. Cerrar el archivo. 14. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 161

DISEO ESTRUCTURADO Algoritmo: ALTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces a. Abrir el archivo. b. Respuesta = S c. Mientras Respuesta = S i. Desplegar Solicitud del Nmero de registro y datos. ii. Introducir Nmero de registro y datos. iii. Ir al registro y leerlo. iv. S el Registro est Vaco entonces 1. Grabar los datos en el registro. v. Sino 1. Desplegar El registro YA esta ocupado. vi. Fn de S. vii. Desplegar Ms datos ? viii. Introducir Respuesta d. Fin del Mientras. 3. Cerrar el archivo. 4. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 162

DISEO NO ESTRUCTURADO Diagrama de flujo: BAJAS. (Baja Lgica).


INICIO

Inicializar Variables

Marcar y grabar el registro

B NO
Creacin del archivo. Ms datos? (S/N)

Existe el archivo?

SI
Abrir archivo

Respuesta

El archivo

Respuesta=S

SI C

C
Solicitar el Nmero de registro.

NO
Cerrar archivo

Nmero de registro

FIN

Ir al registro y leerlo.

Datos del registro. Dar de baja el registro?

Respuesta

Respuesta=S

SI

NO B Realiz: Ing. Domingo Olivares Barrios Pg. 163

DISEO ESTRUCTURADO Diagrama de flujo: BAJAS. (Baja Lgica).


INICIO

Inicializar Variables

Datos del registro. Dar de baja el registro?

Existe el archivo?

NO

Creacin del archivo.

Respuesta

SI
Abrir archivo

NO
Respuesta=S

El archivo esta vaco.

SI
Marcar y grabar el registro

Respuesta = S B C
Respuesta=S

Ms datos? (S/N)

NO
Cerrar archivo Respuesta

SI
Solicitar el Nmero de registro. FIN

Nmero de registro

Ir al registro y leerlo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 164

DISEO NO ESTRUCTURADO Algoritmo: BAJAS. (Baja Lgica). 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo. - Desplegar El archivo esta vaco. - Ir al paso 14. 3. Abrir el archivo. 4. Desplegar Solicitud del Nmero de registro. 5. Introducir Nmero de registro. 6. Ir al registro y leerlo. 7. Desplegar los datos del registro. 8. Desplegar Dar de baja el registro? 9. Introducir Respuesta. 10. S Respuesta = S entonces - Marcar y grabar los datos en el registro. 11. Desplegar Ms datos ? 12. Introducir Respuesta 13. S Respuesta=S entonces Ir al paso 4. 14. Cerrar el archivo. 15. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 165

DISEO ESTRUCTURADO Algoritmo: BAJAS. (Baja Lgica). 1. Inicializar Variables. 2. S Existe el archivo entonces a. Abrir el archivo. b. Respuesta = S c. Mientras Respuesta = S i. Desplegar Solicitud del Nmero de registro. ii. Introducir Nmero de registro. iii. Ir al registro y leerlo. iv. Desplegar los datos del registro. v. Desplegar Dar de baja el registro? vi. Introducir Respuesta. vii. S Respuesta = S entonces 1. Marcar y grabar los datos en el registro. viii. Fin del S ix. Desplegar Ms datos ? x. Introducir Respuesta d. Fin del Mientras 3. Sino a. Crear el archivo. b. Desplegar El archivo esta vaco. 4. Fin del S 5. Cerrar el archivo. 6. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 166

DISEO NO ESTRUCTURADO Diagrama de flujo: CONSULTAS.


INICIO

Inicializar Variables

Existe el archivo?

NO

Creacin del archivo.

Mas datos? (S/N)

SI
Abrir archivo El archivo esta vaco.

Respuesta

Respuesta=S

SI B

B
Solicitar el Nmero de registro.

NO
Cerrar archivo

Nmero de registro

FIN

Ir al registro y leerlo.

Datos del registro.

Realiz: Ing. Domingo Olivares Barrios

Pg. 167

DISEO ESTRUCTURADO Diagrama de flujo: CONSULTAS.


INICIO

Inicializar Variables

Existe el archivo?

NO

Creacin del archivo.

Ir al registro y leerlo.

SI
Abrir archivo El archivo esta vaco. Datos del registro.

Respuesta = S B
Respuesta=S

Mas datos? (S/N)

NO
Cerrar archivo

Respuesta

SI
Solicitar el Nmero de registro.

FIN

Nmero de registro

Realiz: Ing. Domingo Olivares Barrios

Pg. 168

DISEO NO ESTRUCTURADO Algoritmo: CONSULTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo. - Desplegar El archivo esta vaco. - Ir al paso 12. 3. Abrir el archivo. 4. Desplegar Solicitud del Nmero de registro. 5. Introducir Nmero de registro. 6. Ir al registro y leerlo. 7. Desplegar los datos del registro. 8. Desplegar Ms datos ? 9. Introducir Respuesta 10. S Respuesta=S entonces Ir al paso 4. 11. Cerrar el archivo. 12. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 169

DISEO ESTRUCTURADO Algoritmo: CONSULTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces a. Abrir el archivo. b. Respuesta = S c. Mientras Respuesta = S i. Desplegar Solicitud del Nmero de registro. ii. Introducir Nmero de registro. iii. Ir al registro y leerlo. iv. Desplegar los datos del registro. v. Desplegar Ms datos ? vi. Introducir Respuesta d. Fin del Mientras. 3. Sino a. Crear el archivo. b. Desplegar El archivo esta vaco. 4. Fin del S. 5. Cerrar el archivo. 6. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 170

DISEO NO ESTRUCTURADO Diagrama de flujo: MODIFICACIONES (Cambios).


INICIO

Inicializar Variables

Existe el archivo?

NO

Creacin del archivo.

Solicitar los datos del registro.

SI
Abrir archivo El archivo esta vaco.

Datos del registro.

Grabar el registro

B
Solicitar el Nmero de registro. Mas datos? (S/N)

Nmero de registro

Respuesta

Ir al registro y leerlo.

Respuesta=S

SI B

NO
Datos del registro. Modificar el registro? Cerrar archivo

FIN Respuesta

NO
Respuesta=S

SI A

Realiz: Ing. Domingo Olivares Barrios

Pg. 171

DISEO ESTRUCTURADO Diagrama de flujo: MODIFICACIONES (Cambios).


INICIO

Inicializar Variables

Existe el archivo?

NO

Creacin del archivo.

Datos del registro. Modificar el registro?

SI
Abrir archivo El archivo esta vaco.

Respuesta

NO
Respuesta=S

Respuesta = S

SI
Solicitar los datos del registro.

Respuesta=S

NO

SI B
Solicitar el Nmero de registro. Cerrar archivo Datos del registro.

FIN

Grabar el registro

E
Nmero de registro Mas datos? (S/N)

Ir al registro y leerlo.

Respuesta

B A

Realiz: Ing. Domingo Olivares Barrios

Pg. 172

DISEO ESTRUCTURADO Algoritmo: MODIFICACIONES (Cambios). 1. Inicializar variables. 2. S existe el archivo entonces a. Abrir el archivo b. Respuesta = S c. Mientras Respuesta = S i. Solicitar el nmero de registro ii. Introducir el nmero de registro iii. Ir al registro y leerlo iv. Desplegar los datos del registro v. Desplegar Modificar el registro? vi. Introducir Respuesta vii. S Respuesta = S entonces 1. Solicitar los datos del registro 2. Introducir los datos del registro 3. Grabar el registro viii. Fin del S ix. Desplegar Ms datos (S/N)? x. Introducir Respuesta d. Fin del mientras 3. sino a. Creacin del archivo b. Desplegar El archivo esta vaco. c. Cerrar el archivo. 4. Fin del S 5. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 173

9.4.3. Gestin de archivos indexados. DISEO NO ESTRUCTURADO Diagrama de flujo:


INICIO

ALTAS. C

Inicializar Variables

Ms datos? (S/N)

Existe el archivo?

NO

Creacin del archivo.

Respuesta

SI A SI A
Abrir archivo Cerrar archivo Respuesta=S

NO

B
Solicitar clave y datos. FIN

Capturar clave y datos

Buscar el registro por la clave.

Se encontro el registro ?

SI

El registro YA existe.

NO C
Grabar el registro

Realiz: Ing. Domingo Olivares Barrios

Pg. 174

DISEO NO ESTRUCTURADO Algoritmo: ALTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino Crear el archivo. 3. Abrir el archivo. 4. Solicitar clave y datos. 5. Introducir clave y datos. 6. Buscar el registro por la clave. 7. S Se encontr el registro entonces Ir al Paso 8. Sino Desplegar El registro YA existe. Ir al Paso 9. 8. Grabar registro. 9. Desplegar Ms datos ? 10. Introducir Respuesta 11. S Respuesta=S entonces Ir al paso 4. 12. Cerrar el archivo. 13. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 175

DISEO ESTRUCTURADO Diagrama de flujo: INICIO ALTAS. C

Inicializar variables

Buscar el registro por la clave

Existe el archivo?

NO

Creacin del archivo

Se encontro el registro?

SI El registro YA existe.

SI A A

NO Grabar el registro

Abrir archivo Ms datos? (S/N)

Respuesta = S B

Respuesta Respuesta = S? NO Cerrar archivo B SI FIN Solicitar clave y datos

Capturar clave y datos

Realiz: Ing. Domingo Olivares Barrios

Pg. 176

DISEO ESTRUCTURADO Algoritmo: ALTAS. 1. Inicializar variables 2. S NO existe el archivo entonces a. Creacin del archivo 3. sino a. Abrir archivo b. Respuesta =S c. Mientras Respuesta = S i. Solicitar clave y datos ii. Introducir clave y datos iii. Buscar el registro por la clave iv. S NO se encontro el registro entonces 1. Grabar el registro v. Sino 1. Desplegar El registro YA existe vi. Fin del S vii. Desplegar Ms datos (S/N) viii. Introducir Respuesta d. Fin del Mientras e. Cerrar archivo 4. Fin del S

Realiz: Ing. Domingo Olivares Barrios

Pg. 177

DISEO NO ESTRUCTURADO Diagrama de flujo: BAJAS.


INICIO

Inicializar Variables

Existe el archivo ?

NO

Creacin del archivo.

Datos del Registro.

SI
Abrir archivo El archivo esta vacio.

Dar de baja el registro?

D
Solicitar clave.

Respuesta

SI
Respuesta=S

NO
Capturar clave

C
Buscar otro registro?

Marcar o eliminar el registro.

Buscar el registro por la clave.

Se encontro el registro ?

SI

Respuesta

A SI
Respuesta=S

NO NO
El registro NO existe. Cerrar archivo

B
FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 178

DISEO NO ESTRUCTURADO Algoritmo: BAJAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo. - Desplegar El archivo esta vaco. - Ir al paso 15. 3. Abrir el archivo. 4. Solicitar clave. 5. Introducir clave. 6. Buscar el registro por la clave. 7. S Se encontr el registro entonces Desplegar Datos del Registro. Sino - Desplegar El registro NO existe. - Ir al Paso 11 8. Desplegar Dar de baja el registro? 9. Introducir Respuesta 10. S Respuesta=S entonces Marcar o eliminar el registro 11. Desplegar Buscar otro registro ? 12. Introducir Respuesta 13. S Respuesta=S entonces Ir al paso 4. 14. Cerrar el archivo. 15. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 179

DISEO ESTRUCTURADO Diagrama de flujo: BAJAS. INICIO A

Inicializar Variables

Datos del registro. Dar de baja el registro? (S/N) NO Creacin del archivo El archivo est vacio. Respuesta = S? NO B Buscar otro registro? SI

Existe el archivo?

Respuesta

SI Abrir archivo

D Respuesta = S C

Marcar o eliminar el registro

Respuesta = S? SI
Solicitar clave.

NO D

Cerrar archivo

Respuesta FIN C

Capturar clave

Buscar el registro por la clave.

Se encontro el registro?

NO

El registro NO existe.

SI A B

Realiz: Ing. Domingo Olivares Barrios

Pg. 180

DISEO ESTRUCTURADO Algoritmo: BAJAS. 1. Inicializar variables 2. S NO existe el archivo entonces a. Creacin del archivo b. Desplegar El archivo est vaco 3. sino a. Abrir archivo b. Respuesta = S c. Mientras Respuesta = S i. Solicitar clave ii. Introducir Clave iii. Buscar el registro por clave iv. S se encontro el registro entonces 1. Desplegar datos del registro 2. Desplegar Dar de baja el registro? (S/N) 3. Introducir Respuesta 4. S Respuesta = S entonces a. Marcar o eliminar el registro 5. Fin del S v. Fin del S vi. Desplegar Buscar otro registro? vii. Introducir Respuesta d. Fin del Mientras e. Cerrar archivo 4. Fin del S 5. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 181

DISEO NO ESTRUCTURADO Diagrama de flujo: CONSULTAS.


INICIO

Inicializar Variables

Existe el archivo ?

NO

Creacin del archivo.

SI
Abrir archivo

C
Solicitar clave.

El archivo esta vacio.

Respuesta

SI
Respuesta=S

NO
Clave Cerrar archivo

Buscar el registro por la clave.

FIN

Se encontro el registro ?

NO

El registro NO existe.

SI Datos del Registro. B Buscar otro registro? A Realiz: Ing. Domingo Olivares Barrios Pg. 182 B

DISEO NO ESTRUCTURADO Algoritmo: CONSULTAS. 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo. - Desplegar El archivo esta vaco - Ir al paso 12. 3. Abrir el archivo. 4. Solicitar clave. 5. Introducir clave. 6. Buscar el registro por la clave. 7. S Se encontr el registro entonces Desplegar Datos del Registro. Sino - Desplegar El registro NO existe. 8. Desplegar Buscar otro registro ? 9. Introducir Respuesta 10. S Respuesta=S entonces Ir al paso 4. 11. Cerrar el archivo. 12. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 183

DISEO ESTRUCTURADO Diagrama de flujo: CONSULTAS. INICIO B

Inicializar Variables C NO

Datos del registro

Existe el archivo? SI Abrir archivo

Creacin del archivo

Otra consulta? (S/N)

Respuesta El archivo est vaco D

Respuesta = S D NO
Respuesta = S?

Cerrar archivo A FIN

SI Solicitar clave

Clave
Buscar el registro por la clave

NO
Se encontro el registro?

El registro NO existe.

SI B C

Realiz: Ing. Domingo Olivares Barrios

Pg. 184

DISEO ESTRUCTURADO Algoritmo: CONSULTAS. 1. Inicializar variables 2. S NO existe el archivo entonces a. Creacin del archivo b. Desplegar El archivo est vaco. 3. sino a. Abrir archivo b. Respuesta = S c. Mientras Respuesta = S i. Desplegar Solicitar Clave ii. Introducir Clave iii. Buscar el registro por la Clave iv. S se encontro el registro entonces 1. Desplegar datos del registro v. Sino 1. Desplegar El registro NO existe. vi. Fin del S vii. Desplegar Otra consulta? (S/N) viii. Introducir Respuesta d. Fin del Mientras e. Cerrar Archivo 4. Fin del S 5. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 185

DISEO NO ESTRUCTURADO Diagrama de flujo: MODIFICACIONES (Cambios).


INICIO

A SI
Respuesta=S Solicitar datos del registro.

Inicializar Variables

Existe el archivo ?

NO

Creacin del archivo.

NO
Buscar otro registro? Capturar datos del registro.

SI
Abrir archivo

B
Solicitar clave.

El archivo esta vacio.

Respuesta

Grabar el registro

SI
Respuesta=S

NO
Capturar clave Cerrar archivo

Buscar el registro por la clave.

FIN

Se encontro el registro ?

NO

El registro NO existe.

SI
Datos del Registro.

Modificar registro?

Respuesta

Realiz: Ing. Domingo Olivares Barrios

Pg. 186

DISEO NO ESTRUCTURADO Algoritmo: MODIFICACIONES (Cambios). 1. Inicializar Variables. 2. S Existe el archivo entonces Ir al paso 3. Sino - Crear el archivo. - Desplegar El archivo esta vaco - Ir al paso 16. 3. Abrir el archivo. 4. Solicitar clave. 5. Introducir clave. 6. Buscar el registro por la clave. 7. S Se encontr el registro entonces Desplegar Datos del Registro. Sino - Desplegar El registro NO existe. - Ir al paso 11. 8. Desplegar Modificar registro? 9. Introducir Respuesta 10. S Respuesta =S entonces - Desplegar solicitud de datos del registro. - Capturar datos del registro. - Grabar el registro. 11. Desplegar Buscar otro registro ? 12. Introducir Respuesta 13. S Respuesta=S entonces 14. Ir al paso 4. 15. Cerrar el archivo. 16. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 187

DISEO ESTRUCTURADO Diagrama de flujo: MODIFICACIONES (Cambios). INICIO A

Inicializar Variables

Datos del registro. Modificar el registro? (S/N) NO Creacin del archivo El archivo est vacio. Respuesta = S? NO B Buscar otro registro? SI

Existe el archivo?

Respuesta

SI Abrir archivo

D Respuesta = S C

Solicitar los datos del registro

Respuesta = S? SI
Solicitar clave.

NO D

Cerrar archivo

Datos del registro

Respuesta
Grabar el registro

FIN C B

Capturar clave

Buscar el registro por la clave.

NO
Se encontro el registro?

El registro NO existe.

SI A B

Realiz: Ing. Domingo Olivares Barrios

Pg. 188

DISEO ESTRUCTURADO Algoritmo: MODIFICACIONES (Cambios). 1. Inicializar variables 2. S NO existe el archivo entonces a. Creacin del archivo b. Desplegar El archivo est vaco 3. Sino a. Abrir archivo b. Respuesta = S c. Mientras Respuesta = S i. Desplegar Solicitar Clave ii. Introducir Clave iii. Buscar el registro por la Clave iv. S se encontro el registro entonces 1. Desplegar Datos del registro 2. Desplegar Modificar el registro? (S/N) 3. Introducir Respuesta 4. S Respuesta = S entonces a. Desplegar Solicitar Datos del registro b. Introducir Datos del registro c. Grabar Registro 5. Fin del S v. Sino 1. Desplegar El registro NO existe vi. Fin del S vii. Desplegar Buscar otro registro? (S/N) viii. Introducir Respuesta d. Fin del Mientras e. Cerrar archivo 4. Fin del S 5. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 189

9.4.4. Gestin de una base de datos relacional constituida por dos archivos. Para las bases de datos relacionales, lo ptimo es utilizar archivos indexados y un diseo estructurado. Otro punto importante es definir cual es el archivo principal y cual es el complementario. Para nuestro ejemplo, el archivo principal ser nombrado como A y el complementario como B. La lgica del sistema ABC, bsicamente es la misma, la nica diferencia es en el momento de capturar o buscar los datos complementarios en un segundo archivo. Se debe recordar que en el archivo complementario (B) se almacenan grupos de registros relacionados a un registro del archivo principal (A), por lo tanto, los datos del campo Clave pueden estar repetidos, no as en el archivo principal. Algoritmo: ALTAS. 1. Inicializar variables. 2. S NO Existe el archivo A entonces a. Creacin del archivo A b. Creacin del archivo B 3. Sino a. S NO Existe el archivo B entonces i. Creacin del archivo B. b. Fin del S 4. Fin del S. 5. Abrir los archivos. 6. Clave = 7. Mientras Clave <> SALIR a. Desplegar solicitud de la Clave. b. Introducir Clave c. S Clave = SALIR entonces i. Vuelta al Mientras d. Fin del S e. Buscar el registro por la Clave en el archivo A. f. S se encontr el registro entonces i. Desplegar El registro YA existe g. Sino i. Solicitar datos del archivo A ii. Introducir datos del archivo A iii. Desplegar Los datos estan correctos? (S/N) iv. Introducir Respuesta v. S Respuesta = S entonces 1. Grabar registro en archivo A 2. Mientras Respuesta = S a. Solicitar datos para archivo B. b. Introducir datos del archivo B. c. Desplegar Los datos estn correctos? (S/N)? d. Introducir Respuesta e. S Respuesta = S entonces Realiz: Ing. Domingo Olivares Barrios Pg. 190

i. Grabar registro en archivo B f. Fin del S g. Desplegar Ms datos? (S/N) h. Introducir Respuesta 3. Fin del Mientras vi. Fin del S h. Fin del S 8. Fin del Mientras 9. Cerrar archivos 10. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 191

Algoritmo: BAJAS. 1. Inicializar variables. 2. S NO Existe el archivo A entonces a. Creacin del archivo A b. Creacin del archivo B c. Desplegar Los archivos estan vacos. 3. Sino a. S NO Existe el archivo B entonces i. Creacin del archivo B b. Fin del S c. Abrir los archivos. d. Clave = e. Mientras Clave <> SALIR i. Desplegar solicitud de la Clave ii. Introducir Clave iii. S Clave = SALIR entonces 1. Vuelta al Mientras iv. Fin del S v. Buscar el registro por la Clave en el archivo A vi. S NO se encontr el registro entonces 1. Desplegar El registro NO existe vii. Sino 1. Desplegar los datos del archivo A 2. Encontrado = FALSO 3. Ir al principio del archivo B 4. Mientras NO sea FIN DE ARCHIVO en B a. Localizar registro relacionado por la Clave. b. S se encontro registro relacionado entonces i. Desplegar datos del registro localizado. ii. Encontrado = VERDADERO c. Fin del S 5. Fin del Mientras 6. S Encontrado = FALSO entonces a. Desplegar La clave no tiene registros relacionados b. Desplegar PUEDE BORRAR EL REGISTRO PRINCIPAL, SI LO DESEA. c. Desplegar Dar de baja el registro principal? (S/N)? d. Introducir Respuesta e. S Respuesta = S entonces i. Marcar o eliminar el registro principal f. Fin del S 7. Sino a. Desplegar NO PUEDE BORRAR EL REGISTRO PRINCIPAL, PUES TIENE REGISTROS RELACIONADOS. ES NECESARIO QUE PRIMERO BORRE LOS REGISTROS DEL ARCHIVO B. Realiz: Ing. Domingo Olivares Barrios Pg. 192

b. Desplegar Desea borrar registros relacionados del archivo B? (S/N) c. Introducir Respuesta d. Mientras Respuesta = S i. Desplegar Teclee la referencia del registro secudario a borrar ii. Introducir Referencia iii. Localizar registro a borrar del archivo B iv. S se encontro el registro entonces 1. Desplegar Dar de baja el registro secundario? (S/N) 2. Introducir Respuesta 3. S Respuesta = S entonces a. Marcar o eliminar el registro secundario 4. Fin del S v. Sino 1. Desplegar No existe el registro vi. Fin del S vii. Desplegar Borrar otro registro secundario? (S/N) viii. Introducir Respuesta e. Fin del Mientras 8. Fin del S viii. Fin del S f. Fin del Mientras 4. Fin del S 5. Cerrar archivos 6. FIN.

Realiz: Ing. Domingo Olivares Barrios

Pg. 193

Algoritmo: CONSULTAS 1. Inicializar variables. 2. S NO Existe el Archivo A entonces a. Creacin del archivo A b. Creacin del archivo B c. Desplegar Los archivos estn vacos. 3. Sino a. S NO Existe el archivo B entonces i. Creacin del archivo B b. Fin del S c. Abrir los archivos d. Clave = e. Mientras Clave <> SALIR i. Desplegar solicitud de la Clave ii. Introducir Clave iii. S Clave = SALIR entonces 1. Vuelta al Mientras iv. Fin del S v. Buscar el registro por la Clave en el archivo A vi. S NO se encontr el registro entonces 1. Desplegar El registro NO existe. vii. Sino 1. Desplegar los datos del archivo A 2. Encontrado = FALSO 3. Ir al principio del archivo B 4. Mientras NO sea FIN DE ARCHIVO en B a. Localizar registro relacionado por la Clave b. S se encontro registro relacionado entonces i. Desplegar datos del registro localizado ii. Encontrado = VERDADERO c. Fin del S 5. Fin del Mientras 6. S Encontrado = FALSO entonces a. Desplegar La clave no tiene registros relacionados 7. Fin del S viii. Fin del S f. Fin del Mientras 4. Fin del S 5. Cerrar archivos 6. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 194

Algoritmo: MODIFICACIONES. 1. Inicializar variables 2. S NO existe el archivo A entonces a. Creacin del archivo A b. Creacin del archivo B c. Desplegar Los archivos estn vacos. 3. Sino a. S NO existe el archivo B entonces i. Creacin del archivo B b. Fin del S c. Abrir los archivos d. Clave = e. Mientras Clave <> SALIR i. Desplegar solicitud de la Clave ii. Introducir Clave iii. S Clave = SALIR entonces 1. Vuelta al Mientras iv. Fin del S v. Buscar el registro por la Claven en el archivo A vi. Si NO se encontr el registro entonces 1. Desplegar El registro NO existe. vii. Sino 1. Desplegar los datos del archivo A 2. Desplegar Modificar datos del registro principal? (S/N) 3. Introducir Respuesta 4. S Respuesta = S entonces a. Mientras VERDADERO i. Desplegar solicitud de datos del registro principal ii. Introducir datos del registro principal iii. Desplegar Estn correctos los datos? (S/N) iv. Introducir Respuesta v. S Respuesta = S entonces 1. Grabar los datos del registro 2. Salir del Mientras vi. Fin del S b. Fin del Mientras 5. Fin del S 6. Encontrado = FALSO 7. Ir al principio del archivo B 8. Mientras NO sea FIN DE ARCHIVO en B a. Localizar registro relacionado por la Clave b. S se encontro registro relacionado entonces i. Desplegar datos del registro localizado ii. Encontrado = VERDADERO iii. Desplegar Modificar datos del registro secundario encontrado? (S/N) Realiz: Ing. Domingo Olivares Barrios Pg. 195

iv. Introducir Respuesta v. S Respuestas = S entonces 1. Mientras VERDADERO a. Desplegar solicitud de datos del registro secundario encontrado. b. Introducir datos del registro secundario encontrado. c. Desplegar Estn correctos los datos? (S/N) d. Introducir Respuesta e. S Respuesta = S entonces i. Grabar los datos del registro ii. Salir del Mientras f. Fin del S 2. Fin del Mientras vi. Fin del S c. Fin del S 9. Fin del Mientras 10. S Encontrado = FALSO entonces a. Desplegar La clave no tiene registros relacionados. 11. Fin del S viii. Fin del S f. Fin del Mientras 4. Fin del S 5. Cerrar archivos 6. FIN

Realiz: Ing. Domingo Olivares Barrios

Pg. 196

10. Introduccin a la Programacin Dirigida por los Datos.


El trmino data-driven programming, en una traduccin literal, puede traducirse como programacin dirigida por los datos. Mediante la programacin dirigida por los datos, usted puede ahorrar mucho tiempo en el desarrollo y mantenimiento de sus aplicaciones. 10.1. Programacin Cdigo-Fijo (Hard-Code). Este trmino puede ser nuevo para usted; no obstante, en su estilo de programacin debe intentar que sus programas sean hard-coded, es decir, que estn escritos de manera literal, fciles de entender y de programar. Vea el ejemplo siguiente, escrito en lenguaje Clipper: USE Func DO WHILE .T. mCodEmpl = CodEmpl mNombreEmpl = NombreEmpl mCodSet = CodSet mCodCar = CodCar mFechaEnt = FechaEnt mSalario = Salario mGremio = Gremio ** ORDENES ENDDO *** Usar o abrir el archivo Func. *** Bucle infinito: Hacer mientras VERDADERO. *** \ *** \ *** \ *** Asignacin de valores de campos a variables. *** / *** / *** / *** Lgica de gestin del archivo. *** Terminacin del bucle infinito.

En este ejemplo son inicializadas las variables de memoria (identificadas con la m antepuesta) con el contenido de los campos de un archivo para utilizarlas despus. Cada nombre de campo y de variable ha sido explcitamente especificado. Si tuviramos cinco campos, tendramos cinco lneas de asignacin. Si tuviramos treinta campos, seran necesarias treinta lneas de asignacin. Como norma se acepta que cada variable de memoria tenga el mismo nombre de campo, precedido por la letra <m>. Con este estilo de programacin tiene que preocuparse con cada nombre y saber cmo se llama exactamente cada nombre del campo del archivo para poder teclearlo. Veamos ahora la misma tarea realizada en esta ocasin por una rutina que utiliza el concepto <<dirigida por los datos>>. USE Func FOR I = 1 TO FCOUNT() *** Usar o abrir el archivo Func. /*** Bucle PARA-HASTA desde 1 hasta la cantidad total de campos en el archivo (FCOUNT devuelve la cantidad de campos en el archivo). ***/ Var = m+FIELDNAME(I) /*** Con la funcin FIELDNAME, se toma el nombre del campo I; y se le antepone la letra m para que ste sea el nombre de la variable que se almacene en la variable Var ***/ &Var = &(FIELDNAME(I)) /*** El uso del carcter & -ampersand- antes del Pg. 197

Realiz: Ing. Domingo Olivares Barrios

nombre Var indica al Clipper que utilice el contenido de la variable Var como nombre de variable. Lo mismo sucede con el & antes de la funcin FIELDNAME que esta entre parntesis, el cual toma el valor del campo I NEXT ***/ /*** Siguiente. (Terminacin del bucle PARA-HASTA) ***/

De tal manera que: 1. En el primer bucle, donde la variable I tiene el valor de 1, FIELDNAME devolver el nombre de dicho campo, por ejemplo; Clave, y al realizar la operacin m+Clave tendremos mClave, que ser la cadena string que se almacenara en la variable Var. 2. Acto seguido, el carcter & -ampersand- en la funcin &(FIELDNAME(I)), le indica a Clipper que devuelva el nombre del campo I, que en el primer bucle es 1, y que lo tome como si fuera un nombre de variable o campo, siendo en nuestro caso Clave, y no como cadena de caracteres; de la misma manera, el mismo carcter &, hace lo propio con el contenido de la variable Var, indicndole a Clipper que tome el contenido de dicha variable, que para nuestro ejemplo es mClave y lo utilice como un nombre de variable, siendo mClave, la variable. 3. De ah tendramos que se tomara el valor del campo Clave, por ejemplo, la cadena, a123x y se almacenar en la variable mClave. 4. Por ltimo, para el resto de los campos, se realizar la misma operacin de creacin y asignacin de variables descrita en los tres puntos anteriores. En este ejemplo se utiliza un bucle FOR NEXT (PARA-HASTA) para crear una variable por cada campo del archivo. Observe cmo con slo dos lneas, todas las variables de memoria son inicializadas. Tanto si existen 5 campos o 40, estas mismas dos lneas hacen esa funcin. Inicializando las variables de esa forma no es necesario preocuparse de teclear el nombre de los campos y de las variables, evitando de esa forma los errores cometidos al teclear programas. PROS Y CONTRAS. Programacin CODIGO-FIJO (HARD-CODE) Es ms sencilla de programar. Es ms fcil leer el programa. El tamao del cdigo aumenta con el nmero de elementos manipulados.

10.2. Programacin Dirigida por los Datos (Data-Driven). Es ms difcil de programar (aparentemente). Es ms difcil de leer. El tamao del cdigo no aumenta con el nmero de elementos.

Realiz: Ing. Domingo Olivares Barrios

Pg. 198

Por su estructura, est indicada para crear procedimientos y funciones.

El ejemplo expuesto utiliza los datos de una base de datos. Si la estructura del archivo fuera modificada, en la programacin dirigida por los datos no sera necesaria ninguna modificacin del cdigo, mientras que en el estilo tradicional es necesario reescribir el cdigo. Si considera que en una aplicacin puede haber varias situaciones como sa, la prdida de tiempo dedicado al mantenimiento disminuye de forma considerable. Programar en el estilo dirigido por los datos requiere siempre un estudio previo de los elementos que sern manipulados. Exige el uso efectivo de variables de memoria, matrices y otras estructuras de datos. La mayor ventaja de ese estilo puede estar en la parametrizacin del estilo de programacin y la obtencin de un cdigo eficiente y altamente profesional. Para utilizar ese estilo de programacin es necesario que el lector conozca muy bien los recursos de programacin del lenguaje que se utilice y, obviamente, tener tambin una buena lgica de programacin. Esta tcnica es normalmente adoptada por los programadores expertos. Para los programadores que empiezan es recomendable que utilicen, para comenzar, el estilo de programacin tradicional y despus usar ste estilo. NOTA: Sera conveniente invertir mucho tiempo elaborando funciones y procedimientos que, una vez tecleados, economizan gran cantidad de tiempo en el desarrollo de programas y sistemas. As cada vez que se tenga que desarrollar alguna rutina para una aplicacin especfica, analiza si sta puede ser <<generalizada>>, y por tanto, usada en otras aplicaciones. Muchas veces la respuesta es no. No obstante, otras veces se puede realizar un magnfico procedimiento o funcin. En el primer ejemplo mostrado usamos slo el bucle FOR NEXT y la macro sustitucin (&) de Clipper. Estos dos elementos u otros similares, aparecen constantemente en las aplicaciones dirigidas por los datos, en ste lenguaje o cualquier otro. Observe el programa mostrado a continuacin, el cual est codificado en Clipper. Es un programa tpico de introduccin de datos. Programa CP10PR01.PRG (Hard Code).
*** Programa CP10PR01.PRG Altas. * Estructura base de datos: PERSONAL.DBF * Campo Nombre Campo Tipo Tamao * 1 CodEmpl Caracter 3 * 2 NombreEmpl Caracter 30 * 3 CodSet Caracter 1 * 4 CodCar Caracter 1 * 5 FechaEnt Fecha 8 * 6 Salario Numrico 9 * 7 Gremio Lgico 1 * 8 Coment Memo 10 ** Total 64 PROCEDURE Principal() CLEAR ALL IF FILE("IndCodC.NTX") USE Personal INDEX IndCodC ELSE USE Personal

Dec

Indice N N N N N N N N

// Inicio del programa


// Elimina variables en memoria y cierra cualquier archivo abierto

// S existe el archivo IndCodC.NTX // Abre el archivo Personal y su ndice IndCodC // Sino // Abre el archivo Personal

Realiz: Ing. Domingo Olivares Barrios

Pg. 199

INDEX ON CodEmpl TO IndCodC // ENDIF // WHILE .T. // Clear // mCodEmpl = SPACE(3) // mNombrEmpl = SPACE(30) // mCodSet = SPACE(1) // mCodCar = SPACE(1) // mFechaEnt = CTOD("") // mSalario = 0 // mGremio = .F. // @ 1,1 SAY "Cdigo Empleado o; <INTRO> para salir"; GET mCodEmpl // READ // IF VAL(mCodEmpl) = 0 // EXIT // ENDIF // SEEK mCodEmpl // IF FOUND() // @ 23,01 SAY "Cdigo ya; encontrado...; Teclee <INTRO>" // INKEY(0) // LOOP // ENDIF // @ 3,1 SAY "Nombre:"; GET mNombrEmpl // @ 4,1 SAY Sector:" GET mCodSet // @ 5,1 SAY "Cargo:" GET mCodCar // @ 6,1 SAY "Fecha:"; // GET mFechaEnt @ 7,1 SAY "Salario:"; GET mSalario // READ // Ok = "" @ 8,1 SAY "Datos Ok? (S/N)"; // GET Ok PICTURE "!"; // VALID Ok $ "SN" // READ // IF Ok = "S" // APPEND BLANK // REPLACE CodEmpl WITH mCodEmpl,; // NombrEmpl WITH mNombrEmpl,; // CodSet WITH mCodSet,; // CodCar WITH mCodCar,; // FechaEnt WITH mFechaEnt,; // Salario WITH mSalario,; // Gremio WITH mGremio // ENIF // END // CLOSE ALL // RETURN

Indexa segn CodEmpl Al archivo IndCodC Fin del S Mientras VERDADERO (Bucle Infinito) Limpia (la pantalla) MCodEmpl = 3 espacios (en blanco) MNombrEmpl = 30 espacios (en blanco) MCodSet = 1 espacio (en blanco) MCodCar = 1 espacio (en blanco) MFechaEnt = Convierte Cadena Nula a Fecha Nula MSalario = 0 MGremio = Falso

Despliega mensaje e Introduce el valor de MCodEmpl

Lee los datos del teclado despus del <INTRO> S el valor numrico de MCodEmpl = 0 Salir del Mientras Fin del S Busca (el valor de) MCodEmpl (en el archivo) S se encontr Despliega mensaje
Introducir Tecla (Detiene el programa hasta que se presiona una tecla.

Lazo (Vuelta al Mientras) Fin del S


Despliega mensaje e Introduce el valor de MNombrEmpl

Despliega mensaje e Introduce el valor de MCodSet Despliega mensaje e Introduce el valor de MCodCar
Despliega mensaje e Introduce el valor de MFechaEnt
Despliega mensaje e Introduce el valor de MSalario

Lee los datos del teclado despus del <INTRO> Despliega mensaje
Introduce el valor de Ok y lo convierte a mayusculas

Restringe los valores de Ok a "S" o "N" Lee los datos del teclado despus del <INTRO> S Ok = "S" Agrega un registro vaco al archivo
Reemplaza (Graba el valor del campo) CodEmpl con (el valor de la variable) MCodEmpl

(Reemplaza) NombreEmpl (Reemplaza) CodSet (Reemplaza) CodCar (Reemplaza) FechaEnt (Reemplaza) Salario (Reemplaza) Gremio Fin del S Fin del Mientras Cierra todos los archivos

con con con con con con

mNombrEmpl mCodSet mCodCar mFechaEnt mSalario mGremio

// Fin del programa

En el programa mostrado a continuacin, se crean funciones para asignar las variables con el contenido de los campos del archivo, para sustituir el contenido de los campos por el contenido de las variables y para inicializar variables de memoria con el mismo tipo de dato que el de los campos. Programa CP10PR02.PRG (Data Driven).
*** Programa CP6PR01.PRG Altas. * Estructura base de datos: PERSONAL.DBF * Campo Nombre Campo Tipo Tamao * 1 CodEmpl Caracter 3 * 2 NombreEmpl Caracter 30 * 3 CodSet Caracter 1 * 4 CodCar Caracter 1 * 5 FechaEnt Fecha 8 * 6 Salario Numrico 9 * 7 Gremio Lgico 1 * 8 Coment Memo 10

Dec

Indice N N N N N N N N

Realiz: Ing. Domingo Olivares Barrios

Pg. 200

** Total PROCEDURE Principal() CLEAR ALL IF FILE("IndCodC.NTX") USE Personal INDEX IndCodC ELSE USE Personal INDEX ON CodEmpl TO IndCodC ENDIF WHILE .T. Clear DO Inic_Var @ 1,1 SAY "Cdigo Empleado o; <INTRO> para salir"; GET mCodEmpl READ IF VAL(mCodEmpl) = 0 EXIT ENDIF SEEK mCodEmpl IF FOUND() @ 23,01 SAY "Cdigo ya; encontrado...; Teclee <INTRO>" INKEY(0) LOOP ENDIF @ 3,1 SAY "Nombre:"; GET mNombrEmpl @ 4,1 SAY Sector:" GET mCodSet @ 5,1 SAY "Cargo:" GET mCodCar @ 6,1 SAY "Fecha:"; GET mFechaEnt @ 7,1 SAY "Salario:"; GET mSalario READ Ok = "" @ 8,1 SAY "Datos Ok? (S/N)"; GET Ok PICTURE "!"; VALID Ok $ "SN" READ IF Ok = "S" APPEND BLANK DO Repl_Var ENIF END CLOSE ALL RETURN PROCEDURE Inic_Var()

64 // Inicio del programa


// Elimina variables en memoria y cierra cualquier archivo abierto

// // // // // // // //
//

S existe el archivo IndCodC.NTX Abre el archivo Personal y su ndice IndCodC Sino Abre el archivo Personal Indexa segn CodEmpl Al archivo IndCodC Fin del S Mientras VERDADERO (Bucle Infinito) Limpia (la pantalla)
Llama al procedimiento de inicializacin de variables

//

Despliega mensaje e Introduce el valor de MCodEmpl

// // // // // // // // //
//

Lee los datos del teclado despus del <INTRO> S el valor numrico de MCodEmpl = 0 Salir del Mientras Fin del S Busca (el valor de) MCodEmpl (en el archivo) S se encontr Despliega mensaje Lazo (Vuelta al Mientras) Fin del S
Despliega mensaje e Introduce el valor de MNombrEmpl

// Introducir Tecla (Detiene el programa hasta que se presiona una tecla.

//
// // //

Despliega mensaje e Introduce el valor de MCodSet


Despliega mensaje e Introduce el valor de MCodCar Despliega mensaje e Introduce el valor de MFechaEnt Despliega mensaje e Introduce el valor de MSalario

// //
//

Lee los datos del teclado despus del <INTRO> Despliega mensaje
Introduce el valor de Ok y lo convierte a mayusculas

// // // //

Restringe los valores de Ok a "S" o "N" Lee los datos del teclado despus del <INTRO> S Ok = "S" Agrega un registro vaco al archivo

// Llamada al procedimiento para grabar o reemplazar los datos en el archivo

// Fin del S // Fin del Mientras // Cierra todos los archivos // Fin del programa
// Inicio del procedimiento de inicializacin de variables

FOR N = 1 TO FCOUNT() IF TYPE(FIELD(N)) <> "M" NombCampo = FIELDNAME(N) NombVar = "m"+NombCampo (concatena cadenas de caracteres) PUBLIC &NombVar DO CASE CASE TYPE(FIELD(I)) = "C" &NombVar = SPACE(LEN(&NombCampo)) CASE TYPE(FIELD(I)) = "N" &NombVar = 0 CASE TYPE(FIELD(I)) = "D" &NombVar = CTOD("") CASE TYPE(FIELD(I)) = "L" &NombVar = .F. ENDCASE ENDIF NEXT RETURN PROCEDURE Repl_Var()

// Para I = 1 hasta Cantidad de campos


// S el tipo del campo N es diferente de "M" (Memo)

// //
//

NombCampo = Nombre del campo N NombVar = "m" + Valor de NombCampo


Declara como pblico el nombre de variable contenido en la variable NombVar

//
// //

Hacer en Caso
Caso de que el tipo del campo = "C" (Caracter) Variable en NombVar = Cantidad de espacios de la longitud del campo en NombCampo

//

Caso de que el tipo del campo = "N" (Numrico)

//
// // //

Variable en NombVar = 0
Caso de que el tipo del campo = "D" (Fecha) Variable en NombVar = Nulo convertido a formato de fecha Caso de que el tipo del campo = "L" (Lgico)

// Variable en NombVar = FALSO // Fin del Caso // Fin del S // Siguiente (I)
// Retorna a la lnea siguiente de donde fue llamado el procedimiento
// Inicio del procedimiento de grabado o reemplazo de los valores de las variables al archivo

Realiz: Ing. Domingo Olivares Barrios

Pg. 201

FOR N = 1 TO FCOUNT() IF TYPE(FIELD(N)) <> "M" NombCampo = FIELDNAME(N) NombVar = "m"+NombCampo IF TYPE("&NombVar") <> "U" REPLACE &NombCampo WITH &NombVar ENDIF ENDIF NEXT RETURN

// Para I = 1 hasta Cantidad de campos


// S el tipo del campo N es diferente de "M" (Memo)

//
// NombVar //

NombCampo = Nombre del campo N


= "m" + Valor de NombCampo (concatena cadenas de caracteres) Reemplaza el campo en NombCampo con la variable en NombVar

// S el tipo de la variable en NombVar <> "U" (Undefined - Indefinido)

// Fin del S // Fin del S // Siguiente (I)


// Retorna a la lnea siguiente de donde fue llamado el procedimiento

Por lo que ya ha podido ver, esta tcnica es utilizada en los procedimientos de creacin y asignacin del contenido de las variables de memoria; guardar los campos nos es de bastante ayuda. No obstante, la programacin DD, tambin puede ser utilizada para operaciones tradicionales, como son: la captura y despliegue de datos, generacin de mens, etc. Para la aplicacin prctica de sta tcnica, es necesario que el programador conozca suficientemente bien, el lenguaje en el que aplicara sta tcnica DD. 10.3. Diccionario de datos. Puede utilizar el concepto de DD para crear un diccionario de datos que contenga toda la informacin sobre los datos que sern manipulados por la aplicacin. Es posible, por ejemplo, crear un diccionario de datos con informacin sobre los archivos utilizados por la aplicacin de forma que permita crear procedimientos y funciones que permitan su manipulacin genrica (apertura, fechado, indexacin, etc.) y mostrar pantallas, como hemos visto anteriormente. En definitiva, crear un archivo de parmetros de uso general. Las formas ms simples de crear ese diccionario de datos son: 1. Utilizando un archivo de base de datos. 2. Utilizando matrices. La primera opcin tiene como puntos a favor el hecho de que se puedan modificar sus datos sin que sea necesario recompilar la aplicacin, que trae consigo una gran portabilidad y facilidad de mantenimiento para su aplicacin. Por otro lado, si ese archivo no dispone de algn mecanismo de proteccin, cualquiera podra modificar los datos de forma indebida y daar su aplicacin. Analice la informacin dada en este captulo y empiece a pensar en sus posibles aplicaciones en sus prximos programas19. 10.4. Programacin de plantillas. 10.4.1. - Qu es una plantilla ? Bsicamente, una plantilla es un programa o rutina que tiene por objeto generar programas (cdigo fuente) basndose en un modelo o patrn. En otras palabras, una plantilla es un generador de programas.

Para ampliar sus conceptos e ideas sobre sta tcnica sugiero que estudie el Capitulo 6, del libro Curso de Clipper 5.2 Avanzado, de Jos Antonio Ramalho; Editorial McGraw Hill.

19

Realiz: Ing. Domingo Olivares Barrios

Pg. 202

<< Un buen programador no usa generadores de programas.>> Ser cierta esta afirmacin? Despus de crear varios programas, comenzar a crear un modelo propio de programacin, es decir, cualquier aplicacin que desarrolle tendr algunas caractersticas en comn con todos los dems que ya ha desarrollado. Por ejemplo, siempre colocar la fecha en la esquina superior derecha de la pantalla, sus mensajes de error aparecen siempre en la lnea 23, columna 10, y as lo dems. Y entonces, no se resistir a la idea de obtener una copia del programa anterior en su editor y realizar slo algunas modificaciones para generar un nuevo programa. 10.4.2. Ventajas de una plantilla. 1. Ahorro de tiempo. Una plantilla puede generar un sistema completo en menos de dos minutos; bastar con suministrarle los datos especficos del nuevo sistema, pulsar <Intro> y centenares de lneas de programa sern escritas en pocos minutos. Todo esto nos libra de los detestables errores al teclear que siempre terminamos cometiendo. 2. Modelado del cdigo fuente. Cada programador tiene su propia forma de programar. Ahora bien, si trabaja para una empresa que tiene su propio modelo particular para la generacin de pantallas, informes u otras rutinas, tendr que seguir ese modelo en buena parte de su programa. Imagnese el gasto que supone el mantenimiento de un programa de otro programador que posee una forma de programar totalmente distinta a la suya. 3. Facilidad de modificacin. Si quiere cambiar un determinado elemento que afecta a todos los mdulos del sistema, la modificacin de la plantilla realizar todos los cambios en el sistema. 10.4.3. Cuando utilizar una plantilla. La creacin de una plantilla requiere un anlisis previo del programa que desea generar. Si va a crear una rutina que ser especfica de una nica aplicacin o que necesitar modificaciones profundas para que sea utilizada en otro programa, sa, con certeza, no ser la rutina del programa ideal para crear una plantilla. Las plantillas utilizan el concepto de programacin orientada o dirigida por los datos, es decir, son rutinas que trabajarn con objetos previamente preparados generando el cdigo definitivo.

10.4.4. Generadores de Cdigo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 203

En el mercado, dispone de varios programas generadores de cdigo. Los ms conocidos son el UI2 y el GENNIFER. Estos programas permiten la generacin de cdigos fuente en varios dialectos Dbase, C y otros lenguajes. Esos programas normalmente disponen de plantillas listas para ser usadas, donde usted simplemente les debe informar de los objetos que deben actuar. Estos programas permiten tambin que usted, utilizando rdenes del programa, cree sus propias plantillas, es decir, aquellas que tengan su forma de programar. Discutiremos cmo crear plantillas con las propias rdenes de Clipper. Una plantilla est bsicamente formada por textos literales y rdenes de generacin. En el CD que acompaa a sta obra se presenta un generador de cdigo desarrollado en Clipper, el cual genera un programa, tambin en Clipper, para el mantenimiento de una base de datos.

Realiz: Ing. Domingo Olivares Barrios

Pg. 204

11. Introduccin a la Programacin Orientada al Objeto.


11.1. Introduccin. Hace aos la programacin se realizaba mediante el modelo lineal, es decir, los programas evolucionaban lnea a lnea sin que la descomposicin modular de los mismos tuviese la menor importancia a la hora de estructurar el cdigo. Esta situacin fue superada por el mtodo de la programacin estructurada donde la simple linealidad del cdigo desapareca para dejar paso a la nocin de estructura modular, descomposicin top-down, etc. Hoy vivimos otra nueva revolucin en las tcnicas de ingeniera del software. Es lo que se ha dado en llamar la Programacin Orientada a Objetos. Pero, En qu consiste esta innovacin? Qu es realmente un objeto?. Trataremos, con la brevedad que una corta introduccin debe aportar, de responder estas cuestiones. El diseo de software orientado a objetos pretende ser una tcnica de construccin de aplicaciones que funcione de acorde a como lo hace la mente humana en su ubicacin en la realidad. El hombre conoce mediante un proceso de abstraccin en el que de lo real vamos tomando sus aspectos ms comunes para construir formas inteligibles por nuestro pensamiento, stas son los objetos. Los objetos deben poseer un conjunto de propiedades que los definan y distingan, algo que les de la individualidad necesaria como para que el conocimiento del hombre pueda tratar con ellos. Slo conocemos objetos. Los objetos son la formalizacin de lo real que hace la mente del hombre. Por tanto, si la nocin de objeto posee tanta importancia a la hora de explicar los mecanismos cognoscitivos del ser humano, parece lgico que una de las actividades intelectuales del hombre, como es el diseo de software, se trate de aprovechar todo lo que esta nocin pueda dar de s. Deberamos tambin contestar a la pregunta Qu se pretende obtener con la incorporacin de la nocin de objeto al universo informtico? Fundamentalmente se desea reducir los tiempos de desarrollo. Un objeto es una parte de una aplicacin totalmente terminada y transportable, de forma que pueda usarse de forma similar por otras aplicaciones. La labor de ensamblar objetos se pretende como ms reducida en cuanto a esfuerzo que la de desarrollar programas partiendo slo de un lenguaje de programacin. Continuar con una exposicin terica de la Programacin Orientada al Objeto (OOP abreviado en Ingls), resultara larga, tediosa e intil teniendo en cuenta la finalidad de este libro. Situndonos en el justo contexto de una breve introduccin, el tratamiento dado al tema slo puede ser eminentemente prctico, y ceirse lo mas posible a la generalizacin del concepto. Esa es la pretensin inicial de este captulo, en el que por razones obvias de comodidad abreviaremos las palabras Programacin Orientada al Objeto, sustituyndolas por la ya conocida expresin anglosajona: OOPS.

Realiz: Ing. Domingo Olivares Barrios

Pg. 205

11.2. Vocabulario OOPS. Cualquier tecnologa, (programacin, fontanera, pastelera, etc.), por regla general e ineludible, requiere un vocabulario tcnico propio, el cual cumple dos cometidos diferentes: 1. Especificar de modo claro y conciso cada una de las peculiaridades e implementaciones del proceso tcnico en cuestin (Los profesionales se sirven de l para el intercambio de informacin). 2. Alejar a los intrusos, aficionado y otros posibles merodeadores. Como todos sabemos las jergas profesionales complejas e ininteligibles, crean una barrera de incomprensin entre iniciados y nefitos. Algunos profesionales (que no todos, por supuesto) tienden a refugiarse en el oscurantismo del lenguaje para encubrir su ineficiencia. Como era de esperar OOPS no poda resultar ajeno a esta regla universal. Eso explica el incontrolado florecimiento de infinidad de palabrejas, a cul ms rara e intil, cuya inmensa mayora son fruto de brbaras traducciones anglosajonas. De todos modos, ya que existe ese vocabulario (absolutamente necesario por cierto), usmoslo; pero sin renunciar a explicaciones en lenguaje llano, que son de agradecer. La experiencia indica que existen excelentes programadores que manifiestan su total incapacidad de entendimiento a la hora de trabajar con objetos. En la mayora de los casos ese aparente bloqueo es motivado por un exceso de vocabulario inconexo y mal digerido. 11.3. Conceptos bsicos. NOCIONES BASICAS. En este apartado vamos a tratar de definir algunas cuestiones bsicas de la programacin orientada a objetos20. Nos centraremos ya en definiciones tcnicas olvidndonos de los aspectos ms filosficos planteados anteriormente. Objeto Un objeto es un conjunto de cdigo asociado con los datos operados por dicho cdigo. Los objetos estn encapsulados. Esto supone que tanto el cdigo como los datos que contienen son inaccesibles por otros objetos. Desde este punto de vista, un objeto es bastante similar a una funcin o a una subrutina (o procedimiento) en general. La diferencia fundamental estriba en la encapsulacin de datos. En una subrutina los datos pueden ser accedidos por otra subrutina. Esto no puede suceder nunca en un objeto. (Es decir, podemos tomar copias de los datos del objeto y manipular estas copias, pero nunca podremos accesar a los datos originales).

20

Entre otra bibliografa pueden consultarse los siguientes libros: Rebeca Wirfs-Brocks, Brian Wilkerson y Lauren Wiener, Designing Object-Oriented, publicado por Prentice Hall en 1990. Peter Coad/Edward Yourdon, Object-Oriented Analysis, publicado por Prentice Hall. Gordon Blair et al (editores), Object-Oriented Languages, System and Aplications, Pitman en 1991.

Realiz: Ing. Domingo Olivares Barrios

Pg. 206

Mensaje

Es el modo que tenemos de comunicarnos con un objeto. Los mensajes son enviados por un objeto y recibidos por otro. Los mensajes determinan el comportamiento de un objeto. Por ejemplo, puedo tener un objeto que gestione la cola de impresin de mi sistema. Un mensaje para este objeto sera comienza la impresin.(Podramos decir que son palabras o claves que representan instrucciones u ordenes para que se active un procedimiento o funcin interna del objeto, y que con esto dicho objeto se comporte o haga lo que nosotros deseamos). Es un algoritmo que contiene los pasos necesarios que han de ejecutarse como respuesta a un mensaje. Si ya dijimos que un objeto es similar a una funcin, igualmente hemos de decir ahora que un mtodo tambin lo es. Ya dijimos que los objetos estn compuestos de cdigo y datos, pues bien, el cdigo no es ms que un conjunto de mtodos. Algo as como un grupo de procedimientos dentro de otro principal. Una clase es un objeto que tiene como propiedad la de poder crear otros objetos, dotndoles de una peculiar herencia. Todos los objetos de una clase reciben de sta sus rasgos comunes. (Se puede decir que podemos obtener copias de un objeto y agregarle nuevos mtodos y mensajes, tal y como lo hacemos algunos programadores, con los procedimientos que creamos. Los copiamos y les agregamos ms parmetros y procedimientos internos.).

Mtodo

Clase

De lo anterior, y en mi, quizs, parco conocimiento del tema; podriamos decir (y perdneme los programadores de alto nivel), que los objetos no son otra cosa que procedimientos o funciones que contienen otros procedimientos o funciones (llamados mtodos) los cuales podemos hacer que se comporten de la manera que necesitamos a travs del paso de ciertos parmetros (llamados mensajes); y que, adems, fueron desarrollados por otros programadores, los cuales, para proteger su cdigo y funcionamiento nos los entregan compilados (entiendase encapsulados), y pese a ello, podemos copiarlos y agregarles en su entorno, nuevos procedimientos (lease mtodos) propios, as como nuevos pasos de parmetros (lease mensajes), para enriquecerlos. Es de notar que tambin dichos objetos nos devuelven mensajes, lo que en mi idea llamara parmetros de retorno. Contrariamente a la creencia generalizada, la programacin orientada al objeto es eminentemente prctica y sencilla. El desarrollo profesional de aplicaciones, planteado como actividad econmica plenamente rentable se han visto afectado de manera muy positiva por la aparicin de OOPS. Antes de continuar, vamos a apuntar cuales son las dos lneas maestras de esas mejoras: 1. ENCAPSULACIN: La definicin de variables y procedimientos Locales (LOCAL) y Estticos (STATIC), dentro de los lenguajes de programacin (como Clipper o Pascal), permite procesar datos de manera mucho ms autnoma y cerrada. A la hora de reutilizar cdigo, se tiene que prestar especial atencin a posibles declaraciones duplicadas de variables Privadas o Pblicas, y por supuesto a los nombres de las funciones o procedimientos (Siempre transparente desde cualquier parte de una aplicacin). Casi siempre, se inicia la bsqueda Pg. 207

Realiz: Ing. Domingo Olivares Barrios

desesperada de nuevos apellidos para nuestras funciones, cuando se hacen mdulos de gran tamao. A partir de los lenguajes de programacin orientados al objeto, se permite una mayor autonoma de datos y funciones gracias precisamente a los dos nuevos conceptos. El calificativo de Local (LOCAL) solo afecta a variables, sin embargo el de Esttico (STATIC) se refiere a variables y funciones (o procedimientos). Tal como se ver ms adelante, OOPs apunta claramente en la misma direccin. 2. REUSABILIDAD: El sueo de todo programador responde a la imagen de un personaje montando aplicaciones a base de cortar trozos de cdigo existente, pegndolos en el menor tiempo posible, y convirtiendo el resultado en algo vendible (a poder ser, caro). Aunque la cruda y diaria realidad sigue alejada de esa utopa, OOPS es sin duda el mejor camino hacia ella. De momento, las ventajas de reutilizar cdigo son bsicamente dos: Un ahorro considerable de tiempo: Todos los procesos bsicos se escriben una sola vez. Una mayor seguridad ante posibles errores: Los mdulos que se reutilizan han sido probados y depurados con anterioridad en otras aplicaciones.

Prcticamente todo lo dicho hasta el momento, es sobradamente conocido por cualquier programador experimentado. Llegados pues a este punto, es necesario hacer un mnimo esfuerzo de desmitificacin, ya que muchos han exagerado hasta el punto de hablar de tcnicas revolucionarias cuando citan OOPS. Nada mas lejos de la realidad! Programar en un lenguaje de programacin con orientacin al objeto, es dar un paso mas, no un salto al vaco, como quiz algunos temen. De momento, las clases que traen consigo los lenguajes orientados al objeto, nos permiten realizar programas eficientes y en poco tiempo, a pesar de ello, los fabricantes nos han ahorrado la molestia de estudiar sus fuentes, ya que los mismos no aparecen en ninguna documentacin. Un experto puede imaginarse cmo funcionan, pero al programador de a pie slo le queda el consuelo de conducirlas sin poder abrir el cap y ver el motor. Lgicamente estas clases que se pueden llamar estndar, llaman a funciones, generalmente, indocumentadas de algn enigmtico mdulo interno. Debo reconocer, que todo esto nos ha ahorrado un mundo de trabajo a los viejos programadores; y a los nuevos, un sinnumero de desvelos para comprender los intrincados y torcidos caminos de la programacin, en aquellos viejos lenguajes y formas de programar.21 11.4. Clarificando conceptos. 11.4.1. - Qu es una clase ? El concepto de CLASE es siempre abstracto. Dentro de un programa, no
21

Nota del autor.

Realiz: Ing. Domingo Olivares Barrios

Pg. 208

manipulamos clases, utilizamos objetos derivados de ellas. Se hubiesen podido llamar familias o especies, pero como no hemos sido invitados al bautizo, es intil perder el tiempo discutiendo sobre el acierto del nombre. Usndolas tales como fueron presentadas al mundo, es decir sin posibilidad de manipulacin posterior, debemos tener bien claro lo siguiente: todos los objetos de una misma clase tienen los mismos mtodos, y por consiguiente responden de manera similar a los mismos requerimientos. Se diferencian por el contenido de sus variables de instancia, es decir de sus datos. 11.4.2. - Qu es un objeto ? Un objeto es un conjunto de datos y mtodos. Se da el caso de algunas clases de objetos que excepcionalmente no tienen mtodos (la clase error por ejemplo, solo contiene datos). Debemos aclarar que los datos de un objeto han sido bautizados como variables de instancia exportadas (Ver Guas Norton de Clipper 5.01 en castellano). Este no nos parece un nombre excesivamente acertado, pero no tenemos ms remedio que usarlo a fin de compatibilizar conceptos. Las variables de instancia pueden ser de tres tipos: Lectura Escritura. En este caso estaran los campos que pueden ser ledos y asignados. Solo lectura. Son variables internas como por ejemplo en este caso el nmero de registro, que slo puede ser leda por nosotros, y cambia su estado en funcin de los desplazamientos del puntero a travs de la base de datos. Ocultas (de uso interno). Son todas aquellas que no vemos, y que el objeto utiliza para sus procesos internos. Este sera el caso del nmero de manipulador de archivos(handle) que el Sistema Operativo asigna al rea en curso, el array que contiene los nombres de los campos, etc.

Los mtodos, tal como ha quedado dicho, determinan los procesos propios de su clase. 11.4.3.- El concepto de herencia. Las clases seran muy poca cosa, si se limitaran a lo visto. Ahora por fin, vamos a ver no solo algo nuevo, sino lo mejor y mas interesante de OOPS: la herencia. Gracias a ella, podemos tomar una clase y derivar hacia otra que hereda sistemticamente sus datos y mtodos. La nueva clase puede aadir nuevos datos y mtodos a la existente, o sencillamente sustituir los actuales por otros. Un simil de esto, es cuando creamos una funcin para mostrar datos en pantalla, y creamos una nueva funcin en donde llamamos la funcin primaria, a la cual le agregamos nuevas caractersticas funcionales. 11.4.4.- El concepto de jerarqua. Si hemos comprendido la herencia como relacin PADRE<->HIJO, poco costar entender la posibilidad de ampliar esta estructura a ms de dos niveles. En la prctica se Realiz: Ing. Domingo Olivares Barrios Pg. 209

puede crear una estructura jerrquica de clases, donde unas heredan de otras que ya han heredado. 11.5. Conclusiones. 11.5.1. Lo mejor. Esta tcnica de programacin nos permite agilizar nuestro trabajo, partiendo de clases y objetos hechos por otros programadores, lo cual nos permite ahorrar mucho tiempo de programacin, y con esto se incrementa nuestra productividad. Y aunque no resuelve todas nuestras expectativas, de crear soluciones rpidas y eficientes; sin embargo nos abre un poco los ojos sobre la infinita capacidad de esta nueva tcnica. La herencia nos permite ir complicando las cosas hasta alcanzar clases muy completas partiendo de otras llamadas bsicas. Una buena estructura jerrquica es una potentsima herramienta de desarrollo. 11.5.2. Lo peor. Puesto que, cualquier implementacin seria, basada en herencias mltiples, requiere infinidad de punteros, y consume grandes recursos de hardware (velocidad y memoria). Quienes han intentado desarrollar aplicaciones completas totalmente basadas en OOPs, han debido desistir ante la evidencia de un fracaso anunciado. Los constantes Swapps a disco y memoria enlentecen considerablemente los mdulos, y adems lentitud y consumo de memoria son enemigos mortales de las redes, etc. Sin embargo, los grandes avances tecnolgicos en el hardware y algunos de software, nos estan permitiendo salvar de una manera o de otra estos problemas. 11.5.3. Posibles soluciones. La mayora de las desilusiones de los seres humanos son debidas a sus exageradas expectativas. La programacin orientada al objeto, es lo que es, y no tiene la culpa de que muchos de nosotros hayamos sido lo suficientemente insensatos como para elevarla al rango de panacea universal. El nico camino para rentabilizarla pasa por un profundo conocimiento de su potencia y de sus debilidades. Partiendo de una base slida, y armndonos de paciencia, podremos optimizar nuestro trabajo mezclando programacin convencional y OOPS, lo que sin duda nos permitir estar preparados para lo que se nos viene encima.

Realiz: Ing. Domingo Olivares Barrios

Pg. 210

12. - Introduccin a la Programacin dirigida por eventos.


Nadie duda ya a estas alturas, que hacerle la vida ms fcil al usuario ha dejado de ser un capricho del programador para ser una exigencia de aqul. Nuestros programas han de tener, dentro de lo posible, una interfaz de usuario agradable a la vista, intuitivo y sencillo de manejar. Una de esas cosas que hacen la vida ms fcil al usuario es el RATON (MOUSE en ingls-). Generalmente se utilizan, una serie de funciones que llaman a algunos de los servicios de la interrupcin 33H22, encargada del control del ratn. Con ellas podemos saber que est ocurriendo con ese animalejo que tenemos encima de la mesa pillado por el rabo, y actuar en consecuencia. Afortunadamente, en la actualidad, dichas funciones ya estan provistas en los presentes sistemas operativos, lo cual nos facilita la vida como programadores, teniendo solo que preocuparnos de activar o desactivar y programar las acciones que se deben realizar cuando se mueva el ratn o se pulse alguno de sus botones. El trmino <<programacin conducida por eventos>> ser algo frecuente cuando programemos en Microsoft Windows- u otro sistema operativo visual23. En la programacin conducida por eventos, es el usuario quien decide cmo ser ejecutado el programa; este tipo de programacin difiere de la programacin por lotes, donde un programa es ejecutado desde arriba hacia abajo. Qu beneficios nos ofrece la programacin conducida por eventos como desarrollador y como suministrador de soluciones? Primero, hace que las aplicaciones sean ms fciles de crear y depurar, porque slo desarrollamos pequeas porciones. En segundo lugar, ofrece consistencia, porque se utiliza en todos los entornos de programacin Windows o visuales, especialmente en aplicaciones VBA (Visual Basic para Aplicaciones). A lo largo de todo este capitulo, presentaremos ejemplos que siguen el acercamiento a la programacin conducida por eventos (el mejor acercamiento para crear aplicaciones basadas en Windows, que es lo ms comn). Para poder entender la diferencia entre la programacin por lotes y la programacin conducida por eventos, pensemos en una aplicacin como si se tratase del men de un restaurante. El acercamiento a la programacin por lotes nos sirve cada elemento en cada pgina del men en una secuencia, uno a uno, hasta que se nos haya servido toda la lista del men. La programacin conducida por eventos nos permite elegir nicamente los <<elementos de men>> que queramos es decir, slo se ejecutarn las partes de programa que queramos-. Este tipo de acercamiento habitualmente se presenta al usuario con una seleccin de botones de rdenes, elementos de men y botones de barra de herramientas. En la programacin conducida por eventos, nuestra aplicacin responde nicamente a las acciones del usuario. Ms adelante en este tema, cuando empecemos a estudiar los objetos ms comunes (por ejemplo, formularios e informes) en los lenguajes visuales, veremos varios eventos para cada objeto. Cada uno de los eventos para un objeto concreto cubrir casi cualquier accin del usuario que se pueda aplicar a ese objeto. Por ejemplo, en el entorno Windows el usuario podr ejecutar
Se les llama interrupcin, a algunos procedimientos que realiza el microprocesador al activarse algun bit dentro de una regin especifica de memoria, tal como la 33H, en hexadecimal. 23 Comnmente, se les llama Visuales, a todos aquellos sistemas operativos, lenguajes de programacin, o programas, que nos dan una presentacin grfica de la informacin. Tales como los productos de Microsoft, cuyo ejemplo ineludible es, su ahora, sistema operativo Windows.
22

Realiz: Ing. Domingo Olivares Barrios

Pg. 211

mltiples eventos utilizando nicamente el ratn, como se muestra en la siguiente tabla.

Realiz: Ing. Domingo Olivares Barrios

Pg. 212

Evento de Ratn Click DoubleClick MouseMove MouseDown y MouseUp

Accin del usuario El usuario pulsa el botn izquierdo del ratn una sola vez. El usuario pulsa el botn izquierdo del ratn dos veces en una rpida sucesin. El usuario mueve el ratn mientas que ste est sobre un objeto. El usuario pulsa o libera un botn del ratn. Un programa en lenguaje visual puede atrapar esto para el botn izquierdo o para el botn derecho (contexto secundario) del ratn.

NOTA: El ratn esta habitualmente configurado para ser operado con la mano derecha. En esta configuracin, el botn de la izquierda es el botn de seleccin y el botn de la derecha es el botn de contexto secundario. Podremos cambiar la orientacin del botn utilizando el Panel de Control, para el caso de Microsoft Windows. Los lenguajes visuales y los programas desarrollados en estos, reciben las propiedades de ratn de Windows. Como resultado, no se necesita ninguna codificacin especial de los eventos de ratn para usuarios diestros o zurdos. La mayora de los usuarios en un entorno Windows utilizan el ratn para ejecutar la mayora de las acciones. Pero para acomodarse a aquellos que prefieran utilizar el teclado, Microsoft en sus diversos productos de programacin y paqueteras, nos permite reconocer, o atrapar, eventos de teclado. La siguiente tabla lista algunos de los eventos de teclado ms comunes. Evento de teclado KeyPress Accin del usuario El usuario pulsa una tecla del teclado y un programa en lenguaje visual puede determinar qu tecla ha sido pulsada. El evento KeyPress capturar nicamente los caracteres ANSI estndar, tales como letras del alfabeto ingls. El usuario pulsa o libera una tecla sobre el teclado. Estos eventos de teclado pueden atrapar las pulsaciones de teclado no capturadas por el evento KeyPress, tales como las teclas de funcin y las de navegacin.

KeyDown y KeyUp

Observe que los nombres de los eventos de ratn y teclado son simples y realmente descriptivos del evento. Esta intuitividad hace que la programacin en el entorno de programacin conducida por eventos de los lenguajes visuales resulte lgica y fcil. El desafo consiste en anticipar qu eventos estar ejecutando el usuario sobre un objeto concreto. En el entorno de los lenguajes visuales, estaremos escribiendo la mayor parte de nuestro cdigo orientado a eventos para los formularios y para los controles que estos contengan. El evento Click es el ms comnmente usado por el objeto botn de orden, pero no sera el nico permitido. Algunos de los eventos disponibles para el objeto botn de orden, en los diversos lenguajes visuales, podremos encontrar los que se listan a continuacin.

Realiz: Ing. Domingo Olivares Barrios

Pg. 213

Eventos.
1. Al entrar 2. Al salir 3. Al recibir el enfoque 4. Al perder el enfoque 5. Al hacer click 6. Al hacer doble click 7. Al bajar el mouse 8. Al mover el mouse 9. Al subir el mouse 10. Al bajar una tecla 11. Al subir una tecla 12. Al presionar una tecla Ahora es cuando comienza el desafo. Desde esta lista de ejemplo, qu eventos utilizaremos? Por ejemplo, la ilustracin anterior lista los eventos para un objeto Botn de orden, de un lenguaje visual. Si escribisemos cdigo para el evento DoubleClick de un Botn de orden, puede que el usuario jams active el evento, debido a que el procedimiento convencional de un Botn de orden es siempre una nica pulsacin. Y cmo escribiremos cdigo para mltiples eventos? Tendremos que conocer el orden en el que se producen estos eventos. Por ejemplo, si tenemos cdigo en el evento Click y en el evento DoubleClick, cuando el usuario pulse dos veces sobre el Botn de orden, el evento Click siempre se producir antes que el evento DoubleClick, debido a que la primera pulsacin de un doble click se detecta como una sola pulsacin o como un evento Click. Qu ocurrir entonces si escribimos cdigo adicional para los eventos MouseUp y MouseDown del Botn de orden? Qu evento se activara primero? Conocer el orden de los eventos es algo crucial en la programacin conducida por eventos. Si no conocemos el orden en el que se producen los eventos, nuestro cdigo nos podr devolver unos resultados impredecibles. Una forma de obtener una lista completa con explicaciones sobre el funcionamiento o el orden de los eventos, es consulta el tem <<Orden de eventos>> en la Ayuda interactiva del lenguaje visual, por ejemplo VBA24 (Visual Basic para Aplicaciones). Por ahora, creo que es todo lo que podemos tratar, a manera de una simple introduccin. Si usted querido lector desea profundizar en esta tcnica de programacin que, por cierto, actualmente es muy popular y est ampliamente difundida, le recomiendo, iniciarse con Microsoft Access; que si bien, no es un lenguaje de programacin, si es un potente gestor de bases de datos, que incluye el VBA, que le permite realizar aplicaciones altamente profesionales.

El lenguaje Visual Basic para Aplicaciones, normalmente es suministrado por Microsoft en sus productos, tales como MS Office.

24

Realiz: Ing. Domingo Olivares Barrios

Pg. 214

13. - Documentacin de programas.


Generalmente, un programa es parte de un proyecto mucho ms grande, al cual normalmente se le conoce como sistema de informacin, o simplemente sistema. Aunque es esencial la creacin de diagramas de flujo para la planeacin de un sistema o programa, solo es parte de la documentacin que se requiere en una compaa. En cada compaa existen estndares propios para la documentacin y las formas que se emplean varan hasta cierto punto de una compaa a otra. No importa cual sea el formato, el concepto fundamental es el deseo de comunicar informacin acerca de un programa o de todo un sistema en la forma mas completa y eficiente posible. Dentro de una organizacin los programadores y analistas de sistemas cambian de puesto o lo abandonan, pero los proyectos en que trabajan permanecen como parte del sistema de procesamiento de datos de la compaa. Conforme se realizan modificaciones dentro de la compaa, estos sistemas y programas requieren revisin. Si el programa o sistema no se ha documentado, entonces las modificaciones necesitaran una cantidad excesiva de tiempo. Este tiempo extra se necesita para localizar y seguir todos los detalles del proyecto. Dentro de la documentacin bsica de un sistema o programa, se deben elaborar tres tipos de manuales: a) Manual del sistema. Dirigido al lider del proyecto de sistematizacin. b) Manual del programa. Dirigido al programador. c) Manual del usuario. Dirigido, como su nombre lo indica, al usuario final. 13.1.- Manual del Sistema. El manual de un sistema siempre se desarrolla, mucho antes que los manuales de los programas, dado que para el desarrollo u optimizacin de un sistema, se requiere un trabajo previo llamado Anlisis y Diseo del Sistema. Dicho trabajo normalmente es realizado por los llamados, propiamente, analistas de sistemas; quienes desarrollan el o los manuales del sistema y de los programas. De tal manera que se utilizan los manuales del sistema como apoyo y los manuales de programas para entregarlos a los programadores como cuadernos de carga, en los cuales se describen detalladamente los programas que se debern desarrollar. Invariablemente los manuales de los programas, tambin llamados cuadernos de carga, sern complementados con informacin que anexar el programador. Dependiendo de la tcnica de anlisis utilizada, se tendr la estructura del o los manuales del sistema. Una de ests tcnicas, por ejemplo, incluye lo que seran tres capitulos dentro del manual del sistema, como son: 1. Anlisis Previo. 2. Anlisis Funcional. 3. Anlisis Orgnico. Sin embargo, el Anlisis y Diseo de Sistemas, ser otra materia interesante y digna de estudio por parte del lector25.
25

Sistemas de Informacin Gerencial. Autor: Ing. Domingo Olivares Barrios.

Realiz: Ing. Domingo Olivares Barrios

Pg. 215

13.2. - Manual del programa. Los elementos ms comunes de documentacin son: 1. Nombres de los archivos de datos, y los programas que los usan. 2. Descripcin de los registros de los archivos de datos. 3. Tablas de impresin. 4. Narrativa del programa. 5. Hoja de corrida. Cuando un programa se ha completado (escrito y probado), se separa un paquete de documentacin. Se preparan versiones finales de los elementos antes mencionados y se agregan los que siguen: 1. Una tabla del contenido del paquete de documentacin. 2. Diagrama de flujo. 3. Un listado de programa fuente (listado del programa, segn lo codifico el programador, producido por la "mquina"). Esta es la versin final del programa fuente despus de que se han corregido todos los errores y el programa ha producido la salida correcta. 4. Muestras de los informes impresos producidos por el programa y, en particular, cualesquiera formas especiales previamente impresas que puedan utilizarse al producir la salida. 5. Un diagrama de flujo del sistema puede incluirse para mostrar a que parte del sistema corresponde este programa. 13.3. - Manual del usuario. En este caso se desarrolla un manual explicando el funcionamiento del programa, y como deber usarlo el usuario. Las explicaciones debern ser claras y sencillas, de tal manera que sea fcil de entender, inclusive por cualquier persona que no tenga un gran conocimiento de computacin, o definitivamente desconozca el manejo de un equipo de computo. Los manuales individuales de los programas, se integraran en un nico manual del usuario, es decir, el manual del sistema. Este manual del usuario o gua del usuario, como le llaman algunos, debe tratar de por lo menos algunos de los siguientes puntos: Prefacio. Con una explicacin general del objetivo del sistema o programa, sus Realiz: Ing. Domingo Olivares Barrios Pg. 216

requerimientos de hardware y software, as como las convenciones establecidas en cuanto a los tipos de letra utilizados en el manual para hacerlo ms explicito. Por ejemplo, en un manual se podra establecer lo siguiente para el usuario: Convencin Negrita Cursiva Significado En los procedimientos, indica el texto que usted escribe ndica un trmino del glosario.

As mismo, deber contener informacin acerca del lugar o persona de contacto para obtener soporte tcnico. Introduccin (o bienvenida). Con una breve descripcin acerca de las facilidades del programa o sistema, o bien, de las innovaciones, si es que es una versin actualizada. Capitulos de las opciones (uno para cada opcin principal del programa). Por lo menos se deber dedicar un capitulo a cada una de las principales opciones del programa o sistema. Dichos capitulos y el nmero de stos se desarrollarn a criterio del equipo de trabajo que desarrolla los manuales del sistema o programa. Apndices (si son necesarios). Que contendrn informacin adicional acerca de temas o informacin indirectamente relacionados al programa o sistema. Glosario. Con definiciones de trminos tcnicos y conceptos. ndice (temtico o alfabtico). Obviamente con los nmeros de pgina en donde se encuentra la informacin que requiera el usuario.

Realiz: Ing. Domingo Olivares Barrios

Pg. 217

SOLUCIONES
Como habr podido observar, estimado lector, los captulos previos a ste, son bastante extensos; as que por razones de espacio y con la idea de permitir que practique en el desarrollo de soluciones o programas, aqu solo se plantean las soluciones a desarrollar, sin embargo, el desarrollo de cada una de ellas, as como los cdigos fuente de los programas y algunos lenguajes de programacin, se encuentran en el CD que acompaa a esta obra. Por lo que respecta a los compiladores e interpretes de los lenguajes de programacin incluidos, es conveniente y recomendable que se documente con bibliografa relativa a aquel que vaya a utilizar, y que incluya una relacin descriptiva y estructurada de los comandos e instrucciones del lenguaje. Las versiones de los lenguajes proporcionados, tal vez ya no sean tan populares ni utilizadas, sin embargo, se prestan perfectamente para iniciar una buena trayectoria a un nuevo programador. Las soluciones propuestas para desarrollar, van incrementando su grado de dificultad y estn enfocadas para que el lector aplique algunas de las herramientas de programacin aprendidas, y as mejore su comprensin al respecto. LINEALES 1. Disear un programa que calcule el rea de un tringulo. 2. Cual es el costo por metro cuadrado de mi parcela?, si el precio es de $ 20,000.00. Las medidas son: Largo = 100 pies, Ancho = 80 pies, 1 pie = 0.305 mts. 3. Disear un programa que sume dos quebrados, y muestre el resultado en forma de quebrados. 4. Disear un programa que calcule el promedio final del nivel, el cual consta de tres materias: Introduccin a la computacin, Sistema Operativo y Lenguajes Algortmicos. 5. Encontrar la media ponderada de tres puntuaciones de exmenes. Los pesos asociados son: 30 %, 30 % y 40 %. 6. Calcular la edad de una persona, en una fecha determinada. TOMAS DE DECISION 7. Disear un programa que diga cual de dos personas es la mayor. 8. Muchas universidades hacen que a los estudiantes del primer curso que estn a punto de suspender una asignatura se les d un aviso. Usted ha de calcular media de las puntuaciones de tres exmenes e imprimir el nmero de control del estudiante, la media y si el estudiante ha pasado o no. Para pasar se necesita una media de 60 puntos como mnimo. Si el estudiante ha pasado, pero con menos de 70 de media, indicar que el o ella esta dudoso. 9. Disear un programa que acepte 3 nmeros diferentes por teclado y despliegue el nmero mayor. Si en la entrada algn nmero es igual entre s deber ser rechazado.

Realiz: Ing. Domingo Olivares Barrios

Pg. 218

10. Hacer un programa que pida tres nmeros enteros. Si el primero es negativo, desplegar el producto de los tres. Si no desplegar la suma de los tres. 11. Disear un programa que diga cual es el mayor de tres nmeros. a) Suponiendo que los tres nmeros son iguales. b) Suponiendo que dos o los tres pueden ser diferentes. 12. Hacer un programa que pida la temperatura y despliegue el deporte que es apropiado hacer a esa temperatura usando la siguiente tabla: DEPORTE Natacin Tenis Golf Esqu Damas chinas TEMPERATURA (GRADOS FAHRENHEIT) Temperatura > 85 70 < Temperatura <= 85 32 < Temperatura <= 70 10 < Temperatura <= 32 Temperatura <= 10

13. Disear un programa que calcule el pago por consumo de energa elctrica, segn la siguiente tabla: CONSUMO (KW/H) HASTA 15 LOS SIGUIENTES 60 MAS DE 75 CUOTA POR KW/H $ 1.50 $ 2.00 $ 2.50

14. Calcular la hora de llegada a su destino de los siguientes vuelos: VUELOS Veracruz Mxico Veracruz - Mrida Veracruz Xalapa Veracruz Monterrey Veracruz Guadalajara Veracruz - Salina Cruz Veracruz Montreal Veracruz Tokio Veracruz Washington TIEMPO 35 min. 1 hr. 20 min. 10 min. 2 hr. 18 min. 4 hr. 48 min. 2 hr. 25 min. 5 hr. 30 min. 8 hr. 40 min. 4 hr.

CONTADOR O BUCLE FOR, WHILE O REPEAT 15. Realizar un programa que efecte la suma de 15 nmeros dados por teclado y despliegue el resultado.

Realiz: Ing. Domingo Olivares Barrios

Pg. 219

TOMAS DE DECISION Y CONTADORES 16. Disear un programa que genere y despliegue los nmeros del 1 al 100. 17. Disear un programa que simule el juego de ROCA - PAPEL - TIJERA. Para dos jugadores, a ganar tres juegos; los empates no cuentan. 18. Disear un programa que nos d el total de votos obtenidos por cada partido en las elecciones para presidente, y cual fue el partido ganador. Los partidos participantes son: PRI, PAN y PRD. 19. Disear un programa que lea los resultados de los exmenes de veinticinco alumnos y nos diga cuantos obtuvieron las siguientes calificaciones: ACIERTOS 95 100 85 94 75 84 65 74 0 64 CALIFICACION A: EXCELENTE B: MUY BUENO C: BUENO D: REGULAR E: MALO, REPROBADO

20. Disear un programa que clasifique a las personas, segn su edad y sexo, y nos diga cuantas integran cada grupo segn la siguiente tabla: EDAD 0 13 14 18 19 25 26 35 36 55 56 en adelante GRUPO nios adolescentes jvenes adultos jvenes personas maduras personas mayores

21. Disear un programa que haga un examen de 10 preguntas y d el nmero de buenas, el nmero de malas y la calificacin obtenida segn una escala de 0 a 100. 22. Disear un programa que simule un cajero automtico, dando cambio en las siguientes denominaciones: BILLETES $ 100 $ 50 $ 20 $ 10 $5 MONEDAS $ 2.00 $ 1.00 $ 0.50 $ 0.20 $ 0.10

Realiz: Ing. Domingo Olivares Barrios

Pg. 220

TOMAS DE DECISION Y ACUMULADOR 23. Disear un programa que calcule el promedio de las ventas mensuales de un empleado (seis meses), para que de acuerdo a la siguiente tabla se pueda calcular su comisin correspondiente: PROMEDIO <= $ 5,000 PROMEDIO > $ 5,000 PROMEDIO > $ 10,000 COMISION: 3 % COMISION: 5 % COMISION: 8 %

24. Disear un programa que nos permita simular un sistema de apartado de ropa, dejando un 15 % de su costo total y a pagar en un mes. BANDERA 25. Dada una serie de nmeros cualesquiera, encontrar el nmero mayor. BANDERA, ACUMULADOR, Y CONTADOR 26. Disear un programa que pida la temperatura de cada hora del da, y que encuentre la temperatura promedio y las temperaturas ms alta y ms baja del da. SALIDA POR OPCION 27. El Instituto Mxico desea que se capturen los siguientes datos de los alumnos: Matricula, nombre, calificacin 1, calificacin 2. Para calcular y desplegar sus promedios. Se debe considerar la opcin de continuar. SALIDA POR CENTINELA 28. Realice un programa para simular el proceso que realiza una caja registradora. El supermercado " Las Amricas " hace un descuento del 10% a los artculos marcados con la clave " AL79 " y un 15% a los artculos que tienen la clave " AM80 ". Desplegar el total de la compra y aplicar centinela para finalizar. OPERACIONES CON MATRICES 29. Disear un programa que solicite valores y los almacene en una matriz. 30. Disear un programa que solicite valores numricos, los almacene en una matriz cuadrada, y obtenga la suma de los elementos de la diagonal principal.

Realiz: Ing. Domingo Olivares Barrios

Pg. 221

APENDICE A
LIBRERIAS
NECESIDAD DE LAS LIBRERIAS. El uso de las libreras es absolutamente necesario en la construccin de aplicaciones de gestin. El motivo fundamental es el importante ahorro de espacio de disco y de memoria que esto conlleva en la mayora de los casos. Otro aspecto a tener en cuenta es el tiempo de programacin que se gana si cada tarea que se repita, al menos una vez, a lo largo de una aplicacin, se guarda en una librera y se la llama cada vez que la necesitemos, en vez de reprogramarla. Muchas veces nos encontramos con la necesidad de realizar alguna tarea determinada y no disponemos de ninguna funcin en las libreras del compilador que la realice. Si se prev esta tarea ms veces, se compila, se aade a una de nuestras libreras y cada vez que la necesitemos, enlazamos nuestros programas con ella, sin preocuparnos de nada ms. El enlazador se encargar de buscarla dentro de la librera y aadirla al ejecutable dejando las que no necesite para otra ocasin. Si poseemos un conjunto de rutinas compiladas con las que enlazamos nuestros programas de forma habitual, estaremos aadiendo espacio innecesario a los ejecutables, a no ser que las utilicemos todas. El enlazador aade al ejecutable todo el cdigo de los mdulos compilados, los use o no, mientras que con las libreras slo aade la parte del cdigo que necesita. Si poseyramos todas nuestras rutinas compiladas por separado en mdulos objeto y tuvisemos la precaucin de enlazarlas una por una con nuestro programa cuando ste las necesite, estaramos haciendo exactamente la misma funcin que hace el enlazador con una librera. CONSTRUCCION DE LIBRERIAS. Existen varios (programas) utilitarios en el mercado para la construccin de libreras, por ejemplo el programa LIB.EXE que viene junto a varios productos de Microsoft, o el TLIB de Borland que viene junto a Turbo C. El uso de stos y las tcnicas a seguir para la construccin de libreras son relativamente simples.
Cdigo fuente Compilador Cdigo objeto Constructor de libreras

Librera

REGLAS BSICAS. Para disear una librera no basta con conocer bien la mecnica de funcionamiento del programa constructor de libreras. Hace falta tambin seguir una serie de normas que optimicen el uso que ms tarde se har de nuestro programa. Algunas de estas normas bsicas a observar son:

Realiz: Ing. Domingo Olivares Barrios

Pg. 222

Hemos de procurar que las funciones estn bien documentadas, sobre todo en lo que al funcionamiento se refiere, para que cualquiera que utilice la librera no tenga dudas a la hora de usarlas. Hay que intentar planificar bien los mdulos de manera que al enlazarlos con el resto de la aplicacin no ocupen espacio de ms. Llevando esto a una situacin extrema, lo mejor es que cada funcin sea un mdulo objeto distinto. Sin embargo, esta tcnica hace crecer el tamao de la librera y deja un gran nmero de objetos desperdigados por el disco duro, por lo que a veces es mejor pensar en mdulos que agrupen a varias funciones. Esto ltimo es adecuado: Cuando hay un grupo de funciones que se supone que si se utiliza una, se utilizarn las dems. Por ejemplo, si usamos funciones para controlar el ratn, est claro que al emplear una que detecte la pulsacin del botn derecho tambin usaremos otra para detectar la pulsacin del botn izquierdo. Cuando el cdigo de un grupo de funciones sea muy pequeo y suponga un aumento despreciable de nuestro ejecutable. En caso de agrupar funciones en un mismo mdulo objeto es aconsejable que traten de un mismo tema para mayor facilidad a la hora de localizarlas. No utilizar variables PRIVADAS o PUBLICAS, o sin declarar previamente, para optimizar espacio de ejecutable y memoria, y no interferir en las variables que declaren en sus aplicaciones los programadores que la usen. Declarar ESTATICAS las funciones auxiliares internas de la librera que no se usen para el resto de los programas. Hemos de procurar tambin que las funciones de nuestras libreras estn bien depuradas y pasen pruebas completamente rigurosas. Establecer un cdigo de error que devuelvan las funciones cuando algo no vaya bien, por ejemplo 1. Este cdigo no tiene por que ser el mismo para todas, pero s tiene que ser (dentro de lo posible) del mismo tipo de dato que el que devuelve cuando su ejecucin es normal. LAS LIBRERIAS Y LOS GRUPOS DE TRABAJO.

Cuando trabajamos en equipo, y esto suele ser lo habitual, es lgico que cada programador no tenga que repetir el trabajo realizado por los otros. Por ello es bueno que exista para la empresa, el grupo de trabajo, el proyecto o al nivel que nos parezca oportuno, una librera comn donde vayan a parar todas las rutinas de utilidad comunes. Es muy importante que la creacin y el mantenimiento de esta librera se haga de un modo reglamentado para facilitar su buen uso y funcionamiento. Pensemos en una empresa cualquiera (Chapuzas, S. A.) que se dedica al desarrollo de aplicaciones en Clipper. Cuenta con 8 desarrolladores distribuidos en 3 proyectos. Existe un responsable cada proyecto as como uno de todo el grupo (Director Tcnico). Un modelo de la organizacin para la gestin de una librera comn podra regirse por las siguientes normas: 1. Debe haber una librera comn CHAPUZAS.LIB para todos los desarrollos que la empresa lleve adelante. La responsabilidad ltima del uso y mantenimiento de esa librera es del Director Tcnico. No obstante, deber existir una Comisin de Control de Calidad encargada de la decisin de incorporacin de funciones ya desarrolladas y del planteamiento de la necesidad de nuevas Realiz: Ing. Domingo Olivares Barrios Pg. 223

funciones. Esta comisin se reunir con carcter semanal. Uno de sus miembros ha de ser el desarrollador encargado de mantener fsicamente la librera. En sus manos estar no solo la documentacin de las funciones desarrolladas por otros sino tambin la de la creacin de nuevas funciones a peticin de la Comisin de Control de Calidad. 2. Cualquier funcin que se incorpore a la librera debe estar documentada y probada. La documentacin debe constar de: Nombre de la funcin. Fecha de creacin. Nombre del creador. Fecha de cada modificacin. Nombre de cada modificador. Parmetros que usa con explicacin detallada de los tipos, valores y funciones de cada uno de ellos. Lo devuelto en caso de error. Si maneja bases de datos, relacin de las estructuras e ndices. Si llama a otras funciones de la misma u otras libreras complementarias, la especificacin de la misma. Breve descripcin de la funcionalidad que realiza. Al menos un ejemplo de su uso.

3. Cuando cualquier equipo de trabajo necesite una rutina que considere necesaria para su aplicacin y que tenga el carcter genrico como para ser incorporada a la librera, y no pueda esperar a la reunin de control de calidad, podr desarrollarla por s mismo e incorporarla a su cdigo como un mdulo OBJ. La comisin decidir ms tarde si: La funcin se incorpora a CHAPUZAS.LIB. La funcin no tiene inters general y, por tanto, no se incorpora a la librera aunque puede seguir formando parte de la aplicacin. La funcin puede sustituirse por otra de la librera y, por tanto, el grupo de trabajo que la maneja debe modificar su cdigo para eliminar la funcin por ellos desarrollada y adoptar la que corresponda de la librera.

Realiz: Ing. Domingo Olivares Barrios

Pg. 224

APENDICE B
PROGRAMACION SEGMENTADA Overlays estticos y dinmicos
En el pasado, el mayor problema con el que nos podamos encontrar, cuando estbamos realizando una aplicacin, es que sta no nos cupiera fsicamente en la memoria de trabajo de nuestro ordenador. El nico modo que tenamos de solucionar este problema era proceder a los que denominamos segmentacin, programacin por capas, solapes y overlays. Generalmente los overlays eran de carcter esttico. Es decir, el programador los diseaba en el momento de programar la aplicacin y, de forma independiente al sistema en que la aplicacin se implantara, los overlays quedaban dimensionados hasta que el programa se reenlazaba bajo otros criterios. Actualmente muchos lenguajes solucionan este problema mediante la tcnica de overlays dinmicos. Con estos el programador se olvida de seguir ningn criterio especial, siendo el propio sistema quien decide que parte del cdigo se posiciona en el rea de memoria principal y qu parte en el rea de overlay. Dado que los lenguajes actuales solucionan de forma automtica el problema, quiz nunca tenga que usar la tcnica de overlays estticos. Sin embargo, an algunos lenguajes y enlazadores tambin lo permiten, adems de la estndar dinmica. En ocasiones, para integrar los mdulos objetos de cdigo de diferentes lenguajes o para solucionar enrevesadas situaciones de gestin de memoria, quiz use overlays estticos. Algunos enlazadores slo gestionan overlays dinmicos para ciertos lenguajes, por ello ser muy necesario que en aplicaciones grandes donde usted integre rutinas entre lenguajes diferentes, disee reas de overlays estticos para facilitar la ubicacin de las mismas. Por todo ello vamos a explicar a continuacin como trabajar con este tipo de overlays. Cuando programamos usando esta tcnica, lo que hacemos es dividir nuestra memoria RAM en dos o ms reas de trabajo. En la primera de ellas (rea principal) se carga el mdulo ejecutable y en las reas de solape se cargan y descargan, conforme se van usando, los diferentes mdulos overlay que hayamos definido. Los overlays estticos permiten diversas configuraciones. La ms bsica es aquella que divide la memoria de trabajo en un rea principal y un rea de solape. Una segunda forma es la que la divide en un rea principal y varias de solape. La tercera, y ltima forma, es la que trabaja con un rea principal y varias de solape, teniendo alguna de stas otros segmentos anidados. Para comprenderlo mejor supongamos que una aplicacin que posee la siguiente estructura de mdulos:
PROGPRIN MODULO1 MODULO2 MODULO3 SUBMOD1 SUBMOD2

Realiz: Ing. Domingo Olivares Barrios

Pg. 225

PRIMERA FORMA AREA PRINCIPAL PROGPRIN

SEGUNDA FORMA AREA PRINCIPAL PROGPRIN

AREA DE OVERLAY MODULO1 o MODULO2 o MODULO3

AREA DE OVERLAY MODULO1 o MODULO2

AREA DE OVERLAY 2 MODULO3

TERCERA FORMA AREA PRINCIPAL PROGPRIN

AREA DE OVERLAY 1 MODULO1 o MODULO2 o MODULO3 con SUBMOD1 o SUBMOD2

Realiz: Ing. Domingo Olivares Barrios

Pg. 226

APENDICE C
VARIABLES DINMICAS.
Hasta ahora hemos manejado muchas variables, sin embargo, independientemente del tipo de datos que contengan, stas pueden ser estticas o dinmicas. Una variable esttica, que es la ms comn, existe mientras se est ejecutando la parte del programa en la que est declarada (bloque). Esto significa que aquellas variables declaradas en el programa principal estn siempre all (durante la ejecucin). Las variables declaradas en los procedimientos y funciones existen desde que se llama el procedimiento hasta que se devuelve el control a la rutina que hizo la llamada. Muchos lenguajes, tal como Pascal y C, tienen un mecanismo para crear variables dinmicas. Esto significa que se puede definir un tipo en tiempo de compilacin, pero realmente no crear una variable de ese tipo hasta el tiempo de ejecucin. Estas variables dinmicas pueden crearse o destruirse en cualquier momento durante la ejecucin del programa. Pueden definirse de cualquier tipo simple o estructurado. Referenciamos a una variable dinmica no por su nombre sino mediante un puntero. Un puntero es una variable que contiene la direccin (posicin) de memoria de la variable dinmica a la que referencia. Cada nueva variable dinmica creada tiene un puntero asociado para referenciarla (seleccionarla). Cundo son necesarias las variables dinmicas? Cuando necesitamos almacenar datos en una variable de tipo arreglo, pero con la incertidumbre del nmero de elementos a manejar; por ejemplo, si deseamos almacenar una lista de alumnos en un arreglo, sera complicado definir un arreglo esttico, si consideramos que la cantidad de alumnos por grupo es variable. Qu podemos hacer si no sabemos cuntas componentes necesitaremos? Podemos siempre dar una longitud y preveer en el programa que pueda ocurrir un error al tratar de almacenar datos cuando el arreglo est lleno. Qu hacemos si queremos que una lista de componentes est almacenada de una forma ordenada? Haremos algoritmos para ordenar arreglos. Cmo insertar o suprimir una componente? La insercin o supresin de componentes de una arreglo supone el desplazar parte del arreglo una componente en una u otra direccin. Si la lista (arreglo) es muy larga, la insercin o supresin de componentes necesitar una cantidad significativa de tiempo. Podemos usar variables dinmicas para evitar estos problemas de las variables estticas tales como el arreglo. Podemos crear nuevas componentes para nuestra lista slo cuando se necesiten, usando variables dinmicas como componentes. Haciendo que cada componente contenga el enlace o puntero a la siguiente componente de la lista, podemos crear una estructura de datos dinmica que se expande o contrae conforme se ejecuta el programa.

Realiz: Ing. Domingo Olivares Barrios

Pg. 227

No tenemos que saber de entrada cmo de grande ser la lista. Ahora la nica limitacin es la cantidad de memoria disponible. Podemos cambiar fcilmente el orden de los componentes cambiando slo los valores de los punteros. La insercin y supresin de componentes son ms fciles y ms rpidas; simplemente hay que cambiar uno o dos valores de los punteros. Podemos usar variables dinmicas y punteros para crear listas y estructuras de datos ms complejas que pueden expandirse y contraerse durante la ejecucin del programa. Estas estructuras de datos son extremadamente flexibles, permitiendo una ms fcil insercin y supresin de las componentes. ORDENACION

INSERCION

SUPRESION

MANIPULACIN DE UNA ESTRUCTURA DE DATOS DINAMICA

Realiz: Ing. Domingo Olivares Barrios

Pg. 228

PUNTEROS Y LISTAS ENLAZADAS.


PUNTEROS Las variables dinmicas no son referenciadas mediante el nombre sino mediante un puntero. El tipo puntero (pointer) es un tipo de datos predefinido en algunos lenguajes de programacin. Una variable referenciada, es una variable accedida no por su nombre sino por una variable puntero; una variable dinmica. Para crear una variable referenciada se usa, en Pascal por ejemplo, el procedimiento estndar NEW. NEW(P) Crea una variable del tipo referenciado por el puntero P y almacena un puntero a la nueva variable P. Las sentencias NEW(Ptr1); NEW(Ptr2); NEW(Ptr3); dejan en Ptr1, Ptr2 y Ptr3 las direcciones a cada una de las variables referenciadas creadas. Cmo accedemos a las nuevas variables creadas? Las variables punteros seguidas de ^, para el caso del Pascal, nos dan la variable a la que apunta. Para las variables referenciadas creadas antes, son vlidas estas asignaciones, en el caso del Pascal: Ptr1^:= 18; Ptr2^:=ROJO; Ptr3^:=TRUE El valor de un puntero es un entero en la mayora de las computadoras, ya que las posiciones de memoria son direcciones en el rango de cero hasta el tamao de la memoria. Sin embargo, un tipo puntero no es un tipo entero. Es de notar que el Pascal es un lenguaje fuertemente tipeado. No podemos asignar un valor entero a un puntero. Ni siquiera podemos asignar Ptr1, Ptr2 y Ptr3 unos a otros, puesto que no apuntan a variables del mismo tipo. (Podemos asignar punteros del mismo tipo unos a otros.) No est previsto imprimir un valor puntero. Ptr1 18 Ptr2 ROJO Ptr3 TRUE Ptr3 TRUE Ptr2 ROJO Ptr1 18

Realiz: Ing. Domingo Olivares Barrios

Pg. 229

La siguiente figura muestra un puntero y la variable referenciada por l. La variable puntero Ptr1 contiene la direccin de Ptr1^ (la variable referenciada)

1432

18

1432 es la direccin de memoria de la variable referenciada Ptr1^ Los punteros son importantes para crear estructuras de datos dinmicas. Puesto que debemos tener alguna forma de enlazar cada componente con la siguiente de la estructura, cada componente debe contener un enlace o puntero que apunte a la siguiente componente de la estructura. El registro es ideal como componente de una estructura de datos dinmica. Puede contener campos de diferentes tipos con el puntero siendo uno de ellos. Por ejemplo, en Pascal tendramos: TYPE TipoPtr = ^Persona; (* Un puntero a un registro del tipo persona *) Persona = RECORD Nombre : PACKED ARRAY[1..20] OF CHAR; Siguiente : TipoPtr (* Un puntero al siguiente elemento de la lista *) END; (* RECORD *) Para definir una variable dinmica se describe lo que esa variable puede ser en la seccin de declaracin de tipos de datos del lenguaje. En la seccin de declaracin de variables se declara una variable del tipo puntero a una variable de ese tipo. Cuando se necesite una de las variables referenciadas, se usa el procedimiento de creacin de variables puntero (NEW para Pascal), en la seccin de declaracin de variables. Observe que la definicin de TipoPtr incluye al identificador Persona el cual an no est definido. En la definicin de un tipo puntero debe usarse un identificador de tipo. Este identificador de tipo es una excepcin en la regla general de que los identificadores deben declararse antes de que se usen. Esto nos permite definir un puntero a un objeto (variable referenciada) antes de definir el propio objeto. No existe ninguna variable del tipo Persona antes del cuerpo del programa. Para obtener una variable del tipo Persona, se llama al procedimiento (NEW) de creacin de punteros, durante el tiempo de ejecucin. Al volver de dicho procedimiento, se ha creado una variable registro del tipo Persona. La informacin sobre dnde est posicionada la variable se deja en la variable puntero Ptr. Observe que los campos de esta nueva variable estn indefinidos. Ptr Variable del tipo PERSONA

?
Nombre Realiz: Ing. Domingo Olivares Barrios Pg. 230

Esto se llama asignacin dinmica de memoria porque las variables del tipo Persona se crean cuando se necesitan en el programa. El uso repetido del procedimiento (NEW) de creacin de punteros nos permite generar variables adicionales de este tipo. Entre estas llamadas a dicho procedimiento, enlazamos la variable que hemos obtenido en la llamada anterior para formar una estructura de datos dinmica. MEMORIA Ptr

Los punteros siempre referencian a variables sin nombre. Los propios punteros pueden tener nombre o no. Es decir, podemos crear una cadena de punteros sin nombre dinmicamente, con cada uno apuntando al que le sigue. Sin embargo, tal cadena debe tener al menos una variable puntero con nombre apuntando al primer elemento de la cadena o no tendremos ninguna forma de acceder a ella. Es parecido a esos juegos de las fiestas en los que las gentes tienen que seguir una cadena de pistas, cada pista dice dnde se encuentra la siguiente y as hasta que se encuentra un premio. Si no se da la posicin de la primera pista entonces no hay forma de empezar la cadena. Si la posicin dada corresponde a una pista de la mitad de la cadena, no hay forma de encontrar las pistas anteriores. Cuando una variable dinmica tal como Ptr no se necesita ms, el procedimiento de liberacin de memoria (DISPOSE par Pascal) la devolver, de forma que la memoria ocupada por ella pueda asignarse ms adelante si se necesita. Esto se llama devolucin a la memoria disponible. Cualquier operacin que sea vlida sobre una variable con nombre de un cierto tipo lo es sobre una variable dinmica de este tipo. Sin embargo, slo las asignaciones y las comparaciones para ver si son iguales, son operaciones vlidas con las variables punteros. Por ejemplo, dadas estas operaciones en Pascal: TYPE Rango = 1..25; VAR PtrA, PtrB : ^Rango; Podemos hacer las siguientes operaciones: NEW(PtrA); (* Crea una variable dinmica *) NEW(PtrB); (* Crea una variable dinmica *) READ(PtrA^, PtrB^); (* Almacena valores capturados en estas variables dinmicas *) WRITELN(La suma de , PtrA^:1, Y , (* Despliega la suma de *) PtrB^:1, ES , PtrA^+ PtrB^:1) (* estas variables dinmicas *) Observe que PtrA^ + PtrB^ es vlido porque hemos aadido los contenidos de las dos variables del tipo Rango apuntadas por PtrA y PtrB. PtrA + PtrB no sera vlido porque no se pueden sumar variables punteros. Podemos slo asignar punteros del mismo tipo o compararlos para ver si son iguales Realiz: Ing. Domingo Olivares Barrios Pg. 231

o desiguales. En otras palabras, podemos hacer que dos punteros referencien a la misma variable o podemos comparar dos punteros para ver si apuntan o no a la misma variable. En la siguiente figura comparamos las direcciones contenidas en las variables punteros, no los contenidos de estas direcciones de memoria. (A) PtrA 15 PtrB 15 (B)

28

28

PtrA = PtrB evala a FALSO PtrA <> PtrB evalua a VERDADERO

Resultado de la asignacin PtrA := PtrB Ahora PtrA = PtrB evala a VERDADERO PtrA <> PtrB evala a FALSO

Usaremos la asignacin y comparacin de punteros en la creacin y uso de estructuras de datos dinmicas. LISTAS ENLAZADAS Una de las estructuras de datos que podemos construir usando variables dinmicas y punteros se conoce como lista enlazada. De hecho, es la estructura enlazada que hemos descrito en la primera parte de este apndice. Puesto que slo podemos acceder a las variables dinmicas mediante un puntero (^), tenemos que tener tantas variables punteros como variables dinmicas haya (componentes) en la lista? Cul es la ventaja de esto? Ninguna, si la usamos as. Sin embargo, lo que podemos hacer es formar una cadena de estas variables. Apuntamos a la primera de la lista y luego almacenamos dentro de cada una un puntero a la siguiente. Es decir, cada variable dinmica ser un registro con un campo conteniendo un puntero al siguiente. El siguiente segmento de cdigo en Pascal, crea una lista de cinco variables del tipo AlgunRegistro, todas enlazadas juntas. TYPE Puntero = ^AlgunRegistro; AlgunRegistro = RECORD (* Otros campos *) Siguiente : Puntero END; (* RECORD *) VAR List, Ptr1, Ptr2 : Puntero; Vcb : Integer; (* El puntero a la primera componente de la lista *) (* El puntero a la ltima compnente de la lista *) (* El puntero a la componente ms nueva *)

Realiz: Ing. Domingo Olivares Barrios

Pg. 232

BEGIN NEW(List); Ptr1 := List; For Vcb := 1 TO 4 DO BEGIN NEW(Ptr2); Ptr1^.Siguiente := Ptr2; Ptr1 := Ptr2 END; Ptr1^.Siguiente := NIL END. List Ptr1 Ptr2

LISTA ENLAZADA Cmo crea este cdigo una lista? Por qu necesitamos tres punteros? Hagamos un recorrido lgico del cdigo y veamos como funciona este algoritmo. NEW(List); Se crea una variable del tipo AlgunRegistro. El puntero se deja en List. List permanecer sin cambiar como el puntero al primero. List se llama el puntero externo a la lista. List

Ptr1 := List; Nuestro algoritmo obtiene una nueva variable y almacena su puntero en el campo Siguiente de la ltima componente de la lista. Por tanto, necesitamos guardar la ltima componente para poder asignarle a su campo puntero la variable que se cree. List Ptr1

Realiz: Ing. Domingo Olivares Barrios

Pg. 233

For Vcb := 1 TO 4 DO Se utiliza un bucle controlado por contador para sumar las 4 ltimas componentes de la lista. BEGIN NEW(Ptr2); Se crea otra variable del tipo AlgunRegistro con Ptr2 apuntando a ella.

Ptr1^.Siguiente := Ptr2; El puntero a la variable creada se almacena en el campo Siguiente de la ltima componente de la lista.

Ptr1 := Ptr2 Ptr1 est de nuevo apuntando a la ltima componente de la lista.

Realiz: Ing. Domingo Olivares Barrios

Pg. 234

Primera vuelta del bucle FOR. La secuencia de diagramas siguiente, muestra cmo se aade una componente a la lista (es decir, lo que sucede en el cuerpo del bucle FOR).

Y as sucesivamente, hasta crear 4 elementos en la lista. Y al salir del bucle se ejecutar lo siguiente: END; Ptr1^.Siguiente := NIL

Realiz: Ing. Domingo Olivares Barrios

Pg. 235

Al campo Siguiente de la ltima componente de la lista se le asigna el valor especial NIL (Nulo). Observe que asignamos el valor NIL al ltimo puntero de la lista. NIL es una palabra reservada que puede asignarse a cualquier variable puntero. Significa que el puntero no apunta a nada. Su importancia est ligada con el hecho de que podemos comparar el campo enlace de cada componente de la lista con NIL para ver cundo se alcanza el final de la lista. Esta tcnica se usa cuando se busca en (se recorre) la lista.

Realiz: Ing. Domingo Olivares Barrios

Pg. 236

IMPRESIN DE UNA LISTA ENLAZADA


Para imprimir (o acceder en orden secuencial) a los elementos de una lista enlazada, comenzaremos imprimiendo los valores del primer elemento, luego los del segundo, luego los del tercero y as hasta que alcancemos el final de la lista. Esto nos sugiere algn tipo de bucle en el que la expresin sea mientras no sea el final de la lista. Lo que tenemos que hacer es usar un puntero como la variable de control del bucle. Para incrementarlo en cada paso, pondremos el campo Siguiente del registro actual. El final de la condicin del bucle ser que el puntero sea igual a NIL. PROCEDURE Imprimir(List: Puntero); VAR P: Puntero; BEGIN P := List; WHILE P <> NIL DO BEGIN WRITE(P^.Info); P := P^.Siguiente END END; (* List es el puntero externo *)

Este procedimiento funcionar incluso para una lista vaca (Lista = NIL).

Realiz: Ing. Domingo Olivares Barrios

Pg. 237

INSERCIN EN UNA LISTA ENLAZADA.


Un procedimiento que inserte en una lista enlazada debe tener dos parmetros: una lista enlazada y el elemento que va a insertarse. En una lista enlazada es ambiguo. Podra significar insertar un elemento como el primer elemento de la lista o insertar un elemento en su lugar de acuerdo con alguna ordenacin (alfabtica o numrica). Examinemos estas dos situaciones separadamente. Para insertar un elemento como el primero de una lista enlazada hay que hacer dos pasos: crear el nuevo elemento y ponerlo como el primero.

Realiz: Ing. Domingo Olivares Barrios

Pg. 238

PROCEDURE Meter(VAR List: Puntero; Elemento: Integer); (* Procedimiento para insertar un elemento en la cabeza de la lista *) VAR P: Puntero; BEGIN NEW(P); P^.Info := Elemento; (* asigna el valor de Elemento al nuevo elemento *) P^.Siguiente := List; (* enlaza al anterior primer elemento *) List := P (* el puntero externo apunta al nuevo elemento *) END; Observe que antes de llamar a Meter la primera vez, deber haberse puesto Lista a NIL. Para insertar un elemento en su lugar se necesita del paso adicional de encontrar su lugar. Tendremos que ir recorriendo todos los nodos (elementos de la lista) hasta que encontremos uno cuyo campo Info sea mayor que el valor que quermos insertar. (Esto supone mantener una lista ordenada en orden creciente). El siguiente fragmento har esta bsqueda. Ptr := List; WHILE (Ptr^.Info < Elemento) DO Ptr := Ptr^.Siguiente;

Si el nodo referenciado por Ptr es el que tiene un valor mayor que el que queremos insertar, entonces el nuevo elemento debe insertarse delante de ese nodo. Esto causa un problema; necesitamos conocer el nodo anterior de la lista para poder cambiar su campo puntero y que apunte al nuevo elemento. Tendremos que mantener dos punteros conforme recorremos la lista: el puntero al nodo actual y el puntero al nodo anterior. El siguiente fragmento har esto. Ptr := List; WHILE (Ptr^.Info < Elemento DO BEGIN Anterior := Ptr; Ptr := Ptr^.Siguiente END

Realiz: Ing. Domingo Olivares Barrios

Pg. 239

Esto tiene en cuenta el caso en el que el elemento va en la mitad de la lista. Qu sucede en los dos casos extremos, cuando el nuevo elemento debe insertarse por el principio o al final? Si el nuevo elemento es el primero, podemos usar el mismo algoritmo que acabamos de escribir. Si es el ltimo tendremos problemas, porque la comparacin Ptr^.Info < Elemento Causa un error al final de la lista. El tratar de acceder a Ptr^ cuando Ptr es NIL causar un error en tiempo de ejecucin. Nuestro bucle tendr que tener dos condiciones. Nuestra primera idea podra ser usar (Ptr <> NIL) AND (Ptr^.Info < Elemento) pero esto no funcionar. La mayora de los compiladores de Pascal evaluarn ambas comparaciones de la expresin incluso si la evaluacin del primero da FALSE. Esto es, el que Ptr sea NIL no har que se deje de evaluar Ptr^.Info. Tendremos que usar nuestra vieja amiga la variable Booleana Encontrado. La inicializaremos a FALSE y la cambiaremos a TRUE cuando encontremos el lugar en el que hay que insertar el elemento. (Ptr <> NIL) AND NOT Insertar Esto tiene en cuenta los tres casos: la insercin por el principio, por la mitad y al final. El siguiente procedimiento representa nuestro algoritmo de insercin general. PROCEDURE Insertar (VAR List: Puntero; Elemento: INTEGER); (* Procedimiento para insertar un elemento en una lista mantenindola ordenada *) VAR Encontrado: BOOLEAN; P, Ptr, Anterior: Puntero; (* puntero local *) BEGIN NEW(P); P^.Info := Elemento; (* obtiene un nuevo nodo *) Anterior := NIL; Ptr := List; Encontrado := False; WHILE (Ptr <> NIL) AND NOT Encontrado DO Realiz: Ing. Domingo Olivares Barrios Pg. 240

IF Ptr^.Info > Elemento THEN Encontrado := TRUE ELSE BEGIN Anterior := Ptr; Ptr := Ptr^.Siguiente END; P^.Siguiente := Ptr; IF Anterior = NIL THEN List := P ELSE Anterior^. Siguiente := P END; Observe dos cosas en este procedimiento. La primera es que el parmetro List tiene que ser un parmetro VAR (por variable) para el caso en el que el nuevo elemento se inserta como el primer elemento. La segunda cosa es que funcionar para campos Info de cualquier tipo escalar sin ms que cambiar el tipo de Elemento.

Realiz: Ing. Domingo Olivares Barrios

Pg. 241

SUPRESIN EN UNA LISTA ENLAZADA


Para suprimir un nodo de una lista enlazada, debemos conocer qu nodo se va a suprimir. Esto puede especificarse como el i-simo nodo o buscando un nodo con un cierto campo Info. Examinaremos las dos supresiones: la supresin del primer nodo y la supresin de un nodo con un campo Info determinado. El quitar el primer nodo es simtrico a insertar un elemento como el primer nodo. El valor del campo Info del primer nodo quitado de una lista se devolver como un parmetro de salida.

Realiz: Ing. Domingo Olivares Barrios

Pg. 242

PROCEDURE Sacar (VAR List: Puntero; VAR Elemento: INTEGER); (* Procedimiento para quitar el primer elemento de una lista*) VAR P: Puntero; BEGIN P := List; Elemento := List^.Info; List := List^.Siguiente; DISPOSE(P) END;

(* guarda List para devolverlo a la memoria disponible *)

(* envia P^para que pueda usarse de nuevo *)

Para suprimir un nodo cuyo campo Info tiene un cierto valor se hace de una forma muy similar al procedimiento Insertar. La diferencia es que aqu buscamos un valor igual al nuestro, no un valor mayor que el de nuestro elemento.

Realiz: Ing. Domingo Olivares Barrios

Pg. 243

PROCEDURE Suprimir (VAR List: Puntero; Elemento: INTEGER); VAR P, Ptr: Puntero; BEGIN IF Elemento = List^.Info THEN List := List^.Siguiente (* se suprime el primer elemento *) ELSE BEGIN Ptr := List; WHILE Ptr^.Siguiente^.Info <> Elemento DO Ptr := Ptr^.Siguiente; P := Ptr^.Siguiente; Ptr^.Siguiente := Ptr^.Siguiente^.Siguiente; DISPOSE(P) (* devuelve P^ a la memoria disponible *) END END; Observe que este procedimiento evita tener que llevar un puntero atrasado usando Ptr^.Siguiente^.Info y Ptr^.Siguiente^.Siguiente. Esto funciona inclusive si P^. Siguiente^.Siguiente es NIL. Sin embargo, si no se encuentra un elemento igual, se producir un error en tiempo de ejecucin cuando P^.Siguiente es NIL. Las expresiones con punteros pueden ser muy complejas. Veamos ahora algunas expresiones con punteros.

P, Q y R apuntan a los nodos de una lista. Para accedere a los campos de los nodos, se usa P, Q y R. Compruebe que las siguientes equivalencias son verdad. P^.Siguiente = Q P^.Siguiente^= Q^ P^.Siguiente^.Siguiente = R P^.Siguiente^.Siguiente^= R^ Q^.Siguiente = R Q^.Siguiente^ = R^ Recuerde la semntica de la sentencia de asignacin: P := Q P^ := Q^ asigna el valor del puntero Q al puntero P. asigna el valor de la variable referenciada por Q a la variable referenciada por P.

Realiz: Ing. Domingo Olivares Barrios

Pg. 244

Para estas variables

La asignacin P^ := Q^ Da

Ahora los dos punteros P y Q apuntan cada uno a una variable diferente que contiene un GATO. Sin embargo, la asignacin P := Q Daria como resultado

La variable que contiene Perro est an all pero P no apunta a ella. De hecho, a menos que el pobre viejo Perro pueda ser accedido de otra forma otro puntero que le apunte- est perdido para siempre. Sigue estando en memoria, pero no hay forma de alcanzarlo, para usarlo o para mandarlo a la memoria disponible y que pueda usarse de nuevo.

Realiz: Ing. Domingo Olivares Barrios

Pg. 245

PILAS, COLAS, COLAS DOBLES, RBOLES BINARIOS.


Adems de las listas enlazadas hay otras muchas estructuras de datos dinmicas que se pueden construir. Puesto que esto no es un texto sobre estructuras de datos, describire brevemente algunas de ellas sin usarlas en programas muestras.

PILAS
Ha reparado en los divertidos nombres de procedimientos Meter (Push) y Sacar (Pop) de la seccin sobre manejo de listas enlazadas? Esos nombres se utilizan en la terminologa sobre pilas. Una pila se define como una estructura de datos dinmica en la que se accede slo por un extremo. Se puede insertar un elemento como el primero (Meter) y suprimir el primero (Sacar). Esta estructura de datos modela muchas cosas de la vida real. Se le suele llamar LIFO (Last-InFirst-Out) que significa que el ltimo en entrar es el primero en salir. Una pila de datos o bandejas en una cafetera o panadera tienen esta propiedad. Usted puede tomar slo el plato de encima. Cuando lo hace, el que estaba debajo queda encima y la siguiente persona puede tomarlo. Las latas de conservas en el estante de su supermercado tiene esta propiedad. Cuando usted toma la primera lata de una fila, est tomando la ltima lata que se puso en esa fila. El conjunto de diagramas de la figura que se muestra a continuacin ilustra lo que sucede cuando se mete un elemento en una determinada pila y luego se saca de la pila. Por razones obvias, el puntero que apunta a la cabeza o tope de la pila se llama frecuentemente Tope.

Realiz: Ing. Domingo Olivares Barrios

Pg. 246

Las pilas son extremadamente tiles en informtica. Si se quiere imprimir una lnea de caracteres en orden inverso se podra hacer lo siguiente: Tope := NIL; WHILE NOT EOLN DO BEGIN READ(Ch); Meter(Tope, Ch) END; WHILE Tope <> NIL DO BEGIN Sacar(Tope,Ch); WRITE(Ch) END El ltimo carcter ledo debe ser el primer carcter que se imprima.

COLAS y COLAS DOBLES


Una cola es una estructura de datos dinmica en la que los elementos se introducen por un extremo y se suprimen o sacan por el otro. Se le suele llamar a esto FIFO (First-In-First-Out) significando que el primero en entrar es el primero en salir. Esto se parece a una cola de espera en un banco o supermercado. Por ello, las colas se utilizan para simular este tipo de situacin. Mientras que la terminologa usada en la literatura anglosajona para referirse a la insercin y supresin en pilas es estndar (Push, Pop), no existe tal estandarizacin con las colas. La operacin de insertar por el final tiene muchos nombres en la literatura: Insert (Insertar), Enter (Introducir) y Enq (Intc) son tres nombres muy utilizados. Correspondientemente la operacin de suprimir del frente o cabeza se le llama Delete (Suprimir), Remove (Quitar) y Deq (Supc). Para llamar a nuestros procedimientos elegimos Intc y Supc. Puesto que se acceder por los dos extremos, necesitaremos dos punteros externos: Frente y Final.

Para insertar un elemento por el Final debemos considerar dos casos: cuando la cola esta vaca y cuando tiene al menos un elemento. Si la cola est vacia (Final = NIL) entonces debemos poner los dos punteros Final y Frente apuntando al elemento que se ha introducido en la cola. Si existe ya al menos un elemento en la cola, debemos insertar el nuevo elemento a continuacin de Final^ y redefinir Final para que apunte al nuevo elemento. Para los dos procedimientos siguientes usaremos las siguientes declaraciones. TYPE PtrNodo = ^TipoNodo; Realiz: Ing. Domingo Olivares Barrios Pg. 247

TipoNodo = RECORD Elemento: INTEGER; Siguiente: PtrNodo END; (* RECORD *) VAR Nodo: TipoNodo; Frente, Final: PtrNodo; Num: Integer; PROCEDURE Intc(VAR Frente, Final: PtrNodo; Num: INTEGER); (* Procedimiento para insertar un elemento al final de una cola *) VAR Ptr: PtrNodo; BEGIN NEW(Ptr); Ptr^.Elemento := Num; Ptr^.Siguiente := NIL; IF Final = NIL THEN BEGIN Final := Ptr; Frente := Ptr END ELSE BEGIN Final^.Siguiente := Ptr; Final := Ptr END END; El suprimir un elemento del frente o cabeza es realmente igual que sacar de una pila. De hecho, podemos usar el procedimiento Sacar. La nica cosa adicional que hay que hacer es comprobar si la cola queda vaca despus de quitar el elemento. Si queda vaca, debe ponerse Final a NIL. PROCEDURE Supc(VAR Frente, Final: PtrNodo; VAR Elemento: Integer); (* Procedimiento para quitar un elemento del frente de una cola *) BEGIN Sacar(Frente, Elemento); IF Frente = NIL THEN Final := NIL END;

Realiz: Ing. Domingo Olivares Barrios

Pg. 248

Hay otras formas de implementar las pilas y las colas, pero puesto que estas estructuras varan en tamao durante el tiempo de ejecucin, se implementan frecuentemente como listas enlazadas tal como lo he descrito aqu. Para el caso de las colas dobles, la lgica a aplicar es la de Insertar o Suprimir por ambos lados de la lista enlazada. Es decir, el frente y final pueden ser intercambiados, de tal manera que cambia el sentido de la cola, y el frente pasa a ser final y el final a ser el frente. Para ello se requiere que la estructura elemento cuente con dos punteros.

Realiz: Ing. Domingo Olivares Barrios

Pg. 249

ARBOLES BINARIOS
El concepto de lista enlazada puede extenderse a estructuras que contienen nodos con ms de un campo puntero. Una de estas estructuras se conoce como rbol. El diagrama mostrado a continuacin se llama arbol binario, cada nodo tiene como mximo dos descendientes. El rbol se referencia mediante un puntero externo al nodo especial llamado raz. La raz tiene dos punteros: uno a su hijo izquierdo y otro a su hijo derecho. Cada hijo tiene a su vez dos punteros: uno a su hijo izquierdo y otro a su hijo derecho.

Los rboles binarios de bsqueda son rboles que tienen la propiedad de que la informacin de cualquier nodo es mayor que la informacin de cualquier nodo de su hijo izquierdo y de cualquier nodo de sus hijos, y menor que la informacin de su hijo derecho y cualquier nodo de sus hijos.

El rbol anterior es un ejemplo de rbol binario de bsqueda. La razn de su utilidad est en que si se busca un cierto nmero, se puede saber despus de una comparacin en qu mitad del rbol est. Con otra comparacin se puede saber en qu mitad de esa mitad estara. As se contina hasta que se encuentre el elemento, o se sepa que no est en el rbol. Probemos con el nmero 50.

Realiz: Ing. Domingo Olivares Barrios

Pg. 250

Veamos ahora para el 18, un nmero que no est en el rbol.

El hijo izquierdo de 19 es NIL por lo que el 18 no est en el rbol. No slo sabemos que no est all, sino que si queremos insertarlo, estamos en el lugar en el que se insertara.

Realiz: Ing. Domingo Olivares Barrios

Pg. 251

BIBLIOGRAFIA
Curso de Programacin en Clipper 5. Grupo EIDOS. Vladimir Algara, Francisco Marn, Antonio Quirs, Antonio Torres, Helio Yago. De la edicin RA-MA. Editorial Adison-Wesley Iberoamericana. Libreras en Clipper 5. Grupo EIDOS. Francisco Marn Quirs, Antonio Quirs Casado, Antonio Torres Lozano. Curso de Clipper 5.2 Avanzado Jos Antonio Ramalho. Editorial McGraw Hill. Clipper Summer 87 Editorial RAMA. Microsoft Access 97. Desarrollo de Soluciones. Manual del Programador. Timothy M. OBrien, Steven J. Pogge, Geoffrey E. White. Microsoft Press. Editorial McGraw Hill. PASCAL. Nell Dale, David Orschalic. Editorial McGraw Hill. QBasic. (Un libro muy bueno que tena, sin embargo lo perd). Y algunos ms, que me prestaron momentneamente, o que preste y nunca me devolvieron, razn por la cual no tengo las bibliografas.

Realiz: Ing. Domingo Olivares Barrios

Pg. 252

S-ar putea să vă placă și