Anda di halaman 1dari 31

Captulo

iJ

Fundamentos
de la programacin
estructurada
Este captulo describe los conceptos tericos que permiten el desarrollo de programas en len
guajes estructurados como Pascal. En particular, se definen conceptos como algoritmo o progra
mu, y tambin se estudian diferentes formas o tcnicas ele describir esos algoritmos de forma pre
cisa. Una vez comprendidas las diferencias entre algoritmos y programas, se estudian las tcnicas
ms habituales de la programacin estructurada, como la abstraccin de datos y de procedimien
tos. Finalmente, se describen las diferentes fases o etapas en las que se puede dividir el desarro
llo de cualquier programa o producto software.

El concepto de algoritmo tiene su origen en los matemticos hindes y rabes, que fueron los pri
meros que desarrollaron tcnicas de clculo escrito. En particular, el matemtico rabe Mohrned
ben Musa, conocido por el sobrenombre de Al'Khwarizmi, escribi un libro de Aritmtica que
fue traducido al latn como Algoritmi de numero lndorum (siglo DC), donde introduce el sistema
numrico hind (slo conocido por los rabes unos 50 aos antes), y los mtodos para calcular
con l. De esta versin latina proviene la palabra algoritmo.
Un algoritmo es la descripcin de un mtodo preciso para resolver automticamente un pro
blema. Desde el punto de vista de la computacin, un algoritmo consta de una representacin de
los datos que se manejan, y de una secuencia ordenada de instrucciones u rdenes que resuelven
el problema planteado.

U na forma sencilla de entender el concepto de algoritmo es pensar en una receta de cocina.


Una receta de cocina es una representacin de cmo resolver un problema, es decir, preparar un
determinado plato, para lo cual la persona encargada de resolverlo necesitar:
Utilizar un conjunto de ingredientes (o datos de entrada).
Tener una descripcin detallada de los pasos a seguir, o receta. Cada receta debe indicar las
proporciones necesarias de cada ingrediente, en qu orden deben mezclarse, qu debe hacer
se en cada uno de los pasos, etc.
Finalmente, cuando la receta de cocina es ejecutada por una persona, el resultado permiti
r obtener el plato esperado (resultado de salida).
Sin embargo, aunque la analoga con una receta de cocina permite entender el concepto de algo
ritmo, esta forma de describir la solucin a un problema presenta algunas dificultades. En parti
cular, un algoritmo en computacin necesita tener algunas caractersticas esenciales que no se
cumplen en el caso de una receta de cocina. Un algoritmo debe proporcionar una descripcin un
voca, o inequvoca, de los pasos a seguir. Por lo tanto, un algoritmo no puede tener varias inter
pretaciones.
En el caso de la receta de cocina, la diferencia aparece cuando en alguno de los pasos especi
ficados en la receta (algoritmo) no son precisos, y los datos manejados no utilizan proporciones
exactas. Por ejemplo, cuando se da informacin vaga, o imprecisa, en una receta del tipo de "aa
dir una pizca de sal", o "cocer las patatas hasta que estn medio hechas", o "partir en trozos
pequeos un ingrediente", puede marcar la diferencia entre un cocinero capaz de crear grandes
platos, y el resto. La respuesta que muchas personas daran a este problema es que la cocina real
mente es un arte, y que la receta es simplemente una gua que permite al cocinero desarrollar su
proceso creativo. Sin embargo, la programacin no debera ser un arte, por lo que puede definir
se el concepto de algoritmo como:
"Un e o n j u o t o o r de o ad o de p a s os o i ns t r u e e i o o es que es pe e i f i e a n, de f o r ma
p r e e i s a y s i n a mb i g e d a d e s , 1 a s e e u e n e i a d e o p e r a e i o n e s q u e s e h a n d e
r e a I i z a r p a r a r e s o I v e r u n p r o b I e ma . "

Por lo tanto, cualquier algoritmo debe tener por lo menos tres cualidades indispensables:
1. Debe ser preciso, es decir, debe indicar el orden en el que ha de ejecutarse cada uno de los
pasos que hay que seguir.
2. Debe ser unvoco (no ambiguo).
3. Debe especificar la secuencia (orden) de pasos para resolver el problema.
Aunque esto no es siempre cierto para todos los algoritmos, tambin suele exigirse al algoritmo
que sea finito, es decir:
4. El nmero de pasos necesarios para resolver el problema es finito. Esto es, la ejecucin de
un algoritmo debe terminar en algn momento.
5. Cada paso, tarea o instruccin ejecutada por el algoritmo debe requerir un tiempo finito y
unos recursos finitos. Debe recordarse que los computadores son dispositivos fsicos, y por

lo tanto limitados. Si se disea un algoritmo que requiere un tiempo de clculo o una capa
cidad de almacenamiento ilimitados, aunque el algoritmo sea finito, su implementacin no
sera posible.
Como puede verse, basta el momento no se ha definido cmo debe ser codificado un algoritmo;
es decir, cualquier representacin que cumpla con las caractersticas anteriores (en particular con
las tres primeras) es un algoritmo. De hecho, y como se ver ms adelante, existen mltiples for
mas de representar un algoritmo. Sin embargo, cuando se habla de programas, se refiere a la
codificacin concreta de estos algoritmos. Por lo tanto, el concepto programa puede definirse
como:
" La e o d i f i e a e i 6 n e n e u a I qui e r I e n g u aj e de p r o gr a ma e i 6 o e s pe e f i e o de un o
o varios algoritmos."

De la definicin anterior puede concluirse que un programa puede implementar uno o varios
algoritmos. En computacin, el programa es la implementacin fsica o concreta del algoritmo (o
algoritmos) que resuelve un determinado problema. Como principales caractersticas y diferen
cias entre algoritmos y programas pueden destacarse las siguientes:
Algoritmos. Se tratan de codificaciones independientes del lenguaje de programacin con
siderado. Describen el conjunto de operaciones que deben realizarse para resolver el pro
blema.
Programas. Se trata de la codificacin en un lenguaje concreto de uno o varios algoritmos,
donde cada uno de ellos resuelve una parte del problema global.

ramas

seudocdi

Como se ha sealado previamente, un algoritmo es independiente del lenguaje utilizado. Por lo


tanto, debe proporcionarse un conjunto de mtodos que permitan codificarlos indistintamente del
lenguaje considerado. Los mtodos ms usuales para representar cualquier algoritmo son:
l. Diagramas de Flujo u Organigramas.

2. Diagramas NS (NassiSchneiderman). Un diagrama NS, tambin llamado diagrama de


Chapin, permite obtener una representacin grfica de un algoritmo. Son diagramas simi
lares a los diagramas de flujo, con la diferencia de que las flechas de unin (que se utili
zan en los primeros) se omiten en el esquema grfico, y que las cajas que representan las
tareas que deben realizarse, se representan de forma contigua. Es decir, tareas que repre
sentan operaciones consecutivas se representan en cajas sucesivas.
3. Lenguajes especficos para la descripcin de algoritmos. A este tipo de lenguajes se lo
conoce como Pseudocdigo.
4. Lenguaje Natural. Cualquier algoritmo puede ser descrito o representado utilizando el
lenguaje hablado por cualquier ser humano. Sin embargo, debe tenerse en cuenta que

algunas caractersticas del lenguaje natural son poco adecuadas para describir un algo
ritmo (por ejemplo, un algoritmo que tratase de utilizar metforas para describir algn
concepto).
5. Mtodos formales matemticos. Muchos algoritmos, en particular los que realizan
clculos sobre datos, pueden ser descritos utilizando un conjunto de expresiones mate
mticas.
De los anteriores mtodos de representacin descritos, el Lenguaje Natural y la definicin de un
algoritmo como un conjunto de expresiones matemticas son los ms simples desde el punto de
vista de un ser humano. No obstante, estas formas de representacin suelen ser las ms complejas
de traducir a un lenguaje de programacin concreto. Esto es particularmente cierto para el
Lenguaje Natural, debido a que la ambigedad es una de las caractersticas de este tipo de len
guaje. De las diferentes tcnicas que pueden utilizarse para describir algoritmos, se van a descri
bir con mayor detalle las ms comunes: los diagramas de flujo u organigramas y el pseudocdigo.

2.2.1. Organigramas
Un diagrama de flujo (flowchart) u organigrama es una representacin grfica de un algoritmo.
Dado que se trata de una representacin grfica, no existirn reglas sintcticas o gramaticales para
la representacin del algoritmo.
Por lo tanto, un organigrama permite dar una representacin de un algoritmo independiente
de cualquier lenguaje de programacin, puesto que refleja nicamente el funcionamiento lgico
del mismo. Con este tipo de diagramas se describe de forma grfica el flujo u orden de las accio
nes que deben ser ejecutadas. Para ello, se utilizan un conjunto de smbolos estandarizados y nor
malizados, que permiten a cualquier programador indicar de forma precisa las operaciones que
deben ser realizadas por el algoritmo. Aunque existen gran cantidad de smbolos, los ms fre
cuentemente utilizados se emplean para representar:
Procesos o instrucciones que indican las tareas que deben ser realizadas (representados por
una caja).
Punto de decisin. Estructuras lgicas o condicionales que permiten romper la ejecucin
secuencial de un programa.
Conectores.
Entrada/Salida.
Direccin del flujo (representado por flechas).
Inicio/Fin del algoritmo.
Los smbolos ms frecuentes empleados en los organigramas son las que aparecen en la
Figura 2.L

Terminal: prncpio o fin del programa

Flujo de control o direcci6n

.:_____,/
1

lnstrucc6n

1
Entrada o salida de datos

Figura 2.1. Smbolos bsicos de los organigramas.

Cualquier organigrama deber contener dos smbolos terminales, etiquetados como "inicio" y
"fin", que indicarn el punto de entrada o comienzo del algoritmo y el final del mismo. Tambin
podr tener un conjunto de cajas de procesos o instrucciones, que representan las acciones a rea
lizar. Por ejemplo, la Figura 2.2 muestra un organigrama de un algoritmo que lee dos datos num
ricos desde teclado (entrada), calcula su suma y muestra el resultado por pantalla (salida).

resultado dato 1 + dato2

mostrar resultado

Figura 2.2. Organigrama de un algoritmo que suma dos nmeros.

Otros smbolos muy utilizados son los que se emplean para representar puntos de decisin
dentro de los algoritmos. Es decir, durante la ejecucin de un algoritmo puede suceder que un
determinado conjunto de instrucciones sean ejecutadas si se cumple una determinada condicin.
En el caso de que esa decisin no se cumpla, podran ser ejecutadas otras instrucciones diferen
tes. Los smbolos ms habituales para representar puntos de decisin en un organigrama son los
que se muestran en la Figura 2.3.

Decisin simple

Verdadero

Falso
Valor 1

ValorN

Bucles

Bloque
Verdadero

Bloque
Falso

Falso

Verdadero

Figura 2.3. Puntos de decisin en un organigrama.


Por ejemplo, si se desea representar un algoritmo que, en funcin de un valor introducido por
teclado, realice las siguiente operaciones:
Si el nmero introducido es par, se calcular la suma de los LOO primeros nmeros enteros
(resultado= l + 2 + 3 + ... + 99 + 100).
Si el nmero es impar, se calcular el producto de los 100 primeros enteros (resultado =
1 2 3 ... 99 100).
Una vez terminado el proceso correspondiente, se mostrar el resultado por pantalla.
El anterior organigrama muestra tres puntos de decisin diferentes. El primero utiliza la condi
cin lgica (numero mod 2 = O) que se utiliza para indicar si un nmero es par o impar. La ope
racin mdulo (mod), o resto de la divisin entera, que ser estudiada en captulos posteriores,
permite conocer si el nmero es par (es decir, el resto de la divisin entera del nmero entre dos
es igual a cero) o es impar (en este caso el resto de la divisin entera es igual a uno, por lo que
la comparacin dara falso).
Los otros dos puntos de decisin utilizan la comparacin ( e o n t a do r 1 O O) . Esta compa
racin es utilizada para implementar un estructura de control de tipo MIENTRAS. Esta estruc

vsrdsdero

falso

SUX+- 0

comeaor e-

aux+- 1
contador+- 1

aux + aux + contador


cootsaor- contador + 1

aux + aux , contador


contador+- contador + 1

Figura 2.4. Ejemplo de un organigrama con puntos de decisin.

tura de control es muy frecuente en cualquier lenguaje de programacin, y se utiliza para imple
mentar bloques de cdigo que ejecutan de forma repetida un mismo conjunto de instrucciones. A
este tipo de estructuras se las conoce por el nombre de bucles.

2.2.2. Pseudocdigo
El pseudocdigo es un lenguaje que permite la descripcin o especificacin de algoritmos. La uti
lizacin de este tipo de lenguajes (muy prximos al lenguaje natural) hace que la conversin del
algoritmo a la implementacin concreta sobre un lenguaje de programacin se simplifique. Por
lo tanto, el pseudocdigo permite expresar sin ambigedades, y de una forma clara, las distintas
instrucciones que deben ser realizadas por el algoritmo.
El pseudocdigo naci como una versin simplificada del ingls, en el que, de una forma clara y
sencilla, podan representarse las estructuras de control bsicas (condicionales, bucles, etc.) de la
programacin estructurada. El pseudocdigo no es un lenguaje de programacin y, por lo tanto,
no puede ser ejecutado por ningn computador dado que no existe ninguna forma de traducir esa
descripcin a alto nivel (es decir, muy prxima al lenguaje natural) a cdigo mquina. Debe

comprenderse que un algoritmo descrito utilizando esta tcnica es simplemente un borrador que
posteriormente deber ser traducido a un lenguaje de programacin concreto.
Como principal ventaja de la utilizacin del pseudocdigo como mecanismo para describir
algoritmos puede destacarse el hecho de que el programador puede concentrarse en la lgica, o
funcionamiento del algoritmo, y en las estructuras de control del mismo. Puede prescindirse de
detalles concretos de la sintaxis, o de las reglas impuestas por el lenguaje de programacin que
posteriormente se utilice. Adems, si se detecta un error en la lgica del programa (el funcio
namiento no es el esperado o el deseado porque no se han tomado las decisiones adecuadas),
suele ser ms fcil modificar el pseudocdigo que tratar de modificar el cdigo fuente del pro
grama creado. Otra ventaja de la utilizacin del pseudocdigo proviene de su propia represen
tacin. Dado que normalmente utiliza palabras reservadas en ingls (o su traduccin equivalente
al castellano) para representar determinados tipos de acciones, como, por ejemplo, start, begin,
end, if-then-else, while-end, repeat-until, read, write, etc., muy similares a las palabras reserva
das de los lenguajes de programacin, la traduccin de estos algoritmos a su equivalente en len
guajes de programacin estructurados como Pascal, C, Ada, Fortran, etc., es muy simple.
Como reglas bsicas para definir un algoritmo en pseudocdigo debe tenerse presente lo
siguiente:
Deben utilizarse, siempre que sea posible, palabras reservadas para indicar las diferentes
acciones o puntos de decisin dentro del algoritmo.
Normalmente es necesario indentar adecuadamente (utilizar tabulaciones a la derecha) las
instrucciones que se encuentran dentro de un mismo bloque de instrucciones. Se define bloque como un conjunto de instrucciones que estn delimitadas entre las palabras reservadas
begin y end (comienzo y fin). Un bloque indica que todas las instrucciones que pertenecen
a l sern ejecutadas de forma secuencial.
Un algoritmo debe empezar con la palabra reservada start (comienzo o inicio) y terminar
con la palabra reservada end (fin).
Para mejorar la legibilidad del cdigo podrn utilizarse comentarios. Un comentario ven
dr precedido por el smbolo //y se utiliza para dar informacin a la persona que est leyen
do el algoritmo. No realiza ningn tipo de operacin concreta. Los comentarios deben ser
entendidos como documentacin del algoritmo, es decir, informacin que puede ser pro
porcionada a otra persona para que comprenda correctamente cmo funciona el algoritmo.
Algunos autores suelen utilizar los corchetes o las llaves para representar los comentarios;
esto se debe a que en los lenguajes estructurados suele emplearse este tipo de smbolos para
representar los comentarios en los programas.
A continuacin, se muestra un ejemplo genrico de un algoritmo en pseudocdigo, donde se han
utilizado algunas de las palabras reservadas (en castellano) descritas previamente y un comentario.
I NI CI O

// algoritmo en pseudocdigo
palabras clave
operacin 1
operacin 2

operacin 3

operaci6nN
FIN

Utilizando los mismos ejemplos que en el apartado anterior, pueden generarse los siguientes
pseudocdigos:
1.

Pseudocdigo que lee dos datos numricos, calcula su suma y muestra el resultado. Como
puede verse, en este ejemplo se utilizan las palabras en castellano.

I NI CI O
//lectura de los datos
I e e r dat al
I e e r dat o2
//clculo
resultado datol + dato2
/ / mo s t r a r r e s u I t a d o
e s c r bi r resultado

FIN

2. Pseudocdigo que lee un dato; si es par, el resultado= suma(l..100), si es impar, el resultado


= producto(l..100). En este segundo ejemplo se utilizarn las palabras reservadas en ingls.

START
//lectura del valor de entrada
read dato
//dato es par?
i f (dato mod 2 = O) then
1/dato es par
be g i n
aux O
contador f- 1
whi I e ( con! ador 100)
aux aux + contador
contador contador +
end
e od
e I se
II dato es impar
be g i n
aux f- 1
contador f- 1
wh i I e ( e o n t a d o r 1 O O)
aux aux contador
contador contador +

end
end
//mostrar resultado
wr l t e resultado

END
Dado que el pseudocdigo no es un lenguaje de programacin, es indiferente que las palabras
reservadas se utilicen en ingls, castellano o cualquier otra lengua. Sin embargo, es ms frecuen
te la utilizacin del ingls por la similitud con las palabras reservadas de los lenguajes de pro
gramacin concretos.

Lenguajes de programacin: alfabeto, lxico,


sintaxis y semntica
Un lenguaje de programacin no deja de ser un lenguaje que permite comunicar una serie de con
ceptos acerca de un mismo tema, entre dos elementos (mquinas, humanos, etc.) que conocen y
comprenden ese mismo lenguaje. Por lo tanto, como cualquier otro lenguaje, un lenguaje de pro
gramacin constar de los siguientes elementos:

Alfabeto: Conjunto de smbolos elementales disponibles en el lenguaje. Estos smbolos ele


mentales estn formados habitualmente por caracteres alfabticos, nmeros y por algunos
caracteres especiales como: [ , { , . , ; , ( , , + , - , etc.
Lxico: Vocabulario formado a partir del alfabeto de nuestro lenguaje. Este vocabulario per
mitir formar el conjunto de vocablos o palabras permitidas del lenguaje. Algunas de estas
palabras, o identificadores, estarn predefinidas por el propio lenguaje de programacin,
como, por ejemplo: begin, end, if, then, else, while, for, etc., y tendrn una semntica o
significado predefinido. El resto de las palabras permitidas debern cumplir una serie de
reglas lxicas que indiquen cmo se realiza la construccin de identificadores vlidos.
Sintaxis: Conjunto de reglas gramaticales que nos permiten formar unidades superiores lla
madas sentencias o instrucciones. Una sentencia estar formada por un conjunto de pala
bras (reservadas o no) que indicarn un accin o tarea, que debe ser ejecutada por el algo
ritmo. Las reglas sintcticas (o gramaticales) del lenguaje de programacin mostrarn la
forma correcta de construir esas instrucciones.
Semntica: El lxico o vocabulario de nuestro lenguaje, y las sentencias o instrucciones que
se forman utilizando las diferentes reglas, deben tener algn sentido o significado denomi
nado semntica. La semntica de una sentencia debe representar la accin que se desea eje
cutar por el programa.
Cuando se desee estudiar un lenguaje de programacin concreto, debe estudiarse cada uno de los
elementos anteriores para, de esa forma, poder construir palabras vlidas y sentencias que per
mitan al programador desarrollar el algoritmo deseado.

Tipos de lenguajes de programacin. Traductores


aradi mas de ro ,amacin
Como se describi brevemente en el captulo anterior, los diferentes tipos de lenguajes de pro
gramacin pueden c1asificarse principalmente en funcin de tres caractersticas.
En primer lugar, en funcin del nivel de abstraccin (o lo prximo que se halla el lengua
je de programacin al lenguaje natural). En este caso, puede hablarse de lenguajes mqui
na, lenguajes ensambladores y lenguajes de alto nivel.
En segundo lugar, en funcin de cmo es traducido el cdigo fuente del programa para
obtener el cdigo mquina ejecutable por el computador. En este caso, puede hablarse de
lenguajes compilados o interpretados.
Y en tercer lugar, en funcin de la metodologa o paradigma utilizado para crear el pro
grama. Puede distinguirse entre cinco paradigmas fundamentales: programacin imperati
va, programacin orientada a objetos, programacin lgica, programacin funcional y pro
gramacin concurrente.

2.4. 1. Lenguajes mquina


El alfabeto (conjunto de smbolos elementales) que utiliza para escribir las instrucciones es el
binario, es decir, O y 1 (es el nico directamente ejecutable por el procesador). Es el lenguaje de
programacin con menor nivel de abstraccin que puede utilizarse en un computador, dado que
directamente se proporcionan las instrucciones en binario. El siguiente ejemplo muestra un con
junto de cadenas binarias que seran interpretables directamente por la Unidad de Control del
computador. AJ conjunto de cadenas binarias que forman el programa ejecutable se lo denomina
cdigo mquina. A continuacin, se muestra un posible cdigo binario formado por cadenas
binarias de 32 bits. Cada una de estas cadenas podra representar una instruccin mquina, es
decir, una instruccin directamente ejecutable (entendible) por un microprocesador.

1101 1101 1000 1111 1001 1011 1001 0111


1001 0001 1000 0110 1111 0000 1111 0101
O I O 1 11 O 1

l 00 O 111 1 1001 1 O 1 l 1001 0011

1101 1011 1110 1011 1011

1011 1010 0110

0001 11 ll 1010 1001 1001 1011 1001 0101


1101 1101 1100 1110 1111 0011 1010 0000
Debe tenerse en cuenta que, aunque ya nadie programe utilizando este tipo de lenguajes, todos
los computadores ejecutan estas cadenas binarias de ceros y unos, y aunque se utilice un lengua

je de programacin muy sofisticado, finalmente todo debe ser traducido de alguna manera a estas
cadenas de ceros y unos. Como efecto lateral, si las mquinas cambian internamente y sus len
guajes mquina tambin, los programas dejarn de funcionar. Por lo tanto, si un programa ha sido
creado para un determinado computador, ste puede dejar de funcionar si el lenguaje mquina de
la nueva ha sufrido grandes cambios. En estos casos las compaas que fabrican computadores
suelen hablar de una nueva familia o arquitectura de computadores. Un ejemplo de este caso es
el de la compaa de microprocesadores Intel cuando decidi cambiar la arquitectura de los
microprocesadores lntel 80:XXX (lntel 8088, 8086, 80186, 80188, 80286, 80386 y 80486), que
llevaba dos dcadas vendiendo (la arquitectura de estos procesadores estaba basada en reperto
rios complejos de instrucciones o CISC) por un nuevo tipo de microprocesadores llamados
Pentium, cuya arquitectura es completamente diferente (arquitecturas denominadas RISC, o con
juntos reducidos de instrucciones).

2.4.2. Lenguajes ensambladores


Se trata de un tipo de lenguajes de programacin bastante prximo al lenguaje mquina. En este
tipo de lenguajes se sustituyen los cdigos numricos (cadenas binarias) que representan las dife
rentes partes o campos en las que se divide una instruccin mquina, por un conjunto de cdigos
nemotcnicos ms sencillos de identificar y recordar. Los lenguajes ensambladores son depen
dientes de la arquitectura de la mquina, es decir, de las diferentes caractersticas Hw de cada
mquina concreta. Por lo tanto, cada tipo de mquina (como las UltraSparc de Sun, las mquinas
de HP, las arquitecturas creadas por INTEL, por Motorola, o las VAX. de Digital) tendr su pro
pio lenguaje mquina, y un lenguaje ensamblador concreto que permitir escribir programas para
estos computadores. Este lenguaje ser diferente y particular para cada uno de ellos. Un lengua
je ensamblador es simplemente una representacin simblica del lenguaje mquina asociado; es
decir, los cdigos nemotcnicos utilizados por estos lenguajes permiten una programacin menos
tediosa y complicada que con los lenguajes mquina. Sin embargo, para crear programas con este
tipo de lenguajes es necesario un conocimiento muy profundo de la arquitectura fsica (registros,
unidades de control, formatos de representacin de la informacin permitidos, modos de acceso
y direccionamiento de la memoria, etc.) del computador considerada.
Utilizando esas palabras nemotcnicas, puede escribirse en un fichero de texto un conjunto de
instrucciones bsicas que posteriormente debern ser traducidas al lenguaje mquina entendible
por el computador; por lo tanto, el cdigo o programa generado en un lenguaje ensamblador no
es directamente ejecutable. El programa que se encarga de realizar la traduccin de esos cdigos
nemotcnicos a cdigo mquina se llama assenb.k(de aqu el nombre de lenguajes ensambla
dores), y permite traducir esos ficheros de texto a cdigo mquina.
Existen diversos inconvenientes a la hora de utilizar este tipo de lenguajes para la imple
mentacin de programas de computador. Entre otros, pueden mencionarse brevemente los
siguientes:
Aunque permite un nivel de abstraccin mayor que en el caso del lenguaje mquina, ste es
muy escaso, por lo que obliga a los programadores a conocer, con un nivel de detalle muy
preciso, el funcionamiento interno de cada una de las partes que forman la mquina.

Los programas escritos en ensamblador son difciles de depurar. Es decir, cuando se produ
ce un error, es complicado encontrarlo y solucionarlo.
No suelen existir aplicaciones Sw que faciliten la programacin en ensamblador, por lo que
normalmente el programador slo podr crear su programa, ensamblarlo (traducirlo a cdi
go mquina) y ejecutarlo.
Sin embargo, debe tenerse en cuenta que estos lenguajes tambin presentan algunas ventajas. En
particular, al ser el lenguaje ms cercano al cdigo mquina, un buen programador puede gene
rar un cdigo ms eficiente (en cuanto al tiempo que tardara en ser ejecutado y el tamao que
ocupara en nuestra memoria) que si es utilizado cualquier otro tipo de lenguaje.
Como ilustracin de los lenguajes ensambladores, a continuacin se muestra dos ejemplos de
programas. El primero es un programa escrito para un microprocesador del tipo Motorola
(Mc68000); el segundo ejemplo consiste en un programa ejecutable sobre un microprocesador de
tipo Intel 80086.
Como puede verse en el primer ejemplo, algunos de los nemotcnicos utilizados son fciles
de identificar, como: ADD, suma dos registros o dos posiciones de memoria; AND permite rea
lizar una operacin lgica denominada YLgica entre dos datos; el nemotcnico END se utiliza
para indicarle al programa ensamblador dnde finaliza nuestro programa. Sin embargo, otras
caractersticas del lenguaje, como los modos de direccionamiento, o modos de conocer dnde se
encuentra un dato almacenado, necesitan ser estudiadas para comprender el correcto funciona
miento del cdigo.

I Nl

ET

ORG
EQU
10VE. L
ADD. L
AND. W
De. L
END

2500
$F5F
# $ O O O FO 4 8 1 , D2
ET, D2
#INI,D2
$42

En el segundo ejemplo se muestra parte de un programa en ensamblador para un microproce


sador Intel 80086:
; ; Pr
M:>V
A>K)V
M:>V
M:>V
M:>V
I Ne
I Ne
DE e
JNZ

o grama en s a rob I ad o r par a 8 O O 8 6


ex, 7 DO H
ex :: 7 DO H ( 2 O O O de e i ma 1 :: 7 DO be x ad e e i ma 1 )
AX, O B8 O O h
s e g me o t o de I a me roo r i a de p a o t a 1 1 a
DS,AX
apuntar segmento de datos a la misma
BX, O
a pu o t ar a 1 1 " car e t e r AS er I de I a p a o t a 1 1 a
PTR [ BXJ , 3 2
So b r e PTR se u t i I i za o 3 2 b i t s
BX::BX+I apuntar al byte de color
BX
BX::BX+I apuntar al siguiente carcter ASCII
BX
ex
eX::CX 1 > se de ere me o ta e I re g i s t ro ex
8
s i ex o o es O, s a I t ar 8 by t es a t r s

Puede verse cmo los nemotcnicos han cambiado, aunque algunos son similares al ejemplo
de Motorola, como MOV, que se utiliza para mover datos almacenados en registros o direcciones
de memoria. Otros, como INC/DEC, se utilizan para incrementar/decrementar el contenido de un
:registro. Sin embargo, pueden apreciarse algunas diferencias interesantes. Por ejemplo, en
Motorola, para indicar el tamao que ocupan los datos debe indicarse desde el propio cdigo
nemotcnico, por ejemplo MOVE. L indica que se va a mover un dato de tamao Long (32 bits),
mientras que en el caso de Intel esta informacin aparece directamente reflejada por el registro a
utilizar (CX, AX, OS), que nos indica si se utilizan 8, 16 o 32 bits.
Finalmente, aunque el nivel de abstraccin de este tipo de lenguajes sea muy bajo, no puede
olvidarse que los programas generados por este tipo de lenguajes son los ms rpidos y eficien
tes, por lo que en algunas situaciones todava es imprescindible su utilizacin. Aunque antigua
mente el ensamblador se utilizaba para crear virus, o para el control de grficos, hoy da, y dada
la escasa portabilidad de este cdigo (imposibilidad de ejecutar un mismo programa en dos
mquinas diferentes), es ms habitual que se utilicen otros lenguajes de programacin, como C,
mientras que el ensamblador ha sido relegado a la programacin de diversos dispositivos Hw.

2.4.3. Lenguajes de alto nivel


Los lenguajes de alto nivel son los ms prximos al lenguaje natural y, por lo tanto, los ms uti
lizados hoy en da. Este tipo de lenguajes se caracteriza principalmente por poder expresar ins
trucciones muy complejas (estas instrucciones se traducirn a gran cantidad de instrucciones
mquina), y al igual que en el caso de los lenguajes ensambladores no sern directamente ejecu
tables.
Este tipo de lenguajes puede clasificarse, o diferenciarse, en funcin de diversas caractersti
cas, como, por ejemplo, la forma que tienen de ser traducidos, o cul es el paradigma (o meto
dologa) que debe utilizarse para construir un programa.
Como se ha comentado previamente, los lenguajes de alto nivel no pueden ser directamente
ejecutados por el procesador. Para que los programas o conjuntos de instrucciones puedan ser
ejecutados por el procesador, se necesita emplear traductores, es decir, programas que transfor
man el cdigo de los lenguajes de alto nivel a lenguaje mquina.
Si se clasifican los lenguajes de programacin en funcin de la forma de traducir el cdigo de
alto nivel a cdigo mquina, puede hablarse de:

0011 O 11 O 11
1001100111
0111011000

IP x3 THEN a:l

Traductor

Figura 2.5. Representacin grfica del proceso de traduccin de cdigo fuente a cdigo mquina.

Lenguajes ensambladores. Descritos en el apartado anterior.


Lenguajes compilados. Estos lenguajes de programacin utilizan un programa especial lla
mado compilador. Un compilador es un programa Sw capaz de traducir un conjunto de ins
trucciones de alto nivel a cdigo mquina directamente ejecutable por el computador. El
compilador realiza este proceso en varias etapas. Aunque existen diferentes formas de rea
lizar esta traduccin, las etapas que la mayora de los compiladores implementan son:
Anlisis lxico.
Anlisis sintctico.
Anlisis semntico.
Generacin de cdigo intermedio.
Posible optimizacin del cdigo intermedio independiente de la mquina (arquitectura)
considerada.
Generacin del cdigo mquina.
Posible optimizacin del cdigo dependiente de la mquina.
Una vez terminadas las primeras etapas, si el anlisis semntico no ha generado errores, se
obtiene o genera el cdigo mquina a partir de lo que se denomina rbol de derivacin, que
ha sido previamente construido en la etapa de anlisis sintctico. Si el compilador detecta
algn error en cualquiera de estas etapas, generar uno o varios errores que debern ser
corregidos por el programador antes de generar el cdigo ejecutable (cdigo mquina).
Uno de los aspectos ms importantes de este tipo de lenguajes es que el compilador rea
liza diversos procesos de optimizacin del cdigo, por lo que la versin de cdigo mquina
generado por el compilador puede tener mejoras sobre el programa inicialmente escrito,
como, por ejemplo, eliminar instrucciones redundantes o innecesarias, o adecuar algunas
operaciones sobre los datos a las caractersticas particulares de la arquitectura del computa
dor donde va a ser ejecutado el programa.

La utilizacin de lenguajes compilados tiene una serie de ventajas e inconvenientes.


Como ventajas puede destacarse el hecho de que si se dispone de un buen compilador (gene
rar uno de estos compiladores es una tarea muy compleja; de hecho, el xito o fracaso
comercial de algunos de estos lenguajes est ntimamente Ligado a la calidad del compila
dor disponible) se obtendr un cdigo mquina muy eficiente, lo que har que los progra
mas funcionen ms rpidamente y con un consumo mnimo de recursos (como tiempo de
CPU o memoria). Como principal inconveniente se debe hablar de la portabilttad Se habla
de portabilidad de cdigo para referirse a la posibilidad de ejecutar un cdigo en diferentes
arquitecturas (es decir, en diferentes tipos de computadores). Un cdigo o programa porta
ble es aquel que puede ser ejecutado en diferentes mquinas obtenindose los mismos resul
tados. Aunque esto debera parecer normal, habitualmente es muy difcil de conseguir, sobre
todo si se tiene en cuenta que las diferentes compaas que fabrican componentes hardwa
re (microprocesadores, memorias, perifricos, buses, etc.) definen sus propias arquitecturas,
es decir, definen los diferentes elementos Hw que forman la mquina y cmo trabajan entre

ellos. Cuando se dispone de un lenguaje compilado, el cdigo mquina se ejecuta directa


mente contra el computador, es decir, la CPU de ese computador (arquitectura) concreta es
capaz de entender las cadenas binarias generadas. Si se tratase de ejecutar directamente ese
cdigo binario en otro computador (arquitectura) diferente, simplemente no sera capaz de
entenderlo y no funcionara. La solucin a este problema requiere disponer de un compila
dor para ese nuevo computador (arquitectura) donde se quiere ejecutar nuestro programa y
volver a compilarlo. Aunque la solucin parece simple, no siempre lo es, dado que los com
piladores deben adaptarse a las caractersticas internas del Hw con el que trabajan, hacien
do algunas veces complicado el proceso de compilacin. Finalmente, algunos ejemplos de
lenguajes compilados son: C, C++, Modula2, Fortran, COBOL, ADA, VisualBasic, Delphi,
Oberon y Pascal.

Lenguajes interpretados. Son aquellos lenguajes cuyo cdigo o programa es traducido instruccin a instruccin. Cada una de esas instrucciones son posteriormente ejecutadas por un
programa Sw especial llamado intrprete. Este programa se encarga de traducir la instruc
cin seleccionada a cdigo mquina y ejecutarla. Una vez que ba ejecutado todas las ins
trucciones que forman nuestro programa el intrprete termina.

Como puede verse, la ejecucin de las instrucciones se realiza de forma secuencial; es decir,
el orden en el que las instrucciones se escriben en el programa es importante. En este tipo
de lenguajes, puede darse el caso de que si se intercambian dos instrucciones pueda dejar de
funcionar el programa. Dado que en este tipo de lenguajes no puede analizarse todo el pro
grama, no es posible realizar las operaciones de optimizacin de cdigo que se realiza en el
caso de los lenguajes compilados. Adems, el proceso de ejecucin secuencial de instruc
ciones realizado por los intrpretes es intrnsecamente ms lento que el realizado por los len
guajes compilados. Esto origina como desventaja principal el hecho de que un programa
escrito en un lenguaje interpretado sea menos eficiente en tiempo de ejecucin y en consu
mo de recursos del computador, como la memoria, que el mismo programa escrito en un len
guaje compilado, como por ejemplo C. Sin embargo, los lenguajes interpretados presentan
una gran ventaja frente a los compilados, y sta reside precisamente en la portabilidad del
cdigo. Dado que para ejecutar cualquiera de estos programas es necesario su intrprete,
esto permite independizar la ejecucin del programa de la arquitectura Hw del computador,
debido a que el intrprete que se ha instalado en Ja mquina ya sabe cmo ejecutar las ins
trucciones que le darnos, y no es necesario, por lo tanto, recompilar nuestro cdigo cada vez
que se desea ejecutar en una mquina distinta. Algunos ejemplos de este tipo de lenguajes
son: Prolog, LISP, Peri, Basic, JavaScript, VBScript, Phytoo, etc.

Lenguajes hbridos. Estos lenguajes se caracterizan porque los programas son, a la vez,
compilados e interpretados. Es decir, el programa o cdigo fuente sufre algn tipo de com
pilacin que permite traducir a un lenguaje intermedio (una especie de lenguaje ensam
blador), que posteriormente es interpretado. El caso ms conocido de este tipo de lengua
jes es Java. Los programas en Java sufren un primer proceso de compilacin en que el
cdigo es depurado y optimizado, para posteriormente ser ejecutado por un programa Sw
denominado mquina virtual de Java (Java Virtual Machine, o JVM), que es en realidad un
intrprete capaz de ejecutar los bytecodes, al que ha sido traducido el programa inicial.
Estos lenguajes tratan de aunar las ventajas de los lenguajes compilados e interpretados;

es decir, por un lado tratan de realizar las diferentes operaciones de depuracin y optimi
zacin de cdigo que permite obtener cdigo de mejor calidad y que consume menos
recursos (tiempo de CPU y memoria) de nuestro computador, y por otro lado utilizan un
intrprete que es capaz de ejecutar ese cdigo optimizado sobre la arquitectura correspon
diente. Aunque este tipo de lenguajes tiene defensores y detractores (como todos los ante
riores), debe decirse que el gran xito que han experimentado lenguajes como Java tiene
su origen en la aparicin de redes de computadores como Internet, donde un enorme nme
ro de mquinas diferentes (en cuanto a las arquitecturas o a los Sistemas Operativos que lo
componen) estn todas interconectadas. Por lo tanto, si se desea ejecutar cdigo o progra
mas en esas mquinas, deber utilizarse un lenguaje interpretado o hbrido si no se desea
tener compilado el programa en todas las arquitecturas posibles. Java permite la creacin
de un tipo de programa denominado applet, que es portable y ejecutable (en determinadas
condiciones de seguridad, nadie quiere ejecutar un programa extrao en su computador
que pueda, por ejemplo, formatear su disco duro) en cualquier mquina conectada a
Internet.
Si en lugar de utilizar las diferentes formas de realizar el proceso de traduccin del cdigo fuen
te del programa al cdigo objeto en el lenguaje mquina utilizado por el computador, se utiliza
el paradigma (o metodologa) empleado para disear y construir un programa, puede diferen
ciarse entre cinco grandes tipos de lenguajes o paradigmas de programacin:
Programacin imperativa. El paradigma imperativo se basa en la implementacin de pro
gramas donde las instruccione se ejecutan de forma secuencial, es decir, una tras otra
siguiendo una secuencia ordenada que puede ser alterada por algunas de las instrucciones
del programa. Los lenguajes imperativos utilizan la programacin estructurada para
resolver sus problemas. Un programa tradicional, que sigue el paradigma estructurado, se
basa fundamentalmente en la ecuacin de Nicklaus Wirth (creador del lenguaje Pascal, entre
otros):
Algoritmos+ Estructuras de Datos= Programas

La anterior expresin significa que un programa puede entender. e como la unin de un


conjunto de algoritmos (mtodos o formas de definir de forma precisa y nica la solucin a
un problema) y un conjunto de estructuras que representan los datos o la informacin de que
se dispone sobre el problema a resolver. De esta forma, las funciones y procedimientos de
que manipulan y tratan esos datos y las estructuras que almacenan la informacin, se tratan
por separado, permitiendo de esta manera una depuracin (correccin de errores) y un man
tenimiento ms simple de los programas. Ejemplos de Lenguajes Imperativos son: Pascal,
Modula2, Ensamblador, Cobol, C, Clipper, Fortran, QuickBasic, etc.
Programacin Orientada a Objetos (POO). La programacin orientada a objetos, o POO,
se basa en el concepto de objeto. Un objeto es una entidad, o instancia concreta, que tiene
unos atributos concretos (los datos) y unas formas de operar sobre ellos, los mtodos o procedimientos. Durante la ejecucin del programa, los objeto reciben y envan mensajes a
otros objetos para realizar las acciones requeridas. En realidad, un objeto representa una
abstraccin del mundo real, es decir, una representacin simblica de algo concreto (por
ejemplo, cuando se define el objeto Persona, realmente se representa una serie de concep
tos abstractos que tiene que ver con el concepto Persona que se desea representar). En len

guajes imperativos, como Pascal, existe un concepto similar denominado TAD (Tipo
Abstracto de Datos). Un TAD encapsula un tipo definido por el usuario junto con las ope
raciones sobre estos datos, realizando un proceso de abstraccin en el que se trata de ocul
tar los detalles y agrupar caractersticas comunes para facilitar su uso y comprensin. La
diferencia entre el concepto de TAO y el de objeto radica en que adems del proceso de abs
traccin que se utiliza para su definicin, existen otros conceptos bsicos en la POO como
la herencia y el polimorfismo. La POO tiene actualmente una gran importancia dentro del
mundo de la informtica, por lo que existen gran cantidad de lenguajes orientados a obje
tos; algunos de los ms conocidos son: Smalltalk, Eiffel, C++, Modula3, Ada95, CLOS,
Object Cobol, Pitn, Java, C#, etc.

Programacin funcional. Lo. lenguajes que utilizan el paradigma funcional e. tn basados


en el concepto matemtico de funcin. Una funcin es una regla de correspondencia que
relaciona a dos elementos diferentes. Las funciones definidas en estos lenguajes (como en
cualquier lenguaje de programacin) estn formada por un conjunto de instrucciones que
aceptan una serie de datos (o parmetros), los manipulan (es decir, realiza algn tipo de ope
racin sobre ellos) y devuelven un resultado. En este tipo de lenguajes slo est permitida
la utilizacin de funciones y nicamente es posible devolver un valor desde la funcin; es
decir, no pueden cambiarse datos o variables que afecten de forma global a todo el progra
ma. La ventaja de este tipo de lenguajes proviene precisamente de este hecho; al no poder
modificar datos globales (que afectan a todas las partes de un programa) y slo poder utili
zar los parmetros de forma local (es decir, los datos slo on utilizables dentro de la fun
cin), cuando se produce un error, ste suele ser mucho ms simple de depurar que en el
caso de los lenguajes imperativos u Orientados a Objetos, donde estos cambios (aunque
nada recomendables para un buen programador) s son posibles de realizar. Ejemplos de
este tipo de lenguajes son: LISP, Gopher y Ha kell.

,. Programacin lgica o declarativa. Se utilizan conceptos provenientes de la lgica de pre


dicados. Este tipo de lenguajes, de los cuales el ms conocido es Prolog (aunque existen
otros lenguajes lgicos como CLP o KL 1, que incluyen adems de la programacin lgica
caractersticas como la concurrencia), son ampliamente utilizados en algunas disciplinas de
la informtica, como la Inteligencia Artificial.

,. Programacin concurrente. A diferencia de la programacin secuencial (implementa


da por los paradigmas anteriores), la programacin concurrente y distribuida ofrece la
posibilidad de ejecutar de forma simultnea diversas partes de un programa, o la de dis
tribuir un conjunto de recursos entre los diferente. procesos que lo forman (la progra
macin paralela es un caso particular de concurrencia). Aunque el lenguaje ADA fue de
sarrollado explcitamente para la implementacin de programas concurrentes y
distribuidos, el lenguaje no ha sido demasiado utilizado. Existen otros lenguajes como
Java, SR, Occam o Parlog que son habitualmente utilizados para la construccin de sis
temas concurrentes.
De las anteriores clasificaciones pueden extraerse algunos conceptos generales sobre el lenguaje
que va a ser utilizado en este libro, Pascal. Pascal es un lenguaje compilado, por lo que se nece
sitar utilizar algn tipo de aplicacin software que tenga incorporado el compilador y que nos
permita generar el cdigo mquina para poder ejecutar nuestros programas. Por otro lado, se trata

de un lenguaje imperativo, por lo que el diseo e implementacin de nuestros programas estarn


basados en la programacin estructurada.

Principios de la programacin estructurada:


diseo descendente, abstraccin de datos
v_p.[9!_amas
La mayora de los lenguajes imperativos (aunque no todos), como Pascal, utilizan tcnicas de
programacin estructurada que les permite disear e implementar programas de mayor comple
jidad que cuando se utilizan otras tcnicas como los organigramas o el pseudocdigo. En par
ticular, pueden describirse tres caractersticas fundamentales de la programacin estructurada: el
diseo descendente (topdown) de un programa, la abstraccin de datos y la abstraccin proce
dimental.

2.5. 1. Programacin modular y estructurada


Las tcnicas de representacin grfica (organigrama) de un algoritmo son tiles cuando el pro
gramador se enfrenta a problemas de complejidad media o baja. Pero cuando se desea construir
programas de mayor complejidad se deben utilizar las tcnicas de programacin modular y programacin estructurada.

Programacin Modular. Esta tcnica descompone el programa en un conjunto de mdu


los independientes entre s. Cada uno de estos mdulos deber realizar una tarea concreta
ms simple que el problema completo. Posteriormente, la integracin de los diferentes
mdulos en los que se ha dividido el programa resolver el problema. Por lo tanto, el resul
tado de la descomposicin modular de un programa ser una jerarqua de mdulos, donde
existe un mdulo de ms alto nivel que se va refinando en sentido descendente para encon
trar mdulos ms simples. La tcnica debe ser aplicada suce ivamente hasta obtener mdu
los lo suficientemente simples para ser fcilmente codificables. Cada uno de esto mdulos
debe definir tareas concretas lo ms independientes posible.
Programacin Estructurada. Este trmino se refiere aJ conjunto de tcnicas empleadas
para aumentar la productividad a la hora de e cribir programas (disminuyendo el tiempo
requerido para escribir, verificar, depurar y mantener los programas). La programacin
estructurada incorpora el siguiente conjunto de tcnicas:
- Diseo Descendente (topdown).
- Abstraccin de datos y procedimientos.

- Definicin de estructuras bsicas (referidas a la creacin de estructuras de datos que


pueden almacenar la informacin).

2.5.2. Diseo descendente


La filosofa del diseo descendente puede resumirse en que se descompone un problema o tarea
en sucesivos niveles de detalle. Para ello, se descompone el programa en diversos mdulos inde
pendendientes (procedimientos, funciones, bloques de cdigo, etc.). Por lo tanto, el diseo des
cendente utiliza la modularizacin para detectar las diferentes tareas o subtareas que deben ser
implementadas para resolver el problema. La Figura 2.6 muestra un ejemplo de la de composi
cin modular de un programa que calcula la media aritmtica de las edades y salarios de un grupo
de empleados, y que finalmente muestra un listado ordenado de los empleados con us edades,
salarios y las medias calculadas.

Encentrar medias. ordenar


y mostrar salarlos, edades

Leer datos

Leer
salarlos

Leer
edades

Calcular media

Calcular
media:
edades

Mostrar resultados

Calcular
media:
salarlos

Ordenar
datos

Mostrar
media
edad

Mostrar
media
salarlo

Mostrar
datos
empleados

Mostrar
salarios

Mostrar
edades

Figura 2.6. Descomposicin modular de un problema en subproblemas ms simples.

El diseo descendente (topdown) es una tcnica de diseo en la que se ataca un problema


general complejo, descomponindolo en subproblemas ms pequeos. A esta tcnica se la cono
ce tradicionalmente por "Divide y vencers". Sin embargo, para diferenciar los conceptos de
diseo descendente y modularidad, puede suponerse que se desea utilizar un diseo ascendente
(bottorn-up) para construir un programa. En este caso los mdulos sern construidos de abajo
hacia arriba; es decir, se partira de un conjunto de mdulos muy simples predefinidos que pue
den ser agregados (integrados) para formar mdulos ms complejos hasta resolver el problema.
La Figura 2.7 muestra cmo partiendo de un conjunto de mdulos muy simples, que pueden rea
lizar tareas como leer/mostar un dato, calcular medias aritmticas, ordenar elementos, etc., se
obtiene finalmente un programa que es capaz de resolver el mismo problema que en el ejemplo
anterior.
Una tcnica de diseo ascendente slo tendra sentido si es posible la reutilizacin de
cdigo disponible para el programador. La tcnica utilizada por la mayora de los lenguajes

Repetir para los N empleados

I Leer: salario I
1 Leer:edad I

I Calcular media: edades I


I Calcular media: salarios I

Mostrar
datos

Calcular media

Mostrar
salario

,.e

Mostrar
media
salario
=

Repetir para los N empleados

'

Ordenar
datos

Mostrar
media
edad

't

Mostrar
edad

Mostrar
datos
empleados
1

Mostrar resultados
1

,'
Encontrar medias, ordenar
1

y mostrar salarlos, edades

Figura 2. 7. Diseo ascendente, o bottom-up, para la implementacin de un programa.

estructurados, como Pascal o C, es la del diseo descendente y la modularizacin. E ta tcni


ca es general y permite abordar problemas de complejidad media/alta, pudiendo combinarse
con otras tcnicas, como, por ejemplo, el diseo ascendente (para construir pequeos m
dulos) o los organigramas para especificar el funcionamiento de alguna de las tareas a de
sarrollar.
Para ver la aplicacin de este tipo de tcnicas, puede plantearse el siguiente ejemplo. Se desea
disear un programa que resuelva el problema de la bsqueda de un patrn en una cadena. Se dis
pone de un conjunto de funciones y procedimientos simples de entrada/salida que han sido pro
bados y depurados previamente, y que pueden utilizarse para implementar algunos de los mdu
los en los que se ha dividido el problema. Es decir, el problema que se desea resolver necesita
leer varias cadenas de texto sobre las que se desea encontrar el nmero de repeticiones de un
determinado patrn que es proporcionado por el usuario, y mostrar finalmente el resultado obte
nido. Por ejemplo, dado el siguiente texto, se desea buscar el nmero de veces que aparece repe
tido el patrn "no".
" En u n 1 u g a r d e I a Ma n e h a , d e e u y o n o mb r e n o q u i e r o a e o r d a r me .
mu e h o t i e mp o q u e v i v a u n h i d a I g o d e I o s d e I a n z a e n a s t i 1 1 e r o ,
ga antigua, rocn flaco y galgo corredor ... "

no ha
adar

Como puede verse en el texto anterior, el nmero de patrones que coinciden con el buscado
es dos. Por lo tanto, aplicando la tcnica de diseo descendente, el problema inicial de desarro
llar un algoritmo de bsqueda de patrones puede descomponerse en varios subproblemas. Por
ejemplo, ser necesario disponer de algn mdulo que muestre al usuario el propsito del algo
ritmo que se desea disear (que podra ser construido utilizando un conjunto de submdulos sim
ples de entrada/salida). Ser necesario solicitarle el patrn que se desea buscar, pedir la cadena
de texto sobre la que se quiere buscar el patrn proporcionado, realizar el proceso de bsqueda
en el texto y finalmente mostrar los resultados obtenidos al usuario (vase la Figura 2.8).

Algoritmo de bsqueda de patrones

Indicar el propsito
del algoritmo

Pedir el patrn
a buscar

Solicitar
e/patrn

Pedr el texto en
el que se buscar

Efectuarla
bsqueda

Presentar
/os resultados

Leer el patrn
del teclado

Figura 2.8. Descomposicin modular del problema de bsqueda de patrones.

Gracias al diseo modular, cada uno de los mdulos anteriores puede ser tratado de forma
independiente para resolver el problema solicitado. Cuando la descomposicin es suficientemen
te simple, puede comenzarse con la codificacin del mismo en el lenguaje seleccionado. Si, por
el contrario, alguno de los mdulos fuese demasiado complejo, podra volver a aplicarse la des
composicin en submdulos o subproblemas ms simples hasta alcanzar el nivel de complejidad
deseado.

2.5.3. Abstraccin procedimental


Otro elemento esencia] dentro de la programacin estructurada es la abstraccin. El concepto de
abstraccin puede definirse como una simplificacin de la realidad, en la que ciertas propiedades
y caractersticas de los objetos reales se dejan de lado porque no interesan para el problema a
resolver. Por Jo tanto, la abstraccin permite ocultar datos irrelevantes aJ programador para la
resolucin de un problema.
La abstraccin procedimental permite al programador concentrarse en lo que el procedimien
to o subprograma debe hacer, y no en los detalles particulare de cmo lo hace. El algoritmo que
resuelve el problema descrito en cada mdulo en que e ha descompuesto el programa puede er
tratado como una "caja negra". Es decir, la caja negra especifica Lo que hace, pero no cmo Lo
hace. NormaJmente estas cajas negras sern implementadas finalmente como subprogramas. La
abstraccin procedimental permite, por lo tanto, separar el propsito de un subprograma de una
implementacin o codificacin interna. Una vez que la caja negra ha sido programada, puede ser
utilizada sin necesidad de conocer cmo ha sido construida; ser suficiente con conocer una des
cripcin de la tarea que resuelve, la informacin de entrada que necesita y los resultados que
genera. En el ejemplo mostrado en la Figura 2.9, la abstraccin procedimental permite detectar
un conjunto de cajas negras, o mdulos, que una vez han sido implementados, pueden ser utili
zados como mdulos independientes.

Calcular media aritmtica y desviacin


tfpica de k nmeros enteros

Leer datos

Calcular
desviacin
tfplcs

Calcular
media

Leer teclado:
r a_
d o_
, _
s __,
[mfnlmo.. mximo) .____L_ee__

Kenteros
[mfnlmo .. mxkno} ._

Calcular media

Mostar
resultados

K enteros
{mfnlmo.. mxlmo]

_,

K enteros
1.
:::1
{mfnlmo.. mxtmo LCaicular desvlacl:ir- Resultado2 - a (K valores)

Resultado1
Resultado2 .

Mostrar resultados

L___

Mostrar datos: (resultado 1, resultado2)

Figura 2.9. Proceso de abstraccin procedimental aplicado al problema de calcular la media y

desviacin tfpica de K nmeros.

2.5.4. Abstraccin de datos


La abstraccin de datos utiliza el mismo concepto que la abstraccin procedimental. La utiliza
cin de la abstraccin de datos permite al programador concentrarse en cmo deben ser utiliza
dos los datos, sin tener que preocuparse de cmo estn internamente representados o de cmo se
manipulan esos datos en la memoria del computador. La abstraccin de datos permite al progra
mador concentrarse en las operaciones que van a realizarse sobre los mismos. Pascal permite la
definicin de Tipos Abstractos de Datos (TAO). Un TAO es una coleccin de datos y un con
junto de operaciones que pueden realizarse sobre esos datos. Las operaciones pueden aadir nue
vos datos, eliminar datos existentes, modificar la informacin de algn dato en particular, visua
lizar la informacin, etc. Normalmente los TAO se implementan utilizando lo que se denomina
estructuras de datos. Una estructura de datos es una coleccin de datos ms simples que son
reunidos en una estructura ms compleja. Por lo tanto, un TAO y las estructuras de datos que lo
forman, permiten definir tipos de datos complejos utilizando procesos de abstraccin.
Por ejemplo, si se desea construir un programa que trabaje con informacin relativa a perso
nas, lo natural sera disponer de algn tipo de estructura de datos que permitiese abstraer el con
cepto "persona". Puesto que no es lgico suponer que un lenguaje de programacin concreto pro
porcione una estructura de datos "predefinida" que permita representar directamente el concepto
"persona" (debido a que no se sabra exactamente qu tipo de datos son los que deben ser alma
cenados), es necesario, utilizando la abstraccin de datos, definir el tipo adecuado para que el
programa que se desea implementar puede trabajar con esa informacin.
La Figura 2.1 O muestra el tipo de dato que se ha definido para representar el concepto abs
tracto de persona, y las operaciones permitidas sobre ese tipo de elementos. Como puede verse,
toda la informacin relativa a una persona puede tratarse como un todo (TAO = estructura de
datos + operaciones), sin necesidad de preocuparse de cmo estn creadas esas estructuras, u
operaciones, de forma interna en el programa.

Estructura de datos: Persona

Nombre: tipo cadena


Ape/1/dos: tipo cadena
Fecha nacimiento: tip ha
Edad: entero
Altura: real
Sexo: rv, M)
Aficiones: conjunto d(,obbles

Dfa: 0.. 31
Mes: Enero .. Diciembre
Ao:0.. 2050

Deportes: nadar, krate, ski, bucear, ...


Espectculos: cine, teatro, conciertos, ...
Otros: leer, pasear, viajar, ...
TADpersons
Operaciones permitidas

Aadir persona
Borrar persona
Modificar nombre, apellidos
Modificar edad, altura
Aadir aficin

Figura 2.10. Definicin del Tipo Abstracto de Datos "Persona".

2.5.5. Resolucin de problemas


Desde el punto de vista de la programacin estructurada, la resolucin de un problema se consi
gue gracias a la combinacin de las anteriores tcnicas.
Se aplicar una tcnica de diseo del programa que permita atacar el problema de una forma
ms simple (topdown, bottomup ... ) y se aplicarn tcnicas de abstraccin, tanto para el diseo
de los datos y estructuras que va a utilizar el programa como para los mdulos necesarios para
resolverlo.
Desde este punto de vista, un programa estar formado por un conjunto de estructuras de datos
y las operaciones que trabajan sobre ellos, junto con el conjunto de algoritmos necesarios para
resolver cada uno de los diferentes subproblemas que hayan sido encontrados.
PROGRAMA= Estructuras de Datos+ Algoritmos

Ciclo de vida de un roducto software


La programacin, o la resolucin de problemas mediante la utilizacin de computadores, tiene
dos caractersticas claramente contrapuestas. Por un lado, tiene algo de arte, al requerir ciertas
dosis de creatividad e imaginacin por parte de los programadores que tratan de resolver el pro
blema. Por otro lado, se trata de una ciencia con mtodos y tcnicas formales que permiten el de
sarrollo de programas y productos software. El trmino Ingeniera del Software se emplea para
describir el rea de la informtica que se dedica al estudio, desarro11o y utilizacin de esas tcni
cas.
Un producto software no est nicamente formado por uno o varios programas, sino que ade
ms suele llevar asociado una serie de datos, documentacin (manuales), recomendaciones del
fabricante, etc. Todo este material se utiliza para resolver el problema para el cual fue diseado
e implementado el producto. Se entiende por ciclo de vida de un producto software el periodo
de tiempo que comprende desde el momento en que se decide desarrollar un programa hasta que
ste deja de estar en funcionamiento. Existen multitud de modelos y tcnicas diferentes para
describir las distintas etapas en las que puede dividirse el ciclo de vida. Sin embargo, hay diver
sas fases comunes (muy generales) en el proceso de desarrollo de cualquier software; estas fases
son: anlisis y especificacin del problema, diseo, codificacin, verificacin y validacin, ins
talacin y prueba, explotacin y mantenimiento, y finalmente la retirada del producto oftware
(Figura 2.11).
Anlisis
Diseo
Codificacin
Verificacin y
validacin
Instalacin y
prueba

,__.. . ._--.. . _------

Explotacin y
mantenimiento
Retirada

Figura 2. 11. Fases del ciclo de vida de un producto software.


Cada una de las anteriores etapas describe una de las posibles fases en las que puede encon
trarse cualquier producto. Como puede verse en la anterior figura, las etapas estn interconecta
das, por lo que puede pasarse desde una etapa determinada a alguna de las anteriores si fuese
necesario. Por ejemplo, si en la fase de codificacin se descubren problemas que no se tuvieron

en cuenta en el momento del anlisis o del diseo, se puede pasar desde esa etapa a alguna de las
anteriores para subsanar los problemas detectados.
Debe tenerse en cuenta que volver atrs en cualquiera de las etapas supone un coste adicional
para el desarrollo del producto software, dado que si en la fase de explotacin se detectasen pro
blemas que no fueron contemplados en la etapa de codificacin, implicara nuevamente volver a
codificar, verificar, validar, instalar y probar el producto, con lo. costes aadidos que esto con
lleva. Por lo tanto, cada una de las etapas anteriores debe ser minuciosamente tratada si no se
desea cometer errores que posteriormente alargaran el ciclo de de. arrollo del producto y aumen
taran los costes de produccin del mismo. Como principales caractersticas de cada una de las
fases del ciclo de vida de un producto software pueden destacarse las siguientes:
Anlisis y especificacin del problema. La especificacin de cualquier problema puede ser
un tanto vaga o imprecisa. En esta primera fase debe detallarse de forma clara, precisa y sin
ambigedades qu debe hacer el programa. Una vez finalizada la etapa de anlisis debe
obtenerse una especificacin precisa del problema que se desea resolver. En esta fase los
analistas de sistemas (encargados de realizar estas tareas) deben generar un conjunto de
documentos que describan las especificaciones del problema como una declaracin formal
de los requerimientos del mismo.
Diseo. Una vez obtenida la especificacin del problema, es necesario disear una solucin
que permita resolverlo. En esta fase se decide cmo el producto software va a satisfacer los
requisitos especificados en la etapa anterior. Dos aspectos muy importantes a tener en cuen
ta en esta fase son: en primer lugar, decidir qu estructuras de datos van a utilizarse para
organizar y almacenar los datos que sern procesados, y, en segundo Jugar, disear los pro
cedimientos o mdulos encargados de realizar ese procesado de los datos (diseo de los
algoritmos que sern utilizados). Como un computador no tiene la capacidad de resolver
ningn problema, los procedimientos diseados debe ser formulados como un conjunto de
acciones simples en un determinado orden. Normalmente, los problemas reales on tan
complejos que es difcil anticipar desde un principio todos los detalles que ser necesario
implementar para resolverlo. En esta etapa suelen utilizarse tcnicas o estrategias, como
divide y vencers, que permiten dividir el problema en subproblemas ms sencillos, cada
uno de los cuales puede ser tratado de forma independiente. En esta fase, tanto las estruc
turas de datos, como los algoritmos que deben resolver el problema, pueden ser especifica
dos de diferentes formas: mediante diagramas grficos, utilizando lenguaje natural, o
mediante la utilizacin del lenguaje llamado pseudocdigo. Este tipo de lenguaje, que se
encuentra a medio camino entre el lenguaje natural y un lenguaje de programacin, permi
te describir de forma unvoca un algoritmo, utilizando las estructuras de control habituales
en los lenguajes de programacin y el lenguaje natural.
Codificacin. Las dos primeras etapas del ciclo de vida son crticas.Si se han cometido
errores o se han omitido aspectos importantes, las siguientes etapas sern mucho ms com
plicadas. La codificacin consiste en implementar en el lenguaje de programacin seleccio
nado las diferentes estructuras de datos y procedimientos, o algoritmos, que se han obteni
do tras la fase de diseo. Dado que en la fase de diseo tanto las estructuras de datos como
los procedimientos pueden haber sido generados en lenguaje natural o en pseudocdigo, en
esta fase es necesario tener en cuenta las reglas sintcticas y gramaticales del lenguaje uti

lizado para realizar una traduccin correcta. El objetivo de la primera parte del libro es pre
cisamente introducir el vocabulario, la sintaxis y las estructuras de control que pueden uti
lizarse para crear programas o algoritmos (que sern estudiados en la segunda parte del
libro), en Pascal. Por lo tanto, en la etapa de codificacin, los programadores (encargados
de llevarla a trmino) debern comprender y estudiar las diferentes caractersticas que for
man el lenguaje seleccionado: la definicin de variables y constantes, cmo pueden ser
declarados y utilizados diferentes tipos (estructuras) de datos, las operaciones realizables
sobre los datos, cmo se realiza la entrada/salida de informacin, cmo generar comenta
rios que mejoren la legibilidad y mantenimiento del cdigo y, finalmente, cmo se define la
estructura de un programa en el lenguaje utilizado.
Verificacin y validacin. Aunque se pueden producir errores en cualquiera de las etapas
del ciclo de vida del producto software, por ejemplo, la especificacin puede no reflejar
todas la caractersticas del problema, o pueden haberse cometido errores lgicos en la
implementacin de los algoritmos o de las estructuras de datos. La deteccin y correccin
de los errores es una parte importante del ciclo de vida; a esta fase se la conoce como vali
dacin y verificacin. La validacin consiste en comprobar que tanto los algoritmos como
el programa implementado cumplen con las especificaciones del problema. La verificacin
consiste en la comprobacin de que esos algoritmos son correctos y completos. Es decir, se
necesita comprobar que se est resolviendo el problema correcto (no siempre la solucin
proporcionada corresponde exactamente a lo que se haba pedido), y que adems el proble
ma se est resolviendo de forma correcta. La caracterstica ms importante de cualquier pro
grama es que sea an ,a::to. Es decir, no importa lo bien diseado o documentado que est;
si el programa no produce los resultados esperados, no ser de ninguna utilidad para aque
llas personas que necesiten utilizarlo. Normalmente, y dado que ser necesaria la verifica
cin y validacin en diferentes fases del ciclo de vida del producto, suelen implementarse
diferentes tipos de pruebas para detectar posibles anomalas. Algunas de las pruebas ms
comunes son:
- Pruebas de unidad. Se utilizan para probar las diferentes unidades o mdulos (partes)
de un programa de forma independiente, para garantizar, de ese modo, que cada mdu
lo realiza , us funciones de forma correcta.
- Pruebas de integracin. Estas pruebas verifican que una vez que los distintos mdulos
o unidades son combinados, stos producen los resultados esperados.
- Pruebas del sistema. Finalmente se verifica que el sistema completo funciona correc
tamente.
,. Instalacin y depuracin. Normalmente, para un programador el ciclo de vida termina en
la cuarta fase; es decir, una vez que el programa ha sido codificado, ejecutado y probado, la
funcin fundamental del programador se considera terminada. Sin embargo, cualquier pro
ducto real normalmente se encuentra en el mercado durante varios aos, por lo que es nece
sario continuar su mantenimiento durante ese periodo. Una vez que el producto ha sido veri
ficado y validado, necesita ser instalado en el entorno final donde deber funcionar. En esta
etapa deben corregirse los errores y problemas que pueden haber aparecido una vez instala
do el producto para que sea utilizado por los usuarios finales.

Explotacin y mantenimiento: Desde que el producto software es puesto a disposicin de


los usuarios finales, es posible (incluso probable) que durante varios aos se necesite reali
zar alguna modificacin o adaptacin a las nuevas caractersticas del software (por ejemplo,
cambios en los sistemas operativos) o del hardware (por ejemplo, cambios en las arquitec
turas utilizadas) que puedan producirse. Debe tenerse en cuenta que, aunque los productos
hayan sido probados y depurados, cuando stos son muy complejos, pueden aparecer erro
res mucho tiempo despus de haber sido instalados. Este ciclo , uele . er el ms largo de
Lodos los considerados, y el que mayor cantidad de recursos econmicos y de tiempo de lo.
programadores requiere.

Retirada: Finalmente, todo producto software debe ser eliminado y dejar de estar operati
vo, por lo que ser retirado del mercado.

Cuestiones tipo test

Las siguientes cuestiones de tipo test permiten al lector revisar los principales conceptos tericos
estudiados en el captulo. Se trata de cuestiones multirrespuesta, es decir, como mnimo una de
las respuestas es vlida, aunque podra haber ms de una respuesta correcta en cada cuestin
planteada. Las soluciones de las cuestiones pueden ser consultadas en el Anexo X.
2.7.1.

Cules de las siguientes afirmaciones son correctas?


a) Los algoritmos y los programas son lo mismo.
b) Los algoritmos deben ser precisos.
e) Los programas son siempre independientes del lenguaje de programacin.
d) Un programa codifica uno o varios algoritmos.
e) Todas son falsas.

2.7 .2.

Indicar cules de las siguientes afirmaciones son correctas:


a) Un organigrama puede utilizarse para expresar la correccin sintctica de una
expresin.
b) Los organigramas pueden utilizarse en la fase de diseo del ciclo de vida del soft
ware.
e) Un organigrama expresa grficamente lo que un pseudocdigo en lenguaje na
tural.

d) Los organigramas son representaciones grficas de la estructura de un programa.


e) Ninguna de las anteriores.
2.7 .3.

Dado el siguiente organigrama, el algoritmo que implementa verifica las siguientes


caractersticas:

dato1 +dato2+- 10

escribir (dato1 -dato2}


incrementar (dato1)

falso

a) La variable dato 1 tiene el mismo valor que dato2, es decir 1 O.


b) El nmero de iteraciones que realiza el bucle es 10 y termina.
e) La variable datol alcanza el valor de 11 y supera el valor de dato2.
d) El nmero de veces que se evala la condicin lgica (dato2 datol) es 11.
e) Ninguna de las anteriores.
2.7.4.

Para el organigrama mostrado en la cuestin anterior, la salida que mostrara la eje


cucin del algoritmo es:
a) O,-l,-2,-3,-4,-5,-6,-7,-8,-9

b) -1,-2,-3,-4,-5,-6,-7,-8,-9,-10
c)

-10,-9,-8,-7,-6,-5,-4,-3,-2,-l,O

d) -10,-9,-8,-7,-6,-5,-4,-3,-2,-l
e) Ninguna de las anteriores.
2.7.5.

Las principales diferencias entre los posibles paradigmas de programacin estudiados


en el captulo pueden resumirse en:
a) La forma en que estos algoritmos disean sus estructuras de datos.
b) Cmo pueden ser utilizadas las distintas estructuras de control para dirigir el pro
ceso o flujo de instrucciones y datos.
e) La forma en la que pueden construirse los programas, es decir, en la metodologa
utilizada para disear y construir el algoritmo encargado de resolver el problema.
d) La forma de traducir el cdigo fuente, en el que ha sido implementado el progra
ma, al cdigo mquina o ejecutable.
e) Ninguna de las anteriores.

2.7 .6.

Las principales caractersticas que permiten distinguir a un lenguaje que utiliza la pro
gramacin estructurada de otros que no la emplean son:
a) La utilizacin de compiladores para generar el cdigo mquina.
b) La utilizacin de tcnicas de programacin modular, que permiten descomponer
el problema inicial en subproblemas ms simples.
e) La existencia de instrucciones especiales que permiten realizar saltos fuera de
bucles o subprogramas, cuando esto sea necesario.
d) La utilizacin de tcnica de abstraccin de datos y procedimientos, y de otras tc
nicas como el diseo descendente, para lograr una mayor productividad del . oft
ware y permitir una depuracin y verificacin ms simple del mismo.
e) Ninguna de las anteriores.

2.7.7.

Cuando se utiliza la abstraccin, tanto de datos como de procedimientos, en cualquier


tipo de lenguaje (imperativos, estructurados, orientados a objetos, etc.) se pretende:
a) Conseguir dotar a los programas de una representacin de la informacin y de los
elementos que deben manipularla (procedimientos) adecuados al problema consi
derado, olvidando detalles innecesarios que complicaran la implementacin y
depuracin del cdigo.
b) Mejorar la velocidad de los programas al permitir concentrarse nicamente en lo
detalles importantes o relevantes del problema considerado.
e) Permitir que dos subprogramas que hayan sido implementados utilizando diferen
tes lenguajes de programacin, puedan ser reutilizados gracias a la abstraccin
procedimental.
d) Permitir disear e implementar los datos y los procedimientos que deben ser mani
pulados por el programa, sin tener la necesidad de conocer cmo han sido real
mente construidos. Es decir, disear estructuras que representen la informacin y
las operaciones que las manipulan, como si de una caja negra se tratase.
e) Ninguna de las anteriores.

2.7 .8.

Dado el siguiente algoritmo codificado en pseudocdigo, se cumplen las siguientes


caractersticas:

START
//se asignan los valores iniciales a las variables
a 1
b 3

e o
wh i 1 e ( a s b) do
be g i n
i f (a+I b) t he n
mo s t r ar ( a* b)

e 1 se
be g i n
e f 4
repeat

un t i 1

mo s t r ar ( a+ b)
e f e -1
( e < a)

end
a f a +l

end
END

a) EJ nmero de iteraciones que realiza el bucle while implementado es 3.


b) EJ algoritmo no muestra nada por pantalla porque nunca se entra en el bucle while.
e) El nmero de iteraciones que realiza el bucle repeat-until implementado es l.
d) La salida que mostrara por pantalla es: 4, 4, 4, 4, 6, 9.
e) Ninguna de las anteriores.
2.7.9.

Si en el algoritmo anterior se modifican las condiciones lgicas de la forma que se


muestra a continuacin, el resultado que se obtendra al ejecutarlo verifica:

START
wh i 1 e ( a > b)

do

repeat

until

(e a)

END

a) La salida que mostrara por pantalla es: 4, 4, 4, 6.


b) El nmero de iteraciones que realiza el bucle while implementado es 3.
e) El aJgorilmo no muestra nada por pantaJJa, porque nunca e entra en eJ bucle
repeat.
d) EJ nmero de iteraciones que realiza el bucle repeat-until implementado es L, y el
bucle while realiza una iteracin.
e) Ninguna de las anteriores.
2.7.10.

De las diferentes fases o etapas en las que puede dividir e el ciclo de vida de un pro
ducto software, pueden destacarse como ciertas las siguientes afirmaciones: