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

Mdulo 1

Anlisis de
Algoritmos.
1.1- Introduccin.
El objetivo de la presente unidad es realizar una introduccin acerca de los
usos de los algoritmos para resolver problemas y poder utilizar los mismos
en los distintos casos de uso.

En esta unidad se presentarn los elementos esenciales que los


caracterizan, as como las reglas e instrucciones bsicas necesarias para
realizar los ejercicios pedidos. Se estudiarn sus caractersticas, anlisis
sobre el tiempo de ejecucin de los mismos, las distintitas notaciones (ej.
O-Grande), los problemas de las bsquedas estticas y las limitaciones.

Finalmente, tendremos varios ejemplos a fin de practicar los conceptos que


veremos en esta unidad.

Definicin de algoritmo.

Un algoritmo es un mtodo para resolver un problema. Es


un conjunto de instrucciones ordenadas que tienen un
tiempo de ejecucin y que para la cual consume una serie de
recursos identificados. Todo algoritmo tiene un punto de
inicio y un punto de terminacin, los cuales son nicos y
claramente identificables.
Todo algoritmo debe cumplir las siguientes caractersticas:

Ser preciso: esto significa que los pasos u operaciones del algoritmo
deben desarrollarse en un orden estricto.

Ser definido: el algoritmo se desarrolla como paso fundamental para


desarrollar un programa, el computador slo desarrollar las tareas
programadas, con los datos suministrados; no puede improvisar ni inventa
el dato que necesite para realizar un paso. Por ello, cuantas veces se
ejecute el algoritmo, el resultado depende estrictamente de los datos
suministrados, de hecho si se ejecuta con un mismo conjunto de datos de
entrada, el resultado ser siempre el mismo.

1
Ser finito: el nmero de pasos de un algoritmo, por grande y complicado
que sea el problema que soluciona, debe ser limitado. Todo algoritmo
incluye los pasos inicio y fin.

Presentacin formal: el algoritmo debe estar expresado en alguna de las


formas comnmente aceptadas. Las formas de presentacin de algoritmos
son, entre otras: el pseudocdigo, diagrama de flujo y diagramas de
Nassi/Schneiderman.

Correccin: el algoritmo debe satisfacer la necesidad o solucionar el


problema para el cual fue diseado. Para garantizar que el algoritmo logre
el objetivo, es necesario ponerlo a prueba; a esto se le llama verificacin o
prueba de escritorio.

Eficiencia: En cuanto menos recursos requiere ser ms eficiente el


algoritmo. Este concepto se aplica, entre otros puntos, las formas de
almacenar los datos, de leerlos, etc.

Ejemplos de algoritmos.
Supongamos que tenemos un problema en el auto, qu debemos hacer?

Debemos encontrar lo que anda mal (resolver el problema), para lo cual,


primeramente queremos ver qu puede hacer el auto y qu no puede
hacer (estado inicial).
ESTAR SEGUROS DE: Para ello hacemos diferentes operaciones, por ejemplo, damos arranque,
prendemos las luces (en varios casos aplicamos algunos golpes sobre el
Entender el problema motor).
Presentarlo de una Si estamos con un mecnico, nos preguntar si sentimos algo raro cuando
manera familiar al empez la falla, si cambiamos algo, etc.; intentar realizar algunos
usuario controles (aceite, presin de los cilindros, carga de la batera, etc.). Es
Obtener la decir, tanto nosotros como el mecnico, intentamos obtener datos que nos
aprobacin permitan llegar a un diagnstico, y finalmente saber la accin a seguir, el
tiempo de reparacin y el costo. Por lo que el algoritmo que realiz fue el
Prestar atencin a siguiente:
cualquier comentario
Recabar la informacin inicial.
En caso de cambios
volver a presentarlos al Diagnosticar (ejecutar el algoritmo)
usuario
Informar los resultados obtenidos.
Si tienen impacto en
Por ejemplo, el mismo concepto es aplicable a:
el plan de trabajo:
informarlo Instrucciones para montar una bicicleta.

2
Hacer una receta de cocina.

Obtener el rea de un tringulo.

En todos ellos es conveniente responder a las siguientes preguntas:

Qu entradas se requieren?

Cul es la salida deseada?

Qu mtodo produce la salida deseada?


Cmo puedo obtener la solucin deseada si mi error
est en el planteo del problema?

Diseo del Algoritmo.


Un algoritmo recibe datos de entrada y devuelve datos de salida.

Esta transformacin o generacin de nuevos datos se conoce como

procesamiento de la informacin

Para procesar la informacin, es muy importante tener desarrollados los


algoritmos pertinentes, pero veremos ms adelante que no son ellos solos
los en este procesamiento.

Los mtodos ms eficaces para el proceso de diseo se basan en el


conocido divide y vencers, es decir, la resolucin de un problema
complejo se realiza dividiendo el problema en sub-problemas y a
continuacin dividir estos sub-problemas en otros de nivel ms bajo o sea
ms simples, hasta que pueda ser implementada una solucin en la
computadora y as sucesivamente (de lo global a lo concreto); es lo que se
denomina diseo descendente (Top-Down design) o modular.

Una vez realizado un primer acercamiento al problema, ste se ha de


ampliar, (romper el problema en cada etapa y expresar cada paso en forma
ms detallada) lo que denominamos como refinamiento del algoritmo
(Stepwise Refinement).

Cada sub-problema es resuelto mediante un mdulo (sub-programa), que


tiene un solo punto de entrada y un solo punto de salida.

3
Cualquier programa bien diseado consta de un programa principal (el
mdulo de nivel ms alto) que llama a sub-programas (mdulos de nivel
ms bajo) que a su vez puede llamar a otros sub-programas.

Los programas estructurados de esta forma se dicen que tienen un diseo


modular y el mtodo de romper el programa en mdulos ms pequeos se
llama programacin modular.

Los mdulos pueden ser planeados, codificados, comprobados y depurados


independientemente (incluso por diferentes programadores) y a
continuacin combinarlos entre ellos.

El proceso implica la ejecucin de los siguientes pasos hasta que el


programa se termina:

1. Programar el mdulo.

2. Comprobar el mdulo.

3. Si es necesario, depurar el mdulo.

4. Combinar el mdulo con los mdulos anteriores.

El proceso que convierte los resultados del anlisis del problema en un


diseo modular, con refinamiento sucesivos que permitan una posterior
traduccin a un lenguaje, se denomina diseo del algoritmo.

El diseo del algoritmo es independiente del lenguaje de programacin en


el que se vaya a codificar posteriormente.

En todos los casos, durante el desarrollo de la materia, evitaremos


focalizarnos en un lenguaje y de igual manera todo ejemplo o ejercicio que
les pida deber ser resuelto con las instrucciones propias, que veamos
dentro de algoritmos. Por ejemplo: Resumiendo todo lo visto hasta ahora,
en diseo top-down, modular sera:

Es decir, que resolver un problema, implica la resolucin de tres sub-


problemas en el siguiente orden:

4
1. Anlisis del problema

2 Disear el algoritmo

3 Aplicar la solucin en la computadora.

Obviamente cada uno de estos sub-problemas pueden a su vez dividirse en


otros; por ejemplo:

Con lo cual vemos que el concepto de dividir un gran problema en


pequeos problemas, nos ayuda a:

Reducir la complejidad para el desarrollo

Facilitar la comprensin de la lgica de cada proceso

Cada proceso pasa a tener un objetivo nico

Cualquier cambio se aplica sobre el proceso especfico que maneja la


situacin afectada

Permite reducir los futuros costos de mantenimiento.

Permite entregas parciales que ayudan a reducir los tiempos totales.

DIFERENCIA:
CAMPO: estructura
definida en el algoritmo Tipos de Objetos.
y que servir para
realizar las operaciones Los algoritmos trabajan con datos de la realidad, esta informacin que
requeridas. recibe, deber procesarla, por lo cual puede generar nuevos datos a partir
de la informacin ingresada, transformar directamente lo que ingreso al
DATO: valor de la proceso y actualizar o informar a partir de las condiciones que le
informacin a manejar definamos.
dentro de mi algoritmo.
Esa relacin de comunicacin, ya sea de entrada al mismo o de salida
desde el algoritmo lo realiza mediante DATOS, que en nuestro proceso los
El valor del DATO se conocemos como CAMPOS.
mueve dentro de un
CAMPO

5
Podemos dar como primera definicin, que un CAMPO es el elemento que
nosotros identificamos mediante un nombre, por lo cual una de las
caractersticas fundamentales del CAMPO es su nombre; ese nombre que
declaramos es el que permite que el algoritmo lo identifique unvocamente
y que mediante el mismo lo utilizare en el proceso en las operaciones que
desarrollemos. Mientras que el DATO es el valor que ese campo tiene.

Ese valor lo puede obtener desde:

El exterior

Por modificaciones durante el proceso.

Por tal motivo consideramos al CAMPO como el nombre y lugar fsico en el


cual alojaremos el valor o DATO.

Cada DATO tiene una particularidad, y es justamente el tipo de informacin


que puede traer y por la cual a esa particularidad debemos definirla en el
CAMPO que lo va a contener. Por ejemplo, encontramos rpidamente dos
grandes divisiones:

caracteres alfabticos (a, b, D, J, *, /,=, 3, 5)

nmeros (1 2 4,5 -8 0,4),

Vemos que dentro de los caracteres alfabticos incluyo tambin nmeros;


esos nmeros que ingreso, ms adelante, los tomaremos como caracteres,
es decir, no podremos hacer operaciones matemticas con ellos.

Ahora los veamos un poco ms en profundidad y podremos distinguir una


divisin mayor en los tipos de objetos: Para esto vamos a hacer un pequeo
repaso de la clasificacin de los nmeros que vimos en las clases de
Matemtica.

El sistema numrico lo podemos clasificar de la siguiente forma:

Segn lo cual un nmero que utilicemos como tal, es decir que nos permita
usarlo en operaciones matemticas pude ser o bien un NMERO REAL o un
NMERO ENTERO.

Definiendo entonces como:

6
ENTERO: son slo nmeros enteros: 1, 0, 28, 30, 5, tambin los
enteros negativos (-1, -40, etc.), pero siempre sin decimales.

REAL: son los enteros ms los nmeros decimales (3/4, 0.45 , -8 , -


95.45 , etc.)

Ahora bien, tambin existen otros tipos de datos, como vimos antes, que
son los caracteres alfabticos, con la aclaracin de los nmeros que en caso
de ser definidos de esta manera no podemos usarlos para operaciones
matemticas.

Para nuestros algoritmos los definiremos como:

ALFANUMRICO: Un objeto que representa una cadena de


caracteres, que pueden ser letras o nmeros, en este caso los
nmeros se toman como caracteres, es decir que no tendrn un valor
numrico.

Por Ej.: SanMartin1554

CARCTER: Un carcter es cualquier smbolo que se representa en


forma de un solo smbolo.

Por Ej.: a; 2; !

Por lo que la diferencia entre un tipo de dato CARCTER y uno


ALFANUMRICO es que el primero es slo cuando se quiere indicar un
nico carcter.

Por ltimo tenemos un tipo de dato especial que es el LGICO, que lo


definimos como:

LGICO: Slo hay dos posibilidades, verdadero y falso, un valor


lgico es un valor de verdad. Pero siempre debe tener uno de esos
valores.

Por Ej.: eof / no eof (es el indicador de fin de archivo) (O est en eof o
est en no eof)

Adems los objetos pueden ser:

Constantes:

1. Normales:

a. Enteros

7
b. Reales

c. Alfanumricas

d. Carcter

e. Lgica

2. Figurativas:

a. Enteros

b. Reales

c. Alfanumrica

d. Carcter

e. Lgica

Variables

Constante (definicin): Un objeto de tipo constante es un valor cuyo


contenido no puede variar.

Podramos diferenciar:

Constante Normal: Valor constante expresado en si mismo. Por Ej.: Valor


numrico 128

Constante figurativas: Un nombre que de manera figurada simboliza un


valor constante que no cambia. Por Ej.: PI = 3,1416; en el que PI sera la
constante.

Variable (definicin): Lugar en la memoria que esta reservado, y que posee


un nombre, un tipo y un contenido. El valor de la variable puede cambiar y
puede ser modificado a lo largo del programa.

Al igual que las constantes pueden ser de tipo:

Enteros

Reales

Alfanumrica

Lgica

Carcter

8
La variable tiene un valor determinado, de forma que el tipo de variable,
debe de ser uno en concreto, por lo tanto el primer dato de la variable
condicionar los posteriores datos que almacenar despus.

La variable contiene tres cualidades:

- Nombre

- Tipo

- Valor

En el momento de declarar una variable deberemos definir el nombre y el


tipo, pero el valor podr declararse despus.

Para facilitar y recordar fcilmente qu valor tiene asignado cada variable,


sta deber tener un nombre acorde al valor que contenga.

Tambin podemos decir que las variables y constantes tienen un atributo


que es la longitud, o sea la cantidad mxima de caracteres o dgitos que
stas pueden contener.

Podemos adems asignarle un valor y este valor puede ser modificado a lo


largo de todo el procesamiento, por esta razn, se denominan Variables.

Ejemplo:

NROLEGAJO= 24779 Le estamos asignando a la variable NROLEGAJO el


Valor 24779

Descripcin del Tipo y Longitud

TIPO Ejemplos Defino como

Numrico, Entero 12500 entero

Numrico, Real 245.65 real

Lgico+Verdadero .V. lgico

Lgico+Falso .F. lgico

Carcter+alfabtico+nica A carcter
Carcter+alfabtico+cadena Anala alfanumrico

Por lo tanto, en el lenguaje de pseudocdigo podramos definir como


ejemplo las siguientes variables:

Cantidad: entero
Nombre: alfanumrico
Sueldo: real

9
Resumiendo

Podemos encontrar solamente 4 tipos de datos en nuestros ejercicios:

Real

Entero

Alfanumrico

Lgico

Expresiones.
Dentro de nuestros algoritmos podemos hacer una separacin, un tanto
parcial, diciendo que tendremos instrucciones y expresiones.

Veremos en este momento un poco ms en detalle las EXPRESIONES.

Ahora bien, a qu consideramos una expresin?

Podemos considerar como expresiones tanto una operacin matemtica


como un manejo de cadena de caracteres.

Expresiones de resultado nico

Mensaje = Muy Buenos Das

Suma = 4+8

CONSULTA: Qu tipo de dato le hubieras asignado a


Mensaje y Suma?

Expresiones de resultado variable

Sueldo = Bsico+Bsico*0.50

Nombre = Sr. ,S_nombre

En estos ejemplos, tanto el campo Bsico como el campo S_nombre, son


las variables

CONSULTA: Qu tipo de dato le hubieras asignado a


Sueldo y Nombre?
10
Ejemplo 1: si a la variable Bsico le corresponde el valor 500, la expresin
resultara

Sueldo = 500+500*0.50

Finalmente

Sueldo = 750

Ejemplo 2: si a la variable S_nombre le corresponde el valor Juan Perez,


la expresin resultara:

Nombre = Sr. ,S_nombre

Nombre = Sr. Juan Perez

Operaciones Fundamentales
Vamos a definir a continuacin estructuras que nos permitirn interactuar
con el ambiente y determinar la forma en que podemos resolver los
clculos matemticos y operaciones con caracteres.

Asignacin
La utilizamos cuando a un campo determinado le queremos mover un valor
especfico, ya sea producto de una operacin matemtica o no.

Cuando creamos una variable a travs de su definicin (Ej.: Cantidad,


entera), estamos reservando un lugar en memoria, pero no le estamos
pasando ningn valor; es lo que identificamos como el CAMPO. Ahora bien,
cuando le queremos dar un valor la operacin que usamos es la asignacin
y decimos que le estamos asignando un valor.

Por ejemplo al campo VARI, le movemos el valor que tiene el campo A, eso
quiere decir que a VARI le asigno el valor de A

Vari = A

Donde el signo = representa la asignacin

Ej.: Nombre=Ana

Esto significa que al campo NOMBRE, le asignamos el valor Ana.

La asignacin la representamos por el =, pero tambin podemos utilizar

11
Debemos tener especial cuidado de moverle a un campo, un tipo de dato
igual al que usamos para definir al campo, es decir, moveremos caracteres
a un campo definido como tal, y podremos mover nmeros a utilizar en
operaciones aritmticas si previamente al campo lo definimos como entero
o como real.

Operaciones Numricas
Las operaciones ms comunes son la de contar o la de acumular en un
campo. Para ello, se utilizan dos estructuras:

Acumuladores

Contadores.

Si bien son operaciones bsicamente similares, tiene pequeas


particularidades que las diferencian.

Acumuladores

Consiste en la operacin de ir acumulando cantidades variables dentro de


una misma variable.

Qu hago primero?: DEFINO LAS VARIABLES A UTILIZAR, por ejemplo:

Importe, entera

Acumulo, entera

Qu caractersticas tienen? QUE SIEMPRE DEBEN SER NUMRICAS, YA SEA


ENTERA (como en este caso) o REAL.

Si el campo el cual se acumula es REAL, tenemos que pensar que


seguramente el acumulador tambin deba ser REAL

Qu hago despus?, utilizo al campo ACUMULO (en este caso) como el


campo en la cual voy guardando la suma de todos los campos IMPORTE
que pasen por esta instruccin.

Acumulo = Acumulo + Importe

Cada vez que se pase por esta instruccin, se agregar al contenido de la


variable Acumulo el contenido de la variable Importe.

12
Ejemplo de esto, podra ser sumar las ventas de todo un da, donde en una
variable se acumulara los importes de todas las facturas. Ms adelante
pondremos en prctica ejemplos de este tipo.

Contadores

Consiste en la operacin de ir sumando cantidades constantes dentro de


una variable.

Cantidad, entera //Defino la variable a utilizar que debe ser de tipo


numrica

Cantidad = Cantidad + 1

Cada vez que el programa pase por esta instruccin incrementar en uno el
valor de Cantidad.

Como se puede apreciar, bsicamente ambas operaciones son similares, la


diferencia radica en que las primeras el valor se incrementa en forma
variable y en las segundas en forma constante.

Este tipo de variables se podra aplicar para determinar por ejemplo,


dentro de un conjunto de personas cuntas de ellas son del sexo femenino
y cuantas del sexo masculino.

Operaciones Alfabticas o alfanumricas


Estas operaciones son aquellas definidas para el manejo de caracteres.
Para resolverlas existe una jerarqua de operaciones a tener en cuenta:

Operacin

1. Parntesis

2. Funciones

3. Concatenacin

Funciones para el manejo de caracteres

A=LEN(Variable)

Esta funcin devuelve la cantidad de caracteres ocupados de una variable


alfabtica o alfanumrica, despreciando los caracteres en blanco del final.

Ejemplo:

13
A, alfanumrica

B, entera

A=Juan Perez

B=LEN(A) // El contenido de B es =10

Concatenacin de Cadena de Caracteres

La concatenacin puede ser definida como una suma de caracteres, pero


no una suma algebraica, sino como la unin de cadena de caracteres.

Ejemplo:

A=Juan, Perez da como resultado Juan Perez

En este caso a cada valor que quiero mover lo debo colocar entre por ser
caracteres (ese es el caso de Juan y de Perez),

Luego uno a ambos por medio de la ,

Si hubiera tenido la informacin de la siguiente manera:

A=Buenos

B=Das

C = A + B da como resultado Buenos Das

Operaciones de Entrada y Salida


El objetivo del proceso es tomar y validar la informacin de entrada luego
efectuar una transformacin de la misma segn las instrucciones que
previamente se le defini. Por tal motivo, debemos contar con operaciones
que establezcan la interfaz con el medio en que est inmerso el algoritmo
desarrollado.

Bsicamente cuando tomamos datos del ambiente para drselos a la


aplicacin estamos realizando una operacin de ENTRADA y cuando
devolvemos al ambiente los resultados obtenidos hacemos una operacin
de SALIDA.

Analicemos estas dos operaciones.

14
Entrada de Datos

El ingreso de datos desde un teclado lo vamos a realizar por medio de la


instruccin

INGRESAR

La estructura es la siguiente:

INGRESAR(variable)

INGRESAR (texto, variable)

Ejemplo

INGRESAR(Ingresar el valor : ,val)

En este caso:

Val es el campo donde el sistema asignara el valor ingresado desde la


pantalla.

Imaginamos que al usuario le aparecer algo similar a esto en la pantalla:

En el caso de ambas sentencias:

INGRESAR(variable)

INGRESAR (texto, variable)

Toman la informacin ingresada y la almacenan en una variable.

La diferencia entre ambas es que la segunda muestra un mensaje para


indicar al usuario que debe ingresar.

Nosotros, en la materia, utilizamos INGRESAR, cuando queremos asociar la


entrada de datos a un proceso de ingreso de informacin por pantalla.

15
Vale aclarar, que en este caso debemos preguntar al operador que ingresa
la info si quiere seguir ingresando ms informacin, como forma de saber
cundo termina el proceso; volveremos ms adelante con este tema al
referirnos a estructuras repetitivas y a sus clusulas de escape.

Tambin podemos utilizar otra instruccin para el ingreso de datos que es:

LEER

Su estructura es de la siguiente manera:

Leer(campo1,campo2,campon)

Entre parntesis, coloco el nombre de los campos que estar trayendo de


algn archivo existente.

Puedo colocar un campo o n campos, siempre que indique claramente a


cada uno por su nombre y separados por ,

En caso de no definir otra condicin, el fin del proceso se dar con el fin del
fichero, es decir cuando all ledo toda la info, eso se da por la condicin de
fin de archivo o:

Eof

Por lo que el campo eof, que es del tipo lgico o booleano, es quien me
avisa si tengo o no registros del archivo secuencial para seguir leyendo.

Cuando veamos las instrucciones del tipo repetitivas debemos recordar a


este campo como la clusula de escape de la misma, es decir la condicin
por la cual dejo de realizar el loop.

Salida de Datos

El egreso de datos, tanto por pantalla o por impresora, nos permite


informar el contenido de las variables, es decir informar sobre los
resultados obtenidos.

Para el caso que la salida fuera a una pantalla usaremos la instruccin:

MOSTRAR

En el caso que la salida fuera a una impresora usaremos la instruccin:

IMPRIMIR

Y en el caso que quisiramos como salida un archivo usaramos:

ESCRIBIR

16
La forma de las tres instrucciones es la misma, por lo que usar una como
ejemplo.

Si quisiera que apareciera la frase FIN DEL PROCESO, la instruccin sera:

Mostrar (FIN DE PROCESO)

Recordando el uso de las dado que es una salida de caracteres.

Si quiero que la salida indique una leyenda ms el valor de un campo que


genere durante el proceso, la forma de hacerlo es:

Mostrar (La cantidad de reg. ledos son: ,campo_cant)

Donde, al igual que el caso anterior escribo la leyenda entre

Luego con una como ( , ) separo a la leyenda del campo variable


campo_cant, que por ejemplo tiene un valor de 132

De ser as, quedara en la pantalla

La cantidad de reg. ledos son: 132

Un ejemplo completo: Confeccionar un algoritmo tal que dados 2 nmeros


enteros muestre su suma y su diferencia.

Atencin: ...dados 2 nmeros cualquiera... significa que nuestro


algoritmo tiene que servir para cualquier par de nmeros. Por lo tanto
tendremos que preguntarlos.

Formalicemos:

Ejercicio 1

Algoritmo Ejemplo
Var
NUM1,entera
NUM2,entera
SUMA, entera
RESTA, entera
Inicio
Ingresar(Ingrese un nmero, NUM1)
Ingresar(Ingrese otro nmero, NUM2)
SUMA=NUM1+NUM2
RESTA=NUM1-NUM2
Mostrar(La suma es:, SUMA)
Mostrar(La resta es:, RESTA)
Fin

17
Veamos en detalle el proceso de este algoritmo:

Realizaremos un ALGORITMO, al cual llamamos EJEMPLO

Al cual le definimos 4 campos enteros: NUM1, NUM2, SUMA y RESTA

Al momento de indicar INICIO, comienza la zona de procesamiento


propiamente dicha.

La informacin la obtenemos de una pantalla, por eso usamos la


instruccin INGRESAR.

Se ingresan 2 nmeros, que se guardan en los campos NUM1 y NUM2

Procedemos a realizar la operacin de suma de ambos nmeros y


colocamos el resultado en el campo SUMA.

Luego procedemos a restar los mismos valores y colocamos el resultado


de esta operacin en el campo RESTA.

Luego informamos por pantalla el resultado de ambas operaciones,


usando la instruccin MOSTRAR, y en pantalla aparecer la expresin entre
:

La suma es:

Y luego el valor que se obtuvo de la suma, el cual est en el campo SUMA

Debajo de ella aparecer la frase:

La resta es:

Seguida del valor resultante de la resta, la cual est en el campo RESTA.

Terminando el algoritmo con la sentencia FIN

Prueba de Escritorio
Este mtodo se utiliza para probar el algoritmo diseado, a fin de
corroborar que el mismo funciona y alcanza el objetivo deseado.

Debemos indicar en el papel el valor que toman las distintas variables del
proceso en cuestin y nosotros debemos actuar como la CPU que recorre
secuencialmente al algoritmo haciendo cumplir cada una de las
instrucciones y condiciones indicadas.

Para la prueba de escritorio debemos recordar que:

No debemos saltear ninguna instruccin, si no estamos totalmente


seguros de lo que hace

18
Indicar el valor en la hoja una vez que estamos seguros del mismo.

No asumir nada que no est indicado expresamente en el algoritmo.

Veremos a continuacin cmo quedara la misma para este programa:

Representacin de Algoritmos
Existen diversas formas de representar algoritmos; dentro de las ms
comunes se encuentran los diagramas de flujo y el pseudocdigo. Cada uno
tiene sus ventajas y desventajas, todo depende del gusto de la persona que
realiza el algoritmo.

Pseudocdigo

El pseudocdigo es una herramienta de programacin en la que las


instrucciones se escriben en palabras similares al espaol o ingls, que
facilitan tanto la escritura como la lectura de programas, y permite a quien
lo realiza concentrarse en las estructuras de control sin tener presente las
caractersticas propias de algn lenguaje en especial. En esencia se puede
definir como un lenguaje de especificaciones de algoritmos.

El pseudocdigo se encuentra a un solo paso de pasarse a un lenguaje de


programacin y es entendible, de igual forma que los diagramas de flujo, a
diferencia que no es grfico pero igual de comprensible.

Cuenta con palabras reservadas y la forma de su uso, y tiene una estructura


mnima que se debe respetar. Siempre la primera palabra debe ser:

Algoritmo:nombre

Seguida de : y el nombre que le definamos para el mismo.

Debe tener una sentencia nica de FIN, que indica la finalizacin del
proceso.

Diagramas de flujo

Tambin llamado ordinograma.

19
Esta tcnica muestra los algoritmos de una manera clara y comprensible.

Es una representacin grfica, es decir, se vale de diversos smbolos para


representar las ideas o acciones a desarrollar.

Los diagramas de flujo ayudan en la comprensin de la operacin de las


estructuras de control. Por ejemplo: el inicio y el fin del algoritmo se
representan con un smbolo elptico, las entradas y salidas con un
paralelogramo, las decisiones con un rombo, los procesos con un
rectngulo, etc.

Los smbolos utilizados han sido normalizados por el Instituto


Norteamericano de Normalizacin (ANSI) y algunos de ellos son:

Estructuras y acciones en un diagrama de flujo:

Definicin de variables:

Es obligatorio definir todas las variables que vayamos a utilizar


durante el programa, en el inicio del diagrama de flujo.

Cuando nuestro programa se ejecuta, a nuestros efectos la memoria


contendr informacin basura (informacin que estaba cargada en la
memoria antes de ejecutar nuestro programa).

Para definir una variable es imprescindible indicar cul ser su


nombre y su tipo, pudiendo asignar a esa variable su valor
posteriormente.

Asignacin de valores a variables:

Existen dos tipos de asignaciones:

20
- Directa: Asignar un valor directamente que ya conocamos a
priori.

- Indirecta: El valor de estas variables vendr dado una vez que se


ejecuta el programa, y se produzcan datos de entrada.

La accin de asignacin a una variable destruye cualquier valor inicial


de esa variable.

Declaracin de Expresiones numricas:

Definicin de expresin numrica: Dos o ms valores numricos


operados entre s aritmticamente. Ej.:

2x + y 7x

2x + 3y = 10

Los operadores aritmticos siguen una jerarqua de prioridad:

Asignacin directa de variables en un Diagrama de Flujo

Se representa con este smbolo:

< Variable > = <Expresin>

Expresin: Consiste en un valor o ms en el caso de que existan varios


valores operados entre s mediante operadores del tipo que sea.

La expresin que da el valor a una variable puede ser aritmtica,


alfanumrica y lgica.

Expresiones Aritmticas:

Uno o ms valores numricos operados entre s.

Una expresin puede constar de variables y constantes, utilizando los


operadores aritmticos:

Mdulo ( MOD )

Multiplicacin ( * )

Divisin ( / )

21
Suma ( + )

Resta ( - )

Estos operadores tienen un nivel de prioridad:

Mdulo Multiplicacin Divisin Suma Resta

El orden de evaluacin es de derecha a izquierda, resolviendo primero los


parntesis que tenga la expresin.

El operador Mdulo ( MOD ), hace un resto entre enteros, es decir de dos


nmeros enteros, los divide y nos da el resto de la divisin. Ej.:

7 MOD 3 = 1 Ya que el resto de dividir 7 entre 3 es 1.

Resolucin de operaciones aritmticas en trminos


matemticos
R = 18 3 * A + ( A MOD B C / 2 ) + A * A MOD 5
Siendo A = 5 B = 7 C =8
R= 18 3 * 5 + ( 5 MOD 7 8 / 2) + 5 * 5 MOD 5
R= 18 15 + ( 5 4) + 5 * 0
R= 3 + 1 + 0
R=4
R=BA+C*2+(C/21)+A*4*B4
Siendo A = 2 B = 3 C = 6
R = 3 2 + 6 * 2 + ( 6/2 1) + 2 * 4 * 3 4
R = 1 + 12 + 2 + 20
R= 35
Expresiones alfanumricas ( STRINGS ):

CADENA =(Pepe, Lpez) PepeLopez

Si queremos que en el resultado salga un espacio en blanco, tendremos


que indicarlo en alguno de los dos literales, es decir:

CADENA =( Pepe ,Lpez) Pepe Lpez

Tambin puede haber expresiones de tipo lgico

Asignaciones indirectas por teclado de variables en un diagrama de flujo

Se representa con este smbolo:

22
El valor previo de la variable es destruido por el que se le asigna.

El valor de esta variable no viene dado por el programa sino por un


dispositivo de entrada.

Visualizacin por pantalla en un diagrama de flujo

Se representa con este smbolo:

Cada representacin, abarcar una lnea en la pantalla.

Podemos indicar uno o ms valores dentro del mismo smbolo.

No se pueden incluir expresiones dentro de este smbolo.

Otros tipos de variables

Variable Contador:

C=C+1

C=C+5

La variable contador aumenta de manera constante cada vez que se


ejecuta.

Variable Acumulador:

A=A+B

B es una variable que cambia de valor en cada pasada por esta instruccin,
por tanto cada vez que se ejecuta esta instruccin, la variable A aumenta
de manera NO constante.

Si B no cambiara de valor, A sera una variable contador.

23
Variable Bandera ( Flag):

Este tipo de variables muestran el estado del valor de la variable, por


ejemplo, si tenemos dos grupos de personas, preferentes o no preferentes,
podramos definir una variable de tipo Alfanumrico con el nombre de
Preferentes y darla un valor Si, con lo que estaramos declarando que las
personas son preferentes.

Este tipo de variables, no tienen por qu ser de tipo lgico, ya que pueden
indicar ms de un estado. Ej.:

Estado_civil = C (Casado)

V (Viudo)

S (Soltero)

En este caso una variable podra definirse como: significador de un estado


dentro de un algoritmo.

Estructuras
Existen tres estructuras bsicas:

Secuencial: es la manera natural de organizar las acciones.

Selectiva

Iterativa

Estructuras Selectivas
Posibilidad de tomar distintos caminos en la ejecucin de las acciones.

Podremos establecer caminos alternativos para la ejecucin.

Podemos distinguir tres tipos:

1. Selectiva simple

2. Selectiva doble

3. Selectiva mltiple (Se usa con poca frecuencia debido a su uso en


casos selectivos)

24
1. Selectiva Simple:

La estructura simple se representa de la siguiente forma:

Dentro del rombo se expresa una condicin lgica que se reduce a un valor
lgico, verdadero o falso.

Dentro del rectngulo se expresa una instruccin.

Las estructuras simples, a diferencia con las dobles, slo representan


instrucciones en la rama del SI (Verdadero).

Cmo sera su representacin en pseudocdigo? (en negritas indico las


palabras que forman a esta expresin)

si [condicin]
entonces
operacin
sino
fin si

Cuando estas estructuras se ejecutan, se evala una condicin, y si es


verdadera el flujo del algoritmo sigue por la rama del SI cumpliendo lo que
indique OPERACIN, si la condicin resulta ser falsa seguira por la rama
del NO, no haciendo ms que cerrar la condicin, es decir llegar al fin del
misma en FINSI, la cual termina con la condicin indicada primeramente.

Por lo cual puede surgir la pregunta de por qu debo indicar la opcin


SINO, cuando en realidad no hago nada por esa rama, es decir porque no
indico solamente:

25
si [condicin]
entonces
operacin
fin si

Dado que produce el mismo resultado que poner SINO sin colocar ninguna
operacin.

La respuesta es: s, es lo mismo, el problema es que debemos conocer y


haber practicado con algoritmos para saber que estamos armando
expresiones equivalentes y que no estamos obviando una condicin o
cerrando mal la instruccin S.

2. Selectiva Doble:

Es el mismo tipo de estructura que la simple, con la diferencia que en la


rama del NO, tambin se ejecuta una instruccin, esta estructura se
representa del siguiente modo:

La expresin en pseudocdigo ser:

si [condicin]
entonces
operacion 1
sino
operacion 2
fin si

26
Ejemplo:

Supongamos que deseamos determinar de dos nmeros enteros que se


ingresan, cul de ellos es el mayor?

A continuacin desarrollaremos el algoritmo para resolverlo. Luego


pondremos en prctica el ejemplo mediante la prueba de escritorio con
distintos valores para ambos nmeros, a fin de comprobar la eficiencia de
nuestro programa.

EJERCICIO 2

Algoritmo: prueba 1
VAR
A:ENTERA
B:ENTERA
INICIO
INGRESAR ( Ingrese un Nro., A)
INGRESAR (Ingrese otro Nro., B)
SI (A > B)
ENTONCES MOSTRAR( El mayor es , A)
SINO MOSTRAR( El mayor es , B)
FIN SI
FIN

Prueba de escritorio

3. Selectiva Mltiple:

Existen mltiples estructuras seguidas con distintos caminos alternativos


posibles. Se representara de la siguiente forma:

27
En pseudocdigo , su representacin sera:

Segn [variable] Hacer


valor 1 hacer
operacion 1
valor 2 hacer
operacion 2
valor 3 hacer
operacion 3
sino
operacion 4
finsegun

En este tipo de estructuras no puede haber instrucciones en la rama del


NO, salvo en la ltima rama, como se seala en el grfico.

Si tras chequear todas las condiciones dentro de los rombos, todas resultan
ser falsas, se ejecutara la instruccin que tiene asignada la ltima rama del
SINO, aunque tambin puede ocurrir que dicha rama no tenga asignada
ninguna instruccin, por lo que el programa seguira el flujo normal del
programa.

Si alguna de las condiciones resultara ser verdadera, se ejecutara la


instruccin correspondiente a su rama de SI, y despus saldra de la
estructura para seguir ejecutando el programa.

28
EJERCICIO 3

Supongamos que deseramos determinar la dosis de aspirina que debe


recibir un paciente de acuerdo a su edad.

Algoritmo: Administracin de aspirinas

VAR
Edad:entero
INICIO
INGRESAR ( edad del paciente, edad)
SEGUN (edad) HACER
Entre 0 y 5 aos hacer
MOSTRAR (No tomar aspirina)
Entre 6 y 10 aos hacer
MOSTRAR( tomar 1 aspirina)
Entre 11 y 60 aos hacer
MOSTRAR( tomar 2 aspirinas)
SINO IMPRIMIR (ERROR)
FIN SEGUN
FIN

Este algoritmo determina la dosis de aspirina que debe recibir un paciente


de acuerdo a su edad

Cmo funciona este algoritmo?

Pide por pantalla que se le indique la edad del paciente, por eso usamos la
instruccin INGRESAR.

Guarda el valor de la edad en el campo EDAD, definido como de tipo


ENTERO.

Luego SEGN la edad, informa por pantalla (porque usa la instruccin


MOSTRAR) una leyenda.

Vemos que cada opcin indica un rango posible de edad, dependiendo de


la edad informada le permite cumplir una de ellas.

Si por algn motivo hubiera ms de una condicin que pueda cumplir,


tomara slo la primera que aparece.

Si ninguna condicin se cumple, por ejemplo que la edad es mayor a 60


aos, entonces se activa la operacin que indico en la clusula SINO.

En esta clusula puede ser que no haga nada, pero no puedo dejar de
ponerla. Esto es debido a que si alguna condicin no estuviera
contemplada y faltara esta clusula provocara un error no esperado del
proceso, que es distinto a que si yo le indico al proceso que, en el caso que

29
deba cumplir la clusula SINO, imprima la leyenda ERROR, es decir puede
hacer una accin.

Cada vez que cumple una de las condiciones, al terminar la misma, se sita
en la sentencia inmediatamente posterior a la clusula FIN SEGN.

Prueba de escritorio

Ejemplos de manejo de estructuras de datos

A fin de avanzar con algunos ejemplos adelantaremos el concepto de


estructuras repetitivas que veremos en ms detalle ms adelante en este
unidad, las mismas existen porque muchas veces, no nos alcanza con lograr
bifurcar un camino, es decir, condicionar las secuencias de eventos a una o
varias condiciones.

Debemos tambin repetir las mismas operaciones, una cantidad controlada


de veces, y cuando se cumple una condicin terminar con esta repeticin.

Es decir hay una clusula de escape de esa repeticin.

Si no hubiera ninguna condicin de escape o la misma estuviera mal


condicionada podra provocar un loop infinito con errores no esperados.

Lo que veremos en este tem es justamente el concepto de repeticin o


loop, la condicin de escape de la misma, los puntos que debemos tener en
cuenta y las palabras que conforman a las instrucciones que podemos usar
en nuestros algoritmos.

EJEMPLO 1.

Para ver este tipo de estructura pensemos en el siguiente problema

Nos piden calcular el valor de la suma 1+2+3+4+......+100.

Por lo visto hasta ahora, podemos entender que:

Utilizaremos un CONTADOR, de los nmeros desde el 1 al 100

Y tambin un acumulador Suma para almacenar las sumas parciales

30
1, 1+2, 1+2+3, etc.

La representacin por Diagrama


Diagrama de Flujo del problema sera:

La representacin en pseudocdigo sera:

EJERCICIO 4

Algoritmo: Contarcien
Var
Contador: entero
Suma: entero
Inicio
Contador = 1.
Suma = 0.
Mientras (contador sea menor al nmero 100) Hacer
Suma = Contador
or + Suma
Contador = Contador + 1.
Fin mientras.
Mostrar(Suma)
Fin

Qu hicimos con este algoritmo?

31
1. Definimos dos campos, SUMA y CONTADOR como enteros.

2. Luego los INICIALIZAMOS, esto significa, que al comienzo del proceso


nos aseguramos los valores que ambos tienen.

3. Le asignamos un 1 al campo CONTADOR

4. Le asignamos un 0 al campo SUMA.

5. Luego, te presento una de las estructuras repetitivas que ms uso le


daremos, empieza con la palabra MIENTRAS y en negritas indico las
palabras a utilizar.

La sintaxis, en general, es:

MIENTRAS(condicin o clusula de escape) HACER

Operacion1

Operacin2

..

Operacin

Fin Mientras

El proceso ejecutar las operaciones que estn entre la clusula


MIENTRAS.HACER y la clusula FINMIENTRAS.

La repetir tantas veces, hasta que la condicin de escape se cumpla.

Al momento que esto ocurra, el proceso se dirigir a la instruccin que este


inmediatamente despus de la clusula FIN MIENTRAS.

En el caso del ejercicio hasta que contador llegue a 100.

Es muy importante que, en este tipo de clusulas, donde se basa en un


valor que es parte del propio proceso repetitivo, que el contador que
realice esta operacin este indicado y sea el mismo que nos referimos en la
clusula de escape.

Veamos en un ejercicio varios conceptos referidos a asignacin de datos.

Calcula la paga neta de un trabajador conociendo el nmero de horas


trabajadas, la tarifa horaria y el porcentaje de retenciones (obra social,
jubilacin, etc.).

Resolucin:

32
Se leern los valores de entrada, horas, tarifa, tasa. La salida estar
dada por los valores calculados como Pagabruta, Impuestos
(retenciones hechas) y Paganeta.

En pseudocdigo:

EJERCICIO 5

Algoritmo:Calcularpago
Var
Horas: entero
Tarifa: entero
Tasa: entero
Pagabruta: entero
Impuestos: entero
Paganeta:entero
Inicio
Pagabruta= 0
Impuestos = 0
Paganeta = 0
Ingresar(" Ingrese cantidad de horas", Horas)
Ingresar(" Ingrese Tarifa por hora", Tarifa)
Ingresar(" Ingrese Tasa de descuentos por impuestos", Tasa)
Pagabruta= Horas*Tarifa
Impuestos= Pagabruta*Tasa
Paganeta=Pagabruta-Impuestos
Imprimir(" La paga bruta ser de ", Pagabruta)
Imprimir(Impuestos)
Imprimir(Paganeta)
Fin

En Diagrama de flujo:

33
Analicemos los ejemplos:

El pseudocdigo pide que se ingrese los datos de entrada para la posible


ejecucin del algoritmo.

Ingresar texto, variable: Esta accin permite solicitar la informacin que


precisa, y lo almacena en la variable.

En lenguajes de programacin podemos encontrar esta accin asociada a


las instrucciones INPUT, ASK, etc.

Preguntar (Ingrese cantidad de horas trabajadas, Horas)

Input (Ingrese cantidad de horas trabajadas, Horas)

Ask (Ingrese cantidad de horas trabajadas, Horas)

34
Ahora bien, una vez solicitado un dato, en este caso las horas trabajadas,
se guarda para luego utilizarlo.

Estos datos ingresados pueden guardarse en constantes o variables,


dependiendo si ese valor es o no modificado por el logaritmo

Formalmente el significado de constante y variable es el mismo que


conocemos en Matemtica.

Llamaremos a la accin de almacenar el resultado de una expresin en una


variable asignacin.

Durante la ejecucin del algoritmo, se generarn nuevos datos que


necesitar almacenarlos en algn lado.

Estos datos pueden ser constantes (nmero, nombre, valores lgicos) o el


resultado de operaciones sobre constantes y variables que llamaremos
expresiones.

Definimos entonces una instruccin que nos permita guardar los nuevos
datos en una variable.

Muchas veces debemos leer un archivo hasta que el mismo se termine, es


decir sea fin de archivo (en ingles eof), esta condicin se comporta como
un campo lgico, es decir est en on o en off.

En nuestros algoritmos podemos preguntar por esta condicin y segn nos


indique decidir el proceso a seguir.

Almacenar

variable= expresin

Esta accin permite guardar en una variable el resultado de una expresin.

Ejemplo:

Almacenar Pagabruta= Horas*Tarifa

Hacer Pagabruta= Horas*Tarifa

O simplemente Pagabruta= Horas*Tarifa

El resultado de esta accin es asignar a la variable Pagabruta el resultado


de la expresin

Horas * Tarifa.

En el ejemplo 1 se utilizaron dos variables que se definen como variable


contadora y variable acumulativa.

Incrementar Contador en 1.

35
El cual lo expresamos en el lenguaje de algoritmos como:

Contador = Contador +1

El nuevo valor de Contador ser el valor anterior de l incrementado en 1.

Si contador tena almacenado el valor 3 entonces el nuevo valor ser 4.

Una vez incrementado el contador:

Sumar Contador a Suma

Expresara Suma = suma + contador

El nuevo valor de Suma ser el valor anterior de ella ms el valor


almacenado en Contador.

Para poder comunicar los resultados obtenidos, definiremos la siguiente


instruccin:

IMPRIMIR texto, variable: Esta accin permite informar el/los resultados


obtenidos.

En lenguajes de programacin podemos encontrar esta accin


representada por las instrucciones WRITE, PRINT, DISPLAY, OUTPUT, etc.

Imprimir(La paga neta es de , Paganeta) o

Imprimir(Paganeta)

Escribir(La paga neta es de , Paganeta) o

Escribir(Paganeta)

Mostrar(La paga neta es de , Paganeta) o

Mostrar (Paganeta)

Write (La paga neta es de , Paganeta) o

Write (Paganeta)

El resultado de esta accin es informar el valor almacenado en la variable


Paganeta

Otro ejemplo completo:

Confecciona un algoritmo tal que dados 2 nmeros cualquiera muestre su


suma y su diferencia.

36
Atencin: ...dados 2 nmeros cualquiera... significa que nuestro
algoritmo tiene que servir para cualquier par de nmeros.

EJERCICIO 6

Algoritmo ejemplo
Var
Suma:real
Resta:real
Inicio
Suma= 0
Resta = 0
Ingresar(Ingrese un nmero, NUM1)
Ingresar(Ingrese otro nmero, NUM2)
SUMA=NUM1+NUM2
RESTA=NUM1-NUM2
Escribir (La suma es:, SUMA)
Escribir (La resta es:, RESTA)
Fin
Nota:

Siempre comenzaremos colocando como ttulo Algoritmo y un nombre


que d idea de lo que va a hacerse dentro de l.

Cuando queremos que el usuario vea un texto, ese texto lo escribiremos


entre comillas.

Los nombres de las variables (identificadores) deben comenzar siempre


con una letra (aunque contengan algn carcter numrico) y no pueden
tener espacios en blanco.

Este deber estar relacionado con el contenido lgico que poseer, as


como en el ejemplo: Pagabruta es una variable que tendr el valor de la
Pagabruta del empleado.

Luego de la palabra ALGORITMO, va la zona de declaracin de variables y


constantes.

En nuestro ejemplo definimos dos campos, cada uno como real, pero
tambin podamos hacer lo mismo de la siguiente forma:

SUMA, RESTA:real

Colocamos todos los campos del mismo tipo


separados por coma y le asignamos el mismo tipo a
todos de una sola vez.

Luego de la zona de declaraciones y ante de la zona de proceso debe ir la


palabra Inicio o Comienzo

37
Al terminar el algoritmo escribimos Fin.

Indentacin

Veamos el siguiente ejemplo de escritura de un parte de un algoritmo:

inicio
leer(nombre_pieza,cantidad_de_piezas)
mientras(no sea eof) hacer
si (cantidad_de_piezas =0)
entonces imprimir(reponer : ,nombre_pieza)
sino
finsi
leer(nombre_pieza,cantidad_de_piezas)
fin mientras.
Fin

Pero a efectos de su proceso sera igual si lo hubiera escrito comenzando


todas las instrucciones en la misma columna, por ejemplo la columna 1, y
lo llamaremos a este FORMA_2, quedando en ese caso de la siguiente
manera:

inicio
leer(nombre_pieza,cantidad_de_piezas)
mientras(no sea eof) hacer
si (cantidad_de_piezas =0)
entonces imprimir(reponer : ,nombre_pieza)
sino
finsi
leer(nombre_pieza,cantidad_de_piezas)
fin mientras
fin

Como se ha mencionado, desde el punto de vista lgico del proceso,


cumplen la misma funcin tanto el FORMA_1 como el FORMA_2.

Pero, qu diferencia vemos entre ambos?

Que las instrucciones en FORMA_1 parecen que naturalmente quedan


encerradas en bloques de menor nivel, es decir nos resulta ms fcil
identificarlas al utilizar la INDENTACION.

Qu es Indentacin? Es un anglicismo (de la palabra inglesa indentation)


de uso comn en Informtica y significa mover un bloque de texto hacia la
derecha insertando espacios o tabuladores para separarlo del texto
adyacente, lo que en el mbito de la imprenta se ha denominado siempre
como sangrado o sangra.

38
En los lenguajes de Computacin, la indentacin se utiliza para mejorar la
legibilidad del cdigo por parte de los programadores, teniendo en cuenta
que raramente se consideran los espacios en blanco como sentencias de un
programa. Sin embargo, en ciertos lenguajes de programacin como
Haskell, Occa, y Python, la indentacin se utiliza para delimitar la
estructura del programa permitiendo establecer bloques de cdigo.

Son frecuentes discusiones entre programadores sobre cmo o dnde usar


la indentacin, si es mejor usar espacios en blanco o tabuladores, ya que
cada programador tiene su propio estilo. Vale aclarar que esta palabra no
est reconocida por la Real Academia de Lengua, y en su lugar se debera
usar SANGRADO, pero por el uso y costumbre que tiene en la jerga
informtica para nuestro curso la tomamos como vlida, por lo que
siempre debemos intentar identificar o marcar los bloques de instruccin
de esta manera, lo cual ayuda a la legibilidad del cdigo.

Estructuras Iterativas
Bien, ahora que profundizamos un poco ms en la forma en que
manejamos los datos, podemos ver en ms detalle las estructuras
repetitivas o iterativas.

Consisten en instrucciones que se van repetir de 0 a N (donde N es una


variable o una constante, depende del caso) veces.

No hay que confundir la idea de bucle con la idea de estructuras selectivas.

Tipos de estructuras iterativas:

REPETIR MIENTRAS

REPETIR HASTA

DESDE HASTA

1. Repetir Mientras:

Dentro del Rombo se usa una condicin. El bucle no tiene ramas (aunque
en la representacin pueda parecerlo), se produce una entrada de bucle o
una salida. Se representa de la siguiente forma:

39
Pseudocdigo:

...

mientras [condicin]
hacer

operacin

fin mientras

La condicin de un bucle siempre va a ser una condicin lgica que se


reducir a un valor lgico como Verdadero o Falso, de modo que si la
condicin resulta ser verdadera el bucle repite hasta que la condicin
resulte ser falsa, entonces el bucle se rompe y se vuelve al flujo normal del
programa.

Ejemplo:

Si empleramos este ciclo para determinar de un conjunto de personas,


cuntos son mayores de edad, cuntos no lo son, y establecer un promedio
de edades, utilizaremos una variable que controlar el ciclo para
determinar si se contina con la carga de individuos o se detiene la misma.

Observa cmo quedara desarrollado el algoritmo; slo representaremos la


zona de INICIO.

EJERCICIO 7

Inicio
Continua=S
MIENTRAS (Continua=S) hacer
INGRESAR (Ingresar Edad , EDAD)
SI (EDAD >= 21) ENTONCES
Mayores = Mayores + 1
SINO
Menores = Menores + 1
FIN SI
Suma = Suma + EDAD
INGRESAR (Continua S/N:, Continua)
FINMIENTRAS
Promedio=Suma/(Mayores+Menores)

40
MOSTRAR (La Cantidad de Personas Mayores de edad es ,
Mayores)
MOSTRAR (La Cantidad de Personas Menores de edad es ,
Menores)
MOSTRAR (El Promedio de edades es , Promedio)
FIN

Prueba de Escritorio

Repetir Hasta:

Pseudocdigo:
....
repetir operacin

hasta [condicin]

fin repetir

41
Pseudocdigo: Siendo el rectngulo una instruccin, y el rombo una condicin, la
... instruccin se repetir hasta que la condicin de un valor de FALSO,
Para entonces se romper la estructura y se volver al flujo del programa.
x(desde=1hasta10)hacer
Desde Hasta:
operacin
Caso particular. El nmero de repeticiones de una o ms instrucciones
vendr marcado por una variable de control. Se puede utilizar dentro de
fin mientras otra sentencia mayor por ejemplo la sentencia PARA ..HACER

Expresiones Condicionales
Son las expresiones que utilizamos en los rombos, para deducir si dichas
expresiones tienen un valor Verdadero o un valor falso.

Podemos distinguir dos tipos de expresiones condicionales:

EXPRESIONES DE RELACIN

EXPRESIONES LGICAS

Expresiones de Relacin:

En una expresin de relacin tenemos uno o ms valores operados por los


operadores correspondientes. Consiste en consecuencia en dos valores
operados entre s con un operador de relacin. Los operadores son:

> Mayor que

< Menor que

>= Mayor o igual que

<= Menor o igual que

= Igual que

<> Distinto que

Estos operadores, tambin pueden operar con caracteres (por medio de


cdigo ASCII). Ej. :

A < B Tendra un valor lgico de Verdadero pues el valor ASCII de A es


menor que el de B ( El cdigo ASCII est ordenado de acuerdo con el
abecedario.)

42
Una expresin relacional obtiene un valor lgico (VERDADERO O FALSO).

Expresiones Lgicas:

Vamos a tener valores lgicos operados por operadores lgicos. stos son:

NOT ( No )

AND ( Y )

OR ( O )

Operador NOT:

Operador que acta sobre un solo valor. Este operador tiene la cualidad de
invertir el valor lgico. Ej. :

NOT <Valor Lgico>

NOT VERDADERO ........... Tendra un valor FALSO

NOT FALSO....................... Tendra una valor VERDADERO

Operador AND:

La operacin AND vale VERDADERO cuando los dos valores son verdaderos,
de lo contrario vale FALSO. Ej. :

<Valor Lgico> AND <Valor Lgico>

Operador OR:

Es similar a AND en el sentido de que llevar un valor lgico a izquierda y


derecha, pero la diferencia estriba en que OR devuelve VERDADERO
cuando cualquiera de los dos valores es VERDADERO.

Los operadores relacionales tienen prioridad sobre los lgicos, siempre y


cuando ningn parntesis indique lo contrario. La prioridad de los
operadores lgicos es la siguiente:

1. NOT

2. AND

3. OR

Resumen grfico de los operadores lgicos:

43
Dado un nmero, imprimir o si es mayor o igual que 9 y 1 si es menor que
9.

EJERCICIO 8

Algoritmo Ej. A
var
NUM: entero
Inicio
Ingresar("Ingrese un nmero", NUM)
Si (NUM >= 9)
Entonces Mostrar("0")
Sino Mostrar ("1")
Fin si
Fin

Prueba de escritorio

Dado dos nmeros A y B, disear un algoritmo que conteste si A al


cuadrado ms el doble de B es mayor que 100.

Nota: En este ejercicio puede notar que la estructura de decisin a veces se


plantea sin el "sino" (pero nunca sin el "entonces") ya que puede ocurrir
que no se realice ninguna accin cuando la condicin planteada no se
cumpla.

EJERCICIO 9

Algoritmo Ej. B
var
A,B,RESUL:ENTERO
Inicio

44
Preguntar("Ingrese el nmero A", A)
Preguntar ("Ingrese el nmero B", B)
RESUL = A*A + 2 * B
Si (RESUL > 100) entonces
Mostrar ("El resultado es mayor que 100")
Fin si
Fin

Prueba de escritorio

Otro ejemplo:

Dada una caja con pelotas de color rojas, azules y blancas, contar cuntas
pelotas hay de cada color y determinar la cantidad total de pelotas que
existen en la caja.

En este ejemplo utilizaremos un ciclo incondicional, ya que no se aclaran la


cantidad de pelotas que existen dentro de la caja, y usaremos una
estructura de decisin mltiple para contar las pelotas por su color.

EJERCICIO 10

Algoritmo Ej. E
var
CONTINUA,cadena
CANTVERDES,ENTERO
CANTROJAS,ENTERO
CANTAZULES,ENTER
COLOR,cadena
Inicio
CONTINUA=S
Cantverdes= 0
Cantrojas= 0
Cantazules=0
Mientras (CONTINUA=S) hacer
Ingresar (Ingrese color de la pelota, COLOR)
Segn (COLOR) sea
Igual a Verde

45
CantVerdes= CantVerdes+1
Igual a Rojo
CantRojas= CantRojas+1
Igual a Azul
CantAzules= CantAzules+1
SINO IMPRIMIR(ERROR)
Fin segun
PREGUNTAR (Continua ingresando pelotas,CONTINUA)
Fin Mientras
Mostrar(La cantidad de pelotas verdes es de :,CantVerdes)
Mostrar (La cantidad de pelotas rojas es de :,CantRojas)
Mostrar (La cantidad de pelotas azules es de :,CantAzules)
FIN

Prueba de escritorio

Se realiza una encuesta entre 100 personas que votan por los candidatos A
o B. Se pide comunicar los porcentajes obtenidos por los candidatos.

EJERCICIO 11

Algoritmo f
Var
X,entera
VOTO,cadena
CANT_A,entera
CANT_B,entera
SUMA, entera
PORCE_A,real

46
PORCE_B,real
Inicio
Cant_a= 0
Cant_b=0
Para X (desde 1 hasta 100) hacer
Ingresar (Indique el candidato votado, VOTO)
Si (VOTO=A)
Entonces CANT_A= CAN_A+1
Sino CANT_B= CANT_B+1
Fin Si
Fin Para
SUMA=CANT_A+CANT_B
PORCE_A=(CANT_A*100)/SUMA
PORCE_B=(CANT_B*100)/SUMA
Mostrar (El % del candidato A fue ,PORCE_A)
Mostrar (El % del candidato B fue ,PORCE_B)
Fin

Prueba de escritorio (como el programa est pensado para 100, y es una


cantidad muy grande, tomamos una pequea muestra para ejemplificar).

Resumiendo
Hemos visto los conceptos de algoritmos, cmo se relacionan con los datos
y el uso de las instrucciones para poder operar con los mismos. Ahora
veremos una serie de ejercicios para utilizar los conceptos que hemos
visto:

47
Ejercicio 12:

Un algoritmo sirve para resolver un problema, para lo cual necesita


manejar datos: podras definir qu es un dato?

Ejercicio 13:

Hemos definido una serie de condiciones que debe cumplir un algoritmo,


podras indicarlas y detallar cada una?

Ejercicio 14:

Cada dato tiene una relacin con un tipo especfico de dato, cules son los
tipos de datos que hemos visto?

Ejercicio 15:

Existen instrucciones que nos permiten operar con los datos dentro de los
algoritmos, algunos de ellos necesitan clusulas de escape. Qu significa
esta clusula? Cundo se utiliza? Indica un ejemplo de la misma.

Ejercicio 16:

Tenemos un archivo secuencial que contiene 50 registros, donde cada


registro trae el nombre y apellido de un cliente distinto y un campo que
indica la cantidad de producto que ese cliente compr.

Arma un algoritmo que indique la cantidad total que nos compraron los
clientes y el nombre y apellido de aquellos clientes que compraron ms de
de 500 unidades del producto.

EJERCICIO 17:

Se conocen el precio y la cantidad de un producto.

Calcula: El importe total.

Si es menor que $100.- , informa PAGO EFECTIVO.

En caso contrario, informa TARJETA.

EJERCICIO 18:

Dadas las tres notas de un alumno, en una asignatura, informa su


calificacin final teniendo en cuenta que la misma es:

APROBADO si el promedio es mayor o igual que 7

REPROBADO si el promedio es menor que 7

EJERCICIO 19:

dem anterior pero la calificacin final es:

48
COMPENSA EN DICIEMBRE Y FEBRERO si el promedio es menor que 4

COMPENSA EN DICIEMBRE si el promedio est entre 4 y 6

APROBADO si el promedio es mayor o igual que 7

EJERCICIO 20:

Dados el nmero de varones y el de mujeres de un curso, calcula el total de


alumnos.

Si el total supera los 35 alumnos, informa CURSO NUMEROSO.

En caso contrario, calcula e informa lo que se deber pagar para realizar


una salida con todos, si cada alumno paga $7.-

EJERCICIO 21:

En un campeonato intercolegial se desea conocer la categora a la que


corresponde cada participante.

Se ingresa el nombre y la edad de cada uno de ellos.

El algoritmo termina cuando el nombre es igual a "ZZZ"

INFANTIL, para los menores de 11 aos

PUBER, entre los 11 y los 14 aos

JUVENIL, para los mayores de 14 aos

Informa nombre y categora.

EJERCICIO 22:

Al enunciado del problema anterior agrega:

En total participan 250 alumnos, informa:

a) Cuntos participantes hay en cada categora

b) Edad promedio de los participantes del campeonato.

(Vuelve a confeccionar el algoritmo con la informacin nueva).

EJERCICIO 23:

Dadas las tres notas de cada uno de los 30 alumnos de un curso, informe:

la calificacin final de cada uno

el promedio general del curso

49
el nmero de alumnos reprobados, teniendo en cuenta que la calificacin
final es:

o SOBRESALIENTE si el promedio es mayor o igual que 9

o MUY BUENO si el promedio es mayor o igual que 8 y menor que 9

o BUENO si el promedio es mayor o igual que 6 y menor que 8

o REGULAR si el promedio es mayor o igual que 4 y menor que 6

o REPROBADO si el promedio es menor que 4

EJERCICIO 24

Escribe un algoritmo que calcule y visualice

el ms grande,

el ms pequeo,

la media de N nmeros.

El valor N se solicitar al principio del programa y los nmeros sern


introducidos por el usuario.

EJERCICIO 25

Confecciona un algoritmo que muestre la tabla del dos.

EJERCICIO 26

Dado 2 productos A y B y 100 encuestados, cada encuestado puede elegir o


rechazar cualquiera de los productos. Se pide:

a) Cantidad de personas que aceptan ambos productos.

b) Cantidad de personas que aceptan el producto A y no el B.

c) Cantidad de personas que aceptan el producto B, pero no el A.

d) Cantidad de personas que rechazan los 2 productos.

50
1.2- Ejemplos de
tiempo de ejecucin de
algoritmos.
Clasificacin de algoritmos
Segn el comportamiento del algoritmo con sus datos de entrada podemos
clasificarlos como:

Algoritmo determinista: en cada paso del algoritmo se determina


de forma nica el siguiente paso.

Una forma de ver este tipo de algoritmo es considerarlo como una


mquina, la cual tiene distintos estados segn el momento de
ejecucin que consideremos, desde un estado inicial que
comienza con la entrada de datos y que provoca una ejecucin de la
secuencia de estados predeterminados, por lo cual podemos inferir
que en este tipo de algoritmos siempre obtendremos la misma
salida si partimos de los mismos datos y estados iniciales. Un
ejemplo de este tipo de algoritmo es el que vemos con las funciones
matemticas.

Algoritmo no determinista o probabilstico: deben decidir en cada


paso de la ejecucin entre varias alternativas y agotarlas todas
antes de encontrar la solucin, por lo cual en este tipo de algoritmo
tenemos que con la misma entrada ofrece muchos posibles
resultados, no permitiendo saber de antemano el resultado de un
algoritmo no determinista.

Caractersticas
Todo algoritmo tiene una serie de caractersticas, que impactan sobre su
eficiencia, la cual es dependiente de la forma y uso de una serie de
recursos.

La eficiencia es algo fundamental a considerar a la hora de implementarlos


en una mquina. Estos recursos son principalmente:

51
El tiempo: perodo transcurrido entre el inicio y la finalizacin del
algoritmo.

La memoria: la cantidad (la medida vara segn la mquina) que


necesita el algoritmo para su ejecucin.

Obviamente, la capacidad y el diseo de la mquina pueden afectar al


diseo del algoritmo.

Podemos detectar que un algoritmo puede ser ms eficiente que otro,


cuando requiera menos recursos (tiempo y memoria) al momento de su
ejecucin. Muchas veces pensamos que un algoritmo sencillo no es
eficiente, sin embargo por experiencia valoro mucho la sencillez, dado que
se trata de una caracterstica que permite reducir el tiempo de
mantenimiento, facilita su verificacin y prueba; por eso priorizamos la
sencillez sobre intentar hacer ms eficiente al mismo pero aumentando su
complejidad.

Como vimos, su eficiencia la medimos de acuerdo al uso del tiempo y


memoria, dos de los recursos que impactan en nuestro trabajo.

Ahora bien, podemos indicar que el tiempo de ejecucin depender de:

Los datos de entrada

El cdigo, su calidad y complejidad

La eficiencia del cdigo ejecutable, propiedad del compilador

Tipo de procesador donde se ejecuta el cdigo

Llamaremos N al nmero de datos de entrada al algoritmo; podemos tratar


a los recursos que utiliza el algoritmo como una funcin de N , f(N);
relacionando al tiempo de ejecucin con la funcin indicada, nos permite
obtener una relacin T(n).

Principio de Invarinza
Definicin del Principio de Invarianza

Dos implementaciones distintas de un mismo algoritmo t1(n) y


t2(n) no diferirn en su eficiencia en ms de alguna constante
multiplicativa
t1(n) <= c * t2(n)

52
c pertenece a los nmeros reales y n suficientemente grande.

El tiempo de ejecucin de cualquiera de las implementaciones est


acotado por un mltiplo constante del tiempo de ejecucin de la otra.

El Principio de Invarianza nos permite deducir que no existe una unidad


que se deba utilizar para expresar la eficiencia terica de un algoritmo.

- En su lugar, expresaremos solamente el tiempo requerido por el


algoritmo, salvo una constante multiplicativa.

- Por este principio, todas las implementaciones de un mismo algoritmo


tienen las mismas caractersticas, aunque la constante multiplicativa pueda
cambiar de una implementacin a otra.

Cmo medimos el tiempo de ejecucin de un algoritmo?:

Por medio de un elemento fsico (ej. Reloj)

Considerando las instrucciones a ejecutar y afectndolas por el tiempo de


ejecucin de cada una.

Tmin(n) = Mejor caso Ahora bien, como cada programa puede contener diferentes sentencias
condicionales, esto quiere decir que la dependencia del tiempo estar dada
Tmax(n)= Peor caso por las condiciones que indiquen los datos ingresados. Por lo que
entendemos que segn esas condiciones, con alguna combinacin de datos
T(n) = Valor promedio tendremos el tiempo mnimo de ejecucin, Tmin (N) y por otro lado
tendremos otra combinacin de datos dando por resultado el tiempo
mximo de ejecucin, Tmax (N)

De lo cual identificamos que:

Tmin(N) es el mejor caso que podramos obtener.

Tmax (N) es el peor caso que obtendramos.

Ahora bien, existirn una serie mayoritaria de casos que estarn entre
ambos extremos, definiendo un valor promedio o ms frecuente.

Tmin(N) <= T(N) <= Tmax (N)

Adems de los parmetros anteriores, tambin podemos ver que existen


algunos factores externos, como ser:

Calidad del cdigo que genera el compilador.

Velocidad de ejecucin del procesador

Si consideramos que es muy sencillo el cambio de compilador y que


prcticamente la velocidad de procesamiento se duplica ao a ao;
debemos realizar nuestro anlisis independizndonos de estos factores.

53
Otro factor es que en aquellos problemas chicos, el impacto de su tiempo
de ejecucin no es un factor crtico de los mismos.

1.3- Notacin O
El impacto se profundiza a medida que crecemos en el problema a
resolver, por lo cual consideraremos a N tendiendo a infinito.

En ese caso estaremos considerando su comportamiento asinttico.

Al momento de identificar diferentes relaciones entre funciones y recursos


podemos agrupar los comportamientos resultantes en familias de
funciones, dependiendo de su comportamiento asinttico y le
asignaremos un orden de complejidad, O.

La notacin O-grande no toma en cuenta los factores constantes, es decir,


ignora si se hace una mejor o peor implementacin del algoritmo, adems
de independizarlo de los datos de entrada del algoritmo.

Como utilidad de aplicar este concepto es encontrar un lmite superior del


tiempo de ejecucin, es decir, el peor caso.

Orden de Complejidad
Podemos decir que:

el tiempo de ejecucin del algoritmo es proporcional a una


de las siguientes funciones y adems cada jerarqua de
orden superior tiene a las inferiores como subconjuntos.
1- Algoritmos Polinomiales

N : tiempo de ejecucin lineal, el tiempo es directamente proporcional a


la cantidad de datos, ej. si N vale 100 tardar el doble que uno donde N
vale 50.

logN : complejidad logartmica, esto puede suceder en algoritmos con


iteracin o recursin no estructural, ejemplo: bsquedas binarias.

54
N-logN : complejidad cuasi-lineal, el tiempo de ejecucin es N LogN. Si N
se duplica, el tiempo de ejecucin es ligeramente mayor del doble, un
ejemplo es el quicksort.

N2 : Complejidad cuadrtica. Suele ser habitual cuando se tratan pares de


elementos de datos, como por ejemplo un bucle anidado doble. Si N se
duplica, el tiempo de ejecucin aumenta cuatro veces.

N3 : Complejidad cbica. Como ejemplo se puede dar el de un bucle


anidado triple. Si N se duplica, el tiempo de ejecucin se multiplica por
ocho.

Nj : Complejidad polinmica (j>3). Al crecer la complejidad del programa


es bastante mala.

2- Algoritmo Exponencial

2N : Complejidad exponencial. No suelen ser muy tiles en la prctica por


el elevadsimo tiempo de ejecucin. Se dan en sub- programas recursivos
con dos o ms llamadas interna.

Relacin tamao/ tiempo de ejecucin


En la siguiente tabla se indica el tiempo de ejecucin para diferentes casos
y diferentes funciones de tiempo t(n).

Consideramos que cada unidad, de la funcin de tiempos del algoritmo,


tarda 1 microsegundo.

Como conclusin podemos decir que los algoritmos polinomiales son


buenos algoritmos.

Los algoritmos exponenciales son malos algoritmos.

Ahora veamos otro caso, en el cual definimos que cualquier tipo de


algoritmo requerir 1 hora en resolver un problema de complejidad N=100

55
Veamos qu ocurre si tenemos el doble de tiempo, es decir 2 horas o que
tenemos un procesador el doble de rpido y analicemos si adems
queremos resolver un problema de complejidad 2N

De esto tenemos la siguiente tabla comparativa de los casos planteados:

Vemos que los logaritmos de complejidad O(N) como O(N log N) tienen un
comportamiento directo entre el tiempo y los datos procesados, al crecer
al doble los datos lleva prcticamente al doble el tiempo de ejecucin.

Los algoritmos logartmicos vemos que en el doble de tiempo permiten


trabajar con una complejidad de datos mucho mayor que el doble y cuando
llevamos al doble los datos el tiempo de ejecucin crece en una proporcin
mucho menor.

En los algoritmos de tipo polinmicos el crecimiento del tiempo de


ejecucin a medida que aumenta los datos hace que en un momento el
orden del mismo hace imposible su utilizacin, sin poder precisar
claramente el lmite. Esto nos lleva a ver porque los programadores
trabajan con algoritmos de complejidad lineal, en algunos casos al poder
aplicar complejidad logartmica permite mejorar en mucho la eficiencia del
algoritmo y evitando la complejidad exponencial.

Conceptos a tener en cuenta


Un programa que se va a ejecutar muy pocas veces, hace que nuestro
foco debe estar en la codificacin y depuracin del algoritmo, donde la
complejidad no es el factor crtico a considerar.

Un programa que se utilizar por mucho tiempo, seguramente ser


mantenido por varias personas en el curso de su vida til, esto hace que los
factores que debemos considerar son los que se relacionan con su
legibilidad, incluso si la mejora de ella impacta en la complejidad de los
algoritmos empleados.

56
Un programa que nicamente va a trabajar con datos pequeos (valores
bajos de N), el orden de complejidad del algoritmo que usemos suele ser
irrelevante, pudiendo llegar a ser incluso contraproducente.

Un programa de baja complejidad en cuanto a tiempo de ejecucin, suele


demandar un alto consumo de memoria; y viceversa. Esto es una situacin
que debemos evaluar y entender como impactan ambos factores.

Un programa orientado al clculo numrico hace que debamos tener en


cuenta ms factores que su complejidad o incluso su tiempo de ejecucin;
en estos casos debemos considerar la precisin del clculo, el mximo
error introducido en clculos intermedios, la estabilidad del algoritmo, etc.

Clculo de la complejidad
Los algoritmos bien estructurados combinan las sentencias de alguna de las
formas siguientes:

1. sentencias sencillas

2. secuencia (;)

3. decisin (if)

4. bucles

5. llamadas a procedimientos

Sentencias sencillas

Son las indicadas al principio de esta unidad, como ser, entre otras:

Sentencias de asignacin

Entrada/salida

Las mismas, siempre y cuando no trabajen sobre variables estructuradas


cuyo tamao est relacionado con el tamao N del problema.

La inmensa mayora de las sentencias de un algoritmo requieren un tiempo


constante de ejecucin, siendo su complejidad O(1).

Secuencia (;)

La complejidad de una serie de elementos de un programa es del orden de


la suma de las complejidades individuales.

Decisin (si)

57
La condicin suele ser de O(1), complejidad a sumar con la peor posible,
bien en la rama ENTONCES, o bien en la rama SINO

En decisiones mltiples (SINO SI, SELECCIONAR), se tomar la peor de las


ramas.

Bucles

En los bucles con contador explcito, podemos distinguir dos casos:

Que el tamao N forme parte de los lmites.

Que el tamao N no forme parte de los lmites.

Si el bucle se realiza un nmero fijo de veces, independiente de N,


entonces la repeticin slo introduce una constante multiplicativa que
puede absorberse.

Llamadas a procedimientos

Su complejidad depende del contenido del procedimiento. Por ejemplo, el


clculo de la complejidad asociada a un procedimiento puede complicarse
notablemente si se trata de procedimientos recursivos.

El costo de llamar no es sino una constante que podemos obviar


inmediatamente dentro de nuestros anlisis asintticos.

Cota inferior, Notacin (Gran Omega)


Existe una notacin similar para indicar la mnima cantidad de recursos que
un algoritmo necesita para alguna clase de entrada.

La cota inferior de un algoritmo, denotada por el smbolo , pronunciado


Gran Omega u Omega, tiene la siguiente definicin:

T(n) est en el conjunto (g(n)), si existen dos constantes positivas c y n0


tales que |T(n)| c|g(n)| para todo n > n0.

Ejemplo: Si T(n)=c1n2+c2n para c1 y c2 > 0, entonces:

|c1n2+c2n| |c1 n2| c1|n2|

Por lo tanto, T(n) est en (n2).

58
Notacin (Big-Theta)
Cuando las cotas superior e inferior son la misma, indicamos esto usando la
notacin (big-Theta).

Se dice que un algoritmo es (h(n)), si est en O(h(n)) y est en (h(n)).

Por ejemplo, como un algoritmo de bsqueda secuencial est tanto en


O(n), como en (n) en el caso promedio, decimos que es (n) en el caso
promedio.

Dada una expresin aritmtica que describe los requerimientos de tiempo


para un algoritmo, las cotas inferior y superior siempre coinciden.

Reglas de simplificacin
Una vez que se determina la ecuacin del tiempo de ejecucin para un
algoritmo, es relativamente sencillo derivar las expresiones para: O-
grande, y .

Existen algunas reglas sencillas que nos permiten simplificar las


expresiones:

1. Si f(n) est en O(g(n)) y g(n) est en O(h(n)), entonces f(n) est en


O(h(n)).

Esta regla nos dice que si alguna funcin g(n) es una cota superior para una
funcin de costo, entonces cualquier cota superior para g(n), tambin es
una cota superior para la funcin de costo.

Nota: Hay una propiedad similar para la notacin y .

2. Si f(n) est en O(k g(n)) para cualquier constante k>0, entonces f(n) est
O(g(n))

El significado de la regla es que se puede ignorar cualquier constante


multiplicativa en las ecuaciones, cuando se use notacin de O-grande.

3. Si f1(n) est en O(g1(n)) y f2(n) est en O(g2(n)), entonces f1(n) + f2(n)


est en O(max(g1(n),g2(n))).

La regla expresa que dadas dos partes de un programa ejecutadas en


secuencia, slo se necesita considerar la parte ms cara.

4. Si f1(n) est en O(g1(n)) y f2(n) est en O(g2(n)), entonces f1(n)f2(n) est


en O(g1(n)g2(n)).

59
Esta regla se emplea para simplificar ciclos simples en programas. Si alguna
accin es repetida un cierto nmero de veces, y cada repeticin tiene el
mismo costo, entonces el costo total es el costo de la accin multiplicado
por el nmero de veces que la accin tuvo lugar.

Tomando las tres primeras reglas colectivamente, se pueden ignorar todas


las constantes y todos los trminos de orden inferior para determinar la
razn de crecimiento asinttico para cualquier funcin de costo, ya que los
trminos de orden superior pronto superan a los trminos de orden
inferior en su contribucin en el costo total, conforme n se vuelve grande.

Ejemplos de clculo del tiempo de ejecucin de un programa.

Veamos el anlisis de un simple enunciado de asignacin a una variable


entera:

a = b;

Como el enunciado de asignacin toma tiempo constante, est en (1).

Consideremos un simple ciclo for :

sum=0;

for(i=0; i<n; i++)

sum += n;

La primera lnea es (1). El ciclo for es repetido n veces.

La tercera lnea toma un tiempo constante tambin, por la regla de


simplificacin (4), el costo total por ejecutar las dos lneas que forman el
ciclo

for es (n). Por la regla (3), el costo por el entero fragmento de cdigo es
tambin (n).

Analicemos un fragmento de cdigo con varios ciclos for, algunos de los


cuales estn anidados.

sum=0;

for(j=0; j<n; j++)

for(i=0; i<j; i++)

sum++;

for(k=0; k<n; k++)

A[k]= k-1;

60
Este cdigo tiene tres partes:

Una asignacin, y dos ciclos.

La asignacin toma tiempo constante, llammosla c1.

El segundo ciclo es similar al ejemplo anterior y toma c2n= (n).

Analicemos ahora el primer ciclo, que es un doble ciclo anidado. En este


caso trabajemos de adentro hacia fuera.

La expresin sum++ requiere tiempo constante, llammosle c3.

Como el ciclo interno es ejecutado j veces, por la regla (4), tiene un costo
de c3j. El ciclo exterior es ejecutado n veces, pero cada vez el costo del
ciclo interior es diferente.

El costo total del ciclo es c3 veces la suma de los nmeros 1 a n, es decir

n i=1 j = n(n+1)/2, que es (n2).

Por la regla (3), (c1+c2n+c3n2) es simplemente (n2).

Comparemos el anlisis asinttico de los siguientes fragmentos de cdigo:

sum1=0;

for(i=0; i<n; i++)

for(j=0; j<n; j++)

sum1++;

sum2=0;

for(i=0; i<n; i++)

for(j=0; j<i; j++)

sum2++;

El primer fragmento de ejecuta el enunciado sum1++, precisamente n2


veces.

Por otra parte, el segundo fragmento de cdigo tiene un costo aproximado


de n2.

As ambos cdigos tienen un costo de (n2).

61
Resumiendo
Hemos visto los conceptos de eficiencia y los factores que inciden en el
mismo. Tambin identificamos distintas familias de algoritmos segn su
comportamiento. Conocimos que existen cotas o lmites en cada caso.

Describimos el concepto de O-Grande, como lmite superior y Gran Omega,


como lmite inferior. Pudimos ver cmo utilizar reglas de simplificacin
para obtener estos lmites.

Ahora bien, podemos evaluar si los conceptos vistos fueron claros,


intentando contestar, segn nuestro entendimiento, las siguientes
preguntas:

Ejercicio 27: cmo clasificaras a los algoritmos segn su comportamiento


dependiendo de sus datos de entrada?

Ejercicio 28: cmo describiras el concepto de eficiencia de un algoritmo?

Ejercicio 29: si tuviramos dos instalaciones del mismo algoritmo, existe


alguna relacin entre las diferencias de eficiencia de ambos?

Ejercicio 30: describe el concepto de O-Grande

Ejercicio 31: qu factores identificas para el clculo de la complejidad de


un algoritmo?

Ejercicio 32: qu significa Cota Inferior o Gran Omega?

1.4- Logaritmos.
Definiciones
Un algoritmo de un nmero, en una base dada, es el exponente al cual se
debe elevar la base para obtener dicho nmero

loga x = y => ay = x donde a>0 y a = 1

Identifiquemos ahora en este ejemplo los conceptos presentados en la


definicin:

62
a: es la base

y: es el exponente

x: es el nmero

Desarrollo
Ahora intentemos profundizar con los conceptos vistos anteriormente en el
tem referido a la NOTACIN O.

En este caso vale una aclaracin: si no lo indicamos tomamos como base a


2 para nuestros algoritmos.

Tomaremos un algoritmo de tipo logaritmo: O (N log N) y lo compararemos


con un algoritmo del tipo cuadrtico: O (N2), tomando como referencia
para ambos el algoritmo lneas O (N).

Podemos ver en el siguiente grafico cmo evolucionan diferente las dos


formas, en donde la logartmica tiene un comportamiento parecido a la
secuencial.

Comportamiento

El algoritmo logartmico
tiene un comportamiento
que lo asemeja al
logaritmo secuencial

63
Ahora apliquemos lo visto en algunos casos concretos:

DUPLICACIONES SUCESIVAS

Si partiendo del valor x= 1 quisiera llegar a x=n


cuntas duplicaciones sucesivas (K) debera
realizar?

La resolucin de este caso se basa en la ecuacin:

2k >= n

Lo cual implica que:

k = log n

Si por ejemplo quisiramos llegar a tener un n = 10000, la cantidad


duplicaciones necesarias seran de aprox. 13.

Ahora bien, veamos otro caso:

DIVISIONES REPETIDAS POR LA MITAD.

Partiendo de un valor n, cuntas divisiones


repetidas por las mitad se necesita para obtener n<=
1?

Similar al caso anterior la respuesta es:

log n

64
Si tomamos el siguiente ejemplo donde n=4

Aplicando logaritmos vemos que necesitamos dos divisiones para obtener


el resultado esperado, en este caso en el cual n = 1

1.5- Problema de la
bsqueda esttica
Definicin: Una de las aplicaciones naturales de una computadora es la realizacin
Una bsqueda esttica de bsquedas, generalmente sobre estructuras del tipo vectores.
accede a datos Si los datos que tenemos en la estructura no se pueden modificar, decimos
estticos que la bsqueda es esttica.

Obviamente entendemos que cuando realizamos una bsqueda y el vector


en el cual lo hacemos est ordenado, decimos que esa bsqueda es ms
eficiente a que si no estuviera ordenado.

Tipos de Bsquedas
Podemos identificar 2 tipos de bsquedas:

1. Interna: Cuando los elementos entre los que buscamos estn


almacenados en memoria (array).

2. Externa: Cuando los datos entre los que buscamos estn almacenados
en un dispositivo externo; en este caso la bsqueda se realiza a partir de un
determinado campo denominado campo clave.

En cualquier caso buscar un determinado elemento en un array o en un


archivo es encontrar la posicin del array o del archivo en que se encuentra
almacenado ese elemento, o bien, detectar que dicho elemento no
pertenece al array o a dicho archivo en el que se busca.

Los mtodos de bsqueda ms usuales son:

- secuencial o lineal

- binaria o dicotmica

65
- por transformacin de claves o HASHING

Bsqueda secuencial
Sea A un vector con N elementos, para localizar el valor del elemento
buscado dentro de A, se comparar dicho valor con los diferentes
miembros de A hasta encontrar el valor buscado o bien llegar hasta el final
del vector, en el caso de que el elemento no se encuentre en dicho vector.

EJERCICIO 33

Algoritmo SECUENCIAL
inicio
K 1
LUG 0
mientras ((K <= N) y (LUG=0)) hacer
si (A(k)=ELEMENTO)
entonces
LUG K
fin_si
K=K+1
fin_mientras
si (LUG=0)
entonces escribir(NO ENCONTRADO)
sino escribir( ELEMENTO ESTA EN,LUG)
fin_si
fin

Bsqueda secuencial con centinela


Es una mejora del anterior en cuanto a que evita que tengamos que estar
preguntando constantemente si hemos llegado al final del array.

El mtodo consiste en asignar el valor buscado a la posicin N+1 del array


siendo N el nmero de elementos del array, cuando acabemos si LUG que
es la variable que nos indica la posicin del elemento es igual a N+a
significar que el elemento no se encuentra en dicho array.

El inconveniente de este mtodo es que para poder aplicarlo el array tiene


que tener la capacidad suficiente para almacenar N+1 elementos.

Este mtodo se llama centinela, porque al elemento que metemos en la


posicin N+1 se llama as.

66
EJERCICIO 34

Algoritmo SECUENCIAL CENTINELA


Inicio
LUG 1
A(N+1) ELEMENTO
mientras (A(LUG) <> ELEMENTO) hacer
LUG LUG+1
fin_mientras
si (LUG=N+1)
entonces escribir( No encontrado)
fin_si
fin

Para calcular la complejidad, el nmero mximo de operaciones que se


realizan, nos fijamos en el peor caso (el elemento no est en el array o que
est en la ltima posicin).

Bsqueda binaria o dicotmica


El problema de la bsqueda secuencial es que cuando el nmero de
elementos es muy grande, el proceso de bsqueda se hace muy lento, por
eso vamos a ver este mtodo, que se basa en dividir el espacio de
bsqueda o array en sucesivas mitades hasta encontrar el elemento
buscado.

El inconveniente es que exige que el array est ordenado para poder


aplicarlo por ello el primer paso ser ordenarlo.

PASOS

Se compara el elemento buscado con el de la mitad de la lista y si no es


igual se decide en qu parte de la lista se seguir buscando.

EJERCICIO 35

Algoritmo BUSQUEDA_BINARIA
inicio
PRIN Li(1)
FINAL Ls(n)
MIT (PRIN+FINAL) DIV 2
mientras ((A(MIT) <> ELEMENTO) y (PRIN < FINAL)) hacer
si (ELEMENTO < A(MIT))
entonces FINAL MIT - 1
sino PRIN MIT + 1
fin_si

67
MIT (PRIN+FINAL) DIV 2
fin_mientras
si (PRIN > FINAL)
entonces escribir(No encontrado)
sino escribir(Esta en, MIT)
fin_si
fin

En el peor de los casos la complejidad sera aquella en la que el elemento


no estuviera en la lista o estuviera en la ltima mitad a analizar, por tanto,
como mximo har tantas comparaciones como el nmero de mitades
mximo en el que puedo dividir la lista.

Si N fuera el nmero mximo de elementos del array, K sera el nmero


mximo de comparaciones s

2 k = N + 1.

K = log 2 (N + 1)

El caso ms favorable sera aquel en el que slo tuviera que hacer una
comparacin, porque el elemento buscado coincidiese con la primera
mitad del array

A + log 2 (N + 1) = log 2 (N + 1)

2 2

Bsqueda por conversin de claves: HASHING


Para utilizar este mtodo tampoco hace falta que el array est ordenado
pero si exige que cada elemento del array tenga asociada una clave.

Entonces, dado un array de N posiciones y dado un elemento a buscar en


dicho array, se trata de convertir la clave de ese elemento a una de las N
posiciones del array y en esa posicin ser la que investigaremos si est o
no el elemento.

Esta bsqueda exige la existencia de una funcin de direccionamiento o


conversin de claves que establezca la correspondencia entre claves y
posiciones del array.

1<K<N

68
El inconveniente de este mtodo es que si el rango de claves es muy
grande no sera eficiente reservar espacio para todo el rango de claves (a
veces no sera ni posible). Teniendo en cuenta que cada elemento puede
tener cualquier clave del rango, si reservo menos posiciones de las que
tiene ese rango puede darse el caso de que a ms de un elemento la
funcin de conversin le haga corresponder la misma posicin en el array;
esto se conoce como colisin.

A cada una de las partes que colisionan se denominan SINNIMOS. La


funcin de conversin tiene que ser tal que produzca el mnimo nmero de
colisiones posibles.

Ejemplo de aplicacin de un mtodo de Hashing, pseudocdigo:

Se tiene un listado con los DNI de los alumnos que pueden estar entre el
nmero 20.000.000 y 22.000.000 y un nmero mximo de alumnos de 50.

Se tiene una variable denominada DNI que fue ingresada por pantalla.

Entonces, aplicando el mtodo de DIVISIN POR UN NMERO PRIMO:

50 + el 20 % = 50 * 1.2 = 60, nmero primo 59

1.6- Limitaciones del


anlisis O
En nuestro estudio hemos visto la importancia del anlisis teniendo en
cuenta los conceptos aprendidos, como la relacin que existe en la forma
de identificar a los algoritmos con enunciados matemticos. Pero tambin
debemos hacer notar que no hemos tenido en cuenta elementos como el
uso de la memoria, dado que en nuestros anlisis consideramos a la misma
como un recurso casi infinito.

Otro elemento que no consideramos en nuestros estudios es si los distintos


accesos que consideramos pertenecen a operaciones sobre la memoria o
sobre dispositivos externos como discos.

Otro elemento que produce un impacto es, en aquellos algoritmos


complejos, la influencia de las constantes que en nuestros casos no las
consideramos.

69
Se recomienda ampliar este punto consultando la
bibliografa bsica, tem 5.8

Qu hemos visto en esta unidad?


Una introduccin a la notacin de algoritmos.
Temas relacionados a la ejecucin de los algoritmos.
Analizamos el desenvolvimiento de los mismos utilizando la notacin O.
Cmo podemos utilizar el concepto de logaritmos en determinados
problemas.
Las bsquedas estticas, sus caractersticas y diferencias.
Y finalmente las limitaciones que debemos considerar al utilizar esta
metodologa.

Bibliografa Bsica
Weiss, M.A. (2000). Estructura de Datos en Java. Adisson Weasley.

Bibliografa Ampliatoria
Lage Fernando. (ao de edicin) Fundamentos de algoritmo y programacin.
Nueva Librera.

Ramirez Felipe. (2008) Introduccin a la programacin. Alfaomega.

Perez Berro. (ao de edicin) Algoritmo y Programacin. Nueva Librera.

R.C.T. Lee. (2007). Introduccin al diseo y anlisis de algoritmos. Mxico. Mc


Graw Hill.

Cairo B. (ao de edicin) Metodologa de la Programacin.Editorial.

Joyanes Aguilar. (2000). C. Algoritmos, programacin y estructuras de datos.


Editorial.

Perez Julio. (ao de edicin) Matemtica Discreta y Algoritmos. Editorial.

70
Joyanes Aguilar. (2005) Algoritmo y estructura de datos una perspectiva en C.
Mc Graw Hill.

www.uesiglo21.edu.ar

71

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