Está en la página 1de 12

ALGORITMOSY ESTRUCTURAS DE DATOS

APUNTES DE CATEDRA
UNIDAD 1
Resolución de problemas con computadoras
INTRODUCCION

El proceso de resolución de un problema en una computadora conduce a las escritura de un


programa y a la ejecución en la misma.
La principal razón para que las personas aprendan a programar en general y los lenguajes de
programación en particular es utilizar la computadora como una herramienta para la resolución de
problemas.
La computadora permite hacer tareas más eficiente, rápida y precisamente de lo que lo haríamos a
mano, si es que podemos hacerlo a mano.- Para utilizar esta poderosa herramienta, debemos
especificar exactamente que queremos hacer y en el orden en el que se debe hacerse.- Esto se hace
mediante la Programación, que es el proceso de planificar una secuencia de instrucciones que ha de
seguir una computadora.-
Aunque el proceso de diseñar un programa es -esencialmente- un proceso creativo, se puede
considerar una fase o pasos comunes, que generalmente deben de seguir todos los que trabajan
en el área de sistemas de información.
Esta definición de Programación deja muchas cosas sin decir.- Para escribir una secuencia de
instrucciones que ha de seguir una computadora debemos seguir cierto procedimiento.-
Este procedimiento, es decir, el proceso que se sigue desde el planteamiento de un problema,
hasta que se tiene la solución instalada en una computadora y lista para su ejecución, se compone de
varias fases agrupadas en dos bloques bien diferenciados: una etapa de Resolución de Problema
y Diseño del Programa, y una segunda etapa de Implementación y Puesta a Punto del
Programa.-

ETAPAS EN EL PROCESO DE SOLUCION DE PROBLEMAS CON COMPUTADORAS

Las fases de resolución de un problema con computadora son:

Resolución de

Unidad 1 – Resolución de Problemas con Computadoras


Problema y Diseño
del Programa

Análisis del
problema Diseño del algoritmo Codificación

Implementación y
Puesta a Punto del
Programa

Compilación y Verificación y
Mantenimiento Documentación
ejecución Depuración

1
ALGORITMOSY ESTRUCTURAS DE DATOS

Constituyen el ciclo de vida del software y sus características más sobresalientes son:

• Análisis. El problema se analiza teniendo presente la especificación de los requisitos dados por el cliente de la
empresa o por la persona que encarga el programa.
• Diseño. Una vez analizado el problema, se diseña una solución que conducirá a un algoritmo que resuelva el
problema.
• Codificación (implementación). La solución se escribe en la sintaxis del lenguaje de alto nivel (por ejemplo, C) y
se obtiene un programa fuente que se compila a continuación.
• Ejecución, verificación y depuración. El programa se ejecuta, se comprueba rigurosamente y se eliminan todos
los errores (denominados «bugs», en inglés) que puedan aparecer.
• Mantenimiento. El programa se actualiza y modifica, cada vez que sea necesario, de modo que se cumplan todas
las necesidades de cambio de sus usuarios.
• Documentación. Escritura de las diferentes fases del ciclo de vida del software, esencialmente el análisis, diseño
y codificación, unidos a manuales de usuario y de referencia, así como normas para el mantenimiento.

Las dos primeras fases conducen a un diseño detallado escrito en forma de algoritmo. Durante la tercera etapa
(codificación) se implementa el algoritmo en un código escrito en un lenguaje de programación, reflejando las
ideas desarrolladas en las fases de análisis y diseño.

Las fases de compilación y ejecución traducen y ejecutan el programa. En las fases de verificación y
depuración el programador busca errores de las etapas anteriores y los elimina. Comprobará que mientras
más tiempo se gaste en la fase de análisis y diseño, menos se gastará en la depuración del programa. Por
último, se debe realizar la documentación del programa.

Análisis del problema


La primera fase de la resolución de un problema con computadora es el análisis del problema.
Esta fase requiere una clara definición, donde se contemple exactamente lo que debe hacer el
programa y el resultado o solución deseada.
Dado que se busca una solución por computadora, se precisan especificaciones detalladas de entrada y salida.
Para poder identificar y definir bien un problema es conveniente responder a las siguientes preguntas:
• ¿Qué entradas se requieren? (tipo de datos con los cuales se trabaja y cantidad).
• ¿Cuál es la salida deseada? (tipo de datos de los resultados y cantidad).
• ¿Qué método produce la salida deseada?
• Requisitos o requerimientos adicionales y restricciones a la solución.

Unidad 1 – Resolución de Problemas con Computadoras


Diseño del algoritmo
En la etapa de análisis del proceso de programación se determina qué hará el programa. En la
etapa de diseño se determina cómo hará el programa, la tarea solicitada. Ello se realiza
mediante un algoritmo. Más adelante hablaremos de algoritmos.

Codificación
Es la escritura en un lenguaje de programación de la representación del algoritmo
desarrollada en las etapas precedentes. Dado que el diseño de un algoritmo es
independiente del lenguaje de programación utilizado para su implementación, el
código puede ser escrito con igual facilidad en un lenguaje o en otro.
Para realizar la conversión del algoritmo en programa se deben sustituir las palabras reservadas en
español por sus homónimos en inglés, y las operaciones/instrucciones indicadas en lenguaje natural
expresarlas en el lenguaje de programación correspondiente.

2
ALGORITMOSY ESTRUCTURAS DE DATOS

Compilación y ejecución de un programa


Una vez que el algoritmo se ha convertido en un programa fuente, es preciso
introducirlo en memoria mediante el teclado y almacenarlo posteriormente en un disco.
Esta operación se realiza con un programa editor.
Posteriormente el programa fuente se convierte en un archivo de programa que se
guarda (graba) en disco.
El programa fuente debe ser traducido a lenguaje máquina, este proceso se realiza con el compilador
y el sistema operativo que se encarga prácticamente de la compilación.
Si tras la compilación se presentan errores (errores de compilación) en el programa fuente, es preciso
volver a editar el programa, corregir los errores y compilar de nuevo. Este proceso se repite hasta que
no se producen errores, obteniéndose el programa objeto que todavía no es ejecutable directamente.
Suponiendo que no existen errores en el programa fuente, se debe instruir al sistema operativo para que
realice la fase de montaje o enlace (link), carga, del programa objeto con las bibliotecas del programa del
compilador. El proceso de montaje produce un programa ejecutable.
Cuando el programa ejecutable se ha creado, se puede ya ejecutar (correr o rodar) desde el sistema
operativo con sólo teclear su nombre o empelar el mouse. Suponiendo que no existen errores durante
la ejecución (llamados errores en tiempo de ejecución), se obtendrá la salida de resultados del
programa.

Mayormente conocido como Código Fuente, definimos como Programa Fuente a un texto o conjunto de líneas de texto
(líneas de código) que forman parte esencial de un programa informático, siendo entonces las instrucciones que debe
seguir un ordenador para poder realizar la ejecución de una orden determinada. Consiste básicamente en un texto con
las instrucciones en un Idioma (Lenguaje) de Programación, para que otro usuario pueda leerlo, interpretarlo, analizarlo
y realizar una modificación si así lo desea y tiene la autorización correspondiente.
En este Código se hace referencia entonces al funcionamiento general de una aplicación o una herramienta en particular,
pero en un idioma que es comprensible por el Programador mediante la utilización de un Lenguaje de
Programación determinado, que lleva sus propias reglas y excepciones.
Código Objeto, es justamente este último el responsable de que el ordenador pueda interpretar las acciones que se
ordenan y los comandos que han sido prefijados en este código, para poder ser ejecutados, interpretados y retransmitidos
por los componentes físicos de un ordenador (es decir, los Dispositivos de Hardware)
Para poder realizar esta interpretación es necesario contar con sistemas de traducción que son conocidos bajo los
nombres de Compiladores, Intérpretes o Ensambladores, entre otros sistemas de traducción, que son los encargados
de llevar estos lenguajes hacia un Sistema Binario de ceros y unos (es decir, transmisión o no-transmisión de la energía
eléctrica a través de los dispositivos electrónicos)
Actualmente también es considerado como Código Fuente al lenguaje en el que está escrito un sitio web o alguna de

Unidad 1 – Resolución de Problemas con Computadoras


sus Herramientas Web que estén presentes (por ejemplo, Javascript, HTML entre otros) para lo cual el intérprete de
dichas codificaciones será el software que es conocido por todos como Navegador Web.
Como la actividad de generar códigos fuentes, escribirlos es la Programación y es una actividad laboral rentada, existen
Licencias de Código Fuente que permiten regular si esta programación puede estar o no disponible para otros
Programadores, para poder realizar estudios sobre el mismo, modificaciones o bien utilizarlo para dar base a nuevos
proyectos y aplicaciones.
Es por ello que debemos diferenciar a cada Código Fuente en dos grandes grupos:
• Código Abierto: Permite a todos los usuarios la Lectura, Modificación y Redistribución del Código Fuente sin
que sean los autores originales, siempre y cuando no se esté en infracción con las condiciones y términos
por los cuales fue incluido en este grupo (establecido por distintas Licencias de Distribución)
En este grupo encontramos una gran cantidad de aplicaciones que llevan la denominación de Software Libre,
por las que lógicamente no se obtienen beneficios económicos.
• Código Cerrado: En este caso el código solamente está disponible para el Autor y para aquellos programadores a
quienes éste autorice previamente.
Sin el perjuicio de ello, debemos diferenciar que las aplicaciones de Código Abierto (también conocidas por su nombre
en inglés como Open Source) de aquellas que son Free Software, también conocidas como Freeware, ya que si bien en
ambos casos no se debe pagar por ellas, en estas últimas no siempre el Código Fuente está disponible para ser leído,
analizado o modificado.

3
ALGORITMOSY ESTRUCTURAS DE DATOS

En resumen, se denomina entornos de desarrollo a:


• Código fuente: Conjunto de sentencias entendibles por el programador que componen el
programa o una parte de ello. Suele estar almacenado en un fichero del tipo texto como los que se
pueden abrir por ejemplo, con el bloc de notas o Wordpad en los entornos Windows. El código fuente
estará escrito en un lenguaje de programación determinado, elegido por el programador, como pueden
ser: Pascal, C, C++, C#, Java, Perl, Python, PHP.
• Código objeto: Conjunto de instrucciones y datos escritos en un lenguaje que entiende el
ordenador directamente: binario o código máquina. Provienen de la traducción de cierto código fuente,
es un fragmento del programa final y es específico de la plataforma de ejecución.
• Código ejecutable: Reúne diferentes códigos u objetos generados por los programadores junto
con las “librerías de uso general” (propias del entorno o del lenguaje de programación) componiendo el
programa final. Este es el código que ejecutan los usuarios del sistema, y es específico para una
plataforma concreta: Windows, Linux, Mac OS, o cierto sistema Hardware.

Verificación y depuración de un programa


La verificación o compilación de un programa es el proceso de ejecución del
programa con una amplia variedad de datos de entrada, llamados datos de test o
prueba, que determinarán si el programa tiene errores («bugs»). Para realizar la
verificación se debe desarrollar una amplia gama de datos de test: valores normales
de entrada, valores extremos de entrada que comprueben los límites del programa y
valores de entrada que comprueben aspectos especiales del programa.
La depuración es el proceso de encontrar los errores del programa y corregir o eliminar dichos
errores.
Cuando se ejecuta un programa, se pueden producir tres tipos de errores:
1. Errores de compilación. Se producen normalmente por un uso incorrecto de las reglas del
lenguaje de programación y suelen ser errores de sintaxis. Si existe un error de sintaxis, la
computadora no puede comprender la instrucción, no se obtendrá el programa objeto y el
compilador imprimirá una lista de todos los errores encontrados durante la compilación.
2. Errores de ejecución. Estos errores se producen por instrucciones que la computadora puede
comprender pero no ejecutar. Ejemplos típicos son: división por cero y raíces cuadradas de
números negativos. En estos casos se detiene la ejecución del programa y se imprime un

Unidad 1 – Resolución de Problemas con Computadoras


mensaje de error.
3. Errores lógicos. Se producen en la lógica del programa y la fuente del error suele ser el
diseño del algoritmo. Estos errores son los más difíciles de detectar, ya que el programa puede
funcionar y no producir errores de compilación ni de ejecución, y sólo puede advertirse el error
por la obtención de resultados incorrectos. En este caso se debe volver a la fase de diseño del
algoritmo, modificar el algoritmo, cambiar el programa fuente y compilar y ejecutar una vez
más.

Documentación y mantenimiento
La documentación de un problema consta de las descripciones de los pasos a dar
en el proceso de resolución de dicho problema. La importancia de la
documentación debe ser destacada por su decisiva influencia en el producto final.
Programas pobremente documentados son difíciles de leer, más difíciles de
depurar y casi imposibles de mantener y modificar.
La documentación de un programa puede ser interna y externa. La documentación interna es la
contenida en líneas de comentarios. La documentación externa incluye análisis, diagramas de flujo

4
ALGORITMOSY ESTRUCTURAS DE DATOS

y/o pseudocódigos, manuales de usuario con instrucciones para ejecutar el programa y para interpretar
los resultados.
La documentación es vital cuando se desea corregir posibles errores futuros o bien cambiar el
programa.
Tales cambios se denominan mantenimiento del programa. Después de cada cambio la documentación
debe ser actualizada para facilitar cambios posteriores. Es práctica frecuente numerar las sucesivas
versiones de los programas 1.0, 1.1, 2.0, 2.1, etc. (Si los cambios introducidos son importantes, se
varía el primer dígito [1.0, 2.0,...], en caso de pequeños cambios sólo se varía el segundo dígito
[2.0,2.1…].)

ALGORITMO

Al estudiar Diseño, vamos a considerar el concepto y significado de la palabra algoritmo. La palabra


algoritmo se deriva de la traducción al latín de la palabra Alkhô-warîzmi, nombre de un
matemático y astrónomo árabe que escribió un tratado sobre manipulación de números y
ecuaciones en el siglo IX.

Un algoritmo es un método para resolver un problema mediante una serie de pasos


precisos, definidos y finitos.

Características de un algoritmo
• preciso (indica el orden de realización en cada paso),
• definido (si se sigue dos veces, obtiene el mismo resultado cada vez),
• finito (tiene fin; un número determinado de pasos).

También se puede definir algoritmo como un conjunto finito de instrucciones que especifican una secuencia
de operaciones a realizar en orden para resolver un problema específico. En otras palabras, es un método para
la resolución de problemas.

Si un algoritmo puede ser ejecutado por una computadora, se dice que es un algoritmo computacional; en
caso contrario, se dice que es un algoritmo no computacional. Según esto, el algoritmo de Euclides es un
algoritmo computacional; pero el algoritmo para instalar el equipo de sonido es un algoritmo no
computacional. Para que un algoritmo pueda ser ejecutado por una computadora se necesita expresar el

Unidad 1 – Resolución de Problemas con Computadoras


algoritmo en instrucciones comprensibles por la computadora, para esto se requiere de un determinado
lenguaje de programación. Al algoritmo expresado en un determinado lenguaje de programación, se lo
denomina programa. Puesto de otra manera, podemos decir que, un programa es la implementación o
expresión de un algoritmo en un determinado lenguaje de programación siguiendo las reglas establecidas por
el lenguaje elegido. En la Figura 1.1 que sigue se muestra la relación entre problema, algoritmo y programa.

Figura 1.1 Problema, algoritmo y programa


Todo algoritmo puede ser descompuesto en tres partes:
• Entrada de datos.
• Proceso.
• Salida de resultados

Un algoritmo debe producir un resultado en un tiempo finito. Los métodos que utilizan algoritmos se
denominan métodos algorítmicos, en oposición a los métodos que implican algún juicio o interpretación
que se denominan métodos heurísticos. Los métodos algorítmicos se pueden implementar en
computadoras; sin embargo, los procesos heurísticos no han sido convertidos fácilmente en las
5
ALGORITMOSY ESTRUCTURAS DE DATOS

computadoras. En los últimos años las técnicas de inteligencia artificial han hecho posible la implementación
del proceso heurístico en computadoras.
Ejemplos de algoritmos son: instrucciones para montar en una bicicleta, hacer una receta
de cocina, obtener el máximo común divisor de dos números, etc. Los algoritmos se
pueden expresar por fórmulas, diagramas de flujo o N-S y pseudocódigos. Esta última
representación es la más utilizada.

Usamos algoritmos todos los días. Son simplemente una descripción verbal o escrita de secuencias lógicas de
acción. Recetas de cocina, instrucciones para el lavado de ropas o para descongelar la heladera son ejemplos de
algoritmos escritos.
Cuando arrancamos un automóvil realizamos un procedimiento paso a paso. El algoritmo puede ser algo como
esto:
1) Poner la llave en el contacto
2) Asegurarse de que las marchas están en punto muerto
3) Presionar el pedal del acelerador
4) Girar la llave hasta la posición de “arranque”
5) Si el motor arranca antes de seis segundos, deja la llave en la posición “ignición”
6) Si el motor no arranca antes de 6 segundos, eperar diez segundos y repetir desde el
paso 3 al 6 (pero no más de 5 veces)
7) Si el coche no arranca, llamar al auxilio

Sin la frase “pero no más de 5 veces” en el paso 6, podrá suceder que nos quedáramos intentando arrancar el
automóvil para siempre, ¿ por qué ?, porque si algo falla en el auto, la repetición de los pasos 3 al 6 no hará que
arranque. Esta situación que nunca termina se conoce como bucle infinito. Por tanto si la frase “no más de 5 veces”
no se pone en el paso 6, nuestro algoritmo no cumple con nuestra defininicón de que un algoritmo debe terminar en
una cantidad finita de tiempo para cualquiera de las posibles condiciones.

Debemos resaltar que la restricción de “finitud” no es realmente lo bastante fuerte en la práctica; un algoritmo
debería requerir no sólo un número finito de pasos, sino un númeroo muy finito, un número razonable. Por ejemplo,
hay un algoritmo que determina si el juego de ajedrez representa o no la victoria para las piezas blancas; éste es un
algoritmo que puede resolver un problema de gran interés para miles de personas, sin embargo, sin lugar a dudas
nunca durante nuestra vida conoceremos la respuesta a este problema, ya que el algoritmo requiere lapsos de
tiempo fantásticamente inmensos para la ejecución, incluso siendo “finito”.

En la práctica, no solo queremos algoritmos, queremos buenos algoritmos en unn sentido estético débilemente

Unidad 1 – Resolución de Problemas con Computadoras


definido. Un criterio de bondad es el tiempo que toma la realización del algoritmo; esto puede ser expresado en
función del número de veces que se ejecuta cada paso. Otros criterios son la adpatabilidad del algoritmo a los
computadores, su simplicad y su elegancia.

A veces tendremos varios algoritmos para el mismo problema, y hemos de decidir cuál es el mejor. Esto nos
lleva al campo extremadamente interesante y muy importante del análisis algorítmico: dado un algoritmo el
problema es determinar sus características de realización. La idea general del Análisis de Algoritmos es tomar un
algoritmo en particular y determinar su comportamiento medio; en ocasiones también estudiamos si un algoritmo
es o no “óptimo” en determinado sentido.

6
ALGORITMOSY ESTRUCTURAS DE DATOS

Dominio de un algoritmo

Si el algoritmo no es general dentro de alguna clase de problemas, entonces es de poca


utilidad. Por lo tanto, un método para marcar el número telefónico 2200234 casi no
tiene valor para nadie, mientras que un método para marcar cualquier número será útil.
Por supuesto, debe haber alguna restricción a la generalidad de un algoritmo.
La clase o el conjunto de datos y las condiciones para las cuales un algoritmo trabaja
correctamente se llama dominio.
Cuando se trata de resolver cualquier problema es necesario definir el dominio del
algoritmo y después verificar que trabaja para todos los casos que se encuentran
dentro ese dominio. Es necesario incluir en el dominio todas las situaciones similares,
pero los casos remotos o poco probables se pueden omitir.

Errores en la construcción de un algoritmo: En los algoritmos se pueden presentar dos tipos de


errores.

Errores de Dominio. Errores de Lógica.


Se presentan cuando no se han especificado Son aquellos errores que se detectan después de
todas las situaciones que se pueden presentar en que se ha definido en forma adecuada el dominio
la práctica o se han descuidado la apreciación de de un algoritmo, en la etapa de prueba o
su importancia. Las pruebas más difíciles son verificación.
aquellas que verifican que ha seleccionado un
dominio correcto para el algoritmo. Se deben principalmente a las siguientes causas:
a) Etapas incorrectas
A medida que el problema se presenta se tiene b) Secuencia incorrecta de etapas
que clasificar y hay tres opciones:
A) Ignorarlo porque es improbable y quizás
nunca ocurra
B) restringir el dominio del algoritmo para
excluirlo
Unidad 1 – Resolución de Problemas con Computadoras
C) Corregir el algoritmo
El criterio de elección de un algoritmo debe hacerse en base a aspectos tales como:
• Que el algoritmo sea simple, es decir fácil de entender y escribir
• Que el algoritmo sea eficiente

Un algoritmo simple se traducirá en programas que serán fáciles de corregir y de seguir. En cambio, un algoritmo eficiente
hará un buen uso de los recursos de computadora. Desafortunadamente estos criterios, en general, suelen ir en sentidos
opuestos pues los programas eficientes suelen basarse en algoritmos complejos.

Técnicas para la formulación de algoritmos

Durante el proceso de diseño del algoritmo es preciso disponer de alguna herramienta para describirlo, se
necesita disponer de un lenguaje algorítmico con el que reflejar las sucesivas acciones que resuelven el
problema y que, además, soporte lo mejor posible el proceso sucesivo de refinamiento en subproblemas. Una
primera aproximación consistiría en utilizar para describir el algoritmo el lenguaje natural (en nuestro caso el
español), pero debido a los innumerables problemas que plantea como la imprecisión o la ambigüedad, se ha
optado por utilizar otras herramientas algorítmicas que describan con mayor exactitud la secuencia de acciones
y el orden en el que han de ejecutarse. La técnica del algoritmo nos permite analizar un problema en

7
ALGORITMOSY ESTRUCTURAS DE DATOS

forma global, pero esto no es suficiente, necesitamos herramientas que nos ayuden a analizar en detalle
las soluciones teniendo en cuenta que estas soluciones estarán orientadas a su uso en una computadora.

Las técnicas más utilizadas para la formulación de algoritmos son:


A. Diagramas de Flujo (Flowchart)
B. Pseudocódigo

A. Diagramas de Flujo
Los diagramas de flujo son una herramienta gráfica para descripción de
algoritmos. Un diagrama de flujo consta de una serie de símbolos estándar, que
representan las distintas acciones del algoritmo, conectados mediante líneas que
indican el orden en el cual deben realizarse las operaciones.
Un diagrama de flujo muestra la lógica del algoritmo, acentuando los pasos
individuales y sus interconexiones.

B. Pseudocódigo

Es un lenguaje de especificación de algoritmos: Mezcla de lenguaje de programación y español (o ingles o


cualquier otro idioma) que se emplea, dentro de la programación estructurada, para realizar el diseño de un
programa. El uso de tal lenguaje hace el paso de codificación final (esto es, la traducción a un lenguaje de
programación) relativamente fácil. Comúnmente se lo llama lenguaje de especificaciones de algoritmo. 1

El pseudocódigo Pseudocódigo = Pseudo (Supuesto) + Código (Instrucción), nació como un lenguaje similar
al lenguaje natural y era un medio para representar básicamente las estructuras de control de programación
estructurada. Se considera un primer borrador, dado que el pseudocódigo tiene que traducirse posteriormente a
un lenguaje de programación.

La ventaja del pseudocódigo es que en su uso en la planificación de un programa, el programador se puede


concentrar en la lógica y en las estructuras de control y no preocuparse de las reglas de un lenguaje específico.
Es también fácil modificar el pseudocódigo si se descubren errores o anomalías en la lógica del programa,
además de todo esto es fácil su traducción a lenguajes como Pascal, C o Basic.

Otras ventajas del pseudocódigo son:

Unidad 1 – Resolución de Problemas con Computadoras


1) Podemos centrarnos sobre la lógica del problema olvidándonos de la sintaxis de un lenguaje
concreto.
2) Es fácil modificar el algoritmo descrito.
3) Es fácil traducir directamente a cualquier lenguaje de programación el algoritmo obtenido

El principal inconveniente que presenta el uso del pseudocódigo como lenguaje de descripción de
algoritmos es la imprecisión.

Ejemplo: Veamos como se expresa en pseudocódigo la solución al problema del peso:


INICIO
LEER precioKg
LEER peso
LEER entregada

1
Para mayor ampliación sobre el pseudocódigo, puede consultar, entre otras, algunas de estas obras: Fundamentos de programación,
Luis Joyanes, 2.ª edición, 1997; Metodología de la programación, Luis Joyanes, 1986; Problemas de Metodología de la programación,
Luis Joyanes, 1991 (todas ellas publicadas en McGraw-Hill, Madrid), así como Introducción a la programación, de Clavel y Biondi.
Barcelona: Masson, 1987, o bien Introducción a la programación y a las estructuras de datos, de Braunstein y Groia. Buenos Aires:
Editorial Eudeba, 1986. Para una formación práctica puede consultar: Fundamentos de programación: Libro de problemas de Luis
Joyanes, Luis Rodríguez y Matilde Fernández en McGraw-Hill (Madrid, 1998).

8
ALGORITMOSY ESTRUCTURAS DE DATOS

precio ← peso x precioKg


devuelta ← entregada – precio
ESCRIBIR precio
ESCRIBIR devuelta
FIN

El pseudocódigo utiliza para representar las acciones sucesivas palabras reservadas (similares a sus homónimos en
los lenguajes de programación), tales como inicio, fin, si-entonces-sino, mientras, repita-hasta….etc

Ejemplo: calculo de la suma 2 + 4 + 6 + ... 998 + 1000:


INICIO
suma ← 0
índice ← 2
MIENTRAS indice <= 1000 HACER
suma ← suma + i
índice ← índice + 2
FIN MIENTRAS
ESCRIBIR suma
FIN
que también puede ser expresado del siguiente modo:
INICIO
suma ← 0
índice ← 2
REPETIR
suma ← suma + índice
índice ← índice + 2
HASTA i > 1000
ESCRIBIR suma
FIN

METODO HEURISTICO

Resolvemos problemas todos los días, pero normalmente ignoramos el proceso que estamos
siguiendo. En un entorno de aprendizaje usualmente estamos dando más información de la que necesitamos:
una definición clara del problema, la entrada dada y la salida requerida. En la vida real éste no es siempre el

Unidad 1 – Resolución de Problemas con Computadoras


caso; frecuentemente debemos llegar nosotros mismos a la definición del problema, decidir lo que tenemos
que hacer para trabajar con él y el resultado que debe dar.

Después de que hemos comprendido y analizado el problema, debemos llegar a una solución, un algoritmo, es
decir, una secuencia lógica ordenada que nos permita ejecutar una tarea particular y resolver un problema
determinado.
Aunque siempre trabajamos con algoritmos, la mayoría de nuestras experiencias con ellos consisten en
seguirlos, ejecutarlos, ya sea una receta de cocina, un juego que practicamos, un juguete que ensamblamos.

En la fase de resolución del problema, orientada a la programación de computadoras, se deben diseñar


algoritmos, no seguirlos. Planteado un problema, re requiere la obtención de un algoritmo, diseñar el conjunto
de pasos que han de realizarse para resolverlo. Realmente, hacemos este tipo de resolución de problemas
siempre a un nivel inconsciente. No escribimos, sin embargo, nuestras soluciones, las ejecutamos.

Para aprender a programar se deben hacer conscientemente algunas de las estrategias subyacentes de
resolución del problema, en orden a aplicarlas a los problemas de programación. Veamos algunas de estas
estrategias que usamos diariamente.

9
ALGORITMOSY ESTRUCTURAS DE DATOS

• Hacer Preguntas. Si nos dan verbalmente la tarea, hacemos preguntas hasta tener claro lo que se ha de hacer.
Preguntamos cuándo, por qué, dónde, hasta que la tarea esté completamente especificada. Si las instrucciones
están escritas, podemos poner preguntas en las márgenes, subrayar una palabra, agrupar palabras o sentencias, o
cualquier otra forma de indicar que la tarea no está clara. Quizás nuestras preguntas se respondan un párrafo
más adelante, o puede que tengamos que discutirla con la persona que nos ha dado la tarea.

Si la tarea nos la hemos puesto nosotros mismos, este tipo de preguntas puede que no sea verbal, pero tiene
lugar a un nivel subconsciente.

Algunas preguntas típicas que tendremos que hacer en un contexto de programación son las siguientes:

- ¿ Qué nos han dado para trabajar, es decir, cuáles son los datos ?
- ¿ Cuál es la apariencia de los datos ?
- ¿ Cuántos datos hay ?
- ¿ Cómo sabremos cuándo tendremos procesados todos los datos?
- ¿ Cuál debe ser la apariencia de la salida?
- ¿ Cuántas veces debemos repetir el proceso que estamos haciendo?
- ¿ Qué condiciones especiales de error pueden aparecer?

• Resolución por Analogía. Nunca debemos reinventar la rueda. Si existe una solución, la usamos.
Si hemos resuelto antes el mismo problema o uno parecido, solamente repetimos la solución.
No pensamos conscientemente, “he visto esto antes y sé como hacerlo”, nosotros la hacemos.
Los humanos son buenos para reconocer situaciones similares. No tenemos que aprender a cómo ir al
mercado a comprar leche, luego a comprar huevos, luego a comprar azúcar. Sabemos que ir al mercado
será para siempre lo mismos y lo único que varía es lo que se compra (Parametrización).

En informática veremos ciertos problemas muchas veces bajo diferentes aspectos. Un buen programador
verá inmediatamente una subtarea que ha sido resuelta antes y se conectará a la solución. Por ejemplo,
encontrar la temperatura diaria más alta y más baja es exactamente el mismo problema que encontrar la
mayor y la menor nota de un examen. Lo que se quiere son los números mayor y menor entre un conjunto
de números.

• Dividir para vencer. Constantemente dividimos un problema grande en unidades más pequeñas que
podemos manejar. La tarea de limpiar la casa o el departamento puede parece abrumadora. La tarea
compuesta de limpiar el salón, el comedor, la cocina, los dormitorios y los baños parece manejable. El

Unidad 1 – Resolución de Problemas con Computadoras


mismos principio se aplica a la programación. Dividimos un gran problema en partes más pequeñas, las
cuales pueden resolverse individualmente. De hecho, la metodología de diseño descendente para diseñar
algoritmos, se basa en este principio.

Estas estrategias son llamadas heurísticas, acorde a la siguiente definición:

HEURISTICO: Relativo a la aplicación de reglas empíricas, estrategias, artificios,


simplificaciones o cualquier otro recurso que limite drásticamente el espacio de búsqueda
de soluciones ante un problema con un amplio espacio de soluciones posibles. El método
heurístico no garantiza soluciones óptimas, sino que es útil si ofrece soluciones
satisfactorias.

Llegar a un procedimiento paso a paso para resolver un problema particular no es siempre seguro y preciso.
De hecho, normalmente es un proceso de prueba y error que necesita varios intentos y refinamientos, Cada
intento se prueba para ver si realmente resuelve el problema. Si lo hace, bien. Si no lo hace, se intenta de
nuevo.
Antes de escribir un programa para resolver un problema, debemos pasar por la fase de resolución del
problema y encontrar una solución general (algoritmo). Cuando hayamos comprobado a mano el algoritmo y

10
ALGORITMOSY ESTRUCTURAS DE DATOS

consideremos que la solución es correcta, podemos proceder a traducir el algoritmo a un lenguaje de programación.
Esta fase de implementación similar a la fase de resolución del problema en la que el programa (algoritmo) debe
probarse con los datos de entrada para ver si produce la salida deseada. Si no lo hace, debemos localizar los errores
que existan en el programa, Si el algoritmo es incorrecto, debemos volver a la fase de resolución del problema para
ver dónde nos equivocamos. Algunas veces podemos tener un algoritmo correcto, pero habernos equivocado al
traducirlo a un lenguaje de programación.

Ejemplos de algoritmos

PROBLEMA: Un estudiante se encuentra en su casa (durmiendo) y debe ir a la universidad (a


tomar la clase de Estructuras de Datos ¿qué debe hacer el estudiante? ALGORITMO:

Inicio
1. Dormir
2. haga 1 hasta que suene el despertador (o lo llame la
mamá).
3. Mirar la hora.
4. ¿Hay tiempo suficiente?
5. Si hay, entonces
6. Bañarse.
7. Vestirse.
8. Desayunar.
Sino,
9. Vestirse.
10. Cepillarse los dientes.
11. Despedirse
12. ¿Hay tiempo suficiente?
13. Si, Caminar hasta la universidad.
14. Sino, Correr
15.Mientras no llegue a la universidad haga paso 12
16. Entrar a la universidad.
Fin
ALGORITMO:
Inicio
PASO 1. Colocar los números el primero encima del segundo, de tal manera que las
unidades, decenas, centenas, etc., de los números queden alineadas. Trazar una
Qué hace

Unidad 1 – Resolución de Problemas con Computadoras


línea debajo del segundo número.
este PASO 2. Empezar por la columna más a la derecha.
algoritmo? PASO 3. Sumar los dígitos de dicha columna.
PASO 4. Si la suma es mayor a 9 anotar un 1 encima de la siguiente columna a la
izquierda y anotar debajo de la línea las unidades de la suma. Si no es mayor anotar
la suma debajo de la línea.
PASO 5. Si hay más columnas a la izquierda, pasar a la siguiente columna a la
izquierda y volver a 3.
PASO 6. El número debajo de la línea es la solución.
Fin

Si el problema es complejo se realiza un problema denominado refinamiento sucesivo. Refinamiento


sucesivo: proceso de romper el problema, dividiendo en subproblemas y a continuación dividiendo estos
subproblemas en otros de nivel más bajo, hasta que pueda ser implementada una solución en la computadora.

Este método se conoce técnicamente como diseño descendente (top-down) o modular.

Información para utilizar en los prácticos:

11
ALGORITMOSY ESTRUCTURAS DE DATOS

DATOS: Son medidas, valores o características que pueden ser manipulados y constituyen la materia
prima para producir la información, en otras palabras son el material sin procesar del que se extrae la
información.
Se denomina dato a cualquier objeto manipulable por la computadora. Un dato puede ser un carácter
leído de un teclado o información almacenada en la computadora.

Uso de los Datos

La información de que se dispone para procesar en la computadora consta de un conjunto determinado de


datos acerca del problema real, es decir, el conjunto que se considera relevante para el problema que se tiene
en la mano, aquel conjunto del cual se creen pueden derivarse los resultados.

El objetivo de un sistema de manejo de datos es hacer que éstos sean adaptables y flexibles para apoyar el
proceso de toma de decisiones de una organización. Mesclar mezclar

1. Los datos de representarse y almacenarse en cierta forma para accesarlos posteriormente.


2. Los datos deben organizarse de manera adecuada para acccesarlos en forma selectiva y
eficientemente
3. Los datos deben procesarse y presentarse de manera que puedan apoyar eficientemente al usuario
4. Los datos deben protegerse y manejarse para que no pierdan su valor

Una estructura de datos es una clase de datos caracterizada por la organización de los datos y las
operaciones definidas sobre ella.

Unidad 1 – Resolución de Problemas con Computadoras

12

También podría gustarte