~~ -110· ~
C.L. TruiiUO
A mi hija Victoria 1 su iniciación a los estudi, escolares de Informática
(
METODOLOGÍA DE LA PROGRAMACiÓN
Diagramas de flujo, algoritmos y programación estructurada Prohibida la reproducción total o parcial de esta obra,
por cualquier medio, sin autorización escrita del editor.
DERECHOS RESERVADOS © 1988, respecto a la primera edición en español por McGRAW-HILL/INTERAMERICANA [)f MEXICO, S.A. DE C.V. Atlacomulco 499-501, Frace. Industrial San Andrés Atoto 53500. Naucalpan de Juárez, Edo. de México Miembro de le Cámara Nacional de la Industria Editorial, Reg. Núm. 1890
ISBN 968-422·192·4 5678901234
( CAL·87
Impreso en México
Esta obra se terminó de imprimir en marzo de 1990 en Editorial Calypso, SA Oculistas No. 43 Col. Sifón Delegación Iztapalapa 09400 México, D.F. Se tiraron 1000 ejemplares
9123456780 Printed in Mexico
f/ 'f
{
I I ¡ !
CONTENIDO
PROLOGO.............................................
xi
1. ALGORITMOS Y PROGRAMAS ...... :.......................
1
1.1. Concepto y descripción de un proceso 1.2. Algoritmos "......... 1.2.1. Características de los algoritmos. . . . . . . . . . .. . . . . . . . . . . . 1.3. Datos, tipos de datos y operaciones primitivas 1.3.1. Datos numéricos 1.3.2. Datos no numéricos 1.4. Constantes, variables y expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1. Constantes 1.4.2. Variables........................................... ;.................... 1.4.3. Expresiones 1.5. Los programas '. . . . . . . . . . . . . .. . .
1 .2 3 3 4 5 6 6 7 7 9
2. DIAGRAMAS DE FLUJO .. . .. .. .. .. .. .. .. .. .. .. . . .. .. . .. .. . ..
11
2.1. Introducción ,. 'l' • • • • • • • 2.2. Diagramas de flujo \.:....... 2.3. Símbolos utilizados en los diagramas :......... 2.3.1. Diagramas de flujo de sistema 2.3.2. Diagramas de flujo de detalles/ordinogramas . . . . . . . . . . . . 2.3.3. Plantillas y hojas de codificación 2.4. Diagramas de flujo estructurados. . . . . . . . . . . . . . . . . . . . . . . . . . . .
11 14 15 15 20 29 31 vii
PROLOGO
xii
xlii
PROLOGO
ya se ha comentado, a los estudiantes o estudiosos que comienzan la programación. Persigue como objetivo fundamental el aprendizaje en las técnicas de programación clásicas y modernas; pretende servir a personas sin conocimientos previos de programación o que bien poseyendo conocimientos de algún lenguaje deseen afianzarlos con técnicas de programación y diferencias esenciales con otros lenguajes. El libro está concebido para el estudio independientemente de cualquier lenguaje de programación; sin embargo, nuestra experiencia nos dice que el alumno/lector se siente más motivado si se le muestran las técnicas básicas y sus herramientas equivalentes en lenguajes de alto nivel, de modo simultáneo. Esa es la razón por la cual, a lo largo del libro, se explican las estructuras fundamentales junto con su codificación en los lenguajes de programación más populares: BASIC, Pascal y COBOL. Esta obra sigue el programa oficial de la asignatura "Metodología de la Programación" de los Cursos de Informática de la Facultad de Ciencias Políticas y Sociología "León XIII" de la UPS (Universidad Pontificia de Salamanca), pero creemos será válida para cualquier curso de introducción a la programación en nivel bachiller, formación profesional, universitario o simplemente cursos de formación, siempre que se tomen de su contenido las partes que más puedan afectar al nivel educativo del alumno. Esta consideración la realizamos en base a su contenido, dado que se parte de conceptos elementales hasta llegar a los temas fundamentáles de la programación estructurada y modular, base de los lenguajes de programación clásicos y modernos. Conceptos como diagramas de flujo, algoritmos, estructuras de datos, tablas de decisión y las mencionadas técnicas de programación estructurada y modular constituyen el soporte sobre el que se asienta el libro. Niklaus Wirth, padre del lenguaje Pascal, tituló a una de sus obras más famosas -por otra parte, imprescindible como texto u obra de consulta en cualquier nivel de pro'gramación, esencialmente universitario- Algoritmos + Estructuras de datos = Programas (título de la traducción española), tal vez, pensamos, queriéndonos indicar a sus lectores y alumnos, la importancia de los conceptos algoritmo y estructura de datos, sin cuya existencia sería imposible construir un programa. Por ello, siguiendo las directrices del profesor Wirth, hemos concebido la obra pensando en algoritmos y estructuras de datos junto con su soporte en pseudocódigo, pero, sin olvidar las técnicas clásicas como son los diagramas de flujo y tablas de decisión, a las que se le han dedicado capítulos completos que facilitan su comprensión.
CONTENIDO La obra está estructurada en siete capítulos, que siguen un nivel creciente de dificultad, pero utilizando la técnica pedagógica de repetición de los conceptos fundamentales a lo largo de todo el texto, de modo que se puedan asimilar en el tiempo más breve posible, a la par que permitir el estudio de cualquier capítulo sin necesidad estricta de lectura del capítulo anterior y así facititar, especialmente
al profesor, seguir el método pedagógico que considere más oportuno -algunos· compañeros del Area de Lenguajes de la Facultad, me han sugerido que según el tipo de alumnos, conocimientos o lenguaje próximo a estudiar, podría ser más provechoso no seguir en algunos puntos el contenido por capítulos del libro; evidentemente estoy de acuerdo con ellos, siempre que se trate de alumnos o lectores que ya posean conocimientos de algún lenguaje o de programación en sí. El tiempo estimado de duración para un máximo aprovechamiento en cursos escolares sería un cuatrimestre. En los casos de cursos intensivos, pensamos podría impartirse en períodos de 20 ó 30 horas lectivas, siempre que se iniciase inmediatamente después del estudio del lenguaje. El Capítulo 1 introduce al lector en el concepto de algoritmos y programas, resaltando los términos elementales de acción, proceso, datos y expresiones. El Capítulo 2 se dedica a las herramientas clásicas de programación: diagramas de flujo, pseudocódigos y diagramas N-S, dedicando especial atención a los diagramas de flujo, herramienta que todos los estudiantes hemos estudiado y utilizado. Así como los Capítulos 1 y 2 son introductorios y sus conceptos básicos se repetirán y ampliarán en el resto de la obra, el Capítulo 3 describe la estructura general de un programa, y con el Capítulo 4 se comienza, en realidad, a profundizar en la programación. Los conceptos de programa, lenguajes de programación: alto nivel/bajo nivel, compiladores/intérpretes, instrucciones, operadores, tipos. de programa, etc., se describen en este capítulo. El Capítulo 4 se dedica a fijar las ideas fundamentales de las técnicas de programación, volcando todo lo aprendido en los Capítulos 1 a 3. Las técnicas esenciales de bucles, iteraciones, contadores, interruptores, totalizadores, bifurcaciones, subrutinas, subprogramas, funciones, procedimientos... se analizan con detalle y gran número de ejemplos y aplicaciones. Basado en el teorema de la estructura de Jacopini, se establecen las estructuras básicas: secuencial, selectiva, iterativa junto con los pseudocódigos en inglés y español. El lector aprenderá las estructuras fundamentales IF-THEN-ELSE-ENDIF, DOWHILE, DOUNTIL (o sus equivalentes WHILE, REPEAT, UNTIL), CASE, etc. El Capítulo 5, tras el estudio de diagramas de flujo y algoritmos, se dedica a la estructura de datos, parte básica en el tratamiento de la información: listas, tablas, matrices, pilas, colas, árboles, etc. El Capítulo 6 estudia las Tablas de Decisión, herramienta clásica en programación, que si bien en algunos campos puede haber perdido influencia, sigue siendo una herramienta válida sobre todo en la fase de definición y análisis del problema y como paso previo a la codificación del programa. El Capítulo 7 recoge las nociones de programación estructurada y modular que si bien los conceptos elementales ya han sido tratados en los capítulos anteriores, en éste se recogerán las reglas específicas para la construcción de programas estructurados y modularizados que permitirán una fácil puesta a punto y sobre todo un mantenimiento eficaz durante la vida útil de dichos programas. -.'
.,
xiv
PROLOGO
AGRADECIMIENTOS Muchas personas me han alentado a escribir esta obra y citarlas a todas me llevaría con toda seguridad a un olvido imperdonable. Sin embargo, es justo reconocer el apoyo y aliento que me han prestado todos mis compañeros del Area de Lenguajes de la Facultad de Ciencias Políticas y Sociología "León XIII" de Madrid, junto con sus críticas y consejos. Aunque como antes dije la lista de agradecimientos sería larga y no querría arriesgarme a olvidos que serían para mí muy lamentables, quiero hacer una excepción con tres compañeros que han leído toda la obra, me han corregido erorres y erratas y me han dado sabios consejos. Son los profesores del Area de Lenguajes: Herácleo Hurtado Muñoz, Juan Corrochano del Pino y Juan Martínez Pirla. Deseo expresar mi reconocimiento a los órganos institucionales de la Facultad que apoyaron desde su concepción la obra y principalmente la asignatura: Ordenación, Academia, Gerencia y Jefatura de Estudios y cómo no la ya mencionada Area de Lenguajes,.que, además, pondrá en marcha la obra y confio criticará constructivamente la obra para mayor beneficio de los alumnos.
-;~
CAPITULO 1
ALGORITMOS Y PROGRAMAS
EPILOGO El objetivo fundamental de la obra es facilitar la introducción a la programación y a sus técnicas a los alumnos y lectores que sigan y me honren con su lectura; si lo conseguimos -al menos en alguna medida- las numerosas horas de estudio y trabajo a lo largo de todo el verano del 86 y el comienzo del curso escolar 86/87 estarán sobradamente compensadas.
El autor. Madrid, noviembre de 1986.
1.1. CONCEPTO Y DESCRIPCION DE UN PROCESO Una acción es un suceso o acontecimiento producido por un actor (ejecutante). Tiene la característica de una duración limitada y produce un resultado bien definido y previsto. El tener una duración limitada en el tiempo implica la existencia de un instante inicial de la acción (t) y un instante final (t). Para poder reconocer el resultado del sistema debe estar provisto de indicadores que tomen valores diferentes. El valor de estos indicadores se denomina iriformación. El conjunto de los valores de los distintos indicadores en un instante dado (t) del desarrollO del acontecimiento se denomina estado en el instante t del sistema observado. El resultado es el estado del sistema en el instante (n' El estado del sistema ert t o define los datos de la acción. .
, Proceso es una acción que se puede descomponer en otras más simples, o
también conjunto de fenómenos organizados en el tiempo y concebidos como activos. Se puede ~nsiderar un proceso como un conjunto de acciones elementales que forman un acontecimiento. Procesador es el elemento capaz de ejecutar un determinado proceso de trabajo. Los procesos pueden ser: secuenciales y paralelos.· Un proceso es secuencial si una acción del mismo no puede empezar antes que la acción en curso esté completamente terminada; en otras palabras: dos acciones no se ejecutan simultáneamente, sino en un orden secuencial. Un proceso es paralelo si se ejecutan simultáneamente dos o más acciones. 1
2
METODOLOGIA DE LA PROGRAMACION
A lo largo del libro sólo trataremos los procesos secuenciales que en un instante dado tan solo pueden ejecutar una única acción. Un ejemplo típico de proceso es: Un cocinero elabora un plato de cocina (por ejemplo, un estofado de carne para 6 personas): Las acciones a seguir son: calentar el aceite, freír la carne, poner condimentos, etc. U n ejemplo de proceso secuencial es: Un estudiante calcula el producto de los números naturales m=25 y n=36.
La descripción del proceso necesitará: 1. La lista de datos. 2. El conjunto de acciones, orden de éstas y condiciones que determinan la ejecución de una u otra acción. Los procesos en los que estamos interesados son aquellos que se pueden repetir y en los cuales el resultado no depende del ejecutor (siempre que éste se atenga perfectamente al punto 2 anterior). El proceso nos ha de servir para resolver todos los problemas de cierto tipo (todos los que resultan de tomar m y n como números naturales).
1.2. ALGORITMOS U n algoritmo es una serie de operaciones detalladas y no ambiguas, a ejecutar paso a paso, y que conducen a la resolución de un problema. En otras palabras,
;un algoritmo es un conjunto de reglas para resolver una cierta clase de problema una forma de describir la solución de un problema)Una receta de cocina para
¡o
hacer «cordero asado» es un algoritmo. Un algoritmo es el medio por el que se explica cómo puede resolverse un problema, mediante aproximaciones paso a paso. Se puede formular de muchas formas, siempre y cuando se realice de modo no ambiguo. Para describir algoritmos de computadoras se han diseñado lenguajes de programación. Cada una de las acciones de las que consta un algoritmo se llamará sentencia y éstas deben ser escritas en términos de cierto lenguaje comprensible para el ejecutor (máquina), que es el lenguaje de programacion. El conjunto formado por la representación de datos utilizada y el algoritmo en sí, se conoce usualmente con el nombre de programa. En esencia, un programa es la descripción del proceso en un cierto lenguaje, o dicho de otra manera: la secuencia de acciones entendibles por la computadora conducen a realizar una tarea determinada y el correcto tratamiento de unos datos. Recordemos la d~finición de algoritmo dada por el profesor Niklaus Wirth, padre del lenguaje Pascal: Un algoritmo o programa de computadora consiste en dos partes esenciales: una descripción de acciones que deben ser ejecutadas y una descripción de los datos que son manipulados por esas acciones. Las acciones se describen mediante las llamadas sentencias y los datos mediante declara-
,.
ALGÓRITMOS y PROGRAMAS
3
ciones y definiciones (PASCAL. User Manual And Report. Springer-Verlang. New York Inc., 1975). Los programas constan de una serie de sentencias (líneas de información con unas determinadas reglas de sintaxis). Estas partes elementales de un programa que son las sentencias se componen a su vez de instrucciones que son las acciones concretas que debe realizar la máquina. Con frecuencia las palabras sentencia e instrucciones se confunden o consideran sinónimas. Nosotros preferimos utilizar sentencia para lenguajes de alto nivel -próximos al usuario- e instrucciones para lenguajes de bajo nivel y máquina -próximos a la máquina.
1.2.1. Características de los algoritmos Se observa, normalmente, que el número de operaciones que realiza un algoritmo (o programa) no se conocen de antemano, aunque serájinito siempre que los datos sean adecuados. Por consiguiente, el número de operaciones que es preciso realizar al ejecutar un algoritmo dependerá de los datus del problema y solamente se conocerá al ejecutar éste. Las característicasfundamentales de un algoritmo o proceso algorítmico son: a) Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. , b) Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. . c) Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento. La definición de un algoritmo debería describir tres partes: entrada, proceso y salida. Un algoritmo implica generalmente alguna entrada (algo que existe y es utilizado por el algoritmo); en un algoritmo de receta de cocina, la entrada está constituida por los ingredientes y los utensilios empleados. Un algoritmo produce también resultados denominados salida. La salida de la receta será la terminación del plato (cordero asado). Un algoritmo describe la transformación
de la entrada en la salida. 1.3. DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS El primer objetivo de toda máquina (procesador) es el manejo de información o datos. La representación de los datos utilizada determina la forma del algoritmo; realmel1te, éstos dependen del tipo de información sobr:e la que actúa. En consecuencia, la identificación de los objetos (datos) que manipula el algoritmo debe realizarse sin ninguna ambigüedad para que la máquina sepa en cada momento qué tipo de datps manipula y cómo debe operar con ellos. El sistema de identificación de los datos que llamaremos definición de la estructura de datos, es, al menos, tan importante como los a1~oritmos que los transfdrman. Ji~~,~~,t,1:~;~,;;;~.,:);,'x- .,,;;¿:' .'
".;" ~ ; i¿ÚrAi:~¡Njj*~*gf' 'OM
r..
.,",~. ~
..,-..,·,~,',;~¡¡,B.
4
ALGORITMOS Y PROGRAMAS
METOOOlOGIA DE LA PROGRAMACION
El lenguaje de programación no es más que una notació n que describe las
un prograestructuras de datos y los algoritmos. Los datos con los cuales trabaja de un objetos los todos que igual Al es. ma se sitúan en objetos llamad os variabl para sirve que cador identifi o llamad e programa, las variables llevan un nombr o menud a tan ado examin ser puede valor referenciar su valor o contenido. Este un r atribui en e consist que acción La o. como sea necesario, borrad o o reescrit s por valor a una variable se llama asignación. Los datos y sus valores tratado El etc.). res, caracte os, (númer eza natural te un progra ma pueden ser de diferen tomar. puede que valores de to conjun tipo de una variable es el del distint os La mayor ía de las compu tadora s son capace s de trabaja r con res alfacaracte de s cadena o (series cos numéri no y tipos de datos: numéricos ~ béticos).
1.3.1 . Datos numé ricos y númeLbsdat os numéri cos se representan en dos formas: números enteros . formas ros rea/es. La compu tadora maneja de modo diferente ambas deciLos enteros corresponden a número s completos; no tienen compo nente malo fraccionario y pueden ser negativos o positivos. Ejemplos de enteros
-3245 4672 35
son:
45 -321
-5
. El rango normal de los número s enteros suele ir de -32768 a +32767 en nan almace se nes fraccio las l; decima punto un e siempr Los reales tienen almade la compu tadora como número s decimales porque no existe otra forma enteros que cenar numera dores u denom inadore s separados. Al contrar io de los pueden reales s suelen tomar valores en un rango determinado, los número os o positiv ser y tomar, teóricamente, cualqu ier valor de la recta numéri ca real negativos. Los siguientes ejemplos son número s reales:
34.6 231,51 2 -8,31
n:mx bte
I
1
n=mx~
m es la mantisa. e exponente, igual a un entero.
base del sistema de numera ción (norma lmente 10). 1 símbolo de la operación exponenciación En el sistema decimal el formato resulta ser: b
[ n = m x 1Ole
I
[
n=mx 10e
I
os tiene aunque el rango se dijo antes es indefinido, lógicamente a efectos práctic dígjtos dos e limitaciones. Norma lmente m puede conten er de 4 a 6 u 8 dígitos y positivos o negativos. Ejemplos típicos de número s reales en coma flotante son:
0.3456 7 34.567 0.386 3.4567
x x x x
10123 10115 101-7 10114
(i es el símbolo de la exponenciación): se sustituye normal mente por la letra e y entonces resultará: 0.3456 7 e23 34.567 e15 0.386 e-7 3.4567 e14 es La ocupación en memor ia de los número s enteros y los número s reales os aceptad s número de distinta. Así en el caso de los micros IBM pe, los tipos son:
enteros: rango -32768 a +32767 (ocupan 2 bytes de memoria). reales: simple precisión (7 dígitos de precisión). doble precisión (15 dígitos de precisión).
4567, 34 313,2 16 8,74
1.3.2 . Datos no numé ricos
sustituiEn notación de compu tadora la coma decimal no existe y es siempre da por un punto. os Al objeto de poder representar número s reales muy grandes o muy pequeñ inada denom n notació (3463.227.314 ó 0.000ססoo0003845) se ha diseñado una cient(fica o de coma. punto flotante que tiene el siguiente formato:
I
5
1
Existen fundam entalm ente dos tipos: datos alfanwnéricos y datos lógicos. eLos datos alfanuméricos se agfupan en series o cadenas de caracteres (caract 9; 8, oo., 2, 1, O, dígitos 10$ z; y, x, .." b, a, Z, Y, res alfabéticos A, B, .... X, ~aracteres especiales #, $, -, etc.). dero» y . Los datos lógicos son aquellos que pueden tomar dos valores «verda
~,~; ,""'iR,:' ~",\~~;wt1tfi,'tt't#i'+)
"\ .
é j"~2,:".L,
i"";';~',
6
METODOLOGIA DE LA PROGRAMACION
ALGORITMOS Y PROGRAMAS
7
1.4.2. Variables _ _ _ _ _ _ _ Datos
~ Numéricos
/~ E",~"
I
Cad enasd------e caracteres
. Reales
DeCimales
L09;'"
~ Coma flotante Figura 1.1.
Enteras (integer): Su representación interna está formada por una secuencia de bits en un código binario (complemento a uno, complemento a dos, código de exceso, signo y magnitud). Las variables enteras pueden ser declaradas explícitamente por el programador.
BASIC
A%,NOTAS% Tipos de datos de los procesadores.
f ~
A,NOTAS A!B#
Pascal var x, y, z: real; var u, v, w: real;
1<
Una variable es un objeto cuyo valor:~~s variable. Además de este valor toda variable posee dos atributos: un nombre (invariable, denominado en ocasiones, caso del lenguaje Pascal, identificador) que sirve para designarla y un tipo (invariable) que describe la posible utilización de la variable. Al definir una variable se ha de precisar su nombre y su tipo. El nombre como ya se ha indicado anteriormente se suele conocer como identificador. El valor de las variables puede ser modificado durante la ejecución del programa. Dependiendo de los lenguajes las variables pueden ser: enteras, reales, de caracteres y lógicas (booleanas) y tomarán los valores vistos enel apartado antenor. Una constante es un objeto de valor invariable. Este valor no cambia durante el proceso. Para expresar una constante se escribe explícitamente su valor, por ejemplo, 5, -70 ó 3.141519. La mayoría de los lenguajes permiten diferentes tipos de constantes, siendo las más comunes enteros, decimales, caracteres y booleanos (lógicos).
.. 1 .4.1. Constantes Constante entera (integer): es un número con un valor entero. positivo o negativo, por ejemplo, 3, -4, O. Constante real: Una constante real o decimal es un número escrito con un punto decimal. Obsérvese que 3.0, aunque su valor es un número completo o entero, se considera una constante decimal. Conscante de caracteres: es un conjunto de uno o varios caracteres. Normal~ mente los caracteres disponibles son letras mayúsculas, minúsculas, dígitos, s!.g·nos de puntuación y otros símbolos especiales. ~
var x, y, z: integer;
Reales: la codificación interna se representa en coma flotante o en notación científica.
BASIC
1.4. CONSTANTES, VARIABLES Y EXPRESIONES
Pascal
Caracteres (char): es un conjunto de caracteres.
BASIC
A$, B$ NOMBRES$
Pascal var a, b: char;
Boolean: puede tomar los valores de álgebra de Boole (O, 1) o bien (cierto, falso // true, false)
Pascal var a, b: boolean;
1.4.3. Expresiones Las expresiones son combinaciones de constantes variables, símbolos de operación, paréntesis izquierda y derecha y nombres de funciones especiales. Las mismas ideas se utilizan en notación matemática tradicional, por ejemplo: m(n+5)+jP
En la expresión anterior, los. paréntesis indican el orden de cálculo y .¡ representa la función raíz cuadrada. Cada expresión tiene un valor, que se determina tomando los valores de las variables y constarites implicadas y ejecutando las operaciones indicadas. Las expresiones se clasifican en dos tipos: expresioneS aritméticas expresiones booleanas
B
METODOLOGIA DE LA PROGRAMACION
ALGORITMOS Y PROGRAMAS
~(
1.4.3. 1. Expresiones aritméticas La mayoría de los lenguajes permiten diferentes tipos de expresiones. Expre siones aritméticas son análogas a las fórmulas matemáticas. Las variables ~ constantes son numéricas (enteros o reales) y las operaciones son las aritmética clásicas. resta multiplicación división
V: = 45 + 73 + 3 se le asigna a V el valor 121
a V se le asigna la resultante de la operación a + b - m, donde a, b y m son los I valores que en ese momento tengan.
Los símbolos +, -, *, / se denominan operado.res cuando actúan sobre deter minados datos: AB se suele escribir en un lenguaje de programación como A-B
Los paréntesis se utilizan también para agrupar términos juntos y asegurar que las oPeraciones se ejecutan en el orden correcto. En la expresión M*(N+5), la constante 5 se suma en primer lugar al valor N, y su resultado se multiplica por M. Cualquier ambigüedad se resuelve asociando a cada operador una prioridad o procedencia y ejecutando las operaciones en órdenes de prioridad. (En el capítulo 3 se ampliarán estqs conceptos.)
1.4.3.2. Expresiones booleanas Un segundo tipo de expresión es la expresión booleana, cuyo valor puede ser o bien verdadero o bien falso. Un medio de generación de expresiones booleanas es combinar constantes y expresiones booleanas por medio de los operadores booleanos and. or y noto Las reglas de funcionamiento de estos operadores así como los operadores relacionales o de comparación (=, >, <, > =, < =, < > ) se analizarán en detalle en el Capítulo 3. Algunos ejemplos de expresiones son: A + (B / C) - D 19 mod 4 A>B (A - 5) < (B - 6)
La asignación de una constante a una variable se realiza de acuerdo al formato siguiente:
v = constante V: = constante
(suma, resta, multiplicación, división...). El resultado de la evaluación de tal expresión será el valor que se le asigne a la variable indicada.
V: =a+ b-m
+ suma /
8
en lenguaje BASIC en lenguaje PASCAL
El segundo miembro de la asignación puede, de hecho, ser cualquier expresión en la que se tenga una combinación de variables, constantes y operadores
1.5. LOS PROGRAMAS Se podría considerar la programación como el conjunto de actividades y operaciones realizadas por el personal informático tendentes a instruir a la máquina para que pueda realizar las funciones previstas en el algoritmo. La programación se manifiesta en los programas (el concepto de programa se introdujo en el apartado 1.2). El desarrollo de un programa abarca diferentes etapas, de las cuales la escritura puede ser la menos significativa. La primera etapa al escribir un programa es la definición del problema. Una vez definido el problema se puede diseñar la solución. El diseño general elegido se desarrolla posteriormente en forma de algoritmo; un método muy utilizado para el desarrollo es el método arriba-abajo (top-down), que consiste en partir de una idea general y definir cada paso posterior con más detalle hasta negar a la resolución del problema. En esta descomposición de la idea general, se suele. recurrir, a veces, a algoritmos normalizados. Tras diseñar el algoritmo, se pasa a la escritura en un lenguaje de programación. El proceso de escribir las sentencias reales de un lenguaje de programación se denomina codificación. Es importante no realizar la codificación hasta tanto el algoritmo no esté prácticamente definido. La codificación es una parte de la programación. Una vez codificado el programa, se ejecuta y se comprueban sus errores. La operación de detectar y corregir errores se denomina depuración. Las comprobaciones sucesivas del programa permitirán detectar la presencia de errores, pero no detectarán su ausencia, ya que pueden existir otros errores que no se hayan encontrado por no haberse probado. Tras la depuración final del programa y la ejecución sin errores, es preciso documentar el programa. Es necesaria una documentación interna con comentarios convenientes a 10 largo del programa que permitan ayudar a futuras modificaciones, y documentación externa basada en la descripción completa de algoritmo, organigrama, tablas de decisión, etc. La vida del programa se continúa con laJase de ·mantenimiento, que consiste en las operaciones necesarias para mantener el programa al día, es decir posibilitar que el programa cumpla sus objetivos pese a las variantes o modificaciones que sus datos, acciones, etc. puedan sufrir Con el paso del tiempo.
12 . METODOLOGIA DE LA PROGRAMACION
de nuevas aplicaciones. Así se puede decir que el analista de sistemas es el responsable de todo el proceso informático, tanto en un aspecto estático (uso del hardware/software existente y puesta al día del sistema) como en su aspecto dinámico (adquisición de hardware/software, nuevos desarrollos, contratación/ formación de personal, etc.). El análisis de aplicaciones es el estudio de nuevas aplicaciones en un sistema informático y la persona encargada de su realización es el analista de aplicaciones, que recibirá los encargos del analista de sistemas o en el caso de pequeños equipos informáticos (como puede ser la gama de computadoras personales PC, XT y AT) directamente del propio usuario. En el entorno del PC es muy frecuente que el usuario pretenda ser al mismo tiempo el analista de sus propias aplicaciones. Esta obra va dirigida esencialmente a las personas que desarrollan aplicaciones bien en su faceta de analista o de programador que al igual que en el caso citado, se suelen confundir en los pequeños equipos. Así pues, centraremos nuestra atención en la metodología de la programación que a grandes rasgos se compone de las siguientes etapas: a) Toma de datos El analista o programador deberá recibir una descripción clara y detallada de la aplicación que debe desarrollar y caso de no percibir suficiente información, debe solicitarla en la medida necesaria para el desarrollo de su trabajo. Las Tablas de Decisión que se estudian en el Capítulo 6 dan un buen método de toma o captura de datos. b) Modularización Esta fase consiste en la descomposición sucesiva del problema en módulos o subproblemas cada vez más concretos y detallados. Estos módulos normalmente se programarán y desarrollarán independientemente y luego se enlazarán. La modularización se estudiará en el Capítulo 7. c) Representación gráfica de las operaciones a realizar En esta etapa se realizará una representación gráfica clara y detallada que refleje la secuencia en que deben ser ejecutadas las diferentes operaciones por la máquina. Estas representaciones gráficas son las herramientas utilizadas para el análisis de la programación. Se clasifican en tres grandes bloques: diagramas de flujo u organigramas, pseudocódigos y tablas de decisión. A lo largo de este capítulo y los restantes del libro se explicarán en detalle el uso adecuado de estas herramfentas de programación. d) Codificación en un lenguaje de programación Una vez que el diagrama de flujo o el algoritmo de resolución del problema está ya definido se pasa a la fase de codificación del programa en el lenguaje elegido y la obtención del programa fuente..
DIAGRAMAS DE FLUJO
13
e) Preparación de un conjunto de datos Es necesario un conjunto de datos que permitan probar el programa cuando se ejecute.
o Ejecución y corrección de errores del programa Según sea el tipo de lenguaje elegido así se realizarán las diferentes fases de la traducción del programa a lenguaje ocódigo máquina (programa objeto). En el Capítulo 3 se estudiarán los lenguajes de programación. g) Puesta a punto final del programa El programa se considera terminado cuando se le han realizado pruebas, y ensayada su fiabilidad con los conjuntos de datos seleccionados y otros nuevos que se quieran elegir, y no se encuentran ya errores oe ningún tipo. h) Documentación del programa La documentación de un programa es todo el material escrito que se ha ido produciendo simultáneamente a la elaboración del programa. La' puesta a punto final del programa debe ir aparejada siempre con la documentación del mismo. La documentación de un programa debe ser de dos tipos: documentación para personal ir¡formático y documentación de usuario. h.l) La documentación para el personal ir¡formático. Debe incluir toda la información técnica del programa o conjunto de programas que conforman una aplicación informática. A sú vez esta documentación puede ser interna y externa. La documentación interna es la que se incluye como comentarios en los listados de los programas y la documentación externa es la ajena al listado del programa en sí. La información contenida en la documentación debe ser la neceS
h.2) Documentación para el usuario Debe incluir una descripción general de las tareas que realiza el programa, así como una descripción detallada de todas las instrucciones que sean necesarias para su instalación, puesta en marcha y funcionamiento; así como consejos, recomendaciones de uso, . explicación de los mensajes de errores y ~odo de solucionarlos, entrada y salida. de dat~ menús de opciones, etc.
14
METODOLOGIA DE LA PROGRAMACION
DIAGRAMAS DE FLYJÓ
15
2.2. DIAGRAMAS DE FLUJO
2.3. SIMBOLOS UTILIZADOS EN LOS DIAGRAMAS
Como ya se ha comentado, el planteamiento de un problema que pueda llegar a una solución, requiere la aplicación de una lógica que evolucione secuencialmente. ,~La resolución de todo problema exige tres grandes elementos: datos del problema, result.ados solicitados y algoritmo de resolución) Los datos del problema son información de partida y sobre la que normalmente no se puede actuar con la excepción de su manipulación correcta. Los resultados constituyen la información de salida y estarán íntimamente relacionados con la información de entrada. El algoritmo de resolución es el conjunto de operaciones (matemáticas, lógicas, etc.) o manipulaciones que se deben realizar con los datos para llegar a la obtención de resultados. Los algoritmos se suelen representar en forma narrativa, pero cuando tienen su aplicación más directa es cuando se convierten, en diagramas o gráficos de programación, y son la representación gráfica de fa soluciÓn del problema que se desea mecanizar. \ Un diagrama de programación es la representa~\ión gráfica de unos procedimientos y de la secuencia' u orden en que debe ejecutarse; en resumen la representación gráfica de la solución de un proble a o de un procedimiento. Se pueden considerar tres tipos fundamentales de diagramas de programación, conocidos también como diagramas de flujo u organigramas:
Los diagramas que se realizan durante el desarrollo de una aplicación informática deben ser claros, concisos, esquemáticos y, especialmente, independientes del lenguaje de programación que se vaya a utilizar. Así mismo deben ser comprensibles para cualquier analista o programador que los examine, procurando no presenten excesiva complejidad. El Instituto de Normalización Americano (ANSI) (American National Standards Institute) ha diseñado un conjunto de símbolos y signos estándar que prácticamente han sido adoptados internacionalmente. Los símbolos utilizados varían según sean de aplicación a diagramas de sistemas o a diagramas de bloques y diagramas de detalle. Aunque describiremos los dos conjuntos de símbolos, este libro está orientado básicamente hacia los diagramas de flujo de macroprocesos o bloques y los de detalle (ordinogramas).
a) Diagramas del sistema o de configuración Son diagramas destinados a describir el flujo de información entre los distintos soportes fisicos de un sistema informático. Reflejan las operaciones normales para el desarrollo del proceso, que realizan los componentes utilizados en un programa.
2.3.1. Diagramas de flujo de sistema Los símbolos utilizados sirven para representar operaciones manuales y automáticas con los diferentes dispositivos del sistema informático. Se denominan '. también organigramas del sistema o de la máquina;) no reflejan las grandes funciones que debe desarrollar en forma automática"'él sistema de proceso de datos, pero en cambio, expresan de modo claro el número de dispositivos de entrada y salida que deben estar disponibles para la ejecución de cada·programa. La Tabla 2.1 recoge los símbolos usuales en los diagramas de sistema. Tabla 2.1.
Símbolo
b) Diagramas de macroprocesos o bloques Representan la estructura en los módulos o bloques que se han realizado del problema a resolver. Incluye también el flujo de información entre los diversos módulos, así como el orden de ejecución de los mismos. Estos diagramas están relacionados con el proeeso. c) Diagramas de detalle u ordinograma Son las órdenes en secuencia que se deben dar a la máquina para la resolución del problema.
o c:::J
D
Símbolos utilizados en los diagramas de sistema
Función
Tarjeta perforada (lectora/perforadora de fichas).
Cinta perforada (lectora/perforadora de cinta de papel).
Lectora de documentos ópticos/Impresora de documentos ópticos
16
DIAGRAMAS DE FLUJO
METODOLOGIA DE LA PROGRAMACION Función
51mbolo
Q
/
Cinta magnética (lectora/grabadora de cinta magnética).
Disco magnético (lectura o grabación de un fichero soportado en disco).
Símbolo
D cJ
D Tambor
o
o
'\1 D
Discos fijos
o
Discos Intercambiables
Función
Operación o proceso. procesador.
Terminal o consola (introducción manual de datos desde el teclado o consola del operador).
Operación mecánica con los datos fuera de línea. en una máquina auxiliar no controlada por el procesador.
Operación manual con los datos fuera de línea. sin utilización de máquinas (guillotina de papel. ..).
Fusión o mezcla de dos o más ficheros en uno solo (Merge).
P'''_''{CRT (""d' d. d"o"
tmv'. de ","tell,).
Alm".",m',"'o d. doto, '" 11m" (on-/;oo). Extracción de datos de un fichero.
Almacenamiento de datos fuera de Ifnea (off-line).
Manipulación de uno o varios ficheros fuera de Ifnea (intercalación). Impresora (salida de datos en forma impresa)/Trazador gréfico (pfotter).
17
18
METODOLOGIA DE LA PROGRAMACION
DIAGRAMAS DE FLUJO Función
Símbolo
Clasificación u ordenación de los datos de un fichero.
-->0..: DI
~
\
19
~
-1 f--
Red de transmisión (transmisión de datos a través .de sistemas de transmisión de datos).
Programa
/0
' 1/
~
Q0
Dirección del proceso o flujo de datos.
Unea conectora (indica secuencia de operaciones o transmisión de datos entre unidades o elementos de información).
2. Una aplicación consiste en la emisión de facturas a partir de los datos introducidos por teclado y los datos del cliente almacenados' en un fichero de disco. La factura se debe presentar en pantalla y una vez dada la conformi dad, escribirla en impresora.
Ejemplos
1. Una aplicación realiza la puesta al día de un fichero de datos fijo F, soporta do en cinta magnética, a través de los datos del fichero e, soportado en una cinta perforada. El proceso realiza una consulta a un fichero de entrada/ salida (E/S) que contiene los datos en discos intercambiables. Los resultados del proceso se presentarán en: a) el fichero M con los datos fijos actualiza dos; b) un listado de los posibles errores detectados impresos en papel me diante impresora (se realizarán las operaciones a través de un fichero de movimientos M).
.Dt
I
)o
Grograma
· [?FaCluras
Fichero
Clientes A
f •
c=J
D2
Fichero
Clientes B
7-) "~~L"":'c~,
G
20
METODOlOGIA DE LA PROGRAMACION DIAGRAMAS DE FLUJO
2.3.2. Diagramas de flujo de detaJle/organigramas Los ordinogramas o diagramas de flujo de detalle y d~ macroprocesos deben mostrar las operaciones que realiza un programa, con el detalle necesario para que una vez confeccionados, se pueda realizar la etapa siguiente de la programa ción (codificación). Dependiendo del nivel de lenguaje utilizado, orientado a la máquina u orien tado al problema, variará el grado de detalle de los ordinogramas. Para lenguajes muy evolucionados como el COBOL, en general, suficiente representar única mente los grandes bloques de tratamiento: entrada, salida, proceso y decisión sin tener que detallar las operaciones elementales. En los lenguajes ensamblado res o de bajo nivel, como cada instrucción simbólica se transforma en una o varias instrucciones de lenguaje máquina. es preciso un ordinograma de detalle que muestre las operaciones elementales que debe efectuar la máquina.
ts
Tabla 2.2.
c- )
Decisión múltiple (en función del resultado de la comparaeitSn se seguirá uno de los diferentes caminos de acuardó éón· dicho resultado).
salidas múltiples
¡
Símbolos utilizados en diagramas de detallejordinogramas
Símbolos principales
Función
Símbolos principales
Función
-+
o
Conector (sirve para enlazar dos partes cualesquiera'de úIi' ordinograma a través de un conector en la' salid!!; yi ótffiJ conector en la entrada. Se refiere a la cónexión'an Is·rt1lSma'. página del diagrama.
t t ....
Indicador de dirección o línea de flujo (indica el sentldodeéf~uéí6l\' de las operaciones).
.
~
¡
Terminal (representa el comienzQ, "inicio", y el final, "fin", de un pro grama. Puede representar también una parada o interrupción pro gramada que sea necesario realizar en un programa).
,
Línea conectora (sirve de unión entre oos símbolos).
¡
1
CJ
EntradajSalida (cualquier tipo de operación, de introducción de da tos en la memoria desde los periféricos "entrada", o registro de la información procesada en un periférico "salida").
D
SI,
Proceso (cualquier tipo de operación definida que pueda originar cambio de valor, formato o posición de la información almacenada en memoria: operaciones aritméticas, de transferencia de datos, et cétera).
Decisión (indica operaciones lógicas o de comparación entre datos -normalmente dos- y en función del resultadodeta misma deter mina cuál de los distintos caminos anematlvos del programa se' debeseguif; normalmente tIene dos salidas-respuestif$Sfo.No pero puede tenenres o más-;seg6n:lds.casos}¡
Conector (conexión entre dos puntos del organigrama sitUadO páginas diferentes).
.
1
.!
1
o
Llamada a subrutina o a un proceso predeterminado (ur1a'subrUtjri~ . es un módulo independiente del programa prinéipal; que reéíM'lIIÍlf' entrada procedente de dicho programa, realiza una tarea'detém1friai da y regresa, al terminar, al programa principal).
Il,
Símbolos secundarios
o
Pantalla (se utiliza en ocasiones en lugar del simboto de ~/g).
-D : ~r·
en'jl
¡',
.'
Impresora (se utiliza en ocasiones en lugar del sírl'ibolo de f!jSli
i
:;i~j~~i;i;~:~t
l.
22
METODOLOGIA DE LA PROGRAMACION Función
Símbolos secundarios
CJ ~-
DIAGRAMAS D~ FLUJO
Teclado (se utiliza en ocasiones en lugar del símbolo de E/S).
Comentarios (se utiliza para añadir comentarios clasificadores a otros símbolos del diagrama de flujo. Se pueden dibujar a cualquier lado del símbolo).
Es conveniente que los ordinogramas y los organigramas -cuando así lo exijan- utilicen notaciones normalizadas para operaciones de cualquier tipo. La Tabla 2.3 recoge los signos universalmente aceptados.
23
Ejemplos de símbolos, en ordinogramas
( IniCiO)
( Inicio) ( Fin.) Entrada
Salida
X
X
B
La suma del valor de las variables X e Y se asigna a la variable Z.
z=X+Y
Tabla 2.3.
Signos utilizados en los diagramas de flujo.
Operar;iones aritméticas ~ ~
+
t
/ o bien
A
Significado
Movimiento de unas posiciones de memoria a otras o cambios en campos de información. Suma
Resta
Multiplicación
División
Exponenciación
~ ~
equivalea
B
Operaciones de relación
< > ~
;, <> -1:'
o¡' ;¡.'
:: y <>
Menor que Igual
Mayor que
Menor o igual que
Mayor o igual que
Diferente (menor o mayor que)
No menor que (mayor o igual)
No igual que (diferente~
No mayor que (menor o igual)
Símbolo de comparación
Si el valor de X es mayor que 5 seguir el camino rotulado Sí, en caso contrario el camino No. Si el valor de X es igual a Y seguir el camino rotulado Sí. en c,!so contrario el camino No.
, No suelen utilizarse normalmente. .
...-. el.,••
"'_o- '~¡'éÍ.V' ¡¡,
:t,
..
;-
..
,
-Ú;'.~', ,,~~#¿étm¡_.
.24
B
No
/
Subrutina B
Subrutina A
1I
U
~
I
fA
T I I
I
Retorno
Sí
________ ~
S=X·y
Z=K+L
Ejemplo 3.
Inicio Subrutina B
Inicio Subrutina A
No
Sí
Cuando el valor de Z sea igual a la suma de los valores de K y L, se ejecuta la función F2 y a continuación se retorna al primer punto conector A, o sea, realización de la operación Z=K+L.
25
DIAGRAMAS DE FLUJO
METODOLOGIA DE LA PROGRAMACION
I
I
fB
1
, I I
Retorno
S contiene el valor del producto X por Y.
Diagrama de flujo de macroprocesos o bloques.
No
Emisión de las facturas del ejemplo 1
Función F1
Función F2
El problema se subdivide en módulos de menor entidad (entrada de datos por teclado, lectura de datos del fichero de clientes, visualización en pantalla, validez de los datos, impresión de facturas, etc.) El diagrama de flujo de detalle podría ser el siguiente:
mm)ri"
L
.. ,.-,. • . •
.1'
,¡,\íj.d~iEq~
DIAGRAMAS DE FLUJO
27
Supongamos que la aplicación de los ejemplos 1 y 4 fuese el modelo siguiente: Introducción de los datos de cada factura
Entrada de datos
Cabecera (Datos sociedad o empresa)
Extracción de los datos de los ficheros de clientes A y B
Leer datos
del
cliente
Unidades
Artículo
Precio
Total parcial
Presentación en pantalla de la factura
TOTAL Petición de validez de los datos
No
Fecha
Pie (datos diversos)
Validación
de
datos
Proceso de cálculo factura
Impresión de la factura del cliente
No
Pregunta sobre la emisión de una nueva factura
Una vez que se ha confirmado por el operador la impresión de la factura y suponiendo que se han introducido ya los datos del cliente y el pedido efectuado, el ordinograma para la emisión de las facturas constituiría normalmente una subrutina o al menos un subprograma de entidad propia y constante. Las opera ciones a realizar serían: l. 2. 3. 4. 5. 6. 7.
Impresión de cabecera. Cálculo de sumas parciales (unidades x precios del artículo). Escritura de cada línea de la factura. Cálculo del total actual de la factura. Preguntar si es el último artículo. Imprimir TOTAL de la factura. Imprimir fecha expedición de la,factura (al principio del programa princi pal se habrá introducido Ía fecha). 8. Impresión del pie de la factura. El ordinograma podría ser:
Ejemplo 4.
Ordinograma para la expedición de una factura.
26 ~.Lbk\j!..¡';;'
.;;,._\
_"'~"'i..ó.,;rl~¡éa»f'r;;,j¡
DIAGRAMAS DE FLUJO
Inicio
29
2.3.3. Plantillas y hojas de codificación Cabecera constante • nombre empresa • dirección • teléfono
TOTAL
Variable TOTAL valor inicial = O
=O
'f' Cálculo de las sumas parciales de cada Ifnea.
SP = U x Precio
En el comercio existen a la venta plantillas para la realización de diagramas de flujo. Generalmente son piezas rectangulares planas y transparentes, en las cuales figuran recortados los símbolos vistos en los párrafos anteriores. El uso de las plantillas es similar al de cualquier otra plantilla de dibujo, es decir, basta con deslizar el lápiz o rotulador por el contorno del símbolo correspondiente para dibujar dicho símbolo.
l'
.
!21'1.1!1.ll!'!'I~r
1"1"'.''"'.'
.,.,,,,:1' r "'('·'·PI "·'·'1' !.I#I..
''''"\.'''''"!' [.'.'i!' ''''I'.!.,., ,,-,.. ~.
!.... I.I.,.I~. 1=I:n,:::r'~'
~
¡
.if
~
h
., .,
_'~""1II.
f-L-~.'Ull?"
t+
...
~
-,
f:l:I:
,. ,.,., .,.,
".'."3',.. ,.. ,.,....'".'.'J
~
w 'Li:!t
¡:¡.
.A
_le'"
W'
::r. ,+
~
Off." I
j-I+',,~
..
.,
un'.;
Escritura Ifnea a línea de los diversos artículos
UNIVERSIDAD PONllAClA DE SALAMANCA 5Kclon de InformA tica
Figura 2.1.
o'
Cálculo del total actual
,u
t A = TOT AL + SP
Comprobación de último dato
No
,~ ~
'J
~
Plantilla para confección de diagramas de flujo.
Aunque la confección de formatos de pantalla o de salida en impresora se pueden realizar en cualquier folio de papel (cuadriculado o no), se dispone normalmente en los centros de proceso de datos de formularios que facilitan los diseños asi como hojas de codificación, donde se suelen representar normal mente las posiciones físicas de los caracteres en pantalla (25 filas por 80 colum nas, es decir 25 x 80 caracteres) de modo que facilitarán considerablemente el diseño de formatos de texto en pantalla o de saUda en impresora.
Impresión del
resto de la
factura
-
28
-
-
-
---1
CAT. NO. , .."tl
Fin de la subrutina y retorno al programa principal
';;,'..",",", ,)•. ~ • ~ :,,; -b1~:~"'-M;;;;;~~.,
,./'"J,,'
30
METODOLOGIA DE LA PROGRAMACION
DIAGRAMAS DE FLUJO
31
2.4. DIAGRAMAS DE FLUJO ESTRUCTURADOS Aunque en los capítulos siguientes se profundizará en los conceptos de dia gramas de flujo estructurados, en este apartado realizaremos un pequeño antici po de los mismos, al objeto de que el lector se introduzca de modo general en el importante concepto de estructuración de datos, diagramas y programas. En general, un ordinograma contará con las siguientes fases:
* ~
I " I
• -.
~ ~
o
~
¡;; '"¡;; ~
..é
o
:I:
1 l-~-
l-
1. Inicio 2. Entrada de datos 3. Proceso 4. Salida de datos 5. Fin
"'-
Iffl Ir::
a!di.
~
le
~
.o.
"
U..
~ ~
o
~
'O
•& •
a:
Aunque las cinco partes existen prácticamente siempre, el orden de las fases 2, 3 Y4 puede variar e incluso confundirse unas' fases con otras.
g
Do
~
~
le
o ...w .. :I:
1II
U
IL
Inicio
~
~ ~
~
~
...
U
.
li 3
-;;
-,
:!!
c:i cr o
-«
1:
~
.-'
-« 1:)
o......
o -« Uu
o f-U1
<>
~ . oc:.. lI.."': zu -u
l.U
oc
~
~
~
~
~ ~
i -o
~
•t: o
N
U
r;;;
•
•
~
-
~ ~
o¡
::J<
"
cru
U
u.
~
~
a: tiu :1: a: > a: Lti
<
Proceso
~
o~ V) ::J
lfll
Entrada de datos
~
ffi
I .. I ~ z i o ><
;;;
>,
el O ll: .IJ
ll. O
~
-~ ~ ~
=
.
~
1-1
f-~-
Salida de datos
-
~
N
Fin
>~
32
DIAGRAMAS DE FLUJO
METODOLOGIA DE LA PROGRAMACION
Así por ejemplo, si se desea obtener la nota (calificación) media de un alumno correspondiente a las diferentes asignaturas de su curso escolar, cuyos datos escolares (registros o fichas) están grabados en un fichero en disco, un ordinogra ma podría ser:
33
- Estructuras secuenciales
~
'
9
Inicio
ó
Lectura de un registro
Q
Sumar calificaciones de todas las asignaturas
Constan esencialmente de sucesivos pasos, uno detrás de otro.
-Estructuras selectivas Dividir la suma: total por el número de asignaturas
Verdadero
No
sr
Imprimir resul\'Jdo
Fin o retorno si es subrutina
I
l
Las estructuras lógiéas básicas necesarias para confecdón~r ún prograrttll' se reducen a tres: secUenciali!s, seléetiVas y rept!tití4,1áS:
No
L
i
~ ~
I Falso B
Requieren una prUeba O· comparación de ciertas condiciones seguidas de rutas'altemativas'>éfti el! progmtna¡ ........_-...~."'.,--''''~:,.''''', ...L"
., ".. .".;.C·i--'_L'.:/.'-._
~ J':\~ \d:.t;';;'·'i.ll
,
l,
34
METODOLOGIA DE LA PROGRAMACION
DIAGRAMAS DE FLUJO
-Estructuras repetitivas
~i
35
se sustituye E2 por una estructura del tipo selectivo, se tendrá
t
~I
y
El M
.. Verdadero ~
N Falso
E3
y
E4
o bien representadas de la siguiente forma:
1
A su vez, E3 y E4 pueden ser sustituidas por estructuras de tipo repetitivo, obteniéndose
M
t El N Falso
CaJa una de las estructuras tiene una sola flecha de entrada y una soh flecha de salida y cada una de ellas es legible de arriba hacia abajo (diseño to¡-down); por consiguiente estas estructuros llamadas básicas o fundamentales Jueden componerse sustituyendo cada bloque básico por una de dichas estructuras. Así por ejemplo, en la estructura secuencial.
Q I E2
~
I
'f'
'f'
M2
Ml
'f'
I
¡
• I .:;~i~
36
METODOLOGIA DE LA PROGRAMACION
A los diagramas de flujo construidos de esta forma se les llama diagramas de flujos estructurados o simplemente diagramas estructurados. Estas técnicas forman parte del concepto denominado programación estructurada y que hoy
en día tiene una gran aceptación. En los capítulos siguientes y especialmente en
el 7 se estudiarán las técnicas de la programación estructurada.
2.5. REGLAS PARA LA CONSTRUCCION DE DIAGRAMAS DE FLUJO La finalidad de un diagrama de flujo es describir de modo gráfico la estructu ra lógica del programa y que posteriormente permita una fácil codificación en :; un lenguaje específico. . El proceso para la construcción de un diagrama de flujo no supone un método rígido y de hecho la mayoría de los programadores terminan acuñándose
el propio. Sin embargo se pueden enunciar unas reglas de tipo general, útiles
para cualquier nivel. .
La elaboración de un diagrama de flujo debe comenzar con un diagrama de bloques que represente las relaciones fundamentales y posteriormente ir descom-'
poniendo las operaciones fundamentales en otras más sencillas, pero sin tratar de que los ordinogramas se correspondan instrucción a instrucción con el funcio
namiento real del programa, ya que en ese caso obtendríamos unos diagramas
de flujo excesivamente recargados y no serían útiles.
DIAGRAMAS DE FLUJO
37
7. Se debe dejar un bloque o dos de proceso libres al comienzo del diagrama, para reservar posiciones de memoria para variables, acumuladores, iniciali
zación de subíndices de listas y tablas (arrays) conmutadores (switch), etc.
8. Indicar con comentarios al margen o mediante el símbolo gráfico comenta rios, las variables utilizadas y su descripción, procurando no abusar de su uso. Diferenciar las variables propias del proceso de las pseudovariables o variables ficticias (contadores, conmutadores o interruptores). 9. En las operaciones lógicas recurrir preferentemente a la lógica positiva que a la lógica negativa (es siempre más claro «si A = B» que «si no es A < > B»). 10. A cada bloque o símbolo se accede por arriba y/o por la izquierda y se sale por abajo y/o por la derecha. Las entradas pueden ser varias pero la salida es única excepto en los casos de símbolos de decisión.
I
~I
~~
~
..
Reglas prácticas l. Todo diagrama debe tener un principio (inicio) y un fin, al objeto de que'
pueda ser utilizado como submódulo de otro módulo de nivel superior.
2. Las líneas de conexión o de flujo deben ser siempre rectas y, si es posible,
que sean sólo verticales y horizontales (no cruzarse, ni inclinadas); para " conseguir lo anterior se debe recurrir a conectores, numerados conveniente mente y sólo en los casos estrictamente necesarios. 3. Las líneas que enlazan los símbolos entre sí deben estar todas conectadas. Cada línea o flecha debe entrar en un bloque, en un símbolo de decisión,
terminar en «Fin» o unirse a otra flecha.
11 .. Realizar todas las anotaciones o comentarios marginales al diagrama para que éste sea comprensible no sólo por la persona que lo ha elaborado sino también por cualquier persona ajena al mismo, sobre todo con el paso del tiempo y para cuando se necesite una actualización o modificac!ón del dia grama.
4. Se deben dibujar todos los símbolos de modo que se pueda seguir el pro ceso visualmente de arriba abajo (diseño «top-down») y de izquierda a derecha.
12. Siempre que sea posible, es conveniente que el diagrama no sobrepase una página; si no es posible, numerar adecuadamente las hojas del diagrama y utilizar los correspondientes coneCtores de páginas que indiquen sin dudas la dirección correcta del flujo (de donde viene y a donde se dirige).
S. Realizar un gráfico claro y equilibrado, procurando que el flujo central del
diagrama sea la parte central de la hoja de papel.
2.5.1. Comprobación de diagramas
6. Evitar la utilización de terminología específica de un lenguaje de programa ción o máquina, sobre todo en las expresiones donde se tiene tendencia . natural a ello.
Terminado el diagrama de flujo, se deben tomar un conjunto de datos signifi .tivos y comenzarla lectura del mismo en el orden arriba abajo/izQuier<4t
.... , .. ,~
~:;.¡
,'~~
:""F", 38
METODOLOGIA DE LA PROGRAMACION
DIAGRAMAS DE FLUJO
derecha y seguir paso a paso todos los símbolos, con sus operaciones correspon dientes, introduciendo los datos tomados inicialmente en los momentos oportu nos y ver cómo responde ei diagrama de flujoy si los resultados obtenidos son correctos y coherentes. No se debe pasar a la fase de codificación, mientras que el diagrama de flujo no haya sido comprobado su funcionamiento con datos sig nificativos. Tras la ejecución de un programa por la computadora, los ordinogramas deben ayudar en el proceso de depuración (detección, localización y corrección de errores).
2.5.2. Ventajas e inconvenientes de
105
diagramas de flujo
En el análisis de la programación los beneficios que se pueden derivar del uso de los diagramas de flujo se pueden sintetizar en los siguientes: 1. Rápida comprensión de las relaciones. 2. Análisis efectivo de las diferentes secciones del programa. 3. Los diagramas de flujo pueden utilizarse como modelos de trabajo en el diseño de nuevos programas y sistemas. 4. Comunicación con el usuario. 5. Documentación adecuada de los programas. 6. Codificación eficaz de los programas. 7. Depuración y pruebas ordenadas de programas.
39
El pseudocódigo es una técnica para expresar en lenguaje natural la lógica de un programa, es decir, su flujo de control. El pseudocódigo no es un lenguaje de programación sino un modo de plantear un proceso de forma que su traduc ción a un lenguaje de alto nivel sea sencillo para un programador. La fase de confección de pseudocódigos es inmediatamente anterior a su codificación en el lenguaje de programación elegido. En la actualidad el pseudocódigo es una técnica muy utilizada sobre todo en la programación de lenguajes estructurados como PascaL o bien utilizando técnicas de programación estructurada en otros lenguajes. Los pseudocódigos utilizan palabras clave como DO (Hacer), IF-THEN ELSE (Si-entonces-sino), ENDIF (Fin de si), REPEAT-UNTIL (Repetir hasta), REPEAT-WHILE (Repetir-mientras) o bien DO-WHILE (Hacer-mientras), DO-UNTlL (Hacer-hasta), etc. El ejemplo del programa de cálculo de la califica ción media de un alumno en pseudocódigo podría ser: Lectura
registro o ficha de estudiante.
no se encuentre «fin de fichero»
Sumar notas
Dividir la suma total entre número de asignaturas
Impresión del registro
Mientras
Fin-mientras
En el Capítulo 4 se profundizará en los conceptos de la pseudo-programa ción.
Las limitaciones o inconvenientes se pueden englobar en: 1. Los diagramas complejos y detallados suelen ser laboriosos en su plantea miento y dibujo. 2. Las acciones a seguir tras la salida de un símbolo de decisión, pueden ser difíciles de seguir si existen diferentes caminos.' 3.' No existen normas fijas para la elaboración de los diagramas de flujo que .' permitan incluir todos los detalles que el usuario desea introducir.
2.6. PSEUDOCODIGO Otra herramienta muy útil en el análisis de programación es el pseudocódigo. Pseudo o seudo, significa «falso», «imitación» y código se refiere a las instruccio nes escritas en un lenguaje de programación; pseudocódigo no es realmente un código sino una imitación y una versión abreviada de instrucciones reales para las computadoras. Las tres herramientas que utilizan los programadores son: diagramas de flujo, tablas de decisión y pseudocódigos. A lo largo de esta obra se tratarán las tres herramientas detenidamente. Aunque se utilizan las tres son sin duda los diagra mas de flujo y los pseudocódigos los que más utilizan los programadores.
2.7. DIAGRAMA DE NASSI/SHNEIDERMAN (N/S) Un diagrama N-S es como un diagrama de flujo con las flechas omitidas y cajas o bloques contiguos. Las acciones sucesivas se escriben en cajas sucesivas. Como en un diagrama de flujo, diferentes acciones pueden ser escritas en una caja. La diferencia entre esta forma y las otras dos formas (diagrama de flujo y algoritmo) parece trivial. Sin embargo, esto es debido a que los algoritmos son bastante sencillos. Este sistema de representación permite tener una visión mucho más estructu rada de ellos y por consiguiente mayor facilidad al traducirlos al lenguaje de una computadora. Estos diagramas tratan de optimizar los programas, ya que permiten gran fl~xibilidad, al permitir fáciles correcciones, modificaciones o ampliaciones al diagrama original. El diagrama se lee de arriba-abajo. Cada bloque ejecuta una operación especí fica que se puede documentar o describir con la precisión que se desee. Los diagramas de las estructuras lógicas son los siguientes: ,~,.::',;;.--'. -~".,
DIAGRAMAS DE FLUJO 40
41
METODOLOGIA DE LA PROGRAMACION
Simple: Si la condición es verdadera se ejecuta la acción y si es falsa las
Secuencial
acciones siguientes: Acción A Acción B
11 Acción N
Acción
then
Alternativa
Selección doble: Si la condición es verdadera se ejecuta la acción 1 y si es falsa la acción 2.
Repetitivas
if then else Acción 1
buck Z (vacío o no).
3
~
~tro I
case
end·case A
I
B
I
C
I
I
X
I
Z
end-while
acción
Selección múltiple: dependiendo del valor de la variable se ejecuta el proceso especificado y en caso de que la variable no esté en el rango 1 a n se ejecuta el
2
while
while
Acción 2
-
I
I--
end while
I repeat
repeat
I
acción
until
_ ' 1 ;']1;,1' W.ilo..l...~~::L;;:
I
until
42
METODOLOGIA DE LA PROGRAMACION
DIAGRAMAS DE FLUJO
Estructuras más complejas:
43
Ejemplo
Diseñar un algoritmo y el diagrama N-S correspondiente que resuelva el siguiente problema: Leer 3 números por teclado, hallar el mayor y presentarlo en pantalla. i'
Condición Sí
Solución: 1-(
inicio /1
No
Sí
leer 3 números N1 ,N2,N3
Acción
A
¡.
Acción B
Acción C
r
si N1 >N2 ~
entonces
<
si N1 >N3
Condición
entonces
MAYOR = N1
sino
MAYOR == N3
fin_si sino si N2>N3
Acción
A Acción B Acción C
entonces
MAYOR
sino
MAYOR
= N2 = N3
fin_si fin_si
escribir "el número mayor es": MAYOR
fin
Acción
D
Acción E
44
METODOLOGIA DE LA PROGRAMA ClaN
Diagrama N-S
INICIO
Leer 3 números Nl,N2,N3
CAPITULO 3
ESTRUCTURA GENERAL
DE UN PROGRAMA
MAYOR
MAYOR
MAYOR
MAYOR
Nl
N3
N2
N3
3.1. CONCEPTO DE PROGRAMA
Escribir Hel número mayor es:" MAYOR
FIN (.
2.8. MODULARIZACION
La programación de computadoras (ya enunciada en el apartado 1.5) es el proceso de planificar una secuencia de instrucciones que ha de seguir una compu tadora. Un programa es la secuencia de instrucciones que indica las acciones que ha de ejecutar la computadora. El concepto de programa almacenado en la memoria fue ideado por John von Neumann en 1946;i desde entonces todas las computadoras utilizan esta caraCterística que ras hace más flexibles y.permite realizar cambios de un progra ma a otro. En general, el desarrollo de un programa para la resolución de un problema tendrá en líneas generales las fases siguientes:
Análisis: Definición del problema.
Algoritmo: Desarrollo de la secuencia lógica de pasos para la resolución del
problema.
Prueba del algoritmo: Seguir los pasos del algoritmo y ver si resuelven real
El sistema más idóneo para la resolución de un problema es la descomposi ción en módulos más pequeños, que serán objeto de un estudio y desarrollo independiente para posteriormente enlazar en un solo programa. La modularización de un problema debe seguir un proceso arriba-abajo (<
mente el problema.
Codificación: Conversión del algoritmo en un programa escribiéndolo en un
lenguaje de programación,
Edición, ejecución y prueba: Introducit el programa en la memoria, ejecutar
lo y probar sus resultados, corrigiendo los errores hasta su puesta a punto
final.
Uso y mantenimiento: Manejo y actualización del programa.
I
""'4VERSIDAD NACIONAL
A.IEII~"""",_
46
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE UN PROGRAMA
En el apartado siguiente ampliaremos los conceptos anteriores. Uno de los objetivos fundameutales de este libro es la programación y ello en resumen significa realizar por el programador las fases de la Figura 3.1.
I P,"~m'
~
Codificación del algoritmo
Diseño del algoritmo
B
3. 4. 5. 6. 7.
47
Codificación del programa. Depuración del programa. Verificación del programa. Documentación del programa.
Mantenimiento del programa.'
Planificación del programa
Un equipo de analistas y usuarios debe decidir exactamente lo que el progra ma debe hacer, qué datos debe procesar y qué información producirá. Figura 3.1.
Fases de la programación.
Desarrollo de las especificaciones del programa
No se debe pasar nunca a la codiftcación o escritura del programa sin haber realizado las fases de análisis del problema y resolución del algoritmo. Muchos estudiantes -incluso profesionales- tienden a eliminar la fase de diseño del algoritmo y ello supone un grave error, pues si bien en ocasiones puede ahorrar tiempo y producir un resultado satisfactorio, a la larga producirá errores y aumentará el tiempo de la fase de ejecución y puesta a punto del programa.
3.1 .1. Desarrollo de un programa Dependiendo de la naturaleza del problema a resolver se puede considerar el equipo de desarrollo de un programa, y así éste puede constar de una sola persona o un equipo de personas dirigidos por un programador jefe del equipo. En cualquier caso, la descripción general de cada programa incluirá al menos los siguientes conceptos: • Tipo de lenguaje de programación (COBOL, Pascal, BASIC, etc.) • Descripción del programa con indicación de las tareas a realizar y del algoritmo de resolución. • Frecuencia de procesamientq (diaria, semanal, en línea, etc.) • Entradas y salidas del progr~ma. • Especificaciones detalladas de cálculos, tablas, etc. • Limitaciones y restricciones (orden de entrada/salida de datos, tiempos de respuesta, etc.). Una vez que los conceptos anteriores se conocen, es el momento de escribir los programas. Las personas que escriben y depuran los programas se llaman pro gramadores. Los pasos que exige el desarrollo de un programa -como se ha descrito anteriormente- se suelen sintetizar en los siete ~iguientes: l. Planificación del problema: descripción y análisis.: 2. Desarrollo de las especificaciones. del 'ptbgt'ama. !
.,",
'i.',;.~:..
El programador especifica las funciones del procesamiento de los datos que el programa debe ~jecutar. Las relaciones entre las funciones se establecen en una serie de diagramas de flujo. Codificación del programa
El programador escribe el código fuente del programa. Este código fuente consta de los pasos del programa descritos en un lenguaje de computadora. En la computadora el código fuente se traduce en un programa que la computadora puede ejecutar. Depuración del programa
El programador ejecuta el programa para detectar y corregir errores. A esta operación se denomina depurar el programa. Verificación del programa
El programador comprueba el programa para asegurarse que produce la inform<1ción requerida. Durante esta fase se podría necesitar modificar el Programa. Documentación del programa
El programador describe el funcionamiento y uso del programa en una docu mentación técnica y de usuario. Mantenimiento del programa
Si el tipo de información requerida necesitase cambios, el programa puede ner que ser modificado. Así mismo, los usuarios del programa pueden descubrir ores o introducir a su vez cambios que la experiencia les dicte, y por consi .,::::,;¡j;~¡
48
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE. UN PROGRAMA
guiente debe modificarse el programa. En resumen, el programador debe mante ner el programa, corrigiendo cualquier error o introduciendo las necesarias mo dificaciones para que el programa continúe durante todo el tiempo de su vida activa, siendo útil para cumplir las necesidades del usuario.
3.2. LENGUAJES DE PROGRAMACION Al igual que los lenguajes humanos, tales como el inglés o el español, los lenguajes de programación poseen una estructura (gramática o sintaxis) y un significado (semántica). La gramática española trata de los diferentes modos (reglas) en que pueden ser combinados los diferentes tipos de palabras para formar sentencias o frases aceptables en español, La gramática de Pascal se refiere a las diferentes reglas en que pueden combinarse las sentencias (instruc ciones) de Pascal para formar un programa válido en Pascal. Los lenguajes de computadoras tienen menos combinaciones aceptables que los lenguajes natura les, sin embargo, estas combinaciones deben ser utilizadas correctamente; ello contrasta con los lenguajes naturales que se pueden utilizar aunque no sigan las reglas gramaticales e incluso aunque no sean comprendidos.
3.2.1.1. La notación BNF La notación o formalización BNF (Backus-Naur-Form) es uno de los méto dos empleados para la definición de reglas sintácticas y se concibió para que permitiera decidir en forma algorítmica cuándo una sentencia es válida o no en un lenguaje. Esta notación fue ideada por P. Naur que junto con otro grupo de científicos desarrollaron en 1960 el lenguaje de programación ALGOL 60. Aun que los diagramas sintácticos se utilizan con mayor profusión sobre todo en su aplicación a lenguajes estructurados como Pascal, dedicamos este párrafo a la notación BNF por su interés histórico en el campo de la programación de computadoras comerciales. La notación BNF utiliza esencialmente cuatro metasímbolos (símbolos exter nos al lenguaje O utilizados raramente) ''1''
Un lenguaje de programación es un conjunto de reglas, símbolos y palabras especiales que permiten construir un programa. La sintaxis es el conjunto de reglas que gobiernan la construcción o forma ción de sentencias (instrucciones) válidas en un lenguaje. La semántica es el conjunto de reglas que proporcionan el significado de una sentencia o instruc ción del lenguaje. Solamente las sentencias correctamente sintácticas pueden ser traducidas por un lenguaje de programación, y los programas que contienen errores de sintaxis son rechazados por la computadora. Cada lenguaje de progra mación posee sus propias reglas sintácticas. El vocabulario de un lenguaje es un conjunto de símbolos (en ocasiones se denominan símbolos terminales). Los símbolos usuales son: letras, dígitos, sím bolos especiales (, ; : / & + - *, etc.), palabras reservadas o claves -if (si), then (entonces), repeat (repetir), for (o), begin (iniciü), end (fin). Las reglas sintácticas son los métodos de producción de sentencias o instruc ciones válidas que permitirán formar un programa. Las reglas sintácticas permi ten reconocer si una cadena o serie de símbolos es correcta gramaticalmente y a su vez información sobre su significado o semántica. Las reglas sintácticas deben definir los conceptos de sentencia (instrucción), expresión, identificador, variables, constantes, etc., y deben permitir de modo fácil verificar si una secuencia de símbolos es una sentencia, expresión, etc. correcta del lenguaje. Para definir las reglas sintácticas se suelen utilizar dos tipos de notaciones: laformalizacíón de Backus-Naur-Form (BNF) y los diagramas o grafos sintác ticos. .21' !)L;W1frk.~,·~" ''''''.
"1"
"1"
Los significados de los diferentes símbolos son: "1"
3.2.1. Concepto de lenguaje, vocabulario y reglas sintácticas
49
"1" "f"
significa significa significa
"está definido como" "o bien" "repetición de los símbolos encerrados entre las llaves"
Ejemplos < expresión> :: == a - b I a * b < expresión> se define como la serie o cadena de símbolo "a - b" o bien la cadena "a * b". :: == + + +.... (a) (b) ::=alblcldl ... lz I a la expresión se obtiene uniendo o concatenando una letra con el signo" +" con otras letras. b letra es cualquiera de las letras del alfabeto. :: == 1 I 1 identific;ador es una letra seguida de cualquier serie de letras o dígitos. :: = + 1- 1* I / I Símbolo puede ser + (suma), - (resta), * (multiplicación), / (división), (exponenciación). A
A
De acuerdo con las anteriores reglas sintácticas se pueden formar las siguien tes cadenas de símbolos válidos: . expresiones identificadores
abe ab5
mnp beta4
abs man
daneo 17
A;:iV~é~il-,.;:
50
ESTRUCTURA GENERAL DE UN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
El diagrama sintáctico también se puede representar del modo siguiente:
Sin embargo no son válidos los identificadores siguientes:
-------'.~
5b
abo,
beta4~
51
letra
6 demo
I
L,etra....
En consecuencia utilizando la notación BNF se pueden formular las diversas reglas sintácticas que permitan la definición de símbolos, palabras reservadas, sentencias, identificadores, expresiones, variables, etc.
Ldí9ito
Diagrama 3.1 b.
Identificador.
Identificadores válidos son:
3.2. 1.2. Diagramas sintácticos Una de las herramientas más útiles -en la actualidad su uso es muy frecuen te en el ámbito universitario y en el científico- para describir con precisión las reglas sintácticas son los diagramas sintácticos. Los diagramas o grafos sintácticos son una serie de símbolos unidos por flechas o caminos. Los posibles caminos representan las secuencias o sucesiones posibles de símbolos. Existen dos tipos de símbolos: terminales y no terminales
a abcdef p4b dem07
clasificación datos 4 datos 5 datos 176
Identificadores no válidos son: 1abcd demo-7
5demo7 14abc
En notación BNF el diagrama 3.1. sería:
O
terminales no terminales
I
o bien
I
(
o bien
)
"= I jletra> I 1 Expresión
D
Una regla sintáctica se compone de una cabecera o encabezamiento con el nombre del elemento que define y a continuación el gráfico o diagrama. Los diagramas se leen siguiendo las flechas desde la entrada hasta la salida, o lo que es igual, comenzando por la izquierda y siguiendo la dirección de la flecha. En los puntos de bifurcación puede ir por cualquier camino. Identificador
expresión simple
~
E( 9)' 9 ? Y
~
r
"pre.oo ,;m."
r
(a)
o bien ~ expresión simple
<
--! Diagrama 3.1 a.
>
I
I
<>
<=
> =
IN
I
I
I
I (b)
Diagrama 3.2.
Identificador. .• "¿j",":..~-,-J¡h;t··:C/;'t>-·_ ,~ •.
I
•
Expresión.
expresión simple
•
52
ESTRUCTURA GENERAL DE uN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
Variables numéricas válidas son:
Expresión simple
demo 5
nombres 17
SEVILLA
Variable alfanumérica (en lenguaje BASIC)
término
----'1
11
letra,
i
¡
r0
·
término
o bien o bien
---8-
¡
-----Ietra
término
i
l'
+
-
~
OR
térmíno~
-
)-0----
'''''
C d f o i t o ...-",- - '
nombres de variables alfanumérica o de cadenas válidas son: demo 5 $
AB$
Nombre$
Sentencia REM (en lenguaje BASIC) Expresiones válidas son:
x
x-V+Z
-(
x + V * (x - V) / (Z - W)
REM
rl
Cadena de caractereJ
o bien
Variable numérica (en lenguaje BASIC)
REM
• Cadena de caracteres
•
Sentencias REM válidas son:
l/M.!...
A ) í3
REM esto es una prueba REM adelante mis valientes
''/4 (
fJ J J) l ¡te" " .!.,-Aa'"" '{
I
Variable (en lenguaje PASCAL) o bien
_
L
letra-C=-
dlgito
•
letra
~
~
~.
~
~&
'-:¿ : c.no---(
-
\
53
54
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE UN PROGRAMA
o bien -----'VAR
["":1
-----+ _tipo
~
oeclaraciones válidas de variables son: V AR
CONTADOR: REAL; CADENA: CHAR;
FORTRAN (ALTO NIVEL)
Ejercicio de aplicación:
Dados los diagramas sintácticos correspondientes a hipotéticas expresiones "PRUEBA", "DEMO", "SALUDO" de un lenguaje de programación, averigüe nombres válidos de expresiones.
PRUEBA
DEMa 1
~
t
DEMO
~'.::----l.
L.C'~
Nota:
trucciones necesarias para realizar una tarea específica. Los lenguajes de progra mación se clasifican como bajo nivel y alto nivel. El nivel de un lenguaje de programación es indirectamente proporcional al número de instrucciones necesarias para realizar una tarea específica; esto es, un programa destinado a calcular e imprimir la media de las calificaciones de las asignaturas de un estudiante, necesita 'muchas más instrucciones en un len guaje de bajo nivel que en uno de alto nivel (Figura 3.2). Los lenguajes de bajo nivel están más próximos a la máquina que los lenguajes de alto nivel próximo al usuario. PROGRAMAS EQUIVALENTES EN DIFERENTES LENGUAJES (UNIVAC 1100)
A. B : INTEGER :
t t
55
>SALUOO?T
SALUDO
---C=:::---l.
3.2.2. Clasificación de los lenguajes: bajo nivel y alto nivel Existen centenares de lenguajes de programación para computadoras y cada uno tiene diferentes versiones. Cada lenguaje tiene sus ventajas e inconvenientes junto con sus defensores y detractores. Algunos lenguajes son ideales para la programación de un tipo de problemas (gestión, científicos ...) y otros han sido diseñados para resolver otros problemas diferentes (educación, investi gación, etc.). Los lenguajes se suelen clasificar en términos de niveles que constituyen una jerarquía de los lenguajes de programación, relacionada con el número de ins-
ASSEMBLER(ASSEMBLY)
TEST = O
7413 1300 O000000 0003 000000 00 O000000
LMJ +
Xll,NINTRS
0000,0
OUTPUT = 1
05000000 O000000 0000 10000000 O000004 0000 01000000 O00000 1 0000
SZ LA SA
TEST AO,(1.000000+ O) AO,OUTPUT
TEST = TEST+ 1
1000 00 00 O000004 0000 76000000 O000000 0000
ILLA FA
AO,{l.000000+ O) AO,TEST
OUTPUT = OUTPUT*TEST 0100 00 00 O000000 0000 7602 00 00 O00000 1 0000
SA FM
AO.TEST
AO,OUTPUT
IF (TEST.LT.100) GOTO 1
0100 00 00 O000001 0000 1000 02 00 Ó 000000 0000 76010200 O000005 0000 74020200 O000016 0001
SA LA FAN JP
AO,OUTPUT A2.TEST A2.(1.000000+ 2) A2,$+2
PRINT 2,OUTPUT
7401 0200 O0000050001 74131300 O000000 0004 0000 04 00 O000002 ססoo 0000 04 10 O000000 0000 02 00 O00000 1 0000 7201 00 00 O000000 0005 7413 1300 O000000 0006
JNZ LMJ + + + SU LMJ
A2,lL
Xll,NPRT$
0100,2F
0110.0
0040.0UTPUT
Nl02$
Xll,NSTOP$
0000 00 00 O000006 0000
+
(005050!i050505)
C'7'~
Los símbolos 'A', 'B', ... equivalen a A, B, es decir son símbolos terminales.
OCTAL (MAQUINA)
2 FORMAT(F15.0) END
BASIC (ALTO NIVEL) 10 T=O 20 K=l 30 T=T+l 40 K=K*T 50 IF 1.< 100 THEN 30 60 PRINT K 70 END
PASCAL (ALTO NIVEL)
PROGRAM DEMOS (OUTPUT);
VAR TEST, OUTPUT:REAL;
BEGIN
OUTPUT:=1.0; TEST:=O.O;
DO TEST:=TEST+ 1.0; OUTPUT:=OUTPUT*TEST UNTIL
TEST>=100;
WRITELN(OUTPUT: 15;0)
END.
Fuente: Actividades escolares y Guía de Referencia para usar con el Computer Parts Kit. Cambridge, MN: Educational Computer Shoppe, 1978.
Figura 3.2.
Programas en diferentes lenguajes.
56
ESTRUCTURA GENERAL DE UN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
3.2.2. 1. Lenguajes BAJO NIVEL
57
series de 1 y O, el lenguaje ensamblador utiliza símbolos reconocibles, llamados nemotécnicos para representar las instrucciones (Figura 3.3.).
El procesador (unidad central de proceso) de la computadora no puede ejecu tar directamente sentencias escritas en un lenguaje simbólico (alto nivel), basado en símbolos; el procesador solamente puede ejecutar instrucciones más simples, llamadas instrucciones de máquina. Una instrucción máquina es un conjunto de ceros y unos, es decir el procesador sólo entiende el lenguaje binario. Cada procesador tiene sujllego o conjunto de instrucciones que dependerá de la estruc tura física o electrónica de la computadora, o lo que es igual cada computadora tiene solo un lenguaje de programación que puede ser ejecutado: el lenguaje má quina.
0000005A 5C 60
62 66 6A
LR
1850 5C40 1A47 "5A64 5064 B7A8
C16E
Figura 3.3,
5,0 4,=F'4'
4.7 0000 0000 C04E Programa objeto
Direcciones de memoria
M
6,0(4) 6,0(4) 10,8, LOOP Programa ensamblador
Programa ensamblador y objeto.
EL LENGUAJE MAQUINA Un programa máquina (o escrito en lenguaje o código máquina) es un con junto de instrucciones de máquina escritas con ciertas reglas sintácticas que constituyen el lenguaje máquina. El programa escrito en lenguaje máquina es el único que entiende la computadora. Evidentemente los programas escritos en lenguaje máquina son complicados, largos y difíciles de escribir. Imagínese ins trucciones máquinas como: 100011 00001 10001
0110001100111110
El programador debe hacer un gran esfuerzo para recordar tales instruccio ;nes, si es que llega a recordarlas. Los programas escritos en lenguaje máquina, aunque fueron los que primero aparecieron y por ello se denominan lenguajes de la primera generación, son difíciles de interpretar o corregir. A estos inconve nientes es preciso añadir que, como se ha comentado, estos lenguajes sólo sirven para un determinado procesador y generalmente una sota máquina (aunque dos computadoras estén basadas en el mismo procesador -microprocesador en el caso de las computadoras personales- no tienen por qué coincidir su estructura y por consiguiente su programación). Así resultará que el lenguaje máquina sólo servirá para una sola máquina que, junto con los inconvenientes citados, hacen que este lenguaje, entendible por la máquina, no lo sea por el programador. Para solucionar este problema en un nivel superior se diseñaron los lenguajes ensambladores basados en codificación de las instrucciones mediante nemotécni cos (o nemónicos) que son un conjunto de letras y números más simples de utilizar que el código máquina. EL LENGUAJE ENS..:\MBLADOR (Assembler) Los lenguajes máquina como los ensambladores son únicos para un procesa dor particular (en el caso de los microprocesadores, Z-80. 6502, 8088, 68000, etc.). La gran diferencia entre los dos tipos reside en el medio en el que se representan las instrucciones por el programador. En IUI!;¡r el.. 1,,,, n .. .,.,~~-
Los lenguajes ensambladores constituyen para muchos historiadores !fe soft ware, la segunda generación de los lenguajes de programación. En las décadas de los años 60 y 70 los lenguajes ensambladores se utilizaron mucho para desarrollo de programas de aplicación y siempre para desarrollo de software del sistema (sistemas operativos, utilidades, etc.). Aunque los programas eran muy largos, muchos programadores preferían la programación en ensam blador por considerar que utilizaban las características del sistema de computa dora de un modo más eficaz. En la década de los 80 se han popularizado los lenguajes en ensamblador de los microprocesadores más populares Z-80, 6502 y 8085 en 8 bits; 8086/8088, 68000, 80286 en 16 bits, y 80386 en 32 bits. El desarrollo de los lenguajes de programación de alto nivel de la cuarta generación de lenguajes (C, esencialmente) está comenzando a sustituir a los lenguajes ensambladores en el desarrollo de software del sistema. En cualquier forma, hoy día, el porcentaje más alto de la programación -en general- se realiza en lenguajes de alto nivel. 3.2.2.2. Lenguajes de ALTO NIVEL De lo expuesto en el apartado anterior se deduce el interés por otros lenguajes de programación generales (y que a ser posible no dependan de la miquina utilizada) con los cuales se puedan describir algoritmos para ser ejecutados en el mayor número de computadoras. Tales lenguajes, denominados lenguajes de alto nivel, permiten programar sin necesidad de conocer el funcionamiento interno de la máquina. Los lenguajes de alto nivel poseen una potencia considerable en sus instruc ciones, de modo que una instmcción en lenguaje de alto nivel equivale a varias en lenguaje máquina. Así por ejemplo: M
= A + B (1, J) + e • LOG (X)
Puede suponer muchas instrucciones (posiblemente centenares); sin embargo la instrucción es fácilmente entendible por ~I programador.
'"
re
,o
58
ESTRUCTURA GENERAL DE UN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
En esencia las diferencias con el lenguaje ensamblador, residen en que los lenguajes de alto nivel utilizan instrucciones muy potentes (normalmente enten dibles en idioma inglés -no nemotécnicas, IF, THEN, WHILE, FOR, DO, PRINT, etc.), independientes de la máquina sobre la que operan. Un esquema sintetizador del funcionamiento en bloques de los lenguajes se muestra en la Figura 3.4.
59
LENGUAJES ORIENTADOS A LOS PROCEDIMIENTOS Son los más utilizados y se subdividen a su vez según su aplicación en: Lenguajes Lenguajes Lenguajes Lenguajes Lenguajes
cient(/icos: FORTRAN, APL. de gestión: COBOL, RPG. de aplicaciones múltiples: BASIC, Pascal, Ada, C. educativos: Lago, Pilot y Prolog. de la inteligencia artificial: Lisp.
Máquina
(Hardware)
Programador
3.2.3. Intérpretes y compiladores
Lenguaje máquina
Lenguaje
Ensamblador
Usuario/
Programador
Máquina (Hardware)
SOFTWARE (Nemotécnico)
Lenguaje Alto
Nivel
Máquina (Hardware)
!~,
Usuario/ Programador
SOFTWARE
Figura 3.4.
Relación usuario/programador con la máquina.
Los lenguajes de alto nivel se pueden dividir en diferentes grupos: • • • •
Lenguajes Lenguajes Lenguajes Lenguajes
orientados a los procedimientos. orientados a los problemas. de consulta. generadores de aplicaciones.
En cualquier lenguaje de alto nivel en que se escriba un programa, éste debe ser traducido a lenguaje máquina antes de que pueda ser ejecutado. Esta conver sión de instrucciones de alto-nivel a instrucciones a nivel de máquina se hace por programas de software del sistema, denominados compiladores e intérpretes. Estos programas especiales se denominan en general traductores. Cuando se prepara un programa, el programador lo escribe en un lenguaje de computadora de los citados en el párrafo 3.2.2. Normalmente, el programa se introduce en la computadora utilizando un editor (un programa procesador de palabras, propio del sistema operativo de la máquina -caso de EDLIN en el sistema operativo MS-DOS de las computadoras IBM PC y compatibles- b ajeno al sistema, Personal Editor, por ejemplo, en el mismo caso de MS-DOS. Un editor permite al programador teclear el programa línea a línea, para introdu cirlo en RAM y guardar o grabar una copia en disco. La versión del programa escrita en un lenguaje de computadora es el programa o código fuente del progra ma general. Antes de que el programa se pueda ejecutar, se debe traducir desde el código fuente al lenguaje máquina llamándose al programa traducido progra ma o código objeto. El proceso de traducción y su conversión en programa objeto difiere según que el programa sea compilador o intérprete.
COMPILADORES Un compilador es un programa que traduce el programa fuente (conjunto de instrucciones de un lenguaje de alto nivel, por ejemplo COBOL o Pascal) a 1!rograma objeto (instrucciones en lenguaje máquina que la computadora pueda IOterpretar y ejecutar). Un compilador independiente (o un intérprete, como se verá en la siguiente sección) se requiere para cada lenguaje de programación; esto es, para ejecutar programas en COBOL o Pascal, necesitará un compilador COBOL o un compilador Pascal. El compilador efectúa sólo la traducción. no ejecuta el programa. El proceso de compilación en Pascal se muestra en la Figura 3.5. Una vez compilado el programa, el resultado en forma de programa objeto directamente ejecutable. )tra asentar las ideas sobre la compilación co'nsideremos un segundo ejem
kt;ii~~:~<
60
ESTRUCTURA GENERAL DE UN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
COMPILADOR
Pascal
~
Programa" fuente en Pascal
• Figura 3.5.
,
Computadora
, )
•
Programa objeto (máquina)
Sin embargo, a veces le ocurrirá que la compilación termina sin errores y sin embargo no se obtienen los resultados apetecidos; en este caso será debido a errores lógicos de programación como por ejemplo el intento de división por cero (lógicamente imposible en la máquina) que produce error. 4. El compilador COBOL ha traducido el programa fuente en un programa máquina llamado programa objeto. El programa objeto es la salida del proceso de compilación. En este momento, el programa objeto reside en memoria y se puede ejecutar con el nombre que se le haya dado, o bien
Compilación de un programa en Pascal.
.¡ •-i
Programa objeto (máquina)
Datos neceSafios para programa Pascal
Computadora
"
• .... -----.i'~ ... .t~--
Resultados del programa Pascal
Compilador
+
Progr. fuente
Programa fuente
~m.!:;·,;¡.
Progr. objeto
Ejecución de un programa.
plo, en este caso, con un programa en COBOL. Los pasos a seguir en el proceso de compilación son: l. Introducir el programa en COBOL con ayuda de un editor. 2. Llamar al programa COBOL, normalmente situado en disco y cargarlo en la memoria principal junto con el programa fuente COBOL. Comenzar la compilación. 3. Si el programa fuente contiene un error de sintaxis en una instrucción (una instrucción con formato no válido, por ejemplo en COBOL la ins trucción DISPLy «ALELUYA» tiene un error de sintaxis, ya que DISPLy se ha escrito mal, su verdadero nombre es DISPLAY), el compi lador al intentar traducir esa instrucción produce un mensaje de error. Algunos compiladores detienen la traducción con el primer error mientras otros continúan la traducción para encontrar otros errores. El programador debe encontrar, entonces, el error en el código fuente, comenzando de nuevo la compilación y continuar una y otra vez hasta que el programa se compila felizmente. Normalmente es necesario compi lar (ejecutar) el programa varias veces, antes de que el programa haya sido traducido correctamente..
y
programa objeto
Desarrollo programa COBOL (edición)
Figura 3.6.
COmPilador COBOL
"
/ ./
~
61
Errores
""
/
Programa objeto
Programa fue-nte
y
programa objeto
Ejecución programa objeto
=/
.¡I~
I __
\.
-----'1
._=-
Progr. fuente + Modificaciones
"CD
Programa fuente
y
Pro. ejecutable
programa objeto Modificaciones del programa fuente
Figura 3.7.
Proceso de compilación de un programa.
ESTRUCTURA GENERAL DE UN PROGRAMA 62
63
METODOLOGIA DE LA PROGRAMACION
grabarlo en un disco para poder utilizarlo directamente en otra sesión de trabajo, pero ya no será necesario el proceso de compilación. Por consi guiente, para poder ejecutar el programa en otra sesión de trabajo, deberá almacenar el programa objeto en un almacenamiento secundario -disco o disquete- para su recuperación posterior. En la mayoria de los sistemas
de computadoras grandes, esta operación se suele hacer automática-
mente. Por consiguiente cada vez que necesite ejecutar su programa COBOL, no necesitará realizar el proceso de compilación; bastará simplemente con llamar el programa objeto almacenado en el dispositivo de memoria auxiliar, cargarlo en la memoria principal y después ejecutarlo. El programa objeto está ya en código máquina y no se requiere compi- ' lación. El programa objeto sin errores se suele denominar ejecutable. El proceso anterior se muestra gráficamente en la Figura 3.7. Algunos compiladores traducen sólo programas completos, mientras otros traducen secciones de un programa. Esta caracteristica es especialmente útil en diseño de grandes programas. Los programadores pueden romper el programa en secciones o módulos y compilar/verificar cada sección independientemente. Cuando esto se realiza, es necesario utilizar un enlazador o encadenador (<
recordarla con el paso del tiempo (es frecuente denominar a las sucesivas versio nes con nombres como este GRAFICOS1, GRAFICOS2, etc.). Los programas que se ejecutan, con frecuencia se almacenan y ejecutan como programas objetos, normalmente separados de los programas fuente originales. INTERPRETES Los lenguajes de programación además de ser compilados pueden ser inter pretados. Un intérprete es un programa que procesa los programas escritos en un lenguaje de alto nivel, sin embargo, está diseñado de modo que no existe independencia entre la etapa de traducción y la etapa de ejecución. Un intérprete traduce cada instrucción o sentencia del programa escrito en un lenguaje L a código máquina e inmediatamente se ejecuta, y a continuación se ejecúta la siguiente sentencia. Ejemplos de intérpretes son las versiones de BASIC que se utilizan en la mayoria de las microcomputadoras bien en forma residente (en memoria ROM), bien en forma no residente (en disco). El intérprete está diseñado para trabajar con la computadora en modo conver sacionalo interactivo; en realidad se le dan órdenes al procesador a través del intérprete con ayuda -por ejemplo- de un teclado y un programa denominado editor. El procesador ejecuta la orden una vez que ésta es traducida, si no existe ningún error de sintaxis y se devuelve el control al programador con indicación de mensajes (errores de sintaxis, de ejecución, etc.). El intérprete no traduce todo el programa fuente en un solo paso, sino que ejecuta cada instrucción del programa fuente antes de traducir y ejecutar la si guiente. El intérprete se sitúa en memoria principal (RAM), junto con el programa del usuario. De este modo el programa no se ejecutará directamente traducido a lenguaje máquina, sino a través de la interpretación que se producirá al ejecu tarse el programa interpretador en una especie de traducción simultánea. El proceso de interpretación se puede res~mir en la Figura 3.9.
y
Pl"ograma
fuente
..
Figura 3.8.
Lenguaje
máquina
Compilador
Enlazador
Programa.)
ejecutablee:,
Uso de un compilador y un editor de enlaces para producir un programa ejecutable a partir del código fuente.
Libre
Programa del usuario
Memoria principal (RAM)
Entrada de programaiteclado
Intérprete
Cambios en el programa fuente
Si desea hacer cambios en los programas fuente originales escritos en CO..
BOL, Pascal, etc., deberá recuperar el programa fuente del dispositivo de memo :
ria auxiliar (disco, disquete, etc.), realizar los cambios -mediante el editor-,¡.
volver a compilar y crear un nuevo programa objeto, que será la última versión para poder! . actualizada y que le recomendamos ponga un nombre diferente -~~j
«
I
~ Procesador
I
Figura 3.9.
Proceso de hterpretación .
64
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE UN PROGRAMA
Un intérprete suele incluir, casi siempre, el editor para introducir el programa fuente. Ello permite un paso fácil entre la edición del programa (código) fuente y la ejecución del programa en sí. Los diagramas de flujo de la Figura 3.10. muestran el uso de un intérprete y un editor.
65
e incluso un mensaje de diagnóstico que indica la naturaleza del problema. El programador puede ir directamente al error y corregirlo; de este modo los progra mas pueden ser comprobados y corregidos durante el desarrollo de los mismos. Las restantes características a destacar que diferencian un intérprete de un compilador se resumen a continuación.
Inicio
Inicio
Ejecución
Teclear Ifnea código fuente
- La modificación del programa fuente es muy sencilla en el intérprete, mientras que en el compilador, además de la modificación con el progra ma editor, será necesario crear un nuevo programa compilado. Esto signi fica que para comprobar el funcionamiento de un programa, una vez modificado, habrá que volver a compilarlo. - Las ejecuciones sucesivas de un programa compilado no necesitan traduc ciones del programa fuente. Como el intérprete no produce un programa objeto, se debe realizar el proceso de traducción cada vez que se ejecute . un programa.
Interpretar línea del código fuente
sr
Escritura
Ejecutar Ifnea
Un programa en intérprete es más fácil de escribir que en compilador, entre otras razones porque el programa intérprete lleva un editor incorporado. No
Ocupación en memoria Sí Fin
Preparación del código fuente del programa
No
e
Fin)
Ejecución de un programa Figura 3.10.
Uso de un intérprete y un editor.
3.2.3.1. Comparación entre intérpretes y compiladores Los intérpretes y compiladores tienen ventajas e inconvenientes derivados de sus peculiares características; La principal ventaja de los intérpretes sobre los compiladores reside en que el análisis sintáctico del programa se puede ir realizando a medida que se intro- duce por teclado o bien cuando se interpreta. El intérprete proporciona un error
Un intérprete es más pequeño que un compilador y por ello puede ser utilizado en una máquina con menos memoria. Sin embargo, esta propiedad es engañosa, ya que al tamaño del programa hay que añadir el tamaño del propio intérprete que deberá estar en memoria; en cada caso particular puede ser dife rente.
Rapidez La ventaja fundamental de un programa escrito en lenguaje compilador es su rapidez, ya que en caso de la interpretación cada instrucción debe ser analiza da e interpretada antes de su ejecución. . La ejecución del código máquina (programa objeto) es más rápida que la mterpretación de un lenguaje de alto nivel. Cuando un programa está compila do, el tiempo de ejecución es pequeño por estar codificado en código máquina, sin embargo en un programa en lenguaje intérprete, el programa fuente se depe traducir cada vez que se ejecute, y por ello el tiempo de ejecución será la suma . ~ la traducción a código máquina y la propia ejecución. U na serie de programas ;,ejeCutados en una microcomputadora basada en el microprocesador Z-SO pro ionó los siguientes resultados.
66
METODOLOGIA DE LA PROGRAMACION ESTRUCTURA GENERAL DE UN PROGRAMA Tiempo (en segundos)
Operación interpretación 1:ompilación ejecución del código compilado (programa objeto)
10 300
40 300
60 300
1
1,5
2
Conceptualmente un programa puede ser considerado como una caja negra como se muestra en la Figura 3.11.
Ent'Uda,
Sin embargo, se puede dar la paradoja siguiente: el tiempo de compilación, corrección de errores, vuelta a compilar, etc. puede ser mayor que el tiempo empleado en ejecutar directamente un programa de forma interpretada (donde los errores se corrigen sobre la marcha). Conclusiones: Los lenguajes compiladores presentan la ventaja considerable frente a los intérpretes de la velocidad de ejecución, por lo que su uso será mejor en aquellos programas probados en los que no se esperan cambios y que deban ejecutarse muchas veces. Así mismo, en general, ocuparán menos memoria en el caso de programas cortos ya que en el caso de interpretación, el interpretador que tendrá un tamaño considerable debe residir siempre en memoria. Los lenguajes intérpretes encuentran su mayor ventaja en la interacción con el usuario, al facilitar el desarrollo y puesta a punto de programas, ya que los errores son fáciles de detectar y sobre todo de corregir. Por el contrario, como el intérprete no produce un programa objeto, debe realizar el proceso de traducción cada vez que se ejecuta un programa y por ello será más lento el intérprete. En la actualidad los programadores suelen aprovechar con frecuencia las ventajas tanto de intérpretes como de compiladores. En primer lugar desarrollan y depuran los programas utilizando un intérprete interactivo (por ejemplo, MBASIC intérprete); después compilan el programa terminado a fin de obtener un programa objeto (por ejemplo, MBASIC compilador).
3.3. PARTES CONSTITUTIVAS DE UN PROGRAMA Después que se ha tomado la decisión de desarrollar un programa, el progn mador debe establecer el conjunto de especificaciones que deben contener el programa: entradas, salidas, algoritmo de resolución que incluirá las técnicas para obtener las salidas a partir de las entradas. Así pues, se pueden considerar tres grandes bloques en el diseño de todo programa: 1. Entrada de datbs. 2. Algoritmo de resolución del problema/codificación. 3. Salida de resultados.
67
¡
• •
..
Programa (Algoritmo de resolución)
¡
SalMa,
~
Caja negra
Figura 3.11.
Bloques de un programa.
La caja negra o algoritmo de resolución, en realidad, es el conjunto de códigos que transforman las entradas de programa (datos) en salidas de progra ma (resultados). Al establecer las especificaciones del programd, el programa dor debe conocer, en primer lugar, cuales son las entradas del programa y cuáles son las salidas del programa, antes de que pueda especificar el contenido de la caja negra.
3.3.1. Entrada de datos El programador debe establecer las entradas al programa o conocer de dónde provienen, así como el momento en que se requieren en el programa. Si el procesamiento de datos es interactivo, las entradas pueden proceder del usuario mientras el programa se está ejecutando; en otros casos pueden estar contenidas ~n ficheros o bases de datos almacenados en disco o en memoria principal; incluso puede haber entradas procedentes de ficheros de papel o microfilm ~ropios del usuario o externos. En esencia los datos procederán de un dispositivo periférico de entrada. Al proceso de introducir la información de entrada (datos) en la memoria de la computadora se denomina entrada de datos. El programador debe realizar una lista de todas las entradas requeridas por el programa, la fuente de cada entrada y el formato en el que existen actualmente cada una de ellas. El programador debe determinar la frecuencia con que son requeridas las diferentes entradas por el programa: diariamente, semanalmente, mensualmente o en intervalos irregulares. Además, el programador debe deter minar el lugar donde se prepararán, si las entradas serán en línea (on-line), fuera de línea (off-line) y si las entrads serán procesadas por lotes (modo «batch»). Las computadoras reciben la secuencia de ejecución de las instrucciones a través del programa. Esta secuencia la seguirán las máquinas exactamente, y ejecutarán las sucesivas instrucciones, por ello el programador elebe prever todas las situaciones posibles y evitar que un dato pueda ser solicitado sin que haya sido previamente introducido en la memoria.
68
METODOLOGIA DE LA PROGRAMACION
3.3.2. Salida de resultado El programador debe listar todas las salidas previstas del programa, así como el formato requerido por el usuario. Algunas de las características que deben reunir las salidas son: • • • •
Salida en pantalla o en papel impreso. Grabación de resultados en cinta o disco. Diseño o presentación de resultado: listas, tablas, informes, gráficos, etc. Frecuencia de salida de resultados.
La contestación a las preguntas anteriores o similares permitirá codificar correctamente las instrucciones de salida y la elección adecuada del dispositivo periférico de salida: pantalla, impresora, unidad de cinta magnética, unidad de disquete, unidad de disco, trazador gráfico (<
ESTRUCTURA GENERAL DE UN PROGRAMA
69
del lenguaje). Así para conocer en profundidad las instrucciones en ensamblador ~e requiere conocer la estructura del procesador (registros, acumuladores, direc
'iones en memoria, etc.), mientras que en los lenguajes de alto n)..l.;el -salvo ,aras excepciones- no será necesario conocer la estructura interna de la máqui la. Como ya se ha comentádo el repertorio de instrucciones en lenguaje ensam )lador es específico del procesador (o microprocesador -en su caso-, Z-80, 3088, 68000, etc.), mientras que en un lenguaje de alto nivel son específicas de jicho lenguaje. ' Una clasificación de las instrucciones -llamadas también sentencias en los lenguajes de alto' nivel- podría ser la siguiente: . -
Entrada/salida Asignación/movimiento Aritméticas Lógicas Bifurcación o transferencia de control Especiales
3.3.3. Algoritmo de resolución/codificación En un sentido global las instrucciones se pueden dividir en dos grandes Una vez que las entradas y salidas han sido determinadas, el programador debe decidir cómo obtener las salidas deseadas a partir de las entradas dadas. La caja negra que se denominó algoritmo de resolución en esencia constará de dos etapas: l. Diseño del modelo de resolución del problema. 2. Algoritmo de resolución del problema. En la etapa 1 se establece el modelo preciso para la resolución del problema, para lo cual se tendrán en cuenta los datos de entrada y los resultados que se desean obtener; su estudio y desarrollo llevará al algoritrno de resolurión del problema que deberá codificarse en un lenguaje de programación de alto o bajo nivel de lo¡¡ estudiados en el apartado 3.2.2. El algoritmo de resolución se suele expresar previamente a la codificación en el lenguaje de programación, en alguna de las siguientes representaciones: l. Pseudocódigo. 2. Diagrama de flujo. 3. Diagrama estructurado o N-S (Nassi-Shneiderman).
~rupos: 1) las que manipulan datos; 2) las que gobiernan la lógica del programa
. :es decir el orden de ejecución de las instrucciones del programa).
3.4.1. Instrucciones de entrada/salida
Permiten la transferencia de información desde los periféricos de entrada .(teclado, unidad de cinta, unidad de disco, etc.) a la memoria de la computadora y desde ésta a un periférico de salida (pantalla, impresora, unidad de cinta, unidad de disco, etc.). El proceso de introducción de datos en la memoria desde un dispositivo periférico de entrada se denomina lectura o carga de los datos, y al proceso de ~xtracción de datos de la memoria y su envío a un dispositivo periférico de salida se denomina escritura, grabación o conservación (memoria externa), im fresión (impresora o trazador gráfico). Instrucciones de lectura (entrada) Las instrucciones de lectura afectan a las unidades o dispositivos llamados j'~ lectura: pantalla (terminal), unidad de cinta magnética. unidad de disco o
3.4. TIPOS DE INSTRUCCIONES Las instrucciones disponibles en un lenguaje de programación, dependen del tipo de lenguaje bajo o alto nivel. La diferencia esencial entre ambos lenguajes: próximo al usuario (alto nivel) y próximo a la máquina (baila> nivel), .se manifiesta en el juego o repertorio de instrucciones (conjunto especl'ftro de mstrucciones
I squete, lectora de tarjetas perforadas, digitalizador, etc. Ejemplos de estas instrucciones en pseudocódigo podrían ser: Leer A, B,
e
Leer 425, 321
Lectura de los valores numéricos correspondientes a las variables A, B y C. Lectura de las constantes numéricas 425 y 321.
70
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE UN PROGRAMA
En lenguajes de alto nivel estas instrucciones son: BAS/C
Pascal
INPUT UNE INPUT READ
READ READLN
no es un formato correcto, aunque la ecuación matemática correspondiente A+5=B-2
tenga sentido. Por el contrario 1: = I + 1
Instrucciones de escritura (salida) Afectan a las unidades de salida: pantalla, disco trazador gráfico, etc. Ejemplos de estas instrucciones en pseudocódigos y lenguajes de alto nivel son: Pseudocódigo
Escribir A, B,
71
e
Escribir 53,64 BAS/C
PRINT A, 8, e PRINT USING
Pascal
WRITE WRITELN
escritura de los valores numéri cos correspondientes a las varia bles A, B Y C. escritura de las constantes nu méricas 53 y 64.
o bien
1= I + 1
es aceptable como instrucción de asignación (el valor de la variable I se incre menta en una unidad) y no tiene sentido matemático. Las instrucciones de movimiento tienen el mismo sentido que las de asigna ción y permiten transferir la información o contenido de un campo o posición de memoria a otro, manteniendo siempre intacta la información en su primera posición (emisor) y variando el contenido de la segunda posición (receptor). M~N
mueve el contenido del campo M al campo N
Suponiendo que M = 32225 YN = 724, la instrucción anterior M ~ N deja ría los campos M y N con los valores M = 32225
y
N = 32225
3.4.3. Instrucciones matemáticas Realizan el cálculo de operaciones aritméticas tales como sumar, restar, multiplicar, dividir o funciones como seno, coseno, tangente, etc.
3.4.2. Instrucciones de asignación/movimiento
M=P+Q
Las instrucciones de asignación son fundamentak,s en casi todos los lenguajes de progtamación. Permiten asignar valores (Y variables del programa.
A+ B/2 Y = SIN (Xl
A=5 LET A = 5
A .· -- '"~ A:
=B +
5
el valor numérico 5 se asigna a la variable A (BAS/C). equivalente a A = 5 en lenguaje BAS/C; es opcional el uso de LET en BAS/C. equivalente a A = 5 en lenguaje Pascal. equivalente a A = B + 5 en lenguaje Pascal.
Esta instrucción ejecuta el cálculo del lado derecho y asigna el valor obtenido a la variable de la izquierda; el lado derecho de la instrucción puede ser cualquier expresión legal; el lado izquierdo debe ser un nombre de variable. En el lado izquierdo no puede haber una expresión. La instrucción de asignación no tiene que confundirse con una ecuación matemática. Así: A+5:=B-2
en Pascal·
A+5=B-2
en BASIC
suma el contenido de los campos o variables P y Q, almacenando el resultado en M división de B entre 2 y asignación del resultado a A. cálculo del seno del ángulo X y almacenamiento del re sultado en Y.
LaTabla 3.1. representa los operadores o símbolos de las operaciones aritmé ticas básicas. Tabla 3.1. Operador
+
.
-
/ \ (DI V) MOD
Operadores aritméticos Significado
Suma Resta Multiplicación División División entera (19\5 = 3) Resto (19 MOD 5 = 4)
72
ESTRUCTURA GENERAL DE UN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
73
falsa -según la condición-. Además de los operadores de relación existen otro tipo de operadores conocidos como lógicos que permiten realizar las operaciones lógicas o booleanas ANO (y), OR (o), NOT (no) y en ocasiones XOR (OR En numerosas ocasiones se necesita comparar dos expresiones aritméticas exclusiva) e IMP (implicación). entre ellas con la finalidad de tomar una decisión en función del resultado de Las operaciones lógicas básicas ANO, OR y NOT se representan por unos dicha comparación. Este tipo de operaciones se realiza con operadores de rela cuadros conocidos como tablas de verdad y que se indican en la Tabla 3.3. ción que se indican en la Tabla 3.2.
3.4.4. Instrucciones lógicas y de relación
Tabla 3.2
Operadores de relación
Operador Menor que Mayor que Igual Mayor o igual Menor o igual Diferente No es menor No es mayor
< >
>ó>=ó=> ~ Ó <=ó=< <>ó#ó>< < >
OPERADOR DE RELACION
8
A
L
+
Tablas de verdad de los operadores lógicos
A
B
A AND B
A OR B
NOT A
NOT B
F* F V' V
F V F V
F F F V
F V V V
V V F F
V F V F
• F = Falso o el valor lógico «O» • V = Verdadero o el valor lógico 1
Estos operadores relacionan dos expresiones aritméticas entre sí con el si guiente formato: Expresión 1
Tabla 3.3.
Significado
Si en lugar de dos condiciones A y B hubiese tres, el rango de valores diferen tes que podrían tomar es
Expresión 2
e
L_, t
operador igualdad
- - - - - - - - - - - - - eXpresión 1
A
B
C
F F F F
F F V V
F V F
V
F
F
V V V
F V V
V F V
V
Al conjunto anterior se le suele denominar condiciones
o
A>B
bien considerando valores digitales 1(V)
e> o - E A
El resultado de evaluar una condición puede tomar sólo dos valores: Verda O dero y Falso. Así, por ejemplo A >B
sí A = 7 Y sí A = 14 Y
B = 3 entonces A > B es verdadero
B =27 entonces A > B es falso.
Si en un programa se elige una determinada condición para realizar una tarea concreta, ésta sólo se realizará cuando dicha condición sea verdadera o
O O O 1 1 1 1
B
C
O O 1
O 1 O 1 O 1 O 1
1 O
O 1 1
y O(F) resultaría
Ir Jii' :·, ','
74
ESTRUCTURA GENERAL DE UN PROGRAMA
METODOLOGIA DE LA PROGRAMACION
Así la tabla de verdad completa en el caso de tres condiciones CI, C2 y C3, y dos operaciones lógicas AND y ORo Cl
C2
C3
o o o o
o o
o
1 1 1 1
1
C2 OR C3
Cl AND (C2 OR C3)
o o o o
o
o 1 1 1
o o o o
1
1 1 1
1 1 1 1
Cl AND C3
1 1
o
1 1
o
o
1
1
o o
1
o 1
o
El operador de negación NOT (NO) transforma la certeza o falsedad de cada suceso en su opuesto de modo que si el suceso A es verdadero NOT A es falso y de igual forma si A es falso, NOT A es verdadero. Como aplicación de la condición NOT, los siguientes ejemplos representan la misma condición: NOT (A=S) A=S A>S
A<>S NOT ((A> S) OR (A < S)) NOT ((A = S) OR (A < S))
3.4.5. Instrucciones de bifurcación o trasferencia de control Permiten variar (romper) la secuencia de ejecución de un programa al saltar (bifurcar) a otra parte del mismo. Las instrucciones de este tipo se basan en una simple comparación o en los resultados de operaciones lógicas. Las bifurcaciones producidas por las instrucciones de control pueden ser con salto adelante en la secuencia normal del programa o con salto atrás. Los tipos de bifurcaciones en cuanto a las condiciónes a cumplir son: incondicionales y condicionales; las bifurcaciones incondicionales se realizan siempre que se ejecu ta la instrucción, mientras que las bifurcaciones condicionales sólo se realizarán al cumplirse una determinada tarea.
3.4.6. Instrucciones especiales Las instrucciones especiales varían de unos lenguajes a otros, y las que citare mos aquí no significa en modo alguno que las posean todos, sino que según el lenguaje o su versión, podrán ex.istir o no. El grupo más importante de instruc ciones especiales se clasifican en: • edición • impresión
• • • • • •
75
conversión
ordenación
declarativas modificación de direcciones comunicación de E/S (entrada/salida) gráficas.
edición Facilitan los formatos de presentación de resultados tanto en modo texto como en modo numérico. Ejemplos típicos son: dibujo de rótulos en zonas específicas, supresión de ceros no significativos, inclusión de signos positivos, negativos o monetarios, justificación de resultados a derecha o izquierda, etc.
impresión Son una mezcla de instrucciones de salida y edición que facilitan la escritura o impresión de resultados en una hoja de papel (folio o papel continuo) de im presora.
conversión En las computadoras es usual trabajar con diferentes sistemas o códigos de numeración: Hexadecimal, Binario, Decimal y Octal -son los más frecuen tes-, así como los códigos de caracteres: ASCII y EBCDIC, también son los más frecuentes. Existen instrucciones de conversión que facilitan las conversio nes y pasos de un sistema o código a otro.
ordenación Se utilizan para clasificación creciente o decreciente de datos.
declara ti vas Permiten asignar las zonas de memoria encargadas de almacenar los datos y definir el tipo de información almacenada. Así mismo se cosideran en este tipo las instrucciones que con fines de documentación interna se incluyen en Jos programas para una mejor legibilidad de los mismos.
modificación de direcciones Actúan sobre las diversas posiciones de memoria, modificando su conte nido.
76
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE UN PROGRAMA
77
comunicación de E/S Comienzo
Actúan sobre los caminos o canales de comunicaciones, para facilitar la comunicación entre el procesador y periféricos externos (normalmente dispositi vos electrónicos). gráficos
Lectura de datos M,N,P
Instrucciones especiales para manipulación de gráficos. BASIC y Pascal son lenguajes que poseen características gráficas; HP y Textronix las marCas de computadoras más acreditadas en este sector.
3.5. TIPOS DE PROGRAMAS . S=M+N+P
Los programas escritos para computadoras, en general, se pueden clasificar en tres tipos o estructuras fundamentales:
Variable S = Suma
• Lineales. • Cíclicos. • Alternativos (decisionales). En realidad es dificil que un programa de complejidad -e incluso sencillo se componga de una sola estructura y normalmente una mezcla de los tres tipos es lo que suele constituir un programa.
3.5.1. Programas lineales Son aquellos en los que no existen instrucciones de bifurcación y por consi guiente las instrucciones se ejecutan en la misma secuencia en que han sido codificadas. Estos programas se denominan también secuenciales dado que si guen exactamente la secuencia especificada. Es normal que estos programas consten de las siguientes fases: • Lectura o entrada de datos. • Proceso. • Impresión o salida de resultados.
M, N, P Suma=M + N + P Impresión de M, N, P YS
El diagrama de flujo resultante sería:
Ejemplo 2: Diagrama de flujo que calcula la suma de cuatro números M, N, P Y Q, y a continuación extrae la raíz cuadrada de dicha suma. El valor de la suma S y la raíz cuadrada RC, se deben imprimir.
Nota: Los números M, N, P Y Q son positivos.
Ejemplo 1: Diagrama de flujo para lectura de tres números M, N, P en una sola operación e impresión de los mismos y de su suma en una impresora.
Datos de entrada: Proceso: Salida de resultados:
( Fin)
S=M + N + P
Datos de entrada:
M, N, PyQ
Proceso:
S=M+N+P+Q RC = M + N + P + Q = S
Salida de resultados:
Impresión de S y Re.
'..'{
78
METODOLOGIA DE LA PROGRAMACION
Comienzo
ESTRUCTURA GENERAL DE UN PROGRAMA
79
• Lazo o bucle (conjunto de instrucciones que se repiten y ejecutan un número determinado de veces). • Instrucciones finales o resto del proceso. • Salida de resultados. Estos programas precisan instrucciones de bifurcación o control que permi tan la entrada y salida del bucle. Ejemplo 3: Supongamos que los datos del ejemplo 1 provienen de un fichero o archivo que tiene un número determinado de grupos de tres números, y que se desea obtener la suma e impresión de todos los grupos.
S=M+N+P+O
RC = SOR(S)
En este caso al tratarse de un fichero, éstos suelen contener siempre un campo en su última ficha que se denomina fin de fichero (FF) y que cuando se encuentra en la lectura supone que se ha alcanzado el final del fichero y por consiguiente no se debe seguir leyendo. El diagrama de flujo modificado es:
G?
~---~I y
Sí
¡ Fin
3.5.2. Programas cíclicos
(
S=M+N+P
Son aquellos programas en los que un grupo de instrucciones se ejecuta un número determinado de veces -de modo cíclico- hasta que se cumple una cierta condición que indica el fin de las ejecuciones de dichas instrucciones. El conjunto de las instrucciones que se repiten cíclicamente se denomina bucle, lazo o ciclo. La estructura de un programa cíclico suele constar de los siguientes bloques o fases: • Entrada de datos e instrucciones previas.
t
Fin)
80
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA GENERAL DE UN PROGRAMA
81
Ejemplo 4: Igual que el ejemplo 2, suponiendo que los grupos de cuatro elementos M, N, P Y Q se encuentran en un fichero.
3.5.3. Programas alternativos
En realidad los tres diagramas adolecen técnicamente de un defecto: la no inicialización de las variables o campos S y Re. Estas variables antes de efectuar la operación de suma o raíz cuadrada se les debe dar un valor inicial -en este caso cero- y normalmente estas operaciones de asignación del valor inicial se suelen colocar al principio del diagrama de flujo.
Son aquellos que permiten la ejecución de diferentes operaciones, dependien do de que se cumplan (o no) determinadas condiciones que se producen en los datos de entradas o durante el proceso. Según la condición que se cumple se realiza una serie de instrucciones diferentes. Ejemplo 5. Se trata de diseñar un diagrama de flujo de modo que se presente un menú al usuario con tres opciones posibles; cada opción representa un proce dimiento -conjunto de instrucciones independientes-o Después que se ejecute el procedimiento seleccionado, el usuario debe ser capaz de ejecutar otro proce dimiento cualquiera -incluso el mismo- o bien de terminar el programa.
Comienzo
Operaciones a realizar:
Inicializar S Y RC//S=O RC=O
• • • • •
Visualizar menú de opciones. Introducir respuesta (selección, opción).' Ejecución procedimiento seleccionado. Visualizar menú. Seleccionar otro procedimiento o fin.
El diagrama de flujo resultante se muestra en la Figura 3.12.
3.5.4. Otras representaciones gráficas SI
CFin-)
A veces se suelen utilizar otras representaciones gráficas que, si bien son muy esquemáticas, pueden dar una idea exacta de las estructuras o secuencias sobre todo desde un punto de vista global.
S=M+N+P+O RC=SOR(S)'
I
¡
, SOR es la función rarz cuadrada.
1
Lineal
Cíclico
Alternativo
.",.....~ .' .
Comienzo
Visualizar menú
CAPITULO 4
TECNICAS
DE PROGRAMACION
~
~I
Procedimiento 1
4.1.
Procedimiento 2
t Procedimiento 3
Procedimiento 4
Figura 3.12.
Programa alternativo
I
~
ELEMENTOS BASICOS DE UN PROGRAMA
En los capítulos anteriores hemos introducido al lector en conceptos tales como algoritmos, diagramas de flujo, programas, lenguajes de programación, etcétera. Así, hemos visto cómo en programación se debe diferenciar entre el diseño del algoritmo y el diagrama de flujo que resuelve un problema y su implementación en un lenguaje particular. En consecuencia, debemos diferen ciar claramente entre los conceptos de programación y el medio en que son realizados en un lenguaje específico. Sin embargo, una vez que sepamos los conceptos de programación y saber cómo utilizarlos, el aprendizaje de un lengua je es relativamente fácil. Las técnicas específicas de programación son los objeti vos de este capítulo. Como ya conocemos, las reglas para combinar los elementos básicos de un lenguaje forman la sintaxis del lenguaje. Existen un número determinado de palabras reservadas, que sólo pueden ser utilizadas de un modo limitado: ins trucciones o sentencias de programación. (En Pascal además de las palabras reservadas como sentencias, existen los identificadores estándar que tienen un significado predefinido, o bien ser elegidos por el programador.) Aunque en el Capítulo 1 se hizo una breve introducción a los elementos básicos de un programa: datos, variables y expresiones, en este capítulo profundi zaremos en estos conceptos y en algunos otros. Los elementos básicos cuya correcta combinación permite construir un pro grama son: - palabras clave e identificadores, - constantes, 83
82
TECNICAS DE PROGRAMACION 84
85
METODOLOGIA DE LA PROGRAMACION
Los números reales se pueden expresar en notación de punto (coma) fijo y en notación de punto flotante.
- variables,
- expresiones,
- sentencias de asignación.
4.1 .1 .
Punto fijo Punto flotante
Palabras clave e identificadores
0.3141592x10i1
-324.567 -12.4567e2
4.5x10i-s
-12.4567x lOi2
La notación exponencial de un número real se representa por t Constante decimal: e + n Donde n es la potencia de diez a la que se tiene que elevar la constante deci mal. En realidad esta constante es un tipo particular de las constantes reales equivale a
e+5
Pascal and, array, type, case, begin...
BASIC GOTO, READ, INPUT, END...
0.00000254 4.5e-S
o sus equivalentes (e representa la potencia de 10)
Las palabras clave o reservadas constituyen las instrucciones (órdenes -co
mandos-, sentencias, funciones y operadores) intrínsecas al lenguaje de progra
mación y son la parte fundamental de su sintaxis.
Los identificadores tienen un significado predefinido (por ejemplo, en Pascal,
abs, input, read, eoln, reset, char, etc.) o bien ser elegidos por el programador
como son los casos de los nombres de variables, programas, etc.
Las palabras reservadas no pueden ser elegidas como identificadores o nom bres de variables. Son palabras reservadas
4.1 .2.
3.141592 0.3141592e+1
105
Constante de caracteres (char)
Constantes
Una constante es una cantidad cuyo valor no cambia durante el proceso, es decir, es un elemento fijo de datos. Para expresar una constante es preciso escribir su valor, por ejemplo, 1, -25, 43 ó 3.141592. La mayoría de los lenguajes permiten diferentes tipos de constan- , tes, siendo las más comunes: enteros, decimales, caracteres y constantes boolea- !
Es un carácter perteneciente al conjunto de caracteres disponibles. Normal mente, los caracteres disponibles son letras mayúsculas y minúsculas, dígitos, símbolos de puntuación y otros símbolos. Las constantes de caracteres se organi zan en series o secuencias de caracteres denominadas cadenas (<
nas o lógicas.
'B'
'*'
'Hola Flanagan'
En lenguaje BASIC las cadenas se escriben entre comillas "A"
Constante entera (integer)
"B"
"*"
"Hola Flanagan"
Una constante entera es un número con un valor entero, positivo o negativo. Constante boolean
5
-124
465
+12456
Las comas y espacios no se deben utilizar para separar grupOS de dígitos en enteros. El número 31.425.427 se debe escribir 31425427.
La constante «boolean» puede tener dos valores posibles: verdadero (true) y falso (false). Los valores «boolean» son muy útiles en programación.
4.1.3. Constante real (real) Un decimal o constante real es un número escrito con un punto decimal (número decimal).
41.35
-0.561
32.S21
4.0
Obsérvese que si bien 4.0 por su valor es un entero, se considera como constante decimal.
c.--.'.'..:.s_..
Variables
Las variables representan también elementos de datos variables. Mientras que una constante siempre representa un elemento fijo de datos, las variables representan elementos que pueden cambiar durante la ejecución de un programa (por ejemplo, por la acción de una instrucción de lectura de datos). Las variables se refieren en los programas por nombres simbólicos o identificadores. Dependiendo del lenguaje, existen diferentes tipos de variables, tales como enteras, reales, caracteres, etc.
86
METODOLOGIA DE LA PROGRAMACION Tabla 4.1.
TECNICAS DE PROGRAMACION
Variables de Jos lenguajes BASIC y Pascal
BASIC variables numéricas • enteras • simple precisión • doble precisión variables de cadena de caracteres
Los paréntesis se utilizan también para agrupar términos y asegurarse que las operaciones se ejecutan en el orden correcto.
Pascal integer real char boolean
A * (B - 7)
{enteras (real) (carácter) (lógicas)
Expresiones
Tabla 4.3.
Se pueden evaluar datos y por consiguiente obtener nuevos valores, evaluan do expresiones. Las expresiones son combinaciones de constantes, variables, símbolos de operación -operadores-, paréntesis de apertura y cierre y nombres de funcio nes especiales. Las expresiones matemáticas tienen igual sentido, por ejemplo:
x (Y + 5) -
4 *Z+
Operador
-. /
+, \. MOO
;
Aquí, los paréntesis indican el orden de cálculo, + y - representan adición y'¡ resta, y ~- significa la raíz cuadrada de x. Cada expresión tiene un valor, que se determina tomando los valores de las. constantes y variables de la expresión y ejecutando las operaciones indicadas.
Expresiones aritméticas
Las expresiones aritméticas son análogas a las fórmulas matemáticas. LaS¡ variables y Constantes implicadas en la expresión son numéricas (enteras o reales] y las operaciones vienen expresadas por los operadores matemáticos; véase Ca pítulo 3). Tabla 4.2.
+
/ \ó OIV MOO
potenciación suma resta multiplicación división división entera módulo entero (resto)
Prioridad de operadores aritméticos.
Prioridad (más alta)
1
(más baja)
En consecuencia,
IX
.,
4. 1.4. 1.
se efectúa primero B - 7 Yluego el resultado se multiplica por el valor de B.
En el caso de que se presenten diferentes símbolos, y se produzca una ambi güedad en el orden de las operaciones, existe una prioridad o precedencia asocia da con cada operador y la ejecución de las operaciones se realiza por orden de prioridad comenzando por la más alta. En caso de' igualdad en prioridad, se procesan los operadores en orden de izquierda a derecha. La prioridad suele ser similar en los diferentes lenguajes, y se indica en la Tabla 4,3.
Una variable, o mejor un cierto tipo, puede tomar sólo valores de ese tipo. Una variable de carácter, por ejemplo, puede tener como valor sólo caracteres, mientras que una variable entera sólo puede tomar valores enteros. Cualquier intento de asignar un valor' de distinto tipo a la variable producirá un error.
4.1.4.
87
Operaciones aritméticas
~L"¡/ 'ret-·'
((A * B)/C) * D
es igual que es igual que es igual que
(A * B) + 7 P + M/N + Q A * B/C * D
Además de los operadores es posible utilizar funciones matemáticas estándar del sistema o definidas por el usuario (en el apartado 4.7 se explicará el concepto de función) como ABS (X) SQR (X)
SIN (X)
lN (X)
valor absoluto de X raíz cuadrada de X seno de X (en radianes) logaritmo neperiano de X
En las funciones, X (argumento) puede ser entero o real.
(213 = 8) (5 + 4 = 9) (8 -3 = 5)
(5 -8 =40)
(15/2 + 7.5)
(17 OIV 3 = 5 ó bien 17\3 = 5) (17 MOO 3 =2)
\.
A*B+7
P+ (M/N) + Q
tM
-..'
4.1.4.2. Expresiones booleanas Una expresión booleana es una expresión en donde existen entre otros ele mentos, operadores de relación o lógicos y su valor es siempre verdadero o falso. Un sistema para generar expresiones booleanas es combinar operadores boolea os y relacionales con otros elementos.
88
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION Tabla 4.4.
AND
AANDB
OR
A OR B
NOT
NOTA
Tabla 4.6.
Operadores lógicos
la expresión es verdadera sólo si A y B son verdaderos, en caso contrario es falso. la expresión es verdadera si A o B es verdadero, y falsa si A y B son falsos. la expresión es verdadera sólo si A es falso, y vicever sa.
Ejemplos
A = verdadero B = falso
NOT (A) OR B = falso OR falso = falso.
NOT (A OR B) = NOT (verdadero OR falso) = NOT verdadero = falso.
NOT (A AND B) = NOT (verdadero AND falso) = NOT falso = verdadero.
Las expresiones booleanas se pueden expresar también con operadores de relación o comparación (Tabla 4.5). Tabla 4.5.
> > = < < = < >
Operadores de relación Igual Mayor que Mayor o igual que Menor o igual que Menor que o igual No igual
( )
( )
" I
',1, modo divo and
+, -
\, MOD
=, < >, <,>,<=,>=
NOT AND OR
+, -, or
noto
<, <=,>,>=,=,< >, in
Todos los operadores de una misma línea tienen igual prioridad. Dentro de una misma línea -prioridad igual-, la evaluación de operadores se hace de izquierda a derecha. Los operadores de una línea tienen prioridad sobre los de la línea inferior.
Para ejecutar cálculos se necesitan sentencias que indiquen a la computadora qué acciones ha de ejecutar. La herramienta básica es la sentencia de asignación (en el apartado 3.4.2 se estudió el concepto de asignación). Las sentencias de asignación son una parte fundamental de casi todos los lenguajes de programa ción, permiten asignar el valor de una expresión a una variable. Recordemos que
A:=B+1 expresión 1 OPERADOR RELACIONAL expresión 2 Ejemplos
B = 14 B=10 B = 10
Pascal
4.1.5. Sentencias de asignación
Los operadores de relación se utilizan para comparar expresiones. El formato general de tal comparación es
A=5 A=4 A=4
Prioridad total de operadores
Prioridad máxima
BASIC
89
A>B
falso falso ve'rdadero.
(A - 3) > (B - 5) (A - 3) < (B - 5)
Las reglas de prioridad se aplican también en este caso. Todos los operadores de relación tienen menor prioridad que los operadores aritméticos. REGLAS DE PRIORIDAD en PascaljBASIC
(Pasca.!)
A=B+1
(BASIC)
significa que se han de ejecutar las operaciones del lado derecho y asignar el valor obtenido a la variable de la izquierda. El lado derecho de la sentencia puede ser cualquier expresión legal y el lado izquierdo debe ser un nombre de variable. En general, la expresión de la derecha debe tener un valor del mismo tipo que la variable de la izquierda. Si se dan varias sentencias de asignación se sUpone que se ejecutan en el orden en que están escritas. No se puede tener una expresión en el lado izquierdo. La sentencia de asignación no debe confundirse con una ecuación matemática o la igualdad aritmética. Por consiguiente:
A+5:=B-6 no es un formato correcto, aunque la ecuación matemática
Como ejemplo hemos elegido Pascal y BASIC para da~ las reglas de prioridad, aunque en los restantes lenguajes suelen ser siJ?1ilares. <~\ifi;,;;;;¿{
ti tii
A+5=B-6
I
.~"V""IDAD NACIONAL AalERTA
J
90
METODOLOGIA DE LA PROGRAMACION
TECNICAS DE PROGRAMACION
tiene sentido. Por el contrario N: = N + 1
91
2. Sentencias de asignación con expresiones de carácter o booleano Pascal
N=N+1
es aceptable como sentencia de asignación y no como ecuación matemática; significa que el valor de la variable N se debe incrementar en l. El formato de la sentencia de asignación varía de un lenguaje a otro, si bien' la idea básica permanece.
DEMO: = 'C'; NOMBRE: = true; M:=(B>C);
correcta si DEMO es de tipo CHAR
correcta si NOMBRE es de tipo boolean
es correcta si M es de tipo boolean
4.1.6. Otros elementos Pascal
I
variable:
= expresión
Además de las constantes, variables, expresiones y sentencias de asignación, los programas se componen de otra serie de elementos tales como bucles, bifurca ciones, contadores, acumuladores, interruptores así como los subprogramas que constituyen módulos independientes dentro de los programas. Todos los elementos básicos unidos adecuadamente mediante las estructuras básicas constituirán los programas. En lo que resta de capítulo estudiaremos los restantes elementos y estructuras básicas que van a permitir el diseño adecuado del algoritmo para la resolución de un problema que convenientemente codificado se convertirá en un programa.
I
BAS/C estándar
I
variable = expresión
I
o bien
I
LET variable = expresión
I CAMPOS DE MEMORIA
BAS/C HP (ANSI)
I
LET variable 1, variable 2, ... = expresión
I
I
variable 1, variable 2. n. = expresión
I
Nota: La expresión en cualquier lenguaje puede ser numérica, de caracteres o booleano
• entrada • salida • trabajo
Ejemplos
l. Escribir como sentencias de asignación las fórmulas del área y longitud de\i un círculo de radio R.
~
- Campos de entrada: contienen los datos de entrada que aún no han sido utilizados durante el proceso. - Campos de salida: contienen los datos de salida que ~an a visualizar en pantalla o escribir en algún dispositivo.
a
= 1t Rt2
L=21tR
Pascal
A lo largo de un proceso se necesita, con frecuencia, almacenar datos, para su posterior recuperación. El almacenamiento de los datos y las operaciones con ellos exige su introducción en memoria, en áreas de almacenamiento específico de la computadora. Las áreas de almacenamiento se denominan campos de me moria. Los campos de memoria se dividen en los siguientes tipos:
- Campos de trabajo: contienen los datos o resultados parciales que se almacenan hasta que son requeridos por el programa.
BAS/C
AREA: = 3.141592*RADIO*RADIO;* AREA = 3.141592*RADIO*RADIO LONGITUD: = 3.141592*2*RADIO; LONGITUD = 6.283184*RADIO
trnl·'9"~.. ii¡"a-a.'.'·la}éi-.~iñ.~Ció~·(rerasé.7lte;5ia.'
"': n:" ,1\ ,:.1.'\ Lll{H::-I,\ 1<\, ¡! •• ~ 'Ii,""'.· "" ~... "
".'''''' "PII.SC.af.e. XT.'ge-1!'tI1ltt ..
<
_
<'"'-:_--_F~_=-~,
Las variables, contadores, etc. que veremos en los párrafos siguientes, se almacenan en campos de memoria.
92
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
4.2. BUCLES E ITERACIONES Un bucle es un proceso en el que se ejecutan una serie de operaciones un . número determinado de veces; las operaciones serán siempre las mismas, pero " con datos y resultados diferentes. En el caso de un programa de computadora, el bucle o lazo es un conjunto de instrucciones que deben ser ejecutadas un cierto número de veces, en un proceso iterativo o repetitivo; el bucle constará de una entrada y una salida; la entrada se producirá con una o varias instruccio nes y la salida del bucle -fin del proceso repetitivo- se producirá cuando se cumple una condición. Un bucle se representa gráficamente así:
l·
93
,
Acción f1
Acción f2
It No Acción f1
¡
Sí
Salida del bucle
I
I I
bucle
~ Acción f2
Una iteración es la repetición controlada de la secuencia de acciones internas al bucle. En general, un bucle constará de las siguientes partes: - preparación o arranque del bucle: una o más instrucciones que pueden ser: asignación de valores a constantes, contadores a cero, dimensionado de listas o tablas, etc.
Si no se pone condición de salida se permanecerá dentro del bucle indefinida mente, y se conoce a este tipo de bucles como bucle infinito o bucle sin fin. La salida del bucle exigirá el cumplimiento de una condición, por ejemplo que una determinada variable tome un determinado valor, X = 999, X = 0, etc. Así la
representación gráfica del bucle sería:
¡
- cuerpo del bucle: grupo de instrucciones que integran realmente el bucle para cumplir el objetivo e&pecificado y que se repiten mientras no se cumple la condición. - modificación del bucle: conjunto de instrucciones que modifican el bucle, haciendo progresar su ejecución hata su terminación final; se suele realizar Con contadores, totalizadores. - comprobación de la condición: suele constar de una instrucción para averi guar si se ha producido la condición que determinará la salida del bucle.
.j~~~~..L.,,,:~<.~-
94
METODOLOGIA DE LA PROGRAMACION
El organigrama típico de un bucle es el siguiente:
TECNICAS DE PROGRAMACION
95
Ejemplo
IniCIO
Inicio
~
Lectura de una lista
Preparación
sr
Modificación
Operaciones de impresión
No
Cálculo
Cuerpo
Salida resultados
Salida resultados
No
e Fin)
Salida del bucle
Figura 4.1.
Organigrama típico de un bucle.
El valor de los valores de control· que intervienen en la condición pueden ser variables y cuyos valores dependan de resultados anteriores a la condición (caso de K) o de operaciones posteriores a la condición (caso de M).
96
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
En las instrucciones de preparación del bucle se realiza la inicialización del contador o contadores. La inicialización de un contador consiste en poner el valor inicial de la variable que representa al contador
I
I
1 I
'(
N=K
N=5 1------
K, valor de control que viene impuesto
M.:;N
p=o
1= 3
Por consiguiente, el contador se representará por una instrucción de asigna ción del tipo N = N-I
N= N+ 1
No
97
siendo 1 el incremento del contador. Un ejemplo de la aplicación de un contador en un ordinograma es:
Sí
• I
Valor inicial de contador N es K
N=K Acción a1
Sí M, variable de control resultado de una operación
~----
No
M = expresión matemática
Acción 1
Salida del
bucle
I
4.3. CONTADORES En los procesos repetitivos se necesita normalmente contar los sucesos
acciones internos del bucle, como pueden ser: registros o elementos de un fiche~
ro y número de iteraciones a realizar por el bucle. Para realizar esta tarea
utilizan los contadores, cuya construcción es una de las técnicas corrientes e
la realización de cualquier diagrama de flujo.
Un contador es un campo de la memoria que está destinado a contener lo:..."
diferentes valores que se van incrementando o decrementando en cada iteración!'
El campo contendrá las sucesivas sumas parciales que se van realizando en 1
ejecución de las sucesivas repeticiones. El incremento en las sumas parciales e~ t siempre constante, pudiendo ser positivo o negativo, es decir el contador se irá , incrementando o decrementando. El contador se representará en un program
con U11a variable.
't' Acción n
Incremento
contador
-
N= N+ I
.... ~
.
98
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACJON I I
En el ejemplo anterior, los sucesivos valores de N se muestran en la Tabla 4.7, para los diferentes valores de 1. Tabla 4.7.
Valores sucesivos de N
Caso
Valor inicial N
Incremento I
a
O 5 6 8 15
1 1 3 -1 -3
b c d e
t 1=5
Valores sucesivos de N
1,2.3.4•...
6.7,8.9....
9.12,15,18....
7,6,5.4,3....
-12, -9, -6. -3, ...
N
La salida del bucle se produce cuando el valor N se hace mayor que el valor prefijado de M. En el caso anterior y para los sucesivos valores de M la salida' se producirá según indica la Tabla 4.8.
No
1)
~
Tabla 4.8.
Valor inicial deN
Incremento I
Valor de M
SaIJda cuando M= ...
a
O 5 6 8 15
1 1 3 -1 -3
10 25 15 -4 O
11
26
16
-5
-1
b c d e
,
Fin
Salida del bucle
Caso
••
Un ejemplo específico de un bucle, con la variable N como contador y laj'
constante 1 = 5 como incremento del contador.
=1
I Sí
J
/ • es el símbolo de multiplicación
Impresión de N
A = 2· N
Impresión de A
N=N+l
" •• _".•<~ ...:.,.,.... ".
99
100
TECNlCAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
101
El valor de N se incrementa de 1 en 1 (los valores sucesivos son 2, 3, 4, ...) Yla salida se produce cua.ndo N vale 6. Las sucesivas salidas de A y N son: N
A
1 2 3
2 4
6 8
4 5
10
Si por el contrario la condición es
Leer número N
Sí
sr
No
Acumulador
S
el bucle no se realizará nunca y se saldrá de la condición terminándose el diagrama, ya que en la primera pasada como N = 1 el = 5, resulta que N < 5 y por consiguiente la respuesta es «no».
No ~.¡;
Sí
4.4. ACUMULADORES Un acumulador o tGtalizador es un campo o zona de memoria cuya misión es almacenar cantidades variables resultantes de sumas sucesivas. Realiza la fun ción de un contador con la diferencia que el incremento o decremento de cada suma es variable en lugar de constante como en el caso del contador. Se representa por S = S + N donde N es una variable y no constante. El diagrama de flujo lee un conjunto de datos numéricos y obtiene la suma de todos aquellos números que sean positivos.
(
Fin~
102
METODOLOGIA 01= LA PROGRAMACION
TECNICAS DE PROGRAMACION
103
Ejemplos de aplicación Diagrama J. Diagrama de flujo que suma todos los números contenidos en un fichero (lista de datos).
Comienzo
Comienzo
ST = O
N=O
Lectura N,E, S,P
Lectura de D (Datos)
Sí
. Imprimir
total sueldos
sr
No
N=N+D
sr = sr + P
(
Fin)
4.5. BIFURCACIONES
Diagrama 2. Lectura de un fichero de datos de empleados de una empresa ' (nombre, edad, número seguridad social, sueldo), e impresión de los datos perso nales de cada empleado así como la suma total de sueldos que paga la empresa.
Las instrucciones de un programa se ejecutan, como ya sabemos, de un modo secuencial. Sin embargo, en numerosas ocasiones es preciso romper el orden secuencial de las instrucciones y bifurcar. saltar o transferir el control a otras instrucciones del programa que no sean consecutivas a las que en ese momento se ejecutan. Las instrucciones que siguen a la que se salta se volverán a ejecutar secuen
104
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
cialmente hasta la aparición de otra instrucción de bifurcación o el fin de progra· ma. Como se verá posteriormente en el caso de las subrutinas, en el caso de instrucciones de bifurcación es posible conservar la dirección de retorno al programa principal, tras ejecutar las instrucciones a donde se haya transferido el contro. Los saltos o transferencias de control pueden ser positivas (hacia delante) o negativas (hacia atrás), lo que puede implicar la no ejecución de instrucciones -saltos positivos- o repetición de instrucciones -saltos negati vos. Existen dos tipos de bifurcaciones:
- Condicionales: la bifurcación depende del cumplimiento de una determi nada condición; cuando se cumple la condición el control del programa bifurca a la instrucción especificada; si la instrucción es falsa el programa continua ejecutándose en la siguiente instrucción en el orden secuencial previsto.
106
a la instrucción siguiente a la que produjo la bifurcación; para ello se guardará la dirección de retorno en la memoria (en unas zonas o memo rias llamadas pilas) cuando se realiza el salto y al terminar las instruccio nes de transferencia se recupera dicha dirección de retorno para poder continuar en ella el flujo normal del programa.
_ Dirigidas: son aquellas en que para retornar el control es necesario generar una nueva bifurcación que dirija el flujo del programa a la siguiente instrucción en la secuencia ordinaria.
Condicional 1 I
t Sí
- Incondicionales: la bifurcación se realiza siempre que el programa pase por la instrucción sin el cumplimiento de ninguna condición. La expresión en ordinogramas de las instrucciones de bifurcación son:
Condicional
Incondicional
F2
Fl
¡
Si se verifica la condición realizar F2 Si-no se verifica realizar Fl
I==l
s
...-
B
~
Salto positivo
B. I
I
Salto negativo No
Acción an-l
+
B
Otra clasificación de las bifurcaciones es en función de la existencia de retor no o no a la instrucción siguiente a la que realiza el salto. Existen dos tipos de bifurcaciones:
- Controladas: son aquellas en las que una vez terminadas de ejecutarse las instrucciones siguientes a la bifurcación, el control del programa retornl'l
Bifurcación incondicional (salto)
--o
Fl
Si se verifica la condición realizar Fl Si-no se verifica saltar a la instrucción 1
106
METODOLOGIA DE LA PROGRAMACION
TECNICAS DE PROGRAMACION
107
4.5.1. Bifurcaciones anidadas Las bifurcaciones condicionales y no condicionales se pueden anidar (situar se unas en el interior de otras) como indica el siguiente diagrama de flujo:
No
Inicio
0-
F1
Bifurcación incondicional (salto) Lectura de datos fichero
I I I "1
~~
Si se verifica la condición
saltar a la instrucción 1
Si-no se verifica realizar F1
~
No
·1"',"'· I · 1
-[
"H2. 1
I .
Sí
f l
:,J
rfz--rt 8000
N3 = N3 + 1
Rn
Si expresión = R1 seguir camino 1 (saltar al)
Si se verifica la condición
realizar Fl
No
p = P+ 1
Si expresión = R2 seguir camino 2 (saltar a 2)
Si-no continuar secuencia
Nota: Las condiciones en las instrucciones de bifurcaciones pueden ser expresiones aritméticas,
lógicas o relacionales,
108
METODOLOGIA DE LA PROGRAMACION
TECNICAS DE PROGRAMACION
El diagrama de flujo que representa el interruptor es:
1
~
No
sr
109
Interruptor =O
sr
4.6. INTERRUPTORES O CONMUTADORES
=0
=1
Un interruptor o conmutador ("switch") -a veces se les llama centinelas, ] banderas, ''jlags''- es un campo de memoria (variable) que toman diversos valores a lo largo de la ejecución del programa y que permiten comunicar información de una parte a otra del mismo, es decir variar la secuencia de ejecución de un programa, dependiendo del valor que tenga en cada momento. Los dos únicos valores que puede tomar un interruptor son 1 y O (encendido y apagado, abierto y cerrado). . Los interruptores suelen intervenir en las bifurcaciones condicionales cuando-; el salto se debe demorar a un momento en que no se disponga la información'1\! original, en lugar de realizarlo inmediatamente que está presente la condición. A
Acción 1
Acción 2
La técnica del interruptor es:
)
a) Reserva de una posición de memoria para contener una constante que posteriormente se utilizará en operaciones de comparación. A esta constante (IN, CON, SW, etc.) se le puede dar el valor 1 (interruptor on, cerrado) o eq valor O (interruptor off, abierto), pero previamente se le ha asignado un determi~ i nado significado, por ejemplo IN = 1 puede significar que la ficha leída de un'" registro ocupa posición par y si IN = O significará que' la ficha leída es impar. Otro ejemplo de posibles significados podría ser: IN = 1, condiciones iniciales constantes; IN = O, condiciones iniciales variadas. El interruptor puede activarse (asignarle un valor) tras realizar una prueba y en función del resultado; así por ejemplo si se está examinando un fichero de estudiantes, y el interés reside en los estudiantes de Medicina, se puede asignar IN = 1 si estudia Medicina e IN = O en el resto de los casos. De este modo el proceso de los datos de estudiantes de Medicina se identificará rápidamente, preguntando si IN = l. En esencia un interruptor permite dirigir el flujo de los procesos con dos ramas paralelas, en un sentido o en otro dependiendo de la ocurrencia de una situación determinada (IN = 1) o de la contraria (IN =0).
En el caso del tratamiento de ficheros secuenciales en lenguaje BASIC, existe caso típico de interruptor: la función EOf. Esta función toma el valor O si el fichero no se ha terminado de leer -quedan registros o fichas- y el valor -1 cuando se ha leído todo el fichero -no quedan fichas o registros. Un
Variante del interruptor El uso del interruptor binario (dos estados) se puede ampliar a un interruptor múl\iple, en el caso de que el programa tuviese n ramas en paralelo. En este caso dependiendo del estado de un suceso determinado que pudiese tomar n estados distintos, se podría utilizar un interruptor múltiple.
110
METODOLOGIA DE LA PROGRAMACION
ella deben hacer cada parte tan independiente como sea posible de los demás. ¿Cómo puede un programa, que es una tarea sencilla, ser dividida en dos subproblemas independientes? Un medio de solucionar estos dos problemas es dividir el programa en partes que puedan ser desarrolladas por separado y eventualmente integrarse en una unidad. Tales partes independientes se llaman módulos o subprogramas. El tratamiento independiente de un módulo se puede hacer normalmente por dos motivos distintos: - los módulos se repiten varias veces dentro un mismo programa; - los módulos efectúan una tarea de gran importancia cada uno de ellos. Así un módulo se puede representar por:
t
Módulo
T
En la integración del programa completo o principal se podría representar gráficamente.
4.7. SUBRUTINAS O SUBPROGRAMAS Subprograma A
Subprograma B
Como se verá con más detenimiendo en el Capítulo 7 la programación estructurada consiste en descomponer sucesivamente un problema en módulos que se tratarán y programarán independientemente unos de otros. Consideremos las siguientes dos situaciones: l. En un cieIto programa. diferentes listas o tablas (arraY$) de números se desean clasificar por oden ascendentc y luego desccnclente--es decir. prime ra la lista A. luego la B y luego la C--. Conocemos un algoritmo de clasifica ción -por ejemplo el «bublesOl'[) (burbuja) o el «quicksort» (rápida) por lo que escribiremos en primer lugar el código (programa) para clasificar A, a continuación se repite el proceso, con los cambios adecuados, para clasifi car B y C. Esto está claro, pero reql'iere el uso de códigos casi iguales para las tres listas. Podríamos ahorrar esfuerzos si fuera posible escribir el código solamente una vez y a continuación aplicarlo a A. B YC (o a las listas que se desee). 2. El programador jefe o el analista de aplicaciones de un gran proyecto desea dividir el trabajo entre varios programadores. Para evitar confusiones, él o
Subprograma
Subprograma
A
B
Fl
Gl
F2
G2
I
ebcb
112
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
Un subprograma puede ejecutar las mismas acciones que un programa: (1) . aceptar datos, (2) ejecutar cálculos y (3) devolver o proporcionar resultados. Sin embargo un subprograma se utiliza por el programa para un fin específico. El subprograma recibe datos del programa y le devuelve resultados. Podemos ima ginar que el subprograma es el jefe de una empresa o de una unidad militar que da órdenes a un subordinado y cuando la tarea ha sido terminada éste le informa del resultado de la misma. Se dice que el programa llama o invoca (<
Llamada 1(call) Subprograma
Retorno
Figura 4.2.
Un subprograma puede también tener a su vez uno o varios subprogramas, que se suelen conocer como subprogramas anidados o bien de niveles jerár quicos. Subprograma A
Programa
Subprograma
l
' Figura 4.3.
Subprograma B
Un programa con subprogramas anidados.
El número posible de llamadas sucesivas entre subprogramas normalmente vendrá limitado por la memoria de la computadora. El subprograma, como se ha comentado, está constituido por un grupo de instrucciones que no forman parte del programa principal. Sin embargo, aunque cada subprograma es funcionalmente independiente (incluso ensamblado o compilado) no funciona nunca solo, debe siempre ser llamado por el programa principal y dejará de actuar cuando haya terminado su función y el control se retorne al programa principal. El subprograma puede ser compilado o ensamblado (en el caso de lenguajes intérpretes -BASIC-, también puede ser grabado con independencia y poste riormente con sentencias tipo CHAIN o MERGE, ser llamado para encadenarse o fusionarse con el programa principal) independientemente del programa prin cipal, lo que presenta la ventaja de poder ser utilizado con diferentes programas principales y la consiguiente facilidad en la depuración, puesta a punto y modifi caciones al tener longitud más pequeña -normalmente- que el programa prin cipal. Aunque los subprogramas son independientes del programa principal, evi dentemente se necesitará un medio de comunicación entre el programa principal y subprograma, y viceversa. Así en el caso de lenguajes como Pascal, True BASIC, Macintosh BASIC, Lago..., la llamada se realiza mediante la definición previa de dichos subprogramas (denominados procedimientos en estos lenguajes debido a que su funcionamiento es distinto de las subrutinas) y luego simples llamadas por su nombre; en el caso de lenguajes más formales, como FOR TRAN, COBOL o BASIC, las llamadas se realizan de un modo más explícito, mediante instrucciones. FORTRAN COBOL BASIC
Un programa con un subprograma.
113'
CALL
PERFORM (o CALL, USR o SYS si los subprogramas están en lenguaje máquina)
GOSUB
Aunque hasta este momento nos hemos referido a un solo tipo de programas -los que se conocen en la jerga informática por subrutinas-, en realidad existen dos tipos de subprogramas: -- Procedimientos o subrutinas --- Funciones
Las funciones y procedimientos han de ser definidos y su llamada se realizará por su nombre. mientras que las subrutinas serán llamadas mediante instruccio nes especificas. Las definiciones de túnciones especifican cálculos que producirán valores necesarios para evaluar expresiones. Las dejiniciones de procedimientos especifi can cálculos que ejecmarán acciones en lugar de producir valores. Las funciones y procedimientos (subrutinas) se denominan subprogramas ya que sus definiciones especifican cálculos subsidiarios a un programa, esto es, cálculos que producen la acción o valor requeridos. Para manipular programas
114
METODOLOGIA DE LA PROGRAMACION TECNICAS DE PROGRAMACION
adecuadamente, necesitamos comprender los siguientes aspectos de su funciona miento: • ¿Cómo se definen los subprogramas? Existen unas reglas de construcción o definición de los subprogramas de modo similar a las que existen para la construcción de programas. Cada lenguaje tiene sus propias reglas espe cíficas. • ¿Cuándo se ejecutan los subprogramas? La ejecución de un subprograma se invoca o llama durante la ejecución de un programa. Una función se referencia -no se llama explícitamente- si debe ser evaluada. Un proce dimiento o subrutina se invoca si la instrucción espec'ífica o el nombre que define el procedimiento se ejecutan. Por ejemplo, si en una expresión interviene la función y
=
sin(x)
y = Z * sin (X)
• ¿Cómo se proporciona la información a los subprogramas? En general, los subprogramas reciben información a través de parámetros formales (o variables falsas "dummy': tales como x, n... en Figura 4.4). Cada invoca
'nvocación a. de la función 1I(
I
11.56
x=3.4
n=2 b. Definición de la
función
' " "'
function potencia (x: real; n: integer): real; var z: real i: integer begin
y:
-
\
......- - - - - - - - - T i p o de valor Parámetros formales
= 1;
= 1 to abs(n) do Z: = Z • x;
for i:
if n < o then Z: = 1/Z
potencia: = Z
end: Figura 4.4.
ción de un subprograma proporciona información por medio de paráme tros actuales (o argumentos, tales como 3.4 y 2 en Figura 4.4. Los paráme tros actuales o efectivos especifican los valores actuales utilizados para parámetros formales en la definición de subprograma. La relación o corres pondencia entre parámetros formales y actuales constituye un mecanismo de paso a definir. • ¿Cómo proporcionan la información los subprogramas? La función propor ciona información en forma de un valor, -por lo que en alguna parte del programa debe existir una instrucción de asignación-, por ejemplo 11.56 en la Figura 4.4, que podrá ser utilizada en la evaluación de cual quier expresión. Una diferencia entre funciones y subrutinas, es que:
se está invocando el subprograma correspondiente.
y: = potencia (3.4,2)
115
(a) Invocación; (b) Definición de la función y = x
i
n en lenguaje Pascal.
- Las funciones devuelven un valor. - Las subrutinas pueden devolver diferentes valores. • ¿Cómo interactúan las variables en subprogramas independientes? Las variables se clasifican en locales y globales. Una variable local es una variable declarada dentro de un subprograma y distinta de las variables con el mismo nombre declaradas en otra parte del programa. Una variable es global cuando está definida a un nivel más amplio que las locales; normalmente se define en el programa principal. El significado de una variable se limita al procedimiento en que está declarada. Cuando otro subprograma utiliza el mismo nombre, se crea otra variable diferente, es decir, el nombre se refiere a una posición diferen te en memoria. Se dice' que las variables son locales al subprograma en que está declarada. La parte del programa en el que una variable tiene acción (identidad, definición y ejecución del programa) se conoce como ámbito. rango o campo de definición ("scope'J de esa variable. Si un subprograma asigna un valor a una de las variables locales, este . valor no es accesible a otros subprogramas -es decir, no pueden utilizar este valor-o Sin embargo, en ocasiones, es conveniente permitir que el identificador (nombre de la variable) tenga el mismo nombre en diferentes subprogramas ampliando su campo de definición. En este caso se utilizan variables globales cuyo ámbito es más amplio que un subprograma. En algunos lenguajes de programación (BASlC entre ellos), las varia bles declaradas en un subprograma pueden retener sus valores entre llama das sucesivas del subprograma. ,En Pascal no se transmiten los valores, pero es posible su transferencia mediante la correspondencia entre varia bles globales y locales; las variables definidas en un ámbito son accesibles en el mismo y por lo tanto son accesibles desde los procedimientos interio res. En la Figura 4.5 se muestra el campo de definición de las variables definidas en los procedimientos M a T.
11 6
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
[gJ
Variables definidas en los procedimientos
N
M N P Q R
1, G::I I S
Otra diferencia esencial entre procedimiento y subrutina, reside en el hecho que los procedimientos pueden llamarse a sí mismos por poseer los lenguajes dotados de ellos (Lago, Pascal, True BASIC, etc.) una propiedad denominada recursión o recursividad (esta propiedad en Pascal se extiende también a las fun ciones).
Son accesibles desde los
procedimientos
Ejemplo de aplicación
M, N, P, Q, R, S, T, U N, P, Q P, Q Q
T
R, S, T,U
T,U T,U
U
U
S
S,
Se dispone de una subrutina denominada CLASIFICACION que permite ordenar o clasificar una lista de números. Un programa principal trata con diversas listas numéricas que han de ser clasificadas cuando así se requiere en el flujo del programa. Un esquema gráfico del proceso podrían ser los diagramas a, b de la Figura 4.6.
Programa principal
R M
Figura 4.5.
Campo de definición de variables.
C4LL (CL
Ii ~SIFICi1f'
~l..Jarn~O .. Vii,,;,;;:::,ada 7 IV) ORA¡¡
O)
i~~1
Una subrutina o procedimiento (subrutinas cerradas o externas, se denomi':~ nan en ocasiones) es un módulo o subprograma independiente que ejecuta UI\ proceso específico v que es llamado en un momento dado. Las subrutinas pueden ser llamadas desde el programa principal tantas vece~ como sea preciso. devolviendo el control al programa principal cuando se termi~ na su ejecución. La subrutinas tienen la ventaja de ser totalmente independiente~~ del programa principal, se pueden almacenar en memoria en cualquier orde" y además no necesitan posiciones contiguas en esa memoria. Otra ventaja consi te en la no limitación de espacio de memoria. Sin embargo, no se puede asocia~j ningún valor con el nombre de la subrutina o procedimiento y por lo tanto n . puede aparecer en una expresión. Subrutinas típicas en los lenguajes de programación son las definidas o llama'" das del siguiente modo BAS/C
definición con SUBROUTINE llamada con CALL
llamada con GOSUB, ON-GOSUB
Subrutina
(lit:.,.,
4.7.1. Subrutinas/procedimientos
FORTRAN
117
Los procedimientos en lenguaje Pascal se definen mediante la palabra reservada "procedure". Un procedimiento se llama escribiendo su nombre, es decir. DEMO, para indicar que se llama a un procedimiento denominado DEMO. Cuando se invoca su nombre, los pasos que lo definen se ejecutan y a continua ción el control retorna al programa que llama.
Cjll.LL
,c\..p..S\'f\~!:9t~)
Salida
~aóa~
RETURN (RETORNO) (a)
PROGRAMA PRINCIPAL
1
Llamada 1 a subrutina CAlL (CLASIFICACIONl ~ Subrutina CLASIFICACION
[d'2,,"bMI"
1·
FIN Figura 4.6.
LJN
[RETORNO)
I (b)
Programa principal con subrutinás; (a) Bloques; (b) Secue~T.iP-.-
TECNICAS DE PROGRAMACION 118
119
METODOLOGIA DE LA PROGRAMACION
Las subrutinas pueden tener una entrada y una salida, que es lo usual; SI embargo, los subprogramas pueden tener diferentes puntos de entrada, cada un de ellos con una etiqueta o nombre, y el programa principal podrá transferir t control a los distintos puntos de entrada, debiendo incluirse en la instrucció de llamada el nombre o etiqueta del punto de entrada elegido. Programa principal
(a) f(x) =- x5
para evaluar f (x) es preciso dar a x un valor actual, con este valor se calcula el resultado; con x
l• • Entrada 1
=
3, se obtiene el valor _3_
5- 3
=
~= 2
1.5, que se expresa escri
biendo f (3) = 1.5
Subrutina
Llamada 1
(4.1) función con un argumento x
-x
Una función puede tener varios argumentos
• Entrada 2
(b) f(x,y)
= 3.x + 4.y
(4.2)
pero, sólo un valor se obtiene como resultado para cada conjunto de argumentos (x e y en el caso anterior).
Llamada 2
Salida
Figura 4.7.
Estas y cualesquiera otras funciones podrán ser definidas en cada lenguaje siguiendo una serie de pasos específicos.
Llamadas a subrutinas.
BAS/C DEF FN A(X) = Xj(5-X) DEF FN A(X,Y) = 3*X+4*Y
Nota: Un subprograma puede ser llamado desde cualquier parte del programa principal o de otrc subprogramas, mientras que un programa principal nunca puede ser llamado desde Uf subrutina, sólo es posible retornar a él a la terminación de la misma.
(4.1) (4.2)
Pascal 4.7.2. Funciones Las funciones o subprogramas abiertos son un módulo o parte del program que realiza un determinado cálculo que se utilizará en una expresión del módul que llama a la función. Se diferencia del procedimiento o subrutina en que] subrutina, cuando se le invoca o referencia entrega un resultado único, miente< que los procedimientos o subrutinas pueden entregar 1, 2, 3, ... n valores. U funciones suelen tener pocas instrucciones, no tienen secuencia de llamada y s ejecución es muy rápida. La mayoría de los lenguajes tienen un número de funciones intrínseca. estándar o "incorporadas". sin(x), cos(x), tan(x), sqr(x)
.-'d
Los argumentos (x) de la función pueden variar a lo largo del programa; ~ cálculo del valor de la función se realiza en cada momento sustituyendo ~ argumento por su valor en ese punto. Además de las funciones estándar es posible definir otras diferentes: en Pasc¡: con fuuctiou y en BASIC con DEF FN. En Matemáticas, una función es una regla que, cuando se le proporcion uno o más valores -llamados argumentos- produce un resultado -el val de la función para los argumentos dados-o Por ejemplo fun,ciones pueden ser:
function F (X: rea/): real; begin F: = Xj(5-X)
end
(4.1)
y function F(X: real; Y: real): real;
begin
F:=(3*X)j(4*Y)
end
4.8. ESTRUCTURAS BASICAS Para poder conseguir un programa estructurado que sea claro, simple, fiable y fácil de leer, será necesario utilizar estructuras de control que permitan a Cualquier programa o subrutina dividirse en segmentos independientes. El teorema de la estructura (también denominado Teorema de Jacopini. c_ ....
ce.. ..........
•
•
TECNICA5 DE PROGRAMACION 120
121
:1f
METODOLOGIA DE LA PROGRAMACION
Bohm, 1966) establece que un programa propio puede ser escrito utilizando solamente tres tipos de estructuras de control; estas tres estructuras básicas son: - Secuencial
- Selectiva
- Iterativa
Se suele utilizar a veces el término DO-ENO para definir el pseudocódigo de una estructura secuencial. DO (hacer) para significar el comienzo de la se cuencia y END (fin) que representa el fin de la parte secuencial. En Pascal se utiliza begin-end. HACER (o bien INICIO) acción 1
DO
Un programa se define como propio si cumple las siguientes característi cas: • Posee un solo punto de entrada y otro de salida para control del programa. • Existen caminos desde la entrada hasta la salida que se pueden seguir y que pasan por todas las partes del programa. • Todas las instrucciones son ejecutables y no existen lazos o bucles infinitos, (sin fin).
4.8.1. Estructura secuencial (DO-END, Inicio-fin) En la estructura secuencial, los pasos del proceso se ejecutan en secuencia, uno después de otro. Las acciones o procesos se representarán del modo si guiente:
acción 1 acción 2 acción 3
• •
• •
FIN
END
En ocasiones se suele utilizar DO SEQUENTIALLY (hacer o iniciar secuen cia) y END SEQUENCE (fin secuencia). INICIO SECUENCIA acción 1
DO SEOUENTIALLy acción 1 acción 2 acción 3
acción 2 acción 3
• •
• • FIN SECUENCIA
END SEOUENCE Diagrama de flujo
Pseudocódigo
• •
Proceso 1 Proceso 2 Proceso 1
acción 2 acción 3
o bien en español
• • •
Proceso 2
Los procesos o acciones pueden ser desde instrucciones sencillas hasta módu los completos. La sucesión de las acciones puede ser a1terada mediante un salto o bifurca ción, empleando la sentencia GOTO.
Como se ve en los pseudocódigos anteriores, es recomendable utilizar identa ción (sangría o margen interior de las acciones) dentro de las estructuras, ya que ello facilita la lectura del programa al mostrar de una forma gráfica las relaciones existentes entre las distintas instrucciones. La identación suele ser beneficiosa en la codificación de programas cualquiera que sea el lenguaje de trabajo.
4.8.2. Estructuras selectivas Una estructura es selectiva cuando sólo uno de los procesos alternativos (acciones o funciones) posibles se puede seleccionar tras el cumplimiento de alguna condición determinada. La elección entre varias alternativas exige una toma de decisiones, por ello a veces a las estructuras selectivas se las conoce como de alternativa simple, alternativa doble o de alternativa múltiple según el número de opciones o alternativas que se pueden tomar. Los puntos donde se deben tomar las decisiones se denomian PUídOS de decisión yen los diagramas de flujo se representan con el símbolo "rombo", de modo que uno de los vértices se ,conecta con el proceso anterior y el otro u otros Con el resto de los procesos o acciones. Las estructuras selectivas se clasifican en: - Condicionales o alternativa simple. - Alternativas o alternativa doble. - Selectivas o alternativa múltiple. ':'.ci"Ú~~•.•
122
TECNICAS DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
4.8.2. 1. Estructura condicional (IF- THEN/Si-entonces) Realiza la ejecución condicional de una acción; es decir la acción o proceso sólo se realiza si se cumple una determinada condición. El diagrama de flujo es el siguiente:
1 No
123
Los restantes formatos son equivalentes; basta sustituir la palabra IF por si, THEN por entonces y END IF por fin-si. ':;(.
Si la condición se cumple (resultado verdadero. si) se ejecuta la acción; en caso contrario (resultado falso. no) no se ejecuta la acción y se salta, continuando la secuencia. Nota: l. Las estructuras se han escrito con letras mayúsculas y minúsculas deliberadamente. La razón es que los libros y manuales de programación así como los editores de texto de las computadoras utilizados para escribir los programas, en la actualidad, permiten la escritura tanto en mayúsculas como en minúsculas. 2. En ocasiones las palabras END IF y fin_si se suelen abreviar en ENDIF y finsi. 3. La acción puede ser una o varias.
Sí
4.8.2.2. Estructura alternativa (IF- THEN-ELSE/Si-entonces-sino) La estructura condicional es muy limitada, y será necesario utilizar estructu ras que permitan la elección entre diferentes acciones o procesos. Si las opciones son dos, la estructura se denomina alternativa. El diagrama de bloques es:
Acción
1
Diagrama de flujo IF-THEN
sr~No
l---<~>------l
Al llegar el control al punto de decisión se ha de observar el estado del sistema. Si se satisface la condición (respuesta sI) se ejecuta la acción o proceso yen caso contrario (respuesta no) no se ejecuta. Los pseudocódigos y sus diversos formatos son: Inglés 1.
3.
5.
IF condición THEN acción END IF
2.
IF condición THEN acción
4,
LT
Si la condición es verdadera (si) se realiza la acción 1 y si es falsa (no) se realiza la acción 2. Los pseudocódigos son:
IF condición THEN acción
Si condición entonces acción fin-si
I
IF condición THEN acción
Inglés 1.
Español 1.
~
IF condición THEN acción END IF
2.. Si condición entonces acción fin_si
IF condición THEN acción 1 ELSE acción 2 END IF
~
124
METODOLOGIA DE LA PROGRAMACION
2.
TECNICA5 DE PROGRAMACION
IF condición THEN acción 1 ELSE acción 2 Inicio
3. IF condición
THEN acción 1
ELSE acción 2
END IF A
Español 1. Si condición
entonces acción 1
sino acción 2
fin_si
Sí
Condición 1
2.
si condición entonces acción 1 sino acción 2
3.
si condición entonces acción 1 sino acción 2 fin_si
La palabra THEN (entonces) señala la alternativa para procesar la acción si la condición es verdadera. La palabra ELSE (sino) señala la alternativa p procesar la acción 2 si la condición es falsa.
Cl No B
d
Sí F
1 o
Ejercicio de aplicación Un diagrama de flujo puede tener todo el grado de complejidad que se desee~¡ ya que puede contener varias estructuras lógicas. Un ejemplo de ello puede se" el diagrama de la página siguiente cuyo correspondiente pseudocódigo sed inicio acción A si C1 entonces acción B si C2 entonceS acción O sino acción e fin_si acción E
sino acción F
fin_si acción G
fin
C
--
q (
Fin)
I
E
I
125
126
METODOLOGIA DE LA PROGRAMACION TECNICAS DE PROGRAMACION
127
4.8.2.3. Estructura selectiva (CASE) La estructura selectiva permite asociar un conjunto de condiciones a Unj conjunto de acciones que se excluyen mutuamente. La estructura se conoce por! CASE (caso) y permite una desviación del flujo de control hacia múltiples procesos en función del resultado de la evaluación de una expresión o indicador.l Así, si el resultado toma el valor 1 se realiza la acción 1, si toma el valor 2 lá,l acción 2, si toma el valor n la acción n, y si no es ninguno de los valores 1 a n,~ se realizará la acción siguiente n+ l.
Los pseudocódigos son: Inglés CASE expresión OF
valor 1: acción 1
valor 2: acción 2
valor n: acción n END CASE
Valor 1
Valor n
Valor 2
Acción 2
Acción 1
Acción n
Español según expresión hacer
valor 1: acción 1
valor 2: acción 2
valor n: acción n fin_según
Variante del formato
Se 'puede considerar un caso nuevo en las alternativas, y en los restantes valores no seleccionados específicamente. En ese caso el pseudocódigo sería:
Acción n+1
~ Un ejemplo aclaratorio podría ser la tasa de descuentos de un concesionari de automóviles en función de la marca
Ford
según expresión hacer
valor 1: accIón 1
valor 2: acción 2
valor n: acción n
otro: acción n+ 1
fin_según
Renault
En el caso de que se seleccione otro valor .se ejecutará la acción n+ l. Opel
D
Seat
CASE basado en IF-THEN-ELSE 15%
10%
\
18%
En el caso de que la estructura CASE no tuviese una sentencia equivalente en su lenguaje de programación, se podría realizar su misión mediante estructu ras condicionales (IF-TREN) y estructuras alternativas (IF-THEN-ELSE).
128
METODOLOGIA DE LA PROGRAMACION
TECNICAS DE PROGRAMACION
CASE a base de IF- THEN-ELSE (si-entonces-sino) si valor 1 entonces acción 1 sino si valor 2
entonces acción 2
sino
si valor n
entonces acción n
sino acción n+ 1
fin_si
129
No
Acción
Sí
Sí
Acción
fin_si
fin_si
No
4.8.3. Estructuras iterativas
1.
Las estructuras iterativas permiten ejecutar una acción un número determi. nado ,de veces, es decir repetir esa acción una o más veces consecutivamente. Las estructuras iterativas se suelen llamar lazos o bucles; todas las instruccio· ~ nes incluidas en los bucles se repiten un número determinado de veces. Se'~ denomina iteración a cada una de las diferentes pasadas o ejecuciones de todas' las instrucciones contenidas en el bucle. ir! Existen dos variantes de estructuras iterativas: DOWHILE (mientras-hacer)! y DOUNTIL (Repetir-hasta que). la diferencia entre ambas es que la condición,~ se sitúe al principio de la secuencia de instrucciones (bucle DOWHILE) o que:!, la condición se sitúe la final (bucle DOUNTIL), como se ve en los diagramas..~ La d(ferencia entre DOWHILE y DOUNTIL es que en DOWHILE el bucle. continúa mientras que la condición es verdadera (la condición se comprueba :~) antes de ejecutar la acción, si es falsa la acción no se ejecuta) y el bucle se detiene;~, cuando la condición es falsa. En DOUNTIL el bucle continúa hasta que la~¡; condición se hace verdadera (la condición se comprueba después de ejecutar la:~ acción. o sea que la acción se ejecutará al menos una vez con independencia de' que sea la condición verdadera o falsa). Otra diferencia como ya se ha comentado es que la condición se comprueba al principio del bucle en DOWHILE y al final del bucle en DOUNTIL. Las estructuras DOWHILE y DOUNTIL se conocen también como estructu· ra REPEAT WHILE y REPEAT UNTIL (en el lenguaje Pascal estas estructuras son WHILE·DO y REPEAT-UNTIL, y las versiones de BASIC que soportan estas estructuras WHILE·WEND y REPEAT-UNTIL).
r
DOWHILE
Acción
No
Sí
DOUNTIL
Los pseudocódigos de las estructuras DOWHILE y DOUNTIL son los si guientes: DOWHILE Inglés DOWHILE condición acción 1 acción 2
ENDOO
Español mientras condición hacer acción 1 acción 2
fin-mientras
't'.~:,l<""
130
TECNICA5 DE PROGRAMACION
METODOLOGIA DE LA PROGRAMACION
El pseudocódigo significa "mientras que la condición sea verdadera hacer la/s acción/es, cuando sea falsa terminar el bucle". Puede ocurór que el bucle no se ejecute ni una vez en el caso de que la condición no se cumpla inicialmente. DOUNTll
Inglés DOUNTll condición
Español repetir
hasta-que
ENDDO
Español desde var = exp 1 hasta exp 2 [incremento exp 3]
hacer
acciones fin-desde Nota: Algunos autores prefieren traducir FOR por la palabra para en lugar de desde.
acción 1 acción 2
acción 1 acción 2
131
condición
Nota: Tanto en DOWHILE como en DOUNTIL se necesita que el bucle contenga al menos una instrucción que cambie la condición que controla el bucle. Si no la hubiera el bucle continua ría indefinidamente.
En realidad -como ya se ha comentado- la estructura FOR es un caso especial de DOWHILE-DOUNTIL en el que se conoce a priori el número de veces que se ejecutará el bucle; por ello se suele denominar estructura repetitiva en lugar de iterativa, para diferenciarla de las otras estructuras. Las estructuras WHILE y FOR pueden, en ciertos casos, no realizar ninguna iteración del bucle, mientras que UNTIL ejecutará el bucle al menos una vez.
4.8.4. Estructuras especiales. GOTO
4.8.3. 1. Otras estructuras iterativas Las estructuras DOWHILE y DOUNTIL repiten el bucle mientras o hasta que se cumpla una condición; ello significa que el bucle se repite un número no determinado de veces. En ocasiones, sin embargo, se conoce a póoó el número de iteraciones a realizar, yen esas ocasiones, aunque también se podría utilizar DOWHILE y DOUNTIL, es prefeóble utilizar otra estructura iterativa denominada DOFOR o REPEAT-FOR (FOR-NEX-STEP en el lenguaje BASIC y FOR-TO-DO/FOR-DOWN TO-DO en el lenguaje Pascal). Los formatos de los pseudocódigos son: Inglés fOR variable DO acción ENDfOR
*
\
= expresión
1 TO expresión 2 [STEP expresión 3]*
[STEP expresión 3] es opcional y es un incremento.
El significado del pseudocódigo es: repetir la acción desde un valor inicial de la vaóable de control dada por expresión 1 hasta alcanzar el valor final dado por expresión 2. Si no se indica nada en contra con STEP se supone que los incrementos son positivos de l en l (caso de enteros); caso de querer vaóar los incrementos será preciso indicarlo con STEP expresión 3, siendo el incremento positivo o negativo el valor de expresión 3.
En los apartados anteóores hemos visto cómo utilizar if-then-eIse y el bucle que genera para crear caminos alternativos en el cálculo. En ocasiones, es conve niente utilizar una estructura con una larga y controvertida historia, la sentencia o estructura goto. En uri programa sin bucles o estructuras if, las estructuras -el programa se ejecutan en secuencia y se dice que el flujo es normal. A veces, se rompe el flujo normal por la transferencia o bifiircación a otra instrucción que no está en secuencia, como es el caso de los bucles, o bien, transfióendo el control directa mente a alguna instrucción específica. Para expresar este caso se necesitan: (1) una estructura para ejecutar la transferencia de control y (2) un medio de referencia de esa estructura en el programa. Este segundo requisito se satisface permitiendo que las instrucciones sean numeradas o etiquetadas con palabras. El pómer requisito es la estructura GOTO (goto). GOTO
Es una estructura (enunciado simple lo denomina Wirth, el padre del Pascal) que indica que el proceso adicional debe continuarse en alguna otra parte del programa. El formato de la estructura GOTO (ir a) es
I
GOTO etiqueta
I I
GOTO número de línea
I
Se produce la transferencia a la instrucción cuya etiqueta o número de línea se da en el formato. A partir de ese punto se reanuda el flujo normal del control del proceso. .~..
..
132
METODOLOGIA DE LA PROGRAMACION
Los lenguajes BASIC y FORTRAN utilizan la estructura GOTO, Pascal también la posee pero su uso está muy restringido. El uso indiscriminado de GOTO en los programas es nocivo porque dificulta su legibilidad. Si existen muchas bifurcaciones con GOTO será necesario recurrir a numerosas etiquetas o números de línea y ello puede producir errores, por duplicado, ausencia de etiquetas, etc. ¿Cuándo es útil GOTO? Junto con la estructura IF se puede utilizar para construir bucles. Por ejem plo, el bucle:
TECNICAS DE PROGRAMACION
133
IF condición
THEN GOTa 1;
1: end puede ser sustituida, eliminado GOTO por
IF NOT condición
THEN
DOWHILE condición
acción 1
acción 2
ENOOO puede ser sustituido por:
1: IF NOT condición THEN GOTa 2;
acciones IF NOT condición
THEN
acción
GOTa 1;
2:
.,. siguientes instrucciones
sin embargo la composición anterior no parece clara. La estructura GOTO se puede utilizar para transferir el control a un bucle, o desde dentro de un bucle al exterior, pero no puede transferirse desde fuera al interior de un bucle. ; De hecho, los buenos programadores necesitarán utilizar la estructura GOTO ' muy raramente. Algunos incluso llegan a decir que no se debe utilizar nunca" (Dijkstra entre ellos), sin embargo esta idea nos parece excesiva. Una estructura..ii GOTO debe reservarse para situaciones no usuales o comunes en que la estructu~\! ra natural de un algoritmo debe quebrarse. Una buena regla es evitar los saltos~ para expresar iteraciones regulares o la ejecución condicional de instrucciones. i~ La presencia de GOTO en lenguajes como BASIC aunque es necesaria se debe 1 tratar de sustituir por otras estructuras equivalentes, alternativas o iterativas. En 1: Pascal, Wirth (su autor) dice que la presencia de GOTOs en un programa Pascal·
suele ser indicación de que el programador no ha aprendido aún "a pensar" en Pascal. Imaginemos una estructura como:
IF condiCIón
THEN GOTa 1;
acciones
Sin embargo, con GOTO la aplicación era más directa. Una buena aplicación de GOTO suele ser en recuperación de errores, para indicar códigos de errores, síntomas o desviaciones de flujo cuando se comete un error en el proceso.
4.8.5. Síntesis de estructuras de control En la Figura 4.8. se esquematizan las diferentes estructuras de control básicas.
134
METODOLOGIA DE LA PROGRAMACION
TECNICAS DE PROGRAMACION
135
EJERCICIOS PROPUESTOS ~
~
~~
a"''"
2"l:
w
..J
::;¡
'"
~u w
t;(.J
"l
w
...
"tl
~
Z
W
C1l
i.@:
C1l
~
W
~~
Z
2 tíQ)
y
a"ZW
o
U
2w ti:J:
wl
~
!!::
O
.g'~'"
~ O-~iiiEQl ~~~ 0«0
c: 'ti
-O C1l
E
~
el
ea. c:
Ql
C1l U
'¡¡; 'C1l
.o
Vi ro
g
~~~
ou
~z
e ,~ ...
::lw
ü:J: 21 ti u. UJ
SE
'0
~
",'"
e
S¡:: ... z
utn ::;¡ O
Wo
en
~
au S en ~
(/J
Ql 2!
g~
~O
Q)
"tl
Ql
o ... "
c:
~
ale..
5: ~ ~
w
~ !:!:!.
z
o
Z
...
e
"'w ::> "':J: ~
O
" lii
2~
S2& "::;¡ Ql
tiO
:5
w
:::c 1-;" ~
ale..
UJO
~
~
ee o
~~
u
!f:
l. Desarrollar un algoritmo y el diagrama de flujo que permita determinar la cantidad total a pagar por una llamada telefónica, teniendo en cuenta lo si guiente: a) Toda la llamada que dure menos de tres minutos tiene un coste de 10 pe_
setas.
b) Cada minuto adicional a partir de los tres primeros es un paso de conta
dor y cuesta 5 pesetas. 2. Escribir un organigrama y su algoritmo correspondiente que calcule la suma de los 50 primeros números enteros. 3. Escribir un algoritmo que calcule el producto de los n primeros números en teros. Nota: el producto de los n primeros números enteros es el factorial de n. 4. Escribir un algoritmo que imprima una tabla de conversión de kilómetros a millas. 5. Diseñar un algoritmo para resolver una ecuación de segundo orden. 6. Escribir un algoritmo que acepte tres números enteros e imprima el mayor de ellos. 7. Escribir un algoritm%rganigrama que vaya leyendo los datos de entrada de un fichero que sólo contiene números y suma los números positivos. 8. Escribir el organigrama y el algoritmo que sume los números del 1 al 100, no terminados en 5. 9. Desarrollar un algoritmo que determine en un conjunto de 100 números na turales: - Cuántos son menores de 15 - Cuántos son mayores de 50 - Cuántos están comprendidos entre 45 y 55 10. Determinar un algoritmo para leer una lista con nacionalidades de diferentes personas y que imprima el total de españoles y portugueses.
Ql
"tl C1l
Vi
zw I
ro
J:
UN
C.
i!:i
~ 1~
¿
1-1
~~
---.. I---------J
~
2
tí
'c:; e
w
Jl"
.¡
Ql::l
(1)
I!!
::1
DI
ir
"",-,,,,,,,,,':::;~~.,...
· ';~;"y' *'Y':~ih~,e~~c~)\'
\
CAPITULO 5
ESTRUCTURA DE DATOS
5.1. INTRODUCCION El programador para llegar a expresar la solución de un problema debe expresarlo en forma de un algoritmo que luego le permita una fácil codificación. , En esta consideración la Informática se basa en el estudio de algoritmos -se cuencia paso a paso de las diferentes operaciones que se deben realizar para obtener un determinado resultado-; sin embargo, un algoritmo manipula datos y para que se pueda aplicar correctamente necesita que esos datos estén relacio nados (estructurados) de alguna forma particular. Esta nueva idea nos lleva a otra concepción de la Informática, el estudio de los datos, su estructura y su manipulación o abreviadamente el concepto de estructura de datos o estructura
de la información. Estructura es la relación que existe entre los distintos elementos de un grupo. En Informática, la relación que existe entre elementos de datos es una estructura de datos. Uno de los problemas más serios con los que se enfrentará el programador es, precisamente, la estructuración y almacenamiento de la información. El programador deberá analizar con mucho cuidado la estructuración, almacena miento y recuperación de los datos, comparándolos con la eficacia del algoritmo elegido para su manipulación. En caso contrario la solución dada para la resolu ción del problema puede resultar muy costosa en espacio de memoria o en tiempo de trabajo de máquina. En este capítulo se estudiarán las diferentes formas (estructuras) que los datos pueden tomar y las aplicaciones en que se utilizan las diferentes estructuras. Estas estructuras de datos se almacenarán en la memoria principal o interna o en los soportes externos de almacenamiento de información, la memoria secundaria o externa -casetes, cintas, discos, etc. 137
,
138
...
'ESTRUCTURA DE DATOS
METODOLoGlA DE LA PROGRAMACION
5.2.
lOS DATOS
¿Qué deseamos conocer?
¿Dónde se puede encontrar la información?
c) ¿Cómo obtenerla?
a) b)
Los datos o inform'lción que manipula una computadora serán diferentes según la aplicación en que se utilicen, y una de las características diferenciales de los lenguajes de programación es el tratamiento de los datos. Así cuando un científico interesado en números reales y complejos y en matrices trabaja en programación utilizará FORTRAN. En contraste, los datos o información utili zados en la gestión comercial están normalmente reunidos en ficheros, y por ello se emplea COBOL que proporciona grandes facilidades para la descripción del contenido y estructura de ficheros. La mayoría de los lenguajes están diseña dos para manipular ciertos tipos de datos más adecuadamente. La Tabla 5.1 muestra las notaciones más utilizadas por el usuario y las características de los datos manipulados. Tabla 5.1.
139
Características de lenguajes de programación
Lenguaje
Notación normal del usuario
Características de los datos
Ada
Programas.
Los usuarios pueden. diseñar sus propias estructuras de datos. Numéricos. Matrices. Caracteres y números.
ALGOL APL BASIC
Diagrama de flujo, pseudocódigo. Símbolos matemáticos ampliados. Diagramas de flujo y expresiones matemáticas elementales. Inglés. COBOL FORTRAN Fórmulas matemáticas. L1SP Lógica, PASCAL
Diagramas de flujo, pseudocódigo.
PL/1 RPG SIMULA SNOBOL
Variadas. Inglés restringido. Descripción de sistemas. Patrones de palabras.
Ficheros jerárquicos. Numéricos. Conectados intrincadamente (lis tas). Los usuarios pueden disel\ar sus propias estructuras. Numérica y comercial. Informes. Dependiente del tiempo. Cadenas de caracteres.
La información tratada por el ser humano puede proceder de su memoria -como es el caso del alfabeto, la dirección de su casa o despacho, o el método para utilizar el teléfono-, o bien de la búsqueda de la información que necesi tamos. En los casos de la búsqueda de información, ésta puede resultar prolija; así, por ejemplo, si deseamos ir al teatro y no sabemos el número de teléfono para llamar y reservar localidades, ni conocemos el horario de autobuses, para el caso de decidir ir, será preciso buscar información en algún centro de información, como puede ser una guía de teléfonos. Sin embargo, esta ausencia de informa ción nos fuerza a pensar detenidamente cómo conseguirla. No podemos solucio nar nuestro problema a menos que podamos decidir. Shave en 1975 enunció los principios de la decisión:
En nuestra situación actual (ir al teatro),
a) deseamos conocer el número de teléfono;
éste se encuentra en el listín o guía telefónica (conocimiento de la me
moria);
c) en la guía, los nombres de los abonados están listados en orden
alfabético y de este modo obtenemos el número deseado consultando
el nombre del teatro en esta lista (en este caso, el método de acceso
-alfabético- a la información se debe conocer).
b)
Este ejemplo muestra que la información (el significado relacionado con los tos) puede implicar no sólo un conjunto de valores de datos, sino también na disposición estructura que relaciona los valores de algún modo.
Manipulación de los datos La clasificación alfabética por nombres de abonados de la guía telefónica es na referencia fácil, pero no la única. Existe otra clasificación -también alfabé .ca- de nombres de calles o distritos, y dentro de cada calle o distrito, listados abéticos de los suscriptores. Esta última guía o directorio se llama de dos [veles. debido a que necesitamos aplicar nuestro proceso de búsqueda dos veces: "a vez para encontrar la calle o distrito y a continuación nuevamente para lcontrar el abonado. Existe un tercer formato multinivel utilizado en las pági "amarillas. En esta guía, las entradas se listan alfabéticamente por actividades merciales o profesionales y a continuación alfabéticamente por abonado den de cada clase. Incluso se podría considerar un tercer nivel, con un índice .bético, que guíe hacia la clasificación correcta.
Nombre y apellidos García Andrade, L. García Antoranz, J. L. García Botín, M. García Bosano, N. García Candil, J. García Casto, P. García Castro, J. García Edil, A. J. García Fernández. R. García Fortuna, O. García García, B.
Número de teléfono
6451236 7214632 6451321 6451216 6454027 6453092 6462830 6461460 6452180 6451721 6470406
140
°rr'~r,;:
METODOlOGIA DE LA PROGRAMACION
ESTRUCTURA DE DATOS Número de teléfono
Calle o Plaza La Cruz
141
ev '"
-o
~ó
García Martinez, A. Martínez Gil, R. Martínez Hidalgo. J. R. Navarrete Gil, B. 1. Peláez García. J. lo Romero García, N. Romero Gil, C.
7154320 7151416 7170406 8215014 7150040 7151013 7174021
ev~
~~
oíñ
-0 10 (50)
::J~
EN
o"
a:
oíñ eN evO)
r---.o '7 EIO
::J~
:I:~
Ol
6'
L..---§
OlN ... 0)
Automóviles
'" O'
'C:
O U O)
-o~
e ' U'JIO
0l0)
SEAT
:::.
Abengo. S. A. HISPANIDAD. S. lo JUMAR. S. A. ROMERO. S. lo
7214086 6391416 7145164 8212140
6'
Ol~
a¡
O)
'0 '7 EO
t:J~
Olíñ LO
E r--E~ ev '
oc: r--..
Figura 5.1 .
OlIO ~~
Estructuras de datos típicas.
Por consiguiente, se puede ver que la estructura alfabética de las guías telefó nicas no es esencial, sino que ha sido impuesta en aras de la comodidad del usuario medio. Existen casos en que el diseño de los datos tiene una estructura básicamente de árbol con un número d~ bifurcaciones, cada una de las cuales tiene a su vez una estructura en árbol. Imaginemos el caso de un árbol genealógico (Figura 5.2). La clasificación alfabética de la guía telefónica permite que las entradas sean listadas en una secuencia lógica. Las entradas en un árbol no pueden ser listadas en secuencia adecuadamente -al menos sin destruir la estructura del árbol-o En este caso, un diagrama o dibujo es un mejor medio de presentación de datos. Un diagrama es también útil para los datos que tienen estructura rectangular o «tabular». Un ejemplo típico de una estructura tabular es el caso de los cuadros horarios de trenes. La siguiente tabla es de dos dimensiones y permite una fácil lectura de arriba-abajo y de izquierda a derecha, con incrementos de tiempo desde el punto de vista inicial.
,~
al
r;
"'LO Ol~ ~
:::.
+"6 .... 10
evO) ::J~
íñ
lO evO)
o.~
r---:a¡ .;,
0"' O
U-O)
'C:
o
'EOl
O)
e"
,
o~
jiC")
W
6'
e
LO
.-::J
o
",o) ~
...JLO' lO
I
-o,
~g
5e
:::.
o' ev LO ...JN
íñ
:::.
~O)
O)
-"
0l0) L-.o~
'c 6
«O)
N '"::JC") <--._ ",
:::.
O)
...J
Ol 00,
'"
a:C")
O)
:::.
e
-o, evo
D..N
O) ~
Figura 5.2.
Estructura en árbol.
142
METODOLOGIA DE LA PROGRAMACION
Madrid Las Rozas Las Matas Galapagar Torrelodones Collado-VillaIba Guadarrama Los Molinos Cercedilla San Rafael Otero de Herreros Madrona Segovia
ESTRUCTURA DE DATOS
a.m.
a.m.
a.m.
p.m.
p.m.
7.30 7.45 7.58 8.15 8.30 8.35 8.40 9.50 8.58 9.05 9.15 9.20 9.28
8.30 8.45 8.58 9.17 9.28 9.34 9.41 9.50 9.58 10.04 10.12 10.15 10.20
11.00 11.15 11.28 12.45 12.55 13.00 13.10 13.20 13.28 13.32 13.42 13.45 13.55
15.00 15.15 15.25 15.40 15.50
19.00
15.58
19.50
Figura 5.3.
-
16.10
-
16.30
143
b) los números por debajo de la diagonal son iguales que sus simétricos del otro lado de la diagonal central (ya que la distancia desde M a N es la misma que de N a M).
-
-
Los dos formatos de las tablas anteriores (una o dos entradas) es, evidente mente, preferible a una alternativa lineal (listado en una sola secuencia):
19.30 19.40
-
Albacete-Alicante Albacete-Almería Albacete-Avila
20.03
: 166 : 361 : 357
20.20
En cada uno de estos ejemplos, la disposición de los datos es tan significativa como sus valores.
Tabla de dos dimensiones.
Estructura de datos
Los cuadros o diagramas de distancias típicos de agendas, mapas, guías de carretera, etc., se pueden utilizar con tablas de dos entradas.
Una estructura de datos es una colección de elementos o items de datos. El medio en el que se relacionan unos elementos con otros determina el tipo de estructura de datos. El valor de la estructura se determina por:
DISTANCIAS KILOlllETRlCAS ENTRE CAPITALFS DE PROVINCIA
a)
b)
Los valores de los elementos.
La disposición de los elementos.
¡{;'
Figura 5.4.
Tabla de dos entradas.
En el cuadro anterior se muestra que a) los números de la diagonal son todos cero (dado que la distancia de un
lugar a sí mismo es cero);
1/,: En el caso de la guía telefónica, cada elemento de datos comprende un '1 1:' nombre, dirección y un número de teléfono (tal elemento se suele denominar J.;: registro o átomo). Las estructuras de datos telefónicos son del mismo tipo, y se "ti denominan ficheros secuenciales. Un elemento o item de datos o simplemente un dato es una cantidad que ,trema un único elemento que puede cambiar de cuando en cuando (se denomina '~':. variable o identificador). Los algoritmos de resolución de problemas deben in Cluir reglas de acceso a la estructura de datos. En el caso de la guía de teléfonos tal regla puede ser una descripción al principio de la guía, del método para buscar número; en el caso del cuadro horario de trenes una explicación de cómo utilizar el cuadro; en general cómo buscar un valor en una tabla matemática, estadística, etc. Normalmente la selección de una estructura de datos se hará en función de su cometido; tras la selección, se elegirá la mejor disposición de los datos y a continuación se colocan los valores en los datos. En consecuencia, los valores de los datos pueden ser cambiados con relativa frecuencia, la disposición de ellos se cambia con menos frecuencia y la estructura de los datos se cambia raramente. Este es, de hecho, el caso, por ejemplo, en una guía de teléfono donde ~:las entradas cambian anualmente (cambios de direcciones de los abonados, altas, .'-' bajas, etc.), sin embargo, la disposición alfabética no se suele variar. No obstante, el ejemplo anterior no siempre es significativo pues, en ocasio nes, un cambio en los valores de los datos produce un cambio en la disposición
'44
de los mismos. Consideremos la tabla de clasificación de la Liga de fúbol españo la de primera división. Los resultados de los partidos semanales influirán en la clasificación modificando no sólo el valor de los datos (puntuación), sino el orden de los equipos. Otro caso significativo, aunque no frecuente~ se produce cuando se modifica
el tipo de estructura de datos, permaneciendo constantes los valores de los datos;
este es el caso de la guía telefónica por direcciones. La elección del método adecuado para expresar los datos del problema es esencial para conseguir una buena solución. Si se hace una elección incorrecta el algoritmo resultante puede ser muchas veces complicado y por consiguiente dificil de codificar. Por el contrario, una buen<;l elección de estructura de datos puede llevar a un algoritmo que sea más claro, más sencillo y más rápido. Una vez que se elige una buena estructura de datos debemos intentar utilizar un lenguage de programación en el que esta estructura de datos pueda ser fácilmente descrita y con rápidez y cómodo acceso.
5.3.
ESTRUCTURA DE DATOS
METODOLOGIA DE 'LA PROGRAMACION
o 2 3
CLASIFICACION DE LAS ESTRUCTURAS DE DATOS
Las estructuras de datos más usuales son: cadenas, matrices, listas, tablas,
árboles, pilas, colas y ficheros. El estudio de las estructuras conduce a los algorit
mos de manipulación de los datos. Supongamos que se desea escribir un progra
ma en FORTRAN para almacenar los días de un mes y sus temperaturas medias;
como la única estructura de datos es la matriz -un tipo determinado de lista
habrá que realizar los algoritmos adecuados de manipulación; por ello cuando se desee añadir nuevos nombres a la lista habrá que diseñar un algoritmo de inserción y cuando se desee buscar un nombre dado se deberá diseñar un algorit
mo de búsqueda. Las estructuras de datos se pueden definir como una forma práctica de organizar hileras, listas, árboles, etc., en la memoria interna o central de las computadoras. Una de las primeras estructuras utilizadas y conocidas por los programadores son las matriciales conocidas por arrays o matrices (vectores -arrays unidimen . sionales-, tablas o variables con subíndices -arrays multidimensionales-). Las matrices se almacenan en un bloque de posiciones de memoria consecuti vas. Cada elemento de una matriz se puede recuperar o identificar por su direc ción (valor numérico único).
Cada posición de una computadora se asocia con un número fijo o dirección.
Así pues, la computadora ve la memoria como un bloque de posiciones consecu tivas que se identifican por una dirección o valor numérico. Si nos imaginamos una relación de apellidos de personas, podría asociar cada posición de memoria a un apellido. El orden o disposición de los apellidos formaría una estructura de datos. En realidad la memoria no está organizada así, porque normalmente una posición de memoria equivale a una palabra de 8 ó 16 bits, y su equivalente es un carácter del alfabeto -en el caso de 8 bits-; sin embargo, a efectos didácticos preferimos
65533 65534 65535 Dirección (valor numérico único).
o
GARCIA GOMEZ
2
LOPEZ
3
MARTINEZ
Contenido de cada posición de memoria.
145
;.~~~j,""
146
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACION
dejar el ejemplo tal como se ha enunciado, por no ser relevante en este momento el contenido real de cada posición, sino su contenido relativo. Una disposición como la relación de apellidos constituyen también una estructura de datos conoCida por lista. Todos sus elementos están en posiciones consecutivas de memoria. Para definir una lista será preciso conocer el punto inicial y el final, es decir, la longitud. Otro tipo de estructuras de datos son los ficheros -conjuntos de registros que se almacenan en la memoria externa de una computadora- y los árboles -representación de elementos en forma jerárquica.
5.3.1.
Una de las estructuras más simples consiste en una secuencia de elementos del mismo tipo, relacionados unos con otros por el orden de que están definidos. Los matemáticos y científicos en general utilizan un índice o subíndice para representar la notación de tales estructuras. Así, una notación típica es .~
x" x2 '
...•
x lO
y representa 10 elementos. La x es el nombre general por el que se conoce un elemento, mientras que el subíndice, 1, 2, ''', es la posición en la secuencia. En programación una secuencia de este tipo se denomina matriz o «array». Una matriz es una colección ordenada de objetos o elementos. La mayoría de los lenguajes de programación requieren que todos los elementos sean del mismo tipo (enteros, reales o caracteres). Las matrices se clasifican en vectores (matrices unidimensionales) y tablas o matrices propiamente dichas (matrices multidimensionales).
5.3.1.1.
En lenguajes de programación, el índice se escribe normalmente después del nombre del vector y enmarcado entre paréntesis (BASIC o FORTRAN) o cor chetes (en PASCAL o ALGOL). Los elementos XI y x2 anteriores se representan por: x( 1). x(2)
o bien
Vectores
Un vector es un conjunto ordenado de elementos que contiene un número fijo de ellos. Los vectores son matrices unidimensionales. sus elementos deben ser del mismo tipo (enteros, reales, caracteres). Un vector es (2,3,4,8,9,10,15,17)
y representa una lista de elementos. La longitud de un vector es el número total de elementos. Cada elemento de un vector se representa por el nombre del vector y un índice o subíndice. En el ejemplo anterior si x es el nombre del vector, los elementos son:
PASCAL
Un ejemplo típico de un vector son las temperaturas diarias del mes de febrero de una ciudad. 17) (x 2J
Los elementos del vector podrían ser caracteres Un ejemplo de una aplicación de un vector, es el diagrama de flujo de la Figura 5.5 que calcula la media (media aritmética) de estaturas de los alumnos de una clase, cuántos son más altos que la media cuántos más bajos. n es el número de estudiantes de la clase a[ 1] a [2] .oo a[n] son sus estaturas.
5.3.1.2.
Matrices
Una matriz con un solo índice se denomina unidimensional. Una matriz con dos o más índices se llama multidimensional. El número de índices necesario para especificar un elemento de una matriz se denomina dimensión. Las matrices más útiles son las de dos dimensiones, que se asemeja a una tabla o conjunto de filas (primer índice) y columnas (segundo índice) como se ve en la Figura 5.6. Los elementos de una matriz de dos dimensiones se representan por dos expresiones separadas por una coma y encerradas entre corchetes o paréntesis. A(I,J) en BASIC
A[I,J] en Pascal
Se refieren al elemento de la fila 1 y la columna J. En lenguajes de programación las matrices se suelen denominar tablas. En ". Matemáticas se suele representar con las notaciones
[a" a" a,,] a 21 a 22 a 23 a 31 a 32 a 33
x2 =3
x3 =4
x4 =8
X
s=9
x6 = 10 x7 = 15 xB = 17
Dn
o bien
4
2
x, = 2
x[1], x[2]
BASIC, FORTRAN
(20 25 26 ... o bien
(x,) (x) (xJ ...
Matrices (arrays)
147
O
o bien
(a" a" a" )
a 21 a 22 a 23
a 31 a 32 a 33
e4 5) 123
4 O 7
148
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACION Columna 1
Columna 2
149
Columna 3
Fila 1
A[2.3J
Fila 2
Fila 3
A[3,1]
SI 1:. n1
Figura 5.6.
Una tabla o matriz de dimensiones se puede considerar un vector de vectores. Es por consiguiente un conjunto de elementos, todos del mismo tipo, en los que el orden de los elementos es significativo, yen el que se necesitan dos subíndices para definir un elemento. Las matrices pueden tener más de dos dimensiones y se denomina multidi mensional. Por ejemplo, un sistema de reservas de plazas en una línea aérea, se podría representar por una matriz de tres dimensiones:
SI i:=a?
SI
------«
Matriz de dos dimensiones.
a [i,j,k] apl < media'.>>-_N_O
---,
donde,
SI
i = 1,2, j = 1,2, k = 1,2,
No
, 5 , 60 , 12
representa el número de vuelo. representa la fila del avión. representa el asiento en la fila.
así, asiento [i,j,k] = O asiento [i,j,k] = 1
asiento libre. asiento ocupado.
Almacenamiento de matrices
Figura 5.5.
Diagrama de flujo para cálculo de la media de varios números.
Las matrices se almacenan en memoria de modo secuencial. Una matriz (i,j) equivale a un vector de i x j elementos. La Figura 5-7 compara el almacenamien to de la matriz m(3,2) con el almacenamiento de un vector de sus elementos y muestra los dos posibles métodos de almacenar las matrices en memoria: por filas o por columnas.
, &0
METODOLOGIA DE LA PROGRAMACION ESTRUCTURA DE DATOS
A 1,1
A 1,2
A 2,1
A 2,2
A 3,1
A 3,2
A 1,1
A 1,1
A 1,2
A 2,1
A 2,1
A 3,1
la)
Figura 5.7.
A 2,2
A 1,2
A 3,1
A 2,2
A 3,2
A 3,2
lb)
le)
151
Para hacer referencia a una lista se debe conocer dónde comienza, dónde
termina o su longitud. El tratamiento o manipulación de listas exige poder:
- Acceder al primer elemento (cabeza de la lista).
- Acceder a otros elementos.
- Suprimir o añadir elementos.
La realización de las operaciones anteriores presenta diferentes dificultades.
Por ejemplo, añadir un elemento a una lista de compras o un listado de clientes
es fácil, ya que sólo es necesario poner los elementos al final. Sin embargo si el
listado de clientes ha de ser en orden alfabético, sería preciso intercalar el elemen
to en su lugar correspondiente. La eliminación presenta los mismos problemas.
Las listas, se almacenan en la memoria de una computadora.
Las listas se pueden clasificar en diferentes grupos: -
Lineales.
Encadenadas.
Circulares.
Doblemente encadenadas.
(a) Matriz A 3,2; (b) Matriz por filas; (e) Matriz por columnas.
Listas lineales FORTRAN almacena las matrices por columnas. Pascal, PL/I, BASIC y COBOL almacenan las matrices por filas. El compilador o intérprete correspondiente se encarga de almacenar en me moria adecuadamente las matrices en función de los subíndices y dimensiones de las mismas. El compilador de un lenguaje de alto nivel genera instrucciones que se encar gan de calcular la posición de cada variable subindicada y debe conocer si la matriz está almacenada por columnas o por filas, así como los subíndices y las dimensiones máximas de la matriz. Por ejemplo, si la matriz está almacenada por columnas, el elemento A [3,1] está en la tercera posición, A[ 1,2] en la cuarta y así sucesivamente. Las matrices o tablas pueden ser de dos, tres o cuatro dimensiones.
5.4.
LISTAS
Una lista es un conjunto o serie de elementos (objetos del mismo tipo, denominados también átomos) en la que cada uno de ellos está relacionado implícita o explícitamente con el anterior y/o con el siguiente. Las listas deben estar almacenadas en un soporte direccionable (memoria central o periférico de acceso seleccionable, cintas o discos). Para designar un elemento se utiliza un puntero.
Una lista lineal es aquella que tiene un primero y un último elemento,
existiendo una relación estructural entre sus diferentes elementos; normalmente
cada elemento está relacionado con el anterior y el siguiente, excepto el primero
¡r~sólo con el segundo- y el último -sólo con el anterior-o Las listas lineales ~Jse llaman también densas debido a que los elementos de la lista se encuentran en posiciones de almacenamiento (memoria) físicamente contiguas. Ni En general se suelen expresar también las listas como un conjunto lógico de ~átomos; un átomo es un conjunto de elementos relacionados llamados campos, ¡isiendo el campo la unidad básica de información. Un campo se puede dividir ;en subcampos. Si se trabaja con ficheros, el término registro es sinónimo de
¡~dtomo (el concepto átomo procede de los orígenes del lenguaje LlSP en los
\.años 60).
Los elementos de una lista pueden ser de cualquier tipo y se caracterizan
or la posición que ocupan.
Las operaciones fundamentales que se pueden realizar con los elementos de
una lista son:
-
Calcular la longitud de una lista -número de elementos de la misma.
Consulta secuencial de cada uno de los elementos.
Acceso a un elemento n, examen y/o lTiodificar su contenido.
Inserción de un nuevo elemento en la posición n de la lista.
Almacenar un elemento en la posición n de la lista.
Suprimir un elemento de la lista.
~
152
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACION
- Reorganización de la lista: jitsión de dos o más listas en una sola; división de una lista en varias. - Clasificación de los elementos según determinados criterios. Inserción de un elemento La operación de inserción conserva todos los elementos de la lista, desplazan do aquéllos cuyo número de orden es superior al que tratamos de insertar.
l·"
I "
elemento 1
'o
¡ 'o,,]
elemento n
elemento n+ 1
1···········1
elemento 2
5.4. 1. 1.
Colas
Una cola es una subclase de lista lineal en la que se permiten las eliminaciones en el comienzo de la lista (el extremo llamado ji-ente, «fron!») y las inserciones, se realizan al final de la lista (extremo opueto, «reaD)). Los elementos de este tipo de lista se procesan en el mismo orden en que se reciben: el primero en entrar es el primero en salir (FlFO-first-out). La Figura 5.8 representa una estructura tipo cola en la cual las inserciones se realizan al final y los elementos se eliminan en el frente de la estructura.
Frente
elemento 1
elemento 2
'o"
Eliminación ... "lI(r----
[
elemento n+ 1
elemento n
Almacenamiento de un elemento El almacenamiento de un elemento supone borrar el contenido que hubiera en la posición donde se desea almacenar. En el caso de almacenar ex en la posición 2 quedaría:
I " I "
I"
l··· ·1
'o
I
'o,,
I
Final
t
rn
Después de insertar el elemento ex en la posición n de la lista quedará la siguiente lista.
I " I " I ] " I
153
Figura 5.8.
I I I
,--'M,re',"
Estructura tipo cola.
Un ejemplo típico se muestra en los sistemas de computadoras de tiempo cOmpartido, en el cual muchos usuarios comparten el mismo recurso informáti co. Con frecuencia, se comparte la unidad central de proceso y la memoria principal. Estos recursos se comparten permitiendo que el programa de un usuario se ejecute durante un'pequeño espacio de tiempo, seguido de un segundo programa de otro usuario, Y. así sucesivamente. Se utiliza una cola para almace nar los programas de los usuarios que están esperando su turno de ejecución. Sin embargo, una cola de este tipo no siempre trabaja en un estricto orden, primero en entrar, primero en salir, sino que trabaja con un esquema de priorida des basado en varios factores: tiempo de ejecución requerido, número de líneas de salida, hora del día, etc. Otro tipo de cola muy conocida en informática son las colas de impresión para permitir la impresión de diversos documentos procedentes de diversas \ fuentes, con una sola impresora. Las colas se representan con dos punteros F (frente) y R (final) para denotar las posiciones frontal y final de los elementos, respectivamente.
Eliminación
Inserción
Supresión de un elemento Excepto en la cabeza o final de la lista la supresión de un elemento exige un desplazamiento de los elementos posteriores. Otro método consiste en marcar los elementos considerándolos inactivos. F
R
154
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACION
La operación de inserción (elemento mn) en una cola se muestra a continua ción. e,
e2'
e3
ITJJu 1 1 DIIJuu u. F
I
R
i
accesible -el que está arriba de la pila, la cima o cabecera de la pila «toP))-· La adición de un elemento a la pila se produce siempre por la parte superior de la pila. El único elemento accesible de la pila es el elemento cima y el menos accesible el situado en el fondo. Esta estructura se conoce por UFO, last-in, first-out (último en entrar, primero en salir). La noción de pila nos es familiar en la vida diaria: pila de'libros, pila de platos, etc. Para añadir un plato se coloca arriba de la pila, para tomarlo se coge de la parte superior de la pila. En una pila. las inserciones y las supresiones se efectúan en la misma punta de la pila, llamada cabecera de pila. En una cola, los elementos se insertan por un extremo y van desplazándose por el interior de la cola hasta llegar al otro extremo, donde son' borradas. El diagrama de una pila es:
I
r:l
i
F
R
e La operación de supresión de un elemento se puede realizar indicando el número de orden que se le asignó cuando ese mismo elemento fue insertado, de modo que el extremo frente se desplaza con cada operación de supresión.
e,
e2
e3
e4
La estructura cola es frecuente en la vida diaria, y ejemplos típicos son: la cola de un cine, la hilera de automóviles parada frente a un semáforo, etc.
5.4. 1.2.
B
A
es
JIEJI....--- Pilas
Una pila es una subclase de lista lineal en la que las inserciones y eliminacio nes se realizan por un solo extremo y solamente el último elemento resulta
1 55
Figura 5.9.
Diagrama de una pila,
156
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA DE DATOS
157
Representación física de una pila Cima ---> n
n
...,O
n
o a: ro
e .;::;
)1
2 -§ (f)
o..., oa: (LJ
"O
.~
Ll.
Cima 4--->
d
4
d
o
u z
e
3
2
I
I
3
o
e
--'
aJ
b
2
b
u
z
''¡:¡
-----------. ~
..Cl
2
"O
(f)
::J
e
¡¡:
~
2
~
)t
Q.>
III
e
·s .o :::J
Cima 0---..
O
I
I Pila vacía
a
1
III
a
III
> '¡ji Pila semillena
Q>
U
Pila llena
Esta representación puede realizarse con una lista simple encadenada.
:::J
-'
mm {I}-{JJ-ill I
III
"O
aJ
E
::J
::::i
III
U.J
a: a.. ro
e
O
2
2
U.J
O ro
",
e ''¡:¡
U.J
O )o
2
a: c..
::J
)o
Q.>
{;
e ¡¡:
e ¡¡:
2
o ltl
::J
..Cl (f)
"O
..Cl
U.J
a:
''¡:¡
O
Cima
En los sistemas de computadoras las pilas se utilizan para almacenar informa ción, de modo que puede volver a recuperarse cuando se desee. El ejemplo más típico son las llamadas a subrutinas o funciones, en el que la dirección del programa en curso se almacena en la pila, de modo que tras la ejecución de las subrutinas o funciones, el control del programa retorna a la dirección donde debe reanudarse la ejecución del programa. Supongamos un programa PRINCIPAL que llama a la subrutina DEMO y luego a PRUEBA, y a su vez PRUEBA llama a la subrutina BLANCO y luego a la subrutina ROJO (Figura).
III
::J (/)
t
I
--'
a.. Ü
z ti: a.. ro
E
r:en
El
a..
~o i
aJ U.J
::J
U.J
)o
)o
a: a..
~
--'
a.. Ü Z
)t
ti: a..
--' --'
--' --'
U
"O
U
e ¡¡:
Q.>
E
;:,
el
ir:
-,.,-~,;-,.
158
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACION
La pila de ejecución del programa PRINCIPAL se muestra en la Figu ra S.I1.
BLANCO
~I PRINCIPAL
PRINCIPAL
Comienzo programa PRINCIPAL
PRINCIPAL llama a DEMO
I
II PRINCIPAL
Fin de DEMO
II
PRUEBA
PRINCIPAL
Llamada a PRUEBA
I~
II
5.4.2.
Listas encadenadas
Aunque como se ha visto en el párrafo anterior las listas densas tienen una . estructura simple, presentan algunas desventajas: dificultades en las inserciones o supresiones -sobre todo si se ha de conservar ordenada-, modificación del tamaño o formato de la lista, etc. La lista está sometida a una continua reorgani zación que es aconsejable. Las listas encadenadas son aquellas en las que en cada elemento de la lista se incluye un campo especial llamado puntero (pointer) o apuntador que sirve para enlazar dicho elemento con el siguiente de la lista, evitando así la ocupación de posiciones contiguas de memoria. La mayor ventaja de las listas encadenadas es la utilización eficaz de la memoria, ya que se puede utilizar cualquier espacio vacío por no exigir posicio nes secuenciales de memoria. Por el contrario, su mayor inconveniente es la lentitud del proceso, ya que es necesario ir recorriendo elemento a elemento a través de los punteros para poder acceder a uno específico. Así una organización secuencial sería:
fl
I~"
I I
PRINCIPAL
PRUEBA llama a BLANCO
159
x", I xm
x"
H
Ix,", I
En la organización encadenada cada elemento de la lista tiene dos partes: la primera contiene la información perteneciente a este elemento, y la segunda parte contiene la dirección del siguiente elemento de la lista. Nótese que el último elemento de la lista no tiene sucesor; el campo del puntero no contiene una dirección real. La Figura S.12 representa una lista encadenada con el puntero PRIMERO ROJO
BLANCO
[]-E
HI Primer elemento
Ultimo
Penúltimo
Segundo
D
PRUEBA IMERO PRINCIPAL
PRUEBA llama a ROJO Figura 5.11.
"ARaA
1'600I-1'OPE'
t
Programa principal y la pila. IMERO 2000
Las operaciones de situar o insertar un elemento en una pila se conoce por empujar (push) y la operación de extracción o borrado por expulsar (pop).
6--1
RU"
t
1600
1300
Figura 5.12.
Lista encadenada.
B-ED t
1200
160
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA DE DATOS
conteniendo la información de un elemento y la segunda parte la dirección del siguiente elemento. El último elemento contiene una dirección vacía, NULO (una diagonal). La operación de inserción en una lista encadenada es muy fácil ya que sólo implica un intercambio de punteros. Por ejemplo, la Figura 5.13 muestra la inser ción del elemento «DELGADO» entre el segundo y el tercero de la lista compuesto de cuatro elementos suponiendo que está almacenado en la posición 1100. El campo del encadenamiento del segundo elemento se cambia de 1500 a 1100: se le asigna también al puntero del nuevo elemento el valor 1400. La operación de borrado demuestra la eliminación del tercer elemento «RUIZ» de la lista original. El valor del puntero del segundo elemento se borra de 1300 a 1200.
GARCIA
I 1600 I
t
PRIMERO: 1000
I LOPEZ
1
t
...
Ru,z138 AGUILAR
~J [
1600
,too
5.4.3.
¡
I
GARelA
t
PRIMERO: 1000
.1 0-+1 12J
1 1-+¡r-- I~ lOPEZ
1600
RUIZ
t
t
1600
1300
AGUILAR
I t I H GI LISTAS DOBLEMENTE ENCADENADAS
Hasta este momento las listas lineales se han recorrido de izquierda a derecha. En numerosas ocasiones se necesita recorrerlas en ambas direcciones. La explo tación en los dos sentidos puede realizarse con dos punteros por átomo o registro, en lugar de uno. De este modo se puede utilizar un puntero para localizar el registro precedente y otro para el siguiente. Las listas lineales son doblemente encadenadas cuando su estructura contie ne dos campos o punteros encadenados: uno que señala el elemento siguiente y otro el que apunta al elemento precedente.
t
1200
D-J
Este tipo de lista es cerrada. Puede recorrerse circularmente, en el sentido indicado por los punteros. Las listas circulares presentan el inconveniente de los bucles o lazos infinitos que se presentan cuando no se tiene especial cuidado en detectar el final de la lista.
, IZQUIERDA..
(b)
Figura 5.13.
Listas circulares
Esta estructura conocida también como anillo es una subclase de una lista lineal consistente en enlazar el último elemento de la lista (con el puntero) con el primero.
5.5.
(a)
161
+-[IT]-+.... . . :[IT]
[2[I]........ ...
. +-DERECHA
Inserción/borrado en una lista encadenada.
Un uso de listas de varios punteros es llevar la cuenta en un orden diferente al ordinario. La lista encadenada, que necesita un enlace o puntero entre dos elementos consecutivos de la lista, se utiliza en el caso de que el número de eliminaciones e inserciones de elementos sea muy grande, ya que basta modificar el puntero del elemento anterior en el caso de eliminaciones y añadir un nuevo puntero en el caso de una inserción. La manipulación de listas se puede hacer en cualquier lenguaje de programa ción, aunque existen lenguajes especiales para su manipulación como son: LlSP, SNOBOL, etc.
5.6.
ARBOLES
Las estructuras de datos estudiadas anteriormente no permiten representar informaciones jerárquicas. Sin embargo, en informática existen múltiples aplica ciones donde se utilizan este tipo de organizaciones. Algunos ejemplos de representaciones jerárquicas de estructuras de objetos son:
162
METODOLOGIA DE LA PROGRAMACION
ESTRUCTURA DE DATOS
1.
5.6.1. _____________
Estado civil
/
Nombre
/
_____________
Dirección
~
Nacimiento
Fecha
EmTado
Ciudad
/~
Provincia
Cursos
Título
a) b)
~.
e)
Lugar
Esta estructura puesta en forma de variable compuesta, declarada en COBOL sería: 01 Empleado 02 Estado civil
03 Nombre
03 Nacimiento
04 Fecha
04 Lugar
02 Dirección
03 Calle
03 Número
03 Ciudad
03 Provincia
02 Estudios
03 Título
03 Cursos
if m then
begin
nl ; instrucción
end
else p
estructura en árbol
~
Existe un nodo raíz. El resto qe los nodos se distribuye en un número n de subconjuntos dis tintos. Cada uno de estos subconjuntos es un subárbol del nodo raíz.
En el ejemplo de la estructura EMPLEADO, existe un árbol raíz (EMPLEA DO) y por los tres subárboles: ESTADO CIVIL, DIRECCION y ESTUDIOS. Los elementos de la estructura se denominan nodos. El nodo A es el nodo raíz del árbol.
8
2. Las instrucciones pueden representarse en un lenguaje de programación como estructura arborescente.
n2; n3;
Definición
Un árbol, estructura arborescente o arborescencia es una estructura no lineal en la que cada elemento está relacionado con dos o más elementos. Un árbol consta de un conjunto de nodos (unidades de información) en las que además de la propia información contiene dirección de otros nodos de menor importan cia o jerarquía, y cumple las siguientes condiciones:
Estudios
/I\~
Calle Número
1 63
/~
if
then
else
/1\
n1 n2
n3
p
El nodo B es nodo del subárbol 1, el nodo C es raíz del subarbol 2 y el O es raíz del subárbol 3. Grado de un nodo es el número de subárboles de ese nodo. El grado del nodo A es 3 y el del nodo O es 2. Los nodos de grado son los terminales también llamados hojas. Las líneas que unen dos nodos se llaman lados o aristas o ramas. Camino de un nodo es el conjunto de aristas a través de las cuales se pasa desde el nodo raíz a ese nodo. A cada nodo se le asocian uno o varios subárboles llamados descendientes o hijos. Los nodos B, C y O son hijos del nodo A. Los nodos hermanos son los sucesores directos de un mismo nodo (hijos de un mismo padre). O, E y F son todos hermanos. F y P no son nodos hermanos. Si el nivel del nodo raíz es 1, el nivel de un nodo es el de su padre más l. Se dice que un árbol es n-ario (n, constante entera) cuando el número máxi mo de hijos' de un mismo nodo es n. Un árbol binario es un árbol en el cual
164
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACtON
cada nodo tiene, como máximo, dos hijos. Todo árbol n-ario se puede transfor • mar en un árbol binario equivalente. El árbol EMPLEADO es un árbol ternario. Un árbol no puede estar vac{o: contiene como mínimo un elemento. la raíz. Un ejemplo gráfico completo de un árbol sería:
165
aunque estas representaciones sean idénticas (igual árbol en el caso de árboles no binarios.
Raíz Grado 2
Son árboles iguales. pero árboles binarios distintos.
Nivel 1
Grado 1
Nivel 2
Grado 1
Nivel 3
Grado O
Nivel 4
La altura o profundidad de un árbol binario es el número de nodos que constituyen el camino más largo desde la raíz a una hoja. Un problema típico consiste en la conversión de un árbol ordinario en un árbol binario equivalente. Un árbol binario se dice que está completo o lleno cuando tiene todos los nodos de grado 2 excepto los nodos terminales.
Otras formas de representar un árbol son:
N
C {F
61\ 8
....
1 ~
B
I
D{G E
A
-
H
Q
R
T
El problema de convertir un árbol cualquiera en un árbol binario se represen ta en la Figura 5.14.
¡,
A
G
5.6.2.
Arboles binarios
Una de las estructuras más comunes de los árboles, es aquella en que cada nodo tiene como máximo dos subárboles (grado 2), que se conocen como subár bol izquierdo y subárbol derecho. Dos árboles binarios contiguos son distintos
H (a)
Figura 5.14.
(b)
F (e)
Conversión de un árbol cualquiera en árbol binario.
/
,"~~,:"",.,,...
166
ESTRUCTURA DE DATOS
METODOLOGIA DE LA PROGRAMACION
5.6.3
167
EJERCICIOS PROPUESTOS
Recorrido de un árbol binario
Existen diferentes maneras de recorrer un árbol para tratar los diferentes nodos que lo constituyen. Supongamos un árbol binario.
1
1
~.
I
~ r
G
J
L(I)
.
' 2.
-
Diseñar un algoritmo que calcule el mayor valor de la lista: 1= 1, 2, 3, ... , N
Dada una lista L(I) de N números diseñar un algoritmo que calcule en forma independiente a) b)
r H
SIENDO
La suma de los números impares. La suma de los números pares.
3. Las acciones a considerar son tres y según el orden en que se efectúen se tendrá el recorrido en un sistema o en otro. • Posicionarse en la raíz. • Recorrer el subárbol izquierdo. • Recorrer el subárbol derecho. Los tres tipos de recorridos más frecuentes y su aplicación concreta al árbol
anterior son: Recorrido prefijo o preorden • Posicionarse en la raíz.
• Recorrer el subárbol izquierdo. • Recorrer el subárbol derecho. Recorrido postfijo o postorden • Recorrer el subárbol izuierdo • Recorrer el subárbol derecho. • Posicionarse en la raíz.
DBGEHIFCA
Recorrido en orden o simétrico • Recorrer el subárbol izquierdo. • Posicionarse en la raíz. • Recorer el subárbol derecho
DBAGECHFI
Escribir el diagrama de flujo y el algoritmo que permite imprimir los núme ros de una tabla de dos dimensiones (5 x 4). 4. Se desea diseñar un algoritmo que permita obtener el mayor valor almacena do en una tabla VENTAS de dos dimensiones (4 filas y 5 columnas). NOTA: La tabla contiene información almacenada en cada elemento. 5. Hacer diferentes listados de una lista de 10 números según el siguiente crite no:
-
°
Si los números están comprendidos entre y 50, ponerlos en la lista 1 (el 50 no pertenece a la lista 1). Si los números están comprendidos entre 50 y 100, en la lista 2 (el 50 pertenece a la lista 2). Si están entre lOO Y I50, colocarlos en la lista 3 (el 100 Yel ISO pertenecen a la lista 3).
CAPITULO 6
TABLAS DE DECISION
6.1.
INTRODUCCION A LAS TABLAS DE DECISION
Los organigramas estudiados en los capítulos anteriores presentan una serie de inconvenientes: • • • •
El ordinograma no es único para un problema determinado. Difíciles de modificar. En lenguajes muy evolucionados, los organigramas pierden eficacia. El proceso secuencial del ordinograma obliga a establecerlo de manera progresiva antes de tener la totalidad del proceso a realizar.
El uso de las Tablas de Decisión en Informática es reciente -años 58 a 60-, aunque anteriormente se habían utilizado en numerosas actividades como tablas de tarifas, contabilidades, etc. Las tablas de decisión (TD) constituyen una herramienta poderosa para definir la lógica de un programa complejo. Constituyen un medio de representa ción de la información en forma tabular, cuyo objetivo primordial es el de aportar información en un formato que sea fácil de leer y comprender. El uso de las tablas de decisión aunque no tan extendido como los ordino gramas, suele constituir en algunas ocasiones una técnica para capturar datos y la primera operación de análisis del problema. Una vez planteada la TD se suele realizar la construcción del ordinograma o algoritmo correspondiente. En ocasio nes las TD sustituyen a los diagramas de flujo u ordinogramas. 169
170
6.2.
TABLAS DE DECISION
METODOLOGIA DE LA PROGRAMACION
DEFINICION DE UNA TABLA DE DECISION (TD)
La secuencia de un programa puede ser descrita por una estructura de deci sión, la Tabla de Decisión (TD). Una TD es un documento de comunicación entre usuarios, analistas. progra madores, etc., y un instrumento de análisis y programación, que se puede aplicar a numerosos y diversos problemas permitiendo la representación de las diferen tes situaciones de un modo fácil y lógico. Una TD es una herramienta que permite presentar deforma concisa las reglas lógicas que hay que utilizar para decidir acciones a ejecutar en función de las condiciones y la lógica de decisión de un problema específico. Una TD es un tipo de tabla que muestra lo que debe realizar el programa cuando se cumplen ciertas condiciones. Son especialmente útiles para describir procesos que incluyan muchas decisiones múltiples. En esencia las TD constituyen una técnica fácil de aprender y emplear que no requiere grandes esfuerzos de imaginación para su comprensión e interpreta ción. Una tabla de decisión se representa en un cuadro de cuatro bloques (Figu ra 6.1).
MATRIZ DE CONDICIONES
ENTRADA DE CONDICIONES (Situación)
MATRIZ DE ACCIONES
ENTRADA DE ACCIONES (Decisión)
.'
Figura 6.1.
Representación gráfica de una tabla de decisión (TD).
A la izquierda de la Figura 6.1 se tiene la matriz y a la derecha las entradas. La matriz de condiciones recoge las condiciones de todo o parte del problema, dicho en otras palabras, las preguntas que deben probarse para alcanzar una decisión, La matriz de acciones refleja todas o parte de las acciones del problema a realizar o las acciones que han de emprenderse cuando se presenta un conjunto dado de condiciones.
171
La entrada de las condiciones (combinación de las posibles condiciones), permiten reflejar en la TD si se cumple o no tal condición o si es indiferente, es decir, sea cual su condición de entrada, no tiene influencia sobre la acción que debería efectuarse. La entrada de las acciones (decisión) indica efectuar la acción correspondien te a un conjunto de condiciones cumplimentadas.
6.2.1
Reglas de decisión
Cada combinación de entrada de condiciones y su correspondiente entrada .de acciones constituyen una relación denominada regla de decisión. Existen tantas reglas como pares distintos de entradas condiciones/acciones. El número \ de reglas de decisión debe cubrir todos los casos posibles, sin repeticiones ni omi siones. Notas de construcción
• El número de reglas de decisión es 2n siendo n el número de condiciones posi bles. .• A una condición de entrada sólo le corresponde una decisión o condición de salida. • A una condición de salida le pueden corresponder varias condiciones de en trada. • Para que una TD esté bien construida es necesario que en cada momento sea cierta una y sólo una de las situaciones. • El resultado de una regla no varía si se permuta el orden de las líneas de condición, ni la lógica de decisión cambia si se permuta el orden de las columnas (reglas). • Cada regla de decisión (columna) es una estructura Si-entonces (si se cumple la condición de entradas entonces realizar talo tales acciones), del tipo booleano de condiciones y se le pueden aplicar las leyes del Algebra de Boole. • La entrada de condiciones se representa con los símbolos lógicos S, N o X (S, afirmativa; N, negativa; X, indiferente). • La entrada de acciones se representan con una X si se realiza y en blanco o un guión (-), si no se realiza. • La lista de condiciones puede ponerse en cualquier orden. '. La lista de acciones debe ponerse en el orden en que se tengan que ejecutar. .• Cada columna (regla de decisión) de una TD equivale a una ruta o camino de un diagrama de flujo.
6.2.2.
Modos de presentación de las tablas de decisión
Existen dos modos de presentación: horizontal y vertical.
1 72
METODOLOGIA DE LA PROGRAMACION
T ABLA5 DE DECI510N
173
La representación de una TD completa se representa en la Figura 6.2.
Presentación HORIZONTAL
En este modo de presentación:
Situación
....--
• Las condiciones y las acciones se escriben horizontalmente. • Las reglas se leen verticalmente.
r--
C1
S
S
S
N
N
C2
S
N
N
S
N
Reglas
Condiciones
Condiciones
®
Cn
N
N
S
N
S
X
X
Lo-
Acciones A1
X
, X
A2
X
Acciones @
®
Presentación VERTICAL
An
En este modo de presentación:
X ~
• Las condiciones y las acciones se escriben verticalmente. • Las reglas se leen horizontalmente. Condiciones
X
Regla de decisión
S - Sí N - No
X - Acción de ejecución
En blanco - No se realiza.
Acciones
Figura 6.2.
Tabla de decisión completa.
Las TD se leen siempre de izquierda a derecha y las reglas de arriba. a abajo. Las líneas horizontales y verticales dobles sirven como límite o frontera: las condiciones aparecen encima de la doble línea horizontal y los tratamientos debajo de dicha doble línea. Ejemplo 1: Tabla de decisión que contiene los pedidos de una empresa y emite facturas a los clientes de acuerdo con las siguientes hipótesis: a) Los pedidos pueden ser de Madrid o exteriores a Madrid, yen cualquier
caso se expedirá la factura calculando el precio total de acuerdo con las siguientes condiciones.
Reglas
Pedido exterior de Madrid: Imprimir etiqueta de direcciones para' envío por correos; cargar costes en la factura. e) Pedido de Madrid: Si el pedido es superior a 50.000 pesetas hacer un.. descuento del 5 %.
b)
174
METODOLOGIA DE LA PROGRAMACION
175
TABLAS DE DECISION Envío a Madrid Pedido superior a 50.000 Imprimir etiqueta Calcular precio pedido Añadir portes Descuento 5 %
S N
S S
N S
N N
X
X
X X X
X X
X
por consiguiente en la condición e2, Si o No, se producen las mismas ac ciones; eso significa que se pueden simplificar las dos reglas R2 y R4 dejándo las reducidas a una sola R24 con la segunda condición representada por un guión (-). S
S S equivale a
S
La lectura de la TD (izquierda-derecha) arroja los siguientes resultados: l. Si el envío es a Madrid y no superior a 50.000 pesetas entonces calcular precio pedido para emitir factura por ese precio. 2. Si el envío es a Madrid y sí superior a 50.000 pesetas, entonces calcular precio pedido y hacer un descuento del 5 %. 3. No es de Madrid el envío y sí es superior a 50.000 pesetas, entonces/ imprimir etiquetas, calcular precio pedido y al'íadir portes para emitir factura total. 4. No es de Madrid el envío y no es superior a 50.000 pesetas, entonces imprimir etiqueta y calcular precio pedido para emitir factura total.
La TD es denominada propia por indicarse en ella todo el conjunto de condiciones posibles. En el caso de que una o varias combinaciones de condicio nes den lugar a las mismas acciones es posible simplificar la TD obteniéndose en ese caso la TD impropia o reducida, que tiene menor número de reglas. Así por ejemplo en la TD: R1
R2
R3
R4
R5
R6
R~
R8
C1
S
S
S
S
N
N
N
N
C2
S
S
N
N
S
S
N
N
C3
S
N
S
N
S
N
S
.
N
A1
X
,-
X
-
X
X
A4
X
De igual forma las reglas 3 y 7 producen las mismas acciones. S
N
N N
S S
por consiguiente se pueden sustituir por una sola regla, R37
N
S
,-
X
.
-
X
X
X
X
-
-
X
Rl
R24
R37
R5
R6
R8
Cl
S
S
-
N
N
N
C2
S
-
N
S
S
N
C3
S
S
S
S
N
N
A1
X
X
X
X
X
¿
X'
'--
A3
N
S
Así pues, la TD resultante sería:
Reglas
A2
S N
A2
X
X
X
X
A3
X
A4
X
X X
X X
X
Las reglas 2 y 4 producen las mismas acciones
s
S
S N
N S
Ejemplo 2 Tabla de decisión para la expedición de billetes de ferrocarril (dos clases, l.a
y 2. a) y con dos listas de espera (l.a y 2. a).
176
METODOLOGIA DE LA PROGRAMACION
1 77
TABLAS DE DECISION R1
R2
R3
R4
R5
R6
R7
R8
Cl
Petición billete 1 a
S
S
S
S
N
N
N
N
C2
Petición billete 2. a
N
N
N
N
S
S
S
S
C3
Existen plazas en 1. a
S
S
N
N
N
S
N
S
C4
Existen plazas en 2. a
N
S
N
S
S
S
N
N
Al
Expedir billete 1. a
X
X
A2
Expedir billete 2 a
X
X
A3
Poner en lista de espera 1. a
A4
Poner en lista de espera 2. a
Otras
TIPOS DE TABLAS DE DECISION
6.3.
Las tablas de decisión se pueden clasificar atendiendo a dos criterios:
Tipos de entrada de condición • Limitadas. • Ampliadas. • Mixtas.
Procesos complejos (encadenamiento X
o
enlace de tablas)
• Abiertas. • Cerradas.
X X
X
6.3.1.
En esta TD se consideran condiciones excluyentes: si el viajero pide billete de La no pide de 2." y caso de no existir l.a pasa a lista de espera de 1."; igual para el caso de billetes de 2. a • Las reglas de condición Rl y R2, R3 y R4, R5 y R6, R7 y R8 producen las mismas acciones, por consiguiente la TD se puede reducir a:
Tablas de decisión limitadas
Son aquellas en las que la evaluación de todas las condiciones está limitada a dos posibles valores: SI~NO, o la reducción de ambas, el guión (-). En síntesis: • Las casillas situadas frente a las condiciones se rellenan con SI, NO, o bien, indiferente (-). • Las casillas situadas frente a las acciones sólo contienen aspas (X).
Enunciado: Tabla de decisión para las ventas de unos grandes almacenes donde R12
R34
R56
R78
Cl
Petición billete 1. a
S
S
N
N
C2
Petición billete 2. a
N
N
S
S
C3
Existen plazas en 1. a
S
N
-
-
C4
Existen plazas en 2 a
-
-
S
N
Al
Expedir billete 1. a
X
A2
Expedir billete 2. a
A3
Poner en lista de espera 1 a
A4
Poner en lista de espera 2. a
el cliente puede pagar al contado o con tarjeta de compras, y el pedido se le remitirá a su domicilio cobrándole portes si el pedido es inferior a 10.000 pesetas. (En cualquier pedido se incluirá un IVA del 12 %.)
Otras
Condiciones: ¿Tiene tarjeta de crédito? Acciones:
X X
si la petición es de un billete de 1." y no existen plazas en 1." entonces poner en lista de La.
(Al)
(A2) (A3) (A4)
Rl
R2
R3
R4
Cl
¿Tiene tarjeta de crédito?
S
S
N
N
C2
¿Importe de la compra < 10.0007
S
N
S
N
Al
Pago contado
X
X
A2
Cargar cuenta
X
X
A3
Cargar IVA
X
X
X
X
A4
Cargar portes
X
X
Para la lectura de esta tabla -como ya se ha comentado- se examinará una sola regla cada vez. Así por ejemplo la regla R34 se puede describir así:
(Cl) (C2)
¿Importe de la compra < 1O.000? Contado (Cl no) Cargar en cuenta (Cl si) Cargar portes (C2 si) Cargar IVA (12 %) (siempre)
X
178
METODOLOGIA DE LA PROGRAMACION TABLAS DE DECISION
6.3.2.
Tablas de decisión de entradas ampliadas o extendidas
En este caso ha sido necesario desdoblar la condición «Tarjeta de Crédito» en dos subcondiciones, pero en cualquier caso esta tabla siempre será más fácil de leer y entender que su equivalente tabla limitada.
Son aquellas tablas en donde las distintas condiciones pueden tener un rango de alternativas superiores a dos valores (si o no). Ejemplos claros de aplicación de TD ampliadas son: a) b)
Puesta al día de un fichero. Las posibles alternativas son: altas, bajas y modificaciones. Valores numéricos múltiples correspondientes a un solo elemento.
6.3.3.
o < C < 1.000 1.000 < C < 5.000 5.000 < C < 10.000
• Comprobar plazas libres en La y 2a. • Petición del viajero. • Acepta cambio de clase si no existe la solicitada.
Ejemplo La tabla de decisión limitada anterior se debe IllIdificar debido a que la empresa de transportes ha variado sus tarifas y es necesario un reajuste en las facturas de los pedidos, de acuerdo a las siguientes hipótesis. • Si el importe de la compra < 5.000 pesetas • Si el importe de la compra está entre 5.000 y 10.000 pesetas • Si el importe de la compra está entre 10.000 y 50.000 pesetas • Si el importe de la compra es < 50.000 pesetas
- Cargar total portes. --;- Cargar 75 % portes. - Cargar 50 % portes. - No cobrar porte. 6
El número de condiciones se eleva a 6, lo que significa 2 combinaciones o reglas de decisión diferentes. Por otra parte, las nuevas condiciones son exclu yentes. Si el pedido es menor de 5.000 pesetas, nunca podrá cumplir las otras condi ciones (> 5.000 pesetas...). Al elevado número de condiciones habría que sumar las nuevas acciones, lo que hace la resolución del problema con TD limitada sumamente compleja, y por ello es más sencillo recurrir a una TD ampliada. Tiene tarjeta de crédito Importe de la compra
SI
< 5.000
SI
Cargar cuenta
X
Cargar IVA
X 100%
NO
NO
X
SI
X X
X X
X
75%
50%
NO
> 50.000
X
X X
X
SI
5.000 Y 10000 10.000 Y50.000
X
Pago contado
Cargar portes
NO
X
X
Tablas de decisión mixtas
Se denominan así a las tablas que resultan de la combinación de las tablas vistas en los párrafos anteriores. Una aplicación de este tipo de tabla podta ser una ampliación del ejemplo de expedición de billeres de la siguiente forma:
I peseta = 1/135 dólares = 1/220 libras = 1/60 francos ... e) Valores acotados compras entre O y 1.000 pesetas compras entre 1.000 y 5.000 pesetas compras entre 5.000 Y 10.000 pesetas
179
X 0%
La TD ampliada resultante s:ría la siguiente: Rl
R2
R3
Sólo 1. a 1 a 2. a S
2. a N
R4
R5
R6
R7
Ra
R9Rl0R11R12
Sólo 2. a La la N S
2a
No hay plazas 1." 1." 2." 2." S N S N
,. Billetes disponibles Petición viajero Cambio de clase
Expedición billete 1." Expedición billete 2 a Lista de espera 1." Lista de espera 2."
X
X
1 a y2 a 1a 2 a
-
-
-
X X
X
X X
X
X X
X
X X
X
Esta tabla resuelta en representación gráfica limitada sería enormemente compleja, ya que de cada condición actual se derivarían las escritas en la entrada de condiciones.
6.3.4. Comparación y transformación de los tipos de tablas La comparación de las TD produce las siguientes características: • Las TD de entradas ampl-i.as son más legibles que las TD limitadas por ser menos voluminosas que sus equivalentes. La razón como ya se ha visto reside en el hecho de que una condición de una tabla de entrada amplia corresponde a varias condiciones de la tabla de entradas limitadas equiva lentes, debido a que éstas sólo tienen dos posibles alternativas S o N. • Las TD de entradas limitadas son más facil de codificar en programa (las reglas de decisión constituyen caminos de un diagrama de flujo) que las tablas i m p l i c a d a s . ) ~
..
':,~"
180
METODOLOGIA DE LA PROGRAMACION
TABLAS DE DECISION
Para convertir una TD de entradas amplias en una TD de entradas limitadas será necesario ejecutar las siguientes tareas:
181
Reglas «O» (OR) Para que se satisfaga una regla basta con que se cumpla cualquiera de las condiciones de la situación (operador lógico OR). Existen dos tipos de reglas «O».
• formular tantas condiciones binarias (S/N) como alternativas consideradas existan para cada condición de la tabla de entrada amplia. • formular tantas acciones binarias (S/N) como posibilidades consideradas en las reglas, para cada una de las acciones de la tabla de entrada amplia.
OR inclusivo
La tabla mixta anterior podría quedar así:
Se cumple una u otra condición aislada o simultáneamente. Rl Billetes disponibles sólo 1."
S
R2 -
E
x Billetes disponibles 1" Y 2."
c
Billetes disponible sólo 2"
I u y
No hay plaza
e
I
R3
S
OR exclusivo Entre dos condiciones se cumple una u otra pero no ambas simultánea mente.
S
En la siguiente tabla se pueden apreciar las reglas «Y», «OR»
n t
Petición de viajero 1."
S
e s
Petición de viajero 2."
I
/
S
, Cambio de clase
Expedición billete 1."
S
R2
R3
R4
Cl
N
N
S
,S
C2
N
S
N
S
...
...
...
...
S Acciones
x
Expedición billete 2."
Rl
S
x ....
Lista de espera 1" Lista de espera 2."
Procediendo en forma inversa se convertirá una TD limitada a una TD am'" pliada.
6.4. TIPOS DE REGLAS DE DECISION Las reglas de decisión según las relaciones que existan entre las condiciones de una tabla de decisión pueden ser: Reglas «y» (AND) En cada situación se necesita que se satisfaga la. primera condición Y la} , segunda Y la tercera, ... (operador lógico AND) si condición 1 Y condición 2 Y '" entonces.
Las reglas R2, R3 Y R4 son del tipo «o inclusivo», las reglas R2 y R3 exclusivo». La regla R4 constituye una del tipo «y».
«o
Reglas ELSE (sino) Entre las diversas situaciones posibles sólo algunas de ellas conducen a trata· mientos diversos, mientras que el resto de las reglas conducen a un único trata miento. Las reglas que conducen a un tratamiento único se agrupan en una sola regla denominada ELSE (sino o en otro caso). Se suele colocar al final de la TD sin evaluar sus condiciones.
6.4.1. Conversión de reglas «O» y «SINO» Una regla «O» se transforma en n REGLAS and, siendo n el número de condiciones que intervienen en la regla (las n reglas se suponen con indiferencias, ya que sin ellas se tendría 2tn - 1).
TABtAS 'O~WCIStON 182
T83
METODOLOGIA DE LA PROGRAMACION
Supongamos la situación de una regla OR extraída de una TD de 4 condi ciones.
Una vez identificadas las condiciones y acciones se comienza la escritura de la TD de acuerdo a las siguientes reglas: Escritura de las condiciones
N
sino se cumple la primera condición. O si se cumple la segunda. O no se cumple la tercera. O si se cumple la cuarta.
S N
S
• Realizar un listado de todas las condiciones. • Clasificar las condiciones siguiendo el orden lógico -si existe-- en el que se consideran. Así en el caso de 3 condiciones, órdenes lógicas pueden ser:
NNNNS S S S NNS S NNS S NS NS NS NS
Esta regla OR equivale a 4 reglas AND R1 N
R2
R3
S S
S
S
N N
N
R4
S S
(-) significa indiferencia que procede de la fusión de dos situaciones similares.
N N N S equivale a
N S N S
N
-
N
S
6.5. CONSTRUCCION DE TABLAS DE DECISION Para construir una TD son necesarios los siguientes pasos:
. I
.It~~{~."
a) b) c) d)
Estudio de condiciones, acciones y sus relaciones. Rellenar la TD. Analizar la TD. Simplificar la TD.
6.5.1. Estudio de condiciones, acciones y relaciones Tras la lectura del enunciado del problema se localizan las condiciones, que se han de extraer del enunciado, mediante la búsqueda de palabras similares-.a «Si, cuando, si no, etc.». Las acciones como el diccionario de la lengua indica se han de localizar en el enunciado con los verbos que implican acción, es decir «hacer algo»: realizar, ejecutar, sumar, restar, etc.
SSSSNNNN S S NNNNS S S NS NNS NS
o bien
Una elección lógica del orden de las condiciones simplifica considerablemen te la escritura de las reglas de la tabla. En la suscripción de una revista de información, los suscriptores antiguos tienen un descuento del 10 % Y los estudiantes del 20 %. Los descuentos no pueden acumularse y caso de coincidir dos descuentos en una sola persona, se le aplicará el mayor descuento a que tenga lugar. La tabla de decisión puede ser la siguiente Rl
R2
R3
R4
Cl
¿Suscriptor antiguo?
S
S
N
N
C2
¿Estudiante?
S
N
S
N
Al
Descuento 1O %
A2
Descuento 20 %
A3
Sin descuento
X X
X X
Sin embargo, eligiendo las condiciones C 1 y C2 en sentido contrario, como el descuento de estudiante es mayor que el de suscriptor antiguo, haciendo la pregunta de estudiante antes, cuando la contestación es afirmativa, será indife rente la situación como suscriptor. Estudiante
S
N
N
Suscriptor antiguo
-
S
N
Descuento 1O % Descuento 20 % Sin descuento
X X X
184
TABLAS DE DECISION
METODOLOGIA DE LA PROGRAMACION
Regla: El orden lógico de considerar las condiciones de una tabla es el si guiente:
Análisis y requisitos de una TD
Antes de convertir la TD en programa se necesita efectuar un análisis de sus reglas y comprobar que la TD diseñada cumple los siguientes requisitos:
• De arriba abajo para las tablas de presentación horizontal. • De izquierda a derecha para las tablas de presentación vertical. Escritura de las acciones
• Realizar el listado de todas las acciones a tomar. • Clasificar las acciones mediante un orden cronológico -si existe- según el orden en que deben considerarse. En ocasiones el orden no es importan- , te, pero en otras puede afectar el desarrollo de las acciones. • El orden de considerar las acciones es: - De arriba abajo para las tablas de presentación horizontal. - De izquierda a derecha para las tablas de presentación vertical. Escritura de las reglas de decisión de las TD limitadas a)
6.5.2.
186
Escritura de la entrada de condiciones (situaciones)
• Las condiciones se deben formular Si (S), No (N) o Indiferente (-). • Seguir un orden lógico en las entradas. Por ejemplo, primero todos los Sles (o todos los NOes) y a continuación hacer que vayan apare ciendo los NOes progresivamente. Si una tabla de decisión contiene n condiciones debe tener 2" reglas, caso de no utilizar signos de indife rencia. Así para una TD de 3 condiciones: Condición 1
s
s
s
s
N
N
N
N
Condición 2
s
s
N
N
s
s
N
N
Condición 3
s
N
s
N
s
N
s
N
• Completa. • No tiene redundancias. • No tiene contradicciones. Una TD es completa cuando se han establecido todas las situaciones posibles -todas las combinaciones matemáticamente posibles de las entradas o estados de las condiciones-, o dicho de otra forma: no se ha olvidado ninguna posible entrada. U na TD no tiene redundancias cuando no existen ningunas situaciones idén ticas que conduzcan a tratamientos idénticos. Existe redundancia cuando apare ce dos o más veces la misma entrada de condiciones con igual tratamiento. Una TD no es contradictoria cuando siendo redundante los tratamientos son los mismos, o dicho de otra manera, es contradictoria cuando a un mismo estado de condiciones le corresponden tratamientos diferentes. Si el conjunto de reglas supera 2", existirán errores.
6.5.3. Simplificación de una tabla de decisión La simplificación de una TD se debe realizar siempre que sea posible. Un método consiste en agrupar reglas simples en reglas compuestas (reglas simples son las que no contienen ninguna indiferencia y reglas compuestas las que contienen al menos una indiferencia). Dos reglas pueden simplificarse siempre que se produzcan las mismas accio nes y un estado de condiciones difiere sólo en la situación de una condición. R12
Rl
R2
Cl
S
N
Cl
S
C2
S
N
C2
-
Escritura de la entrada de acciones
C3
N
N
C3
N
Se van colocando aspas (X) frente a las acciones que hay que ejecutar para cada situación o conjunto de condiciones considerada.
Al
X
X
Al
X
Acciones
b)
Escritura de las reglas de las TD ampliadas Se van escribiendo las condiciones de modo que a cada una de ellas le corresponderá un determinado número de alternativas. Para evitar olvidar reglas es conveniente seguir un médoto para rellenar las tablas. Para rellenar las entradas de acciones bastará ir colocando las precisiones relativas a las acciones que se han de ejecutar en las casillas correspondientes.
equivale a
A2
A2
A3
A3
La siguiente tabla no se puede simplificar (difiere en más de dos situa ciones). ,~"»@\AAv·'w,Ff·
)",._<,
186
METODOLOGIA DE LA PROGRAMACION Rl
R2
Cl
S
S
C2
N
S
C3
S
N
Al
X
Una forma de comprobar la simplificación, sería hacer estos dos pasos:
Cl C2 C3 C4
R12
R34
S S
S S
-
-
S
N
R1234
equivalente a
Cl C2 C3 C4
-
Al A2
X
S S
-
X Al A2
A2
Si son más de dos reglas las que contienen iguales acciones, existe un teorema: denominado «del paraguas» por el tipo de dibujo necesario para la obtencióm de la simplificación, que permite la sustitución de varias reglas simples por un~j¡ compuesta, siempre que las reglas simples tengan las mismas acciones: «Se Ulll' mediante un arco aquellas reglas en que sólo cambia una condición. Si todu"" los arcos forman un circuito cerrado, se puede obtener una regla compuesta qlt~
'\'1i
sustituya a las reglas simples.»
En la siguiente TD es posible simplificar las 4 reglas simples en una sola con'i l; puesta, debido a que se cumple el teorema anterior. Rl
R2
R3
R4
Cl
S
S
S
S
C2
S
S
S
S
C3
S
N
S
N
C4
S
S
N
N
X
X
X
X
6.6.
ENCADENAMIENTO DE TABLAS DE DECISION
Cuando un problema de lógica es complejo, la TD equivalente resultará así mismo compleja. En estos casos es preferible dividir el problema en problemas secundarios de modo que cada uno de ellos dé lugar a la creación de una tabla particular. Las TD pequeñas son más fáciles de realizar, utilizar, modificar y leer que una TD voluminosa. Posteriormente las diferentes tablas se encadenan o enlazan para la solución del problema global. Los encadenamientos se realizan con las ya conocidas tablas abiertas y tablas
cerradas. 6.6.1.
Al A2
187
TABLAS DE DECISION
Tablas abiertas
Estas tablas presentan una conexión al principio de la tabla llamada (n) sin necesidad de retorno a la tabla que llama, después de la ejecución de la tabla n. Las llamadas se realizan mediante una bifurcación incondicional del tipo GO TO y una vez ejecutada no retorna a la tabla anterior. Se clasifican en dos grandes grupos:
Encadenamiento en cascada La tabla resultante se obtiene viendo las condiciones que permanecen y poniendo indiferencias en las condiciones que varían.
TDl
R14 S C2
S
C3
-
C4
-
Al A2
X
Ir a TD2
~ TD2
X
...
_X
~;~" .;!,
188
METODOLOGIA DE LA PROGRAMACION·
TABLAS DE DECISION
1
as
Otros ejemplos de encadenamientos serían:
TDl
TDl
TD3
-
r-~.
X
Ir a TD3
...
X
...
X Ir a TD3
L_ ....
t-
Ir a TD4
Tn"l
J f
. TD2
Ir a TD5
TD4
J TD5
Ir a TD3
Encadenamiento en anillo TD4 IV'"'T
TDl
""'"
6.6.2. Ir a TD2
L.
L--
X
X
Ir a TDl
X
...
Tablas cerradas
Son aquellas en que una vez ejecutada la tabla llamada, devuelve el control a la tabla que le llamó. La llamada se realiza mediante una estructura DO (hacer) y el retorno del control a la tabla precedente con RETURN (volver a). Existen numerosos casos de tablas cerradas.
TD2 Tabla cerrada
Ir a TD3
X
..
X
20
f-
Ir a 20
~ TD3
+ Retornar
i Ir a TD4
X
...
X
r-
Ir a 20
-
I
-
190
METODOLOGIA DE LA PROGRAMACION TABLAS DE DECISION
191
l. Se puede llamar desde una tabla a varias tablas cerradas.
.........
Tabla 1
1 r-
!
Tabla 2
I
Tabla llamadora
Tabla 3
~
~ f-
Las condiciones que se deben cumplir para que pueda existir un encadena miento son:
r-+
l. Cada tabla se debe identificar mediante una etiqueta (número o serie de caracteres). 2. La tabla invocada se ejecutará totalmente. 3. Cada regla de decisión debe indicar lo que se ha de hacer a continuación (bifurcar, hacer, terminar, etc.).
1
-
Tabla 4
6.7. CONVERSION DE TABLAS DE DECISION EN PROGRAMAS
I 2. Una tabla cerrada puede ser llamada desde diferentes tablas.
Tabla 1
-
I
La conversión de las TD en programas se pueden realizar con diferentes téc meas: a) Programación directa en lenguajes de alto nivel como COBOL, FOR TRAN o BASIC. b) Transformación de la tabla en diagramas de flujo. c) Convertidores de TD en programas. d) Métodos matriciales.
Ir --'"
6.7.1.
Tabla cerrada
Tabla 2
Programación directa en lenguajes de alto nivel
f
""""
Las reglas de decisión se convierten en instrucciones de los lenguajes. En el caso de la siguiente regla.
I
R1 Tabla 3
3.
C1
S
C2
N
C3
S
Una tabla cerrada puede llamar a su vez a otras tablas cerradas.
A1
X
Tabla 3
A2
X
I~T'bl"l.',
en COBOL se codificaría asf:
IF C1 AND NOT C2 AND C3 HACER A 1 A2 ELSE ... Tabla 2 (cerrada)
I Tabla 4
"-,¡;.,~,~.'·ii"<'4aJ'¡k':··~~",,,~
Esta técnica es cómoda pero tiene el inconveniente de preguntar en la misma pasa~ varias veces por la misma condición. Si se han definido tablas encadenadas, cada una de ellas dará lugar a subpro gramas abiertos o cerrados según el tipo de tabla. En el caso de tablas abiertas, la acción ir a la tabla n se traduce según el caso, por una instrucción de bifurcación incondicional del tipo GOTO (BASIC o Pascal) GO TO (COBOL), o bien por una instrucción de llamada a subpro >;'''':~'-'--''-'
192
METODOLOGIA DE LA PROGRAMACION
TABLAS DE DECISION
grama abierto o subrutina mediante la instrucción CALL en COBOL, BASIC, etcétera. Si son tablas cerradas, la acción ejecutar la tabla n se traduce por una ins trucción de llamada de subprograma cerrado (instrucción PERFORM en COBOL).
6.7.2.
Transformación de la tabla en diagrama de flujo
1. Cálculo del número de reglas simples a las que equivale cada regla (una
3.
4. 5.
Paso 1
R4 YR7 R1. R2 Y R5
- reglas simples (coeficiente I/R4 = 1, R7 = 1). - reglas compuestas con una indiferencia (equivale cada una a dos reglas simples; coeficiente 2/R 1 = R2 = R5 = 2). - reglas compuestas con dos indiferencias (equivale cada una a cuatro reglas simples; coeficiente 4/R3 = R6 = 4).
R3 Y R6 Paso 2
Esta técnica fue desarrollada por S. L. Pollack y establece como hipótesis que la evaluación de cada condición va a ocupar siempre las mismas posiciones de memoria. A continuación se debe minimizar el número de evaluaciones a efectuar, o sea, lograr un mínimo número de pruebas de condiciones. El método se basa en la localización de las indiferencias de cada regla, siguien do los siguientes pasos:
2.
193
regla con n indiferencias equivale a 2° reglas simples) y rellene el final de cada columna. Por cada condición se calcula un coeficiente sumando los valores calcula dos en I y se registra en una columna a la derecha de la TD; el coeficiente de cuenta mide el número de reglas en que la condición en estudio no interviene (su valor será tanto más importante cuanto menor sea su valor). Se evalúa en primer lugar la condición cuyo coeficiente sea menor. Si existen varias condiciones con una cuenta mínima igual, se elige un nuevo valor (coeficiente) que es el que mide en valor absoluto la diferen cia entre el número de SI y NO que aparecen en dichas condiciones, eligiéndose el de mayor valor absoluto. Si subsiste la igualdad se elige indiferentemente cualquiera de las condi· ciones. Se repite el proceso (pasos I a 4) hasta la última condición.
Sea, por ejemplo una TD de 4 condiciones y 7 reglas con las indiferencias si guientes:
Condiciones
C1 C2 C3 C4
Indiferencias
Coeficientes
R3 R5 R1, R2, R3, R6 R6
4 2
•
2+2+4+4=12
4
Se ~Iige la condición C2 por ser la de coeficiente mínimo. R1
R2
R3
R4
R5
R6
R7
C1
N
S
-
S
S
N
S
4
C2
S
N
S
S
-
N
N
2
C3
-
-
-
N
S
-
N
12
CA
S
N
N
S
S
-
S
4
2
2
4
2
4
Condiciones
Coeficientes
Al evaluar la condición C2 (S y N), la TD se transforma en dos tablas derivadas de la eliminación de la condici,ón C2. La primera tabla contiene las reglas en las que la condición C2 tiene el valor S y la segunda el valor N (las indiferencias tienen los valores doble S y N).
Paso 3 Las evaluaciones siguientes a partir de C2 es para C 1 y C4 por orden de coeficiente (C I para e2 con evaluación N y C4 para evaluación S).
R1
R2
R3
R4
R5
R6
R7
Cl
N
S
-
S
S
N
S
C2 con evaluación S
C2
S
N
S
S
-
N
N
Regla
Coefi cien!e
Condiciones
Indiferencia
Coeficiente
C3
-
-
-
N
S
-
N
N
N
S
S
-
S
C1 C3 C4
4 2+4=6
S
2 4 1 1
R3 R1, R3
C4
R1 R3 R4 RS
Ninguna
O
'ci:::"_'i,." __ú,,,·
A •.
194
TABLAS DE DECISION
METODOLOGIA DE LA PROGRAMACION
El diagrama resultante será
La siguiente condición es C4 (coeficiente O).
s
C2 con evaluación N Regla
Coeficiente
Condiciones
Indiferencia
Coeficiente
R2 R5 R6 R7
2 1 4 1
C1 C3 C4
Ninguna
O 2+4=6 4
R2, R6 R6
1 Cl C3 C4
<>
Rl
R3
R4
R5
Coeficientes
N
-
-
S
N
S N S
S S S
4 6 O
Cl C3 C4
N
s
N
s
La siguiente condición es Cl (coeficiente O).
s
195
N
R1
I
...
Cl C3
R2
R5
R6
R7
Coeficientes
S
S S S
N
S N S
O 6 4
N
-
C3 C4
R4
R5
Coeficientes
I I I I N -
S N
S S
O 2
R2
R5
R7
Coeficientes
I- I I I N
S S
N S
2 O
Paso 4 Y repeticiones (a) Estado S
A partir de C2 se analizarán los dos posibles estados o respuestas S, N. Para C2 con evaluación S se toma la condición C4 ya que los coeficientes y las condiciones son: Coeficientes
C1 - 4 C3 - 6 C4-0
Condiciones
R1 - 2 R2 - 4 R3 - 1 R4 - 1
R6
R3
~
~
C4
C31
Para C2 con evaluación N se toma la condición Cl ya que los coeficientes son: (b)
Coeficientes
C1 - O C3 - 6 C4-4
Condiciones
R1 - 2 R5 - 1 R6-4 R7 -1
I
Estado N
A partir de la condición C4 se derivarán e 1 y de la condición SI, C3 con sus dos estados. De la condición e 1 se derivarán C4 y de la condición SI de C4 la condición e3.
196
TABLAS DE DECISION
METODOLOGtA DE LA PROGRAMACION
197
Para obtener el diagrama de flujo final bastará ir uniendo los diagramas de flujo parciales.
Diagrama de flujo der;vado de C4
N
Diagrama de flujo total
s
N
N
N
Rl
R3
Diagrama de flujo derivado de C1
Rl
.
R3
R2
R6
Las reglas.indicarán las acciones a realizar en cada caso según la TD inicial. La codificación resultante en pseudocódigo será:
N
N
N
R7
R2
R6
si C2 entonces siC4 entonces si C1 entonces siC3
entonces < R5 >
sino
fin_si
sino
fin_si
sino
fin_si
sino
si C1
entonces
198
METODOLOGIA DE LA PROGRAMACION
TABLAS DE DECISION
siC4
entonces
si C3
entonces < R5 >
sino
fin_si sino fin_si sino fin_si fin-si
A2
Ejemplo
Al
Convertir en diagrama de flujo la siguiente TD:
C1 C2 C3
S
N
-
S
N N
-
S
-
N N N A3
A1 A2 A3 A4
X X X X A4
Solución
El orden de las condiciones se realizará por su importancia. En este caso el orden es CI, C2 y C3 ya que ése es el orden en donde más reglas aparecen. Así pues el diagrama de flujo correspondiente será:
199
\)'
200
TABLAS DE DECISION
METODOLOGIA DE LA PROGRAMACION
EJERCICIOS PROPUESTOS
6. Transformar la siguiente TD en un diagrama de flujo. Horas extras Casado Categoría laboral Antigüedad
1. Construir la TD de las decisiones a tomar por un conductor frente a un se
máforo. 2. Construir una TD para la expedición de facturas a los clientes de una empresa de acuerdo con las siguientes hipótesis: a) Los clientes deudores no tienen descuento. b) Si de un artículo se facturan más de 5.000 unidades se realizará un 10 %
de descuento a los artículos del tipo M y un 5 % a los del tipo N. c) Sólo en el caso de los artículos del tipo M, se añadirá al descuento del apartado b un 5 % más si la venta se realizó en la zona de Extremadura y un 3 % más para la zona de Valencia. 3. Realizar una TD que permita la distribución de los pedidos de una empresa y la expedición de facturas, de acuerdo con las siguientes hipótesis. a) Si existe saldo y existencias del artículo solicitado.
• y el pedido es superior o igual al mínimo (1.000) Y el cliente es mayorista, hacer un descuento del 20 %, enviar pedido y factura. • Si el pedido es inferior al mínimo (1.000), facturar sin descuento sea el cliente mayorista o detallista.
b) Si existe saldo pero no hay existencias disponibles suficientes:
• Facturas existencias. • Dejar pendiente de envío el resto del pedido. • No hacer descuento. • Emitir factura.
c) Si no existe saldo.
• Remitir presupuesto del pedido al cliente.
4. Realizar una TD limitada y su equivalente ampliada que indique el salario a pagar a los empleados por cada hora extraordinaria, dependiendo de la categoría del empleado (A o B) y su división (l." o 2."). Hora extra categoría 1," Hora extra categoría 2," División A División B
- 2.500 pesetas - l. 500 pesetas 500 pesetas 250 pesetas
5. Diseñar una TD que permita calcular el salario total a pagar a un empleado de una empresa de acuerdo con las siguientes proposiciones: • Si el empleado está autorizado a realizar horas extraordinarias y ha traba jado durante la semana más de 40 horas, se le debe pagar su salario normal y además el importe de las horas extraordinarias.
Acción Al Acción A2 Acción A3
S S S S
S S S N
S S N S
S S N N
S N S S
S N S N
S N N S
S N N N
N S S S
N S S N
N S N S
N S N N
N N S S
N N S N
N N N S
N N N N
X X X
X X
X
X
X X
X X X X X
X X
201
CAPITULO 7
PROGRAMACION
ESTRUCTURADA
7.1.INTRODUCCION Tras conocer las características que debe tener un programa es necesario seguir una metodología encaminada al cumplimiento de esas características. La metodología de la programación es la técnica que permite que la programación sea lo más eficaz posible en cuanto al desarrollo y mantenimiento. En los capítulos anteriores hemos definido el lenguaje de diagramas de flujo en ordinogramas y algoritmos. Si la complejidad del problema aumenta es nece sario recurrir a técnicas que nos ayuden en la descripción de nuestros organigra mas y fundamentalmente algoritmos.
7.2. PROGRAMACION CONVENCIONAL La realización de un programa sin seguir un método de programación riguro so, aunque funcione, a la larga no será más que un conjunto más o menos grande de instrucciones. La definición de las diferentes etapas adolecen en gene ral de indefinición y falta de continuidad (desarrollo y mantenimiento). La consecuencia inmediata de lo expuesto anteriormente se podría recoger en la siguiente relación de problemas y defectos que suelen tener los progral1)as escritos sin un determinado método. • Los programas suelen ser excesivamente rígidos, presentando probleroas para adaptarlos a las cada día más cambiantes configuraciones. 203
204
METODOLOGIA DE LA PROGRAMACION
• Los programadores gastan la mayoría de su tiempo corrigiendo sus errores. • Los programadores generalmente rehúsan el uso de programas y módulos ya escritos y en funcionamiento, prefiriendo escribir los suyos. La comuni cación entre programadores es muy difícil. • Un proyecto de varios programadores tiene normalmente varios conjuntos diferentes de objetivos. • Cada programador tiene sus propios programas convirtiéndose esta rela ción en algo inseparable. • Las modificaciones en las aplicaciones y programas son muy difíciles de hacer, implican mucho tiempo y elevado coste de mantenimiento. Ello conduce a colocar "parches" que complican cada vez más el diseño inicial o bien a que el programa caiga en desuso y frente al elevado coste de actualización se opte por crear una nueva aplicación que sustituya a la exis tente. • Deficiencias en la documentación: - Descripciones incompletas o escasas. - Ausencia de diagramas. - No actualizada En esencia, los problemas anteriores y otros no citados imposibilitan la evolución y mantenimiento de los programas. Por consiguiente es de suma importancia prever las futuras modificaciones al objeto de mantener los progra mas funcionando correctamente y puestos al día. Estas previsiones se pueden resumir en: - Aumento del volumen de datos y estructuras. - Cambios en la organización de la información. - Cambios debidos preferentemente él la modernización de los documentos y sus formatos. - Sustitución, ampliación o reducción en el sistema de proceso de datos. - Etcétera. Así pues se deben prever las posibles modificaciones mediante la creación de programas con la suficiente flexibilidad que sean capaces de adaptarse a los cambios. Se deben crear programas claros, inteligibles y breves con el objetivo de que puedan ser leídos, entendidos y fácilmente modificados. En resumen, se deben establecer una serie de normas que permitan el paso de una programación artesanal a una programación que permita conseguir una estandarización y en consecuencia una disminución de los costos informáticos, mayor independencia del programador y seguridad de funcionamiento. A la hora de diseñar un programa, éste debe reunir unas características fun damentales: - correcto/fiel: producir resultados requeridos;
PROGRAMACION ESTRUCTURADA
205
- legible: debe ser entendido por cualquier programador, que permita fáciles modificaciones; -
modificable: el diseño nunca es definitivo y por ello su estructura debe permitir modificaciones;
- depurable: debe ser fácil la localización y corrección de errores.
En resumen se debe realizar un programa siguiendo técnicas o métodos es tandarizados que consigan las características anteriores rápida y eficazmente. Las técnicas de programación que permiten seguir una metodología de la programación más empleadas son: - Programación modular
- Programación estructurada
Estas técnicas suelen ser complementarias, ya que el análisis de un problema puede utilizar criterios de programación modular: para dividirlo en partes inde pendientes y utilizar métodos estructurados en la programación de cada módulo.
7.3. PROGRAMACION MODULAR El concepto básico de la programación modular es muy simple, consiste en dividir un programa en módulos. En realidad es un método de diseño que tiende a dividir el problema, de forma lógica, en partes perfectamente diferenciadas que pueden ser analizadas, programadas y puestas a punto independientemente. La división de un problema en módulos o programas independientes exige otro módulo que controle y relacione a todos los demás, es el denominado módúlo base o principal del problema. Realmente la programación modular es un intento para diseñar programas, de forma tal que cualquier función lógica pueda ser intercambiada sin afectar a otras partes del programa. Las ventajas de la programación modular se pueden resumir en los siguientes puntos: a) Un programa modular es más fácil de escribir y depurar (ejecutar, probar y poner a punto). Se puede profundizar en las pruebas parciales de cada módulo mucho más de lo que se hace en un programa mayor. b) Un programa modular es fácil de mantener y modificar. c) Un programa modular es fácil de controlar. El desglose de un problema en módulos permite encomendar los módulos más complejos a los progra madores más experimentados y los más sencillos a los programadores más noveles. d) Posibilita el uso repetitivo de las rutinas en el mismo o en diferentes pro gramas. ;''''"-.~~''--
206
PROGRAMACION ESTRUCTURADA
METODOLOGIA DE LA PROGRAMACION
Los inconvenientes se pueden resumir en: a) No se dispone de algoritmos formales de modularidad, por lo que a veces los programadores no tienen claras las ideas de los módulos. b) La programación modular requiere más memoria y tiempo de ejecu ción. Se podrían sintetizar los objetivos de la programación modular en los siguien tes: -
Disminuir la complejidad. Aumentar la claridad y fiabilidad. Disminuir el coste. Aumentar el control del proyecto. Facilitar la ampliación del programa mediante nuevos módulos. Facilitar las modificaciones y correcciones al quedar automáticamente localizadas en un módulo.
En la creación de los módulos deben cumplirse tres aspectos básicos: descrip ción, rendimiento y diseño. En la descripción se definen las funciones y objetivos del programa. Para obtener el máximo rendimiento se ha de comprobar que el programa realice el proceso aprovechando al máximo todos los recursos de los que dispone. En cuanto al diseño se debe comprobar la estructura que sigue el módulo así como la estructura de los datos y la forma de comunicación entre los diversos y diferentes módulos.
7.3.2. Requisitos de la programación modular Con independencia de las técnicas, los requisitos que debe cumplir la progra mación modular son: a) b) c) d)
7.3.1. Concepto de módulo El concepto de módulo no es único y se pueden dar varias definiciones, aunque tal vez la más acertada sea la siguiente: Un módulo está constituido por una o varias instrucciones físicamente conti .guas y lógicamente encadenadas, las cuales se pueden referenciar mediante un nombre y pueden ser llamadas desde diferentes puntos de un programa. Un módulo puede ser: -
Un programa. Una función. Una subrutina (o procedimiento).
7.3. 1. 1. Características de un módulo Los módulos deben tener la máxima cohesión y el mínimo acoplamiento. Es decir, deben tener la máxima independencia entre ellos. La salida del módulo debe ser función de la entrada pero no de ningún estado interno. En esencia el módulo ha de ser una caja negra que facilite unos valores de entradas y suministre unos valores de salida que sean exclusivamente función de las entradas.
En""",
.1
Mód"'o
l·
Salida
207
Establecimiento de un organigrama modular. Descripción del módulo principal. Descripción de los módulos básicos o secundarios. Normas de la programación.
El organigrama modular se realiza mediante bloques, en el que cada bloque corresponde a un módulo y muestra gráficamente la comunicación entre el módulo principal y los secundarios. El módulo principal debe ser claro y conciso, reflejando los puntos funda mentales del programa. Los módulos básicos deben resolver partes bien definidas del problema. Sólo pueden tener .un punto de entrada y un punto de salida. Si un módulo es complejo de resolver conviene se subdivida en submódulos. Ningún módulo puede ser llamado desde distintos puntos del módulo principal. Las normas de programación dependerán del análisis de cada problema y de las normas generales o particulares que haya recibido el programador.
7.3.3. Clasificación de los módulos Según las funciones que pueden desarrollar cada módulo, éstos se clasifican en: ~.;;....u¡,,;.-....:J...o.
Módulos tipo raíz, director o principal. Módulos tipo subraíz. Módulos de entrada (captura de datos). Módulos de variación de entradas. Módulos de proceso. Módulos de creación y formatos de salidas.
20S
METODOLOGIA DE LA PROGRAMACION
PROGRAMACION ESTRUCTURADA
7.3.4. Técnicas de la programación modular Las fases de la resolución de un problema con programación modular son las siguientes:
• Estudio de las especiflcaciones del problema. En esta etapa las Tablas de Decisión son una herramienta de gran utilidad.
• • • •
Confección del ordinograma o tabla de decisión de cada módulo. Codiflcación de cada módulo en el lenguaje adecuado. Pruebas parciales de cada uno de los módulos componentes. Prueba final de los módulos enlazados.
El diseño de una aplicación con programación modular consiste en la realiza ción de una red de módulos. Existirá un módulo raíz, que se denomina principal o director. Cada módulo sólo puede tener una entrada y una salida que lo enlazan con el módulo principal -incluso habiendo estructuras repetitivas y alternativas dentro de un módulo. La programación modular se basa en el diseño descendente (top-down) que permite comprobar el funcionamiento de cada módulo mediante módulos ya comprobados.
Módulo Rafz
Módulo 1
Módulo 2
~l \ ~ Módulo 10
/
¿~
I
Módulo 7
Módulo 6
Módulo 5
Módulo 8
I/l~ Módulo 11
Módulo 4
Módulo 3
Módulo 12
1
Módulo 9
I Módulo 14
209
El montaje de la red se hace en modo ascendente (bottom-up) por lo que un programador puede estar escribiendo el módulo 11 mientras otro hace lo propio con el módulo 12. Una vez terminados ambos se puede comprobar su funciona miento con un módulo ficticio 7 que llama a ambos. De igual forma se pueden escribir los módulos 10 y 14 al tiempo que los 11 y 12, etc. Los datos que forman parte de un programa modular se dividen en dos grandes grupos: variables internas o locales y variables externas o globales. Las variables internas son utilizadas por un solo módulo y las variables externas por más de un módulo. Los módulos se comunican entre sí por las variables externas que técnica mente son las más importantes en el desarrollo del programa. Los módulos tienen que utilizar las variables bien como referencia o como modificador de su valor.
7.3.5. Criterios de modularización La división de un programa en módulos debe cumplir los siguientes criterios: a) Cada módulo debe corresponder a una función lógica perfectamente dife renciada. b) El tamaño de cada módulo es variable. Deben ser pequeños para que sean claros y de poca complejidad. Las normas varían según las situacio nes. / IBM considera que un módulo no debe superar el número de 50 instrucciones en PL/I; en COBOL un número no superior a 500 instruc ciones, etc. Como norma general práctica se puede considerar el tamaño máximo de un módulo como una página de listado de impresora. c) Evitar variables externas. d) Procurar no utilizar demasiados niveles de modularización para evitar complejidad de la red. e) Estructura de caja negra para cada módulo (la salida debe ser función exclusiva de la entrada). Las técnicas de programación modular no aportan nuevos conceptos desde el punto de vista de proceso de la información sino más bien un método o filosofía para la descomposición idónea de un problema en problemas o módulos más sencillos. Como ya se ha comentado en apartados anteriores se pueden utilizar criterios de programación modular y posteriormente utilizar métodos de programación estructurada dentro de cada módulo independiente. Una vez terminado el diseño de los programas de cada módulo realizar el montaje del programa completo mediante un diseño ascendente.
7.4. PROGRAMACION ESTRUCTURADA Módulo 13
w~""'"'
.....,.. . . . . . , ....
En el apartado anterior se ha visto cómo la programación modular es m'ás bien una filosofía de programación en la que se dan una serie de consejos para v;".~
', .•:':"".IlJ","""",,,,,,,•. _o,._.
210
METODOLOGIA DE LA PROGPAMACION
la realización de programas por descomposición en módulos. Sin embargo, para programar cada módulo es necesario aplicar las ténicas clásicas de diseño de ordinogramas o algoritmos yen realidad no se introduce ninguna norma o regla nueva. En las sucesivas fases de confección de un programa sabemos que la depura ción y puesta a punto junto con el mantenimiento continuo constituyen uno de los problemas más graves con que se enfrenta el programador, la comunica ción. Tras finalizar un programa se ha de proceder a comprobar su buen funciona miento. Normalmente se prueban con un conjunto de datos de ensayo y se analizan los resultados. En función de la bondad y exactitud de estos últimos el programa se da por bueno o se concluye con la evidencia de la existencia de errores. No obstante los datos de ensayo no' demuestran la ausencia de errores. La validez real de un programa sólo se podría dar haciendo una prueba exhaustiva con todo el rango posible de valores de entrada, cosa realmente imposible en la mayoría de los casos. Por otra parte, como ya se comentó anteriormente la comunicación usuario/máquina no sólo se manifiesta en la fase de depuración del programa sino también en la fase de mantenimiento. Un programa normalmente debe ser modificado cada cierto tiempo y en muchas ocasiones las modificaciones han de ser realizadas por terceras personas que no intervinieron en su diseño. Un mal desarrollo de un programa lleva a la falta de fiabilidad y pérdida de eficiencia considerables así como a una disminución de la flexibilidad y por cons~uiente la documentación de los programas. Para aumentar la eficiencia de la programación y el mantenimiento se necesi ta dotar a los programas de una estructura. Las razones para ello no sólo es el aumento de fiabilidad y eficiencia sino también asegurar que los programas sean adapíables, manejables, fácilmente comprensibles y transportables. A estas con diciones se les suele añadir la claridad y simplicidad. A medida que la tecnología electrónica ha ido avanzando las máquinas se han ido haciendo más rápidas, y el postulado que pervivía en la década de los años 60 e inclusive de los 70 en el que el programador debía arañar tiempo de ejecución recurriendo a trucos de programación, ha ido dejando de tener peso y hoy día se buscan programas claros en su estructura, ,adaptables, trans portables -posibilidad de pasarlos de una máquina a otra- y simples. La hora de programador se ha elevado en coste considerablemente y si a eso se le une que las posibles modificaciones en un programa pueden producir la pérdida de claridad del mismo, es preciso realizar el programa con técnicas de programación estructurada que permitan aumentar la eficiencia de la progra mación y su mantenimiento.
7.4.1. Conceptos básicos Los primitivos propósitos de la programación estructurada dirigían sus es fuerzos a buscar modos de minimizar la probabilidad de error en el proceso de ~ ..~-...
- l¡b'.
1ií'~:' ,
PROGRAMACION ESTRUCTURADA
211
programación. El factor humano es una de las fuentes más importantes en la comisión de errores. Uno de los objetivos de la programación estructurada es la minimización del error humano. Aunque al profesor Edgar W. Dijkstra de la Universidad de Eindhoven se le considera el padre de la programación estructurada, muchos otros investigado res han trabajado en su desarrollo y de elIos podemos citar a Hoare, Wirth, Knuth, Dahl, Bohm, Jacopini, Warnier, etc. Es difícil dar una definición de programación estructurada por no existir generalmente una definición que sea aceptada a todos los niveles. Podríamos por ello enunciar la programación estructurada (PE) como una técnica de cons trucción de programas que utilizan al máximo los recursos del lenguaje, limita el conjunto de estructuras aplicables a leer y presenta una serie de reglas que coordinan adecuadamente el desarrollo de las diferentes fases de la programa ción. Aunque como decíamos antes la definición anterior es una de las que más hemos visto escritas, son diferentes las definiciones que se podrían hacer, sin embargo con lo que sí hay un acuerdo casi total es que la programación estructu rada utiliza en su diseño los siguientes conceptos o principios fundamentales recogidos esencialmente en la definición anterior: - Estructuras básicas. - Recursos abstractos. - Diseño descendente "arriba-abajo" (top-down). ,/
7.4.2. Estructuras básicas de control Como ya se comentó en el Capítulo 4 el Teorema de la estructura (o antiguo teorema de Bohm y Jacopini, 1966) demostró que cualquier programa cofr un solo punto de entrada y un solo punto de salida puede resolverse con tres únicos tipos de estructuras de control: - Secuencial - Alternativa - Repetitiva De aquí parte la célebre frase de Dijkstra: la estructura GOTO es perjudicial para la programación. Aunque en el Capítulo 4 ya se estudiaron las estructuras de control, volvere mos de nuevo a enunciarlas, sobre todo pensando que este libro si bien ha sido concebido como un curso de introducción a la programación, algún lector o profesor preferirá utilizarlo como consulta o apoyo a sus clases sin ceñirse a seguir el orden lógico de su contenido.
7.4.2. 1. Estructura secuencial Una estructura secuencial es aquella que ejecuta las acciones sucesivamente unas a continuación de otras sin posibilidad de omitir ninguna y naturalmente, sin bifurcaciones. Todas estas estructuras tendrán una entrada y una salida.
212
PROGRAMACION ESTRUCTURADA
METODOLOGIA DE LA PROGRAMACION
Si las acciones son al' a2, Ordinograma
•••
an , la representación secuencial sería:
Algoritmo (español)
Inglés
Inicio
Begin
Acción al
Acción al
Acción a2
Acción a2
Acción al
213
7.4.2.2. Estructura alternativa Es aquella estructura en la que únicamente se realiza una alternativa -una determinada secuencia de instrucciones- dependiendo del valor de una deter minada condición o predicado. Las estructuras alternativas también llamadas condicionales pueden ser de tres tipos: - Simple
- Doble
- Múltiple
Acción a2
Acción an
Acción an
Fin
I
Acción an
End
I
Estructura alternativa simple
Son aquellas en que la existencia o cumplimiento de la condición implica la ruptura de la secuencia y la ejecución de una determinada acción. Algoritmo (español)
Ordinograma
Si j condición 1 Inicio
Entonces 1acción 1
Un ejemplo de un programa que sólo contiene estructura secuencial es el siguiente: Cálculo de la suma de dos números cualesquiera. Ordinograma
Fin_si
Algoritmo
Algoritmo No
Inicio
Inicio
If 1condición 1 Then 1acción 1
Leer números A, B Sumar S = A + B
(in~lés)
End-if
Sí
Escribir S
Fin
Acción A
S=A+B
Estructura alternativa doble
Es aquella que permite la elección entre dos acciones o tratamientos en función de que se cumpla o no determinada condición. ,,,,'.tL:\je.:.;i~~Í~a.i.,~••Js_=__~,,-.
214
METODOLOGIA DE LA PROGRAMACION
PROGRAMACION ESTRUCTURADA
Algoritmo (español)
Ordinograma
Si 1condición 1 Entonces 1acción .A ,1 Si-no 1acción A 2 1 Fin_si
215
Esta estructura puede seleccionar n acciones según sea el valor que toma la variable de control. Otras representaciones algorítmicas utilizadas pueden ser: Según-sea 1variable I
Caso_de 1variable 1
Algoritmo (inglés) Acción Al
Acción A 2
If !cond¡(;ión I Then 1acción A{1 Else lacción A 2 l End_if
Opción ¡variable I de
Otros fin_opción
Estructura alternativa múltiple Las estructuras alternativas múltiples se adoptan cuando la condición puede tomar n valores enteros distintos: 1, 2, 3, ... n. Según se elija uno de estos valores en la condición se realizará una de las n acciones (cada vez sólo se ejecuta una acción). Esta estructura propuesta por HOARE, es la case del lenguaje Pascal o CASE de los BASIC estructurados. En lectura algorítmica en castellano se suele utilizar Según, Según sea, Caso de, Opción. Nosotros adoptaremos el convenio Según. Algoritmo (español)
Ordinograma
Según 1variable 1 1acción A, 1condición1condición1acción A 2
11 : 21 :
1condición-3j : 1acción A 3
• !condición-nI: ¡acción Anl Otros : 1acclon Sx I Fin_según
Algoritmo (inglés)
Inl
(xl
Case
7.4.2.3. Estructuras repetitivas Las estructuras repetitivas o iterativas son aquellas en las que las acciones se ejecutan un número determinado de veces y dependen de un valor predefinido o el cumplimiento de una determinada condición. Las estructuras repetitivas permiten representar aquellas acciones que pue den descomponerse en otras subacciones primitivas. Una iteración es el hecho de repetir la ejecución de una secuencia de acciones o de una acción. Un bucle o lazo es"el conjunto de acciones iterativas. Para describir una iteración, si se conoce el número n de repeticiones, se puede es~ribir simplemente n veces la acción o secuencia de acciones a repetir. Sin embargo si n es grande las operaciones anteriores pueden resultar tediosas y la secuencia algorítmica difícil de leer. Con frecuencia es difícil determinar el número de repeticiones. En consecuencia es preciso disponer de estructuras algorítmicas que permitan describir una iteración de forma cómoda. Las tres estructuras más usuales dependiendo de que la condición se encuentre al principio o al final de la iteración son: - Estructura Mientras
- Estructura Repetir-hasta
- Estructura Para (Desde-hasta)
Estructura Mientras
end_case
El bucle Mientras determina la repetición de un grupo de instrucciones mientras la condición se cumpl~ inicialmente. •_.:.. ;/:f[ff'·;"&l '&W'-":";'~......
216
PROGRAMACION ESTRUCTURADA
METODOLOGIA DE LA PROGRAMACION
Estructura Para
Algoritmo
Ordinograma
La estructura Para es aquella que se repite un número fijo de veces, n:
Mientras I Condición 1 Hacer
Algoritmo
Fin-mientras No
I
Para ¡variable 1de valor i a valor f incremento inc
hacer ¡acciones 1
'1
Fin_para
Evaluar condición
sr
217
falso
El incremento puede ser positivo como el caso anterior o negativo. Para ¡variable 1de valor i a valor f incremento dec
hacer ¡acciones 1
1
cierla
Acción
Fin-para
ejecutar acción
En ambos casos,
Esta estructura se conoce normalmente como DOWHILE. Existe otra estructura en la que el número de iteraciones o repeticiones del grupo de instrucciones se ejecuta hasta que la condición deje de cumplirse. Esta condición se cumple al final.
variable valor i valor f inc dec
=
= =
= =
variable de control valor inicial de la variable valor final de la variable valor positivo del incremento (expresión) valor negativo del decremento (expresión)
Nota: La representación de la estructura para suele también ser la siguiente:
Desde ¡variable 1= valor i Hasta valor f incremento inc
11
1
Repetir ¡accionesl
Acciones
Hasta que ¡condición 1
• ~ 1
ejecutar ¡acciones 1 evaluar ¡ condición 1 Sí
cierto No
falso
Esta estructura se conoce también como DOUNTIL.
./
7.4.3. Recursos abstractos La estructuración debe cumplir el uso de recursos abstractos. El proceso de realización de diferentes pasos hasta encontrar la solución de un problema es un proceso abstracto. Diseñar o concebir un problema en términos abstractos consiste en no tener en cuenta la máquina que lo va a resolver así como el lenguaje de programación que se va a utilizar. Esto lleva consigo la obtención de un conjunto de acciones que se han de realizar para obtener una solución. Al considerar un algoritmo y los cálculos que incluyen, se hace abstracción de los valores específicos. Igualmente el concepto de variable implica una abs tracción cuando se da un nombre a una operación determinada, y se utiliza considerando lo que hace pero sin preocuparnos de cómo lo hace. Tras encontrar la solución adecuada mediante el ordinograma o el algorit mo, se analiza esta solución con la computadora y el lenguaje de programación que se van a utilizar, a fin de comprobar si las diferentes acciones son suscepti
218
METODOLOGIA DE LA PROGRAMACION
PROGRAMACION ESTRUCTURADA
bIes de ser ejecutadas por la máquina tal y como han sido concebidas; si eso no fuera posible, será preciso descomponer las acciones en otras subacciones más elementales, continuándose el proceso hasta que cada subacción pueda ser codificada en el lenguaje elegido y por consiguiente ejecutado en la compu tadora del usuario.
7.4.4. Metodología descendente "arriba-abajo" La metodología o diseño descendente (top-down), también conocida como arriba-abajo consiste en establecer una serie de niveles de menor o mayor com plejidad (arriba-abajo) que den solución al problema. En esencia consiste en efectuar una relación entre las etapas de la estructuración de forma que una etapa jerárquica y su inmediatamente inferior se relacionen mediante entradas y salidas de información. U n programa estructurado tiene una representación en forma de árbol.
219
La marcha analítica de un proceso descendente estaría basada en dos caracte rísticas esenciales: representación en forma de árbol y descomposición funcional. El diseño se basa en la realización de diferentes niveles. El primer nivel resuelve totalmente el problema y el segundo y sucesivos niveles son r('finamientos sucesi vos del primero (stepwise) y se sigue siempre la metodología de recursos abstrac tos. Si el diseño y planteamiento es correcto nunca será preciso volver atrás ya que los niveles anteriores al que se esté situado en un momento dado ya habrán resuelto el problema en su totalidad.
7.5. DISEÑO DE PROGRAMAS ESTRUCTURADOS La realización del diseño estructurado de un programa se basa en la aplica ción de los siguientes conceptos: - Ir de lo general a lo particular, descendiendo en la estructura del programa y en su nivel de detalle. - De la definición inicial del problema se pasa a un esquema de algoritmo descrito en pseudocódigo. - Independencia inicial del lenguaje. - Diseño por niveles, dejando los detalles para niveles posteriores. Verificar en cada nivel el esquema correcto. - Finalizar con un trabajo de recomposición del algoritmo completo.
,¡
Es conveniente -no imprescindible- que el lenguaje de programación empleado soporte las estructuras básicas mencionadas; este es el caso de Pascal, FORTRAN 77, True BASIC, ANSI BASIC, etc. Si el lenguaje no soporta las estructuras típicas -no es estructurado- se debe codificar pór traducción ade cuada, es decir, simular las estructuras que no posea. Ejemplo Si en BASIC no se posee la estructura WHILE (Mientras-hacer) una codifica ción simulada sería:
a) Caso de que la condición sea verdadera. 100 110 120 130
REM ** estructura Mientras ** IF condición THEN:-J30 GOTO 210 REM ** Hacer **
1
200 GOTO 100
210 REM ** Fin de Mientras **
"
-~"",.,,:.b-.
"
'f;zt~.",_,.,
l'
's.'k- #"..$<
220
METODOLOGIA DE LA PROGRAMACION
PROGRAMACION ESTRUCTURADA
221
b) Caso de que la condición sea falsa. M
100 110 120 130
M
REM ** estructura Mientras ** IF condición THEN 120 GOTO 210 REM ** Hacer **
200 GOTO 100 210 REM ** Fin de Mientras ** "
.
I
p
N
7.6. METODOS DE PROGRAMACION ESTRUCTURADA
N
Secuencial
Repetitiva
Existen diferentes métodos de programación estructurada. Entre los más conocidos se encuentran: Jackson, Bertini y Warnier. M
7.6.1. Método Jackson Esta metodología creada por el inglés Michael Jackson se basa en que la estructura de un programa está en función de la estructura de los datos que manipula. Jackson emplea módulos según un orden jerárquico dentro de los diferentes niveles donde se encuentra. Cada módulo es un dato o conjunto de datos. Las estructuras básicas en este método vienen representadas en la Figura 7.1 Yson las siguientes: I
p
N
- SecuenL:{al: Un número determinado de módulos se ejecutan una sola vez en el orden jerárquico preestablecido. - Repetitiva: Un módulo se ejecuta desde cero hasta n veces. El proceso repetitivo se indica con un asterisco (*). - Alternativa: Se selecciona para la ejecución un módulo entre varios posi bles. El proceso se indica por medio de una letra O.
Con estas estructuras básicas se puede obtener cualquier otra que intervenga en el diseño del programa. El uso del método de Jackson supone lectura arriba-abajo y de izquierda a de recha. Los pasos a seguir para resolver un determinado problema siguiendo esta metodología son: l. Establecer o definir los datos de entrada y salida (resultados). 2. Creación de la estructura del programa a partir de las diferentes estructu ras de los datos.
o
o
o
o Q
R
Alternativa
Figura 7.1.
Estructuras básicas del método de Jackson.
3. Utilizar los recursos que posee el método para conseguir los resultados. 4. Escribir el pseudocódigo y codificar. Ejemplo: Realizar por el método de Jackson el diagrama de flujo que impri me los números máximo y mínimo de una serie de números introducidos por teclado hasta encontrar el número 99, debiéndose imprimir un mensaje si el número introducido no cumple la condición prevista'. El organigrama conven cional es el de la Figura 7.2.
'-'.'r-~"
222
PROGRAMACION ESTRUCTURADA
METODOLOGIA DE LA PROGRAMACION
223
Por consiguiente el organigrama aplicando el método Jackson podría ser:
Introducir número
o Número CFin
= 99
)
o
Imprimir mayor menor
Mayor = número
Número> Mayor
o Mayor = Número
Número < Menor
Menor = número Menor = Número
Imprimir error
Figura 7.2.
Los resultados o datos de salida que se buscan son:
7.6.2. Método Bertini
- Imprimir número mayor y número menor. - Imprimir error.
La metodología Bertini consiste en la descomposición de un problema en niveles, teniendo cada uno de ellos un inicio, un conjunto de procesos y un fin. Esta metodología representa la estructura de los programas y no las operacio nes del tratamiento. Las diferentes estructuras se representan en la Figura 7.3. Según Bertini las instrucciones se ejecutan de derecha a izquierda pero el programador puede leerlo al revés si le resulta más cómodo.
Los módulos podrían ser: MAYOR = valor MENOR = valor ERROR -\1..; ,
"c
._.~,._,~
224
METODOLOGIA DE LA PROGRAMACION
PROGRAMACION ESTRUCTURADA
226
El diagrama de flujo del problema anterior de obtención del máximo y mínimo de una serie de números, aplicando este método sería el siguiente:
Inicio
programa
Fin programa
Secuencial Fin programa
Secuencia intermedia
Fin
Repetitiva
Inicio programa
Inicio
Alternativa
Fin
7.6.3. Método Warnier Inicio
Fin
I
I
Fin
Alternativa
Repetitiva
Figura 7.3.
Estructuras básicas.
Se basa en una metodología matemática que establece un único lenguaje de comunicación entre usuarios, analistas y programadores, lo que permite la com prensión de forma sencilla por cualquier programador. La representación de cualquier proceso se puede hacer mediante llaves. , El método se basa en la descomposición por niveles del problema. En cada nivel se detallan los tratamientos que permiten la resolución del problema plan teado. Las estructuras utilizadas son conceptualmente idénticas a las de Jackson si bien su representación varía.
226
PROGRAMACION ESTRUCTURADA
METODOLOGIA DE LA PROGRAMACION
227
Los pasos a seguir en esta metodología son:
Secuencial Repetición
Programa
I
:-J
Inicio (ejecución 1 vez) Proceso (n veces)
Inicio
Fin (1 vez)
I
Alternativa
Inicio
(1 vez) Proceso A (0-1 vez) Proceso B (0-1 vez) Final
{ Proceso B
Proceso A
I
Final
I
•
l. Estudio de los datos de salida. 2. Estudio de los datos de entrada teniendo en cuenta la organización de los datos en el fichero lógico de salida y analizando las posibles fases de trata miento. 3. Cuadro sinóptico o de descomposición formado a partir de la estructura de los datos de entrada, salida y del tratamiento. 4. Diagrama de flujo y lista de instrucciones. El diagrama se obtiene de forma automática del cuadro sinóptico y su uso puede no ser imprescindi ble. La lista de instrucciones, su orden de ejecución, produce en casi su totalidad la escritura del programa con independencia del lenguaje.
APENDICE
CODIFICACION
DE LAS ESTRUCTURAS
BASICAS
• ADA • ALGOL • BASIC
• C
i
J1~'·T"_
• • • •
COBOL FORTRAN PASCAL PL/I
APENDICE. CODIFICACION DE LAS ESTRUCTURAS BASICAS
Ejemplo: EVALUATE L1BRERIA,CLlENTE,TITULO WHEN 1 THRU 5,1 THRU 20,ANY WHEN 6 THRU 7,1 THRU 20,NOT AS WHEN 8 THRU 10 ANY,ANY WHEN OTHER
PERFORM PERFORM PERFORM PERFORM
231
GIRO 1 GIR02 GIR03 GIR04
END-EVALUATE
ESTRUcrURAIF
PASCAL, PLjI Y ALGOL
COBOL Formato: IF exp. lógica [THEN]
l
[{ ELSE OTHERWISE
{Sentencia NEXT SENTENCE
{Sentencia NEXT SENTENCE
l]
Formato: IF expr. lógica THEN sentencia [ELSE sentencia] BEGIN IFA = O THEN IF B = O THEN WRITELN ('SOLUCION INDETERMINADA') ELSE WRITELN ('SOLUCION IMPOSIBLE') ELSE...
l
[.]
Ejemplo: IF DELTA < O
DISPLAY "SOLUCION IMAGINARIA"
ELSE IF DELTA = O
DISPLAY "SOLUCIONES IGUALES"
ELSE COMPUTE RAIZ = .
ADA Formato: if expresión lógica then sentencia; [elsif expresión lógica then sentencia;] [else sentencia;] end if;
o también
IF K < A ANO (C > J)
PERFORM RUTINA-1 ELSE IF (K = A) OR (C = J) PERFORM ... ELSE ...
COBOL estructurado
Formato: EVALUATE
identificador expresión TRUE FALSE
j
Ejemplo: IF CIUDAD = MADRID THEN
DISTANClA: = DISTANCIA+200;
ELSIF CIUDAD = ZARAGOZA THEN
DISTANCIA: = DISTANCIA+300;
ELSE DISTANCIA: = O END IF;
¡
"C" Formato: if (expresión lógica) sentencia;
[elsif (expresión lógica) sentencia;] [else sentencia;]
[.......... ]
J
Ejemplo: if (R = 40)
WHEN objeto-selección sentencia [WHEN OTHER sentencia] [END-EVALUATE]
if (DELTA = O) K = O; else K = DELTA;
230 ~:,L
APENDICE. CODIFICACIQN DE LAS ESTRUCTURAS BASICAS 232
METODOLOGIA DE LA PROGRAMACION
Ejemplo: IF A > B THEN 400 IF A > B GOTa 400
ALGOL 68 Formato: if condición then sentencia elSe if condició~J sentencIa [
Formato:
sentencia-etiqueta IF expresión lógica THEN \ sentencia [: sentencia...]
fi fi
sentencia-etiqueta
Ejemplo: if ROMBO < O then PRINT (("SOLUCION NEGATIVA ")) else if ROMBO = O then PRINT (("SOLUCIONES IGUALES"))
else
IJ
[ ELSE \ sentencia [: sentencia ...] Ejemplo: IF M < O THEN N=5 : M=7 : N= 15 ELSE N = 5 : M=14 : N=4
if ...
fi
fi
fi
ESTRUcrURA CASE
FORTRAN PASCAL Formato: IF (expresión aritmética) etiqueta 1, etiqueta2, etiqueta3
IF (expresión lógica) sentencia Ejemplo:IF (pESO.Ea.1.AND.STAIV.GT.1)M = k * 8 IF(K.GT.500)GOTO 500
Formato: IF (expresión lógica) THEN sentencia
[ELSE IF (expresión lógica) THEN sentencia] [ELSE sentencia] ENDIF
Formato: case expresión OF
C1: sentencia 1;
C2: sentencia2;
Cn: sentencian;
end
Ejemplo: case Notas of
1,2,3 :N:=N+3
4 :N:=(N-2)*Q;
5,9 :N:=N+Q;
10,14 :N:=N*Q;
Ejemplo: IF (A.GT.O) THEN PAUSE 999 ELSE N = N * 30 ENDIF
end
case MARCA of
BASIC Formato:
IF (expresión lógica)
{THEN } GOTa sentencias (números o etiquetas) GOSUB
'SANYO' : DESCUENTO:=0.10;
'SONY' : DESCUENTO:=0.20;
'PIONNER' : DESCUENTO:=0.05;
'MARCONI': DESCUENTO:=0.15;
end
1
233
234
APENDICE. CODIFICACION DE LAS ESTRUCTURAS BASICAS
METODOLOGIA DE LA PROGRAMACION
"C"
Ejemplo: SHECT (MARCA); WHEN (MARCA='SEAT') DESCUENTO=0.12; WHEN (MARCA='OPEL') DESCUENTO=0.10;
Formato: switch (expresión entera) I
case constante: sentencia;]
OTHERWISE CALL SALIDA; END;
~
[default:sentencia]
1
Ejemplo: switch (var) I
case '1':
case '2':
case '3':
n=(K+5); case' 4' :n=(K-4)-j; case '5': case '7' :n=j+k; case '10' :n=j-k; default:break;
1
ADA Formato: case expresión is
when valor [1 valor ...] => sentencia;
when others = > sentencia; end case;
Ejemplo: case MARCA is when SEAT => DESCUENTO:=0.12; when OPEL=> DESCUENTO:=0.15; when FORD => DESCUENTO:=0.08; when RENAULT = > DESCUENTO:=0.10; when others = > PRINT MENSAJE("NO SE VENDE ESA MARCA"); end case;
PLjI Formato: SELECT (expresión);
WHEN (expresión) sentencia; [WHEN...]
OTHERWISE sentencia;
END;
ESTRUcrURA DOWHILE PASCAL Formato: WHILE condición DO sentencia Ejemplo: WHILE BRAVO> O DO
BEGIN
\R1 :=(-B+M)j(2-N);
R2:=(-B-M)j(2-N);
END;
ALGOL 68 Formato: while condición
do
sentencia od
"C" Formato: while (expresión)
sentencia
ADA Formato: while (condición) loop
sentencias;
end loop; Ejemplo: while parcial/=demo parcial loop
total:=total+campo;
end loop;
235
236
METODOLOGIA DE LA PROGRAMACION
APENDICE. CODIFICACION DE LAS ESTRUCTURAS BASICAS
PLjl
Ejemplo: DOWHILE (N.GT.M)
DISCRIMINANTE=B**2-4*A*C
IF (DISCRIMINANTE.GT.O)
THEN R1=(-B+SORT(DISCRIMINANTE))/(2*Al R2=(-B-SORT(DISCRIMINANTE))/(2*Al ENDIF
Formato: DO WHILE (condición)
sentencia
END;
COBOL
ENDDO
Formato: PERFORM nombre procedimiento [THRU nombre procedimiento] UNTIL (NOT condición)
PERFORM WITH TEST
¡
AFTER
1
BEFORE
UNTIL [NOT] condición
sentencia
END-PERFORM
ESTRUcrURA DOUNTIL PASCAL
Ejemplo: PERFORM WITH TEST BEFORE
UNTIL (DISCRIMINANTE < O) R1=(-B+DISCRIMINANTE**0.5)/(2*Al R2=(-B-DISCRIMINANTE**0. 5)/(2* A) END-PERFORM
Formato: REPEAT sentencia: [sentencia:.. .]
UNTIL expresión lógica
Ejemplo: NUMFIN: =0;
TOTAL: =0;
REPEAT
BEGIN READLN (NUMERO); TOTAL:=TOTAL+NUMERO , NUMFIN:=NUMFIN+ 1 END; UNTIL EOF; MEDIA: =TOTAL/NUMFIN;
BASIC Formato: WHILE condición
sentencia
WEND
FORTRAN Formato: En las versiones antiguas de FORTRAN no existe la estructura
DOWHILE y se debe simular. 1 IF (.NOT.(EXPERL)) GOTO 2
"C" Formato: do
sentencias
while (expresión);
sentencias
GOTO 1 2 CONTINUE
En las versiones más recientes
DOWHILE (expresión lógica)
sentencia ENDDO
PLjI Formato: DO WHILE (condición)
sentencia
END;
237
'rfi7 238
APENDICE. CODIFICACION DE LAS ESTRUCTURAS BASICAS
METODOLOGIA DE LA PROGRAMACION
"C"
COBOL
Formato: goto etiqueta
Formato: a: PERFORM nombre procedimiento [THRU nombre procedimiento]
WITH TEST AFTER UNTIL condición b: PERFORM WITH TEST AFTER UNTI L condición
sentencia
END PERFORM
\
FORTRAN Formato: GOTO {ent~ro } varJable
, COBOL
FORTRAN
Formato: GO TO nombre procedimiento
Formato: 1 CONTINUE
..... sentencias
PL/l
IF (.NOT.(EXPRL)) GOTO 1
Formato: GOTO
{eti~ueta} varJable
ADA PASCAL
Formato: exit [nombre bucle] [when condición]
Formato: goto etiqueta
FORTH Formato: BEGIN sentencia condición UNTIL
SALTOS CONDICIONALES SALTOS INCONDICIONALES FORTRAN
BASIC
Formato:
Formato: GOTO número de línea
a) GOTO (etiqueta 1, etiqueta2, .,. etiquetan) ,N
ALGOL 68 Formato: Goto etiqueta
ADA Formato: goto etiqueta
~¡
N=J-L
GOTO(10,20,30,60),N
10 I=I*N
GOTO 100
20 1={I*N)-5
GOTO 100
30 .....
239
240
METODOLOGIA DE LA PROGRAMACION
APENDICE. CODIFICACION DE LAS ESTRUCTURAS BASICAS
b) GOTO N.(etiqueta t etiqueta2, ... etiquetan) ASSIGN 2 TO N
PL/l Formato: DO variable control= valor inicial [,valor inicial... ]
[BY incremento](TO valor fina~
[WH ILE ( expresión lógica)]
sentencias ENO;
GOTa N,(l ,2,3,4)
1 I=I*N
GOTa 100
2 1=(I*N)-5
GOTa 100
3 . 4 ..
ALGOL Formato: for variable contro/:= valor inicial step paso
until valor final
do sentencia;
100 PRINT 45,N
Ejemplo: for N:=l step 1 until 20 do
if A I O then 1:=1+ 1;
BASIC Formato:
ON expresión
¡ I
THEN GOTO GOSUB
nl'n 2 ,n3 ,
PASCAL ...
Ejemplo: ON N GOTO 100,200,300,40
Formato: for variable control:=valor inicial
to
valor final downto
do sentencia
COBOL ADA Formato: GO TO etiqueta 1[,]etiqueta2[,] ... etiquetan
OEPENOING ON. identificador
INTERACCION GENERAL/BUCLES REPETITIVOS BASIC Formato: FOR variable control=valor inicialTO valor final
[STEP incremento]
..... sentencias
NEXT variable de control Ejemplo: FOR 1= 1 TO 100 STEP 4
PRINT 1*4
NEXTI
Formato: for variable control in [reverse] ..intervalo discreto
sentencias
while condición
Ejemplo: for M in 1... 15 loop
if A(I) > Othen 1:=1+ 1;
endif
end loop;
ALGOL 68 Formato: for variable control [from valor inicia~[by paso]
[to valor fina~
[while condición]
do
sentencias od
241
;~:f!
! " ~
,~
f'
"
'1"
242
METODOLOGIA DE LA PROGRAMACION
"
.....
~,
'
7t
\
, 1
"c"
,1"
Formato: for ([valor variable]:[condición]:[paso]) sentencias;
FORTRAN Formato: DO etiqueta variable control= valor inicial valor final, [incremento] Ejemplo: DO 10 N= 1,8 10 TOTAL=TOTAL+IMPORTE(K)
"~;
'11'" It;,
REFERENCIAS
BIBLIOGRAFICAS
Idioma castellano
BIONDI y CLAVEL: Introducción a la programación. tomos 1 y 2, Masson, 1985. CEDED: Estructura de la Injimnación, 1985. CEDED: MelOdologla de la programación, 1985. ECe: Análisis ir¡rormático, tomos 1, 2, 4, 6, Barcelona, 1985, ECe: Programación de Ordenadores, tomos 1 a 5, Barcelona, 1985. GALÁN PASCUAL: Programación con el lenguaje COBOL, 3." edición. Paraninfo, 1985. GALÁN PASCUAL: Programación y práctica con el Sinclair QL, Paraninfo, 1985. HURTADO MELERO: Informática I (Tomos, I y 2), Escuela Universitaria de Informática, Universidad Politécnica de Madrid. JaYANES AGUILAR: Programación BASIC para microcomputadoras, 2. a edición, McGraw Hill, 1986. LEVIS-SMITH: Estructura de daws, Paraninfo, 1985. LUCAS, M., PEYRIN. J. P.. YSCHOLL, P. c.: Algorítmica y representación de datos, Masson. 1985. MARTÍNEZ/AMELLER: Metodologia de la programación, Ed. Ferre Moret, 1985. NCR: Programación estructurada. SANCHIS y GALÁN: Compiladores. Teona y Construcción, Paraninfo, 1986. VAQUERO Y JaYANES: Informática. Glosario de términos, McGraw-Hill, 1985. VERZELLO, RWTER III: Procesamiento de datos, McGraw-Hill, 1983. VIRGOS: Técnicas y elementos de programación, Gustavo Gili, 1985. WIRTH: Algoritmos + Estructuras de datos = Programas. 6. a reimpresión, Ediciones del Castillo, 1986. WIRTH: Introducción a la programación sistemática, El Ateneo, Buenos Aires, 1984. WIRTH: PASCAL. Manllal delllsllario e informe, El Ateneo, Buenos Aires, 1985. Otros idiomas
BOUSSARD, J. c., y MAHL. R.: Programmation avancée: algorithmique et struceures de données, Eyrolles, 1983. CORALLO, M., y PROSCIUTTI, A: Principi di programmazione, BufTeti Editare, 1985. COULOMBE y YOUNG: La programmation structureé en BASIC, Turgeón. 1986. GOLOSTEIN: Computers and their applications, Prentice Hall. 1986. LINZ, PETER: Programming Concepts and Problem Solving, Benjamín Cumming, 1983. WIRTH: Algorithms and Data Structures, Prentice Hall, 1986. WOODHOUSE, JOHNSTONE. DOUGLAS: Computer Science, Wiley Sons, 1982. 243
~I'
INDICE
A
"
Acción, 1-2
Acumulador, 100
t Algoritmos, 1-3,45
caracteósticas, 3
definición, 2
resolución/codificación, 68
Análisis, 11,45
Analista, II
ANSI, 15
Arboles, 163-167
binarios, 164-165
definición, 163
recorrido, 166
Arrays, 146
Atomo,151
Asignación, I
sentencias, 89
B
Begin, 212
Bifurcaciones, 103-108
anidadas, 107
condicionales, 104
incondicionales, 105-106
BNF,49-50
Boolean, 7, 8
Bubblesort, 110
Bucle, 78, 92-100
infinito, 92
sin fin, 92
C
,J
Campos, 151
Campos de memoria, 91
Case, 126-127,212-213,233-235
Ciclo, 78
Codificación, 12,45
estructuras básicas, 229
Colas, 153
Compilación, 60-62
Compiladores, 59-62
Conmutadores, 108-109
Constantes, 6, 84-85
boolean, 6, 84
carácter, 6, 84-85
entera, 6, 84
real, 6, 84-85
Contadores, 96-100
cos, 118
D
Datos, 3,4, 138,143
clasificación, 144
estructura, 143,144
manipulación, 139-142
245
.
246
'¡
INDICE
no numéricos, 4
alfanuméricos, 5
entrada, 67
lógicos, 5
DEF FN, 118
desde-hasta, 131
Diagramas de flujo, 11-12, 14-28
comprobación, 37
estructurados, 31-35
inconvenientes, 37
reglas de construcción, 36
signos, 22
símbolos, 15
sintácticos, 50-54
Diagramas N-S, 39-44
Documentación, 13
DO-END, 120-121
DO SEQUENCE, 120-121
DO SEQUENTIALLY. 120-121
OOUNTIL, 129-130, 216
DOWHILE, 129-130, 132,216,235-237
E
Editor de enlaces, 62
Elemento de datos, 143
End,212
End_case, 127
ENDDO, 129
ENDFOR,130
End_if, 123
Enlazador (encadenador), 62
Ensamblador, 56
Enteros, 4, 7
Entrada de acciones, 170
Entrada de condiciones, 170
Escritura de datos, 69
. Estructuras de datos, 3, 137
clasificación, 144
Estructuras lógicas, 32
alternativas, 33, 121-128,213-215
repetitivas, 34, 128-131, 215-217
secuenciales, 33, \20-121, 211-212
teorema de la estructura, 119-120
Expresiones, 7
aritméticas, 7-8, 86-87
booleanas, 7-8, 87-89
F
fin_desde, 13 1
fin-mientras, I29
.
'.'-~ --~--~
INOICE
fin_segón, 127
fin_si, 213
FOR-TO, 240-242
Funciones, 118-119
function, 118
Hojas de codificación, 29
ensamblador, 56
máquina, 56
concepto, 48
intérpretes/compiladores, 59-66
Lectura de datos, 69
Linker, 62
listas, 150-161
circulares, 161
colas, 153-154
doblemente encadenadas, 161
encadenadas, 159-161
lineales, 151-152
pilas, 154-156
I
M
Identificador. 1, 6, 84
IF, 132,230
IF-NOT, 133
IF-THEN, 122-124
IF-THEN-ELSE, 123-124
IF-THEN-ENDIF, 122-124,213
Información, 1
Inicio_Fin, 120-12 1, 212
Inicio SEQUENCIA, 120-121
Instrucciones, 3, 68
asignación/movimiento, 70
entrada/salida, 69-70
especiales, 74-76
lógicas, 72
matemáticas, 71
/ relación, 72
tipos, 68-76
transferencias de control, 74
Intérpretes, 63-66
Interruptor, 108-109
ir a, 131
Item de datos, 143
Iteración, 93
Matriz de acciones, 170
Matriz de condiciones, 170
Matrices, 146, 147
MBASIC, 66
Metasímbolos, 49
Método Bertini, 223-225
Método Jackson, 220-223
Método Warnier, 225-227
Metodología "arriba-abajo", 218
Metodología de la programación, 12
mientras, 129,215-216
modularización, 12
criterios, 209
módulo, 207
características, 208
clasificación, 208-209
G
GOTO, 131, 238-239
Grafos sintácticos, 50-54
H
J
Juego de instrucciones, 68
L
Lazo, 78, 92-100 (Véase también Bucle)
Lenguajes de programación, 4, 48
características, 138
clasificación, 54
alto nivel, 57-58
bajo nivel, 56-57
N
Niklaus Wirth, 2
Nodo, 163
Notación BNF, 49-50
Números enteros, 4
rango, 4
Números reales, 4
O
Opción_de, 215
Operadores:
aritméticos, 71, 86-87
de relación, 72, 88
lógicos, 73-74, 88
prioridad, 88-89
Ordinogramas,20
Organigramas, 14
p Palabras clave (reservadas), 84
Pilas, 154
Plantillas de codificación, 29
Principios de la decisión, 138
Prioridad, 89
Procedimientos, 113-114, 116-117
Procesador, 1, 3
Proceso, 1
paralelo, 1
secuencial, 1-2
Programa fuente, 59-63
Programa objeto, 59-63
Programación, 9, 45
convencional, 203-205
desarrollo, 46-47
estructurada, 209-211
fases, 46
modular, 205-206
técnicas, 83
Programación estructurada, 209-211
métodos, 220
Programación modular, 205-209
requisitos, 208
Programa, 1-2, 9, 45, 76-83, 219
alternati vos, 81
cíclicos, 78
compilación, 59-62
depuración, 9, 47
desarroIlo, 46
documentación, 9, 13,47
ejecución, 60
elementos básicos, 83
estructura, 45
estructurados, 209-211
diseño, 219
lineales, 76
mantenimiento, 9, 47
partes de un, 66-68
puesta a punto, 13
tipos, 76
Pseudocódigo, 38-39
Puesta a punto de programas, 13
Q Qllicksorl. 110
R RAM, 63
Reales, 4
247
I
248
IND/CE
Registro, 15 1
Reglas de decisión, 17 I
REPEAT-UNTIL, 128
REPEAT-WHILE, 128
Repertorio de instrucciones, 68
repetir, 129-130
Residente, 63
Resultado, I
ROM,63
S Según hacer, 127, 214
Según sea, 214-215
Semántica, 48
Sentencias, 69, 83
de asignación, 89-91
si, 106
si-entonces, 122-123 si-entonces-fin_si, 122-124, 213-214 si-entonces-sino, 124 sin, 118 Sintaxis, 83 sqr, 118 STEP, 130 Subcampo, 151 Subprogramas, 110-116, 118 anidados, 112-113 Subrutinas, 110-117, 157-158 Switch. 108-110
T
Tablas, 147 Tablas de decisión, 12, 169 construcción, 182 conversión, 191
de flujos, 192-199 encadenamiento, 187-191 entradas ampliadas, 178 mixtas, 179 simplificación, 185-186 transformación, 179 transformación en diagramas de flujo, 192
tan, 118
TO, 169
modos de presentación, 17 J
horizontal, 172
vertical, 172-176
Teorema de la estructura, 211
top-down, 36, 211, 218
Totalizador, 100-103
U
UNTIL, 238 V
Variables, 4, 6, 85
ámbito (scope), 115
caracteres, 6-7
enteras, 6-7
globales, 115, 209
locales, 115, 209
lógicas, 6-7
reales, 6-7
Vectores, 146, 147 Vocabulario, 48 W
WHILE-WEND, 128
OTRAS OBRAS DE INTERES PUBLICADAS POR OSBORNE/McGRAW-HILL BARAS: Symphony. Gula del usuario. BARAS: Lotus 7-2-3. GullJ del usuario. BERMAN: Explorando el BASIC del Commodore 64. CASTLEWIlZ: Introducción al VisiCalc. CRAWFORO: El arte de diseño de iuegos con microcomputadoras. OITLEA: Gula de Software para microcomputadores. ERICKSON: Telecomunicaciones con el C-64. ERICKSON: Telecomunicaciones con el MACINTOSH. mLIN: Manual de MBASIC. mLIN: Intioducción al Wordstar. mLIN: Mu/tipllJn a su alcance. FIELO: Aplique elMacWrite y MacPaint. FLAST: 7-2-3 RUN. 47 aplicaciones prácticas Lotus 7-2-3. FLAST: 54 aplicaciones del VisiCalc. FOX: BASIC básico. Gula para principmntes. GRAHAM: IBM/PC. GullJ del usuario. GRAHAM: IBM/PC. Gula deIIBM/PC (DOS 2-0) XT. HEILBORN: Commodore 64. Gula del usuario. HEILBORN: Programas para ciendas e ingeniarla. Edición Apple 1/. HEILBORN: VIC 20. Gula del usuario. HOFFMAN: Sistema operativo MS-OOS. Gula del usuario. HOFFMAN: MSX. Gula del usuario. HOGAN: Sistema operativo CP/M. Gula del usuario (2.· ed.). JAMSA: Lenguaie BibliottICIJ de Funciones. JEFFRIES: Commodore 64. Pasatiempos y iuegos. JOHNSON: CP/M Manual para progremadores. JONES: Aplique el dBASE 11I. KRUGLINSKY: Sistema de administración de bases de datos. KRUGLINSKY: Gula a IIJs comunicaciones deIIBM/Pe. MOnOLA: Programación en IenguBie ensamblador para el Apple 11. NORLlNG: BASIC para Macintosh. OSBORNE: GullJ del comprador de sistemas de gestión. OSBORNE: Gula del ordenador personal PET/CBM. POOLE: Algunos programas de uso común en BASIC. POOLE: Algunos programlls de uso común en BASIC. Edición Apple ti. POOLE: Algunos programas de uso común en BASIC. Edición Atari. POOlE: Algunos programas de uso común en BASIC. Edición IBM. POOLE: Algunos programas de uso común en BASIC. Edición PET/CBM. POOLE: Algunos programas de uso común en BASIC. Edición lRS-SO. POOLE: Algunos programas de uso común en Pascal. POOLE: Apple /l. Gula del usuario. POOLE: Apple /lc. Gula del usuario. POOLE: Programas prácticos en BASIC. POOLE: Programas prácticos en BASIC. Edición Apple 1/. POOLE: Programas prácticos en BASIe. Edición IBM. POOLE: Programas prácticos en BASIC. Edición TRS-SO. POOLE: ProgramBs prácticos en Pascal. SANO: Pascal avanudo. Técnicas de programación. SACHS: EIIBM/PC. SCHILOT: ProgrlllTlación en lenguaie C. STEWART: Juegos y programas eduClltivos para C-64. STEWART: Juegos y programas educativos para Apple. THOMAS: SistemB operativo UNIX. Gula del usuario. TOWNSEND: PFS Softwllre 11 su alcance. TOWNSENO: Aplique el dBASE 11. WAITE: Introducción al procesamiento de pallJbras. WOOO: Programa SUPERCAL a su alcBnce.
e.
DISCOGUIAS PUBLICADOS POR OSBORNE/McGRAW-HILL GIFFOO: DiscogullJ para Apple 1/.
INGRAHAM: Discogula PBrll CP/M.
JOYANES: DiscogullJ para ZX SPECTRUM (TS2068).
TAYlOR: Discogula para Atari 400/800.
WILSON: Oiscogula para IBM/PC.
WILSON: Discogula para VisiCalc.
')
OTRAS OBRAS
Afé,é~~~ ,r
b~ INTERES ~B~AS POR,BYTE-~/McGRAW-HILL
ABELSON: LOGO pera App,1e 11.
ABELSON: Apple Logo. '
BOWLES: Introducci6n al UCSD PII8C8I.
CIARCIA: Construya una computadora b8slIda en el Z-BO (Gule de dilltlilo y funeionllmÑlflto).
CURTIS: WORDSTAR en eIIBM/Pe. .
CHARLTON: TravlI$uras con el2X-81
CHIU: Pa.tiempos con el2X-81.
DUFF: Introducci6n al MACINTOSH.
GABY: .Goauba. 100 subrutinll$ de uso cormJn pera,,' ZX-81 (TS 1(00).
GABY: Commodora 64. M6duloa PBrtI conatrucci6ñ de progrtlffllls.
HELMS: Manual de BASIC.
KAMINS: Ustad y le microcomputlldora. (Una introducci6n humIIniZ11d8 a le microinfomMtica).
KOLVE: Gula pera selecciOfNJr y adquirir su microcomputador.
LEWART: Programas de ciencill$ e ingenierla pera microcomputlldOrtlS Sineleir ZX-81 competibles
con el ZX Spsctrum.
\
MAININS: Sistema operativo PRO-DOS. Gula d61 usuario. MORGAN: Introducci6n al microprocealldor 8086/8088 (16 bit). MULLlSH; Sineleir ZX-81 (TS 1(00). Gule del usulHio. MULLlSH: Appleaoft BASIC. Gule PBrtI principiantll$. NEWROCK: Gula de compatibles deIIBM/Pe. SEYBOLD: Plenille e/ectr6nica integracM PlHa Lotus 1-2-3. CONTEXT MBA y Symphony. .. SEYBOLD: Proce6llmÑlflto de tIIxto. Softwllrtl pere el 18M/Pe.
SIKONOWIZ: Introducci6n aIIBMJPe.
SKIER: Programaci6n en lenguajefe_blador pe", VIC-20 y CornmodOfe 64.
WAITE: Introducci6n al proce6lldor de pelebrll$.
WATT: Aprendiendo con LOGO.
WATT: Aprendiendo con Commodora LOGO.
WATT: Aprendiendo con Apple LOGO.
WATT: Aprendiendo con IBM tOGO.
OTRAS OBRAS DE INTERES PUBUCADAS POR McGRAW-HILL ADAMIS: Diccionario BASIC. ADAMIS: Diccionario BASIC deIIBM/Pe. ADAMIS: F6rmu1ea y progrllm/l$ usuales en BASIC. ADAMIS: Inicleci6n al BASIC deIIBM/Pe. ADAMIS: MACINTOSH. Aplicaciones de Mulriplan y MacPaint. AGELOFF: Programaci6n BASIC aplicada. BISHOP: ZX Spsctrum (TS 2(68). Teorla y proyectos d6 interfase. B,UFFINGTON: Su prirnenl compUtlldora: c6mo comprarla y utilizarla. GOSLlNG: Programeci6n estructurade. HURLEY: Introducci6n e le programeci6n ZX-81 (TS 1(00). HURLEY: ZX Spectrum (TS 2068). Introducci6n al proce6llmÑlflto de tIIxtos. HURLEY: ZX Spsctrum (TS 2(68). Progrtlfflllci6n per. j6venll$ programadora. JOYANES: IBM/Pe Menual d6 BASIC. JOYANES: ZX Spsctrum (TS 2(68). Gule del usuerio. LABENSKY: TlHjeta raferancia rtlpide Apple 11. LABENSKY: Terjetll referencia rtlpida IBM/Pe. NULLISH: Apple$Of BASIC. Gule PBrtI principiantll$. MONRO: BASIC btlaico. NICHOLLS: ZX Spectrum (TS 2068). ProgrtlfflllCi6n de juegos en lenguaje ena.nbledor. PECKHAM: BASlC PBrtI Apple 11. Menual prktico. PECKHAM: BASIC fNIrtI Commodora 64. Menual prtlctico. PECKHAM: BASIC Pa'" IBM. Manual prktico. PECKHAM: BASIC PBrtI TRS-BO color. Manuel prtlctico. PHILLIPS: Progrtlmllndo el Dreg6n. Juegos y grtlficos. PRUEIT: El arte y le computadora. STREET: ZX Spectrum (TS 2(68). TkniCll$ de proce$lNflÍfNlto de le infomlllCi6n. WILLIAMS: ZX Spsctrum (TS 2(68). Dilltlilo y progrtlfflllCi6n de juegos. WOODS: ZX Spsctrum (TS 2(68). Progrtlfflllci6n an lengueje IH/$/Iff/bledor.
DICCIONARIOS PUBUCADOS POR McGRAW-HILL COLLAZO: Diccionario Encicloptldico de TMminos Tlcnicos (lngltJa-E$pIJ/loI/E8PBftol-lngltJa).
FREEDMAN: Gloaario de computaci6n.
PARKER: Diccionario McGrllW-Hill de ComputllCi6n.
SIPPL: (tAicrocomput/ldolN. Diccionarios de términos.
VAQUERO/JOYANES: InformtJtica. Glo8I1rio de tMminos yaiglea.
WILLlAMS: Spanmh {f Englmh Dictionary.
'.