Вы находитесь на странице: 1из 12

3.

Proceso de desarrollo de una solucin algortmica de un problema


Estas notas se centran en la enseanza de la programacin en pequeo. La habilidad para
hacer programas pequeos es necesaria para desarrollar programas grandes, aunque puede
no ser suficiente, pues el desarrollo de programas grandes requiere de otras tcnicas que no
sern tratadas en estas notas.
Los pasos generales para resoler un problema mediante un algoritmo son los siguientes!
a" Especificacin del problema.
b" #iseo $ construccin del algoritmo.
3.1. Especificacin del problema
La especificacin de un problema consiste antes que nada en precisar la informacin del
problema, la cual la constitu$en los datos de entrada $ los resultados que se desea obtener,
$ formular las relaciones e%istentes entre los datos de entrada $ los resultados. &ara ello
ser necesario!
- identificar los ob'etos inolucrados $ darles un nombre (una ariable que los
identifique".
- reconocer la clase o tipo de cada uno de los ob'etos, lo cual significa conocer el
con'unto de alores que los ob'etos pueden poseer $ las operaciones que pueden
efectuarse sobre estos.
- #escribir lo que se desea obtener en trminos de relaciones entre los ob'etos
inolucrados.
#ado un enunciado de un problema, normalmente en lengua'e natural, se busca me'orar el
enunciado inicial del problema hasta conertirlo en un enunciado cerrado, es decir, un
enunciado completo, no ambiguo, consistente $ no redundante. #ebemos establecer una
especificacin del problema a$udndonos, para ser lo ms precisos que podamos, de
lengua'es formales, como el lengua'e de las matemticas. En este punto interiene el
proceso de abstraccin que nos permite describir el problema en trminos de modelos (por
e'emplo, modelos matemticos) la elocidad de un automil la podemos representar por
un n*mero real" eliminando la informacin que no interiene directamente en el resultado
esperado (redundante", $ especificar el problema en trminos de esos modelos, por lo que el
problema lo conertimos en un problema equialente en trminos de los modelos.
+omo estamos interesados en encontrar un programa (o algoritmo" que resuela el
problema, en lugar de hablar de especificacin del problema hablaremos de la
especificacin del programa que resoler el problema. Esta especificacin la haremos en
trminos funcionales, es decir, describiremos los ob'etos que representan los datos de
entrada, sus estados $ relaciones lidas requeridas antes de la e'ecucin del algoritmo
para encontrar la solucin del problema. , esta descripcin la llamaremos precondicin del
programa. #escribiremos los ob'etos resultado, sus estados $ relaciones lidas deseadas
despus de la e'ecucin del algoritmo, a esta descripcin la llamaremos postcondicin.
-.
/gualmente debemos definir el espacio de estados, el cual endr dado por las ariables que
representarn los ob'etos que manipular el programa. Una especificacin funcional de un
programa endr dada por el espacio de estados, una precondicin (de donde partimos" $
una postcondicin (a donde queremos llegar". #ecimos que la especificacin es funcional
pues describimos primero los datos de entrada $ las condiciones requeridas sobre estos
datos antes de e'ecutar el programa, $ luego, los resultados deseados que el programa
produce.
E'emplo de especificacin!
&roblema! 0ueremos determinar el m%imo entre dos n*meros % e $.
1na posible especificacin del programa ser2a!
3ar %,$,z! entero)
4%5, $567
m%imo
4z 5 ma%(,,6"7
8.
La primera l2nea ar %,$,z! entero) define el espacio de estados. En este caso el espacio de
estados es 9%9%9, donde 9 denota el con'unto de los n*meros enteros $ est definido por
las ariables %, $, z, que pueden contener ob'etos del tipo n*mero entero. Las coordenadas
de este espacio corresponden a las ariables, la primera coordenada corresponde a %, la
segunda a $, la tercera a z. Los elementos del espacio de estados son llamados estados, por
e'emplo (:,-,;" $ (<,=>,." son estados. La precondicin del programa es el predicado %5,
$56, el cual establece que 'usto antes de e'ecutar el programa ?m%imo? el estado es %5,
$56, z puede contener cualquier alor, por lo que no se menciona e%pl2citamente como
en el caso de las ariables % e $. El predicado z 5 ma%(,,6", es la postcondicin del
programa m%imo.
, $ 6 se llaman variables de especificacin, en el sentido que no aparecern en las
instrucciones (o acciones" del programa, slo siren para representar alores en las
condiciones (pre $ post condiciones" $ pueden erse en este caso como datos de entrada al
programa que pueden ser proporcionados, por e'emplo, mediante la e'ecucin de una
instruccin de lectura. &or los momentos no ser releante conocer cmo se establece la
precondicin, $ en particular, el estado inicial (,,6,@".
Aupongamos que tenemos a la mano un programa, llamado m%imo, $a desarrollado, que
calcula el m%imo entre dos enteros % e $. #iremos que el programa m%imo cumple la
especificacin anterior si para todas las e'ecuciones de m%imo comenzando en un estado
que cumpla la precondicin, este termina (tiene un tiempo de e'ecucin finito" en un estado
que cumple la postcondicin.
B<
En general, el hecho que un programa A cumpla una especificacin con precondicin & $
postcondicin 0 se denota de la siguiente manera!
4&7 A 407
$ tiene la siguiente interpretacin operacional!
Aiempre que una e'ecucin de A comience en un estado que cumple la precondicin &,
entonces A terminar (tiene un tiempo de e'ecucin finito" en un estado que cumple la
postcondicin 0.
Cote que la e%presin 4&7 A 407 es un predicado, es decir, puede tener un alor erdadero
o falso. En efecto, por definicin de 4&7 A 407, se sobreentiende que esta proposicin est
uniersalmente cuantificada sobre todas las ariables de especificacin que aparecen en
ella, ms a*n, sobre todas las ariables libres que aparecen en ella. En el e'emplo anterior,
la especificacin!
4%5, $567 m%imo 4z 5 ma%(,,6"7
tiene el significado siguiente!
,6%$z (4%5, $567 m%imo 4z 5 ma%(,,6"7"
que se interpreta de la siguiente manera! para todo n*mero entero , $ para todo n*mero
entero 6, si se tiene que %5,, $56 al comienzo de la e'ecucin del programa m%imo,
entonces m%imo terminar en un estado que cumple z5ma%(,,6".
El e'emplo de la seccin :.:. lo podemos especificar como sigue!
3ar , D, l, %, r ! reales)
4 Ae tiene que 5E, D5F, l5L, %5G, donde E, F, L, G son n*meros reales no negatios $ F
es distinto de cero. L es la cantidad de litros consumidos por el eh2culo cuando recorre F
Dilmetros a la elocidad constante E. 7
H,AIL/C, +ICA1J/#,
4 r es la cantidad de gasolina que consume un eh2culo al recorrer G Dilmetros a la
elocidad constante E. 7
En este e'emplo el espacio de estados es (el producto cartesiano del
con'unto de los n*meros reales por el mismo > eces". Las coordenadas de este espacio
corresponden a cada una de las ariables! la primera coordenada a , la segunda a D, la
tercera a l, la cuarta a % $ la quinta a r. E, F, L $ G son ariables de especificacin.
B:
Aobre buenas $ malas especificaciones
+onsidere la siguiente especificacin de un programa para calcular el m%imo entre dos
n*meros enteros cualesquiera!
3 ar %,$,z! entero)
4 %5, $56 7
m%imo
4z 5 ma%(%,$"7
8.
+mo la especificacin no menciona que % e $ no pueden ser modificadas por el programa,
ste puede modificar los alores de las ariables %, $, z. En efecto, el siguiente programa!
- colocar en % el alor de :
- colocar en $ el alor de -
- colocar en z el alor de -
cumple perfectamente con la especificacin anterior. Ain embargo, no es ste el programa
que queremos $a que este programa no est calculando el m%imo entre dos n*meros
cualesquiera.
El e'emplo anterior ilustra la utilidad de las ariables de especificacin como mecanismo
para garantizar que cuando termine el programa la ariable z contendr el m%imo de los
alores originales de % e $.
Es bueno mencionar que un principio bsico de un buen programador es el programa no
debe hacer ni ms ni menos de lo e%pl2citamente requerido. En consecuencia, aunque en
ning*n momento se menciona e%pl2citamente que % e $ no deben cambiar de alor, para
eitar la ambiguedad recurrimos a las ariables de especificacin $ obtenemos la
especificacin!
3ar %,$,z! entero)
4%5, $567
m%imo
4z 5 ma%(,,6"7
8.
que garantiza que z contendr el m%imo de los alores originales de % e $.
Ai queremos ir ms le'os $ e%pl2citamente colocar en la especificacin el hecho de que
algunas ariables no deben ser modificadas por el programa, introducimos la nocin de
constante. 1tilizamos la palabra const en lugar de var para e%presar el hecho que las
ariables correspondientes no sern modificadas. ,s2, para eitar que las ariables % e $
sean modificadas por el programa m%imo, tenemos la especificacin!
B-
3 const G,K! entero)
ar z! entero)
4 erdad 7
m%imo
4z 5 ma%(G,K"7
8.
La precondicin erdad significa no se le e%ige nada al estado inicial de las ariables
para e'ecutar el programa, as2 todos los estados del espacio de estados cumplen la
precondicin (erdad". En trminos de con'untos podemos razonar como sigue para
mostrar que todo estado del espacio de estados satisface la precondicin erdad! #ada la
precondicin &(%", donde % es una ariable sobre el espacio de estados, el con'unto / de
estados que satisfacen &(%" es / 5 4 %! % pertenece al espacio de estados &(%" 7. En caso
de que &(%" sea la proposicin erdad ( E", el con'unto / es igual al espacio de estados
en su totalidad ( se cumple! 3(% pertenece al espacio de estados E " % pertenece al
espacio de estados8 ", por lo que cualquier estado del espacio de estados puede ser utilizado
como estado inicial para e'ecutar el programa (en este caso m%imo".
1tilizaremos letras ma$*sculas para denotar a las constantes $ a las ariables de
especificacin. En la *ltima especificacin el espacio de estados sigue siendo 9%9%9.
E'emplos de especificaciones de programas!
:" &roblema! #ado un n*mero natural ma$or que : se quiere determinar todos sus factores
primos.
&rimero debemos analizar el enunciado $ entenderlo bien. El enunciado del problema lo
podemos refinar como sigue!
#ado un n*mero natural % ma$or que : se quiere determinar todos los n*meros naturales z
que sean primos $ que diidan a %.
Lefinando ms (introducimos la nocin de con'unto"!
#ado un n*mero natural % ma$or que : se quiere determinar el con'unto +!
+ 5 4 zC ! z diide a % z es primo7
#ado que en este punto los trminos en que est e%presado el enunciado del problema estn
bien definidos, es decir, sabemos lo que es un n*mero primo $ sabemos cuando un n*mero
natural z diide a un n*mero natural %, entonces no es necesario continuar refinando.
La especificacin correspondiente del programa ser2a!
BB
3 ar %! natural)
ar +! con'unto de naturales)
4 %5G G M : 7
clculo de primos
4 + 5 4 zC ! z diide a % z es primo7 7
8.
En general, decir que , es igual al con'unto 4 z6 ! z cumple &(z"7, es equialente a decir
que , es subcon'unto de 6 $ (z! z 6! ( z , &(z" "".
&or lo tanto, la especificacin anterior tambin la podemos escribir como sigue!
3 const G! natural)
ar +! con'unto de naturales)
4 G M : 7
clculo de primos
4 (z! z es natural! ( z + (z es primo "(z diide a G" "" 7
8.
N0u diferencia ha$ entre el predicado (z! z es natural! (z + (z es primo "(z diide
a G""" $ el predicado (z! z es primo! ( z + (z diide a G" "" @. 0ue en el segundo
caso, + puede contener elementos que no son primos $ el predicado ser erdad OOO. &or
e'emplo para G5;, +54:,-,;7, el predicado z! z es primo! ((z diide a G" (z +"" es
erdadero, $ + no es precisamente el que queremos calcule nuestro programa. El + que
queremos es +54:,-7. &or lo tanto ha$ que tener cuidado en los rangos de las ariables
cuando usemos cuantificadores .
La especificacin!
3 const G! entero)
ar +! con'unto de enteros)
4 G M : 7
clculo de primos
4 (z! z es primo! ( z + (z diide a G" "" 7
8.
es incorrecta pues slo queremos que queden en + todos los n*meros primos que diiden a
G $ ning*n otro n*mero natural.
-" &roblema! #ada una secuencia de n*meros enteros determinar el ma$or n*mero en la
secuencia.
Ae quiere colocar en una ariable % el ma$or n*mero de una secuencia A dada.
1na primera especificacin ser2a!
B;
3const A! secuencia de enteros)
ar %! entero)
4 erdad 7
ma$or alor
4% est en la secuencia A $ todo otro elemento de la secuencia tiene alor menor o igual
que %7
8
Js formalmente, utilizando los operadores de secuencia!
3const A! secuencia de enteros)
ar %! entero)
4 erdad 7
ma$or alor
4 (i! < i P A! A3i85%" (i! < i P A! A3i8%" 7
8
Cote que la constante A hace referencia a un ob'eto de la clase (o tipo" secuencia.
E'ercicios!
:" Especifique un programa que calcule en una ariable % el n*mero de
elementos distintos de cero de una secuencia s de C n*meros enteros.
(1tilice el cuantificador de conteo Q, donde (Qi! < i P C! &(i"" representa el
n*mero de enteros i entre < $ C=: que cumple &(i".
-" seccin : gu2a de Jichel +unto $ pag. :<B de Hries reemplazando la palabra
arreglos por secuencias.
Leglas generales sobre especificaciones!
:" La precondicin puede ser reforzada $ la postcondicin puede ser debilitada.
Lecordemos que si & 0 es una tautolog2a entonces decimos que & es ms fuerte que
0 que 0 es ms dbil que &!
Ai 4&7 A 407 se cumple $ para todo estado &< & es erdad (es decir, 3&< &8",
entonces 4&<7 A 407 se cumple.
Ai 4&7 A 407 se cumple $ para todo estado 0 0< es erdad (es decir, 30 0<8",
entonces 4&7 A 40<7 se cumple.
-" La e%presin 4&7 A 4 falso 7 es equialente a decir que para cualquier estado, & siempre
es falso independientemente de A.
La primera regla nos dice que si tenemos un programa A que cumple 4&7 A 407 $
queremos encontrar un programa AR que cumpla 4&<7 AR 407, basta con tomar a A como AR,
pues se cumple 4&<7 A 407. &or e'emplo, un programa A que cumple la especificacin
siguiente!
B>
3 ar %,$ ! entero)
4 %5G $5K7
A
4 z5ma%(G,K" 7
8.
Sambin cumplir la especificacin siguiente!
3 ar %,$ ! entero)
4 %5G $5K GM:< 7
A
4 z5ma%(G,K" 7
8.

Ka que (%5G $5K GM:<" (%5G $5K" es una tautolog2a.
B" Legla de con'uncin!
4&7 A 407se cumple $ 4&7 A 4L7 se cumple es equialente a 4&7 A 40L7 se cumple
;" Legla de la dis$untiidad!
4&7 A 407 se cumple $ 4L7 A 407 se cumple es equialente a 4&L7 A 407 se cumple
Cote que 0L es ms fuerte que 0 $ que L, $ &L es ms dbil que & $ que L.
3.2. Diseo de la solucin algortmica
#ebemos encontrar un algoritmo que partiendo del estado requerido en la precondicin,
una ez que ste se e'ecute, se obtenga el estado deseado en la postcondicin. Las
estrategias para llear esto a cabo pueden ir desde utilizar slo la intuicin, el sentido
com*n $ estrategias generales de solucin de problemas, hasta utilizar slo reglas
precisas para deriar (o calcular" el algoritmo a partir de la especificacin (estas tcnicas
las eremos ms adelante".
Entre las estrategias generales para resoler problemas se encuentra el diseo descendente.
Este consiste en e%presar la solucin del problema como una composicin de las soluciones
de problemas ms sencillos de resoler. El e'emplo de la seccin :.:. puede ser
descompuesto en determinar cuntos litros de gasolina por Dilmetro consume el eh2culo $
luego multiplicar esa cantidad por el n*mero de Dilmetros recorridos %. El problema fue
descompuesto en dos subproblemas, el primero tiene solucin lTD $ el segundo (lTD"U%. El
diseo descendente tambin se denomina tcnica de refinamiento sucesio $a que, a su
ez, a los problemas ms sencillos se les aplica diseo descendente para resolerlos.
BV
1na mquina es un mecanismo capaz de e'ecutar un algoritmo e%presado en funcin de las
acciones elementales que sta pueda e'ecutar.
+uando resolemos un problema mediante la tcnica de diseo descendente, amos
refinando la solucin del problema en trminos de algoritmos cu$as acciones elementales
pueden ser e'ecutadas por mquinas cada ez menos abstractas. +uando un algoritmo puede
ser e'ecutado por una mquina real (el computador" decimos que el algoritmo es un
programa. 1n programa es un algoritmo destinado a comandar una mquina real.
Wallar un programa, para ser e'ecutado por un computador, que resuele un problema dado,
significa aplicar la tcnica de diseo descendente hasta encontrar un algoritmo, solucin del
problema, cu$as acciones pueden ser e'ecutadas por el computador.
&or lo tanto el mtodo consiste en definir mquinas abstractas cu$o funcionamiento es
descrito por los algoritmos adaptados a cada niel de mquina. Ae parte de una mquina
que trata informacin de alto niel $ es capaz de e'ecutar acciones comple'as. Wabiendo
descrito la solucin del problema en trminos de esas acciones, se toma cada una de stas $
se describen en funcin de acciones e'ecutables por mquinas abstractas de niel ms ba'o
(es decir que mane'an informacin $ e'ecutan acciones cada ez menos comple'as". +uando
una mquina abstracta coincide con la real (por e'emplo, el lengua'e de programacin que
utilizamos", el anlisis se termina. En este proceso de ir de mquinas abstractas a otras de
menor niel, se debe identificar analog2as con problemas $a resueltos $ utilizar soluciones
$a elaboradas para no tener que reinentar la ruedaO
En el e'emplo de la seccin :.:. una primera solucin del problema consisti en
descomponer el problema original en dos subproblemas a resoler de manera secuencial!
primero calcule el consumo de gasolina por Dilmetro, luego con el consumo por Dilmetro
$ la cantidad de Dilmetros a recorrer % calcule el gasto de gasolina. &or lo tanto si
contamos con una mquina que sepa resoler estos dos subproblemas, $a conseguimos la
solucin. En caso contrario, tendremos que descomponer cada uno de los dos subproblemas
en problemas ms sencillos, por e'emplo determinar el consumo por Dilmetro se puede
e%presar como diidir la cantidad l entre D, Npero sabemos diidir@.... 1tilizaremos $
e'ercitaremos la tcnica de diseo descendente en los e'emplos que iremos presentado en
las notas.
E'emplo de aplicacin de diseo descendente!
&roblema! Esto$ en casa, deseo leer el peridico $ no lo tengo.
1na solucin ser2a!
(:" Aalir de casa.
(-" /r al puesto de enta del peridico $ comprarlo.
(B" Legresar a casa.
(;" Leer el peridico.
BX
&odemos refinar a*n ms las acciones dependiendo de si el e'ecutante del algoritmo sabe o
no realizar cada una de las acciones descritas. &or e'emplo, podemos precisar me'or la
accin Aalir de la casa!
Aalir de la casa!
(:" Eerificar que se tiene dinero suficiente para comprar el peridico
(-" /r hasta la puerta principal de la casa.
(B" ,brir la puerta.
(;" Aalir al e%terior de la casa.
(>" +errar la puerta.
1n computador es capaz de e'ecutar acciones mu$ elementales! operaciones aritmticas $
lgicas, $ controlar el flu'o de e'ecucin. &or esta razn e%isten los lengua'es de
programacin, para liberar al programador de la ardua tarea de escribir los programas en el
lengua'e que reconoce el computador (el lengua'e de mquina", $ as2 poder escribir los
programas en un lengua'e de ms alto niel de abstraccin, ms fcil de utilizar por el
programador. 1n lenguaje de programacin, como Y,E,, &,A+,L, +, no es ms que un
repertorio de acciones elementales de una mquina abstracta, estas acciones tienen un niel
de abstraccin ms alto que las acciones que puede e'ecutar el computador.
&ara que un computador pueda e'ecutar las acciones de un programa escrito en un lengua'e
de alto niel, es necesario que e%ista un traductor que traduzca el programa de alto niel a
un programa (o cdigo" que pueda comandar al computador. , este traductor se le conoce
con el nombre de Compilador. Itra forma en que un computador puede e'ecutar un
programa escrito en un lengua'e de alto niel es a tras de otro programa, llamado
Interpretador, que simula la mquina irtual que representa el lengua'e de alto niel. El
interpretador analiza $ luego e'ecuta las acciones del programa escrito en el lengua'e de alto
niel.
1n algoritmo escrito en un lengua'e de programacin de alto niel, lo llamaremos
programa, pues e%iste otro mecanismo automatizado (el compilador" que permite traducirlo
a lengua'e de mquina. 1n lengua'e de programacin constitu$e un medio para hacer
programas de una manera precisa $ rigurosa, pues cada accin elemental del lengua'e tiene
reglas sintcticas (cmo se escriben las acciones" $ reglas semnticas (qu significa desde
el punto de ista operacional la accin" tan precisas como el lengua'e matemtico. Wacer un
programa correcto e%ige la misma rigurosidad que hacer una demostracin matemtica de
un teorema.
&or lo tanto es importante distinguir claramente dos etapas en la actiidad de programacin!
una, desarrollar el algoritmo) la otra, refinar el algoritmo hasta conertirlo en un programa.
E'ercicio! #escribir en lengua'e natural el proceso aprendido en la escuela, para diidir un
n*mero G entre otro K. Las acciones elementales debern ser suficientemente claras para
que otra persona (la mquina que lo e'ecutar" las pueda llear a cabo.
BZ
En las notas utilizaremos un lengua'e para describir nuestros programas, que adems de
tener acciones elementales precisas, tambin permite tener acciones descritas en lengua'e
natural, por lo que lo llamaremos pseudolenguaje. Los datos iniciales sern proporcionados
por una instruccin de lectura, $ los resultados se escribirn mediante una instruccin de
escritura, de la forma leer(..." $ escribir(...". En general, no haremos mencin e%pl2cita de
estas instrucciones pues enfocaremos nuestra atencin en el diseo del algoritmo que
describe el cmputo de los resultados en trminos de la entrada sin importar de donde
proienen los datos de entrada ni para qu sern utilizados los resultados.
B.
;<

Вам также может понравиться