Professional Documents
Culture Documents
Programación:
Algoritmos
1
Esta obra está bajo Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.
2
Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional
Tabla de Contenido
1 Introducción ....................................................................................................... 1
2 Metodología de enseñanza/aprendizaje de nuestro espacio curricular ......................... 1
3 Resolución de Problemas ...................................................................................... 1
4 Pseudocódigo – Lenguaje de diseño de Algoritmos................................................... 5
4.1 Sintaxis de un Algoritmo ................................................................................ 5
4.2 Acciones primitivas de manipulación de datos ................................................... 6
4.2.1 Operaciones Aritméticas ......................................................................... 6
4.2.2 Operaciones Relacionales........................................................................ 6
4.2.3 Operaciones Lógicas .............................................................................. 7
4.2.4 Asignación ............................................................................................ 8
4.2.5 Entrada de datos ................................................................................... 8
4.2.6 Salida de datos ..................................................................................... 9
4.2.7 Trazas .................................................................................................. 9
4.3 Acciones para estructurar el flujo de ejecución de instrucciones......................... 10
4.3.1 Secuencia ........................................................................................... 10
4.3.2 Condicional ......................................................................................... 17
4.3.3 Repetición .......................................................................................... 28
5 Métodos para Resolver Problemas ....................................................................... 47
5.1 Descomposición de problema en subproblemas (Modularización) ....................... 48
5.1.1 Definición de Métodos (subAlgoritmos) ................................................... 48
5.1.2 Invocación/llamada a un Método (subAlgoritmo) desde otro algoritmo ...... 49
5.2 Refinamiento paso a paso ............................................................................. 57
5.3 Particularización - Uso específico de ejemplos ................................................. 60
5.4 Similitud entre Problemas ............................................................................. 63
6 Ventajas del lenguaje de diseño .......................................................................... 66
6.1 Programación Estructurada ........................................................................... 66
7 Algoritmo Principal – Interacción con el usuario..................................................... 67
8 Bibliografía ....................................................................................................... 69
1
1 Introducción
Una computadora es un autómata que ejecuta un proceso de acuerdo a reglas rígidas. Este
proceso es especificado por un programa. Un programa consiste en una secuencia de
instrucciones que ha de ejecutar la computadora. Por lo general, una computadora posee un
repertorio muy reducido de instrucciones, las únicas que es capaz de entender y obedecer. El
poder esencial de las computadoras es su capacidad para ejecutar enormes secuencias de
acciones elementales en tiempos muy reducidos.
Así es que, en la medida que el rango de aplicación de las computadoras ha ido creciendo,
abarcando problemas más grandes y complejos, el énfasis de la programación ha pasado a ser
el diseño de algoritmos. Un algoritmo se define como una secuencia de pasos o acciones que
describe una estrategia de resolución de un problema (o más bien de una clase de problemas).
Se ha elegido el lenguaje de programación Pascal en primer lugar porque, entre los lenguajes
más difundidos, es uno de los que promueve mejores hábitos de programación. La mayor parte
de las características que nombraremos como deseables para lograr un buen estilo de
programación son soportadas por Pascal. Otra ventaja es el hecho de que Pascal no está
orientado a un tipo de aplicación específico, sino que es de propósito general.
3 Resolución de Problemas
Todo problema puede pensarse como una discrepancia entre un estado actual o inicial y un
estado deseado o final. Para pasar de un estado a otro realizamos determinadas tareas que
2
denominamos acciones. Así es que hallar una solución consiste en determinar la sucesión de
acciones intermedias.
2
Los métodos que utilizan algoritmos se denominan métodos algorítmicos, en oposición a los
métodos que implican algún juicio o interpretación que se denominan métodos heurísticos. Los
primeros se pueden implementar en computadoras.
3
Diseñar una estrategia de resolución o algoritmo, nos permite pensar de manera más
abstracta cuáles serían las grandes acciones que deberíamos realizar parar resolver el
problema.
Características de un algoritmo:
EJEMPLO:
A partir de los supuestos anteriores podemos hallar una solución al problema de una
forma muy rudimentaria y tediosa:
Este método es muy ineficiente porque partimos de premisas muy simples. Podemos
simplificar el problema si disponemos de más información. Si sabemos que el
4
Cada método ha sido una mejora respecto del anterior, pero requiere más información,
supone que sabemos hacer más cosas.
Ahora bien, es claro que cualquiera de los algoritmos sirve no sólo para encontrar el
significado de la palabra lenguaje, sino para cualquier palabra. No sólo podemos hallar
la solución de un problema, sino resolver toda una clase de problemas. Es más, el
mismo método podría ser utilizado para hallar solución a problemas similares, como por
ejemplo buscar en una guía telefónica el número de teléfono de una persona.
Las dos primeras fases conducen a un diseño detallado escrito en forma de algoritmo.
Durante la tercera etapa se implementa el algoritmo en un lenguaje de programación.
3
Existen otras opciones de traducción a código binario conocidas como Interpretación sobre las cuales no
ahondaremos en este curso.
5
Comparados con los lenguajes naturales, los lenguajes de programación poseen un número
muy reducido de vocablos básicos y las reglas gramaticales son pocas, simples y estrictas.
Así es que el objetivo fundamental de un lenguaje de diseño es que sea comprensible para las
personas que van a interpretar y discutir algoritmos escritos con él, facilitando las
modificaciones y el trabajo de diseño en equipo (el objetivo fundamental de un lenguaje de
programación, en cambio, es ser comprensible para la computadora que va a interpretar y
ejecutar el programa en cuestión). La idea es no sumar a la complejidad del problema, las
limitaciones impuestas por una notación estricta propia de cualquier lenguaje de programación.
Algoritmo Nombre_Algoritmo
Datos: variable Є dominio
….
variable Є dominio
Comienzo
Sentencia1
Sentencia2 Acciones de manipulación de datos y
.… de control del flujo de ejecución.
SentencaN
FinAlgoritmo
1) Una descripción de los datos que serán manipulados junto con una identificación
del dominio de esos datos (conjunto posible de valores que puede tomar un dato).
Descripción de Datos
Todo problema hace referencia a una serie de objetos que denominamos datos del problema.
La cantidad de datos viene dada por el problema en particular que se desee resolver.
4
También denominadas sentencias ó instrucciones
6
Para cada dato se debe indicar el dominio al cual pertenece ese dato, o sea el conjunto de
valores que puede llegar a tomar (tipo de dato). Tenemos datos enteros (Z), datos reales
(R), datos de tipo texto o cadenas de caracteres (Texto), datos booleanos o lógicos
(Booleanos), etc.
Para la identificación de los datos es útil usar nombres significativos. Surge aquí el concepto de
variable. Las variables identifican un lugar de memoria que es capaz de almacenar un tipo de
dato específico. Cada dato estará asociado a una variable.
Observación: NO es lo mismo hablar de los valores de los datos que de los datos o
nombres de los datos. Cuando mencionamos valores, estamos usando ejemplos particulares.
Cuando hablamos de nombres de datos estamos haciendo referencia al dato en general, sin
especificar ningún valor en especial, estamos generalizando y usando variables.
Operaciones aritméticas
Operaciones relacionales
Operaciones lógicas
Asignación
Entrada de datos (por teclado/mouse, por ejemplo)
Salida de datos (por pantalla)
Son operaciones binarias, que trabajan sobre dos operandos numéricos y devuelven un
resultado numérico.
Suma + 8 + 2 10
Resta - 8 -2 6
Producto * 8 * 2 16
División exacta / 7/2 3.5
División entera /e 7 /e 2 3
Resto de división // 7 // 2 1
entera
4.2.2 Operaciones Relacionales
Son operaciones binarias, que trabajan sobre dos operandos del mismo tipo de dato (números,
textos, caracteres, valores lógicos) y devuelven un resultado lógico (booleano).
5
Órdenes/instrucciones básicas y que permiten la construcción de acciones de programación más complejas.
7
Las operaciones lógicas son: conjunción (Y), disyunción (O) y negación (NO). Son
binarias, trabajan sobre dos operandos lógicos y devuelven un resultado lógico (booleano).
Para determinar los resultados de las distintas operaciones lógicas se utilizan las siguientes
tablas de verdad.
A B AyB A B AoB A NO A
V V V V V V V F
V F F V F V F V
F V F F V V
F F F F F F
Normalmente las operaciones lógicas se usan con operadores de relación y matemáticos para
formar condiciones más complejas. Se usa mucho en programación la escritura de condiciones
como forma de expresar afirmaciones del lenguaje o restricciones.
Ejemplo 1: Mes es un número de mes correcto: (Mes >= 1) Y (Mes <= 12)
Ejemplo 2: Nota es una nota incorrecta: (Nota < 0) O (Nota > 10)
Nota (Nota < 0) (Nota > 10) (Nota < 0) O (Nota > 10)
-2 V F Verdadero
1 F F Falso
9 F F Falso
14 F V Verdadero
Uno de los errores más comunes es: confundirse de operador y utilizar el incorrecto. Por
ejemplo, ¿cómo nos damos cuenta que nos equivocamos si utilizamos la notación (Nota < 0)
Y (Nota > 10) en el caso anterior?
Nota (Nota < 0) (Nota > 10) (Nota < 0) Y (Nota > 10)
-2 V F Falso
1 F F Falso
9 F F Falso
14 F V Falso
8
Observamos que a la pregunta: ¿-2 es una nota incorrecta? Se contesta Falso y a ¿14 es una
nota incorrecta? Falso. Entonces hay un problema en la expresión lógica, ya que 1 y 9 NO son
notas incorrectas.
Con este ejemplo se comprueba que la construcción de este tipo de tablas ayuda a identificar
errores.
Ejemplo 3:
Nro es un número impar (al dividirlo por dos el resto es distinto de 0): Nro // 2 <> 0
4.2.4 Asignación
Es una acción que permite asociar un valor o resultado de una expresión a un dato (variable),
para que el mismo pueda ser usado más adelante.
Sintaxis:
Variable Expresión
Donde expresión puede ser: una constante (literal), una variable o una expresión
matemática, relacional o lógica.
Funcionamiento:
Ejemplos:
Es una acción que permite ingresar en memoria un valor ingresado por el usuario (supóngase
por teclado) asociándolo a la variable que figura en la sentencia, para que pueda ser usado
más adelante.
Sintaxis:
9
Funcionamiento
Ejemplos:
Es una acción que permite mostrar por pantalla valores literales (constantes), valores de
variables o resultados de expresiones.
Sintaxis:
Funcionamiento:
Se muestran por pantalla las constantes, el valor de las variables y/o el resultado de las
expresiones indicadas en la sentencia
Ejemplos:
4.2.7 Trazas
Una traza consiste en realizar un seguimiento al algoritmo con distintos valores para las
variables a fin de comprobar el funcionamiento de dicho algoritmo. Para ello se construye una
tabla con tantas columnas como variables existan en el algoritmo y otra para la salida por
pantalla.
Para que realmente la traza sirva, uno debe cumplir al pie de la letra lo indicado en el
algoritmo y olvidar lo que realmente desea hacer. Si una traza da el valor esperado, esto no
indica que el algoritmo funciona bien. Para ello hay que asegurar un conjunto de valores de
prueba que abarquen a todos los casos problemáticos.
Lo que sí se puede asegurar con una traza es que si el resultado no es el esperado, entonces el
algoritmo no funciona.
10
Las estructuras de control son formas de especificar el orden en que las instrucciones de un
algoritmo se ejecutarán. Las tres estructuras de control básico son:
Secuencia
Condicional
Repetición
4.3.1 Secuencia
Las acciones se ejecutan una tras otra en el orden en que se encuentran escritas en el
algoritmo.
Sintaxis:
Sentencia1
Sentencia2
…
SentenciaN
Funcionamiento
1) se ejecuta la sentencia1
2) se ejecuta la sentencia2
Así sucesivamente hasta que en el paso enésimo se ejecuta la sentenciaN
Ejemplos de Secuencia
Algoritmo AreaDelTriangulo
Datos: B, H Є R {Datos solicitados al usuario – estado inicial}
Area Є R {Dato mostrado al usuario – estado deseado}
Comienzo
MOSTRAR 'Ingrese base y altura del triángulo'
INGRESAR B, H
Area B * H / 2
MOSTRAR 'El area del triángulo es ', Area
FinAlgoritmo
La solución considera que 1 metro = 100 centímetros y que 1 pulgada = 2.54 centímetros.
11
Algoritmo CambiarUnidadMedida
Datos: Mts Є R {Dato solicitados al usuario – estado inicial}
Cms, Plgs Є R {Datos mostrados al usuario – estado deseado}
Comienzo
MOSTRAR 'Ingrese el valor expresado en metros. '
INGRESAR Mts
{Calcula la cantidad en centímetros y lo asigna a la variable Cms}
Cms mts * 100
{Calcula la cantidad en pulgadas y lo asigna a la variable Plgs}
Plgs cms / 2.54
MOSTRAR 'Los metros equivalen a ',Cms, ' centímetros y ', Plgs, ' Pulgadas'
FinAlgoritmo
Análisis 1
1326 10 425 10 7 10
6 132 5 42 7 0
unidades numero // 10
Algoritmo ObtenerUnidades
Datos: Nro Є Z {Dato solicitados al usuario – estado inicial}
Unidad Є Z {Dato mostrado al usuario – estado deseado}
Comienzo
MOSTRAR ' Ingrese un valor entero.'
INGRESAR Nro
Unidad Nro // 10
MOSTRAR 'El valor correspondiente a la unidad es: ', Unidad
FinAlgoritmo
Análisis 2
El residuo de una división entera puede obtenerse también sin recurrir al operador //, de la
siguiente forma:
Para el valor 1326, se realizan las operaciones dadas: (1326 – 1320) y se obtiene el dígito 6.
12
Algoritmo ObtenerUnidades_Version2
Datos: Nro Є Z {Dato solicitados al usuario – estado inicial}
Unidad Є Z {Dato mostrado al usuario – estado deseado}
Comienzo
MOSTRAR 'Ingrese un valor entero.'
INGRESAR Nro
Unidad Nro – (Nro /e 10) * 10
MOSTRAR 'El valor correspondiente a la unidad es: ', Unidad
FinAlgoritmo
Ejemplo 4: Una institución benéfica europea ha recibido tres donaciones en pesos, dólares y
marcos. La donación será repartida en tres rubros: 60% para un centro de salud, 30% para
un comedor de niños y el resto para gastos administrativos.
Considerar que 1 dólar = 15.5 pesos, 1 dólar = 0.51 marcos, 1 dólar = 0.83 euros.
Algoritmo RepartirDonacion
Datos: Pesos, Dolares, Marcos Є R {Restricción: (pesos > 0)Y(Dolares > 0)Y(Marcos > 0)}
Rubro1, Rubro2, Rubro3 Є R
Comienzo
MOSTRAR 'Ingrese valores correspondientes a pesos, dólares y marcos.'
INGRESAR Pesos, Dolares, Marcos
{Conversión de importes a euros}
Euros (Pesos / 15.5 + Dolares + Marcos / 0.51) * 0.83
{Determinación de importes correspondientes a cada rubro}
Rubro1 Euros * 0.60
Rubro2 Euros * 0.30
Rubro3 Euros * 0.10
MOSTRAR 'El monto en euros para cada rubro es: ', Rubro1, ' ', Rubro2, ' ',Rubro3
FinAlgoritmo
Análisis 1: Las cifras pueden ser obtenidas mediante divisiones sucesivas por 10. Considere el
caso de un número Nro igual a 256:
Nro Nro Nro
256 10 25 10 2 10
6 25 5 2 2 0
unidades decenas centenas
unidades Nro // 10 decenas Nro // 10 centenas Nro // 10
Nro Nro /e 10 Nro Nro /e 10 Nro Nro /e 10
Algoritmo SumarDigitos_Version1
Datos: Nro Є Z { Restricción: (Nro >= 0) Y (Nro <=999)}
Suma Є Z
Uni, Dec, Cen Є Z
Comienzo
MOSTRAR 'Ingrese un número positivo de tres dígitos'
INGRESAR Nro
Uni Nro // 10 {Obtener las unidades}
Nro Nro /e 10
Dec Nro // 10 {Obtener las decenas}
Nro Nro /e 10
Cen Nro // 10 {Obtener las centenas}
Suma Uni + Dec + Cen
MOSTRAR 'La suma de los dígitos da: ', Suma
FinAlgoritmo
Análisis 2: Considerando que el número tiene 3 cifras, los dígitos también pueden ser
obtenidos mediante divisiones sucesivas entre 100 y 10. Considere el caso de un número Nro
igual a 256:
256 100 56 10
56 2 centenas unidades 6 5 decenas
Algoritmo SumarDigitos_Version2
Datos: Nro Є Z { Restricción: Nro >= 0 }
Suma Є Z
Uni, Dec, Cen Є Z
Comienzo
MOSTRAR 'Ingrese un valor positivo'
INGRESAR Nro
Cen Nro /e 100 {Obtener las centenas}
Nro Nro //100
Dec Nro /e 10 {Obtener las decenas}
Uni Nro // 10 {Obtener las unidades}
Suma Uni + Dec + Cen
MOSTRAR 'La suma de los dígitos da: ', Suma
FinAlgoritmo
Ejemplo 6: Dada la hora actual determinar cuántas horas, minutos y segundos restan para
finalizar el día.
14
Algoritmo CalcularTiempoParaFinalDelDia
Datos: Hor1, Min1, Seg1 Є Z Restricción:{(Hor1 >= 0)Y(Hor1 <= 24),
(Min1 >= 0) Y (Min1 <= 59), (Seg1 >= 0) Y (Seg1 <= 59)}
Hor2, Min2, Seg2 Є Z
SegRes, Resto Є Z
Comienzo
MOSTRAR 'Ingrese hora, minuto y segundo actuales'
INGRESAR Hor1, Min1, Seg1
Traza:
Hor1 Min1 Seg1 Hor2 Min2 Seg2 SegRes
14 0 0
10 0 0 36000
Algoritmo SumarDosHorarios
Datos: Hor1, Min1, Seg1, Hor1, Min1, Seg1 Є Z Є Z Restricción:{
(Hor1>=0)Y(Hor1<=24), (Min1>=0) Y (Min1<=59), (Seg1>=0) Y (Seg1 <= 59),
(Hor2 >= 0)Y(Hor2<=24), (Min2>=0) Y (Min2<=59), (Seg2>=0) Y (Seg2<=59)}
Hor3, Min3, Seg3 Є Z
TotalSeg, Resto Є Z
Comienzo
MOSTRAR 'Ingrese hora1, minuto1 y segundo1'
INGRESAR Hor1, Min1, Seg1
MOSTRAR 'Ingrese hora2, minuto2 y segundo2'
INGRESAR Hor2, Min2, Seg2
{Determina la cantidad total de segundos entre los dos tiempos}
TotSeg (Hor1 + Hor2) * 3600 + (Min1 + Min2) * 60 + (Seg1 + Seg2)
Traza:
Hor1 Min1 Seg1 Hor2 Min2 Seg2 Hor3 Min3 Seg3 Resto TotSeg
14 50 40
2 20 5
17 10 45 645 61845
Observación: existe otra forma de encontrar la solución, pero para ella debemos primero
aprender a usar el condicional.
Algoritmo CalcularPorcentajeMujeresYVarones
Datos: Varones, Mujeres Є Z
PorcVar, PorcMuj Є R
Total Є Z
Comienzo
MOSTRAR 'Ingrese los importes correspondientes a cada una de las tres ventas'
INGRESAR Varones, Mujeres
Total Varones + Mujeres
PorcVar Varones * 100 / Total
PorcMuj Mujeres * 100 / Total
MOSTRAR 'El porcentaje de Varones es: ', PorcVar, 'Y el de Mujeres es: ', PorcMuj
FinAlgoritmo
Ejemplo 9: En países de habla inglesa es común expresar la estatura de una persona como
una cantidad entera de pies y una cantidad entera de pulgadas. Así, la estatura de una
persona podría ser 3' 2"(3 pies 2 pulgadas'). Diseñe un algoritmo que determine la estatura
de una persona en metros, conociendo su estatura en el formato inglés. Considere que: 1
pie=12 plg, 1 plg = 2,54 cm, 1m = 100 cm.
Fin-AlgoritmoAlgoritmo ConvertirEstatura
Datos: Pies, Pulgadas Є Z
EstMts Є R
Comienzo
MOSTRAR 'Ingrese los valores correspondientes a pies y pulgadas'
INGRESAR Pies, Pulgadas
EstMts (pies * 12 + Pulgadas) * 2.54/ 100
MOSTRAR 'La estatura en metros es: ', EstMts
FinAlgoritmo
16
Algoritmo ConvertirCapacidad
Datos: CapaGb Є Z
Mb, Kb, Byte Є Z
Comienzo
MOSTRAR 'Ingrese la Capacidad indicada en GB'
INGRESAR CapaGB
Mb CapaGb * 1024
Kb Mb * 1024
Byte Kb * 1024
MOSTRAR 'La capacidad en Mb es: ', Mb
MOSTRAR 'La capacidad en Kb es: ', Kb
MOSTRAR 'La capacidad en Byte es: ', Byte
FinAlgoritmo
Ejemplo 11: Intercambiar los dígitos de las unidades de 2(dos) números naturales.
Algoritmo IntercambiarUnidades
Datos: Nro1, Nro2 Є Z
Unidad1, Unidad2 Є Z
Comienzo
MOSTRAR 'Ingrese los valores de Nro1 y Nro2 respectivamente'
INGRESAR Nro1, Nro2
{Obtener las unidades de cada número}
Unidad1 Nro1 // 10
Unidad2 Nro2 // 10
{Intercambiar los dígitos de las unidades de cada número}
Nro1 Nro1 – Unidad1 + Unidad2
Nro2 Nro2 – Unidad2 + Unidad1
MOSTRAR 'Ahora Nro1 es: ', Nro1, ' y Nro2 es: ', Nro2
FinAlgoritmo
17
4.3.2 Condicional
Hay situaciones en las que hay que considerar alternativas, ya que algunas acciones deben
llevarse a cabo sólo para algunas instancias. El condicional permite que una acción o un
conjunto de acciones (bloque) se ejecute sólo si cumple cierta condición.
Sintaxis
Funcionamiento de SI-ENTONCES
Funcionamiento de SI-ENTONCES-SINO
Funcionamiento de EN CASO
Si el valor de variable es igual a alguna de las
constantes de la primera lista de constantes (cte11,
EN CASO QUE variable SEA cte12...) entonces se ejecuta el bloque de la derecha
de esa lista (Bloque1). Luego se continúa con la
cte11, cte12... : Bloque1 ejecución de la siguiente sentencia a ENCASO-FINCASO
cte21, cte22... : Bloque2 (Ignorando los bloques contenidos en las siguientes
listas de constantes).
....
Si la variable no es igual a ninguna de las constantes
SINO de la primera lista de constantes, se continúa buscando
coincidencia en la segunda lista de constantes; y así
BloqueX
siguiendo con las demás listas de constantes hasta
FINCASO encontrar coincidencia o estas se agoten.
Si no se obtuvo ninguna coincidencia sobre ninguna las
listas de constantes y existe un SINO, se ejecuta el
bloque (BloqueX) que aparece dentro de SINO. Luego
continúa con la ejecución de la siguiente sentencia a
ENCASO-FINCASO.
18
Observaciones:
EJEMPLOS DE CONDICIONALES
Ejemplo 1: Diseñar un algoritmo que a partir de tres números distintos determine cuál es el
mayor.
Algoritmo ObtenerMayor
Datos: A, B, C {Restricción: (A <> B) Y (B <> C) Y (A <> C)}
Maximo Є Z
Comienzo
MOSTRAR 'Ingrese tres números enteros distintos entre sí'
INGRESAR A, B, C
SI (A > B) Y (A > C)
ENTONCES
Maximo A
SINO
SI (B > A) Y (B > C)
ENTONCES
Maximo B
SINO
Maximo C
FIN-SI
FIN-SI
MOSTRAR 'El Máximo es: ', Maximo
FinAlgoritmo
Algoritmo ObtenerMayor_Version2
Datos: A, B, C {Restricción: (A <> B) Y (B <> C) Y (A <> C)}
Maximo Є Z
Comienzo
MOSTRAR 'Ingrese tres números enteros distintos entre sí'
INGRESAR A, B, C
Máximo A
SI (B > Máximo)
ENTONCES
Máximo B
FIN-SI
SI (C > Máximo)
ENTONCES
Máximo C
FIN-SI
MOSTRAR 'El Máximo es: ', Maximo
FinAlgoritmo
EJERCICIO: Analice ambas versiones de los algoritmos anteriores ¿Funcionan ambos? ¿Cuál
es la diferencia entre ellas? ¿Y si A fuera igual a B?
19
Ejemplo 2: Una tienda ha puesto en oferta la venta al por mayor de cierto producto,
ofreciendo un descuento del 15% por la compra de más de 3 docenas y 10% en caso
contrario. Diseñar un algoritmo que determine el monto de la compra, el descuento, el
monto a pagar.
Algoritmo CalcularImportesVentas
Datos: Docenas Є Z, Precio Є R
MontoPag, MontoDesc, MontoCpra Є R
Comienzo
MOSTRAR 'Ingrese los valores correspondientes a Docenas y Precio'
INGRESAR Docenas, Precio
{Determina el monto de la compra}
MontoCpra Docenas * Precio
{Determina el monto del descuento}
SI (Docenas > 3) ENTONCES
MontoDesc MontoCpra * 0.15
SINO
MontoDesc MontoCpra * 0.10
FIN-SI
{Determina el monto a pagar por la compra}
MontoPag MontoCpra – MontoDesc
MOSTRAR 'El monto de compra es ', MontoCpra
MOSTRAR 'El monto de descuento es ', MontoDesc
MOSTRAR 'El monto a pagar es ', MontoPag
Fin-Algoritmo
Observación: como el número tiene tres dígitos, para ser capicúa basta con que el dígito de
las unidades sea igual al dígito de las centenas. Por ejemplo: 353, 878, etc.
Algoritmo EsCapicua
Datos: Numero Є Z {Restricción: (Numero >= 100) Y (Numero <= 999) }
Unidad, Centena Є Z
Comienzo
MOSTRAR 'Ingrese un número'
INGRESAR Numero
{Determina la cifra de las unidades y la cifra de las centenas}
Unidad Numero // 10 .
Centena Numero /e 100
{Determina con la cifra de las unidades y la de las centenas si es o no capicúa}
SI (Unidad = Centena)
ENTONCES
MOSTRAR 'El número ES Capicua'
SINO
MOSTRAR 'El número NO es Capicua'
FIN-SI
FinAlgoritmo
20
Ejercicio: hacer una traza con un número capicúa y otra con uno que no lo sea.
Ejemplo 4: Diseñar un algoritmo que lea tres números y los muestre por pantalla de mayor
a menor y de menor a mayor.
Algoritmo MostrarNumeros
Datos: Nro1, Nro2, Nro3 Є Z
Mayor, Medio, Menor Є Z
Comienzo
MOSTRAR 'Ingrese tres números'
INGRESAR Nro1, Nro2, Nro3
{Determina el menor}
Menor Nro1
SI (Nro2 < Menor) ENTONCES
Menor Nro2
FIN-SI
SI (Nro3 < Menor) ENTONCES
Menor Nro3
FIN-SI
{Determina el mayor}
Mayor Nro1
SI (Nro2 > Mayor) ENTONCES
Mayor Nro2
FIN-SI
SI (Nro3 > Mayor) ENTONCES
Mayor Nro3
FIN-SI
{Determina el del medio}
Medio Nro1 + Nro2 + Nro3 – Mayor – Menor
{Imprimir en orden ascendente}
MOSTRAR 'Orden Ascendente: ', Menor, ' ', Medio, ' ', Mayor
{Imprimir en orden descendente}
MOSTRAR 'Orden Descendente: ',Mayor, ' ', Medio, ' ', Menor
Fin-Algoritmo
21
Algoritmo Triangulo
Datos: L1, L2, L3 Є R {Restricción: (Li > 0) para i = 1 .. 3 }
Tipo Є Texto
Suma, Mayor Є R
Comienzo
MOSTRAR 'Ingrese las 3 supuestos lados del triángulo'
INGRESAR L1, L2, L3
{Determina el lado mayor}
Mayor L1
SI (L2 > Mayor)
ENTONCES
Mayor L2
FIN-SI
Ejemplo 7: Diseñar un algoritmo que reciba tres números enteros y determine el menor
valor positivo. Si los números positivos son iguales, dar como menor a cualquiera de ellos.
Algoritmo ObtenerMenorPositivo
Datos: Nro1, Nro2, Nro3 Є Z
Menor Є Z
Comienzo
MOSTRAR 'Ingrese los tres valores positivos'
INGRESAR Nro1, Nro2, Nro3
{Determina el número menor positivo}
SI (Nro1 > 0)
ENTONCES
Menor Nro1
SI (Nro2 < Menor) Y (Nro2 > 0)
ENTONCES
Menor Nro2
FIN-SI
SI (Nro3 < Menor) Y (Nro3 > 0)
ENTONCES
Menor Nro3
FIN-SI
SINO
{Acá sólo Nro2 y Nro3 pueden ser positivos}
SI (Nro2 > 0)
ENTONCES
Menor Nro2
SI (Nro3 < Menor) Y (Nro3 > 0)
ENTONCES
Menor Nro3
FIN-SI
SINO
{Acá sólo Nro3 puede ser positivo}
SI (Nro3 > 0)
ENTONCES
Menor Nro3
SINO
Menor 0 {No se recibió ningún número positivo}
FIN-SI
FIN-SI
FIN-SI
MOSTRAR 'El menor número positivo ingresado es: ', Menor
FinAlgoritmo
23
Algoritmo CalcularPromedioPracticas
Datos: Pc1, Pc2, Pc3, Pc4 Є R {Restricción: (pci >= 0) Y (pci <= 10) para i = 1..4}
PcMenor, Promedio Є R
Comienzo
MOSTRAR 'Ingrese las 4 notas de práctica'
INGRESAR Pc1, Pc2, Pc3, Pc4
{Determina el menor}
PcMenor nPc1
SI (Pc2 < Menor) ENTONCES
PcMenor Pc2
FIN-SI
SI (Pc3 < Menor) ENTONCES
PcMenor Pc3
FIN-SI
SI (Pc4 < Menor) ENTONCES
PcMenor Pc4
FIN-SI
{Determina el promedio}
Promedio (Pc1 + Pc2 + Pc3 + Pc4 - PcMenor) / 3
MOSTRAR 'El promedio de prácticas es: ', Promedio
FinAlgoritmo
Algoritmo CalificarPuntaje_Version1
Datos: TorProd, TorDefect Є Z {Restricción: (TorProd > 0) Y (TorDefect >= 0)}
grado Є Z
Comienzo
MOSTRAR 'Ingrese la cantidad de tornillos producida y el total de defectuosos'
INGRESAR TorProd, TorDefect
SI (TorDefec < 200)
ENTONCES
SI (TorProd > 1000)
ENTONCES
Grado 8
SINO
Grado 6
FIN-SI
SINO {Tiene más de 200 tornillos defectuosos}
SI (TorProd > 1000)
ENTONCES
Grado 7
SINO
Grado 5
FIN-SI
FIN-SI
MOSTRAR 'El grado de eficiencia es: ', Grado
FinAlgoritmo
Algoritmo CalificarPuntaje_Version2
Datos: TorProd, TorDefect Є Z {Restricción: (TorProd > 0) Y (TorDefect >= 0)}
Grado Є Z
Comienzo
MOSTRAR ‘Ingrese la cantidad de tornillos producida y el total de defectuosos’
INGRESAR TorProd, TorDefect
SI (TorDefec < 200) Y (TorProd > 1000)
ENTONCES
Grado 8
SINO
SI (TorDefec < 200)
ENTONCES
Grado 6
SINO
SI (TorProd > 1000)
ENTONCES
Grado 7
SINO
Grado 5
FIN-SI
FIN-SI
FIN-SI
MOSTRAR 'El grado de eficiencia es: ', Grado
FinAlgoritmo
Ejercicio: Hacer trazas con todos los casos posibles de los algoritmos anteriores.
25
Ejemplo 9: Se cuenta con votos obtenidos por Juan, Pedro y María en una elección para
presidente de un club. Para ganar la elección se debe obtener como mínimo el 50% de los
votos más 1. En caso que no haya un ganador se repite la elección en una segunda vuelta.
Van a la segunda vuelta los dos candidatos que obtengan la más alta votación. Se anula la
elección en caso de producirse un empate doble por el segundo lugar o un empate triple.
Diseñar un algoritmo que determine el resultado de la elección.
Algoritmo ObtenerResultadoEleccion
Datos: VotosJuan, VotosPedro, VotoMaria Є Z
{Restricción: (VotosJuan >= 0) y (VotosPedro >= 0) y (VotosMaria >= 0)}
Resultado Є Texto
VotoMin Є Z
Comienzo
MOSTRAR 'Ingrese la cantidad de votos obtenidos por Juan, Pedro y María'
INGRESAR VotosJuan, VotosPedro, VotoMaria
{Determina los votos mínimos necesarios para ganar}
VotoMin (VotosJuan + VotosPedro + VotosMaria) /e 2 + 1
{Determina el resultado de la elección}
SI (VotosJuan > = VotoMin)
ENTONCES
Resultado 'Gana Juan'
SINO
SI (VotosPedro > = VotoMin )
ENTONCES
Resultado 'Gana Pedro'
SINO
SI (VotosMaria >= VotoMin )
ENTONCES
Resultado 'Gana María'
SINO
SI ( VotosPedro > VotosJuan) Y (VotosMaria > VotosJuan )
ENTONCES
Resultado 'Pasan a la segunda vuelta Pedro y María'
SINO
SI (VotosPedro > VotosMaria ) Y (VotosJuan > VotosMaria )
ENTONCES
Resultado 'Pasan a la segunda vuelta Pedro y Juan'
SINO
SI ( VotosMaria > VotosPedro ) Y ( VotosJuan > VotosPedro )
ENTONCES
Resultado 'Pasan a la segunda vuelta María y Juan'
SINO
Resultado 'Elección anulada'
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
Mostrar Resultado
FinAlgoritmo
26
Ejemplo 10: Diseñar un algoritmo que reciba un número de mes y devuelva el nombre del
mismo.
Algoritmo NombreDelMes_Version1
Datos: Mes Є Z {Restricción: (Mes >= 1) Y (Mes <= 12) }
NomMes Є Texto
Comienzo
MOSTRAR ‘Ingrese el número de mes’
INGRESAR Mes
SI (Mes = 1) ENTONCES
NomMes 'Enero'
FIN-SI
SI (Mes = 2) ENTONCES
NomMes 'Febrero'
FIN-SI
SI (Mes = 3) ENTONCES
NomMes 'Marzo'
FIN-SI
SI (Mes = 4) ENTONCES
NomMes 'Abril'
FIN-SI
SI (Mes = 5) ENTONCES
NomMes 'Mayo'
FIN-SI
SI (Mes = 6) ENTONCES
NomMes 'Junio'
FIN-SI
SI (Mes = 7) ENTONCES
NomMes 'Julio'
FIN-SI
SI (Mes = 8) ENTONCES
NomMes 'Agosto'
FIN-SI
SI (Mes = 9) ENTONCES
NomMes 'Septiembre'
FIN-SI
SI (Mes = 10) ENTONCES
NomMes 'Octubre'
FIN-SI
SI (Mes = 11) ENTONCES
NomMes 'Noviembre'
FIN-SI
SI (Mes = 12) ENTONCES
NomMes 'Diciembre'
FIN-SI
MOSTRAR NomMes
FinAlgoritmo
27
Algoritmo NombreDelMes_Version2
Datos: Mes Є Z {Restricción: (Mes >= 1) Y (Mes <= 12) }
NomMes Є Texto
Comienzo
MOSTRAR ‘Ingrese el número de mes’
INGRESAR Mes
SI (Mes = 1) ENTONCES
NomMes 'Enero'
SINO
SI (Mes = 2) ENTONCES
NomMes 'Febrero'
SINO
SI (Mes = 3) ENTONCES
NomMes 'Marzo'
SINO
SI (Mes = 4) ENTONCES
NomMes 'Abril'
SINO
SI (Mes = 5) ENTONCES
NomMes 'Mayo'
SINO
SI (Mes = 6) ENTONCES
NomMes 'Junio'
SINO
SI (Mes = 7) ENTONCES
NomMes 'Julio'
SINO
SI (Mes = 8) ENTONCES
NomMes 'Agosto'
SINO
SI (Mes = 9) ENTONCES
NomMes 'Septiembre'
SINO
SI (Mes = 10) ENTONCES
NomMes 'Octubre'
SINO
SI (Mes = 11) ENTONCES
NomMes 'Noviembre'
SINO
NomMes 'Diciembre'
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
FIN-SI
MOSTRAR NomMes
FinAlgoritmo
28
Algoritmo NombreDelMes_Version3
Datos: Mes Є Z {Restricción: (Mes >= 1) Y (Mes <= 12) }
NomMes Є Texto
Comienzo
MOSTRAR ‘Ingrese el número de mes’
INGRESAR Mes
EN CASO QUE Mes SEA
1: NomMes 'Enero'
2: NomMes 'Febrero'
3: NomMes 'Marzo'
4: NomMes 'Abril'
5: NomMes 'Mayo'
6: NomMes 'Junio'
7: NomMes 'Julio'
8: NomMes 'Agosto'
9: NomMes 'Septiembre'
10: NomMes 'Octubre'
11: NomMes 'Noviembre'
12: NomMes 'Diciembre'
FIN-CASO
MOSTRAR NomMes
FinAlgoritmo
4.3.3 Repetición
La repetición permite que un conjunto de acciones se ejecute más de una vez. Puede
ser que el número de repeticiones sea fijo (REPETIR-DESDE) o dependa de una
condición (REPETIR-MIENTRAS y REPETIR-HASTA).
Sintaxis
Bloque
FIN-MIENTRAS
29
Funcionamiento
1. Se evalúa la Condición
2. Si la Condición es verdadera entonces se ejecuta el Bloque contenido dentro de la
estructura RepetirMientras. Al finalizar la ejecución del Bloque, el control retoma
automáticamente al punto 1. (y así siguiendo hasta que la Condición se evalúe a
Falso).
3. Si la Condición es falsa, no se ingresa a repetir y se continúa con la orden siguiente
al FIN-MIENTRAS.
Observaciones:
Hay que asegurarse que la condición sea modificada dentro del bloque a repetir
para garantizar que en algún momento tome el valor FALSO y finalicen las
repeticiones. Caso contrario, se entraría en un bucle infinito.
Ejemplo 1: escribir un algoritmo que muestre todos los números pares menores que un
número dado.
Algoritmo MostrarPares_Version1
Datos: Tope Є Z
Par Є Z
Comienzo
MOSTRAR 'Ingrese el número hasta donde se mostrarán los pares'
INGRESAR Tope
Par 2
REPETIR MIENTRAS (Par < Tope)
MOSTRAR Par
Par Par + 2
FIN-MIENTRAS
FinAlgoritmo
En la siguiente traza se elige al número 7 como tope y se observa como salida los valores: 2,
4, 6.
Ejemplo 2: escribir un algoritmo que genere los primeros múltiplos de 3 menores o iguales
a un número dado y calcule e imprima: la suma y el promedio.
30
Bosquejo
Generar el primer número múltiplo de tres
Mientras el número múltiplo de 3 sea menor o igual que el tope dado
Acumular su suma
Contarlo
Generar el siguiente múltiplo de 3
Calcular el promedio.
Mostrar la suma de dichos números y su promedio
Algoritmo MostrarSumaPromedio_Version1
Datos: Tope Є Z
Nro Є Z
CantNros Є Z
Suma, Prome Є R
Comienzo
MOSTRAR 'Ingrese el número Tope! '
INGRESAR Tope
Nro 3
CantNros 0
Suma 0
REPETIR MIENTRAS (Nro <= Tope)
Suma Suma + Nro {Acumular la suma de los números}
CantNros CantNros + 1 {Contar que se ha sumado un nro más}
Nro Nro + 3 {Generar el próximo múltiplo de tres}
FIN-MIENTRAS
Prome Suma / CantNros {Calcular el promedio}
MOSTRAR 'La suma es ', suma
MOSTRAR 'El promedio es ', prome
FinAlgoritmo
Algoritmo MostrarTablaMultiplicar_Version1
Datos: Tabla Є Z
Nro Є Z
Comienzo
MOSTRAR ‘Ingrese el número de la Tabla de Multiplicar a generar!’
INGRESAR Tabla
Nro 1
REPETIR MIENTRAS ( Nro <= 10 )
MOSTRAR Nro, ' * ' , Tabla, ' = ' Nro * Tabla
Nro Nro + 1 {Generar el próximo nro}
FIN-MIENTRAS
FinAlgoritmo
Ejemplo 4: escribir un algoritmo que permita ingresar números positivos, calcule su suma y
la muestre por pantalla. El proceso finaliza cuando se ingrese el primer valor negativo.
Bosquejo
Ingresar un número
Inicializar la suma en 0
Mientras el número sea positivo
Acumular la suma de dicho número
Ingresar otro número
Mostrar la suma obtenida
Algoritmo MostrarSumaPositivos_Version1
Datos: Nro, Suma Є Z
Comienzo
MOSTRAR 'Ingrese el primer número de la secuencia. Un número<=0 para finalizar'
INGRESAR Nro
Suma 0
REPETIR MIENTRAS (Nro > 0)
Suma Suma + Nro {Sumar el número ingresado}
MOSTRAR 'Ingrese el siguiente número de la secuencia. 0 para finalizar'
INGRESAR un número en Nro
FIN-MIENTRAS
MOSTRAR 'La suma obtenida es ', suma
FinAlgoritmo
Ejemplo 5: Se arroja una pelota desde una determinada altura. La pelota rebota y en cada
rebote su altura se reduce en 1/3. Conocida la altura desde donde se arroja la pelota
inicialmente, determinar cuántos rebotes se produjeron cuando la pelota lleva a la altura
menor o igual a una altura final dada.
32
Algoritmo Contar_Rebotes
Datos: AlturaIni Є R,
AlturaFin Є R
CantRebotes Є Z
Comienzo
MOSTRAR 'Ingrese la altura inicial y la altura final. '
INGRESAR AlturaIni, AlturaFin
CantRebotes 0
REPETIR MIENTRAS (AlturaIni > AlturaFin)
AlturaIni AlturaIni – (AlturaIni / 3)
CantRebotes CantRebotes + 1
FIN-REPETIR
MOSTRAR 'La cantidad de rebotes es: ', CantRebotes
FinAlgoritmo
Ejemplo 6: Se arroja una pelota desde una determinada altura. La pelota rebota y en cada
rebote su altura se reduce en 1/3. Determinar la altura final de la pelota luego de producirse
cierta cantidad de rebotes y conociendo la altura inicial.
Algoritmo DeterminarAltura_Version1
Datos: CantRebotes Є Z,
AlturaIni Є R
AlturaFin Є R
Comienzo
MOSTRAR 'Ingrese la cantidad de rebotes y la altura inicial.'
INGRESAR CantRebotes, AlturaIni
AlturaFin AlturaIni
REPETIR MIENTRAS (CantRebotes >= 1)
AlturaFin AlturaFin – (AlturaIni / 3)
CantRebotes CantRebotes - 1
FIN-REPETIR
MOSTRAR 'La altura final es: ', AlturaFin
FinAlgoritmo
Algoritmo CalcularSumatoria_Version1
Datos: Tope Є Z
Suma Є Z
Nro Є Z
Comienzo
MOSTRAR 'Ingrese el nro Tope para la sumatoria. '
INGRESAR Tope
Nro 1
Suma O
REPETIR MIENTRAS (Nro < = Tope)
Suma Suma + Nro {Acumular la suma de los números}
Nro Nro + 1 {Generar el próximo número a sumar}
FIN-MIENTRAS
MOSTRAR 'La sumatoria es: ', suma
FinAlgoritmo
Bosquejo
Generar el primer divisor
Inicializar cantidad de divisores en cero
Repetir mientras que divisor sea menor o igual que el número dado
Si el número es divisible por el divisor entonces contar que tiene 1 divisor más
Generar el siguiente divisor
Algoritmo ObtenerDivisores_Version1
Datos: Nro Є Z
CantDiv Є Z
Divi Є Z
Comienzo
MOSTRAR 'Ingrese un número'
INGRESAR Nro
Divi 1 {Generar el primer divisor}
CantDiv 0 {Inicializar cantidad de divisores en cero}
REPETIR MIENTRAS ( Divi <= Nro )
SI ( Nro // Divi = 0)
ENTONCES
CantDiv CantDiv + 1 {Contar que hay un divisor más}
FIN-SI
Divi Divi + 1 {Generar el próximo posible divisor}
FINMIENTRAS
MOSTRAR 'La cantidad de divisores es: ', CantDiv
FinAlgoritmo
Ejemplo 9: leer una secuencia de edades de un grupo de personas (el corte de la secuencia
se indica introduciendo un valor negativo) y determinar la máxima edad en la secuencia.
34
Bosquejo
Suponer que edad máxima es cero (Luego se la corrige)
Repetir mientras la edad sea > = 0
Ingresar una edad
Si la edad ingresada es mayor a todas las anteriores, entonces actualizar la edad Mayor
Algoritmo DeterminarEdadMaxima_Version1
Datos: Mayor Є Z
Edad Є Z
Comienzo
Mayor 0
Edad 0
REPETIR MIENTRAS (Edad >= 0)
MOSTRAR 'Ingrese una edad'
INGRESAR Edad
SI (Edad > Mayor)
ENTONCES
Mayor Edad {Corregir el mayor}
FIN-SI
FIN-MIENTRAS
MOSTRAR 'La edad mayor es: ', Mayor
FinAlgoritmo
En la traza anterior se ingresan las edades 10, 22, 13, 42, 35 y -5 (para finalizar) y se
devuelve como edad mayor al valor 42, la cual es realmente la mayor edad ingresada.
Ejemplo 10: dado un número y una posición dentro de este número, devolver la cifra que
esté ubicada en dicha posición. Suponer que en la posición 1 encuentran las unidades.
Ejemplos:
Dado 3752 y la posición 3 debe devolver 7.
Dado 456778 y la posición 1 debe devolver 8.
35
Bosquejo
Comenzar por la posición de las unidades
Repetir mientras no se encuentre la posición buscada
Obtener el último dígito
Eliminar el último dígito
Aumentar en uno la posición
Algoritmo DevolverCifraenPosicion_Version1
Datos: Nro, Pos Є Z {Restricción: Pos es una posición válida de Nro }
Dig Є Z
PosDig Є Z
Comienzo
PosDig 1
MOSTRAR 'Ingrese un número y la posición de donde obtener el dígito'
INGRESAR Nro, Pos
REPETIR MIENTRAS (PosDig <= Pos)
Dig Nro // 10
Nro Nro /e 10
PosDig PosDig + 1
FIN-MIENTRAS
MOSTRAR 'El dígito es: ', Dig
FinAlgoritmo
En la traza anterior se puede ver que dado el número 3752 y la posición 3, se devuelve el
dígito 7 que es el que se encuentra en dicha posición.
Sintaxis
REPETIR
Bloque
HASTA Condición
Funcionamiento
Observaciones:
Siempre Bloque se ejecuta por lo menos una vez, por que primero se entra al Bloque
y luego se evalúa la condición.
Hay que asegurarse que la condición sea modificada dentro del bloque a repetir
para garantizar que en algún momento tome el valor VERDADERO y finalicen las
repeticiones. Caso contrario, se entraría en un bucle infinito.
La sintaxis es la siguiente:
REPETIR
INGRESAR dato
HASTA que dato sea correcto
REPETIR
INGRESAR Mes
HASTA (Mes >= 1 ) Y ( Mes <= 12)
REPETIR
INGRESAR Nota
HASTA (Nota >= 0 ) Y ( Nota <= 100)
Ejemplo 1: escribir un algoritmo que muestre todos los números pares menores que un
número indicado por el usuario.
Algoritmo MostrarPares_Version2
Datos: Tope Є Z
Par Є Z
Comienzo
MOSTRAR 'Ingrese el nro Tope'
INGRESAR Tope
Par 2
REPETIR
MOSTRAR Par
Par Par + 2
HASTA Par >= Tope
FinAlgoritmo
37
En la traza anterior se elige al número 7 como tope y se observa como salida en pantalla los
valores: 2, 4, 6.
Esto comprueba que algunas estructuras de control son mejores que otras para determinados
problemas.
Algoritmo MostrarSumaPromedio_Version2
Datos: Tope Є Z
Nro, CantNros Є Z
Suma, Prome Є R
Comienzo
Nro 3
CantNros 0
Suma 0
MOSTRAR 'Ingrese el nro Tope'
INGRESAR Tope
REPETIR
Suma Suma + Nro {Acumular la suma de los números}
CantNros CantNros + 1 {Contar que se ha sumado un nro más}
Nro Nro + 3 {Generar el próximo múltiplo de tres}
HASTA (Nro > Tope)
Prome Suma / CantNros {Calcular el promedio}
MOSTRAR 'La suma es ', suma
MOSTRAR 'El promedio es ', prome
FinAlgoritmo
Ejercicio: el problema del algoritmo anterior radica en que la suma se acumula sí o sí una vez.
En caso de poner como tope el 2, el algoritmo me estaría devolviendo un valor incorrecto. Es
por esto que hay que tener cuidado en la elección de la sentencia de repetición
¿Cómo podríamos resolver esta situación de modo de transformar el anterior algoritmo a una
versión que resuelva el problema (para todos los valores de Tope que pudiese indicar el
usuario)?.
Bosquejo
Generar el primer número de la tabla
Repetir
Mostrar una línea de la tabla de multilplicar
Generar el siguiente número
Hasta que el número sea mayor que 10
Algoritmo MostrarTablaMultiplicar_Version2
Datos: Tabla Є Z
Factor Є Z
Comienzo
MOSTRAR 'Ingrese el nro de Tabla de multiplicar'
INGRESAR Tabla
Factor 1
REPETIR
MOSTRAR Factor, ' * ' , Tabla, ' = ' Factor * Tabla
Factor Factor + 1 {Generar el próximo nro}
HASTA (Factor > 10)
FinAlgoritmo
Ejemplo 4: escribir un algoritmo que permita ingresar números positivos, calcule su suma y
la muestre por pantalla. El proceso finaliza cuando se ingrese el primer valor negativo.
39
Ejercicio: ¿Por qué se controla que el número ingresado sea positivo en el algoritmo anterior?
Ejemplo 5: Se arroja una pelota desde una determinada altura. La pelota rebota y en cada
rebote su altura se reduce en 1/3. Conocida la altura desde donde se arroja la pelota
inicialmente, determinar cuántos rebotes se produjeron cuando la pelota lleva a la altura
menor o igual a una altura final dada.
Algoritmo Contar_Rebotes_Version2
Datos: AlturaIni Є R,
AlturaFin Є R
CantRebotes Є Z
Comienzo
MOSTRAR 'Ingrese la altura inicial y la altura final. '
INGRESAR AlturaIni, AlturaFin
CantRebotes 0
REPETIR
AlturaIni AlturaIni – AlturaIni / 3
CantRebotes CantRebotes + 1
HASTA (AlturaIni <= AlturaFin)
MOSTRAR 'La cantidad de rebotes es: ', CantRebotes
FinAlgoritmo
Ejemplo 6: Se arroja una pelota desde una determinada altura. La pelota rebota y en cada
rebote su altura se reduce en 1/3. Determinar la altura final de la pelota luego de producirse
cierta cantidad de rebotes y conociendo la altura inicial.
40
Algoritmo DeterminarAltura_Version2
Datos: CantRebotes Є Z,
AlturaIni Є R
AlturaFin Є R
Comienzo
MOSTRAR 'Ingrese la cantidad de rebotes y la altura inicial. '
INGRESAR CantRebotes, AlturaIni
AlturaFin AlturaIni
REPETIR
AlturaFin AlturaFin – AlturaFin / 3
CantRebotes CantRebotes - 1
HASTA (CantRebotes < 1)
MOSTRAR 'La altura final es: ', AlturaFin
FinAlgoritmo
Algoritmo CalcularSumatoria_Version2
Datos: Tope Є Z
Suma Є Z
Nro Є Z
Comienzo
MOSTRAR 'Ingrese el nro Tope para la sumatoria. '
INGRESAR Tope
Nro 1
Suma O
REPETIR
Suma Suma + Nro {Acumular la suma de los números}
Nro Nro + 1 {Generar el próximo número a sumar}
HASTA (Nro > Tope)
MOSTRAR 'La sumatoria es: ', suma
FinAlgoritmo
Bosquejo
Generar el primer posible divisor
Inicializar cantidad de divisores en cero
Repetir mientras que divisor sea menor o igual que el número dado
Si el número es divisible por el divisor entonces contar que tiene 1 divisor más
Generar el siguiente divisor
41
Algoritmo ObtenerDivisores_Version2
Datos: Nro Є Z
CantDiv Є Z
Divi Є Z
Comienzo
MOSTRAR 'Ingrese un número'
INGRESAR Nro
Divi 1 {Generar el primer divisor}
CantDiv 0 { Inicializar cantidad de divisores en cero}
REPETIR
SI (Nro // Divi = 0)
ENTONCES
CantDiv CantDiv + 1 {Contar que hay un divisor más}
FIN-SI
Nro Nro + 1 {Generar el próximo divisor}
HASTA ( Divi > Nro )
MOSTRAR 'La cantidad de divisores es: ', CantDiv
FinAlgoritmo
Ejemplo 9: leer las edades de un grupo de personas hasta que se introduzca un valor
negativo y determinar la máxima edad.
Algoritmo DeterminarEdadMaxima_Version2
Datos: Mayor Є Z
Edad Є Z
Comienzo
Mayor 0
REPETIR
MOSTRAR 'Ingrese una edad'
INGRESAR Edad
SI (Edad > Mayor)
ENTONCES
Mayor Edad {Corregir el mayor}
FIN-SI
HASTA (Edad < 0)
MOSTRAR 'La edad mayor es: ', Mayor
FinAlgoritmo
Ejemplo 10: dado un número y una posición dentro de este número, devolver la cifra que
esté ubicada en dicha posición. Suponer que en la posición 1 encuentran las unidades.
Ejemplos:
Bosquejo
Comenzar por la posición de las unidades
Repetir
Obtener el último dígito
Eliminar el último dígito
Aumentar en uno la posición
Hasta que se encuentre la posición buscada
Algoritmo DevolverCifraenPosicion_Version2
Datos: Nro, Pos Є Z {Restricción: Pos es una posición válida de Nro }
Dig Є Z
PosDig Є Z
Comienzo
PosDig 1
MOSTRAR 'Ingrese un número y la posición de donde obtener el dígito'
INGRESAR Nro, Pos
REPETIR
Dig Nro // 10
Nro Nro /e 10
PosDig PosDig + 1
HASTA ( PosDig > Pos )
MOSTRAR 'El dígito es: ', Dig
FinAlgoritmo
En la traza anterior se puede ver que dado el número 3752 y la posición 3, se devuelve el
dígito 7 que es el que se encuentra en dicha posición.
Sintaxis
Donde:
ValorFinal: es el valor al que debe llegar la variable contadora a través de las sucesivas
repeticiones.
43
Tanto el valor inicial como el final pueden ser constantes, variables o expresiones.
Funcionamiento
Observación: Recordar que cuando finaliza el bucle, la variable contadora del ciclo queda
indefinida, no se puede asegurar cuál es su valor en ese punto.
Ejemplo 1: escribir un algoritmo que muestre todos los números pares menores que un
número ingresado por el usuario.
Algoritmo MostrarPares_Version3
Datos: Tope Є Z
Nro Є Z
Comienzo
MOSTRAR 'Ingrese el nro Tope'
INGRESAR Tope
REPETIR PARA Nro = 1 HASTA (Tope – 1)
SI (Nro // 2 = 0)
ENTONCES
MOSTRAR Nro
FIN-SI
FIN-REPETIR
FinAlgoritmo
Algoritmo MostrarPares_Version4
Datos: Tope Є Z
Nro Є Z
Comienzo
MOSTRAR 'Ingrese el nro Tope'
INGRESAR Tope
REPETIR PARA Nro = 1 HASTA ((Tope – 1 /e 2)
MOSTRAR Nro * 2
FIN-REPETIR
FinAlgoritmo
Ejemplo 2: escribir un algoritmo que genere los primeros múltiplos de 3 menores o iguales
a un número ingresado por el usuario y calcule e imprima: la suma y el promedio.
Bosquejo
Generar todos los números múltiplos de 3 entre 1 y el límite/tope indicado
Para cada uno de estos números generados
Si el número generado es múltiplo de 3
entonces
Acumular su suma
Contarlo
Calcular el promedio.
Mostrar la suma de dichos números y su promedio
45
Algoritmo MostrarSumaPromedio_Version3
Datos: Tope Є Z
Nro, CantNros Є Z
Suma, Prome Є R
Comienzo
MOSTRAR 'Ingrese el número Tope! '
INGRESAR Tope
CantNros 0
Suma 0
REPETIR PARA Nro = 1 HASTA Tope
SI (Nro // 3 = 0)
ENTONCES
Suma Suma + Nro {Acumular la suma de los números}
CantNros CantNros + 1 {Contar que se ha sumado un nro más}
FIN-SI
FIN-REPETIR
Prome Suma / CantNros {Calcular el promedio}
MOSTRAR 'La suma es ', suma
MOSTRAR 'El promedio es ', prome
FinAlgoritmo
Bosquejo
Generar los números del 1 a 10
Para cada uno de estos números mostrar una línea de la tabla de multiplicar
Algoritmo MostrarTablaMultiplicar_Version3
Datos: Tabla Є Z
Factor Є Z
Comienzo
MOSTRAR 'Ingrese el nro de Tabla de multiplicar'
INGRESAR Tabla
REPETIR PARA Factor = 1 HASTA 10
MOSTRAR Factor, ' * ' , Tabla, ' = ' Factor * Tabla
FIN-REPETIR
FinAlgoritmo
Ejemplo 4: escribir un algoritmo que permita ingresar números positivos, calcule su suma y
la muestre en pantalla. El proceso finaliza cuando se ingrese el primer valor negativo.
Ejemplo 5: Se arroja una pelota desde una determinada altura. La pelota rebota y en cada
rebote su altura se reduce en 1/3. Conocida la altura desde donde se arroja la pelota
46
Ejemplo 6: Se arroja una pelota desde una determinada altura. La pelota rebota y en cada
rebote su altura se reduce en 1/3. Determinar la altura final de la pelota luego de producirse
cierta cantidad de rebotes y conociendo la altura inicial.
Algoritmo DeterminarAltura_Version3
Datos: CantRebotes Є Z,
AlturaIni Є R
AlturaFin Є R
iЄZ
Comienzo
MOSTRAR 'Ingrese la cantidad de rebotes y la altura inicial. '
INGRESAR CantRebote, AlturaIni
AlturaFin AlturaIni
REPETIR PARA i = 1 HASTA CantRebotes
AlturaFin AlturaFin – AlturaFin / 3
FIN-REPETIR
MOSTRAR 'La altura final es: ', AlturaFin
FinAlgoritmo
Algoritmo CalcularSumatoria_Version3
Datos: Tope Є Z
Suma Є Z
Nro Є Z
Comienzo
MOSTRAR 'Ingrese el nro Tope para la sumatoria. '
INGRESAR Tope
Suma O
REPETIR PARA Nro = 1 HASTA Tope
Suma Suma + Nro {Acumular la suma de los números}
FIN-REPETIR
MOSTRAR 'La sumatoria es: ', suma
FinAlgoritmo
Ejercicio: Hacer!! :)
Ejemplo 9: leer las edades de un grupo de personas hasta que se introduzca un valor
negativo y determinar la máxima edad.
47
Ejemplo 10: Solicitado un número y una posición dentro de este número, devolver la cifra
que esté ubicada en dicha posición. Suponer que en la posición 1 encuentran las unidades.
Ejemplos:
Dado 3752 y la posición 3 debe devolver 7.
Dado 456778 y la posición 1 debe devolver 8.
Bosquejo
Repetir desde la posición 1 a la indicada por el usuario
Obtener el último dígito
Eliminar el último dígito
Algoritmo DevolverCifraenPosicion_Version3
Datos: Nro, Pos Є Z {Restricción: Pos es una posición válida de Nro }
Dig Є Z
PosDig Є Z
Comienzo
MOSTRAR 'Ingrese un número y la posición de donde obtener el dígito'
INGRESAR Nro, Pos
REPETIR PARA PosDig = 1 HASTA Pos
Dig Nro // 10
Nro Nro /e 10
FIN-REPETIR
MOSTRAR 'El dígito es: ', Dig
FinAlgoritmo
Buenas prácticas…
Siempre que se usen repeticiones hay que asegurarse de que el bucle sea finito. En las
repeticiones hay una transferencia de control implícita.
Cada algoritmo tiene un único punto de terminación, lo cual favorece la comprensión del
mismo y es por eso que se prohíbe la transferencia de control explícita y no estructurada.
Existen algunos métodos que se utilizan en la elaboración de algoritmos. Entre ellos se pueden
mencionar:
Probablemente el principio más conocido para diseñar algoritmos sea la técnica de subdividir y
conquistar. La idea básica consiste en dividir el problema original en dos o más subproblemas
independientes (subtareas).
Un método se define con un nombre (identificador), una lista de datos (utilizados para
intercambiar información con los niveles superiores de abstración y que llamaremos
parámetros) y la secuencia de instrucciones que lo componen.
Es importante que cada subproblema identificado resuelva una tarea particular bien
identificada y seleccionar un nombre pertinente para el método que lo resuelva.
Sintaxis de un SubAlgoritmo
Algoritmo Nombre_Algoritmo
DE: <declaración de variables> Parámetros
DS: <declaración de variables>
DA: <declaración de variables>
Comienzo
Sentencia1
Sentencia2
Acciones de manipulación de datos y
.…
de control del flujo de ejecución.
SentenciaN
FinAlgoritmo
Los DE y DS son los que actúan como interfaz para el intercambio de datos entre un método y
el algoritmo que lo vaya a utilizar, y reciben el nombre de parámetros del método.
49
Consideramos DE a los valores que tienen que estar disponibles al momento de invocar/llamar
al subalgoritmo; se utilizan para inicializar dichos datos dentro del subalgoritmo con valores
provistos desde al algoritmo que lo invoca. Los DS son aquellos que el subalgoritmo entrega
como resultado al algoritmo que lo invoca. Los DA son aquellos que no son datos de entrada ni
de salida pero que son útiles para cálculos intermedios que se necesiten en la resolución del
problema. Las modificaciones de los DE dentro del subalgoritmo no son visibles desde el
algoritmo que lo invoca, contrario a lo que sucede con los datos de salida.
Si existe más de un dato de entrada, estos se indican como una lista de nombres separados
entre sí por comas (lo mismo para los datos de salida). Indicaremos los datos de salida con
subrayado. Si no existen datos de salida, no se escribe ninguno (lo mismo para los datos de
entrada).
Este tipo de llamada/invocación no puede formar parte de ninguna de las sentencias vistas. En
efecto, si se utiliza de esta forma, la llamada debe aparecer como una nueva sentencia dentro
del algoritmo, lo cual agrega una línea más de pseudocódigo.
Ejemplos
EsPrimo (Nro, Primo) PrimoSiguiente (Primo, ProxPrimo)
UltimoDiaDelMes (Mes, Año, UltDia) CalcularSumatoria (Tope, Suma)
MostrarSumaPromedio (Tope) MostrarSumaPositivos ()
MostrarTablaMultiplicar (Tabla) ObtenerDivisiores (Nro, Cant)
DiaSiguiente (Dia, Mes, Año, DiaSig, MesSig, AñoSig)
Nota: Este tipo de invocación se corresponde con los métodos denominados Procedimientos
en Pascal.
El algoritmo que se desea invocar tiene un único dato de salida. La llamada a dicho método
podrá tener la siguiente sintaxis:
Es decir, esta llamada devuelve un solo dato de salida y no lo explicita entre sus parámetros.
Así es que debemos utilizar esta llamada sí o sí dentro de otra sentencia/expresión. De este
modo la ejecución del método deja un resultado (correspondiente al valor del DS) en el preciso
lugar en que se hizo la invocación dentro de la expresión (no a través de un parámetro). Las
expresiones en las cuales puede utilizarse una llamada a otro algoritmo son:
50
Ejemplos
Primo EsPrimo(Nro) ProxPrimo PrimoSiguiente(Primo)
Nota: Este tipo de invocación se corresponde con los métodos denominados Funciones en
Pascal.
Los valores ingresados como datos de entrada deben respetar las restricciones indicadas en la
definición del método en cuestión.
Ejemplo 1: escribir un algoritmo que reciba una fecha representada como Dia, Mes y Año y
devuelva VERDADERO o FALSO de acuerdo a si estos datos corresponden a una fecha válida.
Una estrategia útil es asumir que disponemos de un método EsBisiesto que recibe como dato
de entrada un año y devuelve “Verdadero” si el mismo es bisiesto o “Falso” en caso contrario.
Si resuelto nuestro algoritmo principal concluimos que este método nos fue efectivamente útil,
entonces será momento de escribir/definir dicho método.
Bosquejo
Si el día está entre 1 y 31 Y es un mes con 31 días
Entonces la fecha es correcta
Sino Si el día está entre 1 y 30 Y es un mes con 30 días
Entonces la fecha es correcta
Sino Si el día está entre 1 y 28 Y es febrero o el día está entre 1 y 29 y febrero es bisiesto
Entonces la fecha es correcta
Sino la fecha es correcta
51
Algoritmo Fecha_Correcta
DE: Día, Mes, anio Є Z
DS: Correcta Є Booleano
Comienzo
SI ((dia >= 1) Y (dia <= 31)) Y
((mes = 1) O (mes = 3) O (mes = 5) O (mes = 7) O (mes = 8) O (mes = 10) O (mes = 12))
ENTONCES
EsCorrecta Verdadero
SINO
SI ((dia >= 1) Y (dia <= 30)) Y ((mes = 4) O (mes = 6) O (mes = 9) O (mes = 7) O (mes = 11))
ENTONCES
EsCorrecta Verdadero
SINO
SI (((dia >= 1) Y (dia <= 28)) Y (mes = 2)) O
(((dia >= 1) Y (dia <= 29)) Y ( mes = 2) Y EsBisiesto (anio))
ENTONCES
EsCorrecta Verdadero
SINO
EsCorrecta Falso
FIN-SI
FIN-SI
FIN-SI
FinAlgoritmo
En el siguiente ejemplo, se verá cómo utilizamos este algoritmo para la solución de otro
algoritmo (principal).
Ejemplo 2: Contar la cantidad de días entre dos fechas. Cada fecha estará representada por
tres datos: día, mes y año.
Algoritmo DiferenciaDiasDentroMes
DE: Dia1, Dia2 Є Z {Restricción: (Diai >= 1) Y (Diai <= 31) para i = 1 .. 2 }
DS: Difer Є Z
Comienzo
Difer |Dia2 - Dia1|
FinAlgoritmo FinAlgoritmo
Se intenta ahora extender la solución para considerar fechas de distinto mes, siempre dentro
de un mismo año. Para no complicar todavía demasiado el problema, supongamos que todos
los meses tienen exactamente 30 días y no hay bisiestos.
52
30/04 01/09
---------#-----|--------------------------|-----------#------
24/04 17/09
Si se analiza el ejemplo podemos ver que el problema puede dividirse en tres subproblemas.
Calcular los días entre el 24/04 y el 30/04, calcular los días entre el 01/09 y el 17/09 y calcular
los días intermedios. Es claro que los dos primeros subproblemas pueden pensarse a partir del
primer algoritmo DiferenciaDiasDentroMes. La tercer subtarea es simple a partir de nuestra
restricción de que todos los meses tienen 30 días.
Asumimos en este punto que disponemos de un método llamado CantidadDiasMes el cual dado
un número de mes devolverá la cantidad de días correspondiente a dicho mes.
Algoritmo DiferenciaDiasEntreFechas_DistintoMesMismoAño
DE: Dia1, Dia2, Mes1, Mes2 ЄZ
{Restricción: (Diai >= 1) Y (Diai <= 31), (Mesi >= 1) Y (Mesi <= 12) para i = 1..2 }
DS: Difer Є Z
DA: Dife1, Dife2, Inter Є Z
Comienzo
Dife1 DiferenciaDiasDentroMes(Dia1, CantidadDiasMes(Mes1))
Dife2 DifierenciaDiasDentroMes(1, Dia2)
Inter 30 * (Mes2 - Mes1 - 1)
Difer Dife1 + Inter + Dife2
FinAlgoritmo
Ahora es más fácil diseñar un algoritmo que funcione correctamente para fechas de distinto
año, siguiendo el mismo razonamiento. No es tan sencillo en cambio, eliminar la restricción
referida a la cantidad de días de cada mes o a los bisiestos.
Algoritmo DiferenciaDiasEntreFechas
DE: Dia1, Dia2, Mes1, Mes2, Anio1, Anio2 ЄZ
{Restricción: (Diai >= 1) Y (Diai <= 31), (Mesi >= 1) Y (Mesi <= 12) para i = 1..2 }
DS: Difer Є Z
DA: Dife1, Dife2, Inter, MesSigMes1, MesSigMes2, AnioMesSigMes1, AnioMesSigMes2 Є Z
Comienzo
Dife1 DiferenciaDiasDentroMes(Dia1, CantidadDiasMes(Mes1, Anio1))
Dife2 DiferenciaDiasDentroMes(1, Dia2)
{Calcular los días intermedios}
MesSigMes1 SiguienteMes(Mes1)
MesAntMes2 MesAnterior(Mes2)
Si MesSigMes1=1 Entonces
AnioMesSigMes1 Anio1 +1
Si MesAntMes2=12 Entonces
AnioMesAntMes2 Anio2 - 1
Inter DiasEntre(MesSigMes1, AnioMesSigMes1, MesSigMes2, AnioMesAntMes2)
Difer Dife1 + Inter + Dife2
FinAlgoritmo
Ejercicio 1: Habiendo resuelto nuestro algoritmo principal ahora es momento de diseñar los
subalgoritmos correspondientes a los métodos que hemos identificado para modularizar el
problema (CantidadDiasMes, SiguienteMes, MesAnterior, DiasEntre).
Algoritmo CalcularDiferenciaDiasEntreFechas
Datos Dias, Dia1, Dia2, Mes1, Mes2, Anio1, Anio2 Є Z
Comienzo
Mostrar 'Ingrese día, mes, año de primer fecha'
Ingresar dia1, mes1, anio1
Mostrar 'Ingrese día, mes, año de segunda fecha'
Ingresar dia2, mes2, anio2
Si EsFechaCorrecta(dia1, mes1, anio) y EsFechaCorrecta(dia1, mes1, anio)
Entonces
Dias DiferenciaDiasEntreFechas(Dia1, Mes1, Anio1, Dia2, Mes2, Anio2)
Mostrar 'La Cantidad de días en las fechas es: ', Dias
Sino
Mostrar 'Una de las fechas ingresadas no es válida'
FinAlgoritmo
puedan ser reutilizados por cualquier algoritmo que requiera de su funcionalidad simplemente
intercambiando datos a través de los respectivos parámetros.
La evaluación de una expresión de este tipo consiste en ir calculando cada término de la serie y
acumulándolo a los anteriores. La pregunta obvia es cuándo terminar. Una manera de resolver
este problema sería calcular la función para i términos y para i+1 términos; si la diferencia es
despreciable podemos suponer que hemos alcanzado una aproximación suficientemente buena.
Es claro que si tratamos de encarar todos estos problemas simultáneamente nos resultaría
difícil ya que perderíamos la idea global.
El punto es ahora definir las condiciones iniciales, la condición de corte y las acciones internas
del bloque repetitivo. En cada paso debemos mantener dos valores: la aproximación anterior y
la actual.
Algoritmo AproximarSerie
DE: X Є R {Restricción (X > 0)}
DS: F Є R
DA: i Є Z
AproxActual, AproxAnterior, Diferencia Є R
Comienzo
i1
Aprox_Actual Termino(X, 1)
REPETIR
ii+2
Aprox_Anterior Aprox_actual
Aprox_Actual Aprox_Anterior + Termino(X, I)
Diferencia Aprox_Actual - Aprox_Anterior
HASTA Diferencia sea despreciable
F Aprox_Actual
FinAlgoritmo
Aún para ejemplos sencillos es posible encontrar algoritmos más o menos diferentes para
resolver el mismo problema. Otra forma de encarar el mismo problema hubiera sido el hecho
de que cada uno de los términos es estrictamente decreciente. Por lo tanto, luego de calcular
un número grande de términos es posible que el aporte de uno nuevo sea despreciable. A
partir de este hecho un algoritmo podría haber sido:
Algoritmo AproximarSerie
DE: X Є R {Restricción: X > 0}
DS: F Є R
DA: i Є Z
TЄR
Comienzo
i1
f0
T Termino(X, 1) {Primer término}
REPETIR
ii+2
ff+T
T Termino(X, I) {I-ésimo término)
HASTA T sea despreciable
Fin-Algoritmo
Notar que en esta serie no es necesario calcular el primer término como un caso particular, el
algoritmo puede pensarse como:
Algoritmo AproximarSerie
DE: X Є R {Restricción (X > 0)}
DS: F Є R
DA: i Є Z
TЄR
Comienzo
i1
f0
REPETIR
T Termino(X, I)
ff+T
ii+2
HASTA T sea despreciable
Fin-Algoritmo
Ahora que el algoritmo general está resuelto, podemos ocuparnos de las acciones que
supusimos primitivas y desarrollarlas:
56
Algoritmo Termino
DE: X, I Є Z {Restricción: (X > 0), (I > 0)}
DS: T Є R
Comienzo
T XI / I!
Fin-Algoritmo
Notar que la expresión anterior no es válida en nuestro lenguaje de diseño ya que se dan las
siguientes circunstancias:
Algoritmo Termino
DE: X, I Є Z {Restricción: (X > 0)Y(I > 0)}
DS: T Є R
DS: Pot Є Z
Fact Є Z
Comienzo
Pot Potencia (X, I)
Fact Factorial (I)
T Pot / Fact
FinAlgoritmo
El hecho de que un valor sea despreciable consiste en que toma un valor por debajo de aquel
que consideramos como despreciable. Por ejemplo, podríamos considerar como despreciable a
un término cuyo valor sea inferior a 0.0001 o permitir tener como dato de entrada dicho valor.
Se elige usar un valor despreciable de 0.0001 en la versión definitiva del algoritmo
AproximarSerie.
57
Algoritmo AproximarSerie
DE: X Є Z {Restricción: (X > 0) }
DS: F Є R
DA: i Є Z
TЄR
Comienzo
i1
f0
REPETIR
T Termino(X, I)
f f +T
ii+2
HASTA T < 0.0001
FinAlgoritmo
Algoritmo AproximarSerie_Versión2
DE: X Є Z {Restricción: X > 0}
DS: F Є R
DA: i, Pot, Fact Є Z
TЄR
Comienzo
i1
f0
REPETIR
Pot Potencia (X, I)
fact Factorial ( I)
T Pot / fact
f f +T
ii+2
HASTA T < 0.0001
FinAlgoritmo
Esta versión no es menos correcta que la propuesta, pero es menos clara. La lógica del
problema se oscurece incorporando detalles al algoritmo general.
Nuestra propuesta es intentar modularizar nuestros algoritmos de manera tal que cada uno
pueda ser comprendido fácilmente, ya que realiza únicamente una sola tarea bien
determinada.
La técnica de diseño modular, en general, aparece combinada con el refinamiento paso a paso.
Una jerarquía es un sistema de estratos en el cual los niveles más altos operan con información
general y los más bajos trabajan con los detalles. El método de diseño de algoritmos por
refinamiento paso a paso es un ejemplo de este tipo de estructura jerárquica.
58
Una persona sólo puede concentrarse en una cantidad limitada de acciones o datos. Así es que
esta técnica trata de atemperar la limitación humana de abarcar problemas globalmente.
Dado un algoritmo, cuando se incorporan más detalles generando una nueva versión, se habla
de refinamiento paso a paso.
La relación entre refinamiento paso a paso y diseño modular es muy estrecha y no hay pautas
fijas para decidir cuándo incorporar detalles al algoritmo principal y cuándo resolver los detalles
como subproblemas independientes.
Algoritmo EsPrimo
DE: Nro Є Z
DS: Primo Є Booleano
Comienzo
Suponer que el nro es primo
Probar con divisores distintos de 1 y Nro
SI encontré un divisor
ENTONCES
Suposición equivocada. El nro no es primo!
FinAlgoritmo
Algoritmo EsPrimo
DE: Nro Є Z
DS: Primo Є Booleano
DA: Div Є Z
Comienzo
Primo Verdadero {Supongo que el nro es primo}
Div 2 {Genero el primer divisor a probar}
REPETIR MIENTRAS haya divisores para probar y sea primo (no encontré divisores)
Ver si el número Nro es divisible por ese divisor
Obtener el próximo divisor
SI encontré un divisor
ENTONCES
Primo Falso
FIN-SI
FIN-MIENTRAS
FinAlgoritmo
Esta versión es más refinada que la anterior, pero todavía quedan acciones que no constituyen
primitivas en nuestro pseudolenguaje.
59
Algoritmo EsPrimo
DE: Nro Є Z
DS: Primo Є Booleano
DA: Div, Resto Є Z
Comienzo
Div 2
Primo Verdadero
REPETIR MIENTRAS (Div < Nro) Y (Primo = Verdadero)
Resto Nro // Div
Div Div + 1
SI Resto = 0 {Encontré un divisor}
ENTONCES
Primo Falso {Cambio mi suposición}
FIN-SI
FIN-MIENTRAS
FinAlgoritmo
Ejercicio: El número 1 no es primo, sin embargo los algoritmos anteriores devuelven que el 1
es primo. Arreglar el algoritmo anterior para solucionar dicho inconveniente.
Así se determinaba si se había encontrado un divisor y entonces el número dado no era primo.
Se puede reemplazar dichas sentencias por una sola:
Algoritmo EsPrimo
DE: Nro Є Z
DS: Primo Є Booleano
DA: Div Є Z
Comienzo
Div 2
Primo (Nro > 1)
REPETIR MIENTRAS (Div < Nro) Y (Primo = Verdadero)
Primo (N // Div) <>. 0
Div Div + 1
FIN-MIENTRAS
FinAlgoritmo
Ejercicio: Diseñar otro algoritmo EsPrimo utilizando la estructura de control REPETIR HASTA.
Controlar que funciona para los casos límite como serían el número 1 y el 2
Tal vez la situación más común entre quienes comienzan a trabajar en programación, es que
no tienen idea acerca de cómo comenzar a resolver un problema aún luego de la fase de
definición del mismo. En este punto ocurre a menudo un bloqueo porque uno se preocupa
demasiado por los detalles de la implementación, antes de haber comprendido un problema
independientemente de su resolución.
Cuando no sabemos cómo encarar la resolución, es probable que nos convenga tomar un
problema específico de la clase, particularizar, y tratar de obtener el mecanismo que permita
resolver la clase completa de problemas.
Ejemplo 5: Dada una fecha, representada por tres datos enteros positivos Día, Mes y Año,
calcular el día siguiente.
En principio, la idea de sumar 1 al día nos parece que será suficiente para resolver el
problema.
Pero apenas nos detenemos a pensar un poco más en la resolución encontramos algunas
dificultades.
1) ¿Qué ocurre si queremos calcular el día siguiente para el último día del mes?
Dada la fecha 31/03/2011 el día siguiente será 01/04/2011.
a) Si es el último día del mes y el mes es diciembre, entonces el próximo día será 1, el mes
será uno y el año estará incrementado en 1.
b) Si es el último día del mes y el mes no es diciembre, entonces el próximo día será 1, el mes
estará incrementado en uno y el año no varía.
c) Si no es el último día del mes, entonces el próximo día estará incrementado en 1 y el mes y
el año no cambiarán.
61
En el siguiente algoritmo haremos uso de una función denominada UltimoDiaDelMes que luego
pasaremos a detallar.
Bosquejo
Si no es el último día del mes entonces incrementar el día en uno, año y mes iguales
Sino
Si es diciembre entonces poner en 1 el día y el mes e incrementar en uno el año
Sino poner en 1 el día e incrementar el mes, el año queda igual
Algoritmo Dia_Siguiente
DE: Dia, Mes, Año Є: Z
{Restricciones: (Dia >=1) y (Dia <=31) y (Mes >=1) y (Mes <=12)}
DS: NuevoDia, nuevoMes, NuevoAño Є Z
Comienzo
SI UltimoDiaDeIMes(Dia, Mes, Año) = FALSO {Llamada a otra primitiva}
ENTONCES
NuevoDia Dia + 1
NuevoMes Mes
NuevoAño Año
SINO {es el último día del mes}
SI Mes = 12
ENTONCES
NuevoDia 1
NuevoMes 1
NuevoAño Año + 1
SINO {el mes no es diciembre}
NuevoDia 1
NuevoMes Mes + 1
NuevoAño Año
FIN-SI
FIN-SI
FinAlgoritmo
La condición si Dia es el último del mes está bien establecida para todos los meses, excepto
Febrero que tiene 28 ó 29 días en los años bisiestos.
Se sabe que los meses que tienen 30 días son: abril, junio, septiembre y noviembre; el resto
tiene 31 días. Se define ahora la función que evaluará si un día es el último día del mes. En
este caso se está usando también refinamiento paso a paso y modularización.
62
Algoritmo UltimoDiaDelMes
DE: Dia, Mes, Año Є: Z
{Restricciones: (Dia >=1) y (Dia <=31) y (Mes >=1) y (Mes <=12)}
DS: EsUtimo Є Boolean
Comienzo
SI (Dia = 31 Y (Mes = l O Mes = 3 O Mes = 5 O Mes = 7 O Mes = 8 O Mes = 12))
O (Dia = 30 Y (Mes = 4 O Mes = 6 O Mes = 9 O Mes = 11))
O (Dia = 28 Y Mes = 2 Y NO EsBisiesto(Año)) {Llamada a otra primitiva}
O (Dia = 29 Y Mes = 2 Y EsBisiesto(Año))
ENTONCES
EsUtimo VERDADERO
SINO
EsUtimo FALSO
FIN-SI
FinAlgoritmo
Ejemplo 6: escribir un algoritmo para calcular Base ^ Exp (léase Base elevado al exponente
Exp), con Base y Exp enteros positivos.
El algoritmo tendrá dos datos de entrada Base y Exp y un dato de salida que llamaremos Pot.
Se toma como ejemplo específico Base = 7 y Exp = 3. Entonces Pot = 7 * 7 * 7. Es decir, Pot
es igual a 3 veces 7. Generalizando, Pot es igual a Exp veces Base.
Pot 1
REPETIR DESDE i = 1 A Exp
Pot Pot * Base
Algoritmo Potencia
DE: Base, Exp Є Z {Restricciones: (Base >= 0) (Exp >= 0)}
DS: Pot Є Z
DS: i Є Z
Comienzo
SI Base = 0
ENTONCES
Pot 0
SINO
Pot 1
REPETIR DESDE i = 1 A Exp
Pot Pot * Base
FIN-REPETIR
FIN-SI
FinAlgoritmo
1) Cómo extraer los dígitos, para pasar por ejemplo de 56329 a 5632.
2) Cómo contar las extracciones.
3) Cómo decidir que ya no es posible seguir haciendo extracciones y por lo tanto que hemos
terminado.
Se Intenta atacar de a un punto por vez. El bloque principal del algoritmo podría ser:
REPETIR
Extraer un dígito de Nro
Contar la extracción
HASTA que no haya más dígitos
Ahora ya está claro cuál será el proceso de contar y sólo debemos descubrir cómo realizar la
extracción y cuándo terminar. Para ello, recordemos que la división es una operación que
permite obtener dos resultados: el cociente y el resto. En particular, la división por 10 nos
permite ir partiendo un número en 2: el cociente que será aquel número con todos los dígitos
del original excepto el último y el resto que será justamente el último dígito. Por lo tanto, el
proceso de extracción podrá ser expresado:
Algoritmo Contar_Digitos
DE: Nro Є Z
DS: CantDig Є Z
Comienzo
CantDig 0
REPETIR
Nro Nro /e 10
CantDig CantDig + 1
HASTA Nro = 0
FinAlgoritmo
Aún para ejemplos sencillos como éste puede hallarse métodos de resolución diferentes.
Y así sucesivamente hasta que el número dado no sea menor que el auxiliar que se va
generando.
Algoritmo ContarDigitos_ V2
DE: Nro Є Z
DS: CantDig Є Z
DA: Pot10 Є Z
Comienzo
Pot10 1
CantDig 0
REPETIR
CantDig CantDig + 1
Pot10 Pot10 * 10
HASTA Pot10 > Nro
FinAlgoritmo
Notar que la idea ahora es completamente distinta. En lugar de extraer dígitos, se compara el
número con potencias crecientes de 10 hasta llegar a una mayor que el número dado.
Para este problema se puede usar una estrategia similar a la del problema anterior. Ahora ya
se sabe cómo descomponer un número, para ir tomando cada dígito. En el ejemplo anterior,
esta operación no interesaba, sino que surgió como consecuencia de analizar los resultados de
la división. La idea ahora es ir extrayendo los dígitos, desde los menos significativos hasta los
más significativos e ir componiendo el número progresivamente.
El dígito menos significativo del número dado será el más significativo del número reverso. El
segundo dígito menos significativo será el segundo más significativo y así siguiendo. Por
ejemplo si el número es 4321 el reverso es 1234.
Notar que al número original se le va extrayendo siempre el último dígito y que se acumula en
el reverso.
Algoritmo Reverso
DE: Nro Є Z {Restricción: Nro > 0}
DS: Reverso Є Z
DA: Dig Є Z
Comienzo
Reverso 0
REPETIR
Dig Nro // 10
Reverso Reverso * 10 + Dig
Nro Nro /e 10
HASTA Nro = 0
FinAlgoritmo
Algoritmo Reverso_ V2
DE: Nro Є Z
DS: Reverso Є Z
DA: Exp, CantDig, Dig Є Z
Comienzo
CantDig ContarDígitos(Nro) { Obtener la cantidad de dígitos del nro }
Exp CantDig - 1
Reverso 0
REPETIR
Dig Nro // 10
Reverso Reverso + Dig * Potencia(10, Exp)
Exp Exp - 1
Nro Nro /e 10
HASTA Nro = 0
FinAlgoritmo
Ejercicio: Hacer un algoritmo para sumar los dígitos de un número entero positivo. Por
ejemplo, dado el número N = 32537 el algoritmo debe devolver como resultado el valor 20.
Donde 20 se obtiene de hacer 7 + 3 + 5 + 2 + 3.
66
2.- Un conjunto de estrategias para encarar la solución de problemas. En particular vimos dos
estrategias muy útiles que normalmente se usan en forma combinada: refinamiento paso a
paso y descomposición de problemas.
La programación modular es uno de los métodos de diseño más flexibles y potentes para
mejorar la productividad de un programa. En programación modular el programa se divide en
módulos (partes independientes), cada una de las cuales ejecuta una única actividad o tarea y
se codifican independientemente de otros módulos. Cada uno de estos módulos se analiza,
codifican y ponen a punto por separado.
Dado que los módulos son independientes, diferentes programadores pueden trabajar
simultáneamente en diferentes partes del mismo programa. Esto reducirá el tiempo de diseño
del algoritmo y posterior codificación del programa. Además, un módulo se puede modificar
radicalmente sin afectar a otros módulos, incluso sin alterar su función principal.
Algoritmo Principal
DA: variable Є dominio
…
variable Є dominio
Comienzo
Ingreso de datos válidos (Lectura)
Llamadas a primitivas (Cálculo)
Salida de resultados por pantalla (Impresión)
FinAlgoritmo
Solamente posee datos auxiliares, que son los que se ingresan por teclado y generados por
algún cálculo.
Algoritmo ObtenerDigitoDePosicion
DE: Nro, Pos Є Z {Restricción: Pos es una posición válida dentro de Nro}
DS: Dig Є Z
DA: Pot10 Є Z
Comienzo
Pot10 Potencia (10, pos - 1)
Dig (Nro / pot10) // 10
FinAlgoritmo
----------------------------------------
Algoritmo Potencia
DE: Base, Exp Є Z
DS: Pot Є Z
DA: i Є Z
Comienzo
Pot 1
REPETIR PARA i = 1 A Exp
Pot Pot * Base
FIN-REPETIR
Fin-Algoritmo
----------------------------------------
68
Algoritmo ContarDigitos
DE: Nro Є Z
DS: Cant Є Z
Comienzo
Cant 0
REPETIR
Nro Nro /e 10
Cant Cant + 1
HASTA Nro = 0
FinAlgoritmo
El algoritmo principal se encarga de leer los datos requeridos, validarlos y mostrar los
resultados, como sigue:
ALGORITMO PRINCIPAL
DA: Num, Pos, Dig, CantDig Є Z
COMIENZO
{Verificar que el número ingresado sea positivo}
REPETIR
LEER Num
HASTA Num >= 0
MOSTRAR 'En la posición', Pos, ' del número ’, Num, ' se encuentra el dígito ', Dig
FinAlgoritmo
Con este ejemplo se aprecia cómo se complican los algoritmos cuando se deben ingresar los
datos, validarlos y mostrarlos. Esto se puede evitar en los algoritmos, pero no en los
programas.
8 Bibliografía
Grogono, Peter (1986). Programación en Pascal. Editorial Addison Wesley.