Vous êtes sur la page 1sur 9

UNIDAD I.

- CONCEPTOS BÁSICOS Y METOLOGÍA PARA LA SOLUCIÓN DE PROBLEMAS


COMPUTACIONALES

TIEMPO APROXIMADO: 12 Horas

OBJETIVO DE LA UNIDAD: Aplicar los conceptos básicos de los algoritmos en la solución de


problemas programables.

CONTENIDO
1.1 Definición de algoritmo
1.2 Características de los algoritmos
1.3 Tipos de algoritmos
1.4 Procesos e instrucciones
1.4.1 Procesos y su descripción
1.4.2 Variables
1.5 Especificación de un algoritmo
1.5.1 Predicados
1.5.2 Elementos de una especificación
1.6 Metodología para la solución de problemas
1.6.1 Definición del problema
1.6.2 Análisis de los datos
1.6.3 Diseño de la solución
1.6.4 Codificación
1.6.5 Prueba y depuración
1.6.6 Documentación
1.6.7 Mantenimiento
1.1 Definición de Algoritmo.

Concepto:
“Conjunto de pasos ordenados lógicamente y secuencialmente que nos permiten resolver
un problema determinado”.
“Es una secuencia finita de operaciones que resuelve un problema en un tiempo finito”.
“Un algoritmo es una secuencia precisa de operaciones (pasos) que resuelven un
problema en un tiempo finito”.

∃ Solución (problema) ⇔ ∃ ALGORITMO (Solución (problema))

Pasos para la resolución de un problema:

Los algoritmos son independientes del lenguaje de programación y del ordenador que los
ejecuta. Se pueden expresar en multitud de lenguajes y ejecutarse en ordenadores distintos.

“Un algoritmo es un conjunto finito de instrucciones precisas que realizan una tarea, la cual,
dado un estado inicial, culminará por arrojar un estado final reconocible.
Para definirlo en forma matemáticamente precisa, Alan Mathison Turing –famoso
matemático inglés (1912-1954), cuyas contribuciones en el campo de la matemática y de la teoría
de la computación le han valido ser considerado uno de los padres de la computación digital ideó
un dispositivo imaginario al que denominó máquina de computación lógica (LCM, Logical
Computing Machine), pero que ha recibido en su honor el nombre de máquina de Turing. Lo que
confiere a este supuesto dispositivo su extraordinaria importancia es que es capaz de resolver
cualquier problema matemático, a condición de que el mismo haya sido reducido a un algoritmo.
Por este motivo, se considera que algoritmo es cualquier conjunto de operaciones que pueda ser
ejecutado por la máquina de Turing (o, lo que es lo mismo, por un sistema Turing completo)”.

“Algoritmo. Es la representación en papel de una


serie de pasos organizados que describe el camino y las
operaciones que se deben seguir para dar solución a un
problema específico.
La palabra algoritmo se deriva de la degeneración de la
palabra árabe Al Jwarizmi, la cual es el pseudónimo de
Mohammed Ben Musa, matemático padre del álgebra y
astrónomo árabe que escribió un tratado sobre manipulación
de números y ecuaciones en el siglo IX”.

El origen del término "algoritmo" se remonta al siglo IX


y se le atribuye su invención al matemático árabe Abu Ja’far
Muhammad ibn Musa al-Khwarizmi (Figura 3).
Figura 3. Abu Ja’far Muhammad ibn Musa al-Khwarizmi, padre de los
algoritmos. La imagen corresponde a una estampilla de la ex Unión Soviética.
La palabra algoritmo se refería originalmente sólo a las reglas de la aritmética con números
arábigos. Recién en el siglo XVIII se expandió su significado para abarcar en su definición a toda
clase de procedimientos utilizados con el propósito de resolver problemas o realizar determinadas
tareas.

El primer caso de una algoritmo escrito para una computadora se considera que son las
notas escritas por Ada Byron en 1842 para el motor analítico de Charles Babbage. Por esta razón,
se considera a Ada Byron como la primera programadora de la historia. Sin embargo, dado que
Babbage nunca terminó su motor analítico, el algoritmo jamás llegó a implementarse.

1.2 Características de los Algoritmos.

◦ Un algoritmo debe ser preciso y tener un orden finito.


◦ Bien definido y legible.
◦ Debe ser finito.

◦ Finito: debe tener un número finito de pasos, por lo que debe estar limitado tanto en tiempo
de realización como por el número de pasos que realiza.
◦ Definido: para los mismos datos de entrada obtienen los mismos de salida
◦ Preciso: debe indicarse el orden de realización de cada paso Independiente del lenguaje
de programación

◦ a) Siempre debe terminar.


◦ b) Debe contener instrucciones concretas, sin ninguna ambigüedad.
◦ c) Todos sus pasos deben ser simples y tener un orden definido.
◦ d) Debe funcionar sean cuales sean los datos de entrada.
◦ e) Debe ser eficiente y rápido ---> Hay que Optimizar Para un problema existen múltiples
soluciones, y debemos escoger aquella que consuma menos tiempo y recursos.
◦ f) Es independiente de la máquina y del lenguaje de programación que se vaya a utilizar.
Un algoritmo puede implementarse (escribirse) en cualquier lenguaje de programación.

1.3 Tipos de Algoritmos.

Una forma de clasificar los algoritmos consiste en diferenciarlos por su metodología de


diseño. A continuación se presenta una síntesis de las metodologías más comunes, aplicables
cada una a diferentes clases de problemas:

• Fuerza bruta: los algoritmos de fuerza bruta resuelven el problema con la estrategia más obvia
de solución, que no siempre es la mejor según el número de operaciones que se requiere.

• Divide and conquer (divide y vencerás): esta metodología divide las instancias del problema a
resolver en instancias cada vez más pequeñas, usualmente en forma recursiva, hasta llegar a una
instancia en que el problema es resoluble en forma trivial o con unas pocas instrucciones. Los
algoritmos de búsqueda binaria son un ejemplo de la metodología divide and conquer (Figura 1).

Problema: buscar un elemento dado dentro de una lista ordenada


Elemento buscado: 15
Lista: 3 7 11 15 22 24 32 33 38 40
Solución: ir dividiendo sucesivamente la lista por la mitad, hasta encontrar
el dato buscado en el último o en el primer elemento de una de las mitades.

1er paso: 3 7 11 15 22 24 32 33 38 40
2do paso: 3 7 11 15 22
3er paso: 11 15 22
4to paso: 15 22
El algoritmo concluye al encontrar el dato buscado en el primer elemento de la lista, reducida
en el último paso a sólo dos elementos.

• Programación dinámica: cuando un problema presenta una subestructura óptima –o sea,


cuando la solución óptima de un problema se obtiene a partir de las soluciones óptimas de sus
subproblemas–, se encuentra la solución resolviendo primero los subproblemas más sencillos y
luego utilizando esas subsoluciones para resolver problemas incrementalmente difíciles. Por
ejemplo, si se tiene una serie de puntos (definidos por coordenadas x, y) que delimitan una región,
y se necesita saber si otro punto se encuentra dentro o fuera de esa región, una forma de resolver
el problema consiste en comenzar formando cuadrados con puntos contiguos, para luego formar
figuras cada vez más grandes y, por cada figura, determinar si el punto está dentro o fuera de ella
(Figura 2). En cada paso se aprovecha la información de los pasos anteriores, hasta que, al
completar todos los puntos, se obtiene el resultado del problema.

• Programación lineal: para resolver un problema utilizando programación lineal, se plantea una
serie de inecuaciones y luego se busca maximizar (o minimizar) las variables, respetando las
inecuaciones. Muchos problemas pueden plantearse en la forma de un conjunto de inecuaciones,
para luego resolverlos utilizando un algoritmo genérico, como por ejemplo, el denominado método
Simplex.

• Búsqueda y enumeración: muchos problemas (como por ejemplo, un juego de ajedrez) pueden
modelarse con grafos y resolverse a partir de un algoritmo de exploración del grafo. Tal algoritmo
especificará las reglas para moverse en el grafo en busca de la solución al problema. Esta
categoría incluye también algoritmos de back-tracking (vuelta atrás), los cuales van ensayando
distintos caminos con posibles soluciones y vuelven atrás cuando no las encuentran. Por ejemplo,
para encontrar la salida en un laberinto, cada vez que se llega al final de un camino se vuelve
atrás hasta la última bifurcación, para probar con las distintas alternativas de esa bifurcación.

• Algoritmos heurísticos: el propósito de estos algoritmos no es necesariamente encontrar una


solución final al problema, sino encontrar una solución aproximada cuando el tiempo o los recursos
necesarios para encontrar la solución perfecta son excesivos. Muchos sistemas antivirus utilizan
métodos heurísticos para detectar conductas de programas que podrían estar actuando en forma
maliciosa.

• Algoritmos voraces: seleccionan la opción de solución (solución local) que tenga un costo
menor en la etapa de solución en la que se encuentran, sin considerar si esa opción es parte de
una solución óptima para el problema completo (solución global).

1.4 Procesos e Instrucciones.


1.4.1 Procesos y su Descripción.

Un algoritmo consta de datos y de sentencias.

Datos--->Variables y constantes --->Son involucrados en expresiones.


Las sentencias describen las acciones que pueden ser ejecutadas, en general realizan
cálculos, entradas/salidas y control de flujo del algoritmo

Computadora: Es una máquina o herramienta que recibe datos de entrada, los almacena,
procesa, transforma y genera una información.
Es un dispositivo electrónico-mecánico capaz de ejecutar cálculos y tomar decisiones
lógicas a velocidades de millones y a veces miles de millones de instrucciones por
5
segundo . Toda computadora, tiene los siguientes elementos:

• Dispositivos de Entrada: Como su nombre lo indica, sirven para introducir datos

5 DEITEL H.M. / DEITEL P.J., “Como Programar en C/C++”, Ed. Prentice Hall, México
(información) en la computadora para su proceso. Los más usados son el teclado, ratón y
scanner.
• Dispositivos de Salida: Regresan los datos procesados que sirven de información
al usuario. Los más comunes son el monitor y la impresora.
• La Unidad Central de Procesamiento (CPU). Aunque generalmente al gabinete
se le denomina CPU, el CPU es el microprocesador de la computadora y es el encargado
de hacer todos los cálculos y operaciones. El CPU a su vez se divide en las siguientes
partes:
◦ Unidad de Control: Coordina las actividades de la computadora y determina que
operaciones se deben realizar y en que orden; así mismo controla todo el proceso de la
computadora.
◦ Unidad Aritmético - Lógica: Realiza operaciones aritméticas y lógicas, tales como
suma, resta, multiplicación, división y comparaciones.
• La Memoria. Es una parte de la computadora en donde se almacenan los datos a
procesar y la información resultante. Esta puede ser de dos tipos:
• Memoria Primaria: Es el espacio en que se almacenan los datos a procesar o
calcular en este momento.
• Memoria Secundaria: Es el espacio en el que se almacena la información
resultante para su futura consulta o manejo. Por ejemplo: disquetes, discos duros,
unidades de almacenamiento magnético (CD).

UNIDAD DE
CONTROL
C.P.U.

UNIDAD DE
DISPOSITIVOS DE DISPOSITIVOS DE
ENTRADA
ARITMÉTICA SALIDA
Y LÓGICA

MEMORIA

Ilustración 1. Diagrama que representa el funcionamiento de cualquier computadora 6.

Dato: Parte más pequeña de la información (Una variable, palabra, etc.). Representan
propiedades que describen cosas del mundo real, es una unidad abstracta que por sí sola
no tiene algún significado.

Información: Es un conjunto de datos que ya cobran significado.

6 TANENBAUM Andrew,“Organización De Computadoras, Un Enfoque Estructurado”, Ed. Prentice Hall, México


La computadora permite realizar tareas a través de procesos que requieren la
introducción de datos a través de sus dispositivos y generan información a través de los
dispositivos de salida. Gráficamente veríamos un esquema como el siguiente:

Entrada Proceso Salida


Dispositivos de Entrada CPU Dispositivos de Salida

1.4.2 Variables.

Elemento del algoritmo que posee un valor, conocido por un nombre o identificador
y que pertenece a un tipo de dato definido al inicio del algoritmo.
¡Debe ser declarada antes de usarse!
En un algoritmo la declaración consta de una sentencia que especifica: el tipo de
dato, su nombre y un valor inicial en algunas ocasiones.

 Zona de memoria referenciada por un nombre de variable, donde se puede


almacenar el valor de un dato, que puede cambiarse cuando lo deseemos.
 El nombre de la variable es elegido por el usuario.
 Una variable no es un dato, sino un área de memoria que contendrá un dato. El
computador asigna a cada variable una dirección de memoria.
 Aunque no es obligación en todos los lenguajes sí que es conveniente declarar las
variables en la cabecera del programa y naturalmente del algoritmo.
Es buena práctica de programación utilizar nombres de variables significativos que
sugieran lo que representan ya que eso hará los algoritmos y programas más legibles y
fáciles de comprender.

 Para que este perfectamente definida la variable, debemos especificar: su


nombre, el tipo de dato que contendrá (numérico, caracter, booleano).
 No podemos utilizar las palabras reservadas de un lenguaje para nombrar
variables (printf, scanf, if, for...).

Una variable es un objeto o partida de datos cuyo valor puede cambiar durante el
desarrollo del algoritmo por ejecución del programa.
Dependiendo del lenguaje hay diferentes tipos de variables tales como enteras,
reales, lógicas y de cadenas. Una variable que es de cierto tipo puede tomar únicamente
valores de ese tipo, por ejemplo, si son de caracter, únicamente tendrán valor de tipo
caracter.
A su vez, las variables se pueden clasificar por su uso en:

• Variables de Trabajo: Son aquellas que reciben el resultado de una operación


matemática compleja y que se usan normalmente dentro de un programa, pero si es del
tipo alfanumérico solo se utiliza para almacenar información. Ejemplo: promedio = ( 9 + 8 +
7)/3

• Contadores: Se utilizan para llevar el control del número de ocasiones en que se


realiza una operación o se cumple una condición. Con los incrementos generalmente de
uno en uno. Podríamos utilizarlos cuando necesitamos llevar el conteo del número de
personas que votaron por el PAN. Son exclusivamente del tipo entero.

• Acumuladores: Forma que toma una variable y que sirve para llevar la suma
acumulativa de una serie de valores que se van leyendo o calculando progresivamente.
Una variable de este tipo podríamos utilizarla para ir sumando poco a poco el monto total
de nuestra compra en un supermercado.
Nota. En estas variables (de hecho en todas), solo se actualiza el valor, no se almacenan
los valores previos.

• Variable indicador o de bandera: Es aquella que recibe uno de dos posibles


valores. Se les conoce también como BANDERAS y generalmente son del tipo booleano.
Nota. Todas las variables pueden recibir o modificar un valor anterior mediante el signo de
asignación, para lo cual deben de estar colocadas al lado izquierdo de este.

Constante: los elementos del algoritmo que no cambian de valor a lo largo del algoritmo.
Las constantes deben ser inicializadas de acuerdo con el tipo de dato al que pertenecen.
Toda posición de memoria, referenciada por un nombre de constante, donde se almacena
un valor que no puede cambiarse o permanece invariable a lo largo del proceso.

1.5 Especificación de un algoritmo

Para cualquier proceso computacional, el algoritmo correspondiente debe estar


rigurosamente definido, es decir, debe especificarse la forma en que se aplica a cada posible
circunstancia que pueda surgir. Todos los casos deben estar contemplados, y el criterio que
determina cada uno de ellos debe ser claro y computable.
En general, no existe un único algoritmo para cada problema que se quiere resolver. Diferentes
algoritmos pueden completar la misma tarea, requiriendo cada uno diferentes cantidades de
tiempo, espacio o esfuerzo. Sin embargo, la especificación puede ser exactamente la misma para
todos ellos.

1.5.1 Predicados

(No se ha investigado)

1.5.2 Elementos de una especificación

Para especificar un algoritmo de forma tal que su implementación sea correcta es


decir, que haga exactamente lo que se espera de él y que, a la vez, pueda implementarse
con diferentes lenguajes o herramientas, un método consiste en definir sus entradas y
salidas, con sus correspondientes precondiciones y poscondiciones.

A modo de ejemplo, veamos la especificación de un algoritmo que busca el máximo


número en una lista:
Algoritmo: BuscarMaximo

• Datos de entrada: una lista l de n elementos numéricos.


• Datos de salida: un número m.
• Precondiciones:
n es un número natural.
n es mayor que cero (o sea, la lista no puede estar vacía).
Todos los elementos de l son números racionales.
• Poscondiciones:
m es un número racional.
m es el mayor de los elementos de l.

Esta especificación define de manera inequívoca cómo debe funcionar nuestro


algoritmo. Sin embargo, por estar expresado en lenguaje natural –con toda su carga de
ambigüedades–, puede prestarse a confusiones (quizá no en este caso, porque es un
algoritmo muy simple, pero sí para casos más complejos). Por ese motivo, conviene
expresar las especificaciones en un lenguaje más riguroso, como por ejemplo, las
expresiones matemáticas usadas en el cálculo de predicados lógicos. Con tales
consideraciones, podemos expresar nuestro algoritmo en forma más precisa:
Algoritmo: BuscarMaximo
• Datos de entrada: l1... ln
• Datos de salida: m
• Precondiciones:
n∈ N
n>0
li ∈ Q ∀ 1 ≤ i ≤ n
• Poscondiciones:
m∈ Q
m ≥ li ∀ 1 ≤ i ≤ n

No cabe duda de que esta especificación es más rigurosa, aunque seguramente es


más difícil de entender para quien no domina esta clase de expresiones matemáticas.

1.6 Metodología para la solución de problemas

¿Qué es un programa?
Un programa es la expresión (transcripción) de un algoritmo en un lenguaje de
programación, capaz de ser procesado por un ordenador tras su compilación y linkado y que
controla el funcionamiento de un ordenador a la hora de resolver un problema.

ALGORITMO
+ PROGRAMA
LENGUAJE DE PROGRAMACIÓN

1.6.1 Definición del problema


1.6.2 Análisis de los datos
1.6.3 Diseño de la solución
1.6.4 Codificación
1.6.5 Prueba y depuración
1.6.6 Documentación
1.6.7 Mantenimiento

Cómo se construye un programa.


El proceso de elaboración de un programa, conlleva varias etapas:

Análisis
Diseño
Codificación
Pruebas

Documentación y
Mantenimiento

• Fase de Análisis: decidir qué es lo que tenemos que hacer.


• Fase de Diseño (desarrollo de la solución): se define cómo vamos a hacerlo.
-->Obtención del Algoritmo-->Se utilizará el Diseño Descendente o TOP-DOWN: Un
problema complejo se resuelve dividiendo el problema en subproblemas, y así
sucesivamente hasta que la resolución de cada subproblema sea fácilmente programable.
• Fase de Codificación: Implementación del Algoritmo en el lenguaje de programación
más adecuado-->Obtención del Programa
• Fase de Pruebas: No basta que el programa esté terminado-->Hay que comprobar que
el programa NO falla y funciona perfectamente en todos los casos posibles que se puedan
presentar.
• Fase de Documentación y Mantenimiento: Se elabora la documentación del programa,
y se realizan las actualizaciones oportunas que se vayan necesitando.

Vous aimerez peut-être aussi