martes, 10 de marzo de 2015

Estructuras de control, Decisión y Repetitiva.

 Estructuras de control.


Llamaremos estructuras de control a las acciones que tienen como objeto marcar el orden de ejecución de las instrucciones y que van a servirnos para escribir concisamente y sin ambigüedades los algoritmos.
Todas las estructuras de control que estudiaremos estarán compuestas de unos elementos básicos (léxico) y una estructura (sintaxis.)

Existen tres tipos fundamentales de estructuras de control:
  • Secuencial.
  • Alternativa.
  • Repetitiva.


Estructura Secuencial

Dibujo
La estructura secuencial es la más sencilla de todas, simplemente indica al procesador que debe ejecutar de forma consecutiva una lista de acciones (que pueden ser, a su vez, otras estructuras de control); para construir una secuencia de acciones basta con escribir cada acción en una linea diferente.
En una estructura sceuencial una instrucción sigue a otra en una secuencia lineal.




Estructura Alternativa (o Selectivas)


La estructura alternativa permite bifurcar el “flujo” del programa en función de una expresión lógica; disponemos de tres estructuras alternativas diferentes: alternativa simple, alternativa doble y alternativa múltiple.
Alternativa simple : Se realiza una acción o conjunto de acciones si se cumple una determinada condición

Alternativa doble: Si una condición se cumple se realizan unas acciones, si no se cumple la condición se realizan otras.

Alternativa múltiple : Dependiendo del valor de una variable se realizan unas acciones u otras.



Estructura Repetitiva


La estructura repetitiva o iterativa permite, como su propio nombre indica, repetir una acción (o grupo de acciones); dicha repetición puede llevarse a cabo un número prefijado de veces o depender de la evaluación de una expresión lógica. Existen tres tipos de estructuras repetitivas: desde-hasta, mientras y repetir-hasta.
 

Operadores lógicos.

Operadores lógicos. 

    • Los operadores lógicos. Permiten agrupar expresiones lógicas. Las expresiones lógicas son todas aquellas expresiones que obtienen como resultado verdadero o falso. Estos operadores unen estas expresiones devolviendo también verdadero o falso. Por ejemplo: (18>6) && (20<30) devuelve verdadero (1) ya que la primera expresión (18>6) es verdadera y la segunda (20<30) también

El operador Y (&&) devuelve verdadero cuando las dos expresiones son verdaderas. El operador O (||) devuelve verdadero cuando cualquiera de las dos es verdadera. Finalmente el operador NO (!) invierte la lógica de la expresión que le sigue; si la expresión siguiente es verdadera devuelve falso y viceversa. Por ejemplo !(18>15) devuelve falso (0).
    • Operador de asignación. Ya se ha comentado que el signo “=” sirve para asignar valores. Se entiende que es un operador debido a la complejidad de expresiones de C. Por ejemplo:
      1
      2
      3
      
       int x=5,y=6,z=7;
       x=(z=y++)*8;
       cout&lt;&lt;x;
En C++ existen estas formas abreviadas de asignación. Esto sirve como abreviaturas para escribir código. Así la expresión:
x=x+10;   Se puede escribir como:  x+=10;
  • Operador ?. Permite escribir expresiones condicionales. Su uso es el siguiente:
    Expresión_a_valorar?Si_verdadera:Si_falsa
    Ejemplo:  x=(y>5?’A’:’B’);
    Significa que si la variable y es mayor de 5, entonces a x se le asigna el carácter ‘A’, sino se le asignará el carácter ‘B’.Otro ejemplo: 
    1
    2
    3
    
    int nota;
    cin&gt;&gt;nota;
    cout&lt;=5?”Aprobado”:”Suspenso”);
    En este ejemplo si la nota leída es superior a 5 se escribe Aprobado y si no Suspenso.

Operadores relacionales en protramación.

Los operadores aritméticos


Java tiene cinco operadores aritméticos cuyo significado se muestra en la tabla adjunta
OperadorNombreEjemplo
+Suma3+4
-Diferencia3-4
*Producto3*4
/Cociente20/7
%Módulo20%7
El cociente entre dos enteros da como resultado un entero. Por ejemplo, al dividir 20 entre 7 nos da como resultado 2.
El operador módulo da como resultado el resto de la división entera. Por ejemplo 20%7 da como resultado 6 que es el resto de la división entre 20 y 7.
El operador módulo también se puede emplear con números reales. Por ejemplo, el cociente entre 7.5 y 3.0 es 2.5 y el resto es cero, es decir, 7.5=3.0 x 2.5+ 0. El operador módulo, funciona de la siguiente forma 7.5=3.0 x 2+1.5, calcula la diferencia entre el dividendo (7.5)  y el producto del divisor (3.0) por la parte entera (2) del cociente, devolviendo 1.5. Así pues, la operación 7.5%3.0 da como resultado 1.5.

El operador asignación

Nos habremos dado cuenta que el operador más importante y más frecuentemente usado es el operador asignación =, que hemos empleado para la inicialización de las variables. Así,
 int numero;
 numero=20;
la primera sentencia declara una variable entera de tipo int y le da un nombre (numero). La segunda sentencia usa el operador asignación para inicializar la variable con el número 20.
Consideremos ahora, la siguiente sentencia.
 a=b;
que asigna a a el valor de b. A la izquierda siempre tendremos una variable tal como a, que recibe valores, a la derecha otra variable b, o expresión que tiene un valor. Por tanto, tienen sentido las expresiones
 a=1234;
 double area=calculaArea(radio);
 superficie=ancho*alto;
Sin embargo, no tienen sentido las expresiones
 1234=a;
 calculaArea(radio)=area;
Las asignaciones múltiples son también posibles. Por ejemplo, es válida la sentencia
 c=a=b;   //equivalente a c=(a=b);
la cual puede ser empleada para inicializar en la misma línea varias variables
 c=a=b=321;  //asigna 321 a a, b y c
El operador asignación se puede combinar con los operadores aritméticos
ExpresiónSignificado
x+=yx=x+y
x-=yx=x-y
x*=yx=x*y
x/=yx=x/y
Así, la sentencia
 x=x+23;
evalúa la expresión x+23, que es asignada de nuevo a x. El compilador lee primero el contenido de la porción de memoria nombrada x, realiza la suma, y guarda el resultado en la misma porción de memoria. Se puede escribir la sentencia anterior de una forma equivalente más simple
 x+=23;

Concatenación de strings

En Java se usa el operador + para concatenar cadenas de carcateres o strings. Veremos en el siguiente apartado una sentencia como la siguiente:
       System.out.println("la temperatura centígrada es "+tC);
El operador + cuando se utiliza con strings y otros objetos, crea un solo string que contiene la concatenación de todos sus operandos. Si alguno de los operandos no es una cadena, se convierte automáticamente en una cadena. Por ejemplo, en la sentencia anterior el número del tipo double que guarda la va

Operadores aritméticos en programación.

Los operadores aritméticos


Java tiene cinco operadores aritméticos cuyo significado se muestra en la tabla adjunta
OperadorNombreEjemplo
+Suma3+4
-Diferencia3-4
*Producto3*4
/Cociente20/7
%Módulo20%7
El cociente entre dos enteros da como resultado un entero. Por ejemplo, al dividir 20 entre 7 nos da como resultado 2.
El operador módulo da como resultado el resto de la división entera. Por ejemplo 20%7 da como resultado 6 que es el resto de la división entre 20 y 7.
El operador módulo también se puede emplear con números reales. Por ejemplo, el cociente entre 7.5 y 3.0 es 2.5 y el resto es cero, es decir, 7.5=3.0 x 2.5+ 0. El operador módulo, funciona de la siguiente forma 7.5=3.0 x 2+1.5, calcula la diferencia entre el dividendo (7.5)  y el producto del divisor (3.0) por la parte entera (2) del cociente, devolviendo 1.5. Así pues, la operación 7.5%3.0 da como resultado 1.5.

El operador asignación

Nos habremos dado cuenta que el operador más importante y más frecuentemente usado es el operador asignación =, que hemos empleado para la inicialización de las variables. Así,
 int numero;
 numero=20;
la primera sentencia declara una variable entera de tipo int y le da un nombre (numero). La segunda sentencia usa el operador asignación para inicializar la variable con el número 20.
Consideremos ahora, la siguiente sentencia.
 a=b;
que asigna a a el valor de b. A la izquierda siempre tendremos una variable tal como a, que recibe valores, a la derecha otra variable b, o expresión que tiene un valor. Por tanto, tienen sentido las expresiones
 a=1234;
 double area=calculaArea(radio);
 superficie=ancho*alto;
Sin embargo, no tienen sentido las expresiones
 1234=a;
 calculaArea(radio)=area;
Las asignaciones múltiples son también posibles. Por ejemplo, es válida la sentencia
 c=a=b;   //equivalente a c=(a=b);
la cual puede ser empleada para inicializar en la misma línea varias variables
 c=a=b=321;  //asigna 321 a a, b y c
El operador asignación se puede combinar con los operadores aritméticos
ExpresiónSignificado
x+=yx=x+y
x-=yx=x-y
x*=yx=x*y
x/=yx=x/y
Así, la sentencia
 x=x+23;
evalúa la expresión x+23, que es asignada de nuevo a x. El compilador lee primero el contenido de la porción de memoria nombrada x, realiza la suma, y guarda el resultado en la misma porción de memoria. Se puede escribir la sentencia anterior de una forma equivalente más simple
 x+=23;

Concatenación de strings

En Java se usa el operador + para concatenar cadenas de carcateres o strings. Veremos en el siguiente apartado una sentencia como la siguiente:
       System.out.println("la temperatura centígrada es "+tC);
El operador + cuando se utiliza con strings y otros objetos, crea un solo string que contiene la concatenación de todos sus operandos. Si alguno de los operandos no es una cadena, se convierte automáticamente en una cadena. Por ejemplo, en la sentencia anterior el número del tipo double que guarda la va

Tipos de datos.

1. Tipos de datos.

A partir de Algol-68 todos los lenguajes ofrecen una serie de tipos básicos y unos constructores para poder formar nuevos datos estructurados.
1.1
Tipos de datos primitivos
  • Son tipos no definidos en términos de otros tipos. Con estos tipos de datos primitivos y con los constructores de tipos se pueden definir tipos estructurados. Los tipos de datos primitivos que aparecen en la mayoría de los lenguajes de programación son:
  • Entero
  • Real o Flotante
  • Booleano
  • Carácter
  • Entero: Ada, C: short, long ( para cambiar el rango )
C: unsignal (enteros sin signo )
  • Real o Flotante: real o float
double ( precisión )
  • Booleano: True, False -> Rango de este tipo
(excepción -> C ) => 0 : Falso
!= 0 : Verdadero
  • Carácter: se almacena el código asociado al carácter.
1.2
Tipos ordinales definidos por el usuario
  • Un tipo ordinal es aquel cuyo rango de posibles valores puede asociarse fácilmente con el conjunto de los enteros positivos. Podemos establecer un orden dentro del tipo.
  • En Pascal son ordinales: Entero, Booleano y Carácter.
  • Muchos lenguajes le permiten al usuario definir nuevos tipos ordinales. Formas:
  • Mediante Enumerados

  • Subrango.

Variable (programación)

En programación, una variable está formada por un espacio en el sistema de almacenaje (memoria principal de un ordenador) y un nombre simbólico (un identificador) que está asociado a dicho espacio. Ese espacio contiene una cantidad o información conocida o desconocida, es decir un valor. El nombre de la variable es la forma usual de referirse al valor almacenado: esta separación entre nombre y contenido permite que el nombre sea usado independientemente de la información exacta que representa. El identificador, en el codigo fuente de la computadora puede estar ligado a un valor durante el tiempo de ejecución y el valor de la variable puede por lo tanto cambiar durante el curso de la ejecución del programa. El concepto de variables en computación puede no corresponder directamente al concepto de variables en matemática. El valor de una variable en computación no es necesariamente parte de una ecuación o fórmula como en matemáticas. En computación una variable puede ser utilizada en un proceso repetitivo: puede asignársele un valor en un sitio, ser luego utilizada en otro, más adelante reasignársele un nuevo valor para más tarde utilizarla de la misma manera.Procedimientos de este tipo son conocidos con el nombre de iteración. En programación de computadoras, a las variables, frecuentemente se le asignan nombres largos para hacerlos relativamente descriptivas para su uso, mientras que las variables en matemáticas a menudo tienen nombres escuetos, formados por uno o dos caracteres para hacer breve en su transcripción y manipulación.
El espacio en el sistema de almacenaje puede ser referido por distintos identificadores diferentes. Esta situación es conocida entre los angloparlantes como "aliasing" y podría traducirse como "sobrenombramiento" para los hispanoparlantes. Asignarle un valor a una variable utilizando uno de los identificadores cambiará el valor al que se puede acceder a través de los otros identificadores.
Los compiladores deben reemplazar los nombres simbólicos de las variables con la real ubicación de los datos. Mientras que el nombre, tipo y ubicación de una variable permanecen fijos, los datos almacenados en la ubicación pueden ser cambiados durante la ejecución del programa.
Las variables pueden ser de longitud:
  • Fija.- Cuando el tamaño de la misma no variará a lo largo de la ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo algunas excepciones — como las colecciones de otras variables (arrays) o las cadenas.
  • Variable.- Cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos.

Tipos de datos

Debido a que las variables contienen o apuntan a valores de tipos determinados, las operaciones sobre las mismas y el dominio de sus propios valores están determinadas por el tipo de datos en cuestión. Algunos tipos de datos usados:

Variables y paso de parámetros a subalgoritmos

Las variables pueden ser intercambiadas entre rutinas, por valor y por referencia:
  • Por valor.- Se copia el valor (el dato) de la variable en la zona de la pila de llamadas —de ámbito local— que corresponde a la nueva subrutina llamada. Por tanto, esta subrutina obtiene dicho valor pero no puede modificar la variable original. Esto significa que si la variable sufre alteraciones dentro de esta rutina, para poder acceder a dichas modificaciones al finalizar, deberá devolver el nuevo valor de la misma. Si no se realiza esta operación, el valor de la variable será exactamente el mismo que tenía antes de pasar por la función.
  • Por referencia.- No se pasa el valor directamente de la variable, si no una referencia o puntero a la misma —que contiene la dirección de la zona de memoria donde se aloja el contenido—, de tal modo que se opera directamente sobre la zona de memoria que la contiene, lo cual implica que las modificaciones que sufra serán accesibles a posteriori.

Almacenamiento de variables en memoria


Las variables se representan con identificadores que hacen referencia a un lugar de la memoria del programa en donde se almacena un dato. Una variable está asociada a un tipo de datos, el cual y en función del tamaño del mismo determina la cantidad de bytes que serán necesarios para almacenar la variable. En el caso de colecciones y al contrario que con el resto de tipo de datos, ya sean primitivos u objetos complejos, la memoria asignada a almacenar tales variables no se conoce de antemano, lo cual lleva a establecer políticas de reserva de memoria:
  • Reserva fija de memoria.- Implica predeterminar la cantidad de memoria que se asignará a la colección. Es una política extremadamente rígida, ya que llegados al final de la zona de memoria no se podrían almacenar nuevos elementos.
  • Reserva variable de memoria.- Se dedica una zona de memoria, pudiendo ser de un tamaño predeterminado o no, y en caso de sobrepasarse dicha zona de memoria se vuelve a asignar otra zona, contigua o no, para impedir la restricción mencionada arriba.

Ámbito

Respecto al ámbito de una variable, éste puede ser:
  • Local: Cuando la misma sólo es accesible desde un único procedimiento hijo, no pudiendo ser leída o modificada desde otro procedimiento hermano o desde el propio procedimiento padre. Es posible declarar variables en bloques de condición, bucles, etc de tal modo que sólo pueda accederse a ellas en el propio bloque.
  • Global: Cuando la misma es accesible tanto desde rutinas o macros de la aplicación, como en todos los procedimientos y funciones de la misma.
Si bien es cierto, que de una forma básica, se puede definir el ámbito de las variables de la forma expuesta más arriba, existen grados de globalidad de las mismas, pudiendo ser accesibles desde unos puntos u otros, o incluso pudiendo ser accesibles entre aplicaciones distintas, llegando al caso de la superglobalidad. Ejemplo del ámbito de una variable en el lenguaje de programación Java.
 public class A {
    public Integer numeroEntero = new Integer(); /* Variable Global a todos los Métodos */
 
    public Integer metodo() {
       int num = 1; // Variable Local a metodo. Puede accederse dentro de este método en cualquier parte, pero no fuera del mismo.
       for (int i = 0;i<numeroEntero.intValue();i++) { // i es local al bucle for, sólo puede ser accedida dentro del mismo.
           num *= i;
       }
       // i = 2; Esta línea provocaría error al no haber declarado la variable i. i fue definida localmente al bucle for.
       return Integer.valueOf(num);
    }
 
    public void otroMetodo() {
       int num = 1; // Variable local a otroMetodo. num aquí es una variable distinta a la variable num de metodo
       System.out.println("Variable local num: " + num);
    }
 }
Hay que tener en cuenta que en Java el caso de las variables globales a todos los métodos que se encuentran en una clase, es algo peculiar, ya que estas realmente son atributos que definen un objeto de una clase determinada, en este caso la clase A tiene un atributo llamado numeroEntero. El atributo es un concepto que define a un objeto de una clase determinada, mientras que una variable sirve de apoyo a los procedimientos y no define conceptualmente objetos.

Qué es un Diagrama de Flujo – Gestión de Procesos

Un diagrama de flujo es una representación gráfica de un proceso. Cada paso del proceso es representado por un símbolo diferente que contiene una breve descripción de la etapa de proceso. Los símbolos gráficos del flujo del proceso están unidos entre sí con flechas que indican la dirección de flujo del proceso.
 El diagrama de flujo ofrece una descripción visual de las actividades implicadas en un proceso mostrando la relación secuencial ente ellas, facilitando la rápida comprensión de cada actividad y su relación con las demás, el flujo de la información y los materiales, las ramas en el proceso, la existencia de bucles repetitivos, el número de pasos del proceso, las operaciones de interdepartamentales… Facilita también la selección de indicadores de proceso

Beneficios del Diagrama de Flujo

  • En primer lugar, facilita la obtención de una visión transparente del proceso, mejorando su comprensión. El conjunto de actividades, relaciones e incidencias de un proceso no es fácilmente discernible a priori. La diagramación hace posible aprehender ese conjunto e ir más allá, centrándose en aspectos específicos del mismo, apreciando las interrelaciones que forman parte del proceso así como las que se dan con otros procesos y subprocesos.
  • Permiten definir los límites de un proceso. A veces estos límites no son tan evidentes, no estando definidos los distintos proveedores y clientes (internos y externos) involucrados.
  • El diagrama de flujo facilita la identificación de los clientes, es más sencillo determinar sus necesidades y ajustar el proceso hacia la satisfacción de sus necesidades y expectativas.
  • Estimula el pensamiento analítico en el momento de estudiar un proceso, haciendo más factible generar alternativas útiles.
  • Proporciona un método de comunicación más eficaz, al introducir un lenguaje común, si bien es cierto que para ello se hace preciso la capacitación de aquellas personas que entrarán en contacto con la diagramación.
  • Un diagrama de flujo ayuda a establecer el valor agregado de cada una de las actividades que componen el proceso.
  • Igualmente, constituye una excelente referencia para establecer mecanismos de control y medición de los procesos, así como de los objetivos concretos para las distintas operaciones llevadas a cabo.
  • Facilita el estudio y aplicación de acciones que redunden en la mejora de las variables tiempo y costes de actividad e incidir, por consiguiente,  en la mejora de la eficacia y la eficiencia.
  • Constituyen el punto de comienzo indispensable para acciones de mejora  o reingeniería.

Qué es un Diagrama de Flujo – Gestión de Procesos


Un diagrama de flujo es una representación gráfica de un proceso. Cada paso del proceso es representado por un símbolo diferente que contiene una breve descripción de la etapa de proceso. Los símbolos gráficos del flujo del proceso están unidos entre sí con flechas que indican la dirección de flujo del proceso.
 El diagrama de flujo ofrece una descripción visual de las actividades implicadas en un proceso mostrando la relación secuencial ente ellas, facilitando la rápida comprensión de cada actividad y su relación con las demás, el flujo de la información y los materiales, las ramas en el proceso, la existencia de bucles repetitivos, el número de pasos del proceso, las operaciones de interdepartamentales… Facilita también la selección de indicadores de proceso



Beneficios del Diagrama de Flujo[1]

  • En primer lugar, facilita la obtención de una visión transparente del proceso, mejorando su comprensión. El conjunto de actividades, relaciones e incidencias de un proceso no es fácilmente discernible a priori. La diagramación hace posible aprehender ese conjunto e ir más allá, centrándose en aspectos específicos del mismo, apreciando las interrelaciones que forman parte del proceso así como las que se dan con otros procesos y subprocesos.
  • Permiten definir los límites de un proceso. A veces estos límites no son tan evidentes, no estando definidos los distintos proveedores y clientes (internos y externos) involucrados.
  • El diagrama de flujo facilita la identificación de los clientes, es más sencillo determinar sus necesidades y ajustar el proceso hacia la satisfacción de sus necesidades y expectativas.
  • Estimula el pensamiento analítico en el momento de estudiar un proceso, haciendo más factible generar alternativas útiles.
  • Proporciona un método de comunicación más eficaz, al introducir un lenguaje común, si bien es cierto que para ello se hace preciso la capacitación de aquellas personas que entrarán en contacto con la diagramación.
  • Un diagrama de flujo ayuda a establecer el valor agregado de cada una de las actividades que componen el proceso.
  • Igualmente, constituye una excelente referencia para establecer mecanismos de control y medición de los procesos, así como de los objetivos concretos para las distintas operaciones llevadas a cabo.
  • Facilita el estudio y aplicación de acciones que redunden en la mejora de las variables tiempo y costes de actividad e incidir, por consiguiente,  en la mejora de la eficacia y la eficiencia.
  • Constituyen el punto de comienzo indispensable para acciones de mejora  o reingeniería.

Figuras de Diagramas de FlujoTodas estas razones apuntan hacia el diagrama de flujo como un instrumento primordial para la correcta gestión de los procesos.
 La realización de un diagrama de flujo es una actividad íntimamente ligada al hecho de modelar un proceso, que es por sí mismo un componente esencial en la gestión de procesos.
Frecuentemente los sistemas (conjuntos de procesos y subprocesos integrados en una organización) son difíciles de comprender, amplios, complejos y confusos; con múltiples puntos de contacto entre sí y con un buen número de áreas funcionales, departamentos y personas implicadas. Un modelo una representación de una realidad compleja) puede dar la oportunidad de organizar y documentar la información sobre un sistema. El diagrama de flujo de proceso constituye la primera actividad para modelar un proceso.
Pero ¿qué es un modelo? Un modelo es una representación de una realidad compleja. Modelar es desarrollar una descripción lo más exacta posible de un sistema y de las actividades llevadas a cabo en él.
Cuando un proceso es modelado, con ayuda de una representación gráfica (diagrama de flujo de proceso), pueden apreciarse con facilidad las interrelaciones existentes entre distintas actividades, analizar cada actividad, definir los puntos de contacto con otros procesos, así como identificar los subprocesos comprendidos. Al mismo tiempo, los problemas pueden ponerse de manifiesto claramente dando la oportunidad al inicio de acciones de mejora.

Elaboración del Diagrama de Flujo

El diagrama de flujo debe ser realizado por un equipo de trabajo en el que las distintas personas aporten, en conjunto, una perspectiva completa del proceso, por lo que con frecuencia este equipo será multifuncional y multijerárquico.
    • Determinar el proceso a diagramar.
    • Definir el grado de detalle. El diagrama de flujo del proceso puede mostrar a grandes rasgos la información sobre el flujo general de actividades pricipales, o ser desarrollado de modo que se incluyan todas las actividades y los puntos de decisión. Un diagrama de flujo detallado dará la oportunidad de llevar realizar un análisis más exhaustivo del proceso.
  • Identificar la secuencia de pasos del proceso. Situándolos en el orden en que son llevados a cabo.
  • Construir el diagrama de flujo. Para ello se utilizan determinados símbolos. Cada organización puede definir su propio grupo de símbolos. En la figura anterior se mostraba un conjunto de símbolos habitualmente utilizados. Al respecto cabe decir que en la figura “Conector de proceso” es frecuentemente utilizado un círculo como símbolo. Para la elaboración de un diagrama de flujo, los símbolos estándar han sido normalizados, entro otros, el American National Standars Institute (ANSI).
  •  Revisar el diagrama de flujo del proceso.
  •  A continuación se present un ejemplo de diagrama de flujo de proceso.

    Ejemplo de Diagrama de Flujo de Proceso
     La elaboración de un diagrama de flujo es facilitada por diversas herramientas informáticas.