Sunteți pe pagina 1din 8

Programación I – 2016 Prof.

Diana Cicinelli

Introducción al Diseño
de Algoritmos
Introducción
Los algoritmos son métodos bien definidos con el único fin de realizar una tarea específica.
Generalmente, los algoritmos son expresados en lenguaje natural (Español, inglés, etc.) y
luego son traducidos a un lenguaje formal (Lenguaje C, Python, Java, etc. ). Cuando se
debe desarrollar un programa para resolver un determinado problema, el paso primero es
"pensar una solución", en nuestra mente debe aparecer la idea para resolver el problema
planteado que luego volcaremos en lápiz y papel a una secuencia de pasos a seguir que
escribiremos en lenguaje natural que llamaremos algoritmo. El algoritmo así obtenido
puede ser traducido a un lenguaje de programación, por lo tanto, el algoritmo es
independiente del lenguaje formal.

Definición
Un algoritmo es un conjunto ordenado de pasos ejecutables que define, sin ambigüedad,
cómo debe llevarse a cabo una tarea.

Ejemplo de algoritmos:
• dividir un número A por otro B si B es distinto de cero.
• multiplicar un número A por otro B.
• calcular la raiz cuadrada de un número.
• conversión de una representación numérica a otra.
• detección y corrección de errores en datos.
• compresión y descompresión de archivos.
• control de multiprogramación en un entorno multitarea.

Un simple ejemplo de algoritmo es cómo funciona la CPU.

Enunciado: funcionamiento de la CPU


Algoritmo:
a. tomar una instrucción
b. decodificar la instrucción
c. ejecutar la instrucción

Enunciado: Convertir una temperatura medida en grados Celsius a grados Fahrenheit.


Algoritmo:
1. multiplicar la temperatura leída en Celsius por 9/5.
2. al resultado anterior sumarle 32.

Análisis del algoritmo: en este sencillo ejemplo podemos ver que las únicas dos tareas que
se llevan a cabo están ordenadas de manera secuencial, una a continuación de la otra y

1
Programación I – 2016 Prof. Diana Cicinelli

este orden no se puede invertir porque primero debemos "leer" el dato a procesar que es la
temperatura medida en grados Celsius.

Otra versión del mismo algoritmo es la siguiente:


1.1. leer la temperatura medida en grados celsius
1.2.multiplicar el valor anterior por 9/5
2. al resultado sumarle 32

En este caso se observa que el paso 1 de la primera versión fue subdividido en dos tareas
más sencillas. El proceso llevado a cabo se denomina diseño "Top-Down". Se desarrolla el
problema en etapas que a su vez van a ser subdivididas en tareas elementales.

Algoritmos Cotidianos:
Los algoritmos están presentes también en la vida diaria como podemos ver en el
siguiente ejemplo:

Enunciado: Preparar una taza de Té teniendo una pava, una tetera, una taza, un saquito
de té y azucarera.
Algoritmo:
llenar de agua la pava
encender el fuego
poner la pava en el fuego
esperar a que hierva el agua
colocar la bolsa de té en la tetera
poner el agua hervida en la tetera
esperar un minuto
hechar el té en la taza
endulzar

Análisis del algoritmo: En este sencillo algoritmo, siguiendo la secuencia de acciones en el


orden convenido se llega a obtener una taza de té. Contamos para ello con objetos como la
taza, el saquito, etc. Si algunos de estos objetos faltase no se llegaría a la solución.

Enunciado: Teniendo una cantidad infinitas de papas y una cesta, pelar una cantidad
suficientes de papas.
Algoritmo:
mientras no tenga una cantidad suficiente de papas peladas:
si el cesto está vacío:
llenar el cesto
pelar una papa

Análisis del algoritmo: en esta sencilla solución al problema podemos ver que nuestro
procesador sabe pelar una papa, verificar el estado de la cesta y si se llegó a la cantidad

2
Programación I – 2016 Prof. Diana Cicinelli

suficiente de papas peladas. Además podemos observar que hay un orden en la forma de
ejecutar los pasos, ya que la instrucción "pelar una papa" no se podría realizar si la cesta
está vacía, por este motivo es que primero se debe llenar la cesta.
Podemos ver, también, que en el proceso de obtener una suficiente cantidad de papas
peladas no alcanza con pelar una papa, se deben pelar, tal vez, más de una y por lo tanto
aparece aquí la necesidad de repetir una misma tarea varias veces. Este mecanismo de
repetición se logra utilizando la instrucción "mientras". ¿Cuántas veces debemos repetir
los mismos pasos? Para controlar que pelemos exactamente una cantidad suficiente de
papas peladas, ni una más, ni una menos, debemos verificar la cantidad de papas peladas
tantas veces como sea necesario. Llegamos a un punto donde debemos distinguir entre
una acción a llevar a cabo y una pregunta que hacemos para saber si hemos obtenido
nuestro propósito. La acción que se debe hacer o ejecutar se denomina "instrucción" y se
puede describir como la orden a llevar a cabo y aquello que se pregunta para parar el
proceso se denomina "proposición" o también "condición". El valor asignado a una
condición depende de su verdad o falsedad mientras que la instrucción u orden sólo se
realiza, se ejecuta.

En el diseño Top-Down del agoritmo se parte de un enunciado y se lo subdivide en tareas


donde cada una de ellas puede ser subdividida a su vez en tareas cada vez más
elementales hasta llegar a la acción primitiva que en definitiva es la que se va a ejecutar.
Esquema Top-Down:

El algoritmo debe ser expresado en acciones primitivas para poder ser traducido a
programa. Muchas veces las acciones primitivas están determinadas por el lenguaje de
programación que se usará. Existen muchos lenguajes formales, algunos son aplicables a
determinadas tareas para las cuales son más eficientes pero la mayoría de los lenguajes
están diseñados para propósitos múltiples.

Una vez que se obtiene el algoritmo debe ser traducido a un lenguaje de Programación.
Los lenguajes formales de programación están basados en un conjunto de acciones
primitivas que tienen una determinada sintaxis y una determinada semántica. La sintaxis
se refiere a la forma simbólica de representación de la instrucción (cómo se escribe) y la

3
Programación I – 2016 Prof. Diana Cicinelli

semántica se refiere a la interpretación o sentido de la instrucción (el significado) . Un


ejemplo de sintaxis y semántica es la palabra "aire", sabemos que el aire está compuesto
de oxígeno y otras sustancias mientras que su semántica es el significado que tiene que es
una sustancia gaseosa que rodea al mundo.

Estructuras de Control
En los ejemplos anteriores encontramos que hay procesos en los cuales el orden de las
acciones se realiza en secuencia, una después de la otra, este esquema se denomina
secuencia. Mientras que otros procesos se deben repetir una cantidad de veces hasta que
se obtiene el objetivo. Este proceso repetitivo se describe con la palabra "mientras"
acompañada de una condición que según su valor de verdad o falsedad determina
cuándo se finaliza la repetición del mismo proceso.

Esta combinación de "mientras condición" se denomina "estructura de control de


repetición" o "estructura de repetición" o simplemente "ciclo". Los lenguajes formales
tienen distintos tipos de ciclos, en el ejemplo se usó un "ciclo mientras". Este esquema es
una abstracción del esquema secuencial. Pero no es la única abstracción de la que
podemos hechar uso si fuese necesario. No siempre es necesario repetir un proceso
muchas para llegar a nuestro objetivo, sino que algunas veces es necesario tomar
decisiones, es decir, poder optar entre un camino u otro, si se cumple o no una
determinada condición o simplemente obviar un proceso si no se cumple determinada
condición. Este tipo de construcción algoritmica se denomina "estructura de decisión", por
ejemplo:

Enunciado: Comprar en el supermecado un producto determinado dependiendo si tiene


descuento.
Algoritmo:
si el producto xxx tiene descuento:
agregarlo al carrito

Enunciado: Comprar jabón para lavar A ó B, en un supermecado.


Algoritmo:
si el costo de A es menor al costo de B:
agregar A al carrito de compras
sino
agregar B al carrito de compras

Esto significa que al carrito de compras se agrega A si el valor de A es menor al de B ó al


carrito de compras se agrega B si el valor de B es menor al de A. Se ejecuta sólo una acción.

En el siguiente ejemplo vamos a calcular el valor de la siguiente función

4
Programación I – 2016 Prof. Diana Cicinelli

Enunciado: Cáculo del valor de la función f(x) = 0 si x <= 0, f(x) = x^2 si x > 0.
Algoritmo:
obtener el valor de x
poner f en 0
si x > 0
poner x^2 en f
mostrar el valor de f

Diseño de Algoritmos:
El desarrollo de un programa consiste de tres etapas:
• entender el problema
• diseñar el algoritmo que resuelva el problema
• traducir el algoritmo a programa

De las dos etapas enunciadas la más difícil es la segunda. Poder diseñar un algoritmo que
resuelva determinado problema involucra encontrar un método y probar que este método
resuelve el problema eficientemente.

Ejemplo:
Enunciado: Calcular la superficie de un círculo
Después de entender el enunciado, lo primero que debemos pensar es qué necesitamos
para llegar a una solución, en este ejmplo necesitamos conocer el radio del círculo, es
decir, que el radio es un dato para el algoritmo y debemos tenerlo antes de aplicar el
método que lo resuelve.
Algoritmo:
Etapa 1: 1) Entrada de datos
2) Cálculo de la superficie
3) Mostrar el resultado

Etapa 2: 1.1) Obtener el radio


2.1) superficie = 3.1416 radio ^2
3.1) mostrar superficie

Las acciones que quedaron especificadas son acciones primitivas que no se pueden seguir
descomponiendo, por lo tanto, lo que quedó es el algoritmo que resuelve el problema.

Ejemplo:
Enunciado: Encontrar el máximo común divisor entre dos números enteros y positivos.

5
Programación I – 2016 Prof. Diana Cicinelli

Etapa 1)
Todos sabemos, por lo que hemos aprendido en la escuela secundaria, que el máximo
común divisor entre dos números se obtiene de multiplicar los factores primos comunes a
los dos números.
Algunos ejemplos:
mcd(180,60) = 60
mcd(17,3) = 1
mcd(12,18) = 6

Etapa 2)
Algoritmo 1)
obtener el número A y el número B
calcular los factores primos del número A
calcular los factores primos del número B
obtener y multiplicar los números comunes de ambos procesos
mostrar resuyltado del producto

Algoritmo 2)
obtener el número A y el número B
mientras A y B sean distintos de cero:
si A es mayor que B:
dividir A por B y dejar el resultado en A
sino
dividir B por A y dejar el resultado en B
mostrar el último valor de A que es el máximo común divisor

Como se puede apreciar hay dos algoritmos distintos para llegar al mismo resultado.
¿Cuál es el mejor? Para determinar cuál elegir de entre todos los algoritmos posibles para
resolver un mismo problema se pueden usar distintos criterios, uno de ellos podría ser la
cantidad de instrucciones primitivas que se ejecutan. En general se tienen en cuenta
cuántas veces se repite el conjunto de instrucciones dentro de una estructura de repetición.
En este ejemplo, con dos posibles soluciones, encontramos que en la primera solución
tenemos tres tareas que involucran cada una de ellas un ciclo, esto es obvio porque cada
número debe descomposnerse en factores y primos y cada número puede tener uno ó más
factores primos; para calcular todos los factores primos debe hacerse con un ciclo.
Mientras que en la segunda solución sólo hay un ciclo, ya con esto podemos tomar elegir
el segundo algoritmo como el más óptimo.

Ejercicio:
a) Realizar un algoritmo que dado un número entero positivo n, calcular la lista de
números positivos cuyo producto es el mayor entre todas las listas de números cuya suma
es n. Ejemplo: si n es 4, las listas posibles de números enteros que sumen 4 son:
2, 2 cuyo producto es 4
1, 1, 1, 1 cuyo producto es 1
2, 1, 1 cuyo producto es 2

6
Programación I – 2016 Prof. Diana Cicinelli

3, 1 cuyo producto es 3

Por lo tanto, la lista 2, 2


b) Cuál sería la solución deseada si n = 2001?

Formas de Controlar una estructura de repetición:


La estructura de repetición más común tiene la siguiente sintaxis,

mientras (condición):
cuerpo del ciclo

La ejecución de la estructura repetitiva sigue el siguiente patrón

verifica condición
ejecuta el cuerpo
verifica condición
ejecuta el cuerpo
.
.
.
verifica condición

y el proceso continúa hasta que la evaluación de la condición retorna valor de falsedad.


Es decir, que se podría decir que el patrón que sigue el ciclo es " mientras la condición
evalúe a verdad ejecutar el cuerpo", enfatizando el hecho que la condición debe evaluar a
valor de falsedad para romper la repetición. Está por demás decir que la condición debe
estar correctamente elegida para que evalúe correctamente porque podríamos caer en un
ciclo infinito, que nunca finalizace. Por ejemplo, se quiere obtener la secuencia 1, 3, 5, 7 con
el siguiente algoritmo:
numero ← 1
mientras (numero ≠ 8):
numero ← numero + 2

La ejecución se muestra en la siguiente tabla:

numero condición
1 1 ≠ 8 verdad
3 3 ≠ 8 verdad
5 5 ≠ 8 verdad
7 7 ≠ 8 verdad
9 9 ≠ 8 verdad
y así sigue, no finalizando.

7
Programación I – 2016 Prof. Diana Cicinelli

Esto sucede porque la condición fue mal elegida, la condición correcta debería haber sido
"numero <= 8", de esta forma hubiese finalizado correctamente.

En definitiva, en el ejemplo anterior, numero debe incrementarse hasta llegar a 7. Pero esta
no es la única forma de construir una condición para un ciclo repetitivo.
La forma de elegir la condición dependerá del problema planteado pero siempre teniendo
presente que la condición tendrá que ser capaz de cambiar de estado para poder
interrumpir el ciclo. Enn este punto hay que hacer notar que la condición puede llegar a
ser compleja involucrando más de una proposición en la misma condición.

Ejercicios:

1) Diseñar un algoritmo que permita encontrar todos los factores de un número entero
positivo. Por ejemplo, para el número 12, el algoritmo debería calcular 1, 2, 3, 4, 6 y
12.
2) Diseñar un algoritmo para determinar el día de la semana de cualquier fecha desde
el 1 de Enero de 1700. El 17 de Agosto de 2001 fue viernes.
3) Diseñar un algoritmo que encuentre la palabra más larga de un texto dado. Si hay
más de una con la misma longitud.
4) Dada la siguiente lista de números: 26, 39, 104, 195, 403, 504, 793, 995, 1156, 1677.
Realizar un algoritmo que permita extraer un subconjunto de números cuya suma
sea 3165.
5) El siguiente fragmento de algoritmo es correcto? Finaliza?
X←1
Y←½
mientras (X ≠ 0):
X← X–Y
Y← Y / 2

♫♪♫

Bibliografía: Computer Science, an overview. J. Glenn Brookshear. Addison-Wesley.

S-ar putea să vă placă și