You are on page 1of 22

Tema 7

Programaci on estructurada
Antes de comenzar a programar es preciso saber desarrollar algoritmos. Como se ha visto en el
tema anterior, un algoritmo es una descripcion detallada de los pasos a seguir para resolver una
tarea. Los pasos han de ser operaciones capaces de ser llevadas a cabo por el operador al cual
va dirigido el algoritmo.
A n de poder abordar problemas complejos es preciso aprender a dise nar correctamente
algoritmos y sus diagramas respetando las reglas de la programacion estructurada. Para ello
se presentan en este tema una serie de algoritmos basicos los cuales se han dividido en varios
grupos.
7.1 Fundamentos de la programaci on estructurada
Es difcil hacer un resumen de las ideas de la programacion estructurada a lectores que no tienen
cierta experiencia en programacion. Esto sucede porque la programacion estructurada pretende
evitar cierto tipo de situaciones que aparecen en programas grandes y medianos, pero que no
se advierten en los ejemplos dados a principiantes. Una de estas situaciones es la siguiente: un
programador escribe un diagrama de ujo tal y como aparece en la parte derecha de la gura 7.1.
Transcurrido cierto tiempo, el mismo programador es requerido para realizar una modicacion
en el mismo.

Este intenta modicar el diagrama, pero la tarea le resulta ardua. Analizando los
motivos por los que el trabajo no avanza con rapidez se puede observar que:
Es difcil hallar el punto en el cual hay que eliminar un bloque o insertar uno nuevo, pues
todo esta enmara nado.
Incluso aunque el diagrama tuviera una mejor disposicion graca, cuesta trabajo ver si
121
122 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
Figura 7.1: Diagrama de ujo estructurado (izquierda) y no estructurado (derecha).
una modicacion de una parte dara resultados indeseables en otra, debido al gran n umero
de interconexiones que hay.
Y los problemas no acaban ah. Tras realizar los cambios, el programador debera probar el
nuevo programa para comprobar su correcto funcionamiento. Cada vez que se detecte un error
debera volver a repetir el tedioso proceso de modicacion. Los problemas descritos no seran
tales si el programador hubiera podido escribir el diagrama de ujo de forma parecida a la de
la gura 7.1 (izquierda), en la que se aprecia que no existen cruces de lneas y que cada modulo
tiene una entrada y una salida. Sobre estos dos aspectos se insistira mas adelante, por ahora no
es necesario comentar mas las ventajas que para cualquier proyecto supone el tener programas
legibles y comprensibles.
7.1.1 Flujo lineal
Los diagramas se dice que tienen ujo lineal cuando no existen conexiones de vuelta atras o
laterales. El ujo lineal se puede conseguir restringiendo las uniones entre bloques constructivos
a estructuras de entrada unica y salida unica. Es decir, usando para la confeccion del diagrama
de ujo grupos de bloques a los cuales llega solo una echa y de los cuales parte solo una echa.
La secuencia, la seleccion entre alternativas y la iteracion forman un conjunto suciente de
modulos constructivos para describir cualquier algoritmo. Es decir, es posible siempre realizar
c MRA & JAAR 2010 DISA. ESI. US. 123
un diagrama de ujo que contiene solo las estructuras citadas. En la gura 7.2 se tienen tales
estructuras; se puede ver que son de entrada unica y salida unica.
mdulo 1
mdulo 2
condicin
cuerpo del bucle
s
no
pregunta
s
no
opcin 2 opcin 1
pregunta
cuerpo del bucle
s
no
secuencia disyuncin
repeticin con salida
en cola
repeticin con salida
en cabeza
Figura 7.2: Construcciones o uniones de bloques permitidaspara programas estructurados.
Estas estructuras permitidas reciben los nombres que se indican a continuacion. De izquierda
a derecha en la citada gura 7.2 se tiene un par de bloques formando una secuencia, una bi-
furcacion y bloques articulados en una estructura disyuntiva, una bifurcacion con conexion
hacia atras formando un blucle o estructura repetitiva con salida en cola y, nalmente, una
bifurcacion formando una estructura repetitiva con salida en cabeza.
En lo sucesivo se usaran estas estructuras (y ninguna otra) para realizar los diagramas
de ujo, pero antes de pasar a los ejemplos es preciso comentar como se va a producir la
descomposicion del problema global en modulos.
7.1.2 Analisis descendente
En ocasiones se presenta la programacion estructurada como un conjunto de reglas a seguir. En
realidad no hay una denicion exacta de programacion estructurada, por lo que las reglas son
solo una aproximacion. Una idea importante de la programacion estructurada es el an alisis
descendente o jerarquizado. Consiste este en identicar las funciones o tareas a cumplir por
el programa desde un punto de vista global y proceder luego a descomponer estas funciones en
otras menores.

Estas a su vez se vuelven a descomponer en un proceso que termina cuando se
alcanza el nivel del lenguaje o codigo usado. De este modo, el dise no del programa se realiza
por niveles. Se comienza por el nivel mas general y se termina por lo particular o concreto.
El resultado del analisis descendente es un conjunto de diagramas que describen el algoritmo
con un nivel de detalle creciente. En un primer nivel el diagrama de ujo puede tomar la forma
dada en la gura 7.3 en la parte superior. En un segundo nivel, cada uno de los modulos es
detallado en un diagrama aparte. El proceso contin ua mientras existan bloques que necesiten
explicaciones adicionales.
124 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
Inicio de lectura
de datos
Fin de lectura de
datos
...
Inicio de clculo
de resultados
Fin de clculo de
resultados
...
Inicio de
escritura de
resultados
Fin de escritura
de resultados
...
Inicio
Fin
Lectura de datos
Clculo de
resultados
Escritura de
resultados
Figura 7.3: El analisis descendente aplicado a la confeccion de diagramas de ujo.
c MRA & JAAR 2010 DISA. ESI. US. 125
Es importante que antes de pasar al siguiente nivel se compruebe la validez del diagrama
actual. Para ello se ha de comprobar que las construcciones utilizadas pertenecen al conjunto
de las estructuras permitidas.
7.2 Calculos en secuencia
Los calculos en secuencia no presentan dicultad alguna desde el punto de vista algortmico.
Los diagramas de ujo resultantes son lineales, sin bifurcaciones ni ciclos o repeticiones, y por
tanto de facil creacion.
Un programa evoluciona de modo lineal cuando realiza toda la secuencia de instrucciones de
forma continua, sin saltos en la ejecucion.

Este es el caso presentado en el ejemplo de la suma
de dos n umeros (ver gura 7.4). La realizacion y representacion en diagrama de ujo de estos
programas es muy simple.
a Variable real primer dato
b Variable real segundo dato
c Variable real
resultado, suma de a
y b
Escribir c
Leer a
Inicio
c a+b
Fin
Leer b
Figura 7.4: Diagrama de ujo de un algoritmo para sumar dos n umeros.
7.2.1 Ejercicios
Se propone realizar el diagrama de ujo de algoritmos que resuelvan las tareas siguientes:
1. Leer dos valores reales p y q del teclado y escribir media aritmetica.
2. Leer un valor real x del teclado. Calcular y escribir r = x
2
2x
3
.
126 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
3. Leer los coecientes de un polinomio de grado tres de la forma P(x) = x
3
+ ax
2
+ bx + c.
Leer a continuacion un cierto valor para la variable independiente x y calcular y escribir
y = P(x).
4. Convertir a radianes un valor de angulo medido en grados sexagesimales.
5. Calcular y escribir la temperatura T que corresponde a un mol de gas ideal sometido
a una presion P cuando ocupa un volumen V . Se supone que los valores de P y V se
proporcionan por teclado.
7.3 Estructuras selectivas
Las disyunciones o estructuras selectivas se construyen mediante un bloque bifurcacion conectado
dos modulos que despues vuelven a unirse. En el interior de cada modulo puede haber otras
estructuras permitidas: secuencias, iteraciones, etc.
Las bifurcaciones permiten tomar un camino o su alternativa, permitiendo que el programa
discurra por uno de dos caminos posibles en funcion de condiciones. Un ejemplo muy simple es
el siguiente: leer un n umero real por teclado y escribir el valor absoluto del mismo. Una forma
de resolver el programa es mediante el diagrama de ujo de la gura 7.5. La idea es hacer que
la secuencia de ejecucion pase por la escritura del n umero o del n umero cambiado de signo en
funcion de que sea positivo o negativo.
Nota importante: en este libro la palabra positivo se ha de entender como mayor que cero
quiere esto decir que el n umero cero no forma parte del conjunto de los n umeros positivos.
x Variable real dato
r Variable real
resultado, valor
absoluto de x
Escribir
r
Leer x
Inicio
Fin
x < 0 ?
s no
r -x r x
Figura 7.5: Diagrama de ujo con ruptura de secuencia.
c MRA & JAAR 2010 DISA. ESI. US. 127
Las bifurcaciones se pueden encadenar para dar solucion a situaciones mas complejas. Por
ejemplo considerese la funcion: NC(x, y), con (x, y) IR
2
c {1, 2, 3, 4}. Esta funcion calcula
el n umero de cuadrante en que se encuentra el punto (x, y) de IR
2
. Se desea desarrollar un
algoritmo que lea las coordenadas x e y de un punto del plano (suponiendo que x = 0 y que
y = 0) y calcule y escriba r =NC(x, y).
El diagrama de la gura 7.6 presenta una posible solucion mediante el uso de bifurcaciones
en cascada.
Figura 7.6: Programa que escribe el cuadrante en el cual se sit ua el punto en el plano (x, y).
7.3.1 Ejercicios
Utilizando las ideas que se han presentado en los puntos anteriores desarrolle algoritmos que
den solucion a los problemas siguientes:
1. Leer un n umero real x y calcular y escribir r =| x |
3
.
2. Calcular el coste de una llamada telefonica que ha durado t minutos sabiendo que si t < 1
el coste es de 0.4 euros mientras que para duraciones superiores el coste es 0.4 + (t 1)/4
euros.
3. Leer un n umero real del teclado. Calcular el valor de p sabiendo que si x esta en el
intervalo (2, 8] el resultado p toma el valor uno, en caso contrario toma el valor cero.
Escribir posteriormente el valor de p.
4. Leer un valor x del teclado. Calcular y escribir el valor y = f(x) siendo f una funcion
denida a trozos del siguiente modo:
128 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
x f(x)
x [1, 3) 10 x
x > 50 1
resto 0
5. Leer las componentes de un vector de IR
2
(x e y). Calcule el valor de r que se dene como
r =NC(x, y) si x = 0, y = 0 y r = 0 si x = 0 o si y = 0.
7.4 Estructuras cclicas
Muchos algoritmos requieren la repeticion de operaciones cierto n umero de veces. Al conjunto de
operaciones que se repite se le llama cuerpo del proceso repetitivo. Un ciclo (o proceso repetitivo
o bucle) queda completamente denido por el cuerpo y la condicion de parada o salida. Cada
vez que el programa en ejecucion pasa por el cuerpo del bucle se dice que ha realizado una
iteracion.
La estructura denominada proceso repetitivo o bucle permite plasmar en diagramas de ujo
este tipo de procesos. La bifurcacion al nal del bloque hace las veces de control de salida.
En ocasiones es conveniente poner el control de salida en la cabeza del bucle, de este modo se
puede salir del bucle sin haber realizado ninguna operacion. Ambos tipos de proceso iterativos
se muestran en la gura 7.7.
condicin
cuerpo
s
no
condicin
cuerpo
s
no
Figura 7.7: Estructuras repetitivas con control de salida en la cola (diagrama de la izquierda) y
control de salida en la cabeza (diagrama de la derecha).
A modo de ejemplo considerese la tarea de construir un vector v de dimension n de forma que
la componente kesima tenga el valor v
k
= k
2
4. Por ejemplo, para n = 2 el vector resulta ser
v = [3, 0], para n = 3 se obtiene v = [3, 0, 5]. El problema que se quiere resolver es calcular
las componentes de v para un valor concreto de la dimension n que se proporcione. Dicho de
otro modo, el algoritmo tendra que requerir un valor concreto de n y calcular las componentes
v
1
a v
n
. Se supondra que n es entero y positivo.
c MRA & JAAR 2010 DISA. ESI. US. 129
El diagrama de la gura 7.8 presenta una posible solucion al problema haciendo uso de
una estructura repetitiva con salida en la cola. Es muy conveniente dedicar unos minutos a
comprobar que el algoritmo resuelve el problema. Para ello pruebe a seguir mediante calculos
a mano los pasos indicados en el diagrama para n = 1, n = 2, n = 3. Una vez realizado este
ejercicio no le resultara difcil determinar que el algoritmo ha de funcionar necesariamente para
todo n > 0.
k
Variable
entera
ndice para recorrer v.
Variable auxiliar
Leer n
Inicio
Fin
k > n ?
s
no
v
k
kk -4
n
Variable
entera
Dato, dimensin de v
k 1
k k+1
v
k
Variable
entera
Componente k-sima de v
calculada mediante la
expresin k
2
-4
v
Variable
vector de
enteros
Resultado, vector v
Figura 7.8: Construccion de un vector mediante proceso iterativo con salida en la cola.
En el diagrama de la gura 7.9 se muestra otro diagrama que utiliza un bucle con salida en
la cabeza. Compruebe tambien mediante pruebas a mano que este diagrama realiza la misma
tarea que el del ejemplo anterior.
Debido a la sencillez de este ejemplo puede parecer que ambas maneras de realizar una
estructura cclica son equivalentes de un modo trivial. Aunque es cierto que se puede pasar
de una a otra esto no siempre se logra con facilidad. Ademas hay que tener en cuenta que
algunos lenguajes de programacion estan orientados a usar una de ellas, por ejemplo en el caso
de MATLAB siempre se preere la comprobacion de salida en cabeza.
El bloque constructivo llamado modulo puede usarse para mejorar el aspecto visual de los
diagramas de ujo. En particular si un diagrama consta de varias estructuras repetitivas puede
ser interesante dedicar un modulo a cada uno de ellos. Para ilustrar esta idea considere el
problema cuyo enunciado es Se ha de leer una lista de n n umeros reales, siendo n un entero
que ha de leerse previamente. Posteriormente se escribira la lista en orden inverso. Se supondr a
que n > 0. La gura 7.10 muestra el diagrama de ujo de una posible solucion. Dicho diagrama
incluye dos modulos que se detallan en diagramas separados. La tabla de objetos es unica pues
130 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
k
Variable
entera
ndice para recorrer v.
Variable auxiliar
Leer n
Inicio
Fin
k > n ?
no
n
Variable
entera
Dato, dimensin de v
k 1
v
k
Variable
entera
Componente k-sima de v
calculada mediante la
expresin k
2
-4
v
Variable
vector de
enteros
Resultado, vector v
s
v
k
kk -4
k k+1
Figura 7.9: Construccion de un vector mediante proceso iterativo con salida en cabeza.
los diagramas correspondientes a los modulos se interpretan como parte del diagrama general.
A todos los efectos se trata por tanto de un unico diagrama con la particularidad de que algunas
partes (los modulos) se detallan de forma separada.
Puede verse que los modulos ayudan a comprender mejor el algoritmo. Cada parte del
diagrama puede abarcarse de un golpe de vista, facilitando su comprension y el analisis de su
validez.
7.4.1 Ejercicios
Los siguientes ejercicios se pueden resolver con ayuda de estructuras cclicas. Utilice modulos en
aquellos casos en que el diagrama resultante sea demasiado largo. Recuerde que los diagramas
no pueden cortarse.
1. Leer las componentes de un vector de n umeros reales de dimension 10. Escribirlo luego en
la pantalla.
2. Leer un entero n supuesto n > 0 y un vector v IR
n1
, calcular y escribir el producto
escalar m = v
t
v, m IR, donde v
t
simboliza el vector transpuesto de v.
3. Leer n (suponiendo que es entero y > 0). Leer a continuacion las n componentes de un
c MRA & JAAR 2010 DISA. ESI. US. 131
k Variable entera
ndice para recorrer v
Variable auxiliar
n Variable entera Dato, dimensin de v
v
k
Variable real Componente k-sima de v
v
Variable vector de n
reales
Dato, vector v
Inicio
Fin
Lectura de
vector v
Leer n
Escritura
inversa de
vector v
Leer v
k
Inicio de lectura de
vector v
Fin de lectura de
vector v
k n ?
no
k 1
s
k k+1

Escribir v
k
Inicio de escritura
inversa de vector v
Fin de escritura
inversa de vector v
k 1 ?
k n
k k-1

no
s
1 Constante entera
Constante para dar valor
inicial y modificar k
Figura 7.10: Diagrama de ujo con modulos para el problema de la escritura inversa.
132 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
vector de n umeros reales dimension n. Calcular y escribir luego la media aritmetica de sus
componentes.
4. Leer un n umero real x y otro entero z. Calcular y escribir y = x
z
suponiendo que z 0.
5. Leer n (suponiendo que es entero y 0). Calcular y escribir f = n!.
6. Leer n (suponiendo que es entero y > 0) y un vector de dimension n. Calcular y escribir
la componente de mayor valor.
7. Leer n (suponiendo que es entero y > 0) y un vector de dimension n. Calcular y escribir
la componente de mayor valor y su ndice dentro del vector.
8. Leer n (suponiendo que es entero y mayor que uno). Construir un vector v IR
n1
tal
que v
k
= v
k1
/3 + 0.5 para k = 2, ..., n y siendo v
1
= 1.
9. Leer n (suponiendo que es entero y mayor que dos). Construir un vector v IR
n1
tal que
sus componentes sean los terminos de la sucesion de Fibonacci
1
.
10. Se han medido las longitudes de tornillos procedentes de un mismo lote de fabricacion.
Se han dispuesto en un vector v de dimension n > 2. Se dispone de v y n. Dise ne un
algoritmo para calcular la media y la varianza de las longitudes. La varianza se calcula
como var =
1
n

n
k=1
(v
k
)
2
, siendo la media aritmetica de las componentes de v.
7.5 Ciclos dobles
El cuerpo de una estructura repetitiva no es necesariamente un modulo simple sino que puede
contener otras estructuras. En el punto anterior se han expuesto diversos ejemplos en los cuales
el cuerpo contiene exclusivamente estructuras en secuencia. No existe ning un impedimento para
que el cuerpo contenga estructuras selectivas o incluso otros ciclos.
Cuando un ciclo contiene a otro se obtiene una estructura doblemente repetitiva
2
. En cada
iteracion del ciclo externo se realizan varias repeticiones del cuerpo del ciclo interno.
Las repeticiones dobles son especialmente apropiadas para trabajar con matrices A IR
mn
.
En muchas situaciones es preciso recorrer los elementos de la matriz para realizar de este modo
la lectura, escritura o cualquier otro calculo. Se plantea en estos casos el problema de considerar
todos los posibles elementos a
kj
de la matriz. Conviene recordar que el elemento generico a
kj
tiene dos subndices: k (las) y j (columnas) que varan en los intervalos: k = 1, 2, ..., m y
j = 1, 2, ..., n.
1
La sucesi on de Fibonacci comienza con a1 = 1, a2 = 1 y posteriormente cada termino a
k
es la suma de los
dos anteriores a
k1
+ a
k2
para k > 2.
2
Llamada frecuentemente bucles anidados por ser estas palabras la traducci on literal de nested loops.
c MRA & JAAR 2010 DISA. ESI. US. 133
Para trabajar con matrices se puede emplear un ciclo dentro de otro. Normalmente el ciclo
externo recorre el ndice de las y el interno el ndice de columnas. En la gura 7.11 se presenta
un diagrama de ujo que puede utilizarse para recorrer la matriz.
iniciar j a 1
Incrementar j
Incrementar k
iniciar k a 1
Operar con el
elemento a
kj
k > m ?
s
no
j > n ?
s
no
Figura 7.11: Diagrama de ujo que permite recorrer una matriz gracias a dos estructuras repet-
itivas.
7.5.1 Ejercicios
Los ejercicios que se proponen a continuacion se pueden resolver con la estructura de esta gura
7.11 (aunque alguno de ellos puede resolverse con estructuras mas simples).
1. Lectura/escritura de una matriz mn. Se han de leer del teclado las dimensiones m y n
(suponga que son n umeros enteros positivos). A continuacion se han de leer los elementos
134 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
a
kj
de una matriz A de m las y n columnas. Finalmente se presentara en la pantalla la
matriz leda.
2. Construir una matriz A IR
mn
cuyo elemento generico a
kj
viene dado por a
kj
= k
2
j.
3. Dada una matriz (se supone ya leda) A de dimensiones mn, se quiere anular (poner a
cero) los elementos de su diagonal principal y escribir la matriz resultante.
4. Traza de una matriz. Dada una matriz cuadrada A IR
nn
dada siendo n > 0 un entero
tambien dado se ha de dise nar un algoritmo que permita obtener la traza de A (suma de
los elementos de la diagonal).
5. Suma de matrices. Dadas (suponga que ya han sido ledas) dos matrices A IR
mn
y
B IR
mn
se quiere calcular y escribir la matriz C obtenida como suma de las anteriores
C = A + B.
6. Matriz traspuesta. Dada una matriz A IR
mn
calcular su traspuesta B = A
t
.
7. Submatriz triangular. Dada una matriz A IR
mn
se desea calcular otra matriz B IR
mn
cuyos elementos son todos cero excepto los de la submatriz triangular inferior que son
iguales a los elementos de igual posicion de A. Es decir, los elementos que estan por de-
bajo de la diagonal principal de A se copian en B, el resto de elementos de B valen cero.
Se supone que tanto m como n son n umeros enteros mayores que uno ya ledos.
8. Maximo de una matriz. Dada una matriz A IR
mn
calcular el elemento mayor.
9. Maximo de cada la. Dada una matriz A IR
mn
con m > 1 y n > 1 dados se desea
calcular un vector v IR
m
cuya componente generica v
k
es el mayor valor de la la
kesima de A.
10. Crear matriz de 1 y 0 al tresbolillo.
7.6 Ejercicios tematicos
En este punto se presenta una serie de problemas que pueden ser resueltos con algoritmos que
combinan algunas de las estructuras explicadas en este tema.
7.6.1 Sucesiones y series
1. Se quiere construir y escribir un vector v de dimension n cuyas componentes siguen la ley
v
k
= 3 v
k1
k para k 2. Tanto n como v
1
son cantidades que han de leerse del teclado.
2. Dado n > 0 hallar la suma s =

n
k=1
1/k.
c MRA & JAAR 2010 DISA. ESI. US. 135
3. Se desea calcular la suma s =

n
k=1
1/a
k
siendo los valores a
k
los elementos de la sucesion
dada por a
k
= a
k1
+ a
k2
para k > 2, con a
1
= 1 y a
2
= 1. El lmite n ha de leerse del
teclado y se supone mayor que dos.
4. Se desea calcular la suma s =

n
k=1
1/k
m
siendo m y n dos n umeros enteros positivos que
se suponen dados.
5. Escriba los n primeros terminos de la sucesion dada por a
n
= (1 +
1
n
)
n
, siendo n un n umero
entero positivo dado.
7.6.2 Ordenaciones
1. Dado un vector v de dimensi on n cuyas componentes son todas positivas o cero se desea
reordenar sus componentes de mayor a menor. Por ejemplo, si
v = [2 3 8 5 4]
el resultado ha de ser un nuevo vector:
w = [8 5 4 3 2]
2. Repetir el ejercicio anterior pero sin usar un vector auxiliar como w. El resultado que se
pretende conseguir es que el propio vector v tenga sus componentes ordenadas.
3. Igual que el anterior pero suponiendo que v contiene cantidades positivas y negativas, por
ejemplo:
v = [7 3 8 9 5 4 0 1]
ha de dar como resultado el propio vector reordenado as:
v = [8 5 4 3 0 1 7 9]
4. Un fabricante de automoviles dispone de un modelo de vehculo en cinco colores. Para
saber la aceptacion de cada color realiza una encuesta usando un programa en su ordenador
portatil. El programa ha de ayudarle a contar los votos de los encuestados. El encuestador
tecleara el n umero del color elegido (de uno a cinco) cada vez que pregunte a una persona
nueva. Cuando no quiera preguntar a nadie mas introducira el valor -1. En ese momento
el programa le indicara el n umero de votos que cada color ha obtenido. Posteriormente se
han de ordenar los colores seg un los resultados de la votacion.
5. Se desea calcular la mediana de los valores contenidos en un vector T IR
n
. Si n es impar
la mediana es el valor central del vector ordenado, en caso contrario la mediana es la media
de los dos elementos que estan mas al centro. En ambos casos el paso previo para calcular
la mediana es ordenar el vector.
Un ejemplo con n par es T = [10 23 11 15]. La ordenacion produce T
o
= [23 15 11 10]
y la mediana es (15 + 11)/2 = 13. Un ejemplo con n impar es T = [11.8 12 28 11.5 14].
136 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
En este caso la ordenacion produce un nuevo vector T
o
= [11.5 11.8 12 14 28], de donde
se obtiene la mediana que es el valor central 12.
Puede comprobar con los ejemplos anteriores que la mediana no coincide con la media
aritmetica.
7.6.3 Calculos con enteros
Para poder dise nar los algoritmos que resuelven algunos de los problemas propuestos a contin-
uacion puede necesitar una funcion que elimine los decimales de n umeros reales y obtener de
este modo n umeros enteros. Esta funcion recibe el nombre de parte entera y puede denotarse
matematicamente como ParteEntera(). De este modo x ParteEntera(3.14) es equivalente a
x 3.
1. Dado un n umero entero x mayor que uno se ha de escribir un uno si el n umero es par y
un cero en caso contrario.
2. Dados dos n umeros enteros positivos p y q, p > q, se ha de escribir un uno si son divisibles
y cero si no lo son.
3. Dado un n umero entero x mayor que uno se ha de escribir la lista de sus divisores com-
prendidos en el intervalo (1, x).
4. Dado un n umero entero x mayor que uno se ha de escribir un uno si es primo y un cero en
caso contrario. Para ello ha de comprobar si x es divisible por alg un entero en el intervalo
(1, x).
5. Dada una cantidad N > 1 calcular la raz cuadrada entera aproximada r. Se ha de cumplir
que r r N < (r + 1) (r + 1).
Por ejemplo, si N = 24 se tiene que r = 4 pues 4 4 = 16 24 < 25 = 5 5.
6. Se ha de escribir un uno en el caso de que exista un tro (x, y, z)de n umeros enteros positivos
tales que x
2
+ y
2
= z
2
. Limite la b usqueda a x (0, 100], y (0, 100]. En caso de que no
se encuentre solucion se ha de escribir un cero.
7. Repita el ejercicio anterior pero escribiendo todas las soluciones que encuentre en el inter-
valo x (0, 1000], y (0, 1000].
8. Dados dos n umeros enteros positivos p y q escriba un algoritmo que permita hallar el
maximo com un divisor de los mismos.
9. Como aplicacion del ejercicio anterior dise ne un algoritmo que permita descubrir si dos
enteros positivos son primos entre s, es decir si su maximo com un divisor es uno.
c MRA & JAAR 2010 DISA. ESI. US. 137
7.6.4 Matrices
1. Multiplicacion de matrices. Suponga ya ledas A IR
mn
y B IR
np
, calcule C = A B.
2. Matriz al cubo. Dise ne un algoritmo que permita obtener B = A
3
, siendo A IR
nn
una
matriz cuadrada que se supone ya leda.
3. Exponenciacion de matrices. Dise ne un algoritmo que permita obtener B = A
p
, siendo
A IR
nn
una matriz dada y p > 0 un entero tambien dado.
4. Dados dos enteros positivos m y n se desea construir la matriz S IR
mn
cuyo elemento
generico viene dado por s
kj
=

k
h=1
1/h
j
7.6.5 Leyes
La evolucion de ciertas magnitudes del mundo real puede en ocasiones acomodarse a simples
leyes expresables de un modo similar a las sucesiones. En este apartado se proporcionan algunos
ejemplos que ilustran la forma en que el calculo por ordenador ayuda a la Ciencia y la Ingeniera.
1. La cantidad de un cierto isotopo radioactivo presente en una mezcla vara con el tiempo
pues el isotopo se descompone emitiendo radiacion. Se denota mediante y(k) la cantidad
en gramos de isotopo en el instante de tiempo t = k medido en a nos. Unos cientcos han
descubierto que se cumple que y(k) = 0.99 y(k 1). Si un barril de desechos radioactivos
contiene 1000 gramos de isotopo, cual sera la cantidad de isotopo presente al cabo de 500
a nos?
2. La velocidad de un paracaidista en su descenso al suelo una vez que ha abierto el paracadas
se denota mediante v(k) (m/s), siendo k el tiempo que lleva cayendo medido en segundos,
k > 1. Se ha especulado con la idea de que dicha velocidad sigue la ley: v(k) = v(k
1) + 10 0.4(v(k 1))
2
. Sabiendo que una cada tpica puede durar 5 minutos y que
el paracadas se suele abrir con una velocidad de 100 Km/h, con que velocidad llega al
suelo?
3. Se sabe que la cantidad de bacterias de cierta especie en un cultivo es x(k) = 1.1x(k
1) siendo k el tiempo medido en horas, k > 1. Si al cabo de la primera hora x(1) se
contabilizaron 100 unidades, cuantas habra al cabo de un da?
7.7 Comprobaci on del funcionamiento de algoritmos
La comprobacion del buen funcionamiento de un algoritmo es una tarea difcil y para la cual
no existen reglas generales. En muchos casos sin embargo el sentido com un y el razonamiento
138 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
logico permiten realizar pruebas que permiten asegurar la correccion.
Existen dos formas de enfrentarse a la tarea de decidir si un algoritmo dado es verdadera-
mente una solucion al problema planteado: la prueba del algoritmo con un conjunto de datos
controlado y la prueba mediante razonamiento logico-matematico.
7.7.1 Pruebas con datos controlados
La prueba del algoritmo con datos controlados consiste en preparar una serie de valores de los
datos para los cuales se conoce el resultado correcto. Posteriormente se siguen los pasos del
algoritmo y se comprueba si los resultados que el algoritmo produce coinciden con los resultados
conocidos de antemano.
Como ejemplo considere el problema de escribir un uno en caso de que cierto entero x sea
primo y cero en otro caso. Si se desea comprobar si cierto algoritmo A es correcto puede ser
buena idea probar A con x = 2 y comprobar que el resultado es que se escribe un uno. Si el
resultado no es este no hace falta comprobar mas, pues un solo fallo sirve para invalidar A. Si
el resultado es correcto se puede pasar a probar A con x = 3 y repetir el proceso.
Es facil ver que este metodo tiene el grave inconveniente de que hacen falta tantas pruebas
como posibles valores distintos puede tomar el dato x. En muchas ocasiones se recurre al metodo
de probar el algoritmo solo en algunos valores elegidos. Por ejemplo con varios n umeros primos
y otros no primos tanto grandes como peque nos. Hay que resaltar que este tipo de pruebas
no permite validar el algoritmo completamente. Esto es as porque un algoritmo puede dar
resultados correctos en muchas situaciones y sin embargo no ser correcto universalmente pues
puede que contenga errores que no se han manifestado con esos datos.
No existe un procedimiento general para seleccionar valores de prueba para algoritmos, sin
embargo es posible dar algunos consejos como:
probar valores particulares que puedan dar problemas como el cero (en el caso de que haya
divisiones), o los n umeros negativos (si hay races cuadradas).
probar los valores extremos de los datos, por ejemplo si se sabe que el dato x IR cumple
que x [5, 3] entonces merece la pena probar con los valores x = 3 y x = 5.
7.7.2 Razonamientos por induccion
En muchos casos es posible aplicar el metodo matematico de prueba inductiva. Por ejemplo
cuando el dato de un algoritmo puede tomar cualquier valor n IN.
c MRA & JAAR 2010 DISA. ESI. US. 139
El razonamiento inductivo se lleva a cabo probando (en el sentido matematico) que si el
algoritmo funciona para un valor n cualquiera entonces debe funcionar tambien para el valor
siguiente n + 1. La prueba se completa utilizando el algoritmo con n = 1 y comprobando
que el resultado es satisfactorio. Mediante induccion se obtiene que entonces el algoritmo debe
funcionar correctamente para n = 2 y de aqu que tambien sea correcto para n = 3, etc.
Este tipo de razonamiento permite decidir la correccion de algoritmos que contienen estruc-
turas iterativas. En estos casos los puntos que causan mayores problemas son las entradas y
salidas de los ciclos de repeticion. Por este motivo hay que prestar mucha atencion a los valores
iniciales asignados a ndices y contadores antes de entrar en el ciclo, a la actualizacion de los
mismos dentro del cuerpo que se repite y nalmente a la condicion de salida del ciclo.
El principal inconveniente de este metodo de correccion es que es posible que la prueba
matematica contenga errores, proporcionando como resultado que se etiquete como correcto un
algoritmo que no lo es. Por este motivo es conveniente siempre realizar la prueba por ambos
metodos.
7.7.3 Modularidad
Si el dise no del algoritmo se ha llevado a cabo de forma adecuada el diagrama ha de consistir
en una serie de modulos (o funciones) de peque no tama no que se unen para formar modulos
mayores.
El analisis de algoritmos se realiza entonces de una forma comoda pues basta con probar
cada modulo de forma independiente. Cuando se han comprobado los modulos de un cierto
nivel puede pasarse al nivel superior. Las comprobaciones de un nivel superior pueden llevarse
a cabo sin necesidad de volver a utilizar o analizar los modulos de niveles inferiores. En lugar
de ello es posible sustituir mentalmente dichos modulos por mecanismos que automaticamente
proporcionan los resultados correctos. De este modo el analisis se lleva a cabo de forma jerarquica
lo cual permite avanzar con mayor rapidez y conanza.
7.8 Analisis de la estructura
Es posible ahora poner un par de ejemplos para aclarar las ideas sobre la programacion estruc-
turada. Considere en primer lugar el diagrama que aparece en la parte izquierda de la gura
7.12. A la vista como estan unidos los bloques sabra decir si es un diagrama bien estructurado?.
Para responder a esta cuestion resulta conveniente agrupar los bloques que forman secuencias
en modulos, de forma que la estructura subyacente quede expuesta con mayor claridad. Esto
140 TEMA 7. PROGRAMACI

ON ESTRUCTURADA
se ha realizado en el diagrama del centro. Finalmente, en el diagrama de la derecha se han
sustituido las secuencias por modulos, quedando al descubierto una estructura que coincide con
una de las estructuras permitidas (vease de nuevo la gura 7.2). Esta estructura es un bucle con
salida en cola y aparece aqu combinado en secuencia por arriba y abajo con otros dos modulos.
Figura 7.12: Analisis de la estructura de un diagrama.
Este sencillo analisis permite determinar que la estructura del diagrama esta de acuerdo con
las normas establecidas en este captulo. Observe que para discutir sobre la estructura de un
diagrama no es preciso conocer las operaciones que se realizan en cada bloque. En efecto, la
estructura depende exclusivamente de las uniones entre bloques y no de su contenido.
Considere ahora el diagrama que se muestra en la parte izquierda de la gura 7.13. A primera
vista no parece haber nada que indique que el diagrama no sea estructurado (al menos no lo
parece para el principiante en esta materia). En la parte central y derecha de la gura se pone de
maniesto que esto es un error. En efecto, el recuadro a trazos intenta encerrar una estructura
del tipo repeticion o bucle con salida en cola. Sin embargo el recuadro no tiene solamente una
entrada y una salida como se requiere. De hecho, el recuadro es cortado por dos echas de
entrada y por una de salida. Si uno intenta encerrar la estructura inferior mediante un recuadro
(vease parte derecha de la gura) ocurre nuevamente que no se cumple la regla de una unica
entrada y una unica salida. En este caso hay dos salidas y una sola entrada.
c MRA & JAAR 2010 DISA. ESI. US. 141
Figura 7.13: Analisis de la estructura de un diagrama.
142 TEMA 7. PROGRAMACI

ON ESTRUCTURADA

You might also like