Algoritmica terminado

Preview:

Citation preview

ALGORITMICA

Por : VADILLO SANDOVAL ALEXANDER MIGUELV Ciclo – Computación e Informática - UNFV

ALGORITMO

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

La palabra algoritmo se deriva de la traduccion al latin de la palabra arabe alkhowarismi , nombre de un matematico y astronomo arabe que escribio un tratado sobre la manipulacion de numeros y ecuaciones en el siglo ix

Se define como una serie de pasos organizados que describen el proceso que se debe seguir, para dar solucion a un problema especifico

Un algoritmo es una serie de pasos secuenciados para la solucion de algun problema. un ejemplo seria:

Hacer un algoritmo que muestre del 1 al 100 y quue los vaya sumando e imprima la suma de los numeros.

Un algoritmo es un conjunto de reglas que determinan la secuencia de las operaciones a seguir para resolver un problema especifico .

CARACTERISTICAS

Todo algoritmo debe tener las siguientes características:Debe ser preciso, es decir, cada instrucción debe indicar de forma inequívoca que se tiene que hacer.Debe ser finito, es decir, debe producir los mismos resultados para las mismas condiciones de entrada.Todo algoritmo puede ser descompuesto en tres partes: Entrada de datos, Proceso y Salida de resultados

Preciso.- Definirse de manera rigurosa, sin dar lugar a ambigüedades.

Definido.- Si se sigue un algoritmo 2 veces, se obtendrá el mismo resultado.

Finito.- Debe terminar en algún momento.Puede tener cero o mas elementos de

entrada.Debe producir un resultado. Los datos de

salida serán los resultados de efectuar las instrucciones

Debe tener un punto particular de inicio.Debe ser completamente definido y no debe

permitir dobles interpretaciones.Debe ser general, es decir, soportar la

mayoría de las variantes que se puedan presentar en la definición del problema.

Debe ser finito en tamaño y tiempo de ejecución.

Debe ser legible, claro y fácil de interpretar y entender.

1) Finitud: Un algoritmo debe terminar después de ejecutar un número finito de pasos.

2) Definición: Cada paso en un algoritmo debe estar definido con precisión, esto es, la acción a seguir no debe ser ambigua, sino rigurosamente especificada. UN algoritmo descrito en un lenguaje como inglés o español, en el cual una misma palabra puede significar varias cosas, puede no cumplir con este punto. Es por eso que se han definido los lenguajes de programación o lenguajes de computación para especificar algoritmos, ya que en ellos el significado de cada palabra es uno y sólo uno.

3) Entrada: Se considera como entrada el conjunto de datos o información requerida para resolver un problema dado. No cualquier grupo de datos se puede considerar como entrada en el procedimiento señalado.

4) Salida: La salida es un conjunto de resultados que se obtienen al aplicar el algoritmo al conjunto de datos de entrada.

5) Efectividad: Un algoritmo debe llevar a la solución del problema planteado, en otras palabras, se puede decir que todas las operaciones que efectúa el algoritmo, deben ser lo suficientemente simples para que en principio, se puedan ejecutar con papel y lápiz y al final obtener el resultado deseado.

Se concluye que un algoritmo debe ser suficiente para resolver el problema.

Entre 2 algoritmos que lleven a un mismo objetivo, siempre será preferible el mas corto ( se deberá analizar la optimización de tiempos y/o recursos).

TIPOS DE ALGORITMO

CUALITATIVOS :Son aquellos en los que se describen los pasos

utilizando palabras.Son todos aquellos pasos o instrucciones

descritos por medio de palabras que sirven para llegar a la obtención de una respuesta o solución de un problema cualquiera.

CUANTITATIVOS :Son aquellos en los que se utilizan cálculos

numéricos para definir los pasos del proceso. Son aquellos pasos o instrucciones que

involucran cálculos numéricos para llegar a un resultado satisfactorio.

Tipos de algoritmos de razonamiento:

Algoritmos Estáticos: Son los que funcionan siempre igual, independientemente del tipo de problema tratado.

Algoritmos Adaptativos: Algoritmos con cierta capacidad de aprendizaje.

Algoritmos Probabilísticos: Son algoritmos que no utilizan valores de verdad booleanos sino continuos. Existen varios tipos de algoritmos probabilísticos dependiendo de su funcionamiento, pudiéndose distinguir:

§ Algoritmos numéricos: Que proporcionan una solución aproximada del problema.

§ Algoritmos de Montecarlo: Que pueden dar la respuesta correcta o respuesta erróneas (con probabilidad baja).

§ Algoritmos de Las Vegas: Que nunca dan una respuesta incorrecta: o bien dan la respuesta correcta o informan del fallo.

Algoritmo Cotidiano: Es la serie de pasos que realizamos en nuestra vida diaria para realizar las diferentes tareas y actividades comunes, desde los pasos al levantarnos, así como ir de compras, etc.

Algoritmo Voraz: Un algoritmo voraz es aquel que, para resolver un determinado problema, sigue una meta heurística consistente en elegir la opción óptima en cada paso local con la esperanza de llegar a una solución general óptima.

Algoritmo Determinista: Es un algoritmo que, en términos informales, es completamente predictivo si se conocen sus entradas.

Algoritmo Heurístico: Es un algoritmo que abandona uno o ambos objetivos; por ejemplo, normalmente encuentran buenas soluciones, aunque no hay pruebas de que la solución no pueda ser arbitrariamente errónea en algunos casos; o se ejecuta razonablemente rápido, aunque no existe tampoco prueba de que siempre será así.

Algoritmo de escalada: la idea básica consiste en comenzar con una mala solución a un determinado problema y, repetidamente, aplicar optimizaciones a la misma hasta que esta sea óptima o satisfaga algún otro requisito.

Ciencias en que se apoya la algoritmia para producir soluciones ingeniosas!

· Ciencias de la Computación.· Matemáticas.· Ciencias Sociales.· Ciencias Políticas.

¿Cómo podemos determinar la complejidad de un algoritmo?

No existe receta que siempre funcione para calcular la complejidad de un algoritmo, si es posible tratar sistemáticamente una gran cantidad de ellos, basándonos en que suelen estar bien estructurados y siguen pautas uniformes.

Loa algoritmos bien estructurados combinan las sentencias de alguna de las siguientes formas:

· Sentencias sencillas · Secuencia (;) · Decisión (if) · BuclesLlamadas a procedimiento.

PROPIEDADES DE UN ALGORITMO

SecuencialidadAusencia de AmbigüedadesGeneralidadLimitaciones

SECUENCIALIDAD

Se debe especificar sin lugar a dudas la secuencia a utilizar.

Un algoritmo debe tener una instrucción inicial única y un sucesor único en cada secuencia.

Las instrucciones son llevadas a cabo de arriba hacia abajo a menos que las mismas especifiquen lo contrario.

Las entradas son las partidas de datos presentadas al algoritmo.

Las salidas son partidas de datos procesados que son el resultado de la ejecución un programa basado en el algoritmo.

AUSENCIA DE AMBIGÜEDAD

En algoritmo debe ser defino, claro, preciso y no ambiguo. La representación de cada paso de un algoritmo debe dar lugar a una sola interpretación posible.

Esta condición significa que cada vez que se presente para su ejecución u algoritmo con los mismos datos de entrada, se obtendrán los mismos resultados.

Las instrucciones de un algoritmo debe ordenar a la computadora que solo lleve a cabo tareas que sea capaz de hacer. Una computadora no puede efectuar una instrucción si tiene información insuficiente o si el comando no está definido.

GENERALIDAD

Un algoritmo se puede realizar para varios problemas que se relacionan entre sí.

Un algoritmo se aplica a un problema o clase de problemas específicos; el rango de las entradas o dominios se tiene que definir previamente, ya que está determinado el alcance o la generalidad del algoritmo.

LIMITACIÓN

Un algoritmo es finito en tamaño y tiempo.La ejecución de un algoritmo programado

debe finalizar después de que se haya llevado a cabo una cantidad finita de operaciones.

LEXICO DE UN PROGRAMADOR

El Lenguaje de Programación es el medio de comunicación entre un programador y una computadora; es mediante el lenguaje de programación que el programador "le dice" a la computadora qué acciones debe ejecutar, para resolver un problema computacional.

El Lenguaje de Programación es unidireccional; las órdenes son emitidas por el programador y recepcionadas por la computadora, la cual se limita a ejecutar dichas órdenes. En realidad, en un Lenguaje de Programación intervienen dos Lenguajes: el Lenguaje Fuente que es el lenguaje que el programador entiende y el Lenguaje - Objeto que es el lenguaje de la máquina que puede ser ejecutada por una computadora.

El Lenguaje -Fuente tiene tres niveles:Los Lenguajes -Fuente de Alto Nivel están más

próximos al programador; es decir, que con órdenes expresadas "casi" de forma natural, el programador puede resolver problemas computacionales.

Los Lenguajes-Fuente de Nivel Intermedio son más concisos y rígidos en su sintaxis; eso los hace menos amigables para programar.

Los Lenguajes -Fuente de Bajo Nivel son tan cercanos al lenguaje de máquina que se requiere de una mayor especialización por parte del programador.

EL TRADUCTOR

Tomando en consideración lo que se ha dicho, surge la pregunta:

¿Cómo es posible la comunicación entre el programador y la computadora, si entienden distintos lenguajes?

La respuesta es: "Mediante un Traductor". Un Traductor es un programa que traduce el Lenguaje -Fuente al Lenguaje - Objeto. Para realizar el análisis y diseño del Traductor, se acude a la computabilidad y los lenguajes formales que proponen la Teoría de los Lenguajes Formales.

La Teoría de Lenguajes está dedicada al estudio formal de las partes de un lenguaje; para el efecto, propone mecanismos formales encargadas del estudio del Léxico, Sintaxis y Semántica.

GLOSARIO DE TERMINOS

TECNICAS PARA DESARROLLAR UN ALGORITMO

Técnicas de diseño

Top down También conocida como de arriba-abajo y

consiste en establecer una serie de niveles de mayor a menor complejidad (arriba-abajo) que den solución al

problema.

Bottom Up El diseño ascendente se refiere a la

identificación de aquellos procesos que necesitan procesarse en el momento en el que vayan apareciendo para

satisfacer el problema inmediato.

Técnicas para la formulación de algoritmos

Las dos herramientas utilizadas comúnmente para diseñar algoritmos son:

• Diagrama de Flujo • Pseudocódigo

DIAGRAMA DE FLUJO

Un diagrama de flujo es otra técnica de diseño de algoritmos. Consiste en una serie de símbolos que denotan acciones, decisiones o procedimientos que se unen mediante flechas y conectores.

Esta representación nos ayudará a conocer la información que tenemos, donde la tenemos, que debemos hacer con ella y como presentarla.

Debe tener las cualidades de sencillez, claridad y normalización en su diseño.

DIAGRAMA DE FLUJO

Es la representación detallada en forma gráfica de cómo deben realizarse los pasos en la computadora para obtener resultados.

PSEUDOCÓDIGO

Es la representación narrativa de los pasos que debe seguir un algoritmo para dar solución a un problema determinado. El pseudocódigo utiliza palabras que indican el proceso a realizar

DOMINIO DE UN ALGORITMO

La clase o el conjunto de datos y condiciones para las cuales un algoritmo trabaja concretamente 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 del dominio.

Es necesario incluir en el dominio todas las situaciones similares, pero los casos remotos o poco probables se permiten omitir.

ERRORES EN LA CONTRUCCIÓN DEL DOMINIO.

Errores del dominio: se presentan cuando se no han

especificado todas las situaciones que se pueden presentar en la práctica o se han descuidado la apreciación de su importancia.

A medida que se presenta el problema, se tiene que clasificar y hay tres opciones:

1. Ignorarlo porque es improbable y quizás nunca ocurra.

2. Restringir el dominio del algoritmo para excluirlo.3. Corregir el algoritmo.

ERRORES DE LÓGICA:

Son aquellos errores que se detectan, después que se ha definido en forma adecuada el dominio de un algoritmo, en la etapa de prueba o verificación.

se deben principalmente a las siguientes causas:1. Etapas incorrectas.2. Secuencia incorrecta de etapas3. El criterio de elección de un algoritmo debe

hacerse en base a criterios tales como:a) Que el algoritmo sea simple, es decir, fácil de

entender y de escribir.b) Que el algoritmo sea eficiente.

MÉTODO HEURÍSTICO

La heurística proporciona un esquema o plan para abordar los problemas poco conocidos, mejora la capacidad de crear soluciones y asegura que el método que se va a usar sea eficiente.

En la etapa de planificación es donde se tiene la oportunidad de comparar métodos y seleccionar el más adecuado.

Surge la pregunta:

¿ Cómo se pueden resolver los problemas para los que no hay un método establecido o para los cuales conocemos un algoritmo?.

DISEÑO DE UN ALGORITMO

Un método heurística para diseñar algoritmo es el denominado DIVIDE AND CONQUER, el cual es una técnica TOP-DOWN.

Este método permite implementar la segmentación, descomposición de un problema largo y complejo en problemas independientes más pequeños y fáciles de resolver que el problema de partida.

La técnica consiste en varias etapas.

DESCOMPOSICIÓN DEL PROBLEMA DE PARTIDA EN SUBPROBLEMAS INDEPENDIENTES Y DETERMINACIÓN DE

LAS RELACIONES ENTRE ELLOS.

P

P1 P2 P3

RESOLUCIÓN DE CADA SUBPROBLEMA

Si un sub-problema es grande, por descomposición y continuando hasta que resulten de la descomposición sub -problemas fácilmente resolubles.

P1

P1.1 P1.2 P1.3

Composición de las soluciones de los sub- problemas para lograr la solución final

El diseño del algoritmo que resuelve un problema, realizado con esta técnica recibe el nombre de DISEÑO DESCENDENTE y resulta en algoritmo muy legibles, claros, fáciles de entender, seguir y corregir.

El diseño de un algoritmo no se hace de una sola vez, sino que se va resolviendo en una secuencia de pasos ( llamados PASOS DE REFINAMIENTO).

En cada paso el problema es refinado agregando detalles significativos, por lo que el método se conoce como:

MÉTODO DE LOS REFINAMIENTOS SUCESIVOS.

UN INGENIERO ES CONVOCADO PARA CONSTRUIR UN EDIFICIO

CONSTRUCCIÓN DEL

EDIFICIO

CONFECCICÓNDE LOSPLANOS

CONTRATACIÓNDEL

PERSONAL

COMPRA DEMATERIALES

DIRECCIÓNDE LA OBRA

UN SUB- PROBLEMA

CONFECCIÓNDE LOSPLANOS

DISEÑO DELANTEPROYECTO

APROBACIÓNDEL

ANTEPROYECTO

ELABORACIÓN DE LOS PLANOS

APROBACIÓNDE LOSPLANOS

OTRO SUB- PROBLEMA

CONTRATACIÓNDEL

PERSONAL

PEDIDO DECURRICULUM

VITAE

ANÁLISISDE LOS

CURRÍCULUMVITAE

ENTREVISTAS PERSONALES

REDACCIÓN DE LOS

CONTRATOS

OTRO SUB- PROBLEMA

COMPRA DE

MATERIALES

CÁLCULODE

MATERIALES

PEDIDO DE

PRECIOS

SELECCIÓNDE

PROVEEDORES

Al utilizar el refinamiento por pasos el diseñador de un algoritmo debe saber donde detenerse, es decir, debe saber cuando un paso específico del algoritmo es lo suficientemente claro para no necesitar más refinamiento.

Se necesita CONOCER LAS CAPACIDADES DE UN PROCESADOR no sólo para terminar los refinamientos, sino para dirigir la forma en que el refinamiento avanza.

Una computadora puede interpretar cualquier cosa expresadas de manera adecuada en un lenguaje de programación. Así el diseñador de un algoritmo de computadora puede orientar los pasos y la terminación del refinamiento hacia el tipo de lenguaje que se trate.

PROGRAMACION ESTRUCTURA

Los principios metodológicos básicos de la programación estructurada son los de subdividir el problema inicial o de partida en partes manejables para su análisis y hacer de esta manera que se agilice el proceso de entender el problema y la solución.

Básicamente, estas subdivisiones deseadas( llamadas módulos) deben satisfacer los siguientes requisitos:

1. Los módulos deben estas jerarquizados.2. Deben ser pequeños y sencillos.3. Se deberán utilizar tantos módulos de menor

jerarquía como sea necesario para cumplir con la restricción de ser pequeños y sencillos.

4. Se deberán usar las estructuras de control y datos adecuadas para cumplir con el requisito de pequeños y sencillos.

5. Los módulos deben ser legibles para cualquier persona aunque tenga solamente conocimientos elementales de progrmación.

LENGUAJE DE DISEÑO DE PROGRAMAS

Como la meta es escribir algoritmos que sean procesados en una computadora, se va a producir un lenguaje de diseño adecuado.

Se llamará LENGUAJE DE DESCRIPCIÓN DE PROGRAMAS a la herramienta que permitirá diseñar programas de codificación.

Este pseudo- lenguaje tiene las siguientes características:1. Permite expresar de manera informal las estructuras de 2. Permite expresar las ideas en frases del lenguaje propio o

natural.3. Es similar al lenguaje de programación pero no está ligado

a ninguna regla formal de sintaxis como aquellos.4. No es un lenguaje compilable5. Por convención se hace un sangrado en el texto que ayuda

a la percepción visual de la lógica del diseño.6. Permite expresar diseños de fácil comprensión que podrá

convertirse sin dificultad a código en el lenguaje de implementación.

7. El pseudo- código generado es más fácil de cambiar y corregir que el código del programa.

SOLUCION DE UN PROBLEMA

ANALISIS El Lenguaje Regular es el encargado del análisis del léxico de todo

lenguaje; se proponen tres mecanismos formales para su estudio: las Expresiones Regulares, el Autómata de Estados Finitos y la Gramática Regular. Se demuestra que existe una contradicción dialéctica entre estos tres mecanismos formales, pues a pesar de ser diferentes en su estructura generan el mismo lenguaje; esta equivalencia permite la flexibilidad en el uso de cualquiera de estos mecanismos en el análisis del léxico del Lenguaje -Fuente .

El Lenguaje Libre de Contexto es el encargado de realizar el análisis de la sintaxis de todo lenguaje; propone dos mecanismos formales: el Autómata de Pila y la Gramática Libre de Contexto. Existe también una contradicción dialéctica entre estos dos mecanismos; esto permite una relación de equivalencia que no discrimina a ninguno de ellos para realizar el análisis de la sintaxis del Lenguaje-Fuente.

El Lenguaje Sensible al Contexto es el encargado de realizar el análisis de la Semántica de todo lenguaje; sin embargo, no es posible utilizar la Gramática Sensible al Contexto para este propósito, pues no existe una gramática determinística que permita llevar este análisis a su diseño e implementación; éste es el motivo por el que se ha adoptado una Gramática Atribuida como mecanismo formal de análisis de la Semántica del Lenguaje-Fuente.

El Lenguaje Atribuido es propuesto por Knuth, quien dice que -sin abandonar el determinismo que ofrece una gramática libre de contexto- se puede simular el comportamiento de una Gramática Sensible al Contexto; simplemente, se añade atributos a una Gramática Libre de Contexto y se creará una gramática atribuida capaz de analizar la Semántica del Lenguaje-Fuente[2].

El Lenguaje Atribuido no sólo se encargara del análisis de la Semántica del Lenguaje-Fuente sino que también se encargará de la fase de generación del Lenguaje-Objeto, cumpliendo la función de síntesis del Traductor.

DISEÑO Para el diseño del analizador lexicográfico, se utilizará una

función sistemática traductora ' T ' [3]. Esta función recibe como entrada una expresión regular que representa a un Token del léxico del Lenguaje -Fuente; es a través de esta función sistemática traductora que se puede generar el pseudocódigo del analizador lexicográfico, el cual podrá ser implementado en cualquier Lenguaje de Programación.

Para el diseño de analizador sintáctico, se utilizará el Método Descendente Predictivo Recursivo, que permitirá transformar la Gramática Libre de Contexto en un pseudocódigo del analizador sintáctico, el cual podrá ser implementado en cualquier Lenguaje de Programación.

Para el diseño del analizador semántico, se incorpora parámetros por valor o por referencia al pseudocódigo del analizador sintáctico, llevando al diseño a una Gramática Atribuida.

El diseño del generador de código requiere de un atributo sintetizado que tomará la contribución de cada esquema de producción y generará el Código-Objeto equivalente al Código-Fuente.

MEDIOS DE EXPRESION DE UN ALGORITMO

Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.

La descripción de un algoritmo usualmente se hace en tres niveles:

1.Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.

2.Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.

3.Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.

También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.

DIAGRAMA DE FLUJO

Diagrama de flujo que expresa un algoritmo para calcular la raíz cuadrada de un número xArtículo principal: Diagrama de flujo

Los diagramas de flujo son descripciones gráficas de algoritmos; usan símbolos conectados con flechas para indicar la secuencia de instrucciones y están regidos por ISO.

Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan mucho espacio y su construcción es laboriosa. Por su facilidad de lectura son usados como introducción a los algoritmos, descripción de un lenguaje y descripción de procesos a personas ajenas a la computación.

PSEUDOCÒDIGO

El pseudocódigo (falso lenguaje, el prefijo pseudo significa falso) es una descripción de alto nivel de un algoritmo que emplea una mezcla de lenguaje natural con algunas convenciones sintácticas propias de lenguajes de programación, como asignaciones, ciclos y condicionales, aunque no está regido por ningún estándar. Es utilizado para describir algoritmos en libros y publicaciones científicas, y como producto intermedio durante el desarrollo de un algoritmo, como los diagramas de flujo, aunque presentan una ventaja importante sobre estos, y es que los algoritmos descritos en pseudocódigo requieren menos espacio para representar instrucciones complejas.

El pseudocódigo está pensado para facilitar a las personas el entendimiento de un algoritmo, y por lo tanto puede omitir detalles irrelevantes que son necesarios en una implementación. Programadores diferentes suelen utilizar convenciones distintas, que pueden estar basadas en la sintaxis de lenguajes de programación concretos. Sin embargo, el pseudocódigo en general es comprensible sin necesidad de conocer o utilizar un entorno de programación específico, y es a la vez suficientemente estructurado para que su implementación se pueda hacer directamente a partir de él.

PROCESO DE LA PROGRAMACION

La programación es más que solamente escribir código. El software tiene su ciclo de vida. Nace, crece, madura y finalmente muere, solamente para ser reemplazado por un producto nuevo. El entendimiento del ciclo de vida de un programa es importante, ya que, como programador, se pasará solamente poco tiempo en escribir código. La mayoría de las veces la mayor parte del tiempo se invierte al modificar y revisar código existente. Un código debe ser documentado, se le debe dar mantenimiento, debe ser mejorado y vendido.

Los principales pasos que se deben seguir al elaborar un programa son:

Requerimientos: Los programas empiezan cuando alguien tiene la idea de hacer algo y comienza a implementarlo. El documento con los requerimientos del sistema describen, en términos generales, qué es lo que se quiere hacer.

Especificación del programa: La especificación es una breve descripción de qué es lo que el programa hace. En un principio, una especificación preliminar describe qué es lo que va a hacer el programa. Después, mientras el programa se va refinando, de la misma manera se va refinando la especificación del mismo.

Diseño del código: El programador tiene que llevar a cabo un diseño del código a implementar. En él se deben incluir los algoritmos utilizados, las definiciones de los módulos a utilizar, archivos utilizados y estructuras de datos usadas en el programa. Es aquí en donde se desarrolla el pseudocódigo del programa. El uso de diagramas de flujo también nos permitirá obtener una abstracción sobre el problema, tanto en entradas, salidas, flujo y procesamiento de la información.

Codificación: El siguiente paso es empezar a escribir el programa. Este primer paso involucra primero escribir un prototipo y después irlo puliendo para crear el programa final.

Pruebas: El programador debe diseñar un plan de pruebas para posteriormente utilizarlo para probar su programa. Cuando es posible, debe existir un equipo de pruebas, diferente del equipo de programadores.

Debugging: Desafortunadamente, pocos son los programas que funcionan a la primera. Los programas deben ser corregidos y probados nuevamente.

Release: El programa es empaquetado, documentado y mandado al mundo a ser usado.

Mantenimiento: Los programas rara vez, o nunca son perfectos. Los errores o bugs se encontrarán y necesitarán ser corregidos. Esta etapa es la etapa de mantenimiento de la programación.

Revisión y mejora: Después de que un programa ha sido usado, los usuarios querrán realizarle algún cambio al funcionamiento del programa, tal como alguna nueva funcionalidad o un cambio en algún algoritmo. En este punto se crea una nueva especificación y el proceso comienza de nuevo.

Especificación Generalmente las especificaciones de un proyecto de

programación son vagas e incompletas. El programador tiene que redefinirlas en algo que define exactamente el programa que se va a desarrollar. Por lo tanto, el primer paso es escribir una especificación preliminar que describa qué es lo que el programa va a hacer y cómo se debe utilizar. El documento no describe la estructura interna del programa o el algoritmo que se planea utilizar.

La especificación preliminar tiene dos propósitos. Primero, enseñársela al jefe o líder de proyecto para asegurarse de que la especificación contiene todo lo que se necesita que haga el programa. Segundo, se puede enseñar a los demás compañeros para ver si existen sugerencias con respecto al programa.

Diseño del código Después de que la especificación preliminar ha sido

aprobada, se puede empezar a diseñar el código. En la fase de diseño de código, el programador planea su trabajo. En proyectos de programación muy grandes que involucran a mucha gente, el código puede ser dividido en varios módulos, asignando un módulo a cada programador. En esta etapa se deben planear las estructuras de datos, los archivos y los algoritmos a utilizar. En esta etapa podemos ayudarnos de pseudocódigo y diagramas de flujo.

Prototipo Después de que la etapa de diseño del código ha sido

completada, podemos empezar a escribir el programa. Sin embargo, en lugar de empezar a escribir el programa completo para después empezar a probarlo, podemos utilizar un método llamado prototipo rápido (fast prototyping). Consiste en implementar una pequeña porción de la especificación que haga alguna de las funciones requeridas. Una vez que dicha parte del programa funciona, podemos implementar el resto de las funciones sobre la porción estable de código construida anteriormente. El prototipo también puede servir para darnos una idea de cuál es la dirección que lleva el proyecto.

MakefileDespués de que el código fuente ha sido

terminado, necesitará ser compilado y encadenado. Si bien es cierto, podemos correr el compilador de manera manual, el proceso puede ser tedioso y complicado cuando estamos desarrollando proyectos muy grandes. Para esto podemos utilizar un makefile.

Pruebas Después de que el programa ha sido compilado sin errores,

podemos pasar a la etapa de pruebas. Ahora es tiempo de escribir un plan de pruebas. Dicho documento no es más que una simple lista de los pasos que debemos seguir para estar seguros de que el programa funciona correctamente. Se debe escribir básicamente por dos razones:

Si un error es encontrado, queremos poder reproducirlo. Si realizamos algún cambio en el programa, queremos

volverlo a probar para estar seguros que el cambio no afectó nada que haya estado funcionando previamente.

DebuggingPrimero debemos inspeccionar el programa

para ver si podemos detectar algún error. En programas sencillos será muy fácil encontrar el error, sin embargo no lo será en proyectos que involucran código de más de 5,000 líneas. La mayoría de los sistemas tiene debuggers de C, en nuestro caso podemos utilizargdb.

MantenimientoLos buenos programadores someten a sus

programas a largos y rigurosos procesos de mantenimiento antes de liberar su código. Cuando el usuario del programa empieza a utilizarlo y encuentra algún error, entramos a la etapa de mantenimiento, en donde cualquier error que pudiera tener el programa es corregido y el programa se vuelve a probar para asegurarse de que el error no vuelva a aparecer, para finalmente volver a liberar el programa.

TIPOS DE DATOS

Todos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como ‘b’, un valor entero tal como 35. El tipo de dato determina la naturaleza del conjunto de valores que puede tomar una variable.

Numéricos

Simples Lógicos

Alfanuméricos (string)

Tipos de datos Arreglos (Vectores, Matrices)

Estructurados Registros (Def. por el Archivos usuario) Apuntadores 

Datos Numéricos: Permiten representar valores escalares de forma numérica, esto incluye a los números enteros y los reales. Este tipo de datos permiten realizar operaciones aritméticas comunes.

Datos Lógicos: Son aquellos que solo pueden tener dos valores (cierto o falso) ya que representan el resultado de una comparación entre otros datos (numéricos o alfanuméricos).

 Datos Alfanuméricos (String): Es una secuencia de caracteres alfanuméricos que permiten representar valores identificables de forma descriptiva, esto incluye nombres de personas, direcciones, etc. Es posible representar números como alfanuméricos, pero estos pierden su propiedad matemática, es decir no es posible hacer operaciones con ellos. Este tipo de datos se representan encerrados entre comillas.

EXPRESIONES

Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones especiales. Por ejemplo:

a + (b + 3) / c

Cada expresión toma un valor que se determina tomando los valores de las variables y constantes implicadas y la ejecución de las operaciones indicadas.

Una expresión consta de operadores y operandos. Según sea el tipo de datos que manipulan, se clasifican las expresiones en:

ü Aritméticas ü Relaciónales ü Lógicas

OPERADORES Y OPERANDOS

Operadores: Son elementos que relacionan de forma diferente, los valores

de una o mas variables y/o constantes. Es decir, los operadores nos permiten manipular valores. Los Tipos de Operadores que existen son tres: los relaciónales, los Aritméticos y por último los lógicos.

ü Operadores Aritméticos: Los operadores aritméticos permiten la realización de operaciones matemáticas con los valores (variables y constantes). Los operadores aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos son enteros, el resultado es entero; si alguno de ellos es real, el resultado es real.

Operadores Aritméticos+ Suma - Resta

* Multiplicación / División

mod Modulo (residuo de la división entera)

Ejemplos:Expresión Resultado

7 / 2 3.5 12 mod 7 5

4 + 2 * 5 14

Prioridad de los Operadores Aritméticos Todas las expresiones entre paréntesis se evalúan primero.

Las expresiones con paréntesis anidados se evalúan de dentro a fuera, el paréntesis mas interno se evalúa primero. Dentro de una misma expresión los operadores se evalúan en el siguiente orden.

1. ^ à Exponenciación 2. *, /, mod à Multiplicación, división, modulo 3. - +, - à Suma y resta.

ü Los operadores en una misma expresión con igual nivel de prioridad se evalúan de izquierda a derecha.

 Operadores Relaciónales: 

Se utilizan para establecer una relación entre dos valores.

Compara estos valores entre si y esta comparación produce un resultado de certeza o falsedad (verdadero o falso).

Los operadores relaciónales comparan valores del mismo tipo (numéricos o cadenas)

Tienen el mismo nivel de prioridad en su evaluación.

Los operadores relaciónales tiene menor prioridad que los aritméticos.

> Mayor que

< Menor que

> = Mayor o igual que

< = Menor o igual que

< > Diferente

= Igual

Ejemplos:

Si a = 10 b = 20 c = 30

a + b > c Falso

a - b < c Verdadero

a - b = c Falso

a * b < > c Verdadero

Ejemplos no lógicos:

a < b < c

10 < 20 < 30

T < 30 (no es lógico porque tiene diferentes operandos)

 Operadores Lógicos: 

Estos operadores se utilizan para establecer relaciones entre valores lógicos.

Estos valores pueden ser resultado de una expresión relacional.

Operadores Lógicos

And            Y

Or           O

Not        Negación

Operador And

Operando1   Operador  Operando2  Resultado

T                  AND               T                 T

T                                         F                  F 

F                                        T                   F

F                                         F                  F

Operador Or

Operando1  Operador  Operando2  Resultado 

T                      OR               T               T

T                                           F              T

F                                          T               T

F                                           F               F

Operador Not

Operando  Resultado

T                     F               F                     T

Ejemplos: 

(a < b) and (b < c)

(10<20) and (20<30)

IDENTIFICADORES

Un identificador es un nombre que se le da a una constante, una variable y a cualquier elemento de programa que necesite nombrarse.

Existen reglas para construir identificadores, las cuales son las siguientes:

Debe comenzar con un caracter alfabético (A - Z, mayúscula o minúscula)

Los demás caracteres pueden ser letras, dígitos o el caracter especial de subrayado (_)

Las letras no deben ser tildadas. No se admiten espacios en blanco. No deberá coincidir con palabras reservadas del lenguaje

algorítmico. (Ejemplo: Var, Const, Entero, Real, etc.)

La longitud de los identificadores puede ser de hasta 8 caracteres.  Este valor dependerá del lenguaje de programación que esté estudiando

Deben ser nombres significativos al programa que se este realizando.

Indicar su tipo (Entero, Real, cadena, caracter o booleano)

Ejemplos de Identificadores válidos:CostoArticuloNuevo_sueldo

DireccionNombre

Horas_Trab

Ejemplo de identificadores no válidos:Nombre1        

#alumnos  profesión        

2categoríaSueldo Neto

Nombre-ApellidoÁrea2

En el mundo de la programación se usan valores que no deben variar durante la ejecución de un programa. A estos valores se les conoce como constantes. También existen valores que deben cambiar a lo largo de la ejecución del programa; estos valores son conocidos como variables.

ConstantesUna constante es una partida de datos que permanecen sin

cambios en el programa (durante el desarrollo y ejecución). Ejemplos:                     3.1416 (valor de pi, este valor no debe variar)2000 (año en que según Nostradamus se acabaría el

mundo XD)‘a’ (primera letra del alfabeto)“ESPOL” (nombre de mi querida universidad)

Variables Una variable es una partida de datos cuyo valor puede

cambiar en el programa (durante el desarrollo y ejecución). Los diferentes tipos de variables dependen del lenguaje de

programación, por lo general estas suelen ser enteras, reales, carácter, lógicas y de cadena.

Tanto las variables como las constantes tienen un nombre o identificador generalmente conformado por caracteres alfanuméricos (ciertos lenguajes de programación admiten el carácter de subrayado ‘_’ como válido en los identificadores), y el primero de éstos debe ser una letra.

Ejemplos: variable1 numerador primer_jugador Por estética y comodidad durante el desarrollo del algoritmo

se suele usar palabras en MAYUSCULAS para las constantes y en minúsculas para las variables. Si se desea usar varias palabras como nombre para una variable, éstas deben estar unidas, la primera palabra en minúsculas y el primer carácter de la segunda en mayúscula

ESTRUCTURAS ALGORITMICAS

Son un grupo de formas de trabajo que permiten mediante la manipulación de variables,realizar ciertos procesos específicos que nos lleven a la solución de problemas. 

Se clasifican en :SECUENCIALESCONDICIONALESCICLICAS

SECUENCIALESSon aquellos en que una acción sigue a otra en secuencia.sus componentes son:

Asignación: Es el paso de valores o resultados a una zona de la memoria, esta zona sera reconocida con el nombre de la variable que recibe el valor.

Entrada: Consiste en recibir un valor o un dato, por medio de algun dispositivo de entrada.

Salida: Se manda el resultado o mensaje, por medio de algun dispositivo de salida del computador.

CONDICIONALESSon  aquellos que permiten comparar una variable  contra otro

valor, se utilizan para tomar decisiones lógicas, existen tres tipos :

Simples: Se ejecuta una determinada acción cuando se cumple  determinada  condición.Ejemplo :

si (condición ) entonces (acción ) fin si

   

Dobles: Son aquellos que permiten elegir entre dos opciones o alternativas posibles.

Ejemplo:

Si < condición > entonces < acción uno > si_no <acción dos> fin_si

Múltiples: son aquellos que permiten elegir cuando hay mas de dos elecciones o alternativas posibles.

Ejemplo: si < condición > entonces

< instrucción >  sino si < condición 2>entonces  < instrucción > sino  . . fin si

CICLICASSon aquellos tipos de estructura que repiten

una secuencia de instrucciones un número determinado de veces, para encontrar la solución a un problema, estas son denominados como bucles, entre los cuales encontramos:

Para: En esta se conoce el numero de iteraciones o veces que se repite la acción, antes de iniciar la ejecución del ciclo.

Mientras Que: Este se repite un numero determinado de veces, para esto la instrucción se acompaña de una condición, la cual debe cumplirse para seguir la ejecución del ciclo, de lo contrario este se termina.

Repita- Hasta: Este repite un proceso una cantidad de veces, determinada por un condicional, que lo ejecuta hasta que la condicional se cumpla.una característica importante de esta estructura es que permite realizar el proceso cuando menos una vez, ya que la condición se evalúa al final del proceso.

BIBLIOGRAFIA

HTTP://www.exa.unicen.edu.ar/catedras/prog1/introprog2/sites/default/files/ApuntesDiagramaEstructura.pdf

  HTTP://blog.espol.edu.ec/programando/variables-y-constantes/  HTTP://claseinfo.blogia.com/temas/identificadores.php  HTTP://sistemasadsi.blogspot.com/2010/09/tipos-de-datos-en-un-algoritmo.html  HTTP://algoritmosextremos.blogspot.com/2012/02/estructuras-

algoritmicas.html  HTTP://www.ie.uia.mx/acad/atortole/temas/proceso.html  HTTP://www.mhe.es/universidad/informatica/8448136640/archivos/

apendice_general_4.pdf