Ejercicios de Algoritmos
Ejercicios de Algoritmos
Ejercicios de Algoritmos
ALGORITMOS Y PROGRAMAS
No por obvio, hay que olvidar que los programas se escriben con el ánimo de
resolver problemas, con ayuda de las computadoras y que la primera medida a
considerar, es el análisis del problema en cuestión y la obtención, en su caso, de un
algoritmo adecuado. Por este punto empezaremos nuestra exposición, hasta llegar a
los métodos y etapas a seguir para obtener una aplicación informática.
Si bien los conceptos que aquí se introducen son fundamentales para la realización
de programas, este capítulo no debe leerse como si se tratara de un manual de
programación, sino como una fundamentación de lo que llamamos programación
estructurada, mas allá de la sintaxis y de la semántica de un lenguaje de
programación concreto.
5030" EQPEGRVQ"FG"CNIQTKVOQ
Sabemos que para que un ordenador pueda llevar adelante una tarea
cualquiera, se tiene que contar con un algoritmo que le indique, a través de un
programa, que es lo que debe hacer con la mayor precisión posible. Quizás esta
afirmación debería ser revisada desde la óptica de la Inteligencia Artificial, pero
por el momento la mantendremos como válida dentro del carácter introductorio de
este curso. Consecuencia de lo anterior es la importancia del estudio de los
algoritmos dentro de las Ciencias de la Computación. Recordemos que un
algoritmo es “una sucesión finita de pasos no ambiguos que se pueden ejecutar en
un tiempo finito”, cuya razón de ser es la de resolver problemas; por tanto
“problema” para nosotros, serán aquellas cuestiones, conceptuales o prácticas ,
cuya solución es expresable mediante un algoritmo. Afortunadamente, son muchos
los problemas cuya solución puede describirse por medio de un algoritmo y ésta es
81
82 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
Resolución de
un problema
50403" CPıNKUKU"FGN"RTQDNGOC
ALGORITMOS Y PROGRAMAS 83
Análisis del
problema
Ejemplo 1:
1.- Utilizar las fórmulas del área y la circunferencia en función del radio.
2.- Las entradas de datos se reducen al dato correspondiente al radio del
círculo. Dada la naturaleza del mismo y el procesamiento al cual lo
someteremos, su tipo de dato debe ser un número real.
3.- Las salidas serán dos variables también reales: área y circunferencia.
50404" FKUGÜQ"FGN"CNIQTKVOQ
Ejemplo 2:
1. Inicio
2. Poner X igual a 2 (X = 2, X, variable que representa a los posibles
divisores de N)
3. Dividir N por X (N/X)
4. Si el resultado es entero, entonces N no es primo, y saltar al punto 9
(en caso contrario continuar el proceso en el siguiente punto, 5)
5. Incrementar X en una unidad
6. Si X es menor que N saltar al punto 3
(en caso contrario continuar el proceso en el siguiente punto, 7)
7. Declarar N es primo;
8. Saltar al Fin (punto 10)
9. Declarar N no es primo
10. Fin
Como parte del diseño de algoritmo está la selección de uno que sea
razonablemente aceptable, entre todos los muchos posibles que resuelven el mismo
problema (el ejemplo que acabamos de dar es claramente mejorable, pues si N no
era divisible por 2 no tiene mucho sentido volverse a preguntar si lo es por 4).
ALGORITMOS Y PROGRAMAS 85
- El tiempo que se necesita para ejecutarlo. Para tener una idea aproximada
de ello, basta con saber el número de instrucciones de cada tipo necesarias
para resolver el problema.
- Los recursos que se necesitan para implantarlo.
Así, una vez diseñado un primer algoritmo, conviene realizar una evaluación del
mismo, cuestión a veces nada banal y sobre la que volveremos en capítulos
posteriores. Si se decide que éste no es eficiente será necesario o bien diseñar uno
nuevo o bien optimizar el original. Optimizar un algoritmo consiste en introducir
modificaciones en él, tendentes a disminuir el tiempo que necesita para resolver el
problema o a reducir los recursos que utiliza. (En el ejemplo 2 el algoritmo se
optimiza, si N se declara como primo cuando X supera a N/2).
o describir un reducido numero de pasos, que deberán ser expresados con mayor
detalle posteriormente. Tras esta primera descripción, éstos se especifican con
mayor minuciosidad, de forma más extensa y con más pasos específicos. En cada
nivel de refinamiento hay que considerar dos fases: ¿Qué hace el módulo? para a
continuación responder a ¿Cómo lo hace?.
Ejemplo 3:
Diseñar un algoritmo que responda a la pregunta: ¿Qué debo hacer para ver la
película XYZ?.
Un primer análisis nos conduce a un esbozo de solución, descomponiéndolo en
cuatro módulos sucesivos:
Estos cuatro pasos se pueden refinar un poco más y así este problema lo
podríamos descomponer de la siguiente forma:
50405" RTQITCOCEKłP"FGN"CNIQTKVOQ
Programación
del algoritmo
5050" TGRTGUGPVCEKłP"FG"CNIQTKVOQU
50503" RUGWFQEQFKIQ
Ejemplo 4:
leer N
mientras N > 2 hacer
N←N-2
si N = 2 entonces
escribe “es par”
sino
escribe “es impar”
90 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
fin
50504" QTICPKITCOCU
5060" GUVTWEVWTCU"FG"EQPVTQN
Sin embargo como hemos visto al diseñar algoritmos para escribir un programa,
además de estos elementos básicos, hemos de conocer determinadas estructuras,
cuyo objetivo es controlar su ejecución y sin cuya comprensión es imposible
programar.
Llamaremos estructuras de control a las acciones que tienen por objeto marcar el
orden de realización de los distintos pasos de un programa ó algoritmo. Cada
estructura tiene un punto de entrada y uno de salida, lo que facilita la depuración de
posibles errores. Estas son de tres tipos:
• estructuras secuenciales
92 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
• estructuras selectivas
• estructuras repetitivas
50603" GUVTWEVWTCU"UGEWGPEKCNGU
Son aquéllas en las que una acción (instrucción) sigue a otra de acuerdo con su
orden de escritura. Las tareas se suceden de tal modo que tras la salida (final) de
una se efectúa la entrada (principio) en la siguiente y así sucesivamente hasta el fin
del proceso. Su organigrama obedece al esquema de la Figura 3.6:
50604" GUVTWEVWTCU"UGNGEVKXCU
Ejemplo 5:
si <condición> entonces
<acciones>
fin_si
FORTRAN BASIC
RCUECN C
si <condición> entonces
<acciones S1>
si_no
<acciones S2>
fin_si
FORTRAN BASIC
RCUECN C
Ejemplo 6:
leer num_correctas
si num_correctas < 10 entonces
escribir “no ha superado Vd. el examen”
faltan ← 10 - num_correctas
escribir “le faltaron” , faltan
si_no
nota ← num_correctas / 2
escribir “aprobó Vd. con un” , nota
fin_si
ALGORITMOS Y PROGRAMAS 97
algoritmo RESOL2
inicio
leer a,b,c
D ← b^2-4*a*c
segun_sea D hacer
D<0: escribir “raíces complejas” {no existen raíces reales}
98 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
D=0: x ← -b/2a
escribir x , “raiz doble”
D>0: rc← raizcua(D)
x1← (-b-rc)/2a
x2 ←(-b+rc)/2a
escribir x1,x2
fin_segun
fin
50605" GUVTWEVWTCU"TGRGVKVKXCU
Fig. 3.10 Bucle infinito Fig. 3.11 Bucle con condición de salida
leer número
si N < 0 entonces
escribir SUMA
si-no
SUMA ←SUMA+número
fin-si
que se pueden repetir muchas veces; éstas constituyen el cuerpo del bucle.
Ejemplo 8:
algoritmo suma_números
{leer número total de números a sumar en variable N}
TOTAL ← N
SUMA ← 0 { la suma parcial es 0 al inicio}
{comienzo de bucle}
mientras que TOTAL > 0 hacer
leer número
SUMA ← SUMA+número
TOTAL ← TOTAL-1
fin_mientras
{fin del bucle}
escribir “la suma de los” , N , “números es “ , SUMA
donde i es un contador que cuenta desde un valor inicial (1) hasta el valor final (N)
con los incrementos que se consideren (de uno en uno en este caso). Esta es la
llamada estructura Desde (“for”), que es la más simple desde el punto de vista de
la condición de salida, ya que viene predeterminada por el código. Su utilidad
reside en el hecho de que, en muchas ocasiones, se conoce de antemano el número
ALGORITMOS Y PROGRAMAS 103
de iteraciones. Esta estructura ejecuta las acciones del cuerpo del bucle, un número
especificado de veces y de modo automático controla el número de iteraciones. Su
formato en pseudocódigo es:
desde v=vi hasta vf hacer
<acciones>
.
.
fin_desde
v: variable índice
vi, vf: valores inicial y final de la variable
FORTRAN BASIC
DO n I =M1, M2, M3 FOR V = Vi TO Vf
<acciones> <acciones>
n CONTINUE NEXT V
n : etiqueta de fin de bucle
M1: valor inicial del contador FOR V = Vi TO Vf STEP X
M2: valor final del contador <acciones>
M3: valor de incremento (+ ó -) NEXT V
PASCAL C
104 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
PASCAL C
C←0
leer nota
mientras nota ≥ 0 hacer
{procesar nota}
ALGORITMOS Y PROGRAMAS 105
C ← C+1
leer nota
fin_mientras
repetir
<acciones>
hasta_que <condición>
PASCAL C
repeat do
<accion> <accion o bloque>
...<accion> while (condicion); (*)
until (condicion);
* (en C se “dice” mientras se cumpla
la condición, no hasta que se cumpla)
inicio
contador ←1
repetir
leer número
contador ←contador+1
hasta_que contador > 30
escribir “números leídos: 30”
fin
106 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
Este bucle se repite hasta que el valor de variable contador exceda a 30, lo que
sucederá después de 30 ejecuciones del mismo. Nótese que si en vez de 30
pusiéramos 0, el cuerpo del bucle se ejecutará siempre al menos una vez.
Ejemplo 9:
inicio
leer N
Factorial ←1
I←1
repetir
Factorial← Factorial * I
I ← I+1
hasta_que I > N
escribir “el factorial del número”, N, “es”, Factorial
fin
Las tres estructuras repetitivas son susceptibles de intercambio entre ellas,
así por ejemplo es posible, sustituir una estructura desde, por una mientras; con
incrementos positivos o negativos de la variable índice. En efecto, la estructura
desde con incremento positivo es equivalente a la estructura mientras marcada con
la A), y la estructura desde con incremento negativo es equivalente a la estructura
mientras marcada con la B).
A) v ← vi B) v ← vi
mientras v < = vf hacer mientras v > = vf hacer
<acciones> <acciones>
v ← v + incremento v ← v - decremento
fin_mientras fin_mientras
Ejemplo 10:
inicio
leer n {lectura de la cantidad de números}
desde i = 1 hasta n hacer
leer NUMERO
FACTORIAL ← 1
desde j = 1 hasta NUMERO hacer
FACTORIAL ←FACTORIAL *j
fin_desde
escribir “el factorial del número”, NUMERO, “es”, FACTORIAL
fin_desde
fin
108 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
Nótese que cada valor del contador i, el bucle interno cuyo contador es j, se ejecuta
totalmente por lo que las variables que sirven de contadores en ambos bucles deben
ser distintas. (No es necesario que las estructuras anidadas sean iguales; podríamos
haber anidado un mientras o un repetir dentro del desde).
Ejemplo 11:
Escribir un algoritmo que permita calcular el interés producido por un capital a las
tasas de interés comprendidos en el rango desde 10 a 20 % de 2 en 2 puntos, a
partir de un capital dado.
leer capital
tasa ←10
mientras tasa < > 20 hacer
interés← tasa *0.01*capital { tasa*capital/100=tasa*0.01*capital}.
escribir “interés producido”, interés
tasa ←tasa+2
fin_mientras
escribir “continuación”
Los sucesivos valores de la tasa serán 10, 12, 14, 16,18,20, de modo que al
tomar ‘tasa’ el valor 20 se detendrá el bucle y se escribirá el mensaje
“continuación”. Supongamos que ahora nos interesa conocer este dato de 3 en 3
puntos; para ello se cambia la última línea del bucle por tasa← tasa+3. Ahora los
valores que tomará tasa serán 10, 13, 16, 19 saltando a 22 y nunca será igual a 20,
dando lugar a un bucle infinito y nunca escribiría “continuación”. Para evitarlo
deberíamos cambiar la condición de finalización por una expresión del tipo:
inicio
Suma ←0
escribir “existen más números en la lista s/n”
leer Resp {variable Resp, tipo carácter}
mientras Resp = “S” o Resp =“s” hacer
escribir “numero”
leer N
Suma ←Suma +N
escribir “existen más números (s/n)”
leer Resp
fin_mientras
fin
Este método a veces es aceptable e incluso útil, pero es tedioso cuando
trabajamos con grandes listas de números, ya que no es muy aconsejable tener que
contestar a una pregunta cada vez que introducimos un dato.
3.- Utilizar un valor “centinela”, un valor especial usado para indicar el final
de una lista de datos. En estos casos es especialmente importante, de cara al
usuario, advertir la forma de terminar la entrada de datos, esto es, que valor o
valores indican el fin de la lista.
suma ← 0
leer numero
mientras numero >= 0 hacer
suma ← suma + número
leer número
fin_mientras
5070" RTQITCOCEKłP"OQFWNCT
Para poder utilizar esta aproximación, hay que respetar una determinada
metodología, denominada abstración procedimental y que consta de dos etapas:
50703" HWPEKQPGU
Supongamos que durante la ejecución del programa principal nos encontramos con
una instrucción, y = raízcua (A + cos (x)). El control, entonces, pasará a evaluar la
función raizcua. Al hacerlo, se pasa primero al subprograma (función) coseno y se
calcula cos (x). Una vez obtenido A+cos (x) donde A es una constante, este valor
se utiliza como argumento de la función raizcua, que evalúa el resultado final
según las instrucciones que la definan. El resultado correspondiente devolverá al
lugar desde donde fue llamada para ser almacenado en la variable ‘y’ del programa
que la ha llamado. Las funciones incorporadas al lenguaje en origen se denominan
funciones internas o intrínsecas (caso de sen, cos, etc.), mientras que las funciones
definidas por el programador se deben codificar mediante una definición de
función por parte del mismo. Se supone que la relación de funciones internas de
cada lenguaje es conocida por el programador que sólo debe llamarlas cuando las
necesite, pero no definirlas. El mayor interés para el programador reside por tanto
en las funciones definidas por el usuario.
Ejemplo 12:
Una función puede ser llamada sólo mediante una referencia directa a la
misma de la forma siguiente:
Al invocar una función, hay que pasarle una serie de parámetros, a fin de
proporcionarle los argumentos de entrada necesarios para poder ejecutar sus
acciones, para ello distinguiremos entre los argumentos de la definición de la
función (parámetros formales o mudos) y los argumentos utilizados en su
invocación (parámetros actuales). Cada vez que se llama a una función, se
establece sistemáticamente una correspondencia entre parámetros formales y
actuales. En consecuencia, debe haber exactamente una correspondencia, tanto en
114 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
número como en tipo, de los parámetros actuales con los formales presuponiéndose
una correspondencia, uno a uno, de izquierda a derecha entre ambos. Una llamada
a la función implica los siguientes pasos:
Ejemplo 13:
Su utilización sería:
Transferencia: Una vez que los parámetros formales toman los valores de sus
correspondientes parámetros actuales x←2.5 , n←3, se ejecuta el cuerpo de la
función, devolviendo sus resultados al programa principal, resultando: z←0.064
50704" RTQEGFKOKGPVQU"Q"UWDTWVKPCU
una lista de parámetros actuales; en algunos lenguajes se tiene que hacer a través de
una instrucción específica llamar_a (call). Las funciones devuelven un sólo valor,
mientras las subrutinas pueden devolver ninguno o varios.
La forma de expresión de un procedimiento es similar a la de funciones:
Ejemplo 14:
algoritmo aritmética
inicio
leer M, N
Algoritmo llamar_a división(M, N)
principal - llamar_a división(M+N, 2)
fin
50705" ıodkvq"fg"ncu"Xctkcdngu
Una variable global es aquella que está declarada para el programa o algoritmo
completo, esto es, tiene validez para el programa principal y todos sus
subprogramas. Las variables globales tienen la ventaja de permitir a los diferentes
subprogramas compartir información, sin que tengan que figurar en las
correspondientes listas de transferencia de parámetros entre programas.
programa XX
variables A,B
procedimiento P1 (x,y)
variables D
funcion F (u,v)
variable G
inicio
<cuerpo F> ıodkvq Kfgpvkhkecfqt
fin
Cuerpo del programa A, B, P1, P2
Cuerpo de P1 A, B, D, x, y, F, P1, P2
inicio
Cuerpo de F A, B, D, G, x, y, u v, F, P1
<cuerpo F>
Cuerpo de P2 A, B, I, J, r, s, P1, P2
fin
procedimiento P2 (r,s)
variable I,J
inicio
<cuerpo P2>
fin
inicio
<cuerpo programa>
fin
Ejemplo 15:
algoritmo XXX
{variable global A}
{variables locales: X, Y}
inicio
X← 5
A← 10
Y← F(X)
escribir X,A,Y
fin {algoritmo}
función F(N)
ALGORITMOS Y PROGRAMAS 119
{comienzo función}
{variable global A}
{variable local X}
inicio
A← 6
X←12
F←N+5+A
fin {función}
50706" Rcuq"fg"rctâogvtqu
120 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
A←5
B←7
llamar PROC1 (A, 18, B * 3 + 4)
5 18 25
Aunque el paso por valor es sencillo, tiene una limitación importante: no existe
ninguna posibilidad de otra conexión con los parámetros actuales, y por tanto los
cambios que se produzcan por efecto del subprograma no producen cambios en los
argumentos originales. Por consiguiente, no se pueden devolver valores de retorno
al punto de llamada. Es decir, todos los parámetros son solo de entrada y el
parámetro actual no puede modificarse por el subprograma, ya que cualquier
cambio realizado en los valores de los parámetros formales durante la ejecución del
subprograma se destruye cuando finaliza éste. Así, en el ejemplo de la figura 3.16,
aunque X, Y, Z variasen en el interior del procedimiento, A y B seguirían valiendo
5 y 7, en el programa principal.
Ejemplo 16:
Escribir un programa y una función que por medio del paso por valor obtenga el
máximo común divisor de dos números.
algoritmo Maximo_comun_divisor
inicio
leer (x, y)
m ← mcd (x, y)
escribir (x, y, m)
fin
funcion mcd(a, b): entero {a, b: enteros}
inicio
mientras a <> b hacer
si a > b
entonces a ← a - b
sino b ← b - a
fin_si
122 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
fin_mientras
mcd ← a
fin
Al ejecutarse este algoritmo se producirán los siguientes resultados:
A←5
B←7
C←B*3+4
llamar_a PROC1( A, B, C)
direcciones o
5 7 25 posiciones
de memoria
procedim PROC1(REF X, REF Y, REF Z)
ALGORITMOS Y PROGRAMAS 123
Ejemplo 17:
programa XYZ
{parámetros actuales a, b, c y d paso por referencia}
inicio {programa}
...
(1) prueba (a,c)
...
(2) prueba (b,d)
..
fin
Nótese, por tanto, que mientras en el paso por valor los parámetros actuales podían
ser variables, constantes o expresiones (pues lo que se pasa es su valor), cuando un
parámetro se pasa por referencia el parámetro actual indicado en la invocación
debe ser siempre una variable que es la forma de referirse a una posición de
memoria.
124 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
Para examinar de modo práctico los diferentes métodos, consideremos los ejemplos
18 y 19, en los que podemos observar los diferentes valores que toman los
parámetros del mismo programa según sea el método de paso que utilicemos
Ejemplo 18:
(a) (b)
Ejemplo 19:
ALGORITMOS Y PROGRAMAS 125
programa M
inicio
A←2
B←3
llamar_a N(A,B)
escribir A,B
fin {programa M}
5080" EQPEGRVQ"FG"RTQITCOCEKłP"GUVTWEVWTCFC
126 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
FORTRAN BASIC
instrucciones ir_a se puede reescribir de forma que lleve a cabo las mismas tareas
prescindiendo de bifurcaciones incondicionales. Sin embargo, esta instrucción es
útil en algunas situaciones excepcionales, como en ciertas salidas de bucles o
cuando se encuentra un error u otra condición brusca de terminación. La
instrucción ir_a puede ser utilizada para saltar directamente al final de un bucle,
subprograma o procedimiento; la instrucción a la cual se salte debe tener una
etiqueta o numero de referencia. Por ejemplo, un programa puede diseñarse de
forma que finalice cuando se detecte un determinado error, de la forma:
si <condición error>
entonces ir a 100
.
100 fin
5090" TGEWTUKXKFCF
Ejemplo 20:
5 8
como n no es 0 se genera
otra operacion HCEVQTKCN FACTORIAL (3) = FACTORIAL (2) * 3 = 2.3 = 6
4 4
3 3
2 3
como FACTORIAL de 0 es
siempre 1, este valor se
asignara a la variable
FACTORIAL, y ahora se HCEVQTKCN
realizara el proceso en sentido
contrario ascendente
Fig. 2.18. Secuencia para el cálculo recursivo de factorial de n
Ejemplo 21:
Para resolver este problema se podrían leer todos los números, invertir su orden y
escribirlos. No obstante, se podría pensar en una solución más sencilla si se hace
una descomposición recursiva del problema. El problema se podría resolver con el
siguiente algoritmo:
algoritmo escribir_en_orden_inverso
leer N { Primer número }
leer el resto de los números y escribir_ en_orden_inverso
escribir N {El primer número se escribe el último }
algoritmo INVERTIR
inicio
leer N
si (N <> FF) entonces { hay más números }
INVERTIR
escribir N
fin
Observar que el primer número que se escribirá es el último leído, después de que
el número de llamadas a INVERTIR, sea igual a la cantidad de números que
contiene el archivo. Consecuentemente, el primer número leído será escrito en
último lugar, después de que la llamada recursiva a INVERTIR haya leído y escrito
el resto de los números. Esto supone que el programa, al ejecutarse, deberá guardar
tantas copias del subprograma y sus datos como sean necesarios.
Ejemplo 22:
fib(1) = 1
fib(2) = 1
130 FUNDAMENTOS DE INFORMÁTICA Y PROGRAMACIÓN
Esta serie fue concebida originalmente como modelo para el crecimiento de una
granja de conejos (proceso claramente recursivo) por el matemático italiano del
siglo XVI, Fibonacci. Como no podía ser menos, esta serie crece muy rápidamente.
Como ejemplo, el término 15 es 610.
función FIBONACCI(n)
inicio
si (n=1) o (n=2)
entonces
FIBONACCI ← 1
sino
FIBONACCI ← FIBONACCI (n-2) + FIBONACCI (N-1)
fin_si
fin_función
La recursión es una herramienta muy potente y debe ser utilizada como una
alternativa a la estructura repetitiva. Su uso es particularmente idóneo en aquellos
problemas que pueden definirse de modo natural en términos recursivos. El caso de
la función factorial es un ejemplo claro.
50:0" FGUCTTQNNQ"["IGPGTCEKłP"FGN"UQHVYCTG
Una vez hemos visto cómo se podían implementar las estructuras modulares
y de control sobre las que descansa la programación estructurada, volvamos al
problema de la resolución de un problema por medio de un ordenador. De acuerdo
con lo que allí afirmamos, cuando se ha comprobado el programa, éste se podría
dar, en principio, por terminado y el problema abordado como resuelto. Sin
embargo, un programa no puede darse como totalmente terminado hasta que no ha
sido depurado y contrastado con toda una batería de datos de entrada distintos.
Además, una vez se está razonablemente seguro de su funcionamiento, debe
documentarse para que pueda ser utilizado por cualquier usuario, al tiempo que hay
que tomar toda una serie de medidas que faciliten su actualización y
ALGORITMOS Y PROGRAMAS 131
50:03" KPIGPKGT¯C"FGN"UQHVYCTG
Por otra parte, el mantenimiento del software es muy diferente al del hardware (o
cualquier otro sistema físico en ingeniería), ya que el software no se desgasta con
el tiempo. El mantenimiento del software tiene que ver con la detección de fallos o
con la necesidad de adaptarlo a unas nuevas circunstancias. En ambos casos el
proceso de mantenimiento no consiste en la sustitución de un componente por otro,
sino en la repetición de parte del proceso de desarrollo.
50:04" EKENQ"FG"XKFC"FGN"UQHVYCTG
Análisis del sistema: El software suele ser parte de un sistema mayor formado
por hardware, software, bases de datos y personas. Por él, se debe
comenzar estableciendo los requisitos del sistema, asignando funciones a
los distintos componentes y definiendo las interfaces entre componentes.
Es posible que el lector quede abrumado por toda esta metodología cuando se está
introduciendo en las técnicas de programación. Sin embargo, es posible que estas
reflexiones le puedan ser de utilidad cuando se enfrente a la tarea de programar
algún problema no trivial y se encuentre con que algo no funciona como debe.
Construir software es una ingeniería y hemos tratado de esbozar sus normas.
ALGORITMOS Y PROGRAMAS 135
3.7. RECURSIVIDAD.........................................................................................127