El desarrollo de software es actualmente el eje que mueve las comunicaciones a nivel mundial. Los dispositivos móviles, tecnología popular, es posible gracias al diseño de aplicaciones bajo diversos sistemas operativos.
Estas aplicaciones cubren necesidades o resuelven problemas a usuarios de estas plataformas tecnológicas. Para diseñarlas, es importante desarrollar las habilidades necesarias. Para ello, debe iniciarse formalmente con el estudio y conocimiento básico de la resolución de problemas a través de computadoras de la siguiente manera:
Etapas en la Resolución de Problemas por Computadora
La resolución de problemas utilizando como herramienta una computadora no se resume únicamente en la escritura de un programa, sino que se trata de una tarea más compleja. El proceso abarca todos los aspectos que van desde interpretar las necesidades del usuario hasta verificar que la respuesta brindada es correcta. Las etapas son las siguientes:
Análisis del problema:
En esta etapa, se analiza el problema en su contexto del mundo real. Deben obtenerse los requerimientos del usuario. El resultado de este análisis es un modelo preciso del ambiente del problema y del objetivo a resolver. Dos componentes importantes de este modelo son los datos a utilizar y las transformaciones de los mismos que llevan al objetivo.
Diseño de una solución:
La resolución de un problema suele ser una tarea muy compleja para ser analizada como un todo. Este aspecto puede facilitarse mediante la identificación de las partes (subproblemas) que componen el problema y la manera en que se relacionan. Cada uno de estos subproblemas debe tener un objetivo específico, es decir, debe resolver una parte del problema original. La unión de todos los subproblemas es lo que permitirá obtener la solución buscada.
Especificación de algoritmos:
Cada uno de los subproblemas que componen la solución deben ser especificados a través de un algoritmo. Esta etapa busca obtener la secuencia de pasos a seguir para resolver el problema. La elección del algoritmo adecuado es fundamental para garantizar la eficiencia de la solución.
Escritura de programas:
Un algoritmo es una especificación simbólica que debe convertirse en un programa real sobre un lenguaje de programación concreto. A su vez, un programa escrito en un lenguaje de programación determinado (ej: Pascal, Ada, etc) es traducido automáticamente al lenguaje de máquina de la computadora que lo va a ejecutar. Esta traducción, denominada compilación, permite detectar y corregir los errores sintácticos que se cometan en la escritura del programa.
Verificación:
Una vez que se tiene un programa escrito en un lenguaje real se debe verificar que su ejecución produce al resultado deseado, utilizando datos representativos del problema real. Sería deseable poder afirmar que el programa es correcto, más allá de los datos particulares de una ejecución. Sin embargo, en los casos reales es muy difícil realizar una verificación exhaustiva de todas las posibles condiciones de ejecución de un sistema de software. La facilidad de verificación y la depuración de errores de funcionamiento del programa conducen a una mejor calidad del sistema y es un objetivo central de la Ingeniería de Software.
Los programas deben estar escritos en un lenguaje comprensible por la máquina, ya sea:
- Lenguaje máquina.
- Código comprensible por un intérprete/compilador (que traduce el programa a la máquina).
Para obtener el código que comprende la máquina (ceros y unos) es necesario someter al código fuente, código comprensible por el ser humano, a un proceso de traducción:
Código compilable.
- Compilar: Realizar Análisis Léxico, Sintáctico y Semántico, Conversión a código objeto.
- Enlazado (linkado): Unir el código objeto a las librerías y datos necesarios para que el sistema operativo sepa ejecutar el programa y convertirlo en un ejecutable.
Ejemplo de lenguajes habitualmente compilables: Pascal, C, C++, Ada.
Código interpretable. El código comprensible por el ser humano es convertido en tiempo de ejecución (equivalente a una traducción simultánea) a código comprensible por la máquina.
Se diferencia del código compilado en que:
- Es más lento (necesita traducirse en cada ejecución).
- Es más fácil de mantener (modificar, corregir errores), ya que siempre es comprensible por el ser humano.
- Es más flexible ya que los lenguajes interpretados permiten mayores abstracciones que los lenguajes compilados.
- Es portable a cualquier plataforma que posea un intérprete. El programa compilado solo funciona en la plataforma para la que fue compilado.
Ejemplo de lenguaje habitualmente interpretado: Perl, VBS, Basic, Javascript, PHP.
Existen soluciones intermedias al código compilado o interpretado. Ejemplo: Java, posee bytecodes que es código compilado intermedio que requiere ser interpretado parcialmente.
Conceptos Básicos de Algoritmos
¿Qué es un algoritmo?
La palabra algoritmo deriva del nombre de un matemático árabe del siglo IX, llamado Al-Khuwarizmi, quien estaba interesado en resolver ciertos problemas de aritmética y describió varios métodos para resolverlos. Estos métodos fueron presentados como una lista de instrucciones específicas (como una receta de cocina) y su nombre se utiliza para referirse a dichos métodos.
Un algoritmo es, en forma intuitiva, una receta, un conjunto de instrucciones o de especificaciones sobre un proceso para hacer algo. Ese algo generalmente es la solución de un problema de algún tipo. Se espera que un algoritmo tenga varias propiedades. La primera es que un algoritmo no debe ser ambiguo, o sea, que si se trabaja dentro de cierto marco o contexto, cada instrucción del algoritmo debe significar sólo una cosa.
Una posible definición de algoritmo es un conjunto de reglas que permiten obtener un resultado determinado a partir de ciertas reglas definidas. Otra definición sería, algoritmo es una secuencia finita de instrucciones, cada una de las cuales tiene un significado preciso y puede ejecutarse con una cantidad finita de esfuerzo en un tiempo finito. Ha de tener las siguientes características: legible, correcto, modular, eficiente, estructurado, no ambiguo y a ser posible se ha de desarrollar en el menor tiempo posible.
Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce hacia un lenguaje de programación concreto) un algoritmo. Puede haber programas que no se ajusten a un algoritmo (pueden no terminar nunca), en cuyo caso se denomina procedimiento a tal programa. Los programas suelen subdividirse en partes menores (módulos), de modo que la complejidad algorítmica de cada una de las partes es menor que la del programa completo, lo cual ayuda al desarrollo del programa.
Una definición informal (no se considera aquí una definición formal, aunque existe): conjunto finito de reglas que dan una secuencia de operaciones para resolver todos los problemas de un tipo dado. De forma más sencilla, podemos decir que un algoritmo es un conjunto de pasos que nos permite obtener un dato. Además debe cumplir estas condiciones:
- Finitud: El algoritmo debe acabar tras un número finito de pasos. Es más, es casi fundamental que sea en un número razonable de pasos.
- Definibilidad: El algoritmo debe definirse de forma precisa para cada paso, es decir, hay que evitar toda ambigüedad al definir cada paso. Puesto que el lenguaje humano es impreciso, los algoritmos se expresan mediante un lenguaje formal, ya sea matemático o de programación para un computador.
- Entrada: El algoritmo tendrá cero o más entradas, es decir, cantidades dadas antes de empezar el algoritmo. Estas cantidades pertenecen además a conjuntos especificados de objetos. Por ejemplo, pueden ser cadenas de caracteres, enteros, naturales, fraccionarios, etc. Se trata siempre de cantidades representativas del mundo real expresadas de tal forma que sean aptas para su interpretación por el computador.
- Salida: El algoritmo tiene una o más salidas, en relación con las entradas.
- Efectividad: Se entiende por esto que una persona sea capaz de realizar el algoritmo de modo exacto y sin ayuda de una máquina en un lapso de tiempo finito.
A menudo los algoritmos requieren una organización bastante compleja de los datos, y es por tanto necesario un estudio previo de las estructuras de datos fundamentales. Dichas estructuras pueden implementarse de diferentes maneras, y es más, existen algoritmos para implementar dichas estructuras. El uso de estructuras de datos adecuadas pueden hacer trivial el diseño de un algoritmo, o un algoritmo muy complejo puede usar estructuras de datos muy simples.
Aplicaciones de los Algoritmos:
A primera vista, se puede pensar que el conocimiento de estos algoritmos y estructuras de datos no tienen una aplicación práctica inmediata. Sin embargo, su conocimiento y correcta aplicación sirven para producir programas mejores, en el sentido de que aprovechan mejor la memoria del sistema, son más rápidos, eficientes, robustos y tolerantes a fallos.
Las aplicaciones de estos algoritmos en algunos casos son inmediatas; por ejemplo, hallar el trayecto más corto entre dos estaciones es algo que interesa a muchos viajeros del metro y se pueden obtener aproximaciones bastante buenas del mundo real utilizando algunos de los algoritmos que obtienen distancias mínimas. Otros algoritmos sirven para procesar cadenas, lo cual sirve de base para analizadores léxicos o algoritmos criptográficos, por ejemplo.
Además, tener conocimientos adecuados de algoritmia y estructuras de datos facilita el poder pasar de un lenguaje de programación a otro con mucha mayor facilidad: puesto que ya se tiene la base, sólo hace falta superar las dificultades técnicas particulares de cada lenguaje.
Ejemplos
Ejemplo 1:
Problema: Indique la manera de salar una masa.
Ejemplos
Ejemplo 1:
Problema: Indique la manera de salar una masa.
Incorrecto: Ponerle algo de sal a la masa.
Correcto: Agregarle una cucharadita de sal a la masa.
Ejemplo 2:
Problema: Determinar si el número 7317 es primo.
Correcto: Agregarle una cucharadita de sal a la masa.
Ejemplo 2:
Problema: Determinar si el número 7317 es primo.
Incorrecto: Divida el 7317 entre sus anteriores buscando aquellos que lo dividan exactamente.
Correcto: Divida el numero 7317 entre cada uno de los números 1, 2, 3, 4, ..., 7315, 7316. Si una de las divisiones es exacta, la respuesta es no. Si no es así, la respuesta es sí.
Esta es una solución no ambigua para este problema. Existen otros algoritmos mucho más eficaces para dicho problema, pero esta es una de las soluciones correctas.
Ejemplo 3:
Correcto: Divida el numero 7317 entre cada uno de los números 1, 2, 3, 4, ..., 7315, 7316. Si una de las divisiones es exacta, la respuesta es no. Si no es así, la respuesta es sí.
Esta es una solución no ambigua para este problema. Existen otros algoritmos mucho más eficaces para dicho problema, pero esta es una de las soluciones correctas.
Ejemplo 3:
Problema: Volcar un montículo de arena en una zanja.
Algoritmo:
Algoritmo:
Tome una pala.
Mientras haya arena en el montículo cargue la pala con arena y vuélquela en la zanja.
Dejar la pala.
Ejemplo 4:
Desarrolle un algoritmo que describa la manera en que te levantas todas las mañanas para ir a la Universidad.
Salir de la cama
Quitarse el pijama
Ducharse
Vestirse
Desayunar
Arrancar el auto para ir al trabajo
Ejemplo 5: Ejemplo 4:
Desarrolle un algoritmo que describa la manera en que te levantas todas las mañanas para ir a la Universidad.
Salir de la cama
Quitarse el pijama
Ducharse
Vestirse
Desayunar
Arrancar el auto para ir al trabajo
Diseñar un algoritmo para cambiar una llanta a un coche.
Inicio.
Traer gato.
Levantar el coche con el gato.
Aflojar tornillos de las llantas.
Sacar los tornillos de las llantas.
Quitar la llanta.
Poner la llanta de repuesto.
Poner los tornillos.
Apretar los tornillos.
Fuente: weblidi.info.unlp.edu.ar/catedras/ingreso/Material2013/IAI/Cap1.pdf