lunes, 17 de noviembre de 2008

TECNICAS PARA PROBLEMAS DE PROGRAMACION


OBJETIVO GENERAL

Dar a conocer técnicas y métodos utilizados en la elaboración de programas, para que el estudiante comprenda su forma de aplicación y las diferencias entre estas.

OBJETIVOS ESPECIFICOS

Conocer métodos y técnicas para elaborar la representación grafica, algorítmica o en seudolenguaje, para un problema.

Aplicar la técnica del análisis en la revisión y comprensión de problemas.

Diseñar soluciones a problemas de programación a partir del análisis, utilizando técnicas de representación, como diagramas de flujo, algoritmos, seudolenguaje u otros.

TECNICAS PARA SOLUCIONAR PROBLEMAS DE PROGRAMACIÓN

La solución de problemas de programación durante años y a través de la historia de la evolución de la tecnología de los computadores, ha recibido aportes valiosos en relación a la forma de crear solución a problemas para automatizar procesos, que sean ejecutados por la maquina.
En ese esfuerzo han trabajado científicos, matemáticos, físicos, ingenieros, y profesionales de muchas áreas de la ciencia, las mismas empresas productoras de computadoras, han desarrollado, técnicas, métodos y lenguajes, para escribir soluciones a problemas.
Técnicas como algoritmos, diagramas de flujo, diagramas de N-S, se han utilizado durante años para el diseño base en la solución de problemas.
Fruto de la experiencia en la enseñanza de la programación, propongo cinco (5) pasos para la construcción de soluciones eficientes a problemas de programación, que representen un alto grado de precisión y seguridad.
Para avanzar en esta fase del curso debe haber trabajado el tema de Métodos de comprensión y solución de problemas, en el que la propuesta consiste en que el estudiante revise y apropie la utilización de estas técnicas o metodologías, para ahora aplicarlas en torno a la solución de problemas de programación.

1. Definición de programación.
1.2 Lenguajes de programación
1.21 Definición de lenguajes de programación
1.2.2 Clasificación de los lenguajes de programación
1.3 Algoritmo
1.4 Diagramas de flujo
1.5 Seudo Algoritmo

Programa

Según el contexto, programa puede tener diversos significados:
Programa informático, secuencia de instrucciones que una computadora puede interpretar y ejecutar;
Aplicación informática, programa informático diseñado para facilitar un determinado tipo de trabajo;
contador de programa, un registro interno del computador;
Programa de Erlangen, un tipo de solución a los problemas de la geometría del tiempo;
Como planificación, es un esquema que muestra la secuencia que lleva a cabo un proceso;
Programa minimalista, un programa de investigación dentro de la gramática transformacional formulado por Noam Chomsky;
Programa de televisión
Ambiciosos o novedosos
proyectos de política o infraestructura gubernamental:
Programa del transbordador espacial
Programa de las Naciones Unidas para el Desarrollo
Programa Mundial de Alimentos
Programa de Naciones Unidas para los Asentamientos Humanos
Programa de las Naciones Unidas para el Medio Ambiente

Programa Memoria del Mundo, una iniciativa internacional propulsada y coordinada por la Unesco;
Programa de desarrollo
Programa Erasmus, forma una parte importante del programa de la Unión Europea Sócrates II.
Programa TACIS, una iniciativa de la Unión Europea destinada a apoyar la transición hacia una economía de mercado y el refuerzo de la democracia en la Comunidad de Estados Independientes (CEI) y en Mongolia;
Programa nuclear de Irán
Exposición de material didáctico o artístico: la presentación ordenada de
contenido secuencial. Programa académico

Categorías relacionadas

LENGUAJE DE PROGRAMACIÓN

Con la aparición de las computadoras desaparecen las secuencias de posiciones de llaves mecánicas que debían desconectarse para obtener una acción determinada, una llave conectada era un 1 y una llave desconectada era un 0. Una sucesión de llaves en cualquiera de sus dos posiciones definía una secuencia de ceros y unos (por ejemplo: 0100011010011101...) que venía a representar una instrucción o un conjunto de instrucciones (programa) para el ordenador (o computador) en el que se estaba trabajando. A esta primera forma de especificar programas para una computadora se la denomina lenguaje máquina o código máquina.

La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador.
Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominación porque tienen una estructura
sintáctica similar a los lenguajes escritos por los humanos.

CONCEPTO

Un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones, y es utilizado para controlar el comportamiento físico y lógico de una máquina.
Aunque muchas veces se usan los términos 'lenguaje de programación' y '
lenguaje informático' como si fuesen sinónimos, no tiene por qué ser así, ya que los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como, por ejemplo, el HTML (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación).

Un lenguaje de programación permite a uno o más programadores especificar de manera precisa sobre qué datos debe operar una computadora, cómo estos datos deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico. Una característica relevante de los lenguajes de programación es precisamente que más de un programador puedan tener un conjunto común de instrucciones que puedan ser comprendidas entre ellos para realizar la construcción del programa de forma colaborativa.

Los procesadores usados en las computadoras son capaces de entender y actuar según lo indican programas escritos en un lenguaje fijo llamado lenguaje de máquina. Todo programa escrito en otro lenguaje puede ser ejecutado de dos maneras:
Mediante un programa que va adaptando las instrucciones conforme son encontradas. A este proceso se lo llama interpretar y a los programas que lo hacen se los conoce como
intérpretes.
Traduciendo este programa al programa equivalente escrito en lenguaje de máquina. A ese proceso se lo llama compilar y al programa traductor se le denomina
compilador.

Clasificación de los lenguajes de programación

Los lenguajes de programación se pueden clasificar atendiendo a varios criterios:

Según el nivel de abstracción
Según la forma de ejecución
Según el paradigma de programación que poseen cada uno de ellos
Según su nivel de abstracción

Lenguajes Maquina

Están escritos en lenguajes directamente inteligibles por la maquina (computadora), ya que sus instrucciones son cadenas binarias (0 y 1). Da la posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior lo que supone una velocidad de ejecución superior, solo que con poca fiabilidad y dificultad de verificar y poner a punto los programas.

Lenguajes de bajo nivel

Los lenguajes de bajo nivel son lenguajes de programación que se acercan al funcionamiento de una computadora. El lenguaje de más bajo nivel por excelencia es el código máquina. A éste le sigue el lenguaje ensamblador, ya que al programar en ensamblador se trabajan con los registros de memoria de la computadora de forma directa.

Lenguajes de medio nivel

Hay lenguajes de programación que son considerados por algunos expertos como lenguajes de medio nivel (como es el caso del lenguaje C) al tener ciertas características que los acercan a los lenguajes de bajo nivel pero teniendo, al mismo tiempo, ciertas cualidades que lo hacen un lenguaje más cercano al humano y, por tanto, de alto nivel.
Lenguajes de alto nivel

Artículo principal: Lenguaje de alto nivel

Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, uno de los lenguajes de alto nivel más conocidos, los comandos como "IF CONTADOR = 10 THEN STOP" pueden utilizarse para pedir a la computadora que pare si el CONTADOR es igual a 10. Esta forma de trabajar puede dar la sensación de que las computadoras parecen comprender un lenguaje natural; en realidad lo hacen de una forma rígida y sistemática, sin que haya cabida, por ejemplo, para ambigüedades o dobles sentidos.
Según la forma de ejecución

Lenguajes compilados

Naturalmente, un programa que se escribe en un lenguaje de alto nivel también tiene que traducirse a un código que pueda utilizar la máquina. Los programas traductores que pueden realizar esta operación se llaman compiladores. Éstos, como los programas ensambladores avanzados, pueden generar muchas líneas de código de máquina por cada proposición del programa fuente. Se requiere una compilación antes de ejecutar las instrucciones de un problema.
Los compiladores son aquellos cuya función es traducir un programa escrito en un determinado lenguaje a un idioma que la computadora entienda (lenguaje máquina con código binario).
Al usar un lenguaje compilado (como lo son, por ejemplo, los lenguajes del popular Visual Studio de Microsoft), el programa desarrollado nunca se podrá ejecutar mientras haya errores, sino hasta que tras haber compilado el programa, ya no aparecen errores en el código.

Lenguajes interpretados

Se puede también utilizar una alternativa diferente de los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la compilación para utilizarlo en una ejecución futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. A continuación, un programa intérprete, almacenado en el sistema operativo del disco, o incluido de manera permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya siendo necesario durante el procesamiento de los datos. El código objeto no se graba para utilizarlo posteriormente.
La siguiente vez que se utilice una instrucción, se la deberá interpretar otra vez y traducir a lenguaje máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo o bucle, cada instrucción del bucle tendrá que volver a ser interpretada en cada ejecución repetida del ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código completo). El intérprete elimina la necesidad de realizar una de compilación después de cada modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante una ejecución del código.
Según el paradigma de programación

Artículo principal: Paradigma de programación

Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro, sino que cada uno tiene ventajas y desventajas. Dependiendo de la situación un paradigma resulta más apropiado que otro.
Atendiendo al paradigma de programación, se pueden clasificar los lenguajes en :

El paradigma imperativo o por procedimientos es considerado el más común y está representado, por ejemplo, por el C o por BASIC.

El paradigma funcional está representado por la familia de lenguajes LISP (en particular Scheme), ML o Haskell.

El paradigma lógico, un ejemplo es PROLOG.

El paradigma orientado a objetos. Un lenguaje completamente orientado a objetos es Smalltalk.
Nota: La representación orientada a objetos mejora la estructura de los datos y por lo tanto se ha aplicado a diferentes paradigmas como
Redes de Petri, Imperativo Secuencial, Lógica de Predicados, Funcional, etc. No obstante, la manipulación no queda fundamentalmente afectada y por lo tanto el paradigma inicial tampoco a pesar de ser re-orientado a objetos.
Si bien puede seleccionarse la forma pura de estos paradigmas a la hora de programar, en la práctica es habitual que se mezclen, dando lugar a la
programación multiparadigma.
Actualmente el paradigma de programación más usado debido a múltiples ventajas respecto a sus anteriores, es la
programación orientada a objetos.

Lenguajes imperativos

Artículo principal: Programación imperativa
BASIC
C
C++
Java
C#
Perl
unerg
Lenguajes Funcionales [editar]
Puros:
Haskell
Miranda

Híbridos:
Lisp
Scheme
Ocaml
Standard ML
ML
Scala

Lenguajes orientados a objetos
ActionScript
Ada
C++
C#
VB.NET
Visual FoxPro
Clarion
Delphi
Harbour
Eiffel
Java
JavaScript
Lexico (en castellano)
Objective-C
Ocaml
Oz
Perl (soporta herencia múltiple)
PHP (en su versión 5)
Python
Ruby
Smalltalk
Magik (SmallWorld)
Algunos lenguajes de programación
ABAP
ABC
ActionScript
Ada
Afnix
ALGOL
AmigaE
APL
ASP
ASP.NET
AWK
B
BASIC
Batch
BCPL
Befunge
Boo
C
C++
C#
Caml
Clipper
CLIPS
CLU
COBOL
CORAL
D
Delphi
DIV
Dylan
Eiffel
Erlang
Ensamblador
Extended ML
Euphoria
Fénix
FISH
Flow-Matic
Forth
FORTRAN
FP
Gambas
GML
GRAFCET
Haskell
H4XX0R
HTML
Icon
Inform
INTERCAL
ISWIM
J
Java
JavaScript
Joy
KWC
Ladder
Letra
Lexico
Lingo
Lisp
Logo
Lua
MAGIC
Mainsail
Mac Army
Mesa
Miranda
ML
Modula
Modula-2
Modula-3
Natural
NetREXX
Oberon
Object REXX
Objective-C
ObjectPAL
Ocaml
Occam
Oz
Pascal
Parlog
Perl
PHP
PL/1
Plankalkül
PostScript
PowerBuilder
Prolog
Python
R
Rapid
REXX
RPN
RPG
Ruby
Sail
Sappler
Sather
Scheme
Scriptol
Seed7
Self
Sh
Simula
Smalltalk
Snobol
SPARK
Squeak
SR
Standard ML
TI-Basic
TCL
VBA
Velneo
Visual Basic
Visual Basic .NET
Visual C++
Visual DialogScript
Visual Foxpro
Visual Java
XBase++
Yurix
ZPL

Software
(pronunciación AFI:[ˈsɔft.wɛɻ]), palabra proveniente del inglés (literalmente: partes blandas o suaves), que en nuestro idioma no posee una traducción adecuada al contexto, por lo cual se utiliza asiduamente sin traducir y fue admitida por la Real Academia Española (RAE).
La palabra «software» se refiere al equipamiento lógico o soporte lógico de un computador digital, comprende el conjunto de los componentes lógicos necesarios para hacer posible la realización de una tarea específica, en contraposición a los componentes físicos del sistema (
hardware).
Tales componentes lógicos incluyen, entre otros,
aplicaciones informáticas tales como procesador de textos, que permite al usuario realizar todas las tareas concernientes a edición de textos; software de sistema, tal como un sistema operativo, el que, básicamente, permite al resto de los programas funcionar adecuadamente, facilitando la interacción con los componentes físicos y el resto de las aplicaciones, también provee una interface ante el usuario.
En la figura 1 se muestra uno o más softwares en ejecución, en este caso con ventanas, iconos y menúes que componen las interfaces gráficas, que comunican el ordenador con el usuario y le permiten interactuar.
Software es el producto en la
Ingeniería de Software.

Definición de Software

Probablemente la definición más formal de software sea la siguiente:
Es el conjunto de los programas de cómputo, procedimientos, reglas, documentación y datos asociados que forman parte de las operaciones de un sistema de computación.
Extraído del estándar 729 del
IEEE[2]
Bajo esta definición, el concepto de software va más allá de los programas de cómputo en sus distintos estados:
código fuente, binario o ejecutable; también su documentación, datos a procesar e información de usuario es parte del software: es decir, abarca todo lo intangible, todo lo "no físico" relacionado.
El término «software» fue usado por primera vez en este sentido por
John W. Tukey en 1957. En las ciencias de la computación y la ingeniería de software, el software es toda la información procesada por los sistemas informáticos: programas y datos. El concepto de leer diferentes secuencias de instrucciones desde la memoria de un dispositivo para controlar los cálculos fue introducido por Charles Babbage como parte de su máquina diferencial. La teoría que forma la base de la mayor parte del software moderno fue propuesta por vez primera por Alan Turing en su ensayo de 1936, "Los números computables", con una aplicación al problema de decisión.

CLASIFICACIÓN DEL SOFTWARE

Si bien esta distinción es, en cierto modo, arbitraria, y a veces confusa, se puede clasificar al software de la siguiente forma:
Software de sistema: Es aquel que permite que el hardware funcione. Su objetivo es desvincular adecuadamente al programador de los detalles del computador en particular que se use, aislándolo especialmente del procesamiento referido a las características internas de: memoria, discos, puertos y dispositivos de comunicaciones, impresoras, pantallas, teclados, etc. El software de sistema le procura al usuario y programador adecuadas interfaces de alto nivel y utilidades de apoyo que permiten su mantenimiento. Incluye entre otros:
Sistemas operativos
Controladores de dispositivo
Herramientas de diagnóstico
Herramientas de Corrección y Optimización
Servidores
Utilidades
Software de programación: Es el conjunto de herramientas que permiten al programador desarrollar programas informáticos, usando diferentes alternativas y lenguajes de programación, de una manera práctica. Incluye entre otros:
Editores de texto
Compiladores
Intérpretes
Enlazadores
Depuradores
Entornos de Desarrollo Integrados (
IDE): Agrupan las anteriores herramientas, usualmente en un entorno visual, de forma que el programador no necesite introducir múltiples comandos para compilar, interpretar, depurar, etc.. Habitualmente cuentan con una avanzada interfaz gráfica de usuario (GUI).
Software de aplicación: Aquel que permite a los usuarios llevar a cabo una o varias tareas específicas, en cualquier campo de actividad susceptible de ser automatizado o asistido, con especial énfasis en los negocios. Incluye entre otros:
Aplicaciones de
Sistema de control y automatización industrial
Aplicaciones ofimáticas
Software educativo
Software médico
Software de
Cálculo Numérico
Software de
Diseño Asistido (CAD)
Software de Control Numérico (
CAM)

PROCESO DE CREACIÓN DE SOFTWARE

Se define como Proceso al conjunto ordenado de pasos a seguir para llegar a la solución de un problema u obtención de un producto, en este caso particular, para lograr la obtención de un producto software que resuelva un problema.

Ese proceso de creación de software puede llegar a ser muy complejo, dependiendo de su porte, características y criticidad del mismo. Por ejemplo la creación de un sistema operativo es una tarea que requiere proyecto, gestión, numerosos recursos y todo un equipo disciplinado de trabajo. En el otro extremo, si se trata de un sencillo programa (ejemplo: resolución de una ecuación de segundo orden), éste puede ser realizado por un solo programador (incluso aficionado) fácilmente. Es así que normalmente se dividen en tres categorías según su tamaño (líneas de código) y/o costo: de Pequeño, Mediano y Gran porte. Existen varias metodologías para estimarlo, una de las más populares es el sistema COCOMO que provee métodos y un software (programa) que calcula estimadamente todos los costos de producción en un "proyecto software" (relación horas/hombre, costo monetario, cantidad de líneas fuente de acuerdo a lenguaje usado, etc.).

Considerando los de gran porte, es necesario realizar tantas y tan complejas tareas, tanto técnicas, de gerenciamiento, fuerte gestión y análisis diversos (entre otras) que toda una ingeniería hace falta para su estudio y realización: es la Ingeniería de Software.

En tanto que en los de mediano porte, pequeños equipos de trabajo (incluso un avesado analista-programador solitario) puede realizar la tarea. Aunque, siempre en casos de mediano y gran porte (y a veces también en algunos de pequeño porte, según su complejidad), se deben seguir ciertas etapas que son necesarias para la construcción del software. Tales etapas, si bien deben existir, son flexibles en su forma de aplicación, de acuerdo a la metodología o Proceso de Desarrollo escogido y utilizado por el equipo de desarrollo o analista-programador solitario (si fuere el caso).

Los "procesos de desarrollo de software" poseen reglas preestablecidas, y deben ser aplicados en la creación del software de mediano y gran porte, ya que en caso contrario lo más seguro es que el proyecto o no logre concluir o termine sin cumplir los objetivos previstos y con variedad de fallos inaceptables (fracasan, en pocas palabras). Entre tales "procesos" los hay ágiles o livianos (ejemplo XP), pesados y lentos (ejemplo RUP) y variantes intermedias; y normalmente se aplican de acuerdo al tipo y porte y tipología del software a desarrollar, a criterio del líder (si lo hay) del equipo de desarrollo. Algunos de esos procesos son Extreme Programming (XP), Rational Unified Process (RUP), Feature Driven Development (FDD), etc.
Cualquiera sea el "proceso" utilizado y aplicado en un desarrollo de software (RUP, FDD, etc), y casi independientemente de él, siempre se debe aplicar un "Modelo de Ciclo de Vida".
Se estima que, del total de proyectos software grandes emprendidos, un 28% fracasan, un 46% caen en severas modificaciones que lo retrazan y un 26% son totalmente exitosos. Cuando un proyecto fracasa, rara vez es debido a fallas técnicas, la principal causa de fallos y fracasos es la falta de aplicación de una buena metodología o proceso de desarrollo. Entre otras, una fuerte tendencia, desde hace pocas décadas, es mejorar las metodologías o procesos de desarrollo, o crear nuevas y concientizar a los profesionales en su utilización adecuada. Normalmente los especialistas en el estudio y desarrollo de estas áreas (metodologías) y afines (tales como modelos y hasta la gestión misma de los proyectos) son los Ingenieros en Software, es su orientación. Los especialistas en cualquier otra área de desarrollo informático (analista, programador, Lic. en Informática, Ingeniero en Informática, Ingeniero de Sistemas, etc.) normalmente aplican sus conocimientos especializados pero utilizando modelos, paradigmas y procesos ya elaborados.

Es común para el desarrollo de software de mediano porte que los equipos humanos involucrados apliquen sus propias metodologías, normalmente un híbrido de los procesos anteriores y a veces con criterios propios.

El proceso de desarrollo puede involucrar numerosas y variadas tareas, desde lo administrativo, pasando por lo técnico y hasta la gestión y el gerenciamiento. Pero casi rigurosamente siempre se cumplen ciertas etapas mínimas; las que se pueden resumir como sigue:
Captura (
elicitación), Especificación y Análisis de requisitos (ERS)
Diseño
Codificación
Pruebas (unitarias y de integración)

Instalación y paso a Producción
Mantenimiento

En las anteriores etapas pueden variar ligeramente sus nombres, o ser más globales, o contrariamente más refinadas; por ejemplo indicar como una única fase (a los fines documentales e interpretativos) de "Análisis y Diseño"; o indicar como "Implementación" lo que está dicho como "Codificación"; pero en rigor, todas existen e incluyen, básicamente,las mismas tareas específicas.
En el apartado 4 del presente artículo se brindan mayores detalles de cada una de las listadas etapas

Introducción.

Los diagramas de flujo son una manera de representar visualmente el flujo de datos a travéz de sistemas de tratamiento de información. Los diagramas de flujo describen que operaciónes y en que secuencia se requieren para solucionar un problema dado.
Un diagrama de flujo u organigrama es una representación diagramática que ilustra la secuencia de las operaciones que se realizarán para conseguir la solución de un problema. Los diagramas de flujo se dibujan generalmente antes de comenzar a programar el código frente a la computadora. Los diagramas de flujo facilitan la comunicación entre los programadores y la gente del negocio. Estos diagramas de flujo desempeñan un papel vital en la programación de un problema y facilitan la comprensión de problemas complicados y sobre todo muy largos. Una vez que se dibuja el diagrama de flujo, llega a ser fácil escribír el programa en cualquier idióma de alto nivel. Vemos a menudo cómo los diagramas de flujo nos dan ventaja al momento de explicar el programa a otros. Por lo tanto, está correcto decir que un diagrama de flujo es una necesidad para la documentación mejor de un programa complejo.

Reglas para dibujar un diagramas de flujo.
Los Diagramas de flujo se dibujan generalmente usando algunos símbolos estándares; sin embargo, algunos símbolos especiales pueden también ser desarrollados cuando séan requeridos. Algunos símbolos estándares, que se requieren con frecuencia para diagramar programas de computadora se muestran a continuación:
Inicio o fin del programa
Pasos, procesos o líneas de instruccion de programa de computo
Operaciones de entrada y salida
Toma de desiciónes y Ramificación
Conector para unir el flujo a otra parte del diagrama
Cinta magnética
Disco magnético
Conector de pagina
Líneas de flujo
Anotación
Display, para mostrar datos
Envía datos a la impresora
Observación: Para obtener la correcta elaboración de los símbolos, existen plantillas. Las puedes conseguir en Papelerías.


Simbolos gráficos

Dentro de los simbolos fundamentales para la creaación de diagramas de flujo, los símbolos gráficos son utilizádos especificamente para para operaciónes aritméticas y relaciónes condicionales. La siguiente es una lista de los símbolos más comunmente utilizados:
+
Sumar
-
Menos
*
Multiplicación
/
División
±
Mas o menos
=
Equivalente a
>
Mayor que
<>
Diferente de

Si

No

True

False

Reglas para la creacion de Diagramas

1. Los Diagramas de flujo deben escribirse de arriba hacia abajo, y/o de izquierda a derecha.
2. Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que indica la dirección que fluye la información procesos, se deben de utilizar solamente líneas de flujo horizontal o verticales (nunca diagonales).
3. Se debe evitar el cruce de líneas, para lo cual se quisiera separar el flujo del diagrama a un sitio distinto, se pudiera realizar utilizando los conectores. Se debe tener en cuenta que solo se vana utilizar conectores cuando sea estrictamente necesario.
4. No deben quedar líneas de flujo sin conectar
5. Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando el uso de muchas palabras.
6. Todos los símbolos pueden tener más de una línea de entrada, a excepción del símbolo final.
7. Solo los símbolos de decisión pueden y deben tener mas de una línea de flujo de salida.


Ejemplos de diagramas de flujo

Diagrama de flujo que encuentra la suma de los primeros 50 numeros naturales
BUENO, Y AHORA LA DESCRIPCIÓN DEL DIAGRAMA ANTERIOR
Suma, es la variable a la que se le va agregando la valor de cada número natural. N, es el contador. Éste recorrerá lo números hasta llegar al 50.
El primer bloque indica el inicio del Diagrama de flujo

El segundo bloque, es un Símbolo de procesos
En este bloque se asume que las variables suma y N han sido declaradas previamente y las inicializa en 0 para comenzar a el conteo y la suma de valores (Para declararlas existe el bloque Tarjeta perforada).

El tercer bloque, es también un Símbolo de procesos
En éste paso se incrementa en 1 la variable N (N = N + 1). Por lo que, en la primera pasada esta N valdrá 1, ya que estaba inicializada en 0.

El cuarto bloque es exactamente lo mismo que el anterior Pero en éste, ya se le agrega el valor de N a la variable que contendrá la suma (En el primer caso contendrá 1, ya que N = 1).

El quinto bloque es uno Símbolo de Toma de decisiones y Ramificación Lo que hay dentro del bloque es una pregunta que se le hace a los valores que actualmente influyen en el proceso (Por decir algo, no se como decirlo, soy muy
¿Es N=50?, Obviamente la respuesta es no, ya que N todavía es 1. por lo que el flujo de nuestro programa se dirigirá hacía la parte en donde se observa la palabra no: Tercer Bloque, éste le sumará 1 (N=N+1) y vuelve a llegar a éste bloque, donde preguntará ¿Es N=50?... ¡No!, todavía es 2. Ha pues, regresa al Tercer bloque y vuelve hacer lo mismo. Y así hasta llegar a 50, obteniendo así la suma de los primeros 50 primeros números naturales.
Por último indicamos que el resultado será mostrado en la impresora (Este lo
puedes cambiarlo por el display para mostrar datos)

.
Fin del programa (o diagrama)


- ¿QUÉ ES UN ALGORITMO?

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.
Uno de los algoritmos más antiguos conocidos es el algoritmo de Euclides. El término algoritmo proviene del matemático Muhammad ibn Musa al-Khwarizmi, que vivió aproximadamente entre los años 780 y 850 d.C. en la actual nación Iraní. El describió la realización de operaciones elementales en el sistema de numeración decimal. De al-Khwarizmi se obtuvo la derivación algoritmo.

- Clasificación de algoritmos

* Algoritmo determinista: en cada paso del algoritmo se determina de forma única el siguiente paso. * Algoritmo no determinista: deben decidir en cada paso de la ejecución entre varias alternativas y agotarlas todas antes de encontrar la solución.
Todo algoritmo tiene una serie de características, entre otras que requiere una serie de recursos, algo que es fundamental considerar a la hora de implementarlos en una máquina. Estos recursos son principalmente: · El tiempo: período transcurrido entre el inicio y la finalización del algoritmo. · La memoria: la cantidad (la medida varía según la máquina) que necesita el algoritmo para su ejecución.Obviamente, la capacidad y el diseño de la máquina pueden afectar al diseño del algoritmo.

En general, la mayoría de los problemas tienen un parámetro de entrada que es el número de datos que hay que tratar, esto es, N. La cantidad de recursos del algoritmo es tratada como una función de N. De esta manera puede establecerse un tiempo de ejecución del algoritmo que suele ser proporcional a una de las siguientes funciones:

1 : Tiempo de ejecución constante. Significa que la mayoría de las instrucciones se ejecutan una vez o muy pocas.

logN : Tiempo de ejecución logarítmico. Se puede considerar como una gran constante. La base del logaritmo (en informática la más común es la base 2) cambia la constante, pero no demasiado. El programa es más lento cuanto más crezca N, pero es inapreciable, pues logN no se duplica hasta que N llegue a N2.

N : Tiempo de ejecución lineal. Un caso en el que N valga 40, tardará el doble que otro en que N valga 20. Un ejemplo sería un algoritmo que lee N números enteros y devuelve la media aritmética.

N·logN : El tiempo de ejecución es N·logN. Es común encontrarlo en algoritmos como Quick Sort y otros del estilo divide y vencerás. Si N se duplica, el tiempo de ejecución es ligeramente mayor del doble.

N2 : Tiempo de ejecución cuadrático. Suele ser habitual cuando se tratan pares de elementos de datos, como por ejemplo un bucle anidado doble. Si N se duplica, el tiempo de ejecución aumenta cuatro veces. El peor caso de entrada del algoritmo Quick Sort se ejecuta en este tiempo.

N3 : Tiempo de ejecución cúbico. Como ejemplo se puede dar el de un bucle anidado triple. Si N se duplica, el tiempo de ejecución se multiplica por ocho.

2N : Tiempo de ejecución exponencial. No suelen ser muy útiles en la práctica por el elevadísimo tiempo de ejecución.
El problema de la mochila resuelto por un algoritmo de fuerza bruta -simple vuelta atrás- es un ejemplo. Si N se duplica, el tiempo de ejecución se eleva al cuadrado.
* Algoritmos polinomiales: aquellos que son proporcionales a Nk. Son en general factibles. * Algoritmos exponenciales: aquellos que son proporcionales a kN. En general son infactibles salvo un tamaño de entrada muy reducido.

- Notación O-grande
En general, el tiempo de ejecución es proporcional, esto es, multiplica por una constante a alguno de los tiempos de ejecución anteriormente propuestos, además de la suma de algunos términos más pequeños. Así, un algoritmo cuyo tiempo de ejecución sea T = 3N2 + 6N se puede considerar proporcional a N2. En este caso se diría que el algoritmo es del orden de N2, y se escribe O(N2)Los
grafos definidos por matriz de adyacencia ocupan un espacio O(N2), siendo N el número de vértices de éste.

La notación O-grande ignora los factores constantes, es decir, ignora si se hace una mejor o peor implementación del algoritmo, además de ser independiente de los datos de entrada del algoritmo. Es decir, la utilidad de aplicar esta notación a un algoritmo es encontrar un límite superior del tiempo de ejecución, es decir, el peor caso.
A veces ocurre que no hay que prestar demasiada atención a esto. Conviene diferenciar entre el peor caso y el esperado. Por ejemplo, el tiempo de ejecución del algoritmo Quick Sort es de O(N2). Sin embargo, en la práctica este caso no se da casi nunca y la mayoría de los casos son proporcionales a N·logN. Es por ello que se utiliza esta última expresión para este método de ordenación.
Una definición rigurosa de esta notación es la siguiente: Una función g(N) pertenece a O(f(N)) si y sólo si existen las constantes c0 y N0 tales que:g(N) <= c0·f(N) , para todo N >= N0.


-
Clasificación de problemas

Los problemas matemáticos se pueden dividir en primera instancia en dos grupos:
* Problemas indecidibles: aquellos que no se pueden resolver mediante un algoritmo. * Problemas decidibles: aquellos que cuentan al menos con un algoritmo para su cómputo.Sin embargo, que un problema sea decidible no implica que se pueda encontrar su solución, pues muchos problemas que disponen de algoritmos para su resolución son inabordables para un computador por el elevado número de operaciones que hay que realizar para resolverlos. Esto permite separar los problemas decidibles en dos: * intratables: aquellos para los que no es factible obtener su solución. * tratables: aquellos para los que existe al menos un algoritmo capaz de resolverlo en un tiempo razonable.

Los problemas pueden clasificarse también atendiendo a su complejidad. Aquellos problemas para los que se conoce un algoritmo polinómico que los resuelve se denominan clase P. Los algoritmos que los resuelven son deterministas. Para otros problemas, sus mejores algoritmos conocidos son no deterministas. Esta clase de problemas se denomina clase NP. Por tanto, los problemas de la clase P son un subconjunto de los de la clase NP, pues sólo cuentan con una alternativa en cada paso.

Un algoritmo es un procedimiento a seguir, para resolver un problema en términos de:

1. Las acciones por ejecutar y el2. El orden en que dichas acciones deben ejecutarse
Un algoritmo nace en respuesta a la aparición de un determinado problema. Una algoritmo esta compuesto de una serie finita de pasos que convergen en la solución de un problema, pero además estos pasos tienen un orden específico.

Entenderemos como problema a cualquier acción o evento que necesite cierto grado de análisis, desde la simpleza de cepillarse los dientes hasta la complejidad del ensamblado de un automóvil. En general, cualquier problema puede ser solucionado utilizando un algoritmo, en este sentido podemos utilizar los algoritmos para resolver problemas de computo.
Un algoritmo para un programador es una herramienta que le permite resaltar los aspectos más importantes de una situación y descartar los menos relevantes. Todo problema de cómputo se puede resolver ejecutando una serie de acciones en un orden específico.
Por ejemplo considere el algoritmo que se elaboraría para el problema o situación de levantarse todas las mañanas para ir al trabajo:

Salir de la cama
quitarse el pijama
ducharse
vestirse
desayunar
arrancar el automóvil para ir al trabajo o tomar transporte.
Nótese que en el algoritmo anterior se ha llegado a la solución del problema en 6 pasos, y no se resaltan aspectos como: colocarse los zapatos después de salir de la cama, o abrir la llave de la regadera antes de ducharse. Estos aspectos han sido descartados, pues no tienen mayor trascendencia, en otras palabras los estamos suponiendo, en cambio existen aspectos que no podemos obviarlos o suponerlos, de lo contrario nuestro algoritmo perdería lógica, un buen programador deberá reconocer esos aspectos importantes y tratar de simplificar al mínimo su problema.

Es importante recalcar que los pasos de un algoritmo no son conmutativos pues, no daría solución al mismo problema a tratar.

Robustez de un Algoritmo

Quiere decir que un algoritmo debe contemplar todas las posibles facetas del problema que queremos resolver, al elaborar un algoritmo no se nos debe escapar ningún detalle que provoque un funcionamiento malo nuestro algoritmo. Si logramos construir un algoritmo robusto, cualquier giro inesperado del problema será controlado por el algoritmo, es decir, debe ser flexible a cambios.

Correctitud de un Algoritmo

Es correcto cuando da una solución al problema a tratar y cumple con todos lo requerimientos especificados tal que cumplamos con los objetivos planteados.

Completitud de un Algoritmo

Cuando un algoritmo cuenta con todos los recursos para poder llegar a una solución satisfactoria
Eficiencia y Eficacia de un Algoritmo
Un algoritmo es eficiente cuando logra llegar a sus objetivos planteados utilizando la menor cantidad de recursos posibles, es decir, minimizando el uso memoria, de pasos y de esfuerzo humano.

Un algoritmo es eficaz cuando alcanza el objetivo primordial, el análisis de resolución del problema se lo realiza prioritariamente.
Puede darse el caso de que exista un algoritmo eficaz pero no eficiente, en lo posible debemos de manejar estos dos conceptos conjuntamente.

Para lograr resolver cualquier problema se deben seguir básicamente los siguientes pasos:
Análisis del Problema. en este paso se define el problema, se lo comprende y se lo analiza con todo detalle.
Diseño del Algoritmo. se debe elaborar una algoritmo que refleje paso a paso la resolución del problema.
Resolución del Algoritmo en la computadora. se debe codificar el algoritmo.

Resolución de problemas utilizando algoritmos

Ejemplo 2.1Una universidad ofrece un curso que prepara a los estudiantes para el examen de obtención de licencia de corredor de bienes raíces. El año anterior, varios de los estudiantes que completaron el curso presentaron el examen para obtener la licencia. Naturalmente la Universidad desea saber que resultados obtuvieron sus estudiantes en el examen. Se nos ha pedido escribir un programa que resuma los resultados recibidos de una lista de 10 estudiantes. Junto a cada nombre se anoto un 1 si el estudiante aprobó el examen y un 2 si reprobó. Exhiba un resumen de los resultados de la prueba indicando el número de estudiantes que aprobaron y el número de estudiantes que reprobaron . Si más de Ocho estudiantes aprueban el examen la Universidad será capaz de aumentar la colegiatura.Exhibir el mensaje "Teclee resultado" en la pantalla cada vez que el programa solicite otro resultado de examen.

Solución

Algoritmo A grandes rasgos:Analizar los resultados del examen y decidir si se debe aumentar o no la colegiatura.Se puede refinar como sigue:Inicializar variablesIntroducir las primeras 10 calificaciones y contar los aprobados y los reprobados.Imprimir un resumen de los resultados de exámenes y decidir si se debe aumentar o no la colegiatura.

Pseudocódigo Es un lenguaje artificial e informal que ayuda a los programadores a desarrollar algoritmos. El Pseudocódigo es similar al lenguaje cotidiano; es cómodo y amable con el usuario, aunque no es realmente in verdadero lenguaje de computadora. No se ejecutan en las computadoras mas bien sirven para ayudar al programadora razonar un programa antes de intentar escribirlo en algún lenguaje. Un programa ejecutado en Pseudocódigo puede ser fácilmente convertido en un programa en C++, si es que esta bien elaborado. Por ejemplo supongamos que la nota para aprobar un examen es de 60. El enunciado en Pseudocódigo sería:

Si calificación >= 60 entoncesMostrar "Aprobado"FinSi
El mismo enunciado se puede escribir en C++ como:
if ( calif >= 60 )cout << "Aprobado"; Nótese que la operación de trasladar el Pseudocódigo a código fuente, se lo realiza con el mínimo esfuerzo, no se necesita de un mayor análisis.

Llevando el Ejemlo2.1 a Pseudocódigo.
Se puede refinar más aun el algoritmo:
Inicializar variables.Inicializar los aprobados (aprobados) en 0Inicializar los reprobados (reprobados) en 0Inicializar el número de estudiantes (estudiantes) en 0Introducir las primeras 10 calificaciones y contar los aprobados y los reprobados.Mientras (while) el contador estuantes es menor o igual que 10 entonces


Introducir el siguiente resultado de examenSi el estudiante aprobó


Sumar 1 a aprobados


Si no

Sumar 1 a reprobados


FinSiSumar 1 al contador estudiantes
FinMientrasImprimir un resumen de los resultados de exámenes y decidir si se debe aumentar o no la colegiatura.Imprimir el número de aprobadosImprimir el número de reprobadosSi estudiantes es más 8 entonces

Imprimir "Aumentar la colegiatura".

FinSi
Simplificando el problema queda escrito en Pseudocódigo de la siguiente forma:







No hay comentarios: