viernes, 8 de abril de 2011

PASCAL

Pascal es un lenguaje de programación desarrollado por el profesor suizo Niklaus Wirth entre los años 1968 y 1969 y publicado en 1970. Su objetivo era crear un lenguaje que facilitara el aprendizaje de programación a sus alumnos, utilizando la programación estructurada y estructuración de datos. Sin embargo con el tiempo su utilización excedió el ámbito académico para convertirse en una herramienta para la creación de aplicaciones de todo tipo.
Pascal se caracteriza por ser un lenguaje de programación estructurado fuertemente tipificado. Esto implica que:
  1. El código está dividido en porciones fácilmente legibles llamadas funciones o procedimientos. De esta forma Pascal facilita la utilización de la programación estructurada en oposición al antiguo estilo de programación monolítica.
  2. El tipo de dato de todas las variables debe ser declarado previamente para que su uso quede habilitado.
El nombre de Pascal fue escogido en honor al matemático Blaise Pascal.

Puntero Nil

El puntero nil es un puntero que no apunta a ninguna parte.

Un error muy común es acceder a una zona donde apunta un puntero indefinido porque:
  • No tiene permiso
  • no sabemos lo que hay
  • no sabemos interpretarlo
  • podemos dañar una zona importante del programa o sistema operativo
Punteros colgantes: cunado exiten varias copias de un puntero. Cuando una de las copias devulve la memoria con dipose, toma el valor nil y las demás copias quedan con el mismo valor, pero no son accesibles.

Operaciones con punteros

Los punteros permiten las siguientes operaciones:
Asignación de punteros: Si tenemos dos variables que apuntan al mismo sitio es posible asignar el valor de identificción de una de ellas a la otra.
p1 := p2 (asigna el valor del puntero p2 al puntero p1)

Comparación de igualdad o desigualdad. Para ver si dos punteros apuntan a la misma dirección.

Compatibilidad de asignación y comparación de los punteros.
  • Los punteros tienen el mismo identificador de tipo.
  • El identificador de tipo de una variable es un alias del otro.
  • Nil es compatible con todos los punteros tanto para asignación como en comparación

Punteros en pascal

Los punteros representan cualquier dato de la memoria situado en una determinada dirección de memoria.

Los punteros se manejan mediante un identificador, el ual representa:
  • Dirección: Lugar de memoria en el que se encuentra el dato
  • Tipo: Nº de celdas ocupadas por el dato y la interpración de su contenido.
Un puntero siempre tiene que estar apuntando a un tipo de los siguientes datos:
  • Número real
  • Registro
  • Array
  • Otro puntero
También se define el puntero nulo (que no apunta a ninguna dirección) con la sentencia nil .

New y Dispose punteros

New: Pide memoria al sistema operativo.
Dispose: Devuelve memoria al sistema operativo.
New: Formas de inicializar un puntero:
  • Solicitar memoria con new. Creua la variable apuntada del tipo al que apunta el puntero en la zona de memoria llamada HEAP.
  • Asignar a un puntero la dirección válida que contiene otro puntero.
Dispose: Se utiliza cuando las variables identificadas no son necesarias para liberar la memoria
  • Después de usar dispose la memoria devuelve la memoria del puntero.
  • El valor del puntero queda indefinido
  • No se puede volver a acceder a la zona de memoria especificada.
Para poder usar dispose:
  • El puntero tiene que ser no nil
  • El puntero no puede ser indefinido
  • El puntero no puede estar siendo accedido en ese momento.

Registros (record)

Un registro o record sirve para agrupar distinto tipo de datos pero que deben estar juntos. Por ejemplo los datos de una persona, nombre, edad, fecha nacimiento, sexo, etc.

Es necesario acceder de forma aleatoria a los campos de un registro, pero no puede ser calculado porque los campos pueden tener distinto tamaño, por lo que se crea un SELECTOR DE CAMPO o identificador. Se pueden realizar registros anidados.
Ejemplo de registro o record en pascal:
type
tFecha = record
dia: 1..31;
mes: 1..12;
año: 1..2100;
end;
Un registro puede tener varias variantes con un campo discriminante siempre presente, el cual elige una variante o otra según se indique. En el caso de ser boolean se elige la que sea true.
El campo discriminante tiene que ser de tipo ordinal, no puede ser anónimo y no enlazable.

Alguno de los campos de alguna variante puede ser un registro, el cual puede tener una parte variante también, etc.

Un error muy común es intentar acceder a un comapo de una variante no activa, porque en ese caso esa variante no existe.
 

Conjuntos en pascal

Pascal estándar permite el tratamiento de conjuntos como elementos. Un conjunto es una colección de elementos que no están repetidos. Los conjuntos en pascal tienen que tener un tipo base Ordinal necesariamente.

Los operadores de los conjuntos:

Intersección: *
Unión: +
Diferencia: -
Diferencia simétrica: >< pertenencia: in

Operadores relacionales y conjuntos: Sean A y B dos conjuntos
Igualdad: A = B True si tienen los mismo elementos
Desigualdad A <> B True si tienen elemendos distintos
Subconjunto A <= B True si A está contenido en B
Superconjunto A >= B True si B está contenido en A

Nota Se pueden agregar o quitar elementos de un conjunto con los operadores + y - de la siguiente forma Conjunto := Conjunto + ['e']

Operaciones con Ficheros

Conceptos Básicos:

El Buffer de archivo: El buffer es una variable ligada al archivo cuyo tipo es el tiopo baso de este y cuyo contenido es el componente de la posición actual del buffer.

Te presentamos los principales procedimientos y funciones para la utilización de ficheros tanto externos como internos en pascal.
REWRITE: Crea un fichero vacío en la posición eof y el buffer de archivo f^ queda indefinido.
Sintaxis: rewrite(fichero)

PUT: Agrega el componente del buffer de archivo f^ al fichero seleccionado.
Sintaxis: put(fichero)

RESET: Prepara el archivo para inspección.
Sintaxis reset(fichero)

GET: Pasa al siguiente componente y actualiza el buffer.
Sintaxis: get(fichero)

EOF: Detecta el final de fichero.
Sintaxis: eof(fichero)


EXTEND: Esta funcion es la fomra de añadir compentes a un archivo sin usar la funcion rewrite la cual destruye todo el contenido del fichero.
Sintaxis: extend(f);

READ: Lee del archivo indicado.
Sintaxis: read(fichero,v) Si v es un entero el procedimiento lee el primer entero eliminando los espacios y saltos de línea hasta él.
read(fichero,v) equivale a las siguientes sentencias:
begind
v:= fichero^;
get(fichero)
end;
WRITE: Escribe en el fichero seleccionado
Sintaxis: write(fichero,v)

Operaciones con registros

Para la asignación de registros es compatible en los siguientes casos:
  • Los registros tienen que ser de tipo idéntico
  • Un registros es un alias del otro
  • Los registros comparten la misma definición
  • Los registros están formados por componentes asignables
A su vez son registros que no se puden asignar los siguientes:
  • No pueden ser archivos o ficheros
  • No pueden estar formados por registros restringidos
  • No admiten los enlazables.

Visualizar matrices en pantalla

Muestra Matices en la salida estandar
type 
   tDimension = 1..100;
   eMatriz(f,c: tDimension) = array [1..f,1..c] of real;
   
   tRango = record
      f,c: tDimension value 1;
   end;
   
   tpMatriz = ^eMatriz;


procedure EscribirMatriz(var m: tpMatriz);
var filas,col : integer;
begin
   for filas := 1 to m^.f do begin
      for col := 1 to m^.c do
         write(m^[filas,col]:7:2);
      writeln(resultado);
      writeln(resultado)
     end;    
end;

Division matrices en pascal

División de dos matrices en pascal.
Para el uso de este procedmiento son necesarios los siguientes procedimientos.
Matriz Inversa
Multiplicar matrices

Dado la siguiente declaración de tipos:
type
tDimension = 1..100;
eMatriz(f,c: tDimension) = array [1..f,1..c] of real
;

tRango = record
f,c: tDimension value 1;
end;

tpMatriz = ^eMatriz
;


procedure Dividir(m1, m2: tpMatriz; var resul: tpMatriz);
var inversa: tpMatriz;
begin
{ Calcular inversa de m2 }
new (inversa, m2^.f, m2^.c);
MatrizInversa(m2,inversa);

Multiplicar(m1,inversa,resul);
end;

martes, 12 de octubre de 2010

Los circuitos lógicos

Vamos a ejemplificar la materialización del cálculo proposicional, empleando el más antiguo de los dispositivos que ya fue utilizado para fines lógicos por nuestro sabio ingeniero Leonardo Torres Quevedo14, a finales del siglo XIX, al construir sus máquinas aritméticas y su jugador de ajedréz.
Un circuito es un sistema físico compuesto por varios cables conductores conectados entre si por conectores (o circuito lógico elemental o atómico) de diferente tipo.

Circuitos Logicos

Definición
de los circuitos antes menciona
Los circuitos cuyos componentes realizan operaciones análogas a las que indican los operadores lógicos se llaman "Circuitos Logicos" o "circuitos digitales".
Los Circuitos Lógicos están compuestos por elementos digitales como la compuerta AND (Y), compuerta OR (O), compuerta NOT (NO) y otras combinaciones muy complejas dos.
Como todos sabemos, la electrónica moderna usa electrónica digital para realizar perfeccionamientos en la tecnología, muchas veces nos vemos frente a estos sin darnos cuenta, el llamado efecto Caja Negra.
En el circuito lógico digital existe transmisión de información binaria entre sus circuitos. A primera instancia esto nos parece relativamente simple, pero los circuitos electrónicos son bastante complejos ya que su estructura esta compuesta por un número muy grande de circuitos simples, donde todos deben funcionar de la manera correcta, para lograr el resultado esperado y no obtener una información errónea.
La información binaria que transmiten los circuitos ya mencionados, se representan de la siguiente forma:
  • "0" o "1"
  • "Falso" o "Verdadero"
  • "On" y "Off"
  • "Abierto" o "Cerrado"
  • o Cualquier mecanismo que represente dos estados mutuamente excluyentes
Los circuitos de conmutación y temporización, o circuitos lógicos, forman la base de cualquier dispositivo en el que se tengan que seleccionar o combinar señales de manera controlada. Entre los campos de aplicación de estos tipos de circuitos pueden mencionarse la conmutación telefónica, las transmisiones por satélite y el funcionamiento de las computadoras digitales.

La lógica digital es un proceso racional para adoptar sencillas decisiones de 'verdadero' o 'falso' basadas en las reglas del álgebra de Boole. El estado verdadero se representado por un 1, y falso por un 0, y en los circuitos lógicos estos numerales aparecen como señales de dos tensiones diferentes. Los circuitos lógicos se utilizan para adoptar decisiones específicas de 'verdadero-falso' sobre la base de la presencia de múltiples señales 'verdadero-falso' en las entradas. Las señales se pueden generar por conmutadores mecánicos o por transductores de estado sólido. La señal de entrada, una vez aceptada y acondicionada (para eliminar las señales eléctricas indeseadas, o ruidos), es procesada por los circuitos lógicos digitales. Las diversas familias de dispositivos lógicos digitales, por lo general circuitos integrados, ejecutan una variedad de funciones lógicas a través de las llamadas puertas lógicas, como las puertas OR, AND y NOT y combinaciones de las mismas (como 'NOR', que incluye a OR y a NOT). Otra familia lógica muy utilizada es la lógica transistor-transistor. También se emplea la lógica de semiconductor complementario de óxido metálico, que ejecuta funciones similares a niveles de potencia muy bajos pero a velocidades de funcionamiento ligeramente inferiores. Existen también muchas otras variedades de circuitos lógicos, incluyendo la hoy obsoleta lógica reóstato-transistor y la lógica de acoplamiento por emisor, utilizada para sistemas de muy altas velocidades.

Los bloques elementales de un dispositivo lógico se denominan puertas lógicas digitales. Una puerta Y (AND) tiene dos o más entradas y una única salida. La salida de una puerta Y es verdadera sólo si todas las entradas son verdaderas. Una puerta O (OR) tiene dos o más entradas y una sola salida. La salida de una puerta O es verdadera si cualquiera de las entradas es verdadera, y es falsa si todas las entradas son falsas. Una puerta INVERSORA (INVERTER) tiene una única entrada y una única salida, y puede convertir una señal verdadera en falsa, efectuando de esta manera la función negación (NOT). A partir de las puertas elementales pueden construirse circuitos lógicos más complicados, entre los que pueden mencionarse los circuitos biestables (también llamados flip-flops, que son interruptores binarios), contadores, comparadores, sumadores y combinaciones más complejas.

En general, para ejecutar una determinada función es necesario conectar grandes cantidades de elementos lógicos en circuitos complejos. En algunos casos se utilizan microprocesadores para efectuar muchas de las funciones de conmutación y temporización de los elementos lógicos individuales. Los procesadores están específicamente programados con instrucciones individuales para ejecutar una determinada tarea o tareas. Una de las ventajas de los microprocesadores es que permiten realizar diferentes funciones lógicas, dependiendo de las instrucciones de programación almacenadas. La desventaja de los microprocesadores es que normalmente funcionan de manera secuencial, lo que podría resultar demasiado lento para algunas aplicaciones. En tales casos se emplean circuitos lógicos especialmente diseñados

martes, 28 de septiembre de 2010

¿Que es la cibernetica?

La cibernetica

La cibernética es el estudio del control y comunicación en los Sistemas Complejos: Organismos vivos, máquinas y organizaciones. Especial atención se presta a la retroalimentación y sus conceptos derivados.
Etimología
La palabra cibernética proviene del griego Κυβερνήτης (kybernetes) y significa "arte de pilotar un navío", aunque Platón la utilizó en La República con el significado de "arte de dirigir a los hombres" o "arte de gobernar". Este es un término genérico antiguo, pero aún usado para muchas áreas que están incrementando su especialización bajo títulos como: Sistemas adaptativos, inteligencia artificial, sistemas complejos, teoría de complejidad, sistemas de control, aprendizaje organizacional, teoría de sistemas matemáticos, sistemas de apoyo a las decisiones, dinámica de sistemas, teoría de información, investigación de operaciones, simulación e Ingeniería de Sistemas.
La cibernética tal como la entendemos hoy en día fue formalizada por Norbert Wiener en su obra Cibernética o el control y comunicación en animales y máquinas (Cybernetics, or control and communication in the animal and machine, 1948) desarrollando en colaboración con el mexicano Arturo Rosenblueth y por otros, como William Ross Ashby.
Norbert Wiener popularizó las implicaciones sociales de la cibernética, al establecer analogías entre los sistemas automáticos como una máquina de vapor y las instituciones humanas en su obra Cibernética y Sociedad (The Human Use of Human Beings: Cybernetics and Society, 1950).