martes, 25 de octubre de 2016

5 EJEMPLOS DE PSEUDICODIGO A DIAGRAMA DE FLUJO.

1. EJERCICIO
Una ONG tiene puntos de reparto de vacunas que se pretende funcionen de la siguiente manera. Cada día, empezar con 1000 vacunas disponibles y a través de un programa que controla las entregas avisar si el inventario baja de 200 unidades. Desarrollar pseudocódigo y diagrama de flujo.

 
SOLUCIÓN
Pseudocódigo:

1. Inicio [Control de Vacunas aprenderaprogramar.com]
2. Existencias = 1000
3. Mientras Existencias >= 200 Hacer
Mostrar “Introduzca el número de unidades entregadas”
Pedir Entregadas
Existencias = Existencias – Entregadas
Repetir
4. Mostrar “El inventario ha bajado de 200 unidades. Debe comunicarlo”
5. Fin

Comentarios: La variable Existencias funciona como un acumulador que parte de un valor inicial y cuyo valor tras un movimiento depende de su contenido precedente.


Diagrama de flujo:



2. EJERCICIO
Un vivero forestal actualiza cada seis meses los precios de la planta que vende en función de los valores oficiales de inflación mensual. Desean desarrollar un programa que proporcione el precio actualizado a partir del precio anterior y los valores de inflación.


SOLUCIÓN
Consideramos que una vez transcurre el mes el nuevo precio es:

El siguiente mes el precio a aplicar ya no es el inicial, sino el precio afectado por la inflación.
Pseudocódigo:

1. Inicio [Actualización Precios de Plantas aprenderaprogramar.com]
2. Mostrar “Introduzca el precio actual”
3. Pedir Actual
4. Nuevo = Actual
5. Desde i = 1 hasta 6 Hacer
Mostrar “Introduzca la inflación del mes”, i
Pedir inf(i)
Nuevo = Nuevo * (1 + inf(i) / 100)
Siguiente
6. Mostrar “El precio nuevo del producto debe ser”, Nuevo
7. Fin

Diagrama de flujo:



3. EJERCICIO
Desarrollar el pseudocódigo y diagrama de flujo para un algoritmo que calcule la superficie de un terreno que le corresponde a un heredero después de n generaciones, partiendo de una superficie inicial en la generación cero. Se supone que hay división a partes iguales entre herederos.

SOLUCIÓN
Organización previa de variables:

Variable
Descripción - Uso
n
Almacena el número de generaciones
Hgen(1), Hgen(2), ..., Hgen(n)
Array de las variables que almacenan el número de herederos
Supin
Superficie inicial (generación 0)
Toca
Superficie que toca al heredero actualmente considerado


Pseudocódigo y diagrama de flujo:

1. Inicio [Superficie herederos aprenderaprogramar.com]
2. Mostrar “¿Cuál es el número de generaciones?” : Pedir n
3. Mostrar “¿Cuál es la superficie inicial?” : Pedir Supin
4. Toca = Supin
5. Desde i = 1 hasta n Hacer
Mostrar “¿Cuál es el número de herederos de la generación”, i, “?”
Pedir Hgen(i)
Toca = Toca / Hgen(i)
Siguiente
6. Mostrar “Al heredero actual le corresponde una superficie de”, Toca
7. Fin




Comentarios: Nótese cómo es habitual darle valores a los contadores o acumuladores antes de entrar en los bucles. El diagrama de flujo es abreviado.

Otra cuestión interesante es cómo el número de iteraciones del bucle es variable en función del valor de n, que es un dato externo al programa. Podríamos decir que n es una variable controladora del bucle (y del programa).
4. EJERCICIO
Se extraen datos de un archivo en “paquetes” de 100 unidades. Si el número de datos extraídos con valor superior a 600 y menor de 700 es mayor de 100, mostrar el mensaje “Se cumple lo previsto”, indicando el número de datos que se extrajeron cumpliendo frente al total extraído. En caso contrario, continuar extrayendo paquetes de datos (se consideran ilimitados). Plantearlo en pseudocódigo y diagrama de flujo.

Nota: Considerar que los datos se encuentran en un array Dato(1), Dato(2), Dato(...)


SOLUCIÓN
Pseudocódigo:

1. Inicio [Extracción de datos p100 aprenderaprogramar.com]
2. n = 1
3. Mientras Esperado = Falso Hacer
3.1 Desde i = n hasta n + 99 Hacer
Leer Dato(i)
Si Dato(i) > 600 y Dato(i) < 700 Entonces
j = j + 1
FinSi
Siguiente
3.2 Si j > 100 Entonces
Esperado = Verdadero
FinSi
3.3 Si Esperado = Verdadero Entonces
Mostrar “Se cumple lo previsto habiendo extraído”, j, “datos de un total de”, n + 99, “datos”
SiNo
Mostrar “Extracción de un nuevo paquete”
n = n + 100
FinSi
Repetir
4. Fin


Comentarios: La variable booleana Esperado funciona como interruptor para el control del bucle principal así como para una toma de decisión a través de Si ... Entonces. Si bien su uso no es ineludible, usar expresiones como Esperado = Verdadero siempre será más claro y menos engorroso que el uso de relaciones algebraicas más o menos complejas.
En este algoritmo prescindiríamos del interruptor de la siguiente manera:
Modificamos la línea 3 a: Mientras j <= 100 Hacer
· Modificamos la línea 3.2 a:
Si j > 100 Entoces
Mostrar “Se cumple lo previsto habiendo extraído”, j, “datos de un total de”, n + 99, “datos”
SiNo
Mostrar “Extracción de un nuevo paquete”
n = n + 100
FinSi

· Eliminamos la línea 3.3
Esta opción es igual de válida que la anterior, pero más difícil de seguir e interpretar.


Diagrama de flujo:
5. EJERCICIO
En un complejo industrial se desea incentivar a los encargados de turnos de producción. A cada encargado le corresponde un turno. Hay 18 turnos, y por cada uno de ellos 40 operarios. Para evaluar a los encargados se ha hecho una encuesta entre los trabajadores. Se les ha pedido que evalúen a su encargado de 0 a 10 siendo el 5 el aprobado. Los resultados están almacenados en un array tipo Nota(turno, operario) donde turno indica el número de turno y operario el número de operario dentro del turno.

Desarrollar el pseudocódigo y diagrama de flujo para un algoritmo que determine en qué turnos todos los operarios del mismo han aprobado al encargado.
SOLUCIÓN
Organización de variables:

Variable
Descripción - Uso
i, j
Uso como contadores
Nota(i,j)
Array de variables que almacenan la puntuación otorgada al encargado por el operario nº j del turno nº i
Haysuspensos
Interruptor que vale verdadero si algún operario del turno suspende al encargado y falso en caso contrario


Pseudocódigo:

1. Inicio [Evaluación de encargados aprenderaprogramar.com]
2. Desde i = 1 hasta 18 Hacer
2.1 Desde j = 1 hasta 40 Hacer
Leer Nota(i,j)
Si Nota(i,j) < 5 Entonces
Haysuspensos = Verdadero
FinSi
Siguiente
2.2 Si Haysuspensos = Falso Entonces
Mostrar “Todos los operarios del turno”, i, “han aprobado al encargado”
FinSi
2.3 Haysuspensos = Falso
Siguiente
3. Fin


Comentarios: Nótese cómo el uso de un interruptor simplifica una evaluación de múltiples condicionantes.

La evaluación propuesta es equivalente a:

Si Nota(i,j) < 5 ó Nota(i,j+1) < 5 ó Nota(i,j+2) < 5 ó ... ó Nota(i,40) < 5 Entonces
Haysuspensos = Verdadero
FinSi


Obviamente con los recursos que conocemos ya no tiene sentido pensar en este tipo de enumeración de condiciones.
Otro aspecto interesante es que cuando se han extraído las conclusiones derivadas del estado del interruptor y se va a empezar un nuevo ciclo, hay que “apagar” el interruptor. En caso contrario nos enfrentamos a conclusiones erróneas, de las que se pueden derivar los ya consabidos malfuncionamientos, errores, bloqueos, etc. Por tanto, precaución frente a este tipo de olvidos pues es también de los habituales. En un programa largo y complejo, puede hacerse difícil dar con el interruptor que está fallando.

Ilustración: Utilizamos una instrucción Desde ... Siguiente cuando el número de iteraciones es definido. A su vez un interruptor nos sirve para obtener información de lo que ha ocurrido durante el proceso de datos.


Diagrama de flujo aprenderaprogramar.com:

SIMBOLOGIA DE LOS DIAGRAMAS DE FLUJJO.


DIFERENCIAS ENTRE VARIABLE Y CONSTANTE.


Constantes


def: Una constante es un dato cuyo valor no puede cambiar durante la ejecución del programa. Recibe un valor en el momento de la compilación y este permanece inalterado durante todo el programa.



Como ya se ha comentado en el tema sobre las partes de un programa, las constantes se declaran en una sección que comienza con la palabra reservada const. Después de declarar una constante ya puedes usarla en el cuerpo principal del programa. Tienen varios usos: ser miembro en una expresion, en una comparación, asignar su valor a una variable, etc.
En el siguiente ejemplo se contemplan varios casos:

const
    Min = 0;
    Max = 100;
    Sep = 10;
  var 
    i : integer;

  begin
    i := Min;
    while i < Max do begin
      writeln(i);
      i := i + Sep
    end
  end.


En este ejemplo se declaran tres constantes (Min, Max y Sep). En la primera línea del cuerpo del programa se asigna una constante a una variable. En la siguiente, se usa una constante en una comparación. Y en la cuarta, la constante Sep interviene en una expresión que se asigna a una variable. El resultado de ejecutar este programa sería una impresión en pantalla de los números: 0, 10, 20, 30, 40, 50, 60, 70, 80 y 90


Variables

def: Una variable es un nombre asociado a un elemento de datos que está situado en posiciones contiguas de la memoria principal, y su valor puede cambiar durante la ejecución de un programa.



Toda variable pertenece a un tipo de dato concreto. En la declaración de una variable se debe indicar el tipo al que pertenece. Así tendremos variables enteras, reales, booleanas, etc.   

begin
      ...
     i:=1;
     readln(n);
     while i < n do begin
        (* cuerpo del bucle *)
        i := i + 1
     end;
      ...
   end.

Diferencias entre ambas

Después de haber visto cada una por separado, pasemos a explicar las diferencias que existen entre constantes y variables. A primera vista pudieran parecer conceptos similares, pero realmente son cosas muy distintas. Y esta distinción viene dada por la posibilidad que tienen las variables para cambiar de valor.
Principales diferencias:
  • Las constantes ya reciben un valor inicial en su declaración
  • Las variables primero se declaran, luego se inician, y luego se usan
  • Las constantes, una vez declaradas mantienen su valor durante toda la ejecución del programa
  • En cambio, las variables pueden cambiar su valor tantas veces como deseen
  • Además de cambiar su valor, las variables también pueden cambiar de tamaño en tiempo de ejecución (punteros)



viernes, 7 de octubre de 2016

CLASES DE ALGORITMOS.

Se ha clasificado a los algoritmos de diversas formas, de acuerdo con algunos de sus atributos. Por ejemplo:
 A) Según el sistema de signos con el que describen los pasos a seguir, se reconocen:
Algoritmos cualitativos: cuando se hace a través de palabras, es decir, las instrucciones son verbales. Sucede, por ejemplo, con recetas de cocina.
Algoritmos cuantitativos: cuando se hace a través de cálculos numéricos. Se puede hacer un algoritmo, por ejemplo, para obtener la raíz cuadrada de un número.
 B) Según su función, los algoritmos pueden ser:
Algoritmos de ordenamiento: secuencian los elementos que ingresan a partir de un cierto orden, en general, según un orden numérico o léxico.
Algoritmos de búsqueda: al contrario de realizar operaciones o secuenciar elementos, se dedica a encontrar dentro de una lista que ingresa, uno o varios elementos en particular que cumplan con el conjunto de condiciones dadas.
Algoritmos de encaminamiento: deciden de qué modo se deberá transmitir algo que llega, y cómo seguirá un conjunto de pasos encadenados. Se dividen fundamentalmente entre adaptativos y estáticos, los primeros con cierta capacidad de aprendizaje y ajuste a la circunstancia, mientras que los segundos funcionan mecánicamente, siempre del mismo modo. Es importante decir que los algoritmos de encaminamiento cuentan con una propia subdivisión, según el camino que se toma para que la transmisión llegue de manera efectiva (ejemplos de estos tipos son: por el camino más corto, de manera óptima, basado en el flujo, etc.).
C) También los algoritmos han sido clasificados según la estrategia que se utiliza para llegar al resultado. Veamos algunos ejemplos:
Algoritmos probabilísticos: no se puede estar seguro de la exactitud de la respuesta que darán. Se agrupan en distintos subtipos, pero con esa premisa: o bien presentan soluciones aproximadas del problema, o bien presentan soluciones que pueden ser correctas pero también erróneas.
Algoritmo cotidiano: es el que se da en la vida común de las personas, no se aplica en sistemas informáticos ni en nada ajeno al día a día. Muchas de las decisiones que se toman desde que uno se despierta por la mañana pertenecen a este grupo.
Algoritmo heurístico: abandona alguno de los objetivos como recurso para terminar llegando a la solución. En general, son utilizados cuando no existe una solución mediante las vías tradicionales.
Algoritmo de escalada: se comienza con una solución insatisfactoria (que no cumple la entrada y la salida), y se la va modificando aproximándose a lo que se busca. En algún momento, estaremos cerca de (o llegaremos a) la solución correcta.
Algoritmo voraz: Con la idea de llegar a una solución óptima definitiva, elige analizar cada paso como único y elegir la solución óptima para ese paso.
Algoritmo determinista: es completamente lineal (cada paso tiene un paso sucesor y un paso predecesor) y por lo tanto predictivo, si se conocen sus entradas y su forma de proceder. El algoritmo de Euclides, que permite averiguar el máximo común divisor entre dos números, responde a este tipo. Se distinguen de los no deterministas, donde el algoritmo tiene un comportamiento en forma de árbol.
DEF. ALGORITMOS.

En matemáticas, lógica, ciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín, dixit algorithmus y éste a su vez del matemático persa Al-Juarismi) es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite llevar a cabo una actividad mediante pasos sucesivos que no generen dudas a quien deba hacer dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemática son el algoritmo de multiplicación, para calcular el producto, el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un sistema de ecuaciones lineales.