jueves, 5 de enero de 2017

ORIGEN DEL DIAGRAMA DE FLUJO

La paternidad del diagrama de flujo es en principio algo difusa. El método estructurado para documentar gráficamente un proceso como un flujo de pasos sucesivo y alternativos, el "proceso de diagrama de flujo", fue expuesto por Frank Gilbreth, en la Sociedad Americana de Ingenieros Mecánicos (ASME), en 1921, bajo el enunciado de "Proceso de Gráficas-Primeros pasos para encontrar el mejor modo". Estas herramientas de Gilbreth rápidamente encontraron sitio en los programas de ingeniería industrial.

Al principio de los 30, un ingeniero industrial, Allan H. Mogensen comenzó la formación de personas de negocios en Lake Placid, Nueva York, incluyendo el uso del diagrama de flujo. Art Spinanger, asistente a las clases de Mogesen, utilizó las herramientas en su trabajo en Procter & Gamble, donde desarrolló su “Programa Metódico de Cambios por Etapas”.

Otro asistente al grupo de graduados en 1944, Ben S. Graham, Director de Ingeniería de Formcraft Standard Register Corporation, adaptó la Gráfica de flujo de procesos al tratamiento de la información en su empresa. Y desarrolló la Gráfica del proceso de múltiples flujos en múltiples pantallas, documentos, y sus relaciones. En 1947, ASME adoptó un conjunto de símbolos derivados de la obra original de Gilbreth como Norma ASME para los gráficos de procesos (preparada Mishad, Ramsan y Raiaan).Sin embargo, según explica Douglas Hartree fueron originalmente Herman Goldstine yJohn von Neumann quienes desarrollaron el diagrama de flujo (inicialmente llamado "diagrama") para planificar los programas de ordenador.
Las tablas de programación original de flujo de Goldstine y von Neumann, aparecen en un informe no publicado, "Planificación y codificación de los problemas de un instrumento de computación electrónica, la Parte II, Volumen 1 "(1947), reproducido en las obras completas de von Neumann.

Inicialmente los diagramas de flujo resultaron un medio popular para describir algoritmos de computadora, y aún se utilizan con este fin. Herramientas como los diagramas de actividad UML, pueden ser considerados como evoluciones del diagrama de flujo.

En la década de 1970 la popularidad de los diagramas de flujo como método propio de la informática disminuyó, con el nuevo hardware y los nuevos lenguajes de programación de tercera generación. Y por otra parte se convirtieron en instrumentos comunes en el mundo empresarial. Son una expresión concisa, legible y práctica de algoritmos. Actualmente se aplican en muchos campos del conocimiento, especialmente como simplificación y expresión lógica de procesos, etc.

EL FLUJO DE UN PROGRAMA

(SENTENCIAS CONDICIONALES)

La sentencia if, actúa como cabría esperar. Si la condición es verdadera, la sentencia se ejecuta, de otro modo, se salta dicha sentencia, continuando la ejecución del programa con otras sentencias a continuación de ésta. La forma general de la sentencia if es:
if (condición)
sentencia;

Si el resultado del test es verdadero (true) se ejecuta la sentencia que sigue a continuación de if, en caso contrario, falso (false), se salta dicha sentencia, tal como se indica en la figura. La sentencia puede consistir a su vez, en un conjunto de sentencias agrupadas en un bloque.
if (condición){
sentencia1;
}
sentencia2;
En el siguiente ejemplo, si el número del boleto que hemos adquirido coincide con el número aparecido en el sorteo, nos dicen que hemos obtenido un premio.
if(numeroBoleto==numeroSorteo)
System.out.println("has obtenido un premio");

La sentencia if...else

La sentencia if...else completa la sentencia if, para realizar una acción alternativa
if (condición)
sentencia1;
sentencia2
else

Las dos primeras líneas indican que si la condición es verdadera se ejecuta la sentencia 1. La palabra clave else, significa que si la condición no es verdadera se ejecuta la sentencia 2, tal como se ve en la figura..
Dado que las sentencias pueden ser simples o compuestas la forma general de if...else es
if (condición){
sentencia1;
}else{
sentencia2; sentencia3
}
sentencia4;
sentencia5;
Existe una forma abreviada de escribir una sentencia condicional if...else como la siguiente:
if (numeroBoleto==numeroSoreteo)
premio=1000; else
premio=0;
en una sola línea
 premio=(numeroBoleto==numeroSoreteo) ? 1000 : 0;
Un ejemplo significativo es el siguiente: el signo de un número elevado a una potencia par es positivo, y es negativo cuando está elevado a una potencia impar.
 int signo=(exponente%2==0)?1:-1;
La condición entre parántesis es la siguiente: un número es par, cuando el resto de la división entera de dicho número entre dos vale cero.

La sentencia switch

switch1: SwitchApp1.java
switch2: SwitchApp2.java
Como podemos ver en la figura del apartado anterior, la sentencia if...else tiene dos ramas, el programa va por una u otra rama dependiendo del valor verdadero o falso de la expresión evaluada. A veces, es necesario, elegir entre varias alternativas, como se muestra en la siguiente figura

Por ejemplo, considérese las siguientes series de sentencias if...else
if(expresion==valor1)
sentencia1;
else if(expresion==valor2)
sentencia2; else if(expresion==valor3)
sentencia4;
sentencia3;
else
El código resultante puede ser difícil de seguir y confuso incluso para el programador avanzado. El lenguaje Java proporciona una solución elegante a este problema mediante la sentencia condicional switch para agrupar a un conjunto de sentencias if...else.

switch(expresion){
case valor1:
break; //sale de switch
sentencia1; case valor2:
break; //sale switch
sentencia2; case valor3: sentencia3;
sentencia4;
break; //sale de switch default:
}
En la sentencia switch, se compara el valor de una variable o el resultado de evaluar una expresión, con un conjunto de números enteros valor1valor2valor3, .. o con un conjunto de caracteres, cuando coinciden se ejecuta el bloque de sentencias que están asociadas con dicho número o carácter constante. Dicho bloque de sentencias no está entre llaves sino que empieza en la palabra reservada case y termina en su asociado break.

Si el compilador no encuentra coincidencia, se ejecuta la sentencia default, si es que está presente en el código.
Veamos ahora un ejemplo sencillo: dado el número que identifica al mes (del 1 al 12) imprimir el nombre del mes.

Ahora un ejemplo más complicado, escribir un programa que calcule el número de días de un mes determinado cuando se da el año.
Anotar primero, los meses que tienen 31 días y los que tienen 30 días. El mes de Febrero (2º mes) es el más complicado ya que tiene 28 días excepto en los años que son bisiestos que tiene 29. Son bisiestos los años múltiplos de cuatro, que no sean múltiplos de 100, pero si son bisiestos los múltiplos de 400.

VARIABLES Y CONSTANTES




Constantes:
Una constante es un dato numérico o alfanumérico que no cambia durante todo el desarrollo del algoritmo o durante la ejecución del programa. Es un objeto de valor invariable.  Para expresar una constante se escribe explícita mente su valor.

Tipos de Constantes:
  • Constantes Numéricas (Enteras y Reales)
  • Constantes Alfanuméricas
  • Constantes Lógicas (Boolenas)

Las constantes pueden ser:

Constantes sin nombre: Es una expresión numérica donde se puede utilizar directamente el valor.

Constantes con nombre: Se hace una reserva de memoria en la cual se guarda el valor que será utilizado como constante.

Ejemplo:

a) PI = 3.1416

b) E = 2.718228

c) Iva = 0.13




Variables:

Son zonas de memoria cuyo contenido cambia durante la fase de procesamiento de información.

Tipos de variables:

  •  Variables Numéricas (Enteras y Reales)
  •  Variables Alfanuméricas

           a) Caracteres alfabéticos

           b) Dígitos

           c) Caracteres especiales

  •  Variables Lógicas (Boolenas)

Son las que únicamente pueden contener dos valores, los cuales son:

  •  Valor Verdadero ó 1
  •  Valor Falso ó 0

Estos tipos de variables pueden tomar únicamente valores del mismo tipo, es decir si la variable es entera solamente puede almacenar datos enteros.

Ejemplo:

Una variable declarada como cadena solo puede tomar valores correspondientes a ese tipo.

LENGUAJES QUE SOPORTAN LA PROGRAMACIÓN ORIENTADA A OBJETOS

La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que viene a innovar la forma de obtener resultados. Los objetos manipulan los datos de entrada para la obtención de datos de salida específicos, donde cada objeto ofrece una funcionalidad especial.
Muchos de los objetos pre-diseñados de los lenguajes de programación actuales permiten la agrupación en bibliotecas o librerías, sin embargo, muchos de estos lenguajes permiten al usuario la creación de sus propias bibliotecas.
Su uso se popularizó a principios de la década de 1990. En la actualidad, existe una gran variedad de lenguajes de programación que soportan la orientación a objetos.
Los objetos son entidades que tienen un determinado "estado", "comportamiento (método)" e "identidad":

·    La identidad es una propiedad de un objeto que lo diferencia del resto; dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante).
Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos, que favorecen la comunicación entre ellos.
Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.
Los métodos (comportamiento) y atributos (estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta.
El programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podría producir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen a las primeras por el otro. De esta manera se estaría realizando una "programación estructurada camuflada" en un lenguaje de POO.

LENGUAJES QUE SOPORTAN LA PROGRAMACIÓN ESTRUCTURADA




La programación estructurada es un paradigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa de computadora, utilizando únicamente subrutinas y tres estructuras: secuencia, selección (if y switch) e iteración (bucles for y while), considerando innecesario y contraproducente el uso de la instrucción de transferencia incondicional (GOTO), que podría conducir a "código espagueti", que es mucho más difícil de seguir y de mantener, y era la causa de muchos errores de programación.

Surgió en la década de 1960, particularmente del trabajo de Böhm y Jacopini, y una famosa carta, «La sentencia goto, considerada perjudicial», de Edsger Dijkstra en 1968 y fue reforzado teóricamente por el teorema del programa estructurado, y prácticamente por la aparición de lenguajes como ALGOL con adecuadas y ricas estructuras de control.

LAS CUATRO PATAS DE LA PROGRAMACIÓN

TRADUCTORES DE LENGUAJE

Un traductor es un programa que recibe como entrada código escrito en un cierto lenguaje y produce como salida código en otro lenguaje, generalmente el lenguaje de entrada es de más alto nivel que el de salida, por ejemplo, los traductores son los ensambladores y los compiladores.

Cuando programamos en algún lenguajes de alto nivel, lo que estamos haciendo en realidad es el código fuente de ese programa, este código fuente debe ser traducido a lenguaje binario para que las instrucciones que contienen puedan ser entendidas y ejecutadas por la computadora.

Un ensamblador es un programa que traduce de un lenguaje ensamblador a lenguaje máquina, mientras que un compilador es un programa que traduce de un lenguaje de alto nivel a un lenguaje de bajo nivel o a lenguaje máquina.
Un traductor es un programa que toma el texto escrito en un lenguaje (el lenguaje fuente) y lo convierte en el texto equivalente en un segundo lenguaje (el lenguaje destino u objeto).
Si la fuente es un lenguaje abstracto o de alto nivel y si el objetivo es un lenguaje de ensamble de bajo nivel o de máquina, el traductor es un compilador.

Los programas traductores de lenguajes son:

1. Compiladores

2. Interpretes

Debido la complejidad de la programación del lenguaje de máquina, en realidad son muy pocos los programas que se escriben con él. Sin embargo el lenguaje de maquina es el único lenguaje capaz de dar instrucciones directamente al CPU. Por lo tanto, toda instrucción de un programa de lenguaje que no sea de maquina tiene que traducirse al lenguaje de maquina antes de su ejecución.



Esto se realiza mediante el software de sistemas que se llama traductor de lenguaje. Un traductor de lenguaje convierte un código fuente de un programador a su equivalente en lenguaje de máquina. El código de programa de nivel alto se conoce como el código fuente, mientras que el código de lenguaje de maquina se llama código objeto. Hay dos tipos de traductores de lenguajes: intérpretes y compiladores.


Para que un lenguaje de programación sea útil debe de tener un traductor es decir un programa que aceptan otros programas escritos en el lenguaje de cuestión y que, o los ejecuta directamente, o los transforma en una forma adecuada de su ejecución. Un traductor que produce un programa equivalente en una forma adecuada para su ejecución se conoce como compilador.