Apuntes de Algoritmos
Apuntes de Algoritmos
Apuntes de Algoritmos
Apuntes de algoritmos
Contenido
1
Apuntes de algoritmos
2
Apuntes de algoritmos
1. Algoritmos y Programas
1.1.2. Datos
Es una representación de hechos, conceptos o instrucciones, organizados de manera que se puedan
procesar, interpretar o comunicar por medios humanos o automáticas. Los datos, son por ejemplo,
representaciones de las características de una persona, objeto, concepto o hecho.
Los datos se pueden introducir en el computador como entrada y se procesan para producir resultados e
información de salida.
1.1.3. Hardware
Es el conjunto de componentes físicas que forman un computador.
Como ejemplo tenemos los chips de los procesadores (CPU, procesadores matemáticos, procesadores de
video), las tarjetas (la tarjeta madre, las tarjetas de memoria como la memoria RAM, las tarjetas de video,
red, sonido), las unidades de almacenamiento (disco duro, disquete, cd, dvd, pen drive), los dispositivos
periféricos (ratón, teclado, monitor, impresora)
1.1.4. Software
Son los programas que permiten utilizar los recursos del computador. Programación, soporte lógico, parte
no-mecánica o no-física de un sistema. Es un conjunto de programas y procedimientos que se incluyen en
un computador o equipo con el fin de hacer posible el su uso eficaz de dicha máquina. Son las instrucciones
responsables de que el hardware (la máquina) realice su tarea.
Como ejemplo tenemos los sistemas operativos, el software de aplicación, el software utilitario y los
lenguajes de programación.
Sistema operativo
Software básico encargado de controlar diferentes procesos en el computador mediante tres grandes
funciones:
• Coordinar y manipular el hardware del computador: como los procesadores, la memoria, las impresoras,
las unidades de almacenamiento, el monitor, el teclado o el ratón;
• Organizar los archivos en diversos dispositivos de almacenamiento, como discos flexibles, discos duros,
Cds.
• Gestionar los errores de hardware y la pérdida de datos.
Software de aplicación
Programa informático diseñado para facilitar al usuario la realización de un determinado tipo de trabajo.
Algunas son aplicaciones desarrolladas “a la medida” que ofrecen una gran potencia y soluciones eficientes
ya que están exclusivamente diseñadas para resolver un problema específico. Son ejemplos de este tipo de
3
Apuntes de algoritmos
software los programas que realizan tareas concretas como manejo de nómina, análisis de estadísticas,
manejo de almacén, etc.
Software utilitario
Son programas que facilitan el uso del computador como herramienta para solucionar actividades generales
como la edición de textos o la digitalización de materiales. En muchos casos los programas utilitarios son
agrupados en paquetes integrados de software, por ejemplo el Microsoft Office o el OpenOffice, donde se
ofrece soluciones más generales, pero se incluyen varias aplicaciones (procesador de textos, de hoja de
cálculo, manejador de base de datos, correo electrónico, visor de imágenes, etc.).
Lenguajes de programación
Sirven para escribir programas que permitan la comunicación usuario/máquina y la soluciones de problemas
utilizando las ventajas, poder de cálculo, procesamiento y almacenamiento del computador.
Los ordenadores con arquitectura Von Neumann constan de las siguientes partes:
Memoria principal
Es el subsistema donde se almacenan temporalmente los datos e instrucciones que son utilizados por el
computador. Esta información está representada en una codificación binaria de 0 y 1. La memoria se divide
en celdas, donde cada celda tiene una dirección única, de tal forma que el contenido de ellas puede ser
buscado, extraído y utilizado.
4
Apuntes de algoritmos
Dispositivo de entrada/salida
Es el subsistema que permite al computador interactuar con otros dispositivos, comunicarse con el mundo
exterior y almacenar los datos y programas en unidades permanentes, por ejemplo, el disco duro.
Está conformado por:
• Bus o unidades de intercambio. Permiten comunicar información entre los componentes del sistema,
los periféricos y el mundo exterior.
• Memoria secundaria. Permite conservar datos y programas en forma permanente, aún luego de apagar
el computador.
• Periféricos. Son dispositivos utilizados para suministrar información entre el computador y el exterior
(monitor, teclado, ratón, tarjeta de red, impresoras, tarjetas de memoria, escáner, etc.).
Características de un algoritmo
• Un algoritmo debe ser preciso e indicar el orden de realización de cada paso.
• El resultado del algoritmo debe estar definido. Si se sigue un algoritmo dos veces con los mismos datos
de entrada, se debe obtener el mismo resultado cada vez.
• Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento, es decir, se
debe tener un número finito de pasos.
5
Apuntes de algoritmos
1.2.2. Pseudocódigo
En un algoritmo expresado de manera más formal. Se utiliza como una representación intermedia, antes de
traducirlo o codificarlo con un lenguaje de programación. En las clases de Algoritmo utilizaremos el
pseudocódigo para expresar las soluciones algorítmicas creadas.
1.2.4. Programa
En Computación, es el conjunto de instrucciones que definen la secuencia de eventos que un computador
debe ejecutar para llevar a cabo una tarea, realizando cálculos y suministrando resultados.
Grupo de instrucciones compuestas con la finalidad de resolver un problema específico mediante el uso de
un computador. Un programa está codificado en un lenguaje que la máquina es capaz de entender y
procesar.
Es la traducción de un algoritmo o de un pseudocódigo utilizando un lenguaje de programación.
1.2.5. Programación
Proceso que comprende el análisis del problema, diseño de la solución, escritura o desarrollo del programa,
prueba del programa y su corrección.
Es la disciplina de la Computación que trata el desarrollo de programas.
6
Apuntes de algoritmos
• Portabilidad
• Reusabilidad del software
7
Apuntes de algoritmos
• Diseño. Una vez analizado el problema se diseña una solución que conduce a un algoritmo general que
resuelve los elementos más significativos del programa. Este algoritmo puede ser escrito utilizando
pseudocódigo.
• Codificación (implementación). La solución expresada en pseudocódigo se traduce a un programa que
el computador pueda procesar utilizando un lenguaje de programación de alto nivel.
• Compilación, ejecución y verificación. El programa se ejecuta (corre) y se verifica para eliminar
errores de programación o de lógica.
• Documentación. Se agrega al código del programa línea de texto que ayudan al programador y a las
personas que a futuro harán mantenimiento al software a entender su estructura y comportamiento. La
documentación también incluye escribir informes en donde se describe cómo se realizaron las diferentes
fases del ciclo de vida del software (en especial los procesos de análisis, diseño, codificación y prueba),
se agregan manuales de usuario y de referencia, así como normas para el mantenimiento.
• Depuración y mantenimiento. El programa se actualiza y modifica en la medida en que sea necesario
de manera que cumpla con las necesidades de los usuarios las cuales también cambian en el tiempo.
1.3. Datos
1.3.1. Dato
Diferentes entidades u objetos de información con que trabaja un programa. Determina el conjunto de
valores que la entidad puede almacenar, los operadores y las operaciones definidos sobre ellos.
Los datos tienen 3 características:
• Un nombre que los diferencia del resto.
• Un tipo que nos determina las operaciones que podemos hacer con ese dato.
• Un valor que puede variar o no a lo largo de la operación.
8
Apuntes de algoritmos
• Lógicos o booleanos. Aquel que sólo puede tomar uno de los dos valores, verdadero o falso (1/0).
• Carácter. Abarca al conjunto finito y ordenado de caracteres que reconoce la computadora (letras,
dígitos, caracteres especiales, ASCII).
• Cadena o String. Conjunto de caracteres, que van a estar entre “”.
En algunos lenguajes se definen tipos especiales de fecha y hora, sobre todo en los más modernos.
Esquema 2 - Entero
- Real
Estándar
- Carácter
- Lógico (boléanos)
- Arreglo (Vector, Matriz, Cubo)
- Registro
Tipos de datos Estáticos
- Archivo (Fichero)
- Cadena de caracteres
- Lista (y las variaciones pila, cola, dipolo)
- Lista enlazada
Dinámicos
- Árbol
- Grafo
1.3.4. Constante
Tienen un valor fijo que se le da cuando se define la constante y que ya no puede ser modificado durante la
ejecución. Pueden ser numéricos, lógicos, carácter o cadena.
Las constantes pueden llevar asociados un nombre o no, si no lo llevan, se llaman literales. Su valor hay que
darlo al definir la constante y ya no puede cambiar a lo largo de la ejecución, y en cuanto al tipo,
9
Apuntes de algoritmos
dependiendo de los lenguajes en algunos hay que ponerlo, y en otros no hace falta ponerlo porque toma el
tipo del dato que se le asigna.
const
<nombre_de_constante> = <valor>
Ejemplo:
const
PI = 3.1415
1.3.5. Variable
Nombre asignado a una entidad que puede adquirir un valor cualquiera dentro de un conjunto de valores. Es
decir, una entidad cuyo valor puede cambiar a lo largo del programa.
En un programa de computador se puede asumir que una variable es una posición de memoria donde los
valores asignados pueden ser reemplazados o cambiados por otros valores durante la ejecución del
programa.
Antes de usar una variable hay que definirla o declararla, al hacerlo hay que dar su nombre y su tipo. El
nombre que le damos tiene que ser un nombre significativo, va a ser un conjunto de caracteres que
dependiendo del lenguaje hay restricciones. Tiene que empezar por una letra, y el tamaño depende del
lenguaje.
• Identificador. Palabra que no es propia del lenguaje.
• El valor de la variable si al declararla no se la inicializa, en algunos lenguajes toma una por defecto. En
cualquier caso el valor de la variable se debe inicializar o ir variarlo a lo largo de la ejecución.
var
<tipo_de_dato> : <lista_identificadores_de_variables>
Ejemplo:
var
entero : mayor, menor
real : precio
lógico : encontrado
La ventaja de usar constantes con nombre es que en cualquier lugar donde quiera que vaya la constante,
basta con poner su nombre y luego el compilador lo sustituirá por su valor.
Al detectar una variable o una constante con nombre, automáticamente se reserva en memoria espacio para
guardar esa variable o constante. El espacio reservado depende del tipo de la variable.
1.3.7. Expresiones
Son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones o
acciones. Cada expresión toma un valor que se determina considerando los valores de las variables,
constantes y operaciones implicadas.
10
Apuntes de algoritmos
Reglas de precedencia
El problema es cuando una expresión entera según como la evalúe pueda dar diferentes valores.
7 * 3 + 4 25
La solución es aplicar prioridad entre los operadores, de modo que ante la posibilidad de usar varios siempre
aplicaremos primero el de mayor prioridad.
Cada lenguaje puede establecer sus propias reglas de prioridad o precedencia de operadores. Si no nos
acordamos, siempre podemos poner ( ).
• ^ ó **
• * / div mod
• + -
Entre dos operaciones que tienen la misma precedencia para resolver la ambigüedad, hay que usar la regla
de la asociatividad. La más normal es la de la asociatividad a izquierdas (primero lo de la izquierda).
11
Apuntes de algoritmos
Operadores lógicos
El problema es que a veces queremos preguntar o evaluar por más de una condición al mismo tiempo y para
esto están los operadores lógicos.
Y
O
No
Y, O, son operadores binarios (necesitan 2 operandos de tipo lógico).
Operando 1 Operador Operando 2
El No es unario, se coloca primero el No, y después el operando.
El resultado es lógico y depende de:
Operando 1 Operando 2 Y O
V V V V
V F F V
F V F V
F F F F
El No niega:
Operando No
V F
F V
12
Apuntes de algoritmos
1.3.8. Precedencia
Prioridad definida entre los operadores. Indica en qué orden debe aplicarse diferentes operaciones sobre un
conjunto de valores. Permiten aplicar los operadores en el orden correcto.
• ( )
• ** No
• div mod / * Y
• + - O
• < > = <= >= <>
De mayor prioridad a menor prioridad. En caso de haber operadores del mismo nivel en una expresión, se
evalúan en orden de aparición de izquierda a derecha.
En expresiones donde se combinen operadores se evalúa primero los aritméticos, luego los relacionales y
de último los operadores lógicos.
13
Apuntes de algoritmos
Símbolo Función
Líneas de flujo. Una línea con una flecha que sirve para conectar los símbolos
del diagrama y la flecha indica la secuencia en la que se van a ejecutar las
acciones.
Principio y fin. Dentro del símbolo ira la palabra inicio o fin del algoritmo.
inicio
base
altura
area
fin
14
Apuntes de algoritmos
inicio
p 1
leer num
p p*num
leer num
escribir p
fin
1.4.3. Pseudocódigo
Es un lenguaje de especificación de algoritmos, pero muy parecido a cualquier lenguaje de programación,
por lo que luego su traducción al lenguaje es muy sencillo, pero con la ventaja de que no se rige por las
normas de un lenguaje en particular. Nos centramos más en la lógica del problema.
El pseudocódigo también va a utilizar una serie de palabras clave o palabras especiales que va indicando lo
que significa el algoritmo.
algoritmo <identificador_algoritmo>
// declaraciones, sentencias no ejecutables
inicio
// acciones, sentencias ejecutables tanto simples como estructuradas
fin
• Comentarios. Sirven para documentar el algoritmo y en ellos se escriben anotaciones generalmente
sobre su funcionamiento.
// comentario de una línea
{ comentario que ocupa más
de una línea }
• Palabras reservadas. Son las palabras que tienen un significado especial, como inicio y fin. En lugar de
las palabras reservadas no deben usarse otras similares, aunque no se distingue entre mayúscula y
minúsculas.
inicio, fin
si, entonces, si_no, fin_si
según_sea, hacer, fin_según
15
Apuntes de algoritmos
mientras, fin_mientras
desde, hasta, incremento, decremento, fin_desde, etc.
• Identificadores. Son los nombres que se dan a las constantes, variables, procedimientos u otros
objetivos que manipula el algoritmo.
Ejemplo: Obtener el área de un rectángulo.
algoritmo area_rectangulo
entero : base, altura, area
inicio
leer(base)
leer(altura)
area base * altura
escribir(area)
fin
Ejemplo: Hallar el producto de varios números positivos introducidos por teclado y el proceso termina
cuando se meta un número negativo.
algoritmo producto_positivos
entero : p, num
inicio
p 1
leer(num)
mientras (mun >= 0) hacer
p p * num
leer(num)
fin_mientras
escribir(p)
fin
16
Apuntes de algoritmos
// bloque de declaraciones
const
<listado_constantes>
var
<listado_variables>
entero : var1, var2
// bloque de instrucciones
inicio // inicio del bloque de instrucciones
var1 0 // asignación
leer(var2) // escritura
17
Apuntes de algoritmos
Reglas de la asignación
Sea la expresión:
Operador de asignación
Izquierda Derecha
Variable a quien se asigna Expresión cuyo resultado se asigna
b c*2,45
• Una variable en el lado derecho de una sentencia de asignación debe tener un valor antes de que la
sentencia de asignación se ejecute, en el ejemplo, a la variable c se le debe asignar un valor antes a fin de
que la expresión c*2.45 arroje un resultado. Hasta que en el algoritmo a una variable no se le asigna
(usando el operador = o a través de una lectura) se asume que no ha sido inicializada.
• En la izquierda de una sentencia de asignación sólo pueden existir variables y eventualmente una
constante, por lo tanto la expresión ValorNeto – Tasa = Interes * 3,15 es un error.
18
Apuntes de algoritmos
19
Apuntes de algoritmos
proporcionan más seguridad con respecto a los resultados. Además, las conversiones explícitas pueden
controlar conversiones con pérdida de información.
El comportamiento de la conversión explícita depende del tipo de datos originales y del tipo de datos de
destino.
En el ejemplo siguiente se muestra conversiones de datos implícitas y explícitas, usando valores entero,
cadena, caracter y real.
// Se declaran las variables indicando su tipo de dato
entero : i
real : d
caracter : c
cadena : pal
i aEntero(d)
{ El valor de la variable d es convertido explícitamente de real a
entero, asignando a la variable i, la parte entera del valor de d (5 en
lugar de 5,0) }
c aCaracter(i)
{ Se convierte explícitamente el tipo de dato de la variable i,
transformando el valor entero 5 al carácter ‘5’ }
2.4. Contadores
Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad constante cada vez que
se produce un determinado suceso o acción. Los contadores se utilizan en estructuras repetitivas con la
finalidad de contar sucesos o acciones internas del bucle.
Con los contadores se debe realizar una operación de inicialización y, posteriormente, las sucesivas de
incremento o decremento del contador.
La inicialización consiste en asignarle al contador un valor. Se situará antes y fuera del bucle.
<nombre_del_contador> <valor_de_inicialización>
En cuanto a los incrementos o decrementos del contador, puesto que la operación de asignación admite que la
variable que recibe el valor final de una expresión intervenga en la misma, se realizarán a través de este tipo de
instrucciones de asignación, de la siguiente forma:
<nombre_del_contador> <nombre_del_contador> + <valor_constante>
dicho <valor_constante> podrá ser positivo o negativo. Esta instrucción se colocará ene el interior del bucle.
20
Apuntes de algoritmos
2.5. Acumuladores
Son variables cuyo valor se incrementa o decrementa en una cantidad determinada. Necesitan operaciones de:
• Inicialización:
<nombre_del_acumulador> <valor_de_inicialización>
• Acumulación:
<nombre_del_acumulador> <nombre_del_acumulador> + <nombre_variable>
Hay que tener en cuenta que la siguiente también sería una operación de acumulación:
<nombre_del_acumulador> <nombre_del_acumulador> + <valor>
2.6. Interruptores
Un interruptor o bandera (switch) es una variable que puede tomar los valores verdad y falso a lo largo de la
ejecución de un programa, comunicando así información de una parte a otra del mismo. Pueden ser utilizados
para el control de bucles y estructuras de selectivas. En este caso también es frecuente que la variable que
recibe el valor final de una expresión intervenga en la misma, por ejemplo:
En primer lugar el interruptor se inicializa a verdad o falso
<nombre_del_interruptor> <valor_de_inicialización>
En determinadas condiciones el interruptor conmuta
<nombre_del_interruptor> no <valor_del_interruptor>
21
Apuntes de algoritmos
22
Apuntes de algoritmos
3.3.1. Simple
En el condicional simple se evalúa la condición y si ésta da como resultado verdad se ejecuta una
determinada acción o grupo de acciones; en caso contrario se saltan dichos grupos de acciones.
Recomendación.: utilizar indentación o sangría para mostrar los niveles de anidación en las instrucciones.
si <condición> entonces
acción
fin_si
no si
condición
acción
3.3.2. Doble
Cuando el resultado de evaluar una condición es verdad se ejecutará una determinada acción o grupo de
acciones y si el resultado es falso se ejecutará otra acción o grupo de acciones diferentes.
Recomendación: utilizar indentación o sangría en los algoritmos y códigos.
si <condición> entonces
acción 1
si_no
acción 2
fin_si
no si
condición
acción 2 acción 1
23
Apuntes de algoritmos
3.3.3. Múltiple
Se evalúa una condición o expresión que puede tomar n valores. Según el valor que la expresión tenga en
cada momento se ejecutan las acciones correspondientes al valor.
Las acciones asociadas al valor si_no se ejecutan cuando la expresión no toma ninguno de los valores que
aparecen antes.
El valor con el que se compara la expresión, va a depender de los lenguajes, de lo que sea ese valor. En
general ese valor puede ser un valor constante, un rango de valores o incluso otra condición.
según_sea <expresión> hacer
<lista1> : acción 1
<lista2> : acción 2
...
[ si_no
acción ]
fin_según
no
expresión acción
lista1 lista2
acción 1 acción 2
24
Apuntes de algoritmos
Los ciclos o procesos repetitivos de instrucciones son procedimientos fundamentales en el uso de las
computadoras y por lo tanto en muchos algoritmos y programas.
Vamos a utilizar ciclos cuando:
• Necesitemos repetir instrucciones un determinado número de veces, mientras se cumpla una condición,
mientras un hecho sea verdadero o hasta cuando se alcance un determinado valor o condición.
• Cuando necesitemos contar un determinado número de elementos o de acciones, por ejemplo contar las
sílabas de un texto, los elementos de una secuencia que verifican una determinada condición o contar el
número de personas que cumplen ciertas características. En este caso se incluirán contadores dentro del
bucle.
• Los contadores son variables (generalmente de tipo entero) que tienen un valor inicial y que se incrementan
o decrementan en un valor constante cada vez que ocurre una iteración. Cuando los contadores se
decrementan se habla de descontar, en lugar de contar.
• También usaremos ciclos cuando necesitemos acumuladores determinados valores cada vez que se realiza
una iteración. Los acumuladores también son variables (generalmente de tipo entero, real o cadena), que
almacenan valores variables resultantes de las operaciones que se realizan en cada ciclo.
• Por ejemplo, podemos usar para ir sumando los precios de varios vehículos y luego calcular el precio
promedio general (con una variable acumulador de tipo real), para calcular la potencia o el factorial de un
número a través de multiplicaciones sucesivas (un acumulador de tipo entero o real) o para ir agregando a
una cadena de caracteres, letras o sílabas que construirán un mensaje (una variable acumulador del tipo
cadena)
3.4.1. Mientras
Es una estructura iterativa que permite verificar la condición de entrada al ciclo antes del cuerpo de
instrucciones a repetir.
Como la evaluación de la condición de entrada se realiza al inicio del bloque Mientras, puede ocurrir que las
instrucciones del ciclo no se realicen ni siquiera 1 vez, a diferencia del Repetir-hasta, donde el bloque de
instrucciones se realiza al menos 1 vez porque la condición de parada se verifica al final. Las instrucciones
del Mientras se pueden realizar 0 o más veces antes de que se cumpla la condición de terminar el ciclo.
El conjunto de instrucciones dentro del Mientras se ejecuta cuando la condición de entrada del principio se
cumple (es verdadera). Dicho de otro modo, el ciclo de instrucciones dentro del Mientras se va a detener
cuando la condición se haga falsa.
Se recomienda usar la estructura Mientras tienes que verificar la condición de entrada al inicio y si se
cumple, entonces, entrar al ciclo y realizar sus instrucciones.
mientras <expresión_lógica> hacer
acción
fin_mientras
no
condición
si
acción
25
Apuntes de algoritmos
3.4.2. Hacer-mientras
El bucle Hacer-mientras es análogo al bucle Mientras desde el punto de vista de que el cuerpo del bucle se
ejecuta una y otra vez mientras la condición es verdadera. La diferencia entre ellos consiste en que las
sentencias del cuerpo del bucle Hacer-mientras, se ejecutan al menos una vez antes que se evalúe la
expresión lógica.
hacer
acción
mientras <expresión_lógica>
acción
si no
condición
3.4.3. Repetir-hasta
Ejecuta un bloque de instrucciones varias veces hasta que se cumple la condición que es verificada al final
del bucle.
Las instrucciones dentro del ciclo Repetir-hasta se van a realizar mientras la condición de parada evaluada
al final sea falsa. Dicho de otro modo, el ciclo se va a detener cuando la condición de parada se haga
verdadera.
Se recomienda usar la estructura Repetir-hasta cuando las instrucciones del ciclo se pueden realizar al
menos 1 vez antes de comprobar la condición de parada.
repetir
acción
hasta_que <expresión_lógica>
acción
no si
condición
3.4.4. Desde
Es una estructura iterativa que es controlada por una variable (llamada también variable índice), la cual se
incrementa o decrementa hasta llegar a un valor límite o valor final que representa la condición de parada.
26
Apuntes de algoritmos
La estructura Desde comienzan con un valor inicial de la variable índice, las acciones especificadas para el
ciclo se ejecutan un número determinado de veces, a menos, que el valor inicial de la variable índice sea
mayor que el valor límite que se quiere alcanzar.
El incremento o decremento de la variable índice suele ser de 1 en 1, salvo cuando se indica lo contrario. La
variable índice suele ser de tipo entero y se utilizan comúnmente nombres como i, j o k (no importa si en
mayúsculas o minúsculas)
Se recomienda usar la estructura Desde cuando se conoce el número de veces que se deben ejecutar las
instrucciones del ciclo, es decir, en los casos en que el número de iteraciones es fijo y conocido.
desde v v1 hasta vf [incremento | decremento incr] hacer
acción
fin_desde
valor_inicial
no
condición
si
incremento o
acción
decremento
3.4.5. Observaciones
Observa que para el Mientras, Hacer-mientras y Repetir-hasta se debe incluir en el cuerpo de
instrucciones una acción donde se actualice la o las variables que usas en la condición de parada. Por el
contrario, en el Desde no es necesario incluir esta instrucción dado que en el encabezado de la instrucción
ya se incluye el incremento.
Comparación de bucles
• Mientras. El uso más frecuente es cuando la repetición no está controlada por contador; la condición
precede a cada repetición del bucle; el cuerpo del bucle puede no ser ejecutado. Se debe utilizar cuando
se desea saltar el bucle si la condición es falsa.
• Desde. Bucle de conteo, cuando el número de repeticiones se conoce por anticipado y puede ser
controlado por un contador; la condición precede a la ejecución del cuerpo del bucle.
• Hacer-mientras y repetir-hasta. Es adecuada para asegurar que al menos se ejecuta el bucle una vez.
27
Apuntes de algoritmos
28
Apuntes de algoritmos
4.2. Funciones
Desde el punto de vista matemático, una función es una operación que toma uno o varios operandos y devuelve
un resultado. Desde el punto de vista algorítmico, es un subalgoritmo que toma uno o varios parámetros como
entrada y devuelve, a la salida, un único resultado.
Como el resultado de la función es retornado al algoritmo principal, debe usarse una variable para almacenar
este resultado, es decir, en una variable del algoritmo principal se “captura” el valor retornado por la función.
Luego el valor almacenado en la variable puede ser utilizado por el algoritmo que llama a la función.
29
Apuntes de algoritmos
nombre de mismo tipo que el tipo de datos que devuelve a la función, este valor por tanto tiene que ser del
mismo tipo que el tipo de datos que devuelve la función, que es el que habremos indicado al declarar la
función en la parte final de la cabecera.
No se permiten funciones que no devuelvan nada.
Los parámetros que aparecen en la declaración de la función se denominan parámetros formales, y los
parámetros que se utiliza cuando se llama a la función se denominan parámetros actuales o reales.
algoritmo calcular_mitad
var
entero : num
inicio
escribir(“Introduce un número para hallar su mitad”)
leer(num)
escribir(“La mitad de ” + num + “ es ” + mitad(num))
fin
4.3. Procedimientos
La definición de procedimientos permite asociar un nombre a un bloque de instrucciones. Luego podemos usar
ese nombre para indicar en algún punto de un algoritmo que vamos a utilizar ese bloque de instrucciones, pero
sin tener la necesidad de repetirlas, sólo invocando al procedimiento por su nombre.
Los procedimientos se caracterizan por no retornar valores al algoritmo que las llama. Sin embargo, aunque los
procedimientos no retornan valores, si pueden informar al algoritmo que las llamó (a veces llamado algoritmo
principal) de cambios realizados por sus instrucciones en algunos valores a través de una herramienta que se
llama pase de parámetros. Los parámetros permiten utilizar la misma secuencia de instrucciones con diferentes
datos de entrada. Utilizar parámetros es opcional.
30
Apuntes de algoritmos
Cuando entre las instrucciones de un algoritmo vemos el nombre de un procedimiento, decimos que estamos
llamando o invocando al procedimiento.
Los procedimientos facilitan la programación modular, es decir, tener bloques de instrucciones que escribimos
una vez pero que podemos llamar y utilizar muchas veces en varios algoritmos. Una vez terminada la ejecución
de un procedimiento, se retorna el control al punto de algoritmo donde se hizo la llamada, para continuar sus
instrucciones.
algoritmo calcular_mitad
var
entero : num
inicio
escribir(“Introduce un número para hallar su mitad”)
leer(num)
llamar_a mitad(num)
fin
31
Apuntes de algoritmos
// bloque de declaraciones
const
<nombre_constantes> = valor1
var
<nombre_del_tipo> : <nombre_de_la_variable1> [, <nombre_de_la_variable2>, ... ]
// bloque de instrucciones
inicio // inicio del bloque de instrucciones
acción 1
acción 2
[ llamar_a ] <nombre_procedimiento>[(parámetros_actuales)]
{ la llamada a la función debe realizarse en una expresión bloque de
instrucciones }
escribir(<nombre_funcion>(parámetros_actuales))
...
acción N
32
Apuntes de algoritmos
escribir(suma(5, 8))
• Correspondencia por nombre explícito. Ahora en la llamada al subalgoritmo se pone explícitamente a
que parámetro formal corresponde cada actual.
Dado que la mayor parte de los lenguajes usan exclusivamente la correspondencia posicional, éste será
el método que se seguirá en el curso.
33
Apuntes de algoritmos
5.2. Arreglos
Estructuras de datos conformada por una sucesión de celdas, que permite almacenar en la memoria principal
del computador un conjunto finito de elementos (hay un número máximo conocido) que tienen el mismo tipo de
dato (son homogéneos).
Para hacer referencia a cualquiera de las celdas del arreglo es necesario el nombre del arreglo y el valor de uno
de los elementos perteneciente al conjunto de índices asignado, lo que permite tener acceso aleatorio.
35
Apuntes de algoritmos
• Uso de índice: El índice es un valor de tipo entero (número entero o carácter con un código entero
equivalente) que determina la posición de cada elemento en el arreglo. La cantidad de índices determina
las dimensiones del arreglo. Así un arreglo unidimensional tiene un índice, un arreglo bidimensional tiene
dos índices y uno n-dimensional tiene n índices.
36
Apuntes de algoritmos
var
vectorA : arregloA
vectorB : arregloB, arregloC
vectorC : arregloD
vectorD : arregloE
El número de elementos del vector vendrá dato por la fórmula:
<limite_sup> - <limite_inf> + 1
37
Apuntes de algoritmos
38
Apuntes de algoritmos
const
f = 5
c = 7
tipo
array [1..f, 1..c] de real : arr
var
arr : a
entero : b
...
inicio
...
b recibeArreglo(a)
...
fin
5.3. Registros
Estructura de datos formada por una colección finita de elementos llamados campos, no necesariamente
homogéneos (del mismo tipo) y que permiten almacenar una serie de datos relacionados entre sí bajo un
nombre y una estructura común.
39
Apuntes de algoritmos
var
registro : <nombre_de_la_variable>
<tipo_de_dato1> : <nombre_de_campo1> [,<nombre_de_campo1>] [...]
<tipo_de_dato1> : <nombre_de_campo1> [,<nombre_de_campo1>] [...]
<tipo_de_dato1> : <nombre_de_campo1> [,<nombre_de_campo1>] [...]
fin_registro
• Declaración por tipo: Al igual que con los arreglos, para declarar un tipo de registro definido por el
usuario, se antecede a la especificación la palabra clave Tipo y luego se definen las variables del tipo. El
uso de la declaración por tipo facilita la declaración de variables con una estructura común, así como el
pase de parámetros.
tipo
registro : <nombre_del_tipo>
<tipo_de_dato1> : <nombre_de_campo1> [,<nombre_de_campo1>] [...]
<tipo_de_dato1> : <nombre_de_campo1> [,<nombre_de_campo1>] [...]
<tipo_de_dato1> : <nombre_de_campo1> [,<nombre_de_campo1>] [...]
fin_registro
Para declarar una variable de tipo registro:
var
<nombre_del_tipo> : <nombre_de_la_variable>
Para acceder a un determinado campo de un registro se utilizará, como suelen emplear la mayoría de los
lenguajes el nombre de la variable del tipo de registro unido por un punto al nombre del campo.
<nombre_de_la_variable>.<nombre_de_campo1>
Si los campos del registro fueran a su vez otros registros habrá que indicar:
<nombre_de_la_variable>.<nombre_de_campo1>.<nombre_de_campo_de_campo1>
Los datos de tipo registro se pueden pasar como parámetros tanto a procedimientos como a funciones.
Para acceder al campo nombre del 2do elemento del arreglo a se escribiría a[2].nombre. Por ejemplo:
escribir(a[2].nombre)
presentaría en consola la cadena Carlos.
40
Apuntes de algoritmos
La longitud de una cadena es el número de caracteres de la misma. Si hubiese algún carácter que se utilizara
como especial para señalar el fin de cadena, no se consideraría en la longitud.
Si una cadena tiene longitud 0, la llamamos cadena nula por lo que no tiene ningún carácter, pero esto no
quiere decir que no tenga ningún carácter válido, por que puede haber algún carácter especial no imprimible
que forme parte de la cadena.
Una subcadena es una cadena extraída de otra.
41
Apuntes de algoritmos
• Comparación de cadenas. Esta operación se puede realizar porque lo que se va a comparar son los
valores ASCII asociados a cada carácter.
entero función comparación(cadena : c1, c2)
Esta función devuelve:
0 si c1 = c2
Un positivo si c1 > c2
Un negativo si c1 < c2
• Concatenación. Permite unir varias cadenas en una sola, manteniendo el orden de los caracteres que
se unen.
En pseudocódigo se usa el símbolo & ó +.
Ejemplo:
cadena1 “Hola”
cadena2 “Adios”
cadena3 cadena1 & “ ” + cadena2
escribir(cadena3)
por consola aparecerá “Hola Adios”
• Extracción de subcadenas. Extrae parte de una cadena.
cadena función subcadena(cadena : c; entero : ini[; entero : long])
Devuelve una subcadena de la cadena c formada por todos los caracteres a partir de la posición ini. Si
se incluye el argumento long, devuelve sólo los primeros long caracteres a partir de la posición ini.
• Posición. Una operación frecuente a realizar con cadenas es localizar si una determinada cadena forma
parte de otra cadena más grande o buscar la posición en que aparece un determinado carácter o
secuencia de caracteres de un texto. Estos problemas pueden resolverse con la función posición.
entero función posición(cadena : c, sc)
Devuelve la posición de la primera aparición de la subcadena sc en la cadena c.
• Conversión de cadenas a números. Es una función que se le pasa una cadena caracteres numéricos y
devuelve el número asociado.
entero función valor(cadena : c)
Convierte la cadena c a un valor numérico. Si el contenido de la cadena c no puede convertirse a un
valor numérico (contiene caracteres alfabéticos, signos de puntuación inválidos, etc.), devuelve 0
• Conversión de números a cadenas. Es una función a la que se le pasa un número y lo convierte a una
cadena.
cadena función cadena(entero : x)
Convierte a cadena el valor numérico x.
• Función que devuelve el carácter ASCII de un número
caracter función caracter(entero : x)
Devuelve el carácter correspondiente al código ASCII x.
• Función que devuelve el número asociado de un carácter ASCII:
entero función código(cadena : car)
Devuelve el código ASCII del carácter car.
42
Apuntes de algoritmos
6.1. Objeto
Es una entidad (tangible o intangible) que posee características y acciones que realiza por sí solo o
interactuando con otros objetos.
Un objeto es una entidad caracterizada por sus atributos propios y cuyo comportamiento está determinado por
las acciones o funciones que pueden modificarlo, así como también las acciones que requiere de otros objetos.
Un objeto tiene identidad e inteligencia y constituye una unidad que oculta tanto datos como la descripción de
su manipulación. Puede ser definido como una encapsulación y una abstracción: una encapsulación de
atributos y servicios, y una abstracción del mundo real.
Para el contexto de la POO un objeto es una entidad que encapsula datos (atributos) y acciones o funciones
que los manejan (métodos). También para la POO un objeto se define como una instancia o particularización de
una clase.
Los objetos de interés durante el desarrollo de software no sólo son tomados de la vida real (objetos visibles o
tangibles), también pueden ser abstractos. En general son entidades que juegan un rol bien definido en el
dominio del problema. Un libro, una persona, un carro, un polígono, son apenas algunos ejemplos de objeto.
Cada objeto puede ser considerado como un proveedor de servicios utilizados por otros objetos que son sus
clientes. Cada objeto puede ser a al vez proveedor y cliente. De allí que un programa pueda ser visto como un
conjunto de relaciones entre proveedores clientes. Los servicios ofrecidos por los objetos son de dos tipos:
• Los datos, que llamamos atributos.
• Las acciones o funciones, que llamamos métodos.
Características generales
• Un objeto se identifica por un nombre o un identificador único que lo diferencia de los demás.
Ejemplo: el objeto Cuenta de Ahorros número 12345 es diferente al objeto Cuenta de Ahorros número
25789. En este caso el identificador que los hace únicos es el número de la cuenta.
• Un objeto posee estados. El estado de un objeto está determinado por los valores que poseen sus
atributos en un momento dado.
• Un objeto tiene un conjunto de métodos. El comportamiento general de los objetos dentro de un
sistema se describe o representa mediante sus operaciones o métodos. Los métodos se utilizarán para
obtener o cambiar el estado de los objetos, así como para proporcionar un medio de comunicación entre
objetos.
• Un objeto tiene un conjunto de atributos. Los atributos de un objeto contienen valores que determinan
el estado del objeto durante su tiempo de vida. Se implementan con variables, constantes y estructuras
de datos (similares a los campos de un registro).
• Los objetos soportan encapsulamiento. La estructura interna de un objeto normalmente está oculta a
los usuarios del mismo. Los datos del objeto están disponibles solo para ser manipulados por los propios
métodos del objeto. El único mecanismo que lo conecta con el mundo exterior es el paso de mensajes.
43
Apuntes de algoritmos
• Un objeto tiene un tiempo de vida dentro del programa o sistema que lo crea y utiliza. Para ser
utilizado en un algoritmo el objeto debe ser creado con una instrucción particular (New ó Nuevo) y al
finalizar su utilización es destruido con el uso de otra instrucción o de manera automática.
6.2. Clase
La clase es la unidad de modularidad en la POO. La tendencia natural del individuo es la de clasificar los
objetos según sus características comunes (clase). Por ejemplo, las personas que asisten a la universidad se
pueden clasificar (haciendo abstracción) en estudiante, docente, empleado e investigador.
La clase puede definirse como la agrupación o colección de objetos que comparten una estructura común y un
comportamiento común.
Es una plantilla que contiene la descripción general de una colección de objetos. Consta de atributos y métodos
que resumen las características y el comportamiento comunes de un conjunto de objetos.
Todo objeto (también llamado instancia de una clase), pertenece a alguna clase. Mientras un objeto es una
entidad concreta que existe en el tiempo y en el espacio, una clase representa solo una abstracción.
Todos aquellos objetos que pertenecen a la misma clase son descritos o comparten el mismo conjunto de
atributos y métodos. Todos los objetos de una clase tienen el mismo formato y comportamiento, son diferentes
únicamente en los valores que contienen sus atributos. Todos ellos responden a los mismos mensajes.
Características generales
Una clase es un nivel de abstracción alto. La clase permite describir un conjunto de características comunes
para los objetos que representa. Ejemplo: La clase Avión se puede utilizar para definir los atributos (tipo de
avión, distancia, altura, velocidad de crucero, capacidad, país de origen, etc.) y los métodos (calcular
posición en el vuelo, calcular velocidad de vuelo, estimar tiempo de llegada, despegar, aterrizar, volar, etc.)
de los objetos particulares Avión que representa.
• Un objeto es una instancia de una clase. Cada objeto concreto dentro de un sistema es miembro de
una clase específica y tiene el conjunto de atributos y métodos especificados en la misma.
• Las clases se relacionan entre sí mediante una jerarquía. Entre las clases se establecen diferentes
tipos de relaciones de herencia, en las cuales la clase hija (subclase) hereda los atributos y métodos de
la clase padre (superclase), además de incorporar sus propios atributos y métodos.
Ejemplos:
Superclase: Clase Avión
Subclases de Avión: Clase Avión Comercial, Avión de Combate, Avión de Transporte.
• Los nombres o identificadores de las clases deben colocarse en singular (clase Animal, clase Carro,
clase Alumno).
44
Apuntes de algoritmos
6.4. Atributos
Son los datos o variables que caracterizan al objeto y cuyos valores en un momento dado indican su estado.
Un atributo es una característica de un objeto. Mediante los atributos se define información oculta dentro de un
objeto, la cual es manipulada solamente por los métodos definidos sobre dicho objeto
Un atributo consta de un nombre y un valor. Cada atributo está asociado a un tipo de dato, que puede ser
simple (entero, real, lógico, carácter, cadena) o estructurado (arreglo, registro, archivo, lista, etc.).
Los modos de acceso son:
• Público. Atributos (o Métodos) que son accesibles fuera de la clase. Pueden ser llamados por cualquier
clase, aun si no está relacionada con ella. Este modo de acceso también se puede representar con el
símbolo +.
• Privado. Atributos (o Métodos) que sólo son accesibles dentro de la implementación de la clase. También
se puede representar con el símbolo –.
• Protegido. Atributos (o Métodos) que son accesibles para la propia clase y sus clases hijas (subclases).
También se puede representar con el símbolo #.
6.5. Métodos
Son las operaciones (acciones o funciones) que se aplican sobre los objetos y que permiten crearlos, cambiar
su estado o consultar el valor de sus atributos.
Los métodos constituyen la secuencia de acciones que implementan las operaciones sobre los objetos. La
implementación de los métodos no es visible fuera de objeto.
Ejemplo: Un rectángulo es un objeto caracterizado por los atributos Largo y Ancho, y por varios métodos, entre
otros Calcular su área y Calcular su perímetro.
Características generales
• Cada método tiene un nombre, cero o más parámetros (por valor o por referencia) que recibe o devuelve
y un algoritmo con el desarrollo del mismo.
• En particular se destaca el método constructor, que no es más que el método que se ejecuta cuando el
objeto es creado. Este constructor tiene el mismo nombre de la clase/ objeto, recibe cero o más
parámetros y lo usual es que inicialicen los valores de los atributos del objeto.
• En lenguajes como Java y C++ se puede definir más de un método constructor, que normalmente se
diferencian entre sí por la cantidad de parámetros que reciben.
• Los métodos se ejecutan o activan cuando el objeto recibe un mensaje, enviado por un objeto o clase
externo al que lo contiene, o por el mismo objeto de manera local.
45
Apuntes de algoritmos
6.6. Mensaje
Es la petición de un objeto a otro para solicitar la ejecución de alguno de sus métodos o para obtener el valor de
un atributo público.
Estructuralmente, un mensaje consta de 3 partes:
• Identidad del receptor. Nombre del objeto que contiene el método a ejecutar.
• Nombre del método a ejecutar. Solo los métodos declarados públicos.
• Lista de Parámetros que recibe el método (cero o mas parámetros)
Cuando el objeto receptor recibe el mensaje, comienza la ejecución del algoritmo contenido dentro del método
invocado, recibiendo y/o devolviendo los valores de los parámetros correspondientes, si los tiene ya que son
opcionales:
46
Apuntes de algoritmos
Notación: Ejemplo
Nombre Clase ventana
+ real : área
Atributos # lógico : visible
+ ventana(E real : a; E lógico : v)
Métodos + entero mostrarColor()
+ modificarTamaño(E real : porcentaje)
subclase superclase
47
Apuntes de algoritmos
Si motor forma parte de carro, la flecha apunta a la clase motor, y el diamante va pegado a carro.
La multiplicidad es el rango de cardinalidad permitido que puede asumir la asociación, se denota LI..LS. Se
puede usar * en el limite superior para representar una cantidad ilimitada (ejemplo: 3..*).
Ejemplo: Objeto Casa descrito en términos de sus componentes
48
Apuntes de algoritmos
persona corazón
Ejemplos:
49
Apuntes de algoritmos
7.1. Abstracción
Es el principio de ignorar aquellos aspectos de un fenómeno observado que no son relevantes, con el
objetivo de concentrarse en aquellos que si lo son. Una abstracción denota las características esenciales de
un objeto (datos y operaciones), que lo distingue de otras clases de objetos. Decidir el conjunto correcto de
abstracciones de un determinado dominio, es el problema central del diseño orientado a objetos.
Los mecanismos de abstracción son usados en la POO para extraer y definir del medio a modelar, sus
características y su comportamiento. Dentro de la POO son muy usados mecanismos de abstracción:
Generalización, Agregación y clasificación.
7.1.1. Generalización
Es el mecanismo de abstracción mediante el cual un conjunto de clases de objetos son agrupadas en una
clase de nivel superior (Superclase), donde las semejanzas de las clases constituyentes (Subclases) son
enfatizadas, y las diferencias entre ellas son ignoradas. En consecuencia, a través de la generalización, la
superclase almacena datos generales de las subclases, y las subclases almacenan sólo datos particulares.
La especialización es lo contrario de la generalización. La clase Médico es una especialización de la clase
Persona, y a su vez, la clase Pediatra es una especialización de la superclase Médico.
7.1.2. Agregación
Es el mecanismo de abstracción por el cual una clase de objeto es definida a partir de sus partes (otras
clases de objetos). Mediante agregación se puede definir por ejemplo un computador, por descomponerse
en: la CPU, la ULA, la memoria y los dispositivos periféricos. El contrario de agregación es la
descomposición.
7.1.3. Clasificación
Consiste en la definición de una clase a partir de un conjunto de objetos que tienen un comportamiento
similar. La ejemplificación es lo contrario a la clasificación, y corresponde a la instanciación de una clase,
usando el ejemplo de un objeto en particular.
50
Apuntes de algoritmos
El encapsulamiento en un sistema orientado a objeto se representa en cada clase u objeto, definiendo sus
atributos y métodos con los siguientes modos de acceso:
• Público (+). Atributos o Métodos que son accesibles fuera de la clase. Pueden ser llamados por cualquier
clase, aun si no está relacionada con ella.
• Privado (-). Atributos o Métodos que solo son accesibles dentro de la implementación de la clase.
• Protegido (#). Atributos o Métodos que son accesibles para la propia clase y sus clases hijas (subclases).
Los atributos y los métodos que son públicos constituyen la interfaz de la clase, es decir, lo que el mundo
exterior conoce de la misma.
Normalmente lo usual es que se oculten los atributos de la clase y solo sean visibles los métodos, incluyendo
entonces algunos de consulta para ver los valores de los atributos. El método constructor (Nuevo, New) siempre
es Público.
7.3. Modularidad
Es la propiedad que permite tener independencia entre las diferentes partes de un sistema. La modularidad
consiste en dividir un programa en módulos o partes, que pueden ser compilados separadamente, pero que
tienen conexiones con otros módulos. En un mismo módulo se suele colocar clases y objetos que guarden una
estrecha relación. El sentido de modularidad está muy relacionado con el ocultamiento de información.
7.4. Herencia
Es el proceso mediante el cual un objeto de una clase adquiere propiedades definidas en otra clase que lo
preceda en una jerarquía de clasificaciones. Permite la definición de un nuevo objeto a partir de otros,
agregando las diferencias entre ellos (Programación Diferencial), evitando repetición de código y permitiendo la
reusabilidad.
Las clases heredan los datos y métodos de la superclase. Un método heredado puede ser sustituido por uno
propio si ambos tienen el mismo nombre.
La herencia puede ser simple (cada clase tiene sólo una superclase) o múltiple (cada clase puede tener
asociada varias superclases). La clase Docente y la clase Estudiante heredan las propiedades de la clase
Persona (superclase, herencia simple). La clase Preparador (subclase) hereda propiedades de la clase Docente
y de la clase Estudiante (herencia múltiple).
Cuando se desea indicar invocar a un método que pertenece a la clase madre, lo indicamos con la siguiente
sintaxis:
super.nombre_método()
Para el ejemplo, la llamada en la clase hija ave del método comer de la clase madre animal sería:
super.comer()
7.5. Polimorfismo
Es una propiedad de la POO que permite que un método tenga múltiples implementaciones, que se seleccionan
en base al tipo objeto indicado al solicitar la ejecución del método.
El polimorfismo operacional o sobrecarga operacional permite aplicar operaciones con igual nombre a
diferentes clases o están relacionados en términos de inclusión. En este tipo de polimorfismo, los métodos son
interpretados en el contexto del objeto particular, ya que los métodos con nombres comunes son
implementados de diferente manera dependiendo de cada clase.
51
Apuntes de algoritmos
Por ejemplo, el área de un cuadrado, rectángulo y círculo, son calculados de manera distinta; sin embargo, en
sus clases respectivas puede existir la implementación del área bajo el nombre común Área. En la práctica y
dependiendo del objeto que llame al método, se usará el código correspondiente.
Ejemplo: superclase: clase animal subclases: clases perro, ave, pez
Se puede definir un método comer en cada subclase, cuya implementación cambia de acuerdo a la clase
invocada, sin embargo el nombre del método es el mismo.
perro.comer() ≠ ave.comer() ≠ pez.comer()
Otro ejemplo de polimorfismo es el operador +. Este operador tiene dos funciones diferentes de acuerdo al tipo
de dato de los operandos a los que se aplica. Si los dos elementos son numéricos, el operador + significa suma
algebraica de los mismos, en cambio si por lo menos uno de los operandos es un String o Carácter, el operador
es la concatenación de cadenas de caracteres.
Otro ejemplo de sobrecarga es cuando tenemos un método definido originalmente en la clase madre, que ha
sido adaptado o modificado en la clase hija. Por ejemplo, un método comer para la clase animal y otro comer
que ha sido adaptado para la clase ave, quien está heredando de la clase animal.
Para poder realizar la adaptación o modificación del método en la clase hija, debe estar declarado como método
abstracto en la clase madre.
Ejemplo: abstracto publico entero función mostrarCedula()
52
Apuntes de algoritmos
8. Ejemplos
8.1. Expresiones
Determinar el valor de la variable A.
a. A (3 * 2 ^ 5 mod 1 + 8 * (3 - 5) < (2 + 8 - 1 mod 1)
A (3 * 32 mod 1 + (-16)) < 10
A -16 < 10
A Verdadero
b. A A o ( 3 + 5 * 8) < 3 y ((-6 / 3 div 4) * 2 < 2)
A Verdadero o 43 < 3 y (0 * 2 < 2)
A Verdadero o Falso y Verdadero
A Verdadero o Falso
A Verdadero
inicio
num = 1
suma = 0
“Ingresar número: ”
num
si no
num <> 0
fin
53
Apuntes de algoritmos
algoritmo ejemplo_8.2
var
entero : num, suma
inicio
num 1
suma 0
hacer
escribir(“Ingresar número: ”)
leer(num)
suma suma + num
mientras (num <> 0)
escribir(“La suma es: ” + suma)
fin
inicio
// se pide el valor del sueldo al usuario
escribir(“Suministre el monto del sueldo de la persona”)
// lee el sueldo actual del empleado
leer(sueldo)
// el condicional compara el sueldo del empleado
si (sueldo <= 605) entonces
// aumenta el sueldo del empleado
sueldo sueldo + 150
// mensaje con el resultado
escribir(“El nuevo sueldo es: ” + sueldo)
fin_si
// Fin de la secuencia de instrucciones
fin
b. Crea una secuencia de instrucciones que calcule el monto de un aumento, a partir del sueldo del empleado
y su antigüedad (cantidad de años trabajados en la empresa). Para las personas que ganan hasta Bs. 500
se les aumenta 15% si tienen menos de 5 años de antigüedad en la empresa y 20% si tienen 5 ó más
años. Para los que ganan por encima de Bs. 500 hasta 2.500 se les aumenta 5% por cada 5 años de
antigüedad.
algoritmo ejemplo_8.3.b
{ Procedimiento para aumentar el sueldo según el monto del sueldo actual
y los años de servicio }
var
real : sueldo, aumento
entero : años, aux
inicio
escribir(“Suministre el sueldo y los años de antigüedad”)
// se solicitan y leen valores de entrada
leer(sueldo)
leer(años)
//contempla sueldo menores o iguales a 500
54
Apuntes de algoritmos
c. Dada una fecha en formato día/mes/año determinar el número de días y el nombre del mes de dicha fecha,
y sacar por pantalla la fecha convertida a formato de día “de” mes “de” año. Suponer que febrero siempre
tiene 28 días.
algoritmo ejemplo_8.3.c
var
entero : dia, mes, año, n_dias
cadena : n_mes
inicio
escribir(“Introduce la fecha en formato día mes año”)
leer(dia)
leer(mes)
leer(año)
según_sea (mes) hacer
1: n_mes “enero”
n_dias 31
2: n_mes “febrero”
n_dias 28
3: n_mes “marzo”
n_dias 31
4: n_mes “abril”
n_dias 30
5: n_mes “mayo”
55
Apuntes de algoritmos
n_dias 31
6: n_mes “junio”
n_dias 30
7: n_mes “julio”
n_dias 31
8: n_mes “agosto”
n_dias 31
9: n_mes “septiembre”
n_dias 30
10: n_mes “octubre”
n_dias 31
11: n_mes “noviembre”
n_dias 30
12: n_mes “diciembre”
n_dias 31
fin_según
escribir(“El mes de ” + n_mes + “ tiene ” + n_dias + “ dias”)
escribir(“La fecha es ” + n_dias + “ de ” + n_mes + “ de ” + año)
fin
inicio
suma 0
desde j 1 hasta 35 hacer
escribir(“Suministre el nuevo número”)
leer(num)
suma suma + num
fin_desde
promedio suma / (j - 1)
escribir(“La suma de los números es ” + suma)
escribir(“El promedio de los números es ” + promedio)
fin
inicio
cont 0
a1 1
56
Apuntes de algoritmos
a2 0
an a1 + (2 * a2)
mientras (an < 2000) hacer
a2 a1
a1 an
an a1 + (2 * a2)
cont cont + 1
fin_mientras
escribir(“El rango es ” + cont + “ y el resultado es ” + an)
fin
c. Se desea conocer cuantas veces se repiten las vocales en un texto que el usuario suministra letra por letra
y que termina con ‘* ’
algoritmo ejemplo_8.4.c
var
entero : cantA, cantE, cantI, cantO, cantU
carácter : letra
inicio
cantA 0
cantE 0
cantI 0
cantO 0
cantU 0
escribir(“suministre la primera letra”)
leer(letra)
mientras (letra <> ‘*’) hacer
según_sea (letra) hacer
‘a’: cantA cantA + 1
‘e’: cantE cantE + 1
‘i’: cantI cantI + 1
‘o’: cantO cantO + 1
‘u’: cantU cantU + 1
fin_según
escribir(“suministre próxima letra”)
leer(letra)
fin_mientras
escribir(“La cantidad de vocales A es ” + cantA)
escribir(“La cantidad de vocales E es ” + cantE)
escribir(“La cantidad de vocales U es ” + cantU)
fin
d. Calcule el promedio general de notas de un grupo de alumnos para una materia. Se sabe que la materia
tiene al menos un alumno. El usuario le indicará cuando terminó de suministrar todas las notas.
algoritmo ejemplo_8.4.d
var
real : nota, promedio
entero : numAlumnos
cadena : continuar
inicio
promedio 0
numAlumnos 1
continuar “Si”
repetir
escribir(“Suministre la nota del alumno”)
leer(nota)
57
Apuntes de algoritmos
repetir
escribir(“suministra el día, mes y año de tu fecha de nacimiento”)
leer(diaNac)
leer(mesNac)
leer(añoNac)
hasta_que (esCorrecta)
58
Apuntes de algoritmos
si no(esBis) entonces
escribir(“no naciste en un año Bisiesto”)
si_no
escribir(“Naciste en un año Bisiesto”)
fin_si
edad 0
esMenorEdad Falso
// verifica si el día (d), mes (m) y año (a) conforman una fecha válida
lógico función validarFecha(E entero : d, m, a)
var
lógico : correcta
inicio
correcta = verdadero;
devolver(correcta)
fin_función
{ verifica si ya la persona cumplió años. Este algoritmo supone que existen las
Funciones que devuelven el año, mes y día actual }
procedimiento cumpleaños(E cadena : nombre; E entero : dia, mes, año)
var
cadena : mensaje
entero : mesesFaltan
inicio
// 1er si, para la fecha de ejemplo añoActual() = 2007
si (año = añoActual()) entonces
mensaje “todavía no has cumplido el primer añito”
// 2do si, ya cumplió años, para la fecha de ejemplo mesActual() = 6
si_no si (mes < mesActual()) entonces
mensaje “ ya cumpliste años, felicitaciones atrasadas”
// 3er si, ya cumplió años, 3er si faltan = mes mod 12 + 1
si_no si (mes > mesActual()) entonces
mensaje “ faltan aproximadamente ” + faltan +
“ para tu cumpleaños”
59
Apuntes de algoritmos
c. Implementar un subprograma que me halle cual es la primera potencia en base 2 mayor que un número que
pasamos como parámetro, devolviendo el valor de dicha potencia y el exponente al que está elevado.
algoritmo ejemplo_8.5.c
var
entero : numero, resp1, resp2
inicio
escribir(“Introduce un número”)
leer(numero)
comprueba(numero, resp1, resp2)
escribir(“2^” + resp1 + “ = ” + resp2 + “ > ” + numero)
fin
d. Calcular el primer término de la siguiente serie que sea mayor o igual a un valor V que se le pasa como
parámetro y me devuelva el lugar que ocupa en la serie y el valor.
Ai = 0
An = n + (An - 1)!
entero función factorial(E entero : num)
var
entero : i, acum
inicio
acum 1
60
Apuntes de algoritmos
La solución es A = 8; B = 2; C = 3
61
Apuntes de algoritmos
8.6. Arreglos
a. Hay unos multicines con 5 salas, y cada sala con 100 personas distribuidas en 20 asientos y 5 filas.
Si se pide la entrada para una sala, implementar un algoritmo que me diga si hay sitio en la sala.
algoritmo ejemplo_8.6.a
const
salas = 5
asientos = 20
filas = 5
var
entero : f, a, s
lógico : bandera
array [1..filas, 1..asientos, 1..salas] de entero : cine
inicio
pedirDatos(s)
mientras (s <> 0) hacer
bandera falso
a 0
f 1
repetir
si (a > asientos) entonces
a 1
f f + 1
fin_si
si (a = asientos) y (f >= filas) entonces
escribir(“Sala llena”)
bandera verdadero
si_no
si (a[f, a, s] = 0) entonces
a[f, a, s] 1
escribir(“Asiento ” + a + “, fila ” + a)
bandera verdadero
fin_si
fin_si
hasta_que (a[f, a, s] = 1) y (bandera = verdadero)
pedirDatos(s)
fin_mientras
fin
b. Dada una matriz A de M*N elementos, actualizarla tal que la matriz resultante tenga divididos a los
elementos de la diagonal principal por la suma de los elementos que no forman parte de ella.
algoritmo ejemplo_8.6.b
var
array [1..M, 1..N] de real : a
real : suma
inicio
pedirDatos(a)
62
Apuntes de algoritmos
sumar(a, suma)
escribirArreglo(a)
fin
c. Se tiene guardado en una estructura los alumnos de una escuela, sabiendo que hay 3 cursos, M alumnos
por curso y N materias por estudiante, determinar mediante subprogramas:
• ¿Cual es la nota media de un determinado curso?
• ¿Cuantos aprobados y reprobados hay en una determinada materia?
• ¿Cual es el alumno de la escuela con mejor nota media?
algoritmo ejemplo_8.6.c
const
cursos = 3
alumnos = M
materias = N
tipo
array [1..cursos, 1.. alumnos, 1.. materias] de real : cubo
63
Apuntes de algoritmos
var
cubo : nota
inicio
pedirDatos(nota)
mediaCurso(nota)
cantidadAprobados(nota)
mediaAlumno(curso)
fin
inicio
suma 0.0
repetir
escribir(“¿De qué curso quieres hacer la media?”)
leer(curso)
hasta_que (curso <= 1) y (curso <= cursos)
desde a 1 hasta alumnos hacer
desde m 1 hasta materias hacer
suma suma + n[curso, a, m]
fin_desde
fin_desde
media suma / (alumnos * materias)
escribir(“La nota media del curso ” + curso + “ es ” + media)
fin_procedimiento
64
Apuntes de algoritmos
aprobados aprobados + 1
si_no
reprobados reprobados + 1
fin_si
fin_desde
fin_desde
escribir(“En la materia ” + materia + “ hay ” + aprobados + “ aprobados”)
escribir(“En la materia ” + materia + “ hay ” + reprobados + “ reprobados”)
fin_procedimiento
d. Una empresa consta de 5 departamentos con 20 empleados cada departamento, si se tiene todas las
ventas en una estructura, determinar:
• Ventas de un determinado departamento en un determinado mes.
• Ventas de un determinado empleado en un determinado departamento.
• ¿Cual es el departamento con más ventas?
algoritmo ejemplo_8.6.d
const
departamentos = 5
empleados = 20
meses = 12
tipo
array [1.. departamentos, 1.. empleados, 1.. meses] de real : matriz
var
matriz : ventas
real : cantidad
inicio
pedirDatos(ventas)
ventasDepartamentoMes(ventas)
ventasEmpleadoDepartamento(ventas)
mejorDepartamento(ventas)
fin
65
Apuntes de algoritmos
66
Apuntes de algoritmos
8.7. Registros
a. Tenemos un array con la información de nuestros productos, por cada producto almacenamos su código,
descripción, stock actual y stock mínimo.
Se trata de obtener otro array que contenga los productos de los que halla que hacer pedidos porque su
stock sea inferior al mínimo, tal que al proveedor le tenemos que dar como datos la identificación del
producto y la cantidad que pedimos, que coincidirá con el stock mínimo.
Normalmente trabajamos con 100 productos.
algoritmo ejemplo_8.7.a
tipo
registro : producto
entero : codigo
cadena : descripción
entero : stock
entero : stock_min
fin_registro
registro : pedido
entero : codigo
entero : cantidad
fin_registro
array [1..100] de producto : listaProducto
array [1..100] de pedido : listaPedido
var
listaProducto : prod
listaPedido : ped
entero : i, j
inicio
j 1
desde i 1 hasta 100 hacer
si (prod[i].stock < prod[i].stock_min) entonces
ped[j].codigo prod[i].codigo
ped[j].cantidad prod[i].stock_min
j j + 1
67
Apuntes de algoritmos
fin_si
fin_desde
fin
b. Dado un array que contiene la información de los alumnos de una clase de 100 alumnos, y teniendo en
cuenta que de cada uno de ellos almacenamos su número de expediente, nombre y nota media. Hallar la
media de todos los alumnos de esa clase y dar otra opción que pida el nombre de un alumno y me de su
nota si este alumno existe.
algoritmo ejemplo_8.7.b
tipo
registro : alumno
entero : expediente
cadena : nombre
real : media
fin_registro
array[1..100] de alumno : lista
var
lista : estudiante
entero : op, i
lógico : marca
cadena : nombre
inicio
presentar(op)
mientras (op <> 0) hacer
según_sea op hacer
1: escribir(“La media de la clase es ” + notaMedia(estudiante))
2: escribir(“Introduce un nombre”)
leer(nombre)
marca falso
i 1
repetir
si (comparar(estudiante[i].nombre, nombre) = verdadero) entonces
marca = verdadero
si_no
i i + 1
fin_si
hasta_que (i > 100) o (marca = verdadero)
si (marca = verdadero) entonces
escribir(“La nota de ” + nombre + “ es ” + estudiante[i].media)
si_no
escribir(“El alumno no existe”)
fin_si
fin_según
presentar(op)
fin_mientras
fin
68
Apuntes de algoritmos
c. Tenemos un array con la indicación de cada producto, stock, descripción y fecha. Hallar una opción que nos
sirva iterativamente para hacer pedidos de productos y que termina cuando pidamos el producto 0.
Por cada pedido se da el identificador de producto que se pide, y la cantidad de producto, y lo que nos dice
es si hay cantidad suficiente, respondiendo “Pedido suministrado” y actualizando el stock, y si el producto
solicitado no existe o no hay suficiente cantidad, mostrará un mensaje de error explicando la causa.
algoritmo ejemplo_8.7.c
tipo
registro : t_fecha
entero: dia
entero : mes
entero : año
fin_registro
registro : producto
entero : codigo
cadena : descripicion
entero : stock
t_fecha : fecha
fin_registro
array[1..10] de producto : lista
var
lista : prod
entero : codigo, cantidad, i
lógico : marca
inicio
escribir(“Introduce el código”)
leer(codigo)
escribir(“Introduce la cantidad”)
leer(cantidad)
mientras (codigo <> 0) hacer
i 1
69
Apuntes de algoritmos
marca falso
repetir
si (codigo = prod[i].codigo) entonces
marca verdadero
si_no
i i + 1
fin_si
hasta_que (marca = verdadero) o (i > 100)
si (marca = falso) entonces
escribir(“No existe el producto”)
sino
si (prod[i].stock < cantidad) entonces
escribir(“No hay cantidad suficiente”)
si_no
prod[i].stock prod[i].stock – cantidad
escribir(“pedido suministrado”)
fin_si
fin_si
fin_mientras
fin
8.8. Cadenas
a. Borrar de una cadena una subcadena que forma parte de ella. Dar la posición de inicio y final de la
subcadena que quiero borrar.
procedimiento borrar(E/S cadena : c; E entero : ini, fin)
var
entero : i, j
inicio
i ini
f fin + 1
mientras (c[f] <> ’$’) hacer
c[i] c[f]
i i + 1
fin_mientras
c[i] ‘$’
fin_procedimiento
70
Apuntes de algoritmos
c. Crear una función a la que se le pasa una cadena como parámetro y como resultado devuelve la longitud
de la misma.
entero función longitud(E cadena : c)
var
entero : l
inicio
l 0
mientras (c[L + 1] <> ‘$’) hacer
l l + 1
fin_mientras
devolver(l)
fin_procedimiento
d. Intercambiar la aparición de una subcadena dentro de una cadena, por otra subcadena. Para eso la primera
subcadena tiene que aparecer en la otra.
procedimiento intercambio(E/S cadena : c; E cadena : c2, c3)
var
entero : i, pos
inicio
i 1
mientras (c1[i] <>’$’) hacer
si (c1[i] = c2[i]) entonces
pos buscar(c1, c2)
si (pos <> 0) entonces
borrar(c1, pos, pos + longitud(c2) - 1)
insertar(c1, c3, pos)
i pos + longitud(c3)
si_no
i i +1
fin_si
si_no
i I+1
fin_si
fin_mientras
fin_procedimiento
e. Comparar 2 cadena si son iguales o no. Realizar la comparación utilizando los valores ASCII asociados a
cada carácter. En el caso de que se comparen 2 cadenas de diferente longitud tal que la cadena de menor
longitud tiene N caracteres y estos N caracteres coinciden con los N primeros caracteres de la cadena más
larga, se considera mayor la cadena más larga.
entero función comparacion(E cadena c1, c2)
var
entero : i
inicio
i 1
mientras (c1[i] = c2[i]) y (c1[i] <> ‘$’) y (c2[i] <> ‘$’) hacer
i i + 1
fin_mientras
si (c1[i] = c2[i]) entonces
devolver(0)
si_no
devolver(ascii(c1[i]) - ascii(c2[i]))
fin_si
fin_función
71
Apuntes de algoritmos
f. Crear una función que dado 2 cadenas, busque si existe la cadena 1 dentro de la cadena 2.
entero función busqueda(E cadena : c, s1)
var
entero : i, pos, k
lógico : encontrado
inicio
e 1
encontrado falso
mientras (c[i] <> ’$’) y (encontrado = falso) hacer
si (c[i] = s[i]) entonces
pos i
k 1
mientras (c[i] = s[k]) y (c[i] <> ’$’) y (s[k] <> ’$’) hacer
i i + 1
k k + 1
fin_mientras
si (s[k] = ’$’) entonces
encontrado verdadero
si_no
i pos + 1
pos 0
fin_si
si_no
i i + 1
fin_si
fin_mientras
devolver(pos)
fin_función
g. Crear una función que extraiga parte de una cadena, sabiendo el inicio y el fin, e insertarlo de una segunda
cadena.
procedimiento subcadena(E cadena : c1; E entero : inicio, long; E/S cadena : c2)
var
entero : i, k
inicio
si (inicio <= 0) o (inicio > longitud(c1)) entonces
c2[1] ‘$’
si_no
i inicio
k 1
mientras (i <= inicio + long) y (c1[i] < > ‘$’) hacer
c2[k] c1[i]
k k + 1
i i + 1
fin_mientras
c2[k] ‘$’
fin_si
fin_procedimiento
72
Apuntes de algoritmos
clase rectángulo
// Atributos
var
privado real : largo, ancho
// Métodos
// Método constructor
constructor rectángulo(E real : lar, anc)
inicio
largo lar
ancho anc
fin_constructor
// Método que modifica el valor del atributo largo
público procedimiento modificarLargo(E real : lar)
inicio
largo lar
fin_procedimiento
// Método que retorna el valor del atributo largo
público real función mostrarLargo()
inicio
devolver(largo)
fin_función
// Método que modifica el valor del atributo ancho
público procedimiento modificarAncho(E real : anc)
inicio
ancho anc
fin_procedimiento
// Método que retorna el valor del atributo ancho
público real función mostrarAncho()
inicio
devolver(ancho)
fin_función
// Método que retorna el área o superficie ocupada por el rectángulo
público real función calcularÁrea()
inicio
devolver(largo * ancho)
fin_función
73
Apuntes de algoritmos
74
Apuntes de algoritmos
75
Apuntes de algoritmos
76
Apuntes de algoritmos
77
Apuntes de algoritmos
78
Apuntes de algoritmos
// Métodos
// Método constructor
constructor rectángulo(E entero : c, E real : lA, lB)
inicio
super(c)
ladoA lA
ladoB lB
fin_constructor
// Método que modifica el valor del atributo lado
público procedimiento modificarLadoA(E entero: lA)
inicio
ladoA lA
fin_procedimiento
// Método que retorna el valor del atributo ladoA
público real función mostrarLadoA()
inicio
devolver(ladoA)
fin_función
// Método que modifica el valor del atributo ladoB
público procedimiento modificarLadoB(E entero: lB)
inicio
ladoB lB
fin_procedimiento
// Método que retorna el valor del atributo ladoB
público real función mostrarLadoB()
inicio
devolver(ladoB)
fin_función
// Método que calcula el área del rectángulo
público real función calcularÁrea()
inicio
devolver(ladoA * ladoB)
fin_función
// Método que calcula el perímetro del rectángulo
público real función calcularPerímetro()
inicio
devolver(2 * (ladoA + ladoB))
fin_función
fin_clase
clase cubo hereda_de cuadrado
// Atributos
var
privado real : altura
// Métodos
// Método constructor
constructor cubo(E entero : c, E real : l, a)
inicio
super(c, l)
altura a
fin_constructor
79
Apuntes de algoritmos
80
Apuntes de algoritmos
Bibliografía
• Joyanes, L. (2007). Fundamentos de Programación - Algoritmos, Estructuras de Datos y Objetos.
Tercera Edición. Madrid, España: Mc Graw Hill.
• Joyanes, L. (2003). Libro de Problemas, Fundamentos de Programación - Algoritmos, Estructuras de
Datos y Objetos. Segunda Edición. Madrid, España: Mc Graw Hill.
• Joyanes, L. (2006). Programación en Pascal. Cuarta Edición. Madrid, España: Mc Graw Hill.
• Kimmel, P. (2007). Manual de UML. Primera Edición. Mc Graw Hill.
• Leestma, S. y Nyhoff, L. (2000). Programación en Pascal. Cuarta Edición. Madrid, España: Pretence Hall.
81