Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ÍNDICE
1. - Introducción y conceptos 11. – Introducción a la
básicos. ................................................ 8 Programación Orientada al
1.1. - Lenguaje................................................ 8 Objeto. ...............................................205
1.2. - Programación. ...................................... 8 11.1. – Introducción. ...................................205
1.3. - Programa. ............................................. 8 11.2. – Vocabulario OOPS..........................206
1.4. - Lenguaje de programación. .................. 9 11.3. – Conceptos básicos. ..........................206
1.4.1. Lenguaje Máquina................................ 9 11.4. – Clarificando conceptos. ..................208
1.4.10. – Semántica. ..................................... 12 11.4.1. - ¿ Qué es una clase ? .....................208
1.4.2. Lenguajes de Alto Nivel........................ 9 11.4.2. - ¿ Qué es un objeto ? .....................209
1.4.3. – Traductores. ...................................... 9 11.4.3.- El concepto de herencia.................209
1.4.3.1. – Intérpretes. ...................................... 9 11.4.4.- El concepto de jerarquía................209
1.4.3.2. – Compiladores. ................................ 9 11.5. – Conclusiones. ..................................210
1.4.4. – Palabras reservadas........................ 10 11.5.1. – Lo mejor. ......................................210
1.4.5. – Código. ............................................ 10 11.5.2. – Lo peor. ........................................210
1.4.5.1. - Código fuente............................... 10 11.5.3. – Posibles soluciones. .....................210
1.4.5.2. – Código objeto. .............................. 10
1.4.5.3. – Código ejecutable. ........................ 10 12. - Introducción a la
1.4.6. – Compilación. ................................... 10 Programación dirigida por
1.4.7. – Enlazado.......................................... 11
1.4.8. – Librerías. ......................................... 11 eventos. .............................................211
1.4.8.1. – Librerías preenlazadas. ................. 11 13. - Documentación de
1.4.9. – Sintaxis. ........................................... 11
1.5. - Sistema informático o aplicación........ 12 programas......................................215
1.6. - Programador....................................... 12 13.1.- Manual del Sistema...........................215
1.7. - Técnicas de programación.................. 12 13.2. - Manual del programa. .....................216
1.8. - Usuario. .............................................. 12 13.3. - Manual del usuario. .........................216
10. – Introducción a la 2. - Tipos y estructuras
Programación Dirigida por básicas de datos. ........................13
2.1. - Dato. ....................................................13
los Datos......................................... 197 2.2. - Tipos de datos. .....................................13
10.1. – Programación Código-Fijo (Hard- 2.2.1. - Datos numéricos. ..............................13
Code). ..................................................... 197 2.2.2. - Datos tipo carácter. ..........................13
10.2. – Programación Dirigida por los Datos 2.2.3. - Datos alfanuméricos, de cadena o
(Data-Driven). ........................................ 198 string. ........................................................14
10.3. – Diccionario de datos. ..................... 202 2.2.4. - Datos lógicos (booleanos). ...............14
10.4. – Programación de plantillas............ 202 2.3. - Constantes, variables y funciones........14
10.4.1. - ¿ Qué es una plantilla ? ............... 202 2.4. - Expresiones. .........................................14
10.4.2. – Ventajas de una plantilla............. 203 2.4.1. - Expresiones aritméticas. ...................15
10.4.3. – Cuando utilizar una plantilla. ..... 203 2.4.2. - Expresiones alfanuméricas. ..............16
10.4.4. – Generadores de Código............... 203
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 capítulo <<soluciones>>, de manera que pueda ver y entender cómo las teorías 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 guía para los maestros de una escuela donde, desde su fundación, participe
como catedrático y finalmente como director administrativo. Sin embargo, en ese tiempo por diversas
circunstancias, a pesar de que se estrenaba la materia de Lenguajes Algorítmicos (la cual propuse que se
implantara), ni el manual ni yo, tuvimos el tiempo ni la aceptación suficiente, de mis compañeros, ni de
la dirección académica, 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 impartía la primera materia de
programación, BASIC; puesto que anteriormente, no estaba contemplada la materia de Lenguajes
Algorítmicos o Algorítmica (como le llaman algunos). En dicho manual, pretendí recopilar lo
aprendido en la escuela, la experiencia y algo de documentación que tenía a mano, en aquellos años.
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 análisis de sistemas, así como en lo que respecta a impartir clases
en diversas escuelas y a muchos particulares; también fui acrecentando mis conocimientos en la diaria
investigación que esta motivada por la curiosidad y las ganas de aprender2. Todo esto, ha servido para
enriquecer el que inicialmente se quería fuese un manual y, posteriormente se deseo desarrollarlo como
un libro3. En ese punto, querido lector, usted dirá después de estudiarlo, si se logro el último objetivo.
1
Como venía haciéndolo –aunque sin una estructura claramente definida-.
2
Siempre he dicho que mi profesión es de las más difíciles, ya que ser ESTUDIANTE no es nada fácil.
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 algún reclamo por los copyrights.
Aunque, en realidad, dejar satisfecho al lector que tenga en sus manos este libro y que estas
líneas 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 pequeño curso previo de Introducción a la Computación y sería fantástico si se tomo un
curso de algún Sistema Operativo previo, para comprender algunos de los conceptos, como son la
memoria de la computadora, los componentes básicos que la conforman, y su funcionamiento
elemental, ya que el presente libro no pretende cubrir estos aspectos.
1.1. - Lenguaje.
1.2. - Programación.
1.3. - Programa.
4
Algoritmia: f. Ciencia del cálculo aritmético y algebraico.
Algoritmo: m. Conjunto ordenado y finito de operaciones que permiten la resolución de un problema; p. Ej. La extracción
de raices cuadradas o el cálculo de una suma, producto o división de números. (Enciclopedia Textual Permanente Salvat).
1.4.3. – Traductores.
1.4.3.1. – Intérpretes.
1.4.3.2. – Compiladores.
5
Salvo el caso de unos amigos de la escuela, cuya tarea era hacer un lenguaje compilado, y lo llamaron lenguaje LEPERO
(Lenguaje en Español Pseudoestructurado pero Revuelto con Otros), el cual nunca terminaron totalmente, solo lo que
necesitaron para aprobar, hasta donde tengo entendido.
1.4.5. – Código.
1.4.6. – Compilación.
Librería(s)
1.4.8. – Librerías.
1.4.9. – Sintaxis.
6
En el apéndice A se trata con un poco más de detalle el tema de las librerías. Sin embargo, se recomienda tratar estos temas
cuando ya se tenga un poco más de conocimientos acerca de la programación avanzada.
1.4.10. – Semántica.
Son las reglas, normas o técnicas que permiten dar legibilidad al código de un
programa, es decir, que permiten que el código sea fácil de entender y comprender.
Conjunto de programas que funcionan coordinados entre sí, para el manejo de grandes
volúmenes de información.
1.6. - Programador.
1.8. - Usuario.
Un dato es la expresión 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 información.
El tipo numérico entero (integer), como su nombre lo indica son aquellos valores
numéricos que no cuentan con una parte fraccionaria o fracción; y obviamente no tienen
en su estructura el punto decimal o formato de fracción.
El tipo numérico real (real), son aquellos valores numéricos que incluyen en su
estructura el punto decimal o formato de fracción, y desde luego una parte fraccionaria o
fracción.
Ejemplos de tipos numéricos reales: 1.5, 2.34, 0.47, ¾, 5 ½, …
El tipo lógico (también denominado booleano) es aquel dato que solo puede
tomar uno de dos valores:
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, según sea par o impar.
CONSTANTES
Son valores estáticos, es decir, que no cambian, y se mantienen fijos durante la ejecución
de un programa.
Pueden ser de cualquiera de los tipos de datos vistos anteriormente.
Ejemplos: 23,”España”, Verdadero.
VARIABLES
Una variable es un objeto o partida de datos cuyo valor puede cambiar durante la
ejecución 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
2.4. - Expresiones.
+ SUMA
- RESTA
* MULTIPLICACIÓN
/ DIVISIÓN
^, ** EXPONENCIACIÓN
DIV DIVISIÓN ENTERA
\,MOD MÓDULO (resto, residuo)
Ejemplos:
EXPRESION OPERACIONES RESULTADO
5 DIV 2 División entera 2
5 MOD 2 Módulo o residuo 1
4+6/2 4+3 7
(4+6)/2 10/2 5
((3+5)/2^2)+1 (8/2^2)+1 = (8/4)+1 = 2+1 3
4*2/4 8/4 2
2^2/4 4/4 1
Una expresión lógica es una expresión que solo puede tomar uno de dos valores,
ya sea VERDADERO o FALSO. Se denominan también EXPRESIONES BOOLEANAS
en honor del matemático británico George Boole, que desarrollo el Algebra lógica, de
Boole o Booleana.
Ejemplos:
Los operadores lógicos o booleanos básicos son NOT (no), AND (y) y
OR (o), y nos permiten unir expresiones booleanas o de relación.
Expresión Lógica 2
AND Verdadera Falsa
Expresión Verdadera Verdadera Falsa Resultados
Lógica 1 Falsa Falsa Falsa
Resultados
Expresión Lógica 2
OR Verdadera Falsa
Expresión Verdadera Verdadera Verdadera Resultados
Lógica 1 Falsa Verdadera Falsa
Resultados
NOT Resultado
Expresión Verdadera Falsa
Lógica Falsa Verdadera
Expresión Lógica 2
XOR Verdadera Falsa
Expresión Verdadera Falsa Verdadera Resultados
Lógica 1 Falsa Verdadera Falsa
Resultados
Cuatro columnas,
Cuatro filas
1 2 3 4
2
3
4
5
Cuando un arreglo cuenta con tres o más subíndices, se dice que es un arreglo
multidimensional, ya que cuenta con múltiples dimensiones.
Si representamos gráficamente una matriz tridimensional con
F filas, C columnas y N niveles tendremos:
F filas
N niveles
C columnas
Cuando un arreglo tiene más de tres dimensiones, no es posible representarlo
gráficamente, sin embargo, tanto matemáticamente como en la computadora si es
posible manejarlo.
3.2. - Objetivo.
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; también debe ser rápido, es decir, debe
procesar la información lo más rápidamente posible.
D). - Corrección.
Debe ser fácil la localización de errores en el código, y por ende, permitir
realizar las correcciones necesarias en el menor tiempo posible. De ahí que
nuestra programación debe ser estructurada (por ejemplo, técnica modular o
descendente, que se verán más adelante), evitando saltos de una línea del
programa a otra, y tratando de hacerlo lo más aproximado a un programa lineal,
es decir, que se ejecute línea a línea sin saltos.
E). - Flexibilidad.
Debe estar estructurado de tal manera que permita realizar cambios o
actualizaciones de manera rápida y sin modificar gran cantidad de código. Esto
con el fin de cubrir rápidamente las necesidades de los usuarios.
F). - Fiabilidad.
El proceso de la información y entrega de resultados del programa al
usuario final debe ser totalmente confiable, ya que dicho usuario espera que los
resultados que obtenga a través de nuestros programas sean 100% correctos (A
excepción expresa de los errores de captura que el propio usuario pueda cometer,
y que no pudiéramos evitar).
G). - La presentación.
El programa deberá tener una presentación agradable e intuitiva para el
usuario, es decir, que las pantallas de intercambio de información (interfases)
sean sencillas, ordenadas, fáciles de comprender, y; en lo posible, con toques de
colores e imágenes agradables al usuario.
Como primer punto tenemos que, los comentarios son líneas del programa que se
introducen para dar legibilidad al código 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 código, con el fin de
explicar claramente el objetivo o tarea de un grupo de ordenes o instrucciones. En todos los
lenguajes de programación esta situación ha sido contemplada; así por ejemplo tenemos que en
BASIC y sus “dialectos” (perdón a los puristas por –dialecto-) (por ejemplo: GWBASIC, Quick
BASIC, Turbo BASIC, Visual BASIC, etc.), una línea de comentario empieza con la palabra o
sentencia REM, de REMark (-comentario- en inglés) o un apóstrofe (‘), 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
más le parece y conviene. Los primeros libros de programación (que conocí) y desde luego
también los primeros programadores; acostumbraban anotar comentarios inclusive en el
diagrama de flujo del programa7; pero en lo personal, me confunden más y no me ayudan.
Ejemplo:
En el segundo punto de la lista, se nos marca el uso de múltiples sentencias en una sola
línea, y aunque acortan un poco el código y evitan que se vea excesivamente largo, en lo
personal, a veces me pierdo y no visualizo las sentencias correctamente, pues me confunden y
7
No te preocupes si este término es nuevo para ti, son simplemente unos gráficos representando un algoritmo o código, mas
adelante conocerás su definición exacta y hasta soñarás con ellos.
Ejemplo:
Instrucción 1
Instrucción 2: Instrucción 3: Instrucción 4: Instrucción 5
Instrucción 6
Como puedes ver, solo ocupa tres líneas, y no seis, por lo cual se ve mas corto el pseudo
código.
Para el tercer punto anotado, cabe hacer mención que la mayoría de los traductores
entienden que cada mandato o función se va a poner en una sola línea. Cuando el traductor se
encuentra con un salto de línea en la instrucción (carácter 13 <intro> del código ASCII), a todos
los efectos, ésta ha finalizado.
A medida que profundicemos en la programación, veremos que las expresiones se
pueden complicar cuanto queramos, a veces más de lo que sería deseable.
No es recomendable, por cuestión de legibilidad, que una línea supere el margen derecho
de nuestra pantalla cuando capturemos el código fuente del programa. Para solventar este evento
disponemos de un carácter especial, que varía dependiendo del lenguaje, el cual indica al
traductor que el código se corta en ese punto, pero el que viene en la o las siguientes líneas es
continuación de éste. (como ejemplo de carácter especial tenemos el punto y coma -;- en los
lenguajes xBase).
La ubicación de este carácter especial, en la mayoría 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:
Instrucción Larga;
Continuación de la Instrucción Larga
Instr;
ucción larga
Ejemplo:
1. La primera letra de una variable siempre ha de escribirse en minúscula y debe indicar el tipo
de la misma:
a Array
b Codeblock (para lenguaje Clipper).
c Cadena
d Fecha
l Lógica
n Numérica
o Objeto
x Cualquier tipo
2. Los mandatos y funciones del sistema se escriben siempre en mayúsculas. Por ejemplo:
RETORNAR (RETURN en inglés), FECHA() (DATE en inglés), etc.
3. Los nombres de cualquier objeto introducido por el usuario: variable, función, etc. Nunca
deben separarse mediante el símbolo del subrayado sino poniendo en mayúsculas la primera
letra de cada trozo de palabra con significado. Por ejemplo: DbMenu(), StrCount(),
nFilaInicial, etc. (Técnica WordMixing –Mezcla de palabras-)
Como en casi todas las normas, existen corrientes, la notación húngara no podía ser
menos. En algunos libros de programación y lenguajes, por ejemplo; las obras realizadas y/o
editadas por grupo EIDOS9, se sigue la llamada notación gallega inversa, una mezcla del 95%
de notación húngara y un 5% de especifidades (de la cosecha del grupo EIDOS) y chanza (el
8
En general seguimos la adaptación de la Notación Húngara para Clipper realizada por Robert DiFalco en Reference
(Clipper) Vol. V, núm. 5, de mayo de 1991 y por Antonio Linares en clippeRmanía núm. 3, de julio de 1991.
9
Grupo EIDOS es una empresa especializada en el área de lenguajes xBase. Sus actividades abarcan la edición de
documentación técnica (entre la que destacan la revista clippeRmanía así como varios libros sobre productos de entorno xBase
publicados a través de Editorial RAMA, la formación, la consultoría, el desarrollo, la producción y distribución de productos
software. Grupo EIDOS es VAR (Distribuidor Autorizado de Valor Añadido) y Centro de Formación Autorizado de Computer
Associates. Sus dos centros en Madrid y Valencia cubren la totalidad de los aspectos reseñados.
En el área de la formación, Grupo EIDOS ha organizado en España en 1992 y 1993 los ENCUENTROS DE USUARIOS
CLIPPER y en Argentina en 1993 (a través de WorldNet, su representante en la zona) los PRIMEROS ENCUENTROS
LATINOAMERICANOS DE USUARIOS CLIPPER; todos ellos con la asistencia de los más cualificados desarrolladores en
Clipper y el patrocinio de las principales empresas del sector. Asimismo, mantiene un aula de formación permanente para
programadores dentro de este mismo entorno.
c Carácter o memo
n Numérica
l Lógica
d Fecha (date)
o Objeto (genérico)
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 específico, del que conocemos su tipo (su clase),
entonces usaremos como identificador 3 letras (consonantes) para representar ese tipo de
Objeto:
Cada programador tiene su propio método o estilo, pero todo apunta hacia una unificación
de criterios, y esta notación húngara (o la similar gallega inversa) es la de mayor aceptación.
En este caso, el algoritmo o pseudo código se considera como la traducción del diagrama
de flujo a instrucciones en lenguaje común, es decir, el que utilizamos cotidianamente. Por
ejemplo, en nuestro caso, el español.
Dependiendo del estilo de programación que se tenga, se pueden usar palabras
reservadas de algún lenguaje de programación, mezcladas con palabras del lenguaje que
comúnmente utilizamos.
6. - Codificar el programa.
7. - Capturar la codificación.
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 lógica. Los primeros, la mayoría de
las veces son fáciles de detectar y localizar, ya que la mayoría de los traductores nos indican,
aproximadamente, donde está el error. Estos errores generalmente se cometen durante la captura
de la codificación, y casi nunca alteran la lógica del programa, aunque en ocasiones puede
existir un error de sintaxis que no detecte el traductor y altere la lógica de nuestros programas,
pero esto resulta ser en casos muy raros (en lo personal me paso en una ocasión con GwBasic).
En el segundo caso, con los errores de lógica, debemos preocuparnos un poco mas, ya
que estos errores son difíciles de detectar y localizar, y vienen de malos planteamientos en la
resolución del problema, así que en caso de presentarse, deberemos revisar la resolución del
problema desde el principio y los planteamientos que se especificaron al inicio de la resolución,
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 ejecución (cuando la aplicación o programa está
en marcha),.
En tiempo de ejecución, si el usuario intenta una operación que el sistema o programa no
puede realizar, entonces se produce lo que se conoce como un error en tiempo de ejecución.
Supongamos, por ejemplo, que vamos a hacer que nuestra aplicación vuelque (grabe) alguna
información a un disco flexible, o incluso a otro disco fijo (también llamado duro). ¿Qué tipos
de errores podríamos anticipar? Que dicha unidad no exista, que el disco se encuentre lleno o
que el disco no se encuentre formateado. Puede que queramos escribir código que se refiera a un
archivo de datos y luego renombremos el archivo sin actualizar nuestro código: aunque nuestra
sintaxis sea correcta, resulta que el objeto o archivo no existe y se producirá un error en tiempo
de ejecución.
Al controlar los errores en tiempo de ejecución, haremos que nuestra aplicación sea más
tolerante con los errores que se encuentre. Podremos tratar estos errores utilizando rutinas de
tratamiento de errores, haciendo así que nuestra aplicación parezca más robusta y permitiendo
salidas de programa más elegantes cuando se produzca lo inesperado.
Las aplicaciones que controlan errores en tiempo de ejecución podrán manejar los
errores de usuario más comunes sin necesidad de parar la aplicación. Cuanto más habilidad
tengamos de anticipar los errores convencionales (tales como que nuestra aplicación esté
esperando que el usuario introduzca un número y éste introduce un carácter) y protegernos
frente a ello, menos posibilidades tendrá nuestra aplicación de interrumpirse. Por ejemplo, en
una situación en la cual nuestra aplicación está esperando que el usuario introduzca un número,
podríamos utilizar una rutina de tratamiento de errores que solicite al usuario a que inserte un
número en vez de un carácter alfabético.
En aquellas ocasiones en las que una rutina de tratamiento de errores no pueda resolver
un error en tiempo de ejecución, todavía podrá ejecutar importantes acciones, tales como cerrar
cualquier archivo de datos abierto (y potencialmente guardando considerables cantidades de
datos que de manera contraria se perderían). En el ejemplo anterior, si el usuario no introduce
un número cuando se le solicita, la aplicación se podría cerrar, de tal manera que no le esté
preguntando continuamente al usuario que introduzca un número. Procure generar salidas
delicadas al crear su rutina de tratamiento de errores.
En otras palabras, para prever los errores en tiempo de ejecución, debemos pensar en los
posibles errores que podría generar el usuario e intentar hacer programas a prueba de usuarios
novatos, por no decir lo que me decían mis maestros (ahí te lo dejo a la imaginación).
Una vez que se ha probado el programa y no se han detectado errores de ningún tipo;
antes de integrarlo a un sistema de información, debemos ejecutarlo a manera de prueba,
durante un buen período de tiempo, con copias de la información utilizada en el sistema, para
evitar que la información original pueda ser dañada por algún error que haya pasado
desapercibido.
Después que el programa ha estado funcionando correctamente, trabajando con copias
de la información del sistema, y arrojado resultados satisfactorios, entonces podremos integrarlo
al sistema principal de información, para que pueda trabajar con la información original y
complementar el sistema, resolviendo así el problema planteado.
10
Debug en inglés. Proviene de BUG, que significa bicho, y con la preposición DE, podría traducirse textualmente como
desbichar, quitar bichos, o literalmente quitar errores.
11
Bugs en inglés, que aunque quiere decir bichos, se tomo para denominar técnicamente así a los errores, los cuales se
consideran como plagas, tales como la de los insectos o bichos.
Aunque hay muchos tipos y formas de diagramas de bloques, así como símbolos, a
continuación se presentarán los más utilizados, así como el significado o descripción que le dan
la mayoría de los programadores.
SIMBOLO DESCRIPCIÓN
Proceso
Automático
Proceso
Manual
Almacenamiento en medio
magnético en general
(archivos)
Almacenamiento físico
(archivo físico manual)
Almacenamiento en medio
magnético (disco duro o fijo)
Almacenamiento en medio
magnético (cinta magnética)
Entrada/Salida general de
información
Salida de información,
reporte por impresora
De la misma manera que en el punto anterior, aunque hay muchos tipos y formas de
diagramas de flujo, así como símbolos, a continuación se presentarán los más conocidos, así
como el significado o descripción que le dan la mayoría de los programadores.
SIMBOLO DESCRIPCIÓN
OPERACION
ENTRADA/SALIDA DE
INFORMACION (ARCHIVOS)
CONECTOR
TOMA DE DECISION
SUBRUTINA
(PROCEDIMIENTO O FUNCION)
Realmente, no se puede decir que exista alguna regla escrita acerca de la diagramación,
pero si se establecen ciertas recomendaciones, como las que se indican:
1. El símbolo de inicio y fin, solo se utilizara dos veces, al principio y al final del
diagrama.
2. La línea de flujo debe "tocar" tanto al símbolo del que sale como al símbolo al que
llega.
3. Pueden existir varios conectores de "salida", pero solo uno de "llegada"; con el
mismo carácter o símbolo dentro de ellos.
4. El carácter que esta dentro del conector de salida debe ser igual al carácter 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 símbolo solo llegara una línea de flujo y saldrá de éste una línea de
flujo; con excepción del símbolo de toma de decisión, al cual llega una línea de flujo
y salen dos de él; y también el conector y el símbolo de inicio y fin, del cual
solamente saldrá una línea o llegara una línea de flujo.
- Diseñar un programa que solicite los siguientes datos de un empleado: Ficha, nombre, puesto,
antigüedad, sueldo diario, días trabajados; que calcule y muestre el sueldo total neto a pagar, así como
las cuotas por pagar por el patrón por sus prestaciones sobre su sueldo total bruto: un 3 % del Seguro
Social, 1 % de Apoyo a la Educación, 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 años o más de
antigüedad, se le dará un bono del 5 % sobre su sueldo total bruto.
DATOS DE SALIDA: Total neto a pagar, salario total a pagar, Cuotas del I. M. S. S., de Apoyo
a la Educación, del Infonavit, del S.A.R., Retención del I.S.P.T., Importe del Bono.
1. Inicializar variables.
2. Pedir el Nombre.
3. Pedir el Puesto.
4. Pedir la Antigüedad.
5. Pedir el Salario Diario.
6. Pedir los Días Trabajados.
7. nSalarioTotalAPagar = nDiasTrabajados*nSalarioDiario
8. nImss = nSalarioTotalAPagar * 0.03
9. nApoyoEducación = nSalarioTotalAPagar * 0.01
10. nInfonavit = nSalarioTotalAPagar * 0.05
11. nSar = nSalarioTotalAPagar * 0.03
12. nIspt = nSalarioTotalAPagar * 0.02
“Salario nInfonavit =
INICIALIZAR Diario:” nSalTotAPag * 0.05
VARIABLES
“Días
“Nombre:” Trabajados:” nIspt =
nSalTotAPag * 0.02
cNombre nDiasTrab NO
¿ nAntig >= 5 ? 3
“Puesto:”
nSalTotAPag =
SI
nDiasTrab * nSalDia
nBono =
nSalTotAPag * 0.05
cPuesto
nImss = 3
nSalTotAPag * 0.03
nTotNetoAPagar =
“Antigüedad:” nSalTotAPag + nBono
nApEduc =
nSalTotAPag * 0.01
nAntig “Resultados:”,
“IMSS:”; nImss, “ISPT:”; nIspt,
“SAR:”; nSar, “Ap. Educ.:”; nApEduc,
“Infonavit:”; nInfonavit,
2
1 “Bono:”; nBono,
“Sal. Total a Pagar:”; nSalTotAPag,
“Tot. Neto a Pagar:”; nTotNetoAPagar
FIN
NOTA: Por esta única ocasión, tanto en el algoritmo como en las codificaciones que se veran a
continuación, 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 relación entre las palabras utilizadas
en el algoritmo y su equivalente en los diferentes lenguajes de programación.
1. Inicializar variables.
2. Desplegar "Dame los siguientes datos:"
3. Desplegar "Nombre:"
4. Introducir cNombre
5. Desplegar "Puesto:"
6. Introducir cPuesto
7. Desplegar "Antigüedad:"
8. Introducir nAntig
9. Desplegar "Salario Diario:"
10. Introducir nSalDia
11. Desplegar "Días 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 algún lenguaje de programación, por ejemplo Basic,
Pascal, C, Clipper, etc.
A continuación presentare la codificación del programa anterior en algunos lenguajes.
PRINT "Resultados:"
PRINT "IMSS: "; nImss
PRINT "ISPT: "; nIspt
PRINT "SAR: "; nSar
PRINT "Apoyo a la Educación: "; nApEduc
PRINT "INFONAVIT: "; nInfonavit
PRINT "Bono: "; nBono
PRINT "Salario Total a Pagar: "; nSalTotAPag
PRINT "Total Neto a Pagar: "; nTotNetoAPagar
END
PROGRAM Ejemplo;
(* Programa EJEGPASC.PAS *)
(* Método de Diseño General o Elemental. *)
(* Programa Principal. *)
USES CRT; (* Usar el monitor –Catodic Ray Tube, Tubo de Rayos Catódicos- *)
(* Declarando variables. *)
BEGIN (* Inicio *)
(* Inicializando variables. *)
nAntig := 0;
nSalDia := 0;
nDiasTrab := 0;
nSalTotAPag := 0;
nImss := 0;
nApEduc := 0;
nInfonavit := 0;
nSar := 0;
nIspt := 0;
nBono := 0;
nTotNetoAPagar := 0;
(* Despliegue de Resultados. *)
WRITELN('Resultados:');
WRITELN('IMSS: ',nImss:10:2);
WRITELN('ISPT: ',nIspt:10:2);
WRITELN('SAR: ',nSar:10:2);
WRITELN('Apoyo a la Educación: ',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.
* Programa EJEGCLIP.PRG
* Método de Diseño General o Elemental.
* Programa Principal.
IF nAntig >= 5
nBono := nSalTotAPag * .05
ELSE
nBono := 0
END IF
* Despliegue de Resultados.
12
Aunque algunos programadores van muy lejos negándole el título de lenguaje a Clipper, eso es una verdad a medias. La
mayoría sabemos que los programas generados por Clipper son en realidad P-CODE, es decir pseudo código (muy
optimizado por cierto), que se interpreta en tiempo de ejecución, en lugar de ejecutarse directamente. Ese posible “defecto”
no resta valor alguno a una de las mejores y mas potentes herramientas de programación existentes en el mercado. Tanto que
inclusive ha incursionado en las tendencias de programación orientada al objeto y programación dirigida por eventos,
logrando con esto crear aplicaciones incluso para ambiente Windows. En el presente ejemplo, se utilizo la versión 5.2e
RETURN
/* Programa EJEMGC.C
Método de Diseño General o Elemental.
Programa Principal. */
if(nAntig >= 5)
nBono = nSalTotAPag * 0.05;
else
nBono = 0;
/* Despliegue de Resultados. */
printf("Resultados:\n");
printf("IMSS: %f\n",nImss);
printf("ISPT: %f\n",nIspt);
printf("SAR: %f\n",nSar);
7. - Capturar la codificación.
Después de estar probado el programa, y de estar ejecutándolo durante un tiempo, a prueba, con
copias de la información original, el programa se incorpora al sistema principal, donde trabajara con
información original.
INICIO
OPERACIÓN 1
OPERACIÓN 2
OPERACIÓN 3
FIN
El símbolo de decisión representa una decisión que se efectúa y las rutas lógicas
alternativas que deben seguirse como resultado. Existe una entrada a un símbolo de
decisión y dos salidas a partir de él; sin embargo, sigue existiendo solo una entrada a la
estructura de decisión y una salida a partir de esta. El símbolo de decisión es solo una
parte de la estructura de decisión. Este punto se muestra en la siguiente figura.
5.2.3. - Ramificaciones.
Esta estructura es muy especial ya que el número de ciclos que se efectuaran es,
normalmente, fijo; y se basa en la verificación de una variable numérica; ejecutándose el
proceso hasta que dicha variable numérica excede el número establecido de ciclos.
ENTRADA
V=I VERDADERO
SALIDA
V > F
FALSO
INC
PROCESO
ENTRADA
V=I
A
VERDADERO
V>F SALIDA
FALSO
PROCESO
INC
ESPAÑOL INGLÉS
Entrada Entrada
PARA V = I HASTA F INCREMENTO INC FOR V = I TO F STEP INC
PROCESO PROCESO
SIGUIENTE NEXT
Salida Salida
A
NO
CONDICION SALIDA
SI
PROCESO
ESPAÑOL INGLÉS
Entrada Entrada
HACER MIENTRAS Condición=Verdadera DO WHILE Condición=Verdadera
PROCESO PROCESO
FIN MIENTRAS END WHILE
Salida Salida
ENTRADA
A
PROCESO
NO
CONDICION A
SI
SALIDA
ESPAÑOL INGLÉS
Entrada Entrada
REPETIR REPEAT
PROCESO PROCESO
HASTA Condición=Verdadera UNTIL Condición=Verdadera
Salida Salida
ESPAÑOL INGLÉS
Entrada Entrada
HACER DO
PROCESO PROCESO
Entrada Entrada
HACER DO
PROCESO PROCESO
MIENTRAS Condición=Falsa WHILE Condición=Falsa
Salida Salida
Entrada Entrada
HACER DO
PROCESO PROCESO
MIENTRAS Condición<>Verdadero WHILE Condición<>Verdadero
Salida Salida
6.1. - El contador.
Ejemplos:
Ejemplos:
nC = nC + nS
nValor = nValor + nCant
nNum = nNum + nPar
Es una variable de tipo booleano o, en ocasiones, tipo carácter, la cual solo adquiere uno
de dos valores, considerándolos como 0 (apagado) ó false, y 1 (encendido) ó true. Dicha
variable se utiliza en estructuras de control en una bifurcación condicional, tal y como se
muestra en el siguiente ejemplo:
ENTRADA
BANDERA = Valor
lógico 1
PROCESO A
BANDERA NO ó SI
Operador lógico
PROCESO B
Valor lógico 2
SI ó NO
A
A
SALIDA
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 acción correspondiente, que es continuar con la ejecución del proceso o finalizar.
El siguiente diagrama muestra uno ejemplo de esta salida.
ENTRADA
PROCESO
“¿ Desea
Continuar
(S/N) ?
cRespuesta
cRespuesta SI
= A
“S”
NO
SALIDA
Una salida por centinela, se establece cuando una condición o condiciones se cumplen o
no, lo cual genera en su caso la finalización del programa o no, dependiendo de la condición que
establezca el programador. A continuación se ilustra un diagrama mostrando la lógica de
operación de una salida por centinela.
ENTRADA
PROCESO
SI ó NO
CONDICIÓN A
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 CONDICIÓN el cual
contendrá un valor determinado, y en función del resultado de la expresión lógica
(CONDICION) se saldrá o no del programa.
6.6.1.- Subrutinas.
Una Subrutina, es un grupo de instrucciones que efectúa una parte identificable del
programa general. Y normalmente se crean para evitar la codificación repetitiva de grupos de
instrucciones a lo largo del programa. Son ejemplos representativos de elementos que podrían
encontrarse en subrutinas:
1. Rutinas de mantenimiento.
2. Rutinas de encabezado.
3. Rutinas de cálculo.
4. Rutinas de procesamiento de tablas.
5. Rutinas de edición.
6. Inicializar variables o Colocar contadores en cero.
El diagrama que sigue, muestra en líneas discontinuas lo que sería el flujo de un
ENTRADA
PROCESO
SUBRUTINA
A SUBRUTINA
A
PROCESO DE LA
SUBRUTINA
PROCESO
RETORNO
SUBRUTINA
A
PROCESO C
SALIDA
Las subrutinas pueden ser internas o externas. Las internas, están físicamente en el
programa y este las utiliza en el procesamiento. Las subrutinas externas las usa el programa pero
no son físicamente parte de él y de alguna forma debe efectuarse el acceso a ella para que
puedan utilizarse.
Las subrutinas internas pueden ser abiertas o cerradas. Las primeras se escriben dentro
de la lógica principal del programa, por lo general como parte de la rutina PROCESO, mientras
que las cerradas están fuera de la lógica principal del programa (pero siguen siendo parte de
este) y debe efectuarse una ramificación 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 lógica de línea principal y cuando la rutina debe ejecutarse en varios puntos del
Y por último, debo mencionar que se pueden pasar o transferir datos del programa
principal a la subrutina a través de variables, y ésta a su vez puede regresar valores al programa
principal a través de las mismas u otras variables. También es posible que una subrutina llame a
otra subrutina, y ésta a su vez pueda llamar a otra, y así sucesivamente; teniendo como límite las
características 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
6.6.2.- Procedimientos.
6.6.3.- Funciones.
13
Antes debo comentar que las subrutinas son utilizadas en algunos lenguajes tales como el BASIC, los cuales no están
plenamente orientados a la programación estructurada, tal como PASCAL por ejemplo.
VARIABLE Primera
PROCEDIMIENTO SaltarBlancos
PROCEDIMIENTO ObtenerPrimera
VARIABLE Ch
PROCEDIMIENTO ImprApellido
VARIABLE Ch
PROCEDIMIENTO EncontrarUltimo
PROCEDIMIENTO SaltarNombre
PROCEDIMIENTO Imprimir
DIAGRAMA DE ÁMBITOS
Programa principal
Otros módulos
Y
Otros procedimientos
Efectos Laterales
Un procedimiento
típico Módulo
EFECTOS LATERALES
VARIABLES A, B
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 *)
Sentencia A B X Y LATERAL
(Valores iniciales) 0 1 ? ? ?
LATERAL(A,B) (cuando se llama) 0 1 0 1 ?
X=X+Y 1 1 1 1 ?
A=X+1 2 1 2 1 ?
LATERAL = X + A 2 1 2 1 4 Lo que se
imprime
6.6.6.- Recursividad.
Xn
Xn = X * X*X*…*X
n veces
Xn = X * (X*X*…*X)
(n-1) veces
Xn = X*(X*(X*…*X))
(n-2) veces
INICIO (* Potencia *)
SI nN = 1 ENTONCES
Potencia = nX
SINO
Potencia = nX * Potencia(nX, nN-1)
FIN DEL SI
FIN.
nNum = POTENCIA(2,3)
El valor devuelto es 8
Llamada a POTENCIA(2,3)
FUNCION
Potencia
nX nN
2 3
El valor devuelto es 4
Llamada a POTENCIA(2,2)
FUNCION
Potencia
nX nN
2 2 El valor devuelto es 2
Llamada a POTENCIA(2,1)
FUNCION
Potencia
nX nN
2 1
Esta técnica se basa en el principio del "divide y vencerás"; es decir, debemos desglosar
o dividir un problema en partes o problemas más pequeños (módulos o bloques); y si alguna(s)
de esta(s) parte(s), son aun grandes, trataremos de dividirlo aun más.
Es recomendable desarrollar un diagrama en árbol, colocando en la parte superior el
problema principal, y después colocar en niveles inferiores, las divisiones o módulos de este
problema.
Después que se ha desglosado un problema, empezaremos a resolverlo desarrollando los
programas de cada módulo, empezando desde los módulos de nivel más bajo y en un orden
conveniente según nuestro criterio.
Para resolver cada módulo, es recomendable aplicar la técnica general o elemental de
programación; aunque podemos usar alguna otra técnica particular. Pero siempre debemos
evitar el tratar de resolver un módulo o problema codificándolo directamente. En general, las
fases o pasos de resolución de problemas aplicando esta técnica son:
5. Resolver los módulos de los niveles más bajos hacia los mas altos aplicando
cualquier técnica de programación, en un orden conveniente.
2. Los nodos restantes se dividen en un número 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
Métodos de clasificación y búsqueda.
15
Árboles sintácticos para representar las expresiones o producciones posibles de un lenguaje.
NIVEL 0 RAIZ
NIVEL 1
NIVEL 2
Sub-árbol Sub-árbol Sub-árbol Sub-árbol Sub-árbol
O O O O O
Nodo Nodo Nodo Nodo Nodo
ESPEJO
NIVEL 1
NIVEL 0 RAIZ
- Diseñar un programa que solicite los siguientes datos de un empleado: Ficha, nombre,
puesto, antigüedad, sueldo diario, días trabajados; que calcule y muestre el sueldo total neto
a pagar, así como las cuotas por pagar por el patrón por sus prestaciones sobre su sueldo
total bruto: un 3 % del Seguro Social, 1 % de Apoyo a la Educación, 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 años o más de antigüedad, 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 módulo de primer nivel.
NIVEL 0
MÓDULO PRINCIPAL
Cálculo del sueldo total neto a pagar a un empleado, así como las cuotas por pagar.
NIVEL 1
NIVEL 2
NIVEL 1
Solicitar Datos Calcular Salario Calcular Cuotas y Calcular el Mostrar
del Empleado. Total a Pagar. Retenciones. Total Neto Resultados.
a Pagar.
Etiquetas de
Calcular Cuota del IMSS.
Solicitud de Datos.
Calcular ISPT.
Calcular SAR.
NIVEL 2
INICIO
Desplegar "Dame los siguientes datos:"
Desplegar "Nombre:"
Desplegar "Puesto:"
Desplegar "Antigüedad:"
Desplegar "Salario Diario:"
Desplegar "Días Trabajados:"
RETORNO
INICIO
Introducir cNombre
Introducir cPuesto
Introducir nAntig
Introducir nSalDia
Introducir nDiasTrab
RETORNO
INICIO
nImss = nSalTotAPag * 0.03
RETORNO
INICIO
nApEduc = nSalTotAPag * 0.01
RETORNO
INICIO
nInfonavit = nSalTotAPag * 0.05
RETORNO
INICIO
nIspt = nSalTotAPag * 0.02
RETORNO
INICIO
nSar = nSalTotAPag * 0.03
RETORNO
INICIO
Sí nAntig >= 5 entonces
nBono = nSalTotAPag * 0.05
sino
nBono = 0
fin sí
RETORNO
NIVEL 1
INICIO
Etiquetas de Solicitud de Datos.
Captura de Datos.
RETORNO
INICIO
nSalTotAPag = nDiasTrab * nSalDia
RETORNO
INICIO
Calcular Cuota del IMSS.
Calcular Cuota de Apoyo a la Educación.
Calcular Cuota del Infonavit.
Calcular ISPT.
Calcular SAR.
Calcular el Bono por antigüedad.
RETORNO
INICIO
nTotNetoAPagar = nSalTotAPag + nBono
RETORNO
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. (Cálculo 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 módulos de acuerdo a cada rama del diagrama en el árbol, codificarlos e
integrarlos en un solo programa, o bien, a través de “encadenamientos”.
'Módulos de NIVEL 2.
'Módulos de NIVEL 1.
'El módulo INICIALIZAR VARIABLES, por ser muy sencillo se codifica
'directamente en el PROGRAMA PRINCIPAL (NIVEL 0).
'Inicializar variables.
'Módulo de NIVEL 2.
SUB CalcularCuotaDeApoyoALaEducacion (nApEduc AS SINGLE, nSalTotAPag AS SINGLE)
'Módulo de NIVEL 2.
SUB CalcularCuotaDelIMSS (nImss AS SINGLE, nSalTotAPag AS SINGLE)
END SUB
'Módulo de NIVEL 2.
SUB CalcularCuotaDelInfonavit (nInfonavit AS SINGLE, nSalTotAPag AS SINGLE)
END SUB
'Módulo 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)
END SUB
'Módulo de NIVEL 2.
SUB CalcularElBonoPorAntiguedad (nAntig AS SINGLE, nBono AS SINGLE, nSalTotAPag AS
SINGLE)
END SUB
'Módulo de NIVEL 1.
SUB CalcularElTotalNetoAPagar (nTotNetoAPagar AS SINGLE, nSalTotAPag AS SINGLE,
nBono AS SINGLE)
END SUB
'Módulo de NIVEL 2.
SUB CalcularISPT (nIspt AS SINGLE, nSalTotAPag AS SINGLE)
END SUB
'Módulo de NIVEL 1.
SUB CalcularSalarioTotalAPagar (nSalTotAPag AS SINGLE, nDiasTrab AS SINGLE, nSalDia
AS SINGLE)
'Módulo de NIVEL 2.
SUB CalcularSAR (nSar AS SINGLE, nSalTotAPag AS SINGLE)
END SUB
'Módulo de NIVEL 2.
SUB CapturaDeDatos (nAntig AS SINGLE, nSalDia AS SINGLE, nDiasTrab AS SINGLE)
END SUB
'Módulo de NIVEL 2.
SUB DesplegarMensajesDeSolicitudDeDatos
END SUB
'Módulo 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)
END SUB
'Módulo de NIVEL 1.
SUB SolicitarDatosDelEmpleado (nAntig AS SINGLE, nSalDia AS SINGLE, nDiasTrab AS
SINGLE)
CALL DesplegarMensajesDeSolicitudDeDatos
CALL CapturaDeDatos(nAntig, nSalDia, nDiasTrab)
END SUB
PROGRAM Ejemplo;
(* Programa EJEMPASC.PAS *)
(* Método de Diseño Modular. *)
USES CRT;
(* Declarando variables. *)
VAR nAntig,
nSalDia,
nDiasTrab,
nSalTotAPag,
nImss,
nApEduc,
nInfonavit,
nSar,
nIspt,
nBono,
nTotNetoAPagar : REAL;
(* Módulo de NIVEL 2 *)
PROCEDURE DesplegarMensajesDeSolicitudDeDatos;
BEGIN
END;
(* Módulo de NIVEL 2 *)
BEGIN
GOTOXY(30,4); READLN(cNombre);
GOTOXY(30,5); READLN(cPuesto);
GOTOXY(30,6); READLN(nAntig);
GOTOXY(30,7); READLN(nSalDia);
GOTOXY(30,8); READLN(nDiasTrab);
END;
(* Módulo de NIVEL 2 *)
BEGIN
END;
(* Módulo de NIVEL 2 *)
BEGIN
END;
(* Módulo de NIVEL 2 *)
BEGIN
END;
(* Módulo de NIVEL 2 *)
BEGIN
END;
(* Módulo de NIVEL 2 *)
BEGIN
END;
(* Módulo de NIVEL 2 *)
BEGIN
DesplegarMensajesDeSolicitudDeDatos;
CapturaDeDatos(nAntig, nSalDia, nDiasTrab);
END;
(* Módulo de NIVEL 1 *)
BEGIN
END;
(* Módulo de NIVEL 1 *)
BEGIN
CalcularCuotaDelIMSS(nImss, nSalTotAPag);
CalcularCuotaDeApoyoALaEducacion(nApEduc, nSalTotAPag);
CalcularCuotaDelInfonavit(nInfonavit, nSalTotAPag);
CalcularISPT(nIspt, nSalTotAPag);
CalcularSAR(nSar, nSalTotAPag);
CalcularElBonoPorAntiguedad(nBono, nAntig, nSalTotAPag);
END;
(* Módulo de NIVEL 1 *)
BEGIN
(* Módulo de NIVEL 1 *)
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 Educación: ', 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;
BEGIN (* Inicio *)
(* Inicializar Variables *)
nAntig := 0;
nSalDia := 0;
nDiasTrab := 0;
nSalTotAPag := 0;
nImss := 0;
nApEduc := 0;
nInfonavit := 0;
nSar := 0;
nIspt := 0;
nBono := 0;
nTotNetoAPagar := 0;
* Programa EJEMCLIP.PRG
* Método de Diseño Modular.
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
RETURN
* Módulos de NIVEL 1.
DesplegarMensajesDeSolicitudDeDatos()
CapturaDeDatos(@nAntig, @nSalDia, @nDiasTrab)
RETURN
RETURN
CuotaDelIMSS(@nImss, nSalTotAPag)
CuotaDeApoyoALaEducacion(@nApEduc, nSalTotAPag)
CuotaDelInfonavit(@nInfonavit, nSalTotAPag)
RETURN
RETURN
RETURN
* Módulos de NIVEL 2.
FUNCTION DesplegarMensajesDeSolicitudDeDatos;
RETURN
RETURN
RETURN
RETURN
RETURN
RETURN
IF nAntig >= 5
nBono := nSalTotAPag * 0.05
ELSE
nBono := 0
END IF
RETURN
/* Programa EJEMMC.C */
/* Método de Diseño Modular. */
#include <stdio.h>
/* Módulos de NIVEL 2 */
/* Declaración de funciones */
void DesplegarMensajesDeSolicitudDeDatos(void);
void CapturaDeDatos(float *, float *, float *);
void CuotaDelIMSS(float *, float);
void CuotaDeApoyoALaEducacion(float *, float);
void CuotaDelInfonavit(float *, float);
void CuotaISPT(float *, float);
void CuotaSAR(float *, float);
void CuotaBonoPorAntiguedad(float *, float, float);
/* Módulos de NIVEL 1 */
/* Declaración de funciones */
{
/* Declaración e inicialización 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;
/* Módulos de NIVEL 2 */
void DesplegarMensajesDeSolicitudDeDatos(void)
{
gotoxy(10,1); printf("Dame los siguientes datos:");
{
/* Declaración de variables locales */
char cNombre[10];
char cPuesto[10];
float nA, nS, nD; /* Variables auxiliares para el
paso de parámetros */
gotoxy(30,2); scanf("%s",&cNombre);
gotoxy(30,3); scanf("%s",&cPuesto);
gotoxy(30,4); scanf("%f",&nA);
gotoxy(30,5); scanf("%f",&nS);
gotoxy(30,6); scanf("%f",&nD);
{
*nIm = nSalTotAPag * 0.03;
}
{
*nApEd = nSalTotAPag * 0.01;
}
{
*nInfo = nSalTotAPag * 0.05;
}
{
*nIs = nSalTotAPag * 0.02;
}
{
*nSa = nSalTotAPag * 0.03;
}
{
if(nAntig >= 5)
/* Módulos de Nivel 1 */
{
/* Declaración de variables auxiliares para el paso de parámetros */
float nAnt,nSal,nDias;
DesplegarMensajesDeSolicitudDeDatos();
CapturaDeDatos(&nAnt, &nSal, &nDias);
{
*nSalTotAPag = nDiasTrab * nSalDia;
}
{
/* Declaración de variables auxiliares para el paso de parámetros */
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);
{
*nTotNetoAPagar = nSalTotAPag + nBono;
}
{
gotoxy(10,10); printf("Salario Total a Pagar: %f",nSalTotAPag);
gotoxy(10,11); printf("Cuota IMSS: %f",nImss);
gotoxy(10,12); printf("Cuota de Apoyo a la Educación: %f",nApEduc);
gotoxy(10,13); printf("Cuota del Infonavit: %f",nInfonavit);
gotoxy(10,14); printf("Cuota del SAR: %f",nSar);
gotoxy(10,15); printf("Bono por antigüedad: %f",nBono);
gotoxy(10,16); printf("Total Neto a Pagar: %f",nTotNetoAPagar);
}
Esta técnica, también conocida como "top-down", nos permite usar una aproximación
del " divide y vencerás " (no debe confundirse con Diseño Modular, que es similar). En otras
palabras, un problema se divide en sub-problemas que sean manejables. Después de resolver
todos los sub-problemas tendremos una solución del problema global.
Lo que hacemos en el diseño descendente es ir de lo abstracto (nuestra descripción o
especificación del problema) a lo particular (nuestro código en lenguaje de programación).
Si la descripción del problema es una descripción en palabras vagamente establecida,
entonces el primer paso es crear una descripción funcional del problema. Es decir, una
descripción 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.
¾Analizar el problema.
¾Escribir el módulo principal.
¾Escribir los módulos restantes.
¾Re-ordenar y revisar lo que sea necesario.
1. Analizar el problema.
- Planificar un cambio.
- No preocuparse por comenzar de nuevo. Pueden ser necesarios varios intentos y
refinamientos.
- Volver atrás en las decisiones de diseño inapropiadas.
- Tratar de mantener la claridad.
- Expresarse simple y directamente.
- DESCRIPCION DE LA ENTRADA.
- DESCRIPCION DE LA SALIDA.
- ESTRUCTURAS DE DATOS.
- SUPOSICIONES (SÍ LAS HAY)
- MÓDULO PRINCIPAL.
- MÓDULOS RESTANTES POR NIVELES.
- Diseñar un programa que solicite los siguientes datos de un empleado: Ficha, nombre,
puesto, antigüedad, sueldo diario, días trabajados; que calcule y muestre el sueldo total neto
a pagar, así como las cuotas por pagar por el patrón por sus prestaciones sobre su sueldo
total bruto: un 3 % del Seguro Social, 1 % de Apoyo a la Educación, 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 años o más de antigüedad, 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 patrón, así como el bono por antigüedad, en
caso de que tenga 5 años o más de antigüedad; todo con base en su sueldo total bruto.
DESCRIPCIÓN DE LA ENTRADA.
DATO TIPO
Nombre Alfanumérico (Carácter)
Puesto Alfanumérico (Carácter)
Antigüedad Numérico
Salario Diario Numérico
Días Trabajados Numérico
DESCRIPCIÓN DE LA SALIDA.
DATO TIPO
Cuota del IMSS Numérico
Cuota del ISPT Numérico
Cuota del SAR Numérico
Cuota de Apoyo a la Educación Numérico
Cuota del Infonavit Numérico
Bono por antigüedad Numérico
Salario Total a Pagar Numérico
Total Neto a Pagar Numérico
En este caso supondremos que no habrá ningún error en la captura, y por lo tanto no
habrá días trabajados, antigüedades, 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 más profesional, se deben considerar todos los valores que
podría 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
además, 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 podrían generar en nuestros programas, e inclusive aquellos errores impredecibles, para
darles una salida sencilla y elegante a nuestros programas.
NIVEL 0
Módulo Principal.
Calcular el Salario Total a Pagar, el Total Neto a Pagar y las cuotas por pagar.
NIVEL 1
a. Inicializar variables.
b. Solicitar datos del empleado.
c. Calcular el salario total a pagar.
d. Calcular las cuotas por pagar.
e. 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
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
Como se puede observar, ésta técnica es similar a la de diseño modular. Sin embargo,
aquí no es necesario crear el diagrama de árbol, y esto resulta ser optativo.
También es de notar que al final obtenemos el algoritmo totalmente detallado como en el
caso de la técnica de diseño 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 diseño modular, lo cual acortaría el código del
programa principal y lo haría mas legible.
Y por supuesto, ya teniendo el algoritmo en el nivel más bajo, lo único que queda es
codificarlo, aunque bien podíamos haberlo hecho desde otros niveles superiores, pero como
lo que se pretende es enseñar a programar y no a codificar en algún lenguaje especifico, por
tal razón se muestra simplemente el algoritmo hasta su mínimo detalle.
Queda para el programador principiante, a su gusto, cuando llegue a niveles muy bajos,
el codificar directamente cuando ya domine un lenguaje de programación.
Puesto que el código, para este ejemplo resulta ser muy pequeño, bien podríamos
obtener un código como el del diseño elemental, o como el del diseño modular; y ¿por qué
no?, una mezcla de ambos como se muestra más adelante; todo dependerá de los gustos y
estilos de cada programador.
Lenguaje Basic.
'Declaración de PROCEDIMIENTOS.
'PROGRAMA Ejemplo.
'Inicializar variables.
SUB DesplegarMensajesDeSolicitudDeDatos
END SUB
END SUB
CALL DesplegarMensajesDeSolicitudDeDatos
CALL CapturaDeDatos(nAntig, nSalDia, nDiasTrab)
END SUB
(* Programa EJEDPASC.PAS *)
(* Método de Diseño Descendente. *)
USES CRT;
(* Declarando variables. *)
VAR nAntig,
nSalDia,
nDiasTrab,
nSalTotAPag,
nImss,
nApEduc,
nInfonavit,
nSar,
nIspt,
nBono,
nTotNetoAPagar : REAL;
PROCEDURE DesplegarMensajesDeSolicitudDeDatos;
BEGIN
END;
BEGIN
GOTOXY(30,4); READLN(cNombre);
GOTOXY(30,5); READLN(cPuesto);
GOTOXY(30,6); READLN(nAntig);
GOTOXY(30,7); READLN(nSalDia);
GOTOXY(30,8); READLN(nDiasTrab);
END;
BEGIN
DesplegarMensajesDeSolicitudDeDatos;
CapturaDeDatos(nAntig, nSalDia, nDiasTrab);
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 Educación: ', 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;
BEGIN (* Inicio *)
(* Inicializar Variables *)
nAntig := 0;
nSalDia := 0;
nDiasTrab := 0;
nSalTotAPag := 0;
nImss := 0;
nApEduc := 0;
nInfonavit := 0;
nSar := 0;
nIspt := 0;
nBono := 0;
nTotNetoAPagar := 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
RETURN
DesplegarMensajesDeSolicitudDeDatos()
CapturaDeDatos(@nAntig, @nSalDia, @nDiasTrab)
RETURN
FUNCTION DesplegarMensajesDeSolicitudDeDatos;
RETURN
RETURN
/* Programa EJEMDC.C */
/* Método de Diseño Descendente. */
#include <stdio.h>
/* Declaración de funciones */
void DesplegarMensajesDeSolicitudDeDatos(void);
void CapturaDeDatos(float *, float *, float *);
{
/* Declaración e inicialización 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;
void DesplegarMensajesDeSolicitudDeDatos(void)
{
gotoxy(10,1); printf("Dame los siguientes datos:");
gotoxy(10,2); printf("Nombre:");
gotoxy(10,3); printf("Puesto:");
gotoxy(10,4); printf("Antigüedad:");
gotoxy(10,5); printf("Salario Diario:");
gotoxy(10,6); printf("Días Trabajados:");
}
{
/* Declaración de variables locales */
char cNombre[10];
char cPuesto[10];
float nA, nS, nD; /* Variables auxiliares para el
paso de parámetros */
gotoxy(30,2); scanf("%s",&cNombre);
gotoxy(30,3); scanf("%s",&cPuesto);
gotoxy(30,4); scanf("%f",&nA);
gotoxy(30,5); scanf("%f",&nS);
gotoxy(30,6); scanf("%f",&nD);
{
/* Declaración de variables auxiliares para el paso de parámetros */
float nAnt,nSal,nDias;
DesplegarMensajesDeSolicitudDeDatos();
CapturaDeDatos(&nAnt, &nSal, &nDias);
{
gotoxy(10,10); printf("Salario Total a Pagar: %f",nSalTotAPag);
gotoxy(10,11); printf("Cuota IMSS: %f",nImss);
gotoxy(10,12); printf("Cuota de Apoyo a la Educación: %f",nApEduc);
gotoxy(10,13); printf("Cuota del Infonavit: %f",nInfonavit);
gotoxy(10,14); printf("Cuota del SAR: %f",nSar);
gotoxy(10,15); printf("Bono por antigüedad: %f",nBono);
gotoxy(10,16); printf("Total Neto a Pagar: %f",nTotNetoAPagar);
9.1.1. - Archivo.
Por ejemplo:
9.1.2. - Campo.
Por ejemplo:
9.1.3. - Registro.
Nombre
del Campo Número de Nombre Grupo Turno Grado
Control
990701001 Francisco Fernández 990701 Vespertino 1
Jiménez
Registro 990602058 Julieta Campos 990602 Matutino 2
Enríquez
990503047 Armando Gutiérrez Armas 990503 Matutino 4
980402109 Edith Mijangos Lagos 980402 Vespertino 3
16
Usamos la definición de C. J. Date, una de las máximas autoridades mundiales en esta materia, en su obra Introducción a
los sistemas de bases de datos, publicada en nuestro idioma por Addison-Wesley Iberoamericana, México, 1986.
Los archivos indexados, podríamos decir que son similares a los archivos
directos, con la diferencia de que, siempre van acompañado de uno o más archivos que
contienen los datos del campo clave de búsqueda, es decir, su índice.
Dicho de otra manera, los archivos indexados tienen las mismas características
que los archivos directos, es decir, los registros se almacenan de manera secuencial, y a
cada uno se le asigna interna y automáticamente un número de registro, pero
paralelamente a éstos se pueden crear uno o más í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 lógico (p. e. alfabético o temático) y por el otro el número
de página donde se encuentra ubicado, y al consultar este índice nos resulta más rápido y
fácil 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 búsqueda y
el número de registro donde se localiza.
Obviamente, para acceder a los registros de un archivo indexado o mejor dicho
indizado (que sería lo correcto pues en español es índice –indizado- y no índex del
inglés –indexado-), tenemos tres tipos de acceso que son: secuencia, directo e indizado.
Así como los archivos anteriormente vistos, existen muchos más tipos de
archivos, que tienen relación al tipo de software que se utilice para crearlos y
modificarlos. Algunos de los más comunes son los archivos de gráficos, los de texto, de
hoja de cálculo, de presentaciones, de datos comprimidos, etc.
Desde luego que la manera (o formato) en que se almacena la información en un
archivo depende del software que se este utilizando, aunque sean del mismo tipo, y se
pueden identificar por la extensión del mismo.
Ejemplos:
De archivos de gráficos las extensiones más comunes son JPG, GIF, PCX y BMP
entre otras. De archivos de texto, lo son; DOC, TXT, WPS.
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 Gestión de
Bases de Datos (SGBD). Pero…
SGBD son las siglas de Sistema para la Gestión de Bases de Datos. Esta frase
proviene de traducir al español Data Base Management System (DBMS). En general,
podemos decir que todo aquello a lo que en informática llamamos vulgarmente base de
datos, no es tal sino un SGBD. En sentido estricto el término base de datos hace
referencia sólo al lugar donde está depositada la información (hablando desde la
perspectiva del hardware como del software). En cambio, con SGBD hacemos referencia
a la herramienta informática que usamos para manejar dicha información. Gráficamente
podemos representar un SGBD como vemos en la figura.
BASE DE DATOS
Vista 1 Usuario A
Usuario B
Vista 3
Usuario X
Vista 4
Usuario Y
Usuario Z
Vista 5
No obstante, la independencia de los datos es, aún, un objetivo a cubrir por los
SGBD más que una realidad, ya que la mayor parte de los sistemas gestores de bases de
datos no han conseguido todavía garantizar en su totalidad esta independencia.
Anfitrión
Lenguajes Lenguaje para la
en un SGBD definición de datos
Sublenguaje
de datos
Lenguaje para la
manipulación de
datos
Lenguajes de un SGBD.
DEP PRODUCCION
DEP ADMINISTRACION
DEP VENTAS
3
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 jerárquicamente 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 jerárquica. No obstante, el
árbol de ligas establecido entre los datos puede crecer mucho más. Supongamos
que definimos otra porción de nuestro archivo donde anotamos los pagos
mensuales que la empresa X da a sus empleados. El registro que definamos para
DEP1
01 02 03 04
DEPARTAMENTOS
COD NOMBRE
DEP1 PRODUCCION
DEP2 ADMINISTRACION
DEP2 VENTAS
NOMINAS
MES COD_EMP IMPORTE
11 01 1,500.00
11 02 1,875.00
11 03 3,623.00
11 04 5,213.00
12 07 8,253.00
07 08 10,215.00
Las tres tablas de nuestro ejemplo salvan estos escollos usando archivos
independientes para cada parcela de la información que pueda ser susceptible de
un tratamiento individualizado. Si posteriormente quisiéramos obtener datos,
producto de cruzar dos o más tablas, bastaría con relacionarlas por el campo
común que poseen: EMPLEADOS puede ser relacionada con
DEPARTAMENTOS a través del campo COD; NOMINA puede relacionarse
con EMPLEADOS a través del campo COD_EMP.
La labor primera y fundamental con la que nos encontramos ante una base de
datos es la de su diseño. Este parte de la observación de la parcela del mundo real que
deseamos informatizar para abstraer de ella el modelo de datos que necesitamos para
formalizar el sistema de información que deseemos realizar. Para realizar esta labor de
modelización se dispone de varias técnicas. Nosotros vamos a explicar brevemente aquí
dos de las más usadas. El modelo entidad-relación y el proceso de normalización.
ENTIDAD Es cada elemento u objeto del mundo real que debe pasar a formar
parte del sistema de información que abordamos. Por ejemplo, los
clientes, las facturas, etc. El Instituto Americano de
Normalización ANSI/SPARC define a la entidad como una
persona, lugar, cosa, concepto o suceso, real o abstracto, de
ATRIBUTO Es cada una de las características de que consta una entidad y que
son de utilidad para el proceso de informatización. Así, un cliente
tiene como atributos su código, su nombre, el total facturado, el
porcentaje de descuento que le hacemos habitualmente, etc.
Este modelo engloba una serie de técnicas para llevar adelante el proceso de
diseño de una base de datos. Con él realizamos el paso que va desde la determinación de
las entidades del mundo real hasta la formalización del modelo de datos y una primera
aproximación al diseño lógico de la base de datos resultante. El método empleado tiene
dos fases claramente diferenciadas:
ENTIDAD
RELACION
ATRIBUTO
CODIGO CODIGO
NOMBRE NOMBRE
DOMICILIO UBICACION
F. INGRESO
SALARIO
El siguiente paso consiste en formar las tablas que necesitamos construir para
gestionar la aplicación que se nos demanda. Las reglas son:
EMPLEADO DEPARTAMENTO
CODIGO EMPLEADO CODIGO DEPARTAMENTO
NOMBRE EMPLEADO NOMBRE DEPARTAMENTO
CODIGO DEPARTAMENTO UBICACIÓN FISICA
CALLE Y NÚMERO
CODIGO POSTAL
CIUDAD
TELEFONO
FECHA INGRESO
SALARIO ANUAL
Con esto hemos visto, de manera excesivamente resumida, el uso del modelo
entidad-relación para diseñar una base de datos. Piénsese lo complejo de esta labor en
bases de datos con centenas de entidades y relaciones. Discúlpenos 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 difícil hallar el justo término medio.
9.3.7. – Normalización.
DEPENDENCIA FUNCIONAL.
ATRIBUTO NO CLAVE.
DETERMINANTE.
Decimos que una relación está normalizada cuando para cada fila de una
determinada columna sólo existe un valor individualizado y no un conjunto de valores.
En nuestro ejemplo anterior vemos que en el fichero EMPLEADOS sólo podemos
asignar un valor a la columna CIUDAD para cada fila, es decir, para cada registro de un
empleado distinto. La normalización nos permite estructurar los datos en relaciones y
además evita que los archivos de las bases de datos tengan redundancias, incoherencias
o inconsistencias.
NO NORMALIZADO.
Una relación esta en 2NF cuando está en 1NF y cada atributo no clave
tiene Dependencia Funcional Completa de la clave primaria. Una relación que
esté en 1NF puede descomponerse en un conjunto de relaciones que estén en
2NF.
Una relación 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:
PEDIDO Pedido que se hace al proveedor (sólo uno por cada pieza).
17
Los archivos del ejemplo están tomados de la obra citada: C.J. Date. Op. Cit.
Código: S1
Proveedor: Francisco Hernández y Fernández
Estado: 20
Ciudad: Londres
Pedidos:
. . . . . .
. . . . . .
. . . . . .
CODIGO NOMBRE ESTADO CIUDAD PIEZA CANTIDAD NOMPIEZ COLOR PESO CIUPED
PEDIDO
Uno de los problemas que puede traer esta estructura de relación 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 información relativa a un proveedor, si éste tiene un solo pedido.
Además el atributo PEDIDO puede repetirse si un proveedor tiene más de
un pedido, con lo que tendríamos que utilizar registros de longitud variable.
No está en 1NF (1ª Forma Normal) porque tiene el atributo PEDIDO que
es descomponible.
REL 1A
CODIGO NOMBRE ESTADO CIUDAD
REL 1B
CODIGO PIEZA CANT NOMPIEZ COLOR PESO CIUPED
REL 2A
CODIGO NOMBRE ESTADO CIUDAD
REL 2B
CODIGO PIEZA CANT CIUPED
REL 2C
PIEZA NOMPIEZ COLOR PESO
Las relaciones resultantes son sin duda mucho más óptimas para el
movimiento de datos. La potencia de un Gestor de Bases de Datos Relaciónales
estriba en la posibilidad de relacionar de forma automática los diferentes
archivos que sean producto de situar en Tercera Forma Normal una estructura de
información no normalizada.
En la figura podemos ver también qué aspecto tendría 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 número del registro que cada
uno de ellos tiene en el archivo principal. Al estar alfabetizado el índice las búsquedas
son muy rápidas y si queremos acceder al caso completo bastará con dirigirnos al
archivo principal por el número de registro contenido en la tabla índice.
Los índices deben mantenerse de forma automática por el SGBD o mediante las
instrucciones pertinentes del sub-lenguaje de datos. Es decir, cada vez que actualicemos
la información de la tabla principal debe existir algún sistema para que se produzca una
Uno de los elementos típicos que suelen incorporar los Gestores de Bases de
Datos es lo que denominamos Lenguaje de Cuarta Generación. Estos lenguajes están
diseñados para facilitar el diseño rápido de aplicaciones y el fácil acceso a la
información contenida en las bases de datos. Un lenguaje de cuarta generación es un
lenguaje anfitrión más de entre los soportados por un SGBD, junto con los de tercera
generación: COBOL, etc. Sus características fundamentales son:
Antes de iniciar con el estudio de los diagramas y algoritmos para la gestión de archivos,
debes saber que las operaciones de un sistema básico de gestión de archivos (Sistema ABC) son
Altas de registros, Bajas de registros, Consultas de registros y Cambios o Modificaciones de
registros (sin olvidar la Creación del Archivo, que se verá mas adelante); siendo cada operación
un módulo del sistema. Este sistema básico (que también algunos llamamos: de mantenimiento
de registros) lo podemos representar en una estructura jerárquica como sigue:
Menu ABC
Dependiendo de los gustos de cada programador, cada módulo puede ser independiente
y presentar su propia pantalla de despliegue de datos, o bien, englobar en un solo módulo dos o
más operaciones básicas, 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
operación básica 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 Lógica y la otra Baja Física18.
La Baja Lógica 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 través de un campo al cual
podríamos llamar STATUS o CONDICION, el cual puede contener un tipo de dato Carácter o
Lógico, según sea posible o necesario. Una de las ventajas de la Baja Lógica, es la de poder
recuperar registros que fueron borrados por error o bien aquellos que son necesarios reactivar
por necesidades propias del proceso de información, y por el contra parte tenemos que una
desventaja es el espacio en disco que ocupa.
La Baja Física, 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
18
La frase Baja Física es relativa, dado que la información 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.
Como observación primordial, debemos tener presente que todo Sistema ABC, debe
incluir una rutina o instrucción de creación del archivo.
La operación para crear un archivo lleva aparejada tanto la acción de dar nombre al
mismo, a fin de que el sistema lo reconozca, como la de dotarlo con la necesaria estructura de
registro según nuestras conveniencias. Todo esto podemos dividirlo en las siguientes secuencias
lógicas:
Una vez que tenemos pensado el nombre y la información que contendrá nuestro
archivo, debemos indicar cómo se va a guardar dicha información. La unión de todos estos
campos dará como resultado un registro, de tal forma que podremos decir que un registro
contiene toda la información referente a un objeto (objeto desde el punto de vista informático
puede ser una persona, una cosa, etc.).
- Nombre de Campo
- Tipo de Campo
- Ancho de Campo
- Número 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, números y el
carácter especial “_”. Es aconsejable que el nombre sea significativo
(descriptivo) respecto al dato que almacenará, para que así nos sea fácil
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 programación se dispone por lo
menos de dos tipos de campos:
Decimal de Campo Indicaremos aquí los decimales que contendrá un campo de tipo
numérico.
Todas las especificaciones antes descritas podríamos anotarlas en forma de una tabla como la
que se muestra a continuación.
Y como nota final, siempre deberemos crear un campo clave, por medio del cual accesaremos la
información a un registro, de una manera rápida y precisa, por ejemplo: Número de Control (de
un alumno), Número de Referencia (de una cuenta contable), Número económico o Número de
placas (de una unidad de transporte), Número de modelo o de serie (de aparatos diversos),
Número de código de barras (de artículos diversos), etc.
Y por fin, después de todo este mundo de conceptos, veremos los diagramas y
algoritmos típicos para la gestión de archivos.
Para el lector que ha seguido paso a paso este manual notará que, los primeros
diagramas así como sus algoritmos, tienen un diseño “no estructurado”, es decir, no usan una
lógica lineal, la cual haría uso de bucles y no de saltos de una línea a otra.
Los segundos diagramas, como los algoritmos tienen un diseño “estructurado”, es decir,
utilizan una lógica lineal, usando las instrucciones de bucles, en lugar de saltos de una línea a
otra.
Esto se hizo así con el fin de presentar, lo más simple posible, la lógica de gestión de
archivos, desde los dos tipos de programación, para que compare las diferencias, y desde luego,
se tomen como base para iniciar la codificación de programas para la gestión de archivos,
puesto que tanto los diagramas como los algoritmos presentados a continuación, son
susceptibles de optimizaciones y adecuaciones al estilo de cada programador, aunque, la lógica
general sea básicamente la misma.
Debo recordarle amable lector que es preferible el modelo “estructurado”.
INICIO C
Inicializar NO
¿ Clave del Registro
Variables
= Clave Capturada?
SI Ir al siguiente
registro
NO Creación
¿Existe el
del “La Clave
archivo?
archivo. YA existe.”
SI D
A E
Abrir archivo A Ir al Principio
del archivo
B
Solicitar clave
y datos. ‘¿Más datos?
(S/N)’
D
SI
Respuesta=‘S’ B
¿Fin de SI Grabar el NO
Archivo? nuevo registro
Cerrar archivo
NO
E
Leer
registro. FIN
INICIO C
Inicializar
¿ Clave del Registro NO
Variables
= Clave Capturada?
SI Ir al siguiente
SI registro
¿ No Existe el
archivo?
Encontrado = Verdadero
NO Creación
A del D
archivo.
“La Clave
Abrir archivo
YA existe.”
Respuesta=‘S’ A
Encontrado=Falso
F
B
NO
Respuesta=‘S’
Cerrar archivo
SI
FIN
Solicitar clave
y datos.
Clave y datos
D
F E
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 ‘¿ Más datos ?’
13. Introducir Respuesta
14. Sí Respuesta=’S’ entonces
Ir al paso 4.
15. Cerrar el archivo.
16. FIN.
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 ‘¿Más datos? (S/N)’.
i. Introducir Respuesta.
8. Fin del Mientras Respuesta = ‘S’
9. Cerrar Archivo.
10. FIN.
INICIO C
NO Creación
¿Existe el
del
archivo? Respuesta
archivo.
SI
NO
Respuesta=‘S’ E
Abrir archivo
‘El archivo
esta vacio’
SI
B
Marcar y grabar el
Solicitar la A registro
clave.
E
Clave. Ir al Principio
del archivo
D
NO
Respuesta
Leer E
registro.
SI
Respuesta=‘S’ B
A
C
D FIN
Realizó: Ing. Domingo Olivares Barrios Pág. 146
DISEÑO “ESTRUCTURADO”
INICIO C
Inicializar
Variables ¿ Clave del registro NO
= Clave Capturada?
Ir al siguiente
Creación
SI registro
¿Existe el NO
del
archivo? Encontrado = Verdadero
archivo.
SI D
Datos del
Abrir archivo ‘El archivo registro.
esta vacio’ ‘¿Dar de baja el
registro?’
Respuesta = ‘S’
Encontrado = Falso
A
B A Respuesta
NO Cerrar archivo NO
Respuesta=‘S’
Respuesta=‘S’ E
SI
SI
FIN
Solicitar la
clave. Marcar y grabar el
registro
E
Clave.
¿No fue NO
D encontrado? G
F
¿No es Fin NO
E SI
de Archivo?
‘¿Otra Baja?
‘El registro (S/N)’
SI
NO existe’
Leer G
registro. Respuesta
Ir al Principio
del archivo
Encontrado = Falso
C
Realizó: Ing. Domingo Olivares Barrios F Pág. 147
B
DISEÑO “NO ESTRUCTURADO”
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo
- Desplegar ‘El archivo esta vacío’
- 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.
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 vacío’
iv. Fin del Sí.
v. Cerrar el archivo.
vi. FIN.
INICIO C
Inicializar NO
¿ Clave del registro
Variables
= Clave Capturada?
SI Ir al siguiente
registro
NO Creación
¿Existe el Datos del
del
archivo? registro.
archivo.
SI E D
‘El archivo Ir al Principio
Abrir archivo esta vacio’ del archivo
B
Solicitar la A ‘¿Otra consulta?
clave. (S/N)’
Capturar la Respuesta
Clave.
D SI
Respuesta=‘S’ B
SI ‘El registro
¿Fin de NO
Archivo?
NO existe’
Cerrar archivo
NO
A
Leer E
registro. FIN
INICIO C
Inicializar
Variables ¿ Clave del registro NO
= Clave Capturada?
Ir al siguiente
Creación
SI registro
¿Existe el NO
del
archivo? Encontrado = Verdadero
archivo.
SI D
Datos del
Abrir archivo ‘El archivo registro.
esta vacio’
E
Respuesta = ‘S’
Encontrado = Falso
A ¿No fue NO
B A encontrado? F
NO Cerrar archivo
Respuesta=‘S’ SI
‘El registro
SI
FIN NO existe’
Solicitar la
clave. F
Ir al Principio
del archivo
Clave.
D ‘¿Otra Consulta?
(S/N)’
¿No es Fin NO
de Archivo? E
Respuesta
SI
B
C
Realizó: Ing. Domingo Olivares Barrios Pág. 151
DISEÑO “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 vacío’
- 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 ‘¿ Más datos ?’
14. Introducir Respuesta
15. Sí Respuesta=’S’ entonces
Ir al paso 4.
16. Cerrar el archivo.
17. FIN.
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 vacío’
4. Fin del Sí.
5. Cerrar el archivo.
6. FIN.
Datos del
Inicializar registro.
Variables ‘¿Modificar el
registro?’
Respuesta
¿Existe el NO Creación
del
archivo?
archivo.
NO
Respuesta=‘S’ E
SI
‘El archivo SI
Abrir archivo esta vacio’ Solicitar los
datos del
B registro.
Solicitar la A
clave.
Datos del registro.
Grabar el registro
Capturar la
Clave. E
D Ir al Principio
del archivo
Leer E
registro. Respuesta
SI
Respuesta=‘S’ B
¿ Clave del registro NO
= Clave Capturada?
NO
Ir al siguiente
SI registro Cerrar archivo
A
C
D
FIN
Realizó: Ing. Domingo Olivares Barrios Pág. 154
DISEÑO “ ESTRUCTURADO”
INICIO C
Inicializar
Variables ¿ Clave del registro NO
= Clave Capturada?
Ir al siguiente
Creación
SI registro
¿Existe el NO
del
archivo? Encontrado = Verdadero
archivo.
SI D
Datos del
Abrir archivo ‘El archivo registro.
esta vacio’ ‘¿Modificar el
registro?’
Respuesta = ‘S’
Encontrado = Falso
A
B Respuesta
A
NO Cerrar archivo NO
Respuesta=‘S’
Respuesta=‘S’ E
SI
SI
FIN
Solicitar la
clave. Solicitar
datos del
registro.
Clave.
Grabar el registro
D
E
¿No es Fin NO
de Archivo? E ¿No fue NO
encontrado? G
SI
SI
Leer
registro.
F
‘El registro
NO existe’
G
Ir al Principio
del archivo
‘¿Otra modificación?
(S/N)’
Respuesta
Encontrado = Falso
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo
- Desplegar ‘El archivo esta vacío’
- 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 ‘¿ Más datos ?’
17. Introducir Respuesta
18. Sí Respuesta=’S’ entonces
Ir al paso 4.
19. Cerrar el archivo.
20. FIN.
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 Modificación ?’
ix. Introducir Respuesta
x. Encontrado = Falso.
e. Fin del Mientras Respuesta = ‘S’
3. Sino
a. Crear el archivo
b. Desplegar ‘El archivo esta vacío’
4. Fin del Sí.
5. Cerrar el archivo.
6. FIN.
‘El registro
Inicializar YA esta
Variables ocupado.’
E
‘¿Más datos?
NO Creación (S/N)’
¿Existe el
del
archivo?
archivo.
SI Respuesta
A
Abrir archivo A
SI
Respuesta=‘S’ B
B
Solicitar el Número NO
de registro y datos.
Cerrar archivo
Número de
registro y datos FIN
D
Ir al registro
y leerlo.
NO
E
C
INICIO
Inicializar
Variables
NO Creación
¿Existe el
del
archivo?
archivo.
SI
A
Abrir archivo A
Respuesta = ‘S’
C
NO
Respuesta=‘S’ Cerrar archivo
¿Registro SI Grabar los
vacío? datos en el
SI registro
FIN
Solicitar el Número NO
de registro y datos.
‘El registro E
YA esta
ocupado.’
Número de E
registro y datos
‘¿Más datos?
D (S/N)’
Ir al registro
y leerlo.
Respuesta
C B
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 Número de registro y datos.
5. Introducir Número de registro y datos.
6. Grabar el nuevo registro
7. Ir al registro y leerlo.
8. Sí el Registro está Vacío entonces
- Grabar los datos en el registro.
- Ir al paso 10.
9. Desplegar ‘El registro YA esta ocupado.’
10. Desplegar ‘¿ Más datos ?’
11. Introducir Respuesta
12. Sí Respuesta=’S’ entonces
Ir al paso 4.
13. Cerrar el archivo.
14. FIN.
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 Número de registro y datos.
ii. Introducir Número de registro y datos.
iii. Ir al registro y leerlo.
iv. Sí el Registro está Vacío entonces
1. Grabar los datos en el registro.
v. Sino
1. Desplegar ‘El registro YA esta ocupado.’
vi. Fín de Sí.
vii. Desplegar ‘¿ Más datos ?’
viii. Introducir Respuesta
d. Fin del Mientras.
3. Cerrar el archivo.
4. FIN.
B
‘¿Más datos?
NO Creación (S/N)’
¿Existe el
del
archivo?
archivo.
Respuesta
SI
Abrir archivo
‘El
archivo SI
Respuesta=‘S’ C
C
Solicitar el Número
NO
de registro.
Cerrar archivo
Número de
registro
FIN
Ir al registro
y leerlo.
Datos del
registro.
‘¿Dar de baja el
registro?’
Respuesta
SI
Respuesta=‘S’ A
NO
NO Creación
¿Existe el Respuesta
del
archivo?
archivo.
NO
SI Respuesta=‘S’ B
Abrir archivo
‘El archivo
esta vacío.’ SI
Marcar y grabar el
registro
Respuesta = ‘S’
B
C ‘¿Más datos?
(S/N)’
NO
Respuesta=‘S’
Solicitar el Número
de registro. FIN C
Número de
registro
Ir al registro
y leerlo.
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo.
- Desplegar ‘El archivo esta vacío’.
- Ir al paso 14.
3. Abrir el archivo.
4. Desplegar Solicitud del Número de registro.
5. Introducir Número 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 ‘¿ Más datos ?’
12. Introducir Respuesta
13. Sí Respuesta=’S’ entonces
Ir al paso 4.
14. Cerrar el archivo.
15. FIN.
1. Inicializar Variables.
2. Sí Existe el archivo entonces
a. Abrir el archivo.
b. Respuesta = ‘S’
c. Mientras Respuesta = ‘S’
i. Desplegar Solicitud del Número de registro.
ii. Introducir Número 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 ‘¿ Más datos ?’
x. Introducir Respuesta
d. Fin del Mientras
3. Sino
a. Crear el archivo.
b. Desplegar ‘El archivo esta vacío’.
4. Fin del Sí
5. Cerrar el archivo.
6. FIN.
Inicializar A
Variables
‘¿Mas datos?
NO Creación (S/N)’
¿Existe el
del
archivo?
archivo.
Respuesta
SI
‘El archivo
Abrir archivo esta vacío.’ SI
Respuesta=‘S’ B
B
Solicitar el Número
NO
de registro.
Cerrar archivo
Número de
registro FIN
Ir al registro
y leerlo.
Datos del
registro.
INICIO
Inicializar
Variables
A
¿Existe el NO Creación
Ir al registro
del
archivo? y leerlo.
archivo.
SI
‘El archivo Datos del
Abrir archivo registro.
esta vacío.’
NO Respuesta
Respuesta=‘S’
SI Cerrar archivo
B
Solicitar el Número
de registro.
FIN
Número de
registro
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo.
- Desplegar ‘El archivo esta vacío’.
- Ir al paso 12.
3. Abrir el archivo.
4. Desplegar Solicitud del Número de registro.
5. Introducir Número de registro.
6. Ir al registro y leerlo.
7. Desplegar los datos del registro.
8. Desplegar ‘¿ Más datos ?’
9. Introducir Respuesta
10. Sí Respuesta=’S’ entonces
Ir al paso 4.
11. Cerrar el archivo.
12. FIN.
1. Inicializar Variables.
2. Sí Existe el archivo entonces
a. Abrir el archivo.
b. Respuesta = ‘S’
c. Mientras Respuesta = ‘S’
i. Desplegar Solicitud del Número de registro.
ii. Introducir Número de registro.
iii. Ir al registro y leerlo.
iv. Desplegar los datos del registro.
v. Desplegar ‘¿ Más datos ?’
vi. Introducir Respuesta
d. Fin del Mientras.
3. Sino
a. Crear el archivo.
b. Desplegar ‘El archivo esta vacío’.
4. Fin del Sí.
5. Cerrar el archivo.
6. FIN.
Inicializar A
Variables
Solicitar los
datos del
¿Existe el NO Creación registro.
del
archivo?
archivo.
‘El archivo
Abrir archivo esta vacío.’
Grabar el registro
B
Solicitar el Número
de registro. ‘¿Mas datos?
(S/N)’
Número de
registro Respuesta
Ir al registro SI
Respuesta=‘S’ B
y leerlo.
NO
Respuesta
NO
Respuesta=‘S’ E
SI
INICIO
Inicializar A
Variables
Datos del
registro.
NO Creación ‘¿Modificar el
¿Existe el
del registro?’
archivo?
archivo.
SI
Respuesta
‘El archivo
Abrir archivo esta vacío.’ NO
Respuesta=‘S’ E
Respuesta = ‘S’ SI
Solicitar los
datos del
NO registro.
Respuesta=‘S’
SI
B Cerrar archivo Datos del registro.
Solicitar el Número
de registro. Grabar el registro
FIN
E
Número de
registro ‘¿Mas datos?
(S/N)’
Ir al registro
y leerlo. Respuesta
B
A
1. Inicializar variables.
2. Sí existe el archivo entonces
a. Abrir el archivo
b. Respuesta = ‘S’
c. Mientras Respuesta = ‘S’
i. Solicitar el número de registro
ii. Introducir el número 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 “¿Más datos (S/N)?”
x. Introducir Respuesta
d. Fin del mientras
3. sino
a. Creación del archivo
b. Desplegar “El archivo esta vacío.”
c. Cerrar el archivo.
4. Fin del Sí
5. FIN
INICIO C
NO Creación Respuesta
¿Existe el
del
archivo?
archivo.
SI
SI Respuesta=‘S B
A
A NO
Abrir archivo
Cerrar archivo
B
Solicitar clave
y datos. FIN
Capturar clave y
datos
Buscar el
registro por
la clave.
SI “El registro
¿ Se encontro
el registro ?
YA existe.”
NO
C
Grabar el
registro
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 ‘¿ Más datos ?’
10. Introducir Respuesta
11. Sí Respuesta=’S’ entonces
Ir al paso 4.
12. Cerrar el archivo.
13. FIN.
Buscar el registro
Inicializar variables por la clave
“¿Más datos?
Respuesta = “S” (S/N)”
Respuesta
¿Respuesta NO
= “S”? Cerrar archivo
B
SI
FIN
Solicitar clave
y datos
Capturar clave
y datos
Algoritmo: ALTAS.
1. Inicializar variables
2. Sí NO existe el archivo entonces
a. Creación 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 “¿Más datos (S/N)”
viii. Introducir Respuesta
d. Fin del Mientras
e. Cerrar archivo
4. Fin del Sí
INICIO
Inicializar A
Variables
Datos del
¿ Existe el NO Creación Registro.
del
archivo ?
archivo.
SI ¿Dar de baja
“El el registro?
Abrir archivo archivo
esta
vacio.”
D Respuesta
Solicitar
clave. SI
B
Respuesta=‘S
NO Marcar o
Capturar clave eliminar el
C registro.
Respuesta
¿ Se encontro SI
el registro ? A
SI
Respuesta=‘S D
NO
NO
“El registro
NO existe.”
Cerrar archivo
B
C
FIN
Algoritmo: BAJAS.
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo.
- Desplegar “El archivo esta vacío”.
- 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.
INICIO A
Inicializar
Variables Datos del registro.
“¿Dar de baja el
registro? (S/N)”
¿Existe el NO Creación
archivo? del archivo
Respuesta
SI “El archivo
está vacio.”
Abrir archivo SI
¿Respuesta =
“S”?
D
Respuesta = “S”
NO Marcar o
eliminar el
C B registro
“¿Buscar otro
¿Respuesta = NO Cerrar registro?” B
“S”? archivo
SI D Respuesta
Solicitar FIN
clave.
C
Capturar clave
Buscar el registro
por la clave.
NO
¿Se encontro el “El registro
registro?
NO existe.”
SI
A B
Algoritmo: BAJAS.
1. Inicializar variables
2. Sí NO existe el archivo entonces
a. Creación del archivo
b. Desplegar “El archivo está vacío”
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
INICIO
Inicializar
Variables
¿ Existe el NO Creación
del
archivo ? A
archivo.
SI
“El Respuesta
Abrir archivo archivo
C esta
vacio.” SI
Solicitar Respuesta=‘S C
clave.
NO
Buscar el FIN
registro por
la clave.
SI
Datos del B
Registro.
B
¿Buscar
otro
registro?
Algoritmo: CONSULTAS.
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo.
- Desplegar “El archivo esta vacío”
- 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.
Datos del
Inicializar Variables registro
C
“¿Otra consulta?
NO Creación (S/N)”
¿Existe el
del
archivo?
archivo
SI Respuesta
“El archivo
Abrir archivo está vacío”
D
Respuesta = “S” A
NO
¿Respuesta =
“S”? Cerrar archivo
SI A
Solicitar FIN
clave
Clave
NO
¿Se encontro el registro? “El registro
NO existe.”
SI
B C
Algoritmo: CONSULTAS.
1. Inicializar variables
2. Sí NO existe el archivo entonces
a. Creación del archivo
b. Desplegar “El archivo está vacío.”
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
INICIO
A
Inicializar
Variables SI Solicitar
Respuesta=‘S datos del
registro.
NO
NO Creación C
¿ Existe el
del
archivo ? ¿Buscar otro Capturar datos
archivo.
registro? del registro.
SI
“El
Abrir archivo archivo Grabar el
B esta Respuesta registro
vacio.”
Solicitar
clave. SI
Respuesta=‘S B C
NO
Capturar clave
Cerrar archivo
Buscar el
registro por
la clave. FIN
SI
¿Modificar registro?
Respuesta
1. Inicializar Variables.
2. Sí Existe el archivo entonces
Ir al paso 3.
Sino
- Crear el archivo.
- Desplegar “El archivo esta vacío”
- 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.
INICIO A
Inicializar
Variables Datos del registro.
“¿Modificar el
registro? (S/N)”
¿Existe el NO Creación
archivo? del archivo
Respuesta
SI “El archivo
está vacio.”
Abrir archivo SI
¿Respuesta =
“S”?
D
Respuesta = “S”
NO Solicitar los datos
C B del registro
“¿Buscar otro
¿Respuesta = NO Cerrar registro?” Datos del
“S”? archivo registro
SI D Respuesta
Grabar el
registro
Solicitar FIN
clave.
C
B
Capturar clave
Buscar el registro
por la clave.
NO
¿Se encontro el registro? “El registro
NO existe.”
SI
A B
1. Inicializar variables
2. Sí NO existe el archivo entonces
a. Creación del archivo
b. Desplegar “El archivo está vacío”
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
Algoritmo: ALTAS.
1. Inicializar variables.
2. Sí NO Existe el archivo A entonces
a. Creación del archivo A
b. Creación del archivo B
3. Sino
a. Sí NO Existe el archivo B entonces
i. Creación 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 están correctos? (S/N)?”
d. Introducir Respuesta
e. Sí Respuesta = “S” entonces
1. Inicializar variables.
2. Sí NO Existe el archivo A entonces
a. Creación del archivo A
b. Creación del archivo B
c. Desplegar “Los archivos estan vacíos.”
3. Sino
a. Sí NO Existe el archivo B entonces
i. Creación 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.”
1. Inicializar variables.
2. Sí NO Existe el Archivo A entonces
a. Creación del archivo A
b. Creación del archivo B
c. Desplegar “Los archivos están vacíos.”
3. Sino
a. Sí NO Existe el archivo B entonces
i. Creación 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
1. Inicializar variables
2. Sí NO existe el archivo A entonces
a. Creación del archivo A
b. Creación del archivo B
c. Desplegar “Los archivos están vacíos.”
3. Sino
a. Sí NO existe el archivo B entonces
i. Creación 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 “¿Están 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)”
Este término puede ser nuevo para usted; no obstante, en su estilo de programación debe
intentar que sus programas sean hard-coded, es decir, que estén escritos de manera literal,
fáciles de entender y de programar.
Vea el ejemplo siguiente, escrito en lenguaje Clipper:
En este ejemplo se utiliza un bucle FOR NEXT (PARA-HASTA) para crear una
variable por cada campo del archivo. Observe cómo con sólo dos líneas, todas las variables de
memoria son inicializadas. Tanto si existen 5 campos o 40, estas mismas dos líneas hacen esa
función.
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.
El ejemplo expuesto utiliza los datos de una base de datos. Si la estructura del
archivo fuera modificada, en la programación dirigida por los datos no sería necesaria
ninguna modificación del código, mientras que en el estilo tradicional es necesario re-
escribir el código.
Si considera que en una aplicación puede haber varias situaciones como ésa, la
pérdida 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 serán 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 parametrización del estilo de
programación y la obtención de un código eficiente y altamente profesional. Para utilizar
ese estilo de programación es necesario que el lector conozca muy bien los recursos de
programación del lenguaje que se utilice y, obviamente, tener también una buena lógica
de programación.
Esta técnica es normalmente adoptada por los programadores expertos. Para los
programadores que empiezan es recomendable que utilicen, para comenzar, el estilo de
programación tradicional y después usar éste estilo.
PROCEDURE Repl_Var() // Inicio del procedimiento de grabado o reemplazo de los valores de las variables al archivo
Puede utilizar el concepto de DD para crear un diccionario de datos que contenga toda la
información sobre los datos que serán manipulados por la aplicación.
Es posible, por ejemplo, crear un diccionario de datos con información sobre los
archivos utilizados por la aplicación de forma que permita crear procedimientos y funciones que
permitan su manipulación genérica (apertura, fechado, indexación, etc.) y mostrar pantallas,
como hemos visto anteriormente. En definitiva, crear un archivo de parámetros de uso general.
Las formas más simples de crear ese diccionario de datos son:
La primera opción tiene como puntos a favor el hecho de que se puedan modificar sus
datos sin que sea necesario recompilar la aplicación, que trae consigo una gran portabilidad y
facilidad de mantenimiento para su aplicación. Por otro lado, si ese archivo no dispone de algún
mecanismo de protección, cualquiera podría modificar los datos de forma indebida y dañar su
aplicación.
Analice la información dada en este capítulo y empiece a pensar en sus posibles
aplicaciones en sus próximos programas19.
Básicamente, una plantilla es un programa o rutina que tiene por objeto generar
programas (código fuente) basándose en un modelo o patrón. En otras palabras, una
plantilla es un generador de programas.
19
Para ampliar sus conceptos e ideas sobre ésta técnica sugiero que estudie el Capitulo 6, del libro Curso de Clipper 5.2
Avanzado, de José Antonio Ramalho; Editorial McGraw Hill.
1. Ahorro de tiempo.
3. Facilidad de modificación.
Si quiere cambiar un determinado elemento que afecta a todos los módulos del
sistema, la modificación de la plantilla realizará todos los cambios en el sistema.
La creación de una plantilla requiere un análisis previo del programa que desea
generar. Si va a crear una rutina que será específica de una única aplicación 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 programación orientada o dirigida por los
datos, es decir, son rutinas que trabajarán con objetos previamente preparados generando
el código definitivo.
Los objetos son la formalización de lo real que hace la mente del hombre.
Por tanto, si la noción de objeto posee tanta importancia a la hora de explicar los
mecanismos cognoscitivos del ser humano, parece lógico que una de las actividades
intelectuales del hombre, como es el diseño de software, se trate de aprovechar todo lo que esta
noción pueda dar de sí.
2º. Alejar a los intrusos, aficionado y otros posibles merodeadores. Como todos sabemos
las jergas profesionales complejas e ininteligibles, crean una barrera de incomprensión entre
iniciados y neófitos. 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 podía resultar ajeno a esta regla universal. Eso explica el
incontrolado florecimiento de infinidad de palabrejas, a cuál más rara e inútil, cuya inmensa
mayoría son fruto de bárbaras traducciones anglosajonas. De todos modos, ya que existe ese
vocabulario (absolutamente necesario por cierto), usémoslo; 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 mayoría de los casos ese aparente bloqueo es motivado por un exceso de
vocabulario inconexo y mal digerido.
NOCIONES BASICAS.
Objeto Un objeto es un conjunto de código asociado con los datos operados por
dicho código. Los objetos están encapsulados. Esto supone que tanto el código
como los datos que contienen son inaccesibles por otros objetos. Desde este
punto de vista, un objeto es bastante similar a una función o a una subrutina (o
procedimiento) en general. La diferencia fundamental estriba en la encapsulación
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 bibliografía 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.
Método 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
función, igualmente hemos de decir ahora que un método también lo es. Ya
dijimos que los objetos están compuestos de código y datos, pues bien, el código
no es más que un conjunto de métodos. Algo así como un grupo de
procedimientos dentro de otro principal.
Clase Una clase es un objeto que tiene como propiedad la de poder crear otros
objetos, dotándoles 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 métodos y mensajes, tal y como lo hacemos
algunos programadores, con los procedimientos que creamos. Los copiamos y
les agregamos más parámetros y procedimientos internos.).
• Una mayor seguridad ante posibles errores: Los módulos que se reutilizan
han sido probados y depurados con anterioridad en otras aplicaciones.
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
documentación. Un experto puede imaginarse cómo funcionan, pero al programador de a pie
sólo le queda el consuelo de conducirlas sin poder abrir el capó y ver el motor. Lógicamente
estas clases que se pueden llamar estándar, llaman a funciones, generalmente, indocumentadas
de algún enigmático módulo 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 programación, en aquellos viejos lenguajes y formas de programar.21
21
Nota del autor.
• Lectura – Escritura. En este caso estarían los campos que pueden ser leídos y
asignados.
• Solo lectura. Son variables internas como por ejemplo en este caso el número
de registro, que sólo puede ser leída por nosotros, y cambia su estado en
función de los desplazamientos del puntero a través 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 sería el caso del número 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 métodos, tal como ha quedado dicho, determinan los procesos propios de su
clase.
Las clases serían 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 sistemáticamente sus
datos y métodos. La nueva clase puede añadir nuevos datos y métodos a la existente, o
sencillamente sustituir los actuales por otros.
Un simil de esto, es cuando creamos una función para mostrar datos en pantalla,
y creamos una nueva función en donde llamamos la función primaria, a la cual le
agregamos nuevas características funcionales.
11.5. – Conclusiones.
11.5.1. – Lo mejor.
11.5.2. – Lo peor.
¿Qué beneficios nos ofrece la programación conducida por eventos como desarrollador y como
suministrador de soluciones? Primero, hace que las aplicaciones sean más fáciles de crear y depurar,
porque sólo desarrollamos pequeñas porciones. En segundo lugar, ofrece consistencia, porque se utiliza
en todos los entornos de programación 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 programación conducida por eventos (el mejor acercamiento para crear
aplicaciones basadas en Windows, que es lo más común).
Para poder entender la diferencia entre la programación por lotes y la programación conducida
por eventos, pensemos en una aplicación como si se tratase del menú de un restaurante. El
acercamiento a la programación por lotes nos sirve cada elemento en cada página del menú en una
secuencia, uno a uno, hasta que se nos haya servido toda la lista del menú. La programación conducida
por eventos nos permite elegir únicamente los <<elementos de menú>> que queramos –es decir, sólo se
ejecutarán las partes de programa que queramos-. Este tipo de acercamiento habitualmente se presenta
al usuario con una selección de botones de órdenes, elementos de menú y botones de barra de
herramientas.
22
Se les llama interrupción, a algunos procedimientos que realiza el microprocesador al activarse algun bit dentro de una
región especifica de memoria, tal como la 33H, en hexadecimal.
23
Comúnmente, se les llama Visuales, a todos aquellos sistemas operativos, lenguajes de programación, o programas, que
nos dan una presentación gráfica de la información. Tales como los productos de Microsoft, cuyo ejemplo ineludible es, su
ahora, sistema operativo Windows.
NOTA: El ratón esta habitualmente configurado para ser operado con la mano derecha. En esta
configuración, el botón de la izquierda es el botón de selección y el botón de la derecha es el botón de
contexto secundario. Podremos cambiar la orientación del botón utilizando el Panel de Control, para el
caso de Microsoft Windows. Los lenguajes visuales y los programas desarrollados en estos, reciben las
propiedades de ratón de Windows. Como resultado, no se necesita ninguna codificación especial de los
eventos de ratón para usuarios diestros o zurdos.
La mayoría de los usuarios en un entorno Windows utilizan el ratón para ejecutar la mayoría de
las acciones. Pero para acomodarse a aquellos que prefieran utilizar el teclado, Microsoft en sus
diversos productos de programación y paqueterías, nos permite reconocer, o atrapar, eventos de
teclado. La siguiente tabla lista algunos de los eventos de teclado más comunes.
Observe que los nombres de los eventos de ratón y teclado son simples y realmente descriptivos
del evento. Esta intuitividad hace que la programación en el entorno de programación conducida por
eventos de los lenguajes visuales resulte lógica y fácil. El desafío 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 código
orientado a eventos para los formularios y para los controles que estos contengan. El evento Click es el
más comúnmente usado por el objeto botón de orden, pero no sería el único permitido. Algunos de los
eventos disponibles para el objeto botón de orden, en los diversos lenguajes visuales, podremos
encontrar los que se listan a continuación.
Ahora es cuando comienza el desafío. Desde esta lista de ejemplo, ¿qué eventos utilizaremos? Por
ejemplo, la ilustración anterior lista los eventos para un objeto Botón de orden, de un lenguaje visual. Si
escribiésemos código para el evento DoubleClick de un Botón de orden, puede que el usuario jamás
active el evento, debido a que el procedimiento convencional de un Botón de orden es siempre una
única pulsación.
¿Y cómo escribiremos código para múltiples eventos? Tendremos que conocer el orden en el que se
producen estos eventos. Por ejemplo, si tenemos código en el evento Click y en el evento DoubleClick,
cuando el usuario pulse dos veces sobre el Botón de orden, el evento Click siempre se producirá antes
que el evento DoubleClick, debido a que la primera pulsación de un doble click se detecta como una
sola pulsación o como un evento Click. ¿Qué ocurrirá entonces si escribimos código adicional para los
eventos MouseUp y MouseDown del Botón de orden? ¿Qué evento se activaría primero? Conocer el
orden de los eventos es algo crucial en la programación conducida por eventos. Si no conocemos el
orden en el que se producen los eventos, nuestro código 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 introducción. Si usted
querido lector desea profundizar en esta técnica de programación 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 programación, si es un potente gestor de bases de datos, que incluye el VBA, que le
permite realizar aplicaciones altamente profesionales.
24
El lenguaje Visual Basic para Aplicaciones, normalmente es suministrado por Microsoft en sus productos, tales como
MS Office.
El manual de un sistema siempre se desarrolla, mucho antes que los manuales de los
programas, dado que para el desarrollo u optimización de un sistema, se requiere un trabajo
previo llamado Análisis y Diseño 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 deberán desarrollar.
Invariablemente los manuales de los programas, también llamados cuadernos de carga,
serán complementados con información que anexará el programador.
Dependiendo de la técnica de análisis utilizada, se tendrá la estructura del o los
manuales del sistema. Una de estás técnicas, por ejemplo, incluye lo que serían tres capitulos
dentro del manual del sistema, como son:
1. Análisis Previo.
2. Análisis Funcional.
3. Análisis Orgánico.
Sin embargo, el Análisis y Diseño de Sistemas, será otra materia interesante y digna de
estudio por parte del lector25.
25
Sistemas de Información Gerencial. Autor: Ing. Domingo Olivares Barrios.
3. Tablas de impresión.
5. Hoja de corrida.
2. Diagrama de flujo.
5. Un diagrama de flujo del sistema puede incluirse para mostrar a que parte del
sistema corresponde este programa.
Convención Significado
Negrita En los procedimientos, indica el texto que usted escribe
Cursiva Índica un término del glosario.
Así mismo, deberá contener información acerca del lugar o persona de contacto
para obtener soporte técnico.
• Introducción (o bienvenida).
Con una breve descripción acerca de las facilidades del programa o sistema, o
bien, de las innovaciones, si es que es una versión actualizada.
• Capitulos de las opciones (uno para cada opción 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 número de éstos se
desarrollarán a criterio del equipo de trabajo que desarrolla los manuales del
sistema o programa.
• Glosario.
Con definiciones de términos técnicos y conceptos.
LINEALES
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. Diseñar un programa que sume dos quebrados, y muestre el resultado en forma de quebrados.
4. Diseñar un programa que calcule el promedio final del nivel, el cual consta de tres materias:
Introducción a la computación, Sistema Operativo y Lenguajes Algorítmicos.
5. Encontrar la media ponderada de tres puntuaciones de exámenes. Los pesos asociados son: 30 %,
30 % y 40 %.
TOMAS DE DECISION
8. Muchas universidades hacen que a los estudiantes del primer curso que están a punto de suspender
una asignatura se les dé un aviso. Usted ha de calcular media de las puntuaciones de tres exámenes
e imprimir el número de control del estudiante, la media y si el estudiante ha pasado o no. Para
pasar se necesita una media de 60 puntos como mínimo. Si el estudiante ha pasado, pero con
menos de 70 de media, indicar que el o ella esta dudoso.
9. Diseñar un programa que acepte 3 números diferentes por teclado y despliegue el número mayor. Si
en la entrada algún número es igual entre sí deberá ser rechazado.
12. Hacer un programa que pida la temperatura y despliegue el deporte que es apropiado hacer a esa
temperatura usando la siguiente tabla:
13. Diseñar un programa que calcule el pago por consumo de energía eléctrica, según la siguiente tabla:
HASTA 15 $ 1.50
LOS SIGUIENTES 60 $ 2.00
MAS DE 75 $ 2.50
VUELOS TIEMPO
15. Realizar un programa que efectúe la suma de 15 números dados por teclado y despliegue el
resultado.
16. Diseñar un programa que genere y despliegue los números del 1 al 100.
17. Diseñar un programa que simule el juego de ROCA - PAPEL - TIJERA. Para dos jugadores, a
ganar tres juegos; los empates no cuentan.
18. Diseñar 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. Diseñar un programa que lea los resultados de los exámenes de veinticinco alumnos y nos diga
cuantos obtuvieron las siguientes calificaciones:
ACIERTOS CALIFICACION
95 – 100 A: EXCELENTE
85 – 94 B: MUY BUENO
75 – 84 C: BUENO
65 – 74 D: REGULAR
0 – 64 E: MALO, REPROBADO
20. Diseñar un programa que clasifique a las personas, según su edad y sexo, y nos diga cuantas
integran cada grupo según la siguiente tabla:
EDAD GRUPO
0 – 13 niños
14 – 18 adolescentes
19 – 25 jóvenes
26 – 35 adultos jóvenes
36 – 55 personas maduras
56 en adelante personas mayores
21. Diseñar un programa que haga un examen de 10 preguntas y dé el número de buenas, el número de
malas y la calificación obtenida según una escala de 0 a 100.
22. Diseñar un programa que simule un cajero automático, dando cambio en las siguientes
denominaciones:
BILLETES MONEDAS
$ 100 $ 2.00
$ 50 $ 1.00
$ 20 $ 0.50
$ 10 $ 0.20
$5 $ 0.10
23. Diseñar 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 comisión correspondiente:
24. Diseñar 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
26. Diseñar un programa que pida la temperatura de cada hora del día, y que encuentre la temperatura
promedio y las temperaturas más alta y más baja del día.
27. El Instituto México desea que se capturen los siguientes datos de los alumnos: Matricula, nombre,
calificación 1, calificación 2.
Para calcular y desplegar sus promedios. Se debe considerar la opción de continuar.
28. Realice un programa para simular el proceso que realiza una caja registradora.
El supermercado " Las Américas " hace un descuento del 10% a los artículos marcados con
la clave " AL79 " y un 15% a los artículos que tienen la clave " AM80 ". Desplegar el total de la
compra y aplicar centinela para finalizar.
29. Diseñar un programa que solicite valores y los almacene en una matriz.
30. Diseñar un programa que solicite valores numéricos, los almacene en una matriz cuadrada, y
obtenga la suma de los elementos de la diagonal principal.
Muchas veces nos encontramos con la necesidad de realizar alguna tarea determinada y no
disponemos de ninguna función en las librerías del compilador que la realice. Si se prevé esta tarea más
veces, se compila, se añade a una de nuestras librerías y cada vez que la necesitemos, enlazamos
nuestros programas con ella, sin preocuparnos de nada más. El enlazador se encargará de buscarla
dentro de la librería y añadirla al ejecutable dejando las que no necesite para otra ocasión.
Si poseemos un conjunto de rutinas compiladas con las que enlazamos nuestros programas de
forma habitual, estaremos añadiendo espacio innecesario a los ejecutables, a no ser que las utilicemos
todas. El enlazador añade al ejecutable todo el código de los módulos compilados, los use o no,
mientras que con las librerías sólo añade la parte del código que necesita.
Si poseyéramos todas nuestras rutinas compiladas por separado en módulos objeto y tuviésemos
la precaución de enlazarlas una por una con nuestro programa cuando éste las necesite, estaríamos
haciendo exactamente la misma función que hace el enlazador con una librería.
CONSTRUCCION DE LIBRERIAS.
Librería
REGLAS BÁSICAS.
Para diseñar una librería no basta con conocer bien la mecánica de funcionamiento del programa
constructor de librerías. Hace falta también seguir una serie de normas que optimicen el uso que más
tarde se hará de nuestro programa. Algunas de estas normas básicas a observar son:
• En caso de agrupar funciones en un mismo módulo 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 librería que no se usen para el resto de
los programas.
• Hemos de procurar también que las funciones de nuestras librerías estén bien depuradas y pasen
pruebas completamente rigurosas.
• Establecer un código de error que devuelvan las funciones cuando algo no vaya bien, por ejemplo –
1. Este código 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 ejecución es normal.
Cuando trabajamos en equipo, y esto suele ser lo habitual, es lógico 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 librería común donde vayan a
parar todas las rutinas de utilidad comunes. Es muy importante que la creación y el mantenimiento de
esta librería 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 Técnico). Un modelo de la organización para la gestión de una librería
común podría regirse por las siguientes normas:
1. Debe haber una librería común CHAPUZAS.LIB para todos los desarrollos que la empresa lleve
adelante. La responsabilidad última del uso y mantenimiento de esa librería es del Director
Técnico. No obstante, deberá existir una Comisión de Control de Calidad encargada de la decisión
de incorporación de funciones ya desarrolladas y del planteamiento de la necesidad de nuevas
• Nombre de la función.
• Fecha de creación.
• Nombre del creador.
• Fecha de cada modificación.
• Nombre de cada modificador.
• Parámetros que usa con explicación detallada de los tipos, valores y funciones de cada uno de
ellos.
• Lo devuelto en caso de error.
• Si maneja bases de datos, relación de las estructuras e índices.
• Si llama a otras funciones de la misma u otras librerías complementarias, la especificación de la
misma.
• Breve descripción 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 aplicación
y que tenga el carácter genérico como para ser incorporada a la librería, y no pueda esperar a la
reunión de control de calidad, podrá desarrollarla por sí mismo e incorporarla a su código como un
módulo OBJ. La comisión decidirá más tarde si:
En el pasado, el mayor problema con el que nos podíamos encontrar, cuando estábamos
realizando una aplicación, es que ésta no nos cupiera físicamente en la memoria de trabajo de nuestro
ordenador. El único modo que teníamos de solucionar este problema era proceder a los que
denominamos segmentación, programación por capas, solapes y overlays. Generalmente los overlays
eran de carácter estático. Es decir, el programador los diseñaba en el momento de programar la
aplicación y, de forma independiente al sistema en que la aplicación se implantara, los overlays
quedaban dimensionados hasta que el programa se reenlazaba bajo otros criterios. Actualmente muchos
lenguajes solucionan este problema mediante la técnica de overlays dinámicos. Con estos el
programador se olvida de seguir ningún criterio especial, siendo el propio sistema quien decide que
parte del código se posiciona en el área de memoria principal y qué parte en el área de overlay.
Dado que los lenguajes actuales solucionan de forma automática el problema, quizá nunca tenga
que usar la técnica de overlays estáticos. Sin embargo, aún algunos lenguajes y enlazadores también lo
permiten, además de la estándar dinámica. En ocasiones, para integrar los módulos objetos de código
de diferentes lenguajes o para solucionar enrevesadas situaciones de gestión de memoria, quizá use
overlays estáticos. Algunos enlazadores sólo gestionan overlays dinámicos para ciertos lenguajes, por
ello será muy necesario que en aplicaciones grandes donde usted integre rutinas entre lenguajes
diferentes, diseñe áreas de overlays estáticos para facilitar la ubicación de las mismas. Por todo ello
vamos a explicar a continuación como trabajar con este tipo de overlays.
Cuando programamos usando esta técnica, lo que hacemos es dividir nuestra memoria RAM en
dos o más áreas de trabajo. En la primera de ellas (área principal) se carga el módulo ejecutable y en las
áreas de solape se cargan y descargan, conforme se van usando, los diferentes módulos overlay que
hayamos definido.
Los overlays estáticos permiten diversas configuraciones. La más básica 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 aplicación que posee la siguiente estructura de módulos:
PROGPRIN MODULO1
MODULO2
MODULO3 SUBMOD1
SUBMOD2
PROGPRIN PROGPRIN
MODULO1 o MODULO1 o
MODULO2 o MODULO2
MODULO3
AREA DE OVERLAY 2
MODULO3
TERCERA FORMA
AREA PRINCIPAL
PROGPRIN
AREA DE OVERLAY 1
MODULO1 o
MODULO2 o
MODULO3 con
SUBMOD1 o
SUBMOD2
Hasta ahora hemos manejado muchas variables, sin embargo, independientemente del tipo de
datos que contengan, éstas pueden ser estáticas o dinámicas.
Una variable estática, que es la más común, 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 están siempre allí (durante la ejecución). 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 dinámicas.
Esto significa que se puede definir un tipo en tiempo de compilación, pero realmente no crear una
variable de ese tipo hasta el tiempo de ejecución.
Estas variables dinámicas pueden crearse o destruirse en cualquier momento durante la
ejecución del programa. Pueden definirse de cualquier tipo simple o estructurado.
Referenciamos a una variable dinámica no por su nombre sino mediante un puntero. Un puntero
es una variable que contiene la dirección (posición) de memoria de la variable dinámica a la que
referencia. Cada nueva variable dinámica creada tiene un puntero asociado para referenciarla
(seleccionarla).
¿Cuándo son necesarias las variables dinámicas? Cuando necesitamos almacenar datos en una
variable de tipo arreglo, pero con la incertidumbre del número de elementos a manejar; por ejemplo, si
deseamos almacenar una lista de alumnos en un arreglo, sería complicado definir un arreglo estático, si
consideramos que la cantidad de alumnos por grupo es variable.
¿Qué podemos hacer si no sabemos cuántas 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. ¿Cómo insertar o suprimir una
componente? La inserción o supresión de componentes de una arreglo supone el desplazar parte del
arreglo una componente en una u otra dirección. Si la lista (arreglo) es muy larga, la inserción o
supresión de componentes necesitará una cantidad significativa de tiempo.
Podemos usar variables dinámicas para evitar estos problemas de las variables estáticas tales
como el arreglo. Podemos crear nuevas componentes para nuestra lista sólo cuando se necesiten,
usando variables dinámicas como componentes. Haciendo que cada componente contenga el enlace o
puntero a la siguiente componente de la lista, podemos crear una estructura de datos dinámica que se
expande o contrae conforme se ejecuta el programa.
ORDENACION
INSERCION
SUPRESION
PUNTEROS
Las variables dinámicas no son referenciadas mediante el nombre sino mediante un puntero. El
tipo puntero (pointer) es un tipo de datos predefinido en algunos lenguajes de programación.
Una variable referenciada, es una variable accedida no por su nombre sino por una variable
puntero; una variable dinámica.
Para crear una variable referenciada se usa, en Pascal por ejemplo, el procedimiento estándar
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.
¿Cómo 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
válidas estas asignaciones, en el caso del Pascal:
Ptr1^:= 18;
Ptr2^:=ROJO;
Ptr3^:=TRUE
Ptr2 Ptr2
ROJO ROJO
Ptr3 Ptr3
TRUE TRUE
18
Los punteros son importantes para crear estructuras de datos dinámicas. 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 dinámica. Puede contener campos de diferentes tipos con
el puntero siendo uno de ellos. Por ejemplo, en Pascal tendríamos:
Para definir una variable dinámica se describe lo que esa variable puede ser en la sección de
declaración de tipos de datos del lenguaje. En la sección de declaración 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 creación de variables puntero (NEW para Pascal), en la
sección de declaración de variables.
Observe que la definición de TipoPtr incluye al identificador Persona el cual aún no está
definido. En la definición de un tipo puntero debe usarse un identificador de tipo. Este identificador de
tipo es una excepción 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 creación de punteros, durante el tiempo
de ejecución. Al volver de dicho procedimiento, se ha creado una variable registro del tipo Persona. La
información sobre dónde está posicionada la variable se deja en la variable puntero Ptr. Observe que
los campos de esta nueva variable están indefinidos.
Ptr Variable del tipo PERSONA
Nombre
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 dinámicamente, 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 dónde se encuentra la siguiente y así hasta que se encuentra un premio. Si no se da la
posición de la primera pista entonces no hay forma de empezar la cadena. Si la posición dada
corresponde a una pista de la mitad de la cadena, no hay forma de encontrar las pistas anteriores.
Cuando una variable dinámica tal como Ptr no se necesita más, el procedimiento de liberación
de memoria (DISPOSE par Pascal) la devolverá, de forma que la memoria ocupada por ella pueda
asignarse más adelante si se necesita. Esto se llama devolución a la memoria disponible.
Cualquier operación que sea válida sobre una variable con nombre de un cierto tipo lo es sobre
una variable dinámica de este tipo. Sin embargo, sólo las asignaciones y las comparaciones para ver si
son iguales, son operaciones válidas con las variables punteros. Por ejemplo, dadas estas operaciones en
Pascal:
Observe que PtrA^ + PtrB^ es válido porque hemos añadido los contenidos de las dos variables
del tipo Rango apuntadas por PtrA y PtrB. PtrA + PtrB no sería válido porque no se pueden sumar
variables punteros. Podemos sólo asignar punteros del mismo tipo o compararlos para ver si son iguales
(B)
(A)
PtrA PtrB
15 15
28 28
LISTAS ENLAZADAS
Una de las estructuras de datos que podemos construir usando variables dinámicas y punteros se
conoce como lista enlazada. De hecho, es la estructura enlazada que hemos descrito en la primera parte
de este apéndice.
Puesto que sólo podemos acceder a las variables dinámicas mediante un puntero (^), ¿tenemos
que tener tantas variables punteros como variables dinámicas haya (componentes) en la lista? ¿Cuál 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 dinámica será un registro con un campo conteniendo un
puntero al siguiente.
El siguiente segmento de código en Pascal, crea una lista de cinco variables del tipo
AlgunRegistro, todas enlazadas juntas.
LISTA ENLAZADA
¿Cómo crea este código una lista? ¿Por qué necesitamos tres punteros? Hagamos un recorrido lógico
del código 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
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;
Ptr1 := Ptr2
La secuencia de diagramas siguiente, muestra cómo se añade 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
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 cuándo se alcanza el final de la lista. Esta técnica se usa cuando se busca en
(se recorre) la lista.
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 algún tipo de bucle en el que la expresión 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 condición del bucle será que el puntero sea igual a NIL.
VAR P: Puntero;
BEGIN
P := List;
WHILE P <> NIL DO
BEGIN
WRITE(P^.Info);
P := P^.Siguiente
END
END;
Este procedimiento funcionará incluso para una lista vacía (Lista = NIL).
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 búsqueda.
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
Causa un error al final de la lista. El tratar de acceder a Ptr^ cuando Ptr es NIL causará un error
en tiempo de ejecución.
Nuestro bucle tendrá que tener dos condiciones. Nuestra primera idea podría ser usar
pero esto no funcionará. La mayoría de los compiladores de Pascal evaluarán ambas comparaciones de
la expresión incluso si la evaluación 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.
Esto tiene en cuenta los tres casos: la inserción por el principio, por la mitad y al final. El siguiente
procedimiento representa nuestro algoritmo de inserción general.
BEGIN
NEW(P);
P^.Info := Elemento; (* obtiene un nuevo nodo *)
Anterior := NIL;
Ptr := List;
Encontrado := False;
WHILE (Ptr <> NIL) AND NOT Encontrado DO
Observe dos cosas en este procedimiento. La primera es que el parámetro List tiene que ser un
parámetro 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 más que
cambiar el tipo de Elemento.
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 supresión del primer nodo y la supresión de un nodo con un
campo Info determinado.
El quitar el primer nodo es simétrico a insertar un elemento como el primer nodo. El valor del
campo Info del primer nodo quitado de una lista se devolverá como un parámetro de salida.
VAR P: Puntero;
BEGIN
P := List; (* guarda List para devolverlo a la memoria disponible *)
Elemento := List^.Info;
List := List^.Siguiente;
DISPOSE(P) (* envia P^para que pueda usarse de nuevo *)
END;
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.
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 ejecución
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^
La asignación
P^ := Q^
Da
Ahora los dos punteros P y Q apuntan cada uno a una variable diferente que contiene un GATO. Sin
embargo, la asignación
P := Q
La variable que contiene Perro está aún 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.
Además de las listas enlazadas hay otras muchas estructuras de datos dinámicas 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
sección sobre manejo de listas enlazadas? Esos nombres se utilizan en la terminología sobre pilas.
Una pila se define como una estructura de datos dinámica en la que se accede sólo 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-In-
First-Out) que significa que el último en entrar es el primero en salir. Una pila de datos o bandejas en
una cafetería o panadería tienen esta propiedad. Usted puede tomar sólo 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 continuación 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.
Tope := NIL;
WHILE NOT EOLN DO
BEGIN
READ(Ch);
Meter(Tope, Ch)
END;
WHILE Tope <> NIL DO
BEGIN
Sacar(Tope,Ch);
WRITE(Ch)
END
Una cola es una estructura de datos dinámica 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 situación.
Mientras que la terminología usada en la literatura anglosajona para referirse a la inserción y
supresión en pilas es estándar (Push, Pop), no existe tal estandarización con las colas. La operación 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 operación 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 vacía 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 continuación de Final^ y redefinir
Final para que apunte al nuevo elemento.
Para los dos procedimientos siguientes usaremos las siguientes declaraciones.
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 vacía después de quitar el elemento. Si queda vacía, debe ponerse Final a NIL.
BEGIN
Sacar(Frente, Elemento);
IF Frente = NIL
THEN Final := NIL
END;
El concepto de lista enlazada puede extenderse a estructuras que contienen nodos con más de un
campo puntero. Una de estas estructuras se conoce como árbol. El diagrama mostrado a continuación se
llama arbol binario, cada nodo tiene como máximo dos descendientes.
El árbol se referencia mediante un puntero externo al nodo especial llamado raíz. La raíz 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 búsqueda son árboles que tienen la propiedad de que la información de
cualquier nodo es mayor que la información de cualquier nodo de su hijo izquierdo y de cualquier nodo
de sus hijos, y menor que la información de su hijo derecho y cualquier nodo de sus hijos.
El árbol anterior es un ejemplo de árbol binario de búsqueda. La razón de su utilidad está en que
si se busca un cierto número, se puede saber después de una comparación en qué mitad del árbol está.
Con otra comparación se puede saber en qué mitad de esa mitad estaría. Así se continúa hasta que se
encuentre el elemento, o se sepa que no está en el árbol.
Probemos con el número 50.
El hijo izquierdo de 19 es NIL por lo que el 18 no está en el árbol. No sólo sabemos que no está
allí, sino que si queremos insertarlo, estamos en el lugar en el que se insertaría.
Librerías en Clipper 5.
Grupo EIDOS. Francisco Marín Quirós, Antonio Quirós Casado, Antonio Torres Lozano.
PASCAL.
Nell Dale, David Orschalic.
Editorial McGraw Hill.
QBasic.
(Un libro muy bueno que tenía, sin embargo lo perdí).
Y algunos más, que me prestaron momentáneamente, o que preste y nunca me devolvieron, razón
por la cual no tengo las bibliografías.