20 nov 2009

Lenguajes de Programacion

http://www.aulaclic.es/index.html
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











Varios libros sobre diversos lenguajes de programación.


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. 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 el paradigma de programación que poseen cada uno de ellos

Según su nivel de abstracción

Lenguajes de Máquina

Están escritos en lenguajes directamente legibles por la máquina (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. Ejemplo en lenguaje ensamblador Intel x86:

; Lenguaje ensamblador, sintaxis Intel para procesadores x86

Mov eax, 1; mueve a al registro eax el valor 1

Xor ebx, ebx; pone en 0 el registro ebx

Int 80h; llama a la interrupción 80h (80h = 128 sistema decimal)

Ejecutar ese código en sistemas UNIX o basados en él, equivale a una función exit (0) (terminar el programa retornando el valor 0).

La principal utilización de este tipo de lenguajes es para programar los microprocesadores, utilizando el lenguaje ensamblador correspondiente a dicho procesador.

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. Ejemplo:

/*Lenguaje C*/



/*Declaración de las funciones estandars de entrada y salida*/

# include



Int main (int argc, char **argv)

{

Char *p; /*creamos un puntero a un byte*/

If (argc == 1) {

Printf ("\nIngrese un argumento al programa\n"); /*imprimimos el texto*/

Return 1;

}

p = 0x30000 /*el puntero apunta a 0x30000 */

*p = argv [1] [0] /*el primer caracter del primer argumento lo copiamos a la posición 0x30000 */

Return 0;

}

El ejemplo es muy simple y muestra a los punteros de C, éstos no son muy utilizados en lenguajes de alto nivel, pero en C sí.

Lenguajes 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. Ejemplo:

{Lenguaje Pascal}

Program suma;



Var x, s, r: integer; {declaración de las variables}

Begin {comienzo del programa principal}

Writeln ('Ingrese 2 números enteros') ;{imprime el texto}

Readln(x, s); {lee 2 números y los coloca en las variables x y s}

R:= x + s; {suma los 2 números y coloca el resultado en r}

Writeln ('La suma es ', r); {imrpime el resultado}

Readln;

End. {Termina el programa principal}

Ese es el lenguaje Pascal, muy utilizado por principiantes al aprender a programar.

Lenguajes de Programación




Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por uno.

John Von Neumann desarrolló el modelo que lleva su nombre, para describir este concepto de "programa almacenado". En este modelo, se tiene una abstracción de la memoria como un conjunto de celdas, que almacenan simplemente números. Estos números pueden representar dos cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en sí.

¿Cómo es que describimos un programa como números? Se tenía el problema de representar las acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permitía almacenar números binarios.

La solución que se tomó fue la siguiente: a cada acción que sea capaz de realizar nuestra computadora, asociarle un número, que será su código de operación (opcode). Por ejemplo, una calculadora programable simple podría asignar los opcodes:

1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE.

Supongamos que queremos realizar la operación 5 * 3 + 2, en la calculadora descrita arriba. En memoria, podríamos "escribir" el programa de la siguiente forma:

Localidad Opcode Significado Comentario 0 5 5 En esta localidad, tenemos el primer número de la fórmula 1 3 * En esta localidad, tenemos el opcode que representa la multiplicación. 2 3 3 En esta localidad, tenemos el segundo número de la fórmula 3 1 + En esta localidad, tenemos el opcode que representa la suma. 4 2 2 En esta localidad, tenemos el último número de la fórmula

Podemos ver que con esta representación, es simple expresar las operaciones de las que es capaz el hardware (en este caso, nuestra calculadora imaginaria), en la memoria.

La descripción y uso de los opcodes es lo que llamamos lenguaje de máquina. Es decir, la lista de códigos que la máquina va a interpretar como instrucciones, describe las capacidades de programación que tenemos de ella; es el lenguaje más primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la máquina al más bajo nivel.

Los lenguajes más primitivos fueron los lenguajes de máquina. Esto, ya que el hardware se desarrolló antes del software, y además cualquier software finalmente tiene que expresarse en el lenguaje que maneja el hardware.

La programación en esos momentos era sumamente tediosa, pues el programador tenía que "bajarse" al nivel de la máquina y decirle, paso a pasito, cada punto de la tarea que tenía que realizar. Además, debía expresarlo en forma numérica; y por supuesto, este proceso era propenso a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que recordar que en estos momentos, simplemente aún no existía alternativa.

El primer gran avance que se dio, como ya se comentó, fue la abstracción dada por el Lenguaje Ensamblador, y con él, el nacimiento de las primeras herramientas automáticas para generar el código máquina. Esto redujo los errores triviales, como podía ser el número que correspondía a una operación, que son sumamente engorrosos y difíciles de detectar, pero fáciles de cometer. Sin embargo, aún aquí es fácil para el programador perderse y cometer errores de lógica, pues debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de él.

Con el desarrollo en los 50s y 60s de algoritmos de más elevado nivel, y el aumento de poder del hardware, empezaron a entrar al uso de computadoras científicos de otras ramas; ellos conocían mucho de Física, Química y otras ramas similares, pero no de Computación, y por supuesto, les era sumamente complicado trabajar con lenguaje Ensamblador en vez de fórmulas. Así, nació el concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula TRANslation), que, como su nombre indica, inició como un "simple" esfuerzo de traducir un lenguaje de fórmulas, al lenguaje ensamblador y por consiguiente al lenguaje de máquina. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar la mayor abstracción posible, y facilitar la vida al programador, aumentando la productividad, encargándose los compiladores o intérpretes de traducir el lenguaje de alto nivel, al lenguaje de computadora.

Hay que notar la existencia de lenguajes que combinan características de los de alto nivel y los de bajo nivel (es decir, Ensamblador). Mi ejemplo favorito es C: contiene estructuras de programación de alto nivel, y la facilidad de usar librerías que también son características de alto nivel; sin embargo, fue diseñado con muy pocas instrucciones, las cuales son sumamente sencillas, fáciles de traducir al lenguaje de la máquina; y requiere de un entendimiento apropiado de cómo funciona la máquina, el uso de la memoria, etcétera. Por ello, muchas personas consideramos a lenguajes como C (que fue diseñado para hacer sistemas operativos), lenguajes de nivel medio.



Java



El lenguaje de programación Java, fue diseñado por la compañía Sun Microsystems Inc, con el propósito de crear un lenguaje que pudiera funcionar en redes computacionales heterogéneas ( redes de computadoras formadas por más de un tipo de computadora, ya sean PC, MAC's, estaciones de trabajo, etc.),y que fuera independiente de la plataforma en la que se vaya a ejecutar. Esto significa que un programa de Java puede ejecutarse en cualquier máquina o plataforma. El lenguaje fue diseñado con las siguientes características en mente:

• Simple. Elimina la complejidad de los lenguajes como "C" y da paso al contexto de los lenguajes modernos orientados a objetos. Orientado a Objetos. La filosofía de programación orientada a objetos es diferente a la programación convencional.

• Familiar. Como la mayoría de los programadores están acostumbrados a programar en C o en C++, el sintaxis de Java es muy similar al de estos.

• Robusto. El sistema de Java maneja la memoria de la computadora por ti. No te tienes que preocupar por apuntadores, memoria que no se esté utilizando, etc. Java realiza todo esto sin necesidad de que uno se lo indique.

• Seguro. El sistema de Java tiene ciertas políticas que evitan se puedan codificar virus con este lenguaje. Existen muchas restricciones, especialmente para los applets, que limitan lo que se puede y no puede hacer con los recursos críticos de una computadora.

• Portable. Como el código compilado de Java (conocido como byte code) es interpretado, un programa compilado de Java puede ser utilizado por cualquier computadora que tenga implementado el interprete de Java.

• Independiente a la arquitectura. Al compilar un programa en Java, el código resultante un tipo de código binario conocido como byte code. Este códido es interpretado por diferentes computadoras de igual manera, solamente hay que implementar un intérprete para cada plataforma. De esa manera Java logra ser un lenguaje que no depende de una arquitectura computacional definida.

• Multithreaded. Un lenguaje que soporta multiples threads es un lenguaje que puede ejecutar diferentes líneas de código al mismo tiempo.

• Interpretado. Java corre en máquina virtual, por lo tanto es interpretado.

• Dinámico. Java no requiere que compiles todas las clases de un programa para que este funcione. Si realizas una modificación a una clase Java se encarga de realizar un Dynamic Bynding o un Dynamic Loading para encontrar las clases.

Java puede funcionar como una aplicación sola o como un "applet", que es un pequeño programa hecho en Java. Los applets de Java se pueden "pegar" a una página de Web (HTML), y con esto puedes tener un programa que cualquier persona que tenga un browser compatible podrá usar.

Nota: Diferencia entre Java y CGI La diferencia es esencialmente simple, un CGI se ejecuta en el servidor mientras que un programa en Java se ejecuta en la máquina del usuario.

Java funciona de la siguiente manera: El compilador de Java deja el programa en un Pseudo-código (no es código maquinal) y luego el intérprete de Java ejecuta el programa (lo que se conoce como el "Java Virtual Machine"). Por eso Java es multiplataforma, existe un intérprete para cada máquina diferente. Nota: El código maquinal es el código binario que la computadora entiende y puede ejecutar.

Para entender bien como funciona un applet de Java vean el siguiente ejemplo:

1. Existe un código de Java en un servidor de Web. (Los códigos de Java se caracterizan por tener la extensión *.class).

2. Una persona en Internet, con un browser compatible con Java, realiza una conección al servidor.

3. El servidor envía el documento HTML y el código en Java (*.class).

4. En la computadora del usuario remoto llegan ambos, y la Máquina Virtual de Java, que está en el browser, transforma el código Java en un código que entienda la máquina local y se ejecuta el programa dentro de la página de Web.

5. Si el usuario realiza otra conexión a otro URL o se sale del browser, el programa se deja de ejecutar y en la computadora no queda rastro de él.







Ejemplo de tutorial de Java:



En Java hay tres tipos de comentarios:

// Comentarios para una sola línea

/* Comentarios de una o

Más líneas

*/

/** Comentario de documentación, de una o más líneas

*/

Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentación, colocados inmediatamente antes de una declaración (de variable o función), indican que ese comentario ha de ser colocado en la documentación que se genera automáticamente cuando se utiliza la herramienta de Java, javadoc. Dichos comentarios sirven como descripción del elemento declarado permitiendo generar una documentación de nuestras clases escrita al mismo tiempo que se genera el código.

En este tipo de comentario para documentación, se permite la introducción de algunos tokens o palabras clave, que harán que la información que les sigue aparezca de forma diferente al resto en la documentación.

Identificadores

Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar.

En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las mayúsculas de las minúsculas y no hay longitud máxima.

Serían identificadores válidos:

Identificador

nombre_usuario

Nombre_Usuario

_variable_del_sistema

$transaccion

Y su uso sería, por ejemplo:

Int contador principal;

Char _lista_de_ficheros;

Flota $cantidad_en_Ptas;



Unix



Ejemplo de Unix:

No todo el "árbol" de directorios está compuesto por directorios de usuario. Existen muchos de ellos que son de uso general o del propio sistema y con los que habrá que familiarizarse. Los más importantes son:

/

El raíz, del que "cuelgan" todos.

/bin y /usr/bin

Contienen comandos UNIX ejecutables.

/etc

Es quizá el directorio más importante. Contiene ficheros de datos y configuración del sistema, el fichero de password, configuración de terminales, red, etc (de ahí su nombre).

/dev

Ficheros de dispositivos E/S.

/usr/man

Manual

/tmp

Directorio para arreglos temporales. TODOS los usuarios pueden leer y escribir en él.



C



C es un lenguaje de programación diseñado por Dennis Ritchie, de los Laboratorios Bell, y

Se instaló en un PDP-11 en 1972; se diseñó para ser el lenguaje de los Sistemas Operativos

UNIX1. A su vez, UNIX es un Sistema Operativo desarrollado por Ken Thompson, quién

Utilizó el lenguaje ensamblador y un lenguaje llamado B para producir las versiones originales de UNIX, en 1970. C se inventó para superar las limitaciones de B.

C es un lenguaje maduro de propósitos generales que se desarrolló a partir de estas raíces;

Su definición aparece en 1978 en el apéndice ``C Reference Manual'' del libro The C

Programming Language, de Brian W. Kernighan y Dennis M. Ritchie (Englewood Cliffs,

Nueva Jersey, Prentice-Hall 1978), pero el estándar recomendable más reciente apareció en

Junio de 1983, en el documento de los Laboratorios Bell titulado The C Programming

Language-Reference Manual, escrito por Dennis M. Ritchie



Un programa en C

“en el programa deben ir antes que la función principal (main ()). Declarando las funciones a ocupar al principio del programa, se logra que la función principal esté antes que el resto de las funciones. Ahora, solo se habla de funciones ya que en C no existen los procedimientos.

Y como última sección se tiene a la función principal, llamada main. Cuando se ejecuta el programa, lo primero que se ejecuta es esta función, y de ahí sigue el resto del programa.

Los símbolos {y} indican ``begin'' y ``end'' respectivamente. Si en una función o en un ciclo while, por ejemplo, su contenido es de solamente una línea, no es necesario usar ``llaves'' ({ }), en caso contrario es obligación usarlos.



Ejemplo de un programa en C



/*Programa ejemplo que despliega el contenido de "ROL" en pantalla*/

#include

#define ROL "9274002-1"

despliega_rol () {

Printf ("Mi rol es: \%s\n", ROL);

}

Void main () {

despliega_rol ();

}

/* Fin programa */



Pascal



Pascal es un lenguaje de programación de alto nivel de propósito general; esto es, se puede utilizar para escribir programas para fines científicos y comerciales.

El lenguaje de programación Pascal fue desarrollado por el profesor Niklaus (Nicolás) Wirth en Zurich, Zuiza, al final de los años 1960s y principios de los 70s. Wirth diseñó este lenguaje para que fuese un buen primer lenguaje de programación para personas comenzando a aprender a programar. Pascal tiene un número relativamente pequeño de conceptos para aprender y dominar. Su diseño facilita escribir programas usando un estilo que está generalmente aceptado como práctica estándar de programación buena. Otra de las metas del diseño de Wirth era la implementación fácil. Él diseñó un lenguaje para el cual fuese fácil escribir un compilador para un nuevo tipo de computadora.

Program Sorting;

{

Este programa lee un natural y una secuencia de N caracteres de la entrada estándar; construye un índice para ordenarlos de menor a mayor e imprime en la salida la secuencia ordenada.

}

Uses CRT;

Const Max = 10;

Espacio = ' ';

Enter = Chr (13);

Type Indices = 1...Max;

Candida= 0...Max;

SecOfChar = record

Elems: array [Indices] of char;

ult: Candida;

end;

SecOfInd = record

elems : array [Indice] of Indice;

ult : Cantidad;

end;

Natural = 0..MaxInt;

function PosMin (idx: SecOfInd; i: Indice; s: SecOfChar): Cantidad;

{ Devuelve la posicion en el indice idx del menor caracter en s, para

las posiciones >= i. }

var j: Indice;

pm: Cantidad;

begin

if i > idx.ult then

pm := 0

else begin

pm := i;

for j := i+1 to idx.ult do

if s.elems[idx.elems[j]] < s.elems[idx.elems[pm]] then

pm := j;

end;

PosMin := pm;

end;

procedure Swap (var idx: SecOfInd; i,j: Indice);

{ Intercambia las posiciones i j en idx. }

var tmp: Indice;

begin

if (i<=idx.ult) and (j<=idx.ult) then begin

tmp := idx.elems[i];

idx.elems[i] := idx.elems[j];

idx.elems[j] := tmp;

end;

end;

procedure InicInds (var idx: SecOfInd; cant: Indice);

{ Construye la secuencia de indices 1,2,3,...,n. Sera el indice

inicial para el ordenamiento de una secuencia de caracteres

c1,c2,...,cn. }

var n: Natural;

begin

n := cant;

idx.ult := n;

while n > 0 do begin

idx.elems [n] := n;

n := n-1;

end;

end;

procedure InicSecChar (var s: SecOfChar);

{ Devuelve la secuencia vacia. }

begin

s.ult := 0;

end;

function Llena (s: SecOfChar): Boolean;

begin

Llena := s.ult = Max;

end;

{ PRE: not Llena(s) }

procedure InsCar (var s: SecOfChar; c: char);

{ Inserta el caracter c en la secuencia s }

begin

s.ult := s.ult + 1;

s.elems [s.ult] := c;

end;

procedure IndSelSort (s: SecOfChar; var ind: SecOfInd);

{ Construye el indice que ordena la secuencia s. Ordena el indice

inicial 1,2, ..., n por el metodo de selection sort }

var i: Indice;

begin

InicInds (ind, s.ult);

for i := 1 to ind.ult-1 do begin

Swap (ind, i, PosMin (ind, i, s));

end

end;

procedure WriteSorted (idx: SecOfInd; s: SecOfChar);

{ Imprime en la salida estandar la secuencia s ordenada segun el

indice idx }

var i: Indice;

begin

write ('Ordenado: ');

for i := 1 to idx.ult do

write (s.elems[idx.elems[i]],' ');

writeln;

end;

procedure LeerCar (var c: char; var ok: boolean; sep: Char);

{ Lee de la entrada estandar un caracter seguido del caracter sep }

var c1, c2: char;

begin

c := ReadKey; write (c);

c1 := ReadKey; write (c1);

ok := c1 = sep;

end;

procedure LeerSecOfChar (var s: SecOfChar; cant: Natural; var ok: Boolean);

{ Construye una secuencia de cant caracteres provistos por el

procedimeinto LeerCar. Si cant > Max trunca. }

var bien: Boolean;

i: Natural;

ch, sep: Char;

begin

writeln ('Ingrese ',cant, ' caracteres separados por blancos. Enter para terminar ');

write (' > ');

InicSecChar (s);

i := 1;

ok := true;

sep := Espacio;

while ok and (i <= cant) and not Llena (s) do begin

if i = cant then sep := Enter;

LeerCar (ch, bien, sep);

i := i+1;

ok := ok and bien;

if ok then

InsCar (s, ch);

end;

end;

procedure LeerCant (var n: Natural);

{ Lee de la entrada estandar un natural <= Max }

begin

repeat

writeln ('Ingrese cantidad de caracteres (<=',Max,')');

write (' > ');

readln (n);

until n <= Max;

end;

procedure Continuar (var seguir: Boolean);

var car: Char;

begin

writeln;

writeln ('Otro ? (s/n)');

write (' > ');

car := ReadKey;

writeln (car);

seguir := car in ['s','S'];

end;

var cant: Natural;

cars: SecOfChar;

inds: SecOfInd;

seguir, ok: boolean;

begin

repeat

ClrScr;

LeerCant (cant);

LeerSecOfChar (cars, cant, ok);

if ok then begin

IndSelSort (cars, inds);

writeln;

WriteSorted (inds, cars);

end

else begin

writeln;

writeln ('Error en los datos');

end;

Continuar (seguir);

until not seguir;

end.



QBasic



Qbasic es un lenguaje de alto nivel, el cual consiste en instrucciones que los humanos pueden relacionar y entender. El compilador de Qbasic se encarga de traducir el mismo a lenguaje de máquina.

Un programa es una secuencia de instrucciones. El proceso de ejecutar esas instrucciones se llama correr el programa. Los programas contienen las funciones de entrada, procesamiento y salida. La persona que resuelve problemas mediante escribir programas en la computadora se conoce como programador. Después de analizar el problema y desarrollar un plan para solucionarlo, escribe y prueba el programa que instruye a la computadora como llevar a cabo el plan. El procedimientoque realiza el programador se define como "problem solving". Pero es necesario especificar que un programador y un usuario no son lo mismo. Un usuario es cualquier persona que use el programa.



Ejemplo de qbasic, para hacer una calculadora



DIM total AS DOUBLE

DIM number AS DOUBLE

DIM secondNumber AS DOUBLE

DIM more AS STRING

DIM moreNumbers AS STRING

DIM operation AS STRING

total = 0

more = "y"

moreNumbers = "c"

CLS

WHILE more = "y"

INPUT "Enter the first number"; number

total = number

WHILE moreNumbers = "c"

COLOR 14

PRINT "The total is:"; total

COLOR 7

PRINT "Select an operation"

COLOR 2

PRINT "(+)"

COLOR 5

PRINT "(-)"

COLOR 1

PRINT "(x)"

COLOR 4

INPUT "(/)"; operation

COLOR 7

CLS

IF operation = "+" THEN

REM where we do additions

PRINT "Enter the number to Add to"; total

INPUT secondNumber

total = secondNumber + total

COLOR 14

PRINT "The total is now:"; total

COLOR 7

ELSE

IF operation = "-" THEN

REM subtraction

PRINT "Enter the number to Subtract from"; total

INPUT secondNumber

total = total - secondNumber

COLOR 14

PRINT "The total is now:"; total

COLOR 7







ELSE



IF operation = "x" THEN

REM multiplication

PRINT "Enter the number to Multiply"; total; "by"

INPUT secondNumber

total = secondNumber * total

REM * is the multiplication sign in programs

COLOR 14

PRINT "The total is now:"; total

COLOR 7

ELSE

IF operation = "/" THEN

REM division

PRINT "Enter the number to Divide"; total; "by"

INPUT secondNumber

IF secondNumber = 0 THEN

COLOR 4

PRINT "You cannot divide by zero"

COLOR 7

ELSE

total = total / secondNumber

REM / is the division sign in programs

END IF

COLOR 14

PRINT "The total is now:"; total

COLOR 7

ELSE

PRINT "you must select an operation"

END IF

END IF

END IF

END IF

INPUT "Do you wish to continue (c) or start with new numbers

(n)";moreNumbers

CLS

WEND

COLOR 14

PRINT "The grand total is:"; total

COLOR 7

INPUT "Do you wish to make more calculations (y - n)"; more

moreNumbers = "c"

REM if we don't put "moreNumbers" back to y, it will always

REM come back to "Do you wish to make more calculations" and never REM ask

for numbers again

REM (try it)

total = 0

REM if we don't reset the total to 0, it will just

REM keep on adding to the total

WEND

END



Linux



Linux es una implementación del sistema operativo UNIX (uno más de entre los numerosos clónicos del histórico Unix), pero con la originalidad de ser gratuito y a la vez muy potente, que sale muy bien parado (no pocas veces victorioso) al compararlo con las versiones comerciales para sistemas de mayor envergadura y por tanto teóricamente superiores. Comenzó como proyecto personal del –entonces estudiante- Linus Torvalds, quien tomó como punto de partida otro viejo conocido, el Minix de Andy. S. Tanenbaum (profesor de sistemas operativos que creó su propio sistema operativo Unix en PCs XT para usarlo en su docencia). Actualmente Linus lo sigue desarrollando, pero a estas alturas el principal autor es la red Internet, desde donde una gigantesca familia de programadores y usuarios aportan diariamente su tiempo aumentando sus prestaciones y dando información y soporte técnico mútuo. La versión original -y aun predominante- comenzó para PCs compatibles (Intel 386 y superiores), existiendo también en desarrollo versiones para prácticamente todo tipo de plataformas:

PowerPC ,

Sparc ,

Alpha ,

Mips , etc.

De todas ellas la más reciente en este momento es la versión para PowerMac (el PowerPC de Apple) basada en el microkernel Mach 3.0 y de la que ya hay una distribución para desarrolladores avalada directamente por Apple y OSF pero conservando el espíritu (gratuito, de libre distribución, etc) de la version original. Un servidor la acaba de probar hace unos días y se ha llevado una grata sorpresa (aún tendrá muuuchos fallos, pero para ser una primerísima versión y el poco tiempo que lleva en marcha, ha avanzado más de lo que me esperaba).



Ejemplo de linux:



Compilar el Kernel

Dado que un diskette sólo almacena 1.44 Megabytes (1440 Kilobytes) de datos, no puedes el mismo kernel que utilizas al diskette. Primero debes conseguir los fuentes del núcleo y descomprimirlos en /usr/src/linux. Luego ejecuta la siguiente orden desde el directorio

/usr/src/linux:

make config

Configura solamente aquello que realmente necesites. Yo, personalmente, sólo configuro el soporte para "ext2", soporte para la disquetera (floppy disk), y soporte para "PPP". Tus elecciones pueden se diferentes en función de lo que decidas incluir. Ahora introduce el siguiente comando:

make dep; make clean; make zImage

¡make zImage es muy importante! Comprime el kernel definitivo. Después de que termine la compilación, deberás buscar el nuevo núcleo en /usr/src/linux/arch/i386/boot bajo el

nombre de zImage.

El sistema de ficheros: No es solamente un conjunto de ficheros

Ahora hemos de crear el sistema de ficheros (en inglés: filesystem, fs) para el diskette. En vez de copiar los ficheros tal cual directamente al diskette, los comprimiremos antes de copiarlos. Esto nos hará un poco más difícil la faena de modificar todo permanentemente. Primero tecleamos el siguiente

comando:

dd if=/dev/zero of=[DEVICE] bs=1k count=3000

Donde [DEVICE] es "lugar" en el disco duro donde vas a guardar el sistema de ficheros descomprimido. Luego, introduce el siguiente comando y pulsa ENTER, sustituyendo [DEVICE] por el directorio en tu disco duro donde estás guardando el sistema de ficheros descomprimido:

mke2fs -m 0 [DEVICE]

Si make2fs te pregunta si realmente quieres hacer esto (Do you really want to do this?), acepta tecleando "y" (yes).

Después tenemos que montar este sistema de ficheros que hemos creado. Para ello, el núcleo que utilices tiene que permitir "montar ficheros", en otras palabras, ha de tener habilitada la posibilidad de "loopback devices". Para ello has de compilar el núcleo de tu máquina (no el núcleo que hemos creado, sino el de tu propia máquina) con la opción:

Loopback device support (CONFIG_BLK_DEV_LOOP) [M/n/y/?]

bien como módulo (M) o en el mismo núcleo (Y). Si lo compilas como módulo (lo más recomendable) luego tienes que insertar el módulo modprobe loop !No olvides rearrancar la máquina si has tenido que recompilar el núcleo!

mount -t ext2 DEVICE /mnt

Si se queja la orden mount puedes intentar con la siguiente orden:

mount -o loop -t ext2 DEVICE /mnt

Ahora debes copiar todos los ficheros que necesites en el nuevo sistema de ficheros. Primero, ponte en el directorio /mnt, (cd /mnt), y crea los siguientes directorios:

/dev

/pro

/etc

/bin

/lib

/mnt

/usr

Ahora crearemos el directorio /dev tecleando lo siguiente:

cp -dpR /dev /mnt/dev

Si se te acaban los i-nodos del diskette, puedes ir a /mnt/dev y borrar los archivos de dispositivo que no necesites. Cuando acabes de copiar los ficheros necesarios para /dev, ves a /etc. Para estar seguro copia todos los ficheros de /etc a /mnt/etc:

cp -dpR /etc /mnt/etc

Luego copia todo del directorio /lib en /mnt:

cp -dpR /lib /mnt/lib

Para el directorio /bin, copia sólo aquello que creas que necesitas en /mnt/bin.

Copiar todo a tu diskette

Ahora hemos de copiar todo en el/los diskette/s. Para hacer esto, debemos comprimir ahora el sistema de ficheros tecleando las siguientes ordenes:

cd /

umount /mnt

dd if=[DEVICE] bs=1k
gzip -9 > rootfs.gz

Ahora es importante comprobar el tamaño del núcleo. Ponte en /usr/src/linux/arch/i386/boot y teclea "ls -l". Luego divide el tamaño del núcleo entre 1024.

Por ejemplo, si el tamaño es de 250000 bytes, entonces son 245 KB. En adelante, reemplaza [ROOTBEGIN] en las ordenes que aparezca por el número total de kilobytes que has calculado. Ahora copia el kernel al diskette usando el siguiente comando:

dd if=zImage of=/dev/fd0

Este comando grabará el kernel en el diskette. Luego introduce el siguiente comando para que el kernel pueda encontrar la raíz del sistema de ficheros en el diskette.

rdev /dev/fd0 /dev/fd0

Ahora tendrás que hacer un pequeño cálculo en hexadecimal. Suma 4000 al equivalente en hexadecimal de [ROOTBEGIN] (que en nuestro ejemplo es F5). Convierte el resultado a decimal y teclea el siguiente comando, sustituyendo 16629 con el resultado que tú has obtenido:

rdev -r /dev/fd0 16629

Finalmente, teclea lo siguiente para copiar el sistema de ficheros al diskette:

dd if=/rootfs.gz of=/dev/fd0 bs=1k seek=[ROOTBEGIN]

El sistema de ficheros raíz será copiado al diskette justo después del kernel. ¡Ya lo tienes! Para el segundo diskette, el proceso es más fácil. Copia los ficheros que quieras en el diskette. No obstante, para poder usar los ficheros que hay en el segundo disco, tendrás que entrar lo siguiente después de arrancar con el diskette:

mount /dev/fd0 /usr



Ensamblador



Cuando abstraemos los opcodes y los sustituimos por una palabra que sea una clave de su significado, a la cual comúnmente se le conoce como mnemónico , tenemos el concepto de Lenguaje Ensamblador . Así, podemos definir simplemente al Lenguaje Ensamblador de la siguiente forma:

Lenguaje Ensamblador es la primera abstracción del Lenguaje de Máquina , consistente en asociar a los opcodes palabras clave que faciliten su uso por parte del programador

Como se puede ver, el Lenguaje Ensamblador es directamente traducible al Lenguaje de Máquina, y viceversa; simplemente, es una abstracción que facilita su uso para los seres humanos. Por otro lado, la computadora no entiende directamente al Lenguaje Ensamblador; es necesario traducirle a Lenguaje de Máquina. Originalmente, este procesose hacía a mano, usando para ello hojas donde se escribían tablas de programa similares al ejemplo de la calculadora que vimos arriba . Pero, al ser tan directa la traducción, pronto aparecieron los programas Ensambladores, que son traductores que convierten el código fuente (en Lenguaje Ensamblador) a código objeto (es decir, a Lenguaje de Máquina).

Una característica que hay que resaltar, es que al depender estos lenguajes del hardware, hay un distinto Lenguaje de Máquina (y, por consiguiente, un distinto Lenguaje Ensamblador) para cada CPU. Por ejemplo, podemos mencionar tres lenguajes completamente diferentes, que sin embargo vienen de la aplicación de los conceptos anteriores:

1.Lenguaje Ensamblador de la familiaIntel 80x86 2.Lenguaje Ensamblador de la familia Motorola 68000 3.Lenguaje Ensamblador del procesador POWER, usado en las IBM RS/6000.

Tenemos 3 fabricantes distintos, compitiendo entre sí y cada uno aplicando conceptos distintos en la manufactura de sus procesadores, su arquitectura y programación; todos estos aspectos, influyen en que el lenguaje de máquina y ensamblador cambie bastante.

Ventajas y desventajas del Lenguaje Ensamblador

Una vez que hemos visto la evoluciónde los lenguajes, cabe preguntarse: ¿En estos tiempos "modernos", para qué quiero el Lenguaje Ensamblador?

El proceso de evolución trajo consigo algunas desventajas, que ahora veremos como las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel:

1.Velocidad

2.Eficiencia de tamaño

3.Flexibilidad

Por otro lado, al ser un lenguaje más primitivo, el Ensamblador tiene ciertas desventajas respecto a los lenguajes de alto nivel:

1.Tiempo de programación 2.Programas fuente grandes 3.Peligro de afectar recursos inesperadamente 4.Falta de portabilidad

Velocidad

El proceso de traducción que realizan los intérpretes, implica un proceso de cómputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intérprete es siempre más lento que realizar la misma acción en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de estar traduciendo el programa, cada vez que lo ejecutamos.

De ahí nacieron los compiladores, que son mucho más rápidos que los intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso de traducción es más complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa más rápidamente.

Sin embargo, la mayor parte de las veces, el código generado por un compilador es menos eficiente que el código equivalente que un programador escribiría. La razón es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear código genérico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las características específicas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instrucción, no hace ningún proceso que no sea necesario.

Para darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un programa para ordenar una lista tardará cerca de 20 veces más en Visual Basic (un intérprete), y 2 veces más en C (un compilador), que el equivalente en Ensamblador.

Por ello, cuando es crítica la velocidad del programa, Ensamblador se vuelve un candidato lógico como lenguaje.

Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces más rápido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la elección apropiada de algoritmos y estructuras de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje que se desee, y solamente usar Ensamblador cuando se requiere más optimización y no se puede lograr por estos medios.

Tamaño

Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador.

Flexibilidad

Las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor.

Resumiendo, la flexibilidad consiste en reconocer el hecho de que

Todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina.

Tiempo de programación

Al ser de bajo nivel, el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.

Por todo esto, es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstracción.

Programas fuente grandes

Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.

Peligro de afectar recursos inesperadamente

Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener mucho poder es útil pero también es peligroso.

En la vida práctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje verán que es mucho más común que la máquina se "cuelgue", "bloquee" o "se le vaya el avión"; y que se reinicialize. ¿Por qué?, porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.

En ciertos casos extremos, puede llegarse a sobreescribir información del CMOS de la máquina (no he visto efectos más riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro, junto con toda su información.

Falta de portabilidad

Como ya se mencionó, existe un lenguaje ensamblador para cada máquina; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté bien hecho y siga los estándares de "C", y los principios de la programación estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estándares que sigamos, tendremos prácticamente que reescribir el 100 % del código al llevarlo a UNIX, y otra vez lo mismo al llevarlo a Mac.

Etiquetas:

lenguajes

EL LENGUAJE








El lenguaje es la manifestación sensible del poder que tiene el hombre de penetrar en la realidad más allá de la multiplicidad de estímulos, y de abarcar mucho campo y ganar una posición de dominio frente a todo aquello que le afecta de algún modo. Cuando sabemos el nombre de una realidad, parece que dominamos en cierta medida. Dar nombre es caracterizar, enmarcar, delimitar, tener en cierto grado bajo control.

El lenguaje permite al hombre orientarse al enmarcar y dar sentido a los mil y un fenómenos que tejen su vida diaria. La vida del hombre se constituye con trama de interrelaciones. El vehículo de estas es la palabra. El lenguaje es un campo de luz en el cual se iluminan las cosas y fenómenos con sólo ocupar el puesto que les corresponde.

Aprender a hablar es aprender a localizar las realidades y acontecimientos en este prodigioso campo de iluminación que el hombre utiliza en cuanto se halla envuelto promocionalmente por él.

El lenguaje es una matriz constitutiva de identidad (individual y social). Nada hay en el lenguaje que no sea la resultante de situaciones de producción humana y social. Desde las primeras frases y palabras (mamá, leche, te quiero) hasta las más complejas asociaciones que podamos construir, todas son resultado de las experiencias.

El cerebro no nace cargado de idioma, de palabras, viene dotado biológicamente para poner en ejecución sistemas asociativos, técnicos, para hacer hipótesis, para percibir la realidad, pero ese potencial biológico, requiere de! contacto humano para desarrollarse.

Cuando el niño descubre que con sonidos puede designar cosas es el momento en que tiene acceso a la función simbólica. Gracias a esta función, el hombre puede dominar el pasado, se proyecta al futuro, trasciende el límite aquí y ahora para expandirse mentalmente de manera ilimitada.

El desarrollo del lenguaje está indisolublemente unido al desarropo de la vida afectiva. Las palabras, con sus matices, contribuyen a expresar los estados afectivos, es pues en la en la relación social. El lenguaje cumple una función de mediación entre el sujeto y el mundo.

ONTOGENIA DEL LENGUAJE: el desarrollo del lenguaje en el niño es un proceso de carácter biológico, dolado de leyes internas. Cuando e! niño nace presenta ya algunos procesos fisiológicos que más tarde participan en la función del lenguaje. Las principales actividades son: respiración, succión, grito y llanto. Estas actividades se van complicando y desarrollando para formar la función del habla y más tarde la del lenguaje.

En la respiración, en el movimiento de inspiración, se contrae un conjunto de músculos principales (diafragma, intercostales, pectorales, etc.) algunos de los cuales son protagonistas principales de los movimientos, mientras que otros son auxiliares.

En la contracción cada músculo genera un mensaje sensorial que llega a la corteza, denominado "propioceptivo'' (es la sensación de uno mismo) o ''cinestésico" (es la sensación de movimiento).

La coincidencia en el tiempo de varios de estos mensajes propioceptivos constituyen una combinación, combinación tanto en la coincidencia de las contracciones musculares como en la de los mensajes propioceptivos que llegan al cerebro.

Interesa retener que esta coincidencia de aferencias propioceptivas se repite en cada movimiento respiratorio y que justamente esta repetición es lo que tiende a estabilizarla y darle fijeza. Del mismo modo, cada contracción va quedando ligada estrechamente a las que la preceden y por consiguiente se establecen "cadenas" de actividades propioceptivas-motoras que van consolidándose. Lo mismo que hemos indicado con los movimientos respiratorios, sucede con la succión y la deglución, el grito y el llanto. Cada una de estas actividades fisiológicas en su repetición, nunca produce lo mismo, y se amplía así el conjunto de fórmulas. Es por esto que el lactante, día a día, cambia la tonalidad y la gama de sonidos de sus gritos y llantos. Estos dos aspectos son los que sustentan al lenguaje: estabilidad que confiere la repetición; y flexibilidad y ampliación del repertorio por la variación circunstancial.

Comienzo del juego vocal. En la etapa de comunicación que estamos considerando o pre-lingüística, comienzan las actividades que constituyen lo que se ha denominado "juego vocal" o "balbuceo", "laleo''. Son repeticiones incesantes de sonidos vocales, preparatorios para la función del habla. Esto acontece durante el primer semestre.

El juego vocal se produce especialmente en los momentos de tranquilidad fisiológica, cuando no hay estímulos externos intensos, que reclamen la atención del niño, y además cuando sus necesidades están satisfechas. En este período el niño emite "vocalizaciones" y sonidos culturales. El bebé repite en forma continua los motivos, que a veces lo entretienen dos o tres días hasta que incluye otro nuevo que se intercala con el anterior, lo sustituye o combina con él o se pierde.

Hacia los dos meses el niño es capaz de responder a las incitaciones de la madre en un proceso de aprendizaje que corrientemente se denomina ''imitación". Puede comprobarse que cuando la madre emite sonidos propios de esta etapa (propioceptivos) del juego vocal (aaaggg) el niño responde moviendo los labios y emitiendo un sonido similar.

Según Piaget, el desarrollo del hábito del lenguaje en el niño se produce por articulación casual de una sílaba, por ej. "da", lo que induce al bebé, al oírse a sí mismo, a repetirla.

El impulso auditivo se trasmite a los centros cerebrales, donde se descarga por las neuronas aferentes en los grupos musculares usados para pronunciar la misma palabra. La articulación ha pasado ahora a la etapa de ser capaz de estar controlada por el receptor auditivo.

Luego la voz del otro excita la voz del niño, que comienza con la repetición de sonidos familiares. Sólo serán asimilados al esquema interno aquellas percepciones que resultan interesantes o significativas para el niño. Serán interesantes o significativas en tanto que intervengan en el funcionamiento de una acción y quede asimilado a un esquema sensorio-motriz.

La niña dice "da" y la madre interpreta que dice "mamá", la madre dice mamá y la nena repite mamá.

Surge así el gorgeo, donde imita los sonidos que le interesan como si quisiera probar sus posibilidades vocales y retener las que logran éxito. Esta primera fase de la imitación y de la invención unidas, termina en la constitución de un parloteo que sobrepasa al gorgeo pues tiene un valor intencional.

Esta etapa sucede en los primeros 12 meses de vida. También en esta etapa ya aparecieron el índice y la señal. En el índice el elemento significante es parte del objeto mismo, por ej. la tetina es parte del alimento. Señal es incorporada a un esquema de manera rápida. Es de carácter artificial, se convierte en parte del suceso que anuncia. Por ej., los ruidos que anuncian la proximidad de la comida que la madre le dará al niño, los ruidos al preparar la mamadera, desabotonarse la blusa antes de darle de mamar, etc.

En el último estadio de la fase sensorio-motriz, la coordinación de los esquemas se independiza lo suficientemente de la percepción inmediata y de la experiencia empírica, como para dar lugar a combinaciones mentales. Recién entonces podremos hablar de representación, aproximadamente a los 24 meses de vida, y que le permitirá 1) anticipar un resultado, 2) elaborar estrategias elementales.

La capacidad de representación, denominada función simbólica alude al hecho típicamente humano de referirse a algo mediante un intermediario (un gesto, un sonido, etc.). Al comienzo la función simbólica se basa en el empleo de símbolos de valor individual y luego progresa hacia el empleo de signos, cuya significación es válida universalmente.

Piaget afirma que la adquisición del lenguaje está subordinada al ejercicio de la función simbólica a su vez apoyada en el desarrollo de la imitación y del juego, tanto como en el desarrollo de los mecanismos verbales.

Habría para Piaget una representación en sentido amplio, esta representación está vinculada con un sistema de conceptos o esquemas mentales y la representación en sentido estricto, se reduce a la imagen mental o al recuerdo-imagen, es decir, a la evocación simbólica de las realidades.

Entre las conductas que implican la evocación podemos distinguir: la imitación diferida, que se inicia en ausencia de un modelo; el juego simbólico, el niño hace como si, utiliza sustitutos de la realidad, o sea símbolos, pero a diferencia de los símbolos lingüísticos, los de sus juegos tienen carácter individual, y sólo son comprendidas por él.

El dibujo: es un intermedio entre el juego y la imagen mental.

Lenguaje: cuando el niño dice guau-guau, existe una representación verbal del perro.

La función simbólica, definida como poder hallar a un objeto en la representación y a esta representación un signo, permite al niño operar sobre significaciones de las cosas representadas por signos y le da oportunidad de manejarse no sólo con la acción inmediata, actual, o sea con los elementos concretos de una situación, sino también con sus símbolos, o sea con sustitutos de la realidad.

Aproximadamente a los 24 meses (final de la etapa sensorio-motriz) el niño comienza a utilizar símbolos, utiliza papelitos en vez de dinero, una piedrita por un caramelo.

A parir de los 2 a los 4 años Piaget sitúa los primeros esquemas verbales que poseen una generalización muy precaria. Estas primeras palabras siempre tienen una relación simbólica con el objeto del que provienen y la generalización tiene mucho de subjetivo, por eso cuando el niño dice tutu cuando ve un tren y luego cuando ve un auto, lo general que él capta es el aparecer y desaparecer, entonces lo que se capta para analizar no es lo esencial del objeto, sino que es arbitrario, de allí que el niño utiliza la misma onomatopeya para designar lo que aparece y desaparece.

Estos esquemas verbales son algunos de los intermediarios entre las estructuras sensorio-motrices y los conceptos.

No son ni esquemas sensorios puros, ni conceptos puros. Del esquema sensorio-motriz conservamos modos de acción generalizables, que se aplican a objetos cada vez más numerosos (dicen papá a todos los hombres alejados a 20 metros) y del concepto, anuncian el elemento característico de comunión, puesto que son fonemas verbales que los ponen en relación con la comunicación de un tercero. Poseen dos limitaciones para ser conceptos a) que posee una significación cambiante, dado que el concepto supone una significación fija, las especies y los géneros aún no están bien establecidos; b) le falta la categoría de signos abstractos.

El mismo significado de intermediarios van a tener en esta etapa los preconceptos.

Sabemos que el lenguaje inicial está hecho ante todo de órdenes y expresiones de deseo, son las denominadas palabras frases, por ej. cuando un niño dice leche, está significando dame la leche. Por otra parte el pre-concepto, es un concepto aparente, ¿por qué? porque concepto constituye una clase que abarca a todos los elementos o individuos los que comparten la misma propiedad, Mesa es una clase que abarca a todos los elementos que comparten la misma propiedad: superficie horizontal sostenida por cuatro patas, después puede ser de madera o de hierro, es decir, los conceptos son sistemas de clases, conjuntos de objetos agrupados según relaciones de encajes jerárquicos (parte y todo).

Ahora bien, la primera cuestión es saber cómo, de ese lenguaje ligado a! acto inmediato y presente, el niño procede a la construcción de las representaciones verbales propiamente dichas. En otras palabras ¿cómo pasa el niño de ese lenguaje ligado al acto a las representaciones verbales?. Ese paso lo hará mediante el relato. El niño relata cosas y situaciones a veces para los demás, a veces para sí mismo, por ej. después de una visita cuenta, Roberto llorando, pato nadando lejos.

¿Que sucede cuando una situación vivida es relatada? Ya no hay intención de manejar la situación, se produce la liberación del esquema verbal de la situación real Es una representación. Y por esa vuelta a presentar que es la representación, la palabra comienza a funcionar como signo, es decir ya no simplemente como parte del acto sino como evocación de este. Es entonces, y sólo entonces, cuando el esquema verbal llega a desprenderse del esquema sensorio-motor, para adquirir la función de representación, es decir, de nueva presentación. El relato puede tornar la característica de la descripción, la cual se vuelve así, representación actual doblando la presentación perceptiva en el presente, tanto como en el pasado. El mejor indicio de los progresos de esta conceptualización es la aparición de la pregunta ¿qué es?.

Será durante la etapa pre-conceptual que estamos considerando que (de 2 a 4 años) el niño a través de la pregunta ¿qué es?, los relatos y las descripciones se irán de a poco desligando de la acción. El niño habla actuando aún cuando está solo. Luego y en forma gradual ese monólogo se interioriza, aunque aún precariamente, hasta llegar a preceder a la acción.

El razonamiento del niño en esta época es transductivo, va de lo particular a lo particular, es un razonamiento donde el niño fuerza la realidad para acomodarla a sus intereses, es un razonamiento sin encajes reversibles de clases y relaciones jerárquicas. No hay ajuste del pensamiento a la realidad objetiva.

Ej. de razonamiento transductivo: J. quiere ver a un vecinito jorobado que encuentra en su paseo. Días antes había preguntado el por qué de esa joroba, y después de las explicaciones dijo "pobre muchacho está enfermo", después había querido volver a verle, le dije que no iba a ser posible pues estaba enfermo con gripe en cama. Al día siguiente salimos de paseo y en el camino pregunta "¿está todavía enfermo en cama?" No, ya se levantó, y ella responde "Ah, entonces ya no tiene joroba".

En este momento la mentira surge señalando uno de los grandes progresos de la humanidad, progreso intelectual, por cuanto la deformación de lo real supone el manejo de las primeras construcciones deductivas, característica esencial del pensamiento naciente. El primer razonamiento del niño alcanza esa libertad de deformación que caracteriza al juego simbólico o de imaginación. La realidad es arreglada como en el juego.

La transducción será pues, una especie de experiencia mental que prolonga las coordinaciones sensorio-motrices en el plano de las representaciones, y estas representaciones no constituyen conceptos generales.

Estarnos ya en la etapa intuitiva (4 a 7 años), época de los razonamientos transductivos. El relato gana en coherencia, claridad y comunicabilidad.

Es una etapa en la que el niño observa mejor la realidad concreta. Sin embargo la súper abundancia verbal y la tendencia de llevarlo todo a la experiencia personal, hacen que el niño no comprenda aún que su punto de vista es uno de los tantos posibles. El mundo no es para él más que una respuesta a sus necesidades y deseos.

Que el niño pueda gracias al relato anticipar sus acciones futuras mediante la representación verbal, tiene tres consecuencias para el desarrollo mental:

1) Un intercambio posible entre individuos, es decir, el inicio de la socialización de la acción (pues mientras el lenguaje no ha adquirido una forma definitiva, las relaciones entre individuos se limitan a la imitación de gestos corporales).

2) Una interiorización de la palabra, es decir, la aparición del pensamiento propiamente dicho, que tiene, como soporte el lenguaje interior y el sistema de signos.

3) Una interiorización de la acción, la cual de puramente perceptiva y motriz que era hasta los 18 meses puede a partir de ese momento reconstruirse en el plano de las imágenes y de las experiencias mentales.

En la medida que puede verbalizar su acción y relatar acciones pasadas, existe un mayor intercambio entre él y los demás. Pero no creamos que el niño comunica enteramente su pensamiento. Comprobamos que en esta época son muy rudimentarias las conversaciones entre niños. Recién a partir de los 7 años los niños empezarán a discutir entre sí mientras se limitan a confrontar sus afirmaciones.

De los 4 a 7 años es la época de los por qué, mediante esta pregunta el niño no busca una explicación objetiva, que no estaría en condiciones de comprender sino la relación que pueda existir entre el objeto de su pregunta y sus necesidades, sus deseos o temores.

El niño de este nivel no tiene acción de conjunto del problema. Muestra una especie de impermeabilidad a la experiencia, no forma hipótesis, pero cree en la eficacia de su conducta y no puede abandonar los comportamientos estériles, que fracasan para seguir otros y hacer tentativas.

Todo esto nos muestra hasta qué punto la visión del mundo en este estadio, aunque más realista, siguen siendo egocéntrica y cercana a los que era en el nivel precedente.

A partir de los 7 años el pensamiento se hace más analítico y sensible a las relaciones objetivas. Es la edad de la razón, se sobrepasa la simple afirmación basada en la creencia del deseo, en las apariencias perceptivas.

En este momento aparecerá la noción de concepto, entendiendo por tal, una definición fija, que corresponde a una convención estable, que asigna su significación al signo verbal. En el concepto hay inclusión de una clase en otras, un perro es un perro y un animal Mientras que en el esquema guau hay una relación subjetiva impresa por el sujeto.

Con la aparición de la reversibilidad el pensamiento de intuitivo se convierte en operativo, porque las acciones se transformaran en operaciones. Gracias a la organización de sistemas de conjunto, el pensamiento llega a la lógica y adquiere una coherencia que antes no tenía. Antes de los 11 años la lógica no es independiente de su contenido concreto y por eso la llamamos "lógica concreta",. pues si bien han aparecido las operaciones lógicas, continúan ligadas al contexto en que se formaron, así como a la presencia material de los objetos a que se refieren.

La curiosidad y el interés del niño se hacen insaciables, como en ninguna otra edad países lejanos, costumbres de pueblos extranjeros, épocas remotas, comienzan a apasionarle tanto como el funcionamiento de su propio cuerpo o la estructura del globo terrestre. Se interesa por los hombres prehistóricos, o por el mundo de los animales y de las plantas, por los fenómenos de crecimiento y de reproducción. El mundo se aparece al niño en su riqueza y diversidad.

Sin embargo aún se muestra incapaz cuando se trata de simples proposiciones verbales aunque haya alcanzado la conservación de la materia.

Disminuye el egocentrismo con la real socialización del individuo. ¿Cómo se opera esa socialización? Por una transformación del punto de vista inicial, donde sin abandonar totalmente su punto de vista lo sitúa simplemente entre el conjunto de los otros puntos de vista posibles.

Será recién a partir del duodécimo año, con la aparición de las operaciones formales que aparecerán, las posibilidades de razonamiento hipotético-deductivo, que asegurarán al pensamiento su plena expansión. Aparecerán las preocupaciones filosóficas y morales.

Mientras en el período de las operaciones concretas el niño se complace en enumeraciones exhaustivas (tipos de auto o de aviones) en la necesidad de informarse sobre las relaciones recíprocas de una familia y sus preguntas acerca de la autoridad de tal persona sobre otra en el período de las operaciones formales, se le ve adoptar desde el punto de vista de la inteligencia y por ende en su lenguaje, se le ve reflexionar, plantearse problemas, pensar el pro y el contra antes de tomar una decisión, valorar diferentes eventualidades y emitir hipótesis. El niño suspende la acción y posa por las ideas, somete sus elaboraciones a una crítica más rigurosa. En la conversación aparecen términos abstractos, utilizados correcta o incorrectamente, junto a nociones generales como el bien y la justicia, etc.



FUNCIONES DEL LENGUAJE

Podemos decir, y ya para finalizar, que el lenguaje cumple una función social, una función psicológica, y una función de ejercicio mental.

Función social: permite la comunicación, la integración del niño con el grupo y participación en la mentalidad colectiva. Con el lenguaje todo el sistema de conceptos sociales le ofrece al niño proporcionarle los cuadros dentro de los cuales se organiza su experiencia.

Función psicológica: el lenguaje sirve para consolidar la impresión sensorial de los objetos y aún para conferir al objeto su duración. Reemplaza al objeto cuando éste esta ausente. Al pronunciar la palabra el niño se asegura de que ésta le corresponde, hace presente lo ausente.

Función de ejercicio mental: (y físico) Como el juego, es un ejercicio corporal, y sirve para afianzar el sentimiento que el ser comienza a tener de sí mismo.

Ursa cuarta función es la cultural, mediante el lenguaje el niño tendrá la. revelación de un mundo de otra clase que no es el de las realidades tangibles.

Osterrieth señala un elemento fundamenta! de la adquisición del lenguaje: el afectivo.

Pues ya en los gritos el bebé es capaz de provocar reacciones en los demás. Como lo será siempre productora de efectos sobre los seres humanos. Efectos positivos y negativas ya que puede llevar a la cura en algunos casos, como lo ha demostrado el psicoanálisis, y a la devastación psíquica en otros.



Etiquetas:

Algoritmos

CONCEPTO Y CARACTERISTICAS DE ALGORITMOS




El programador de computara es antes que nada una persona que resuelve problemas, por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de modo riguroso y sistemático. La metodología necesaria para resolver problemas mediante programas se llama metodología de la programación.



Un algoritmo es un método para resolver un problema. Aunque la popularización del termino ha llegado con el advenimiento de la era informática.



El profesor Niklaus Wirth inventor de pascal, modula- 2 y Oberon tituló uno de los mas famosos libros, Algoritmos mas estructuras de Datos= programas, significándonos que solo se puede llegar a realizar un buen programa con el diseño de un algoritmo y una correcta estructura de datos. Esta ecuación será una de las hipótesis fundamentales consideradas en esta obra.



La resolución de un problema exige el diseño de un algoritmo que resuelva el problema propuesto.











Los pasos para la resolución de un problema son:



1.- diseño de algoritmo, que describe la secuencia ordenada de pasos sin ambigüedades que conducen a la solución de un problema dado. (Análisis del problema y desarrollo del algoritmo.)

2.- expresar el algoritmo como un programa en un lenguaje de programación adecuado. (Fase de codificación.)

3.- ejecución y validación del programa por la computadora.



Para llegar a la realización de un programa es necesario el diseño previo de un algoritmo, de modo que sin algoritmo no puede existir un programa.

Los algoritmos independientes tanto del lenguaje de programación en que se expresan como de la computadora que los ejecuta. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y ejecutarse en una computadora distinta; sin embargo, el algoritmo será siempre el mismo. Así, por ejemplo en una analogía con la vida diaria, una receta de comida se puede expresar en español, ingles o francés, pero cualquiera que sea el lenguaje, los pasos para la elaboración del plato se realizaran sin importar el idioma del cocinero.

En la ciencia de la computación y en la programación, los algoritmos son más importantes que los lenguajes de programación o las computadoras. Un lenguaje de programación es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para ejecutarlo. Tanto el lenguaje de programación como la computadora son los medios para obtener un fin: conseguir que el algoritmo se ejecute y se efectué el proceso correspondiente.

Dada la importancia del algoritmo es la ciencia de la computacion, un aspecto muy importante será el diseño de algoritmos. El diseño de la mayoría de los algoritmos requiere creatividad y conocimientos profundos de la técnica de la programación. En esencia, la solución de un problema se puede expresar mediante un algoritmo.



CARACTERISTICAS DE LOS ALGORITMOS



Las características fundamentales que debe cumplir todo algoritmo son:



- un algoritmo debe ser preciso e indicar al orden de realización de cada paso.

- Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.

- Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento o sea, debe tener un número finito de pasos.



La definición de un algoritmo debe describir tres partes: entrada, proceso y salida. En el algoritmo de cocina de receta citada anteriormente se tendrá:



Entrada: ingredientes y utensilios empleados.

Proceso: elaboración de la receta en la cocina.

Salida: terminación del plato (por ejemplo, cordero).



DISEÑO DEL ALGORITMO



Una computadora no tiene capacidad para solucionar problemas más que cuando se le proporcionan los sucesivos pasos a realizar. Estos pasos sucesivos que indican las instrucciones a ejecutar por la maquina constituyen, como ya conocemos, el algoritmo.

La información proporcionada al algoritmo constituye su entrada y la información producida por el algoritmo constituye su salida.

Los problemas complejos se pueden resolver mas eficazmente con la computadora cuando se rompen en subproblemas que sean mas fáciles de solucionar que el original. Este método se suele denominar divide y vencerás, y consiste en dividir un problema complejo en otros mas simples.



ESCRITURAS DE ALGORITMOS



Como ya se ha comentado anteriormente, el sistema para describir (escribir) un algoritmo consiste en realizar una descripción paso a paso con un lenguaje natural del citado algoritmo. Recordemos un algoritmo es un método o un conjunto de reglas para solucionar un problema. En cálculos elementales estas reglas tienen las siguientes propiedades.



- deben estar seguidas de alguna consecuencia definida de pasos hasta que se obtengan un resultado coherente.

- Solo puede ejecutarse una operación a la vez.



El flujo de control usual de un algoritmo es secuencial.



Que hacer, para ver la película de harry potter?



- ir al cine

- comprar una entrada (billete o ticket)

- ver la película

- regresan a casa



El algoritmo consta de cuatro funciones básicas, cada una de las cuales debe ser ejecutada antes de realizar la siguiente. En términos de computadora, cada acción se codifica en una o varias sentencias que ejecutan una tarea particular.

El algoritmo descrito es muy sencillo; sin embargo, como ya se ha indicado en párrafos anteriores, al algoritmo general se descompondrá en pasos más simples en un procedimiento denominado refinamiento sucesivo, ya que cada acción puede descomponerse a su vez en otras acciones simples.



REPRESENTACION GRAFICA DE LOS ALGORITMOS



Para representar un algoritmo se debe utilizar algún método que permita independizar dicho algoritmo del lenguaje de programación elegido. Ello permitirá que un algoritmo pueda ser codificado indistintamente en cualquier lenguaje. Para conseguir este objetivo se precisa que el algoritmo sea representado grafica o numéricamente, de modo que las sucesivas acciones no dependan de la sintaxis de ningún lenguaje de programación, sino que la descripción pueda servir fácilmente para su transformación en un programa, es decir su codificación.



1.- diagrama de flujo.

2.- diagrama N-S (Nassi- Schneiderman).

3.- lenguaje de especificacion de algoritmos: pseudocódigo.

4.- lenguaje español, inglês...

5.- formula.



Los métodos 4 y 5 no suelen ser fáciles de transformar en programas. Una descripción en español narrativo no es satisfactoria, ya que es demasiado prolija y generalmente ambigua. Una formula, sin embarga, es buen sistema de representación. Por ejemplo, las formulas para la solución de una ecuación cuadrática (de segundo grado) es un medio sucinto de expresar el procedimiento algorítmico que se debe ejecutar para obtener las raíces de dicha ecuación.



DIAGRAMAS DE FLUJO



Un diagrama de flujo (flowchart) es una de las técnicas de representación de algoritmos más antigua y a la vez más utilizada, aunque su empleo ha disminuido considerablemente, sobre todo desde la aparición de lenguaje de programación estructurada. Un diagrama de flujo es un diagrama que utiliza los símbolos (cajas).



SIMBOLOS DE DIAGRAMA DE FLUJO



Cada símbolo visto anteriormente indica el tipo de operación a ejecutar y el diagrama de flujo ilustra gráficamente la secuencia en la que se ejecutan las operaciones.



Las líneas de flujo (flecha) representa el flujo secuencial de la lógica del programa.

Un rectángulo significa algún proceso en la computadora, es decir, acciones a realizar (sumar dos números, calcular la raíz cuadrada de un número, etc.).

El paralelogramo es un símbolo de entrada/salida que representa cualquier tipo de entrada o salida desde el programa o sistema; por ejemplo, entrada de teclado, salida en impresora o pantalla, etc.



El símbolo rombo es una caja de decisión que representa respuesta si/no o en diferentes alternativas 1, 2, 3, 4,… etc.

Cada diagrama de flujo comienza y termina con un símbolo Terminal.























No



Si



























































TIPOS DE ALGORITMOS SEGÚN SU FUNCIÓN



ALGORITMO DE ORDENAMIENTO



En computación y matemáticas un algoritmo de ordenamiento es un algoritmo que pone elementos de una lista o un vector en una secuencia dada por una relación de orden, es decir, el resultado de salida ha de ser una permutación —o reordenamiento— de la entrada que satisfaga la relación de orden dada. Las relaciones de orden más usadas son el orden numérico y el orden lexicográfico. Ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos (como los de búsqueda y fusión) que requieren listas ordenadas para una ejecución rápida. También es útil para poner datos en forma canónica y para generar resultados legibles por humanos.

Desde los comienzos de la computación, el problema del ordenamiento ha atraído gran cantidad de investigación, tal vez debido a la complejidad de resolverlo eficientemente a pesar de su planteamiento simple y familiar. Por ejemplo, BubbleSort fue analizado desde 1956.1 Aunque muchos puedan considerarlo un problema resuelto, nuevos y útiles algoritmos de ordenamiento se siguen inventado hasta el día de hoy (por ejemplo, el ordenamiento de biblioteca se publicó por primera vez en el 2004). Los algoritmos de ordenamiento son comunes en las clases introductorias a la computación, donde la abundancia de algoritmos para el problema proporciona una gentil introducción a la variedad de conceptos núcleo de los algoritmos, como notación de O mayúscula, algoritmos divide y vencerás, estructuras de datos, análisis de los casos peor, mejor, y promedio, y límites inferiores.

CLASIFICACIÓN



Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras:

• La más común es clasificar según el lugar donde se realice la ordenación

o Algoritmos de ordenamiento interno: en la memoria del ordenador.

o Algoritmos de ordenamiento externo: en un lugar externo como un disco duro.

• Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o inversamente ordenadas:

o Algoritmos de ordenación natural: Tarda lo mínimo posible cuando la entrada está ordenada.

o Algoritmos de ordenación no natural: Tarda lo mínimo posible cuando la entrada está inversamente ordenada.

• Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenían originalmente los elementos con claves iguales. Por ejemplo, si una lista ordenada por fecha se reordena en orden alfabético con un algoritmo estable, todos los elementos cuya clave alfabética sea la misma quedarán en orden de fecha. Otro caso sería cuando no interesan las mayúsculas y minúsculas, pero se quiere que si una clave aBC estaba antes que AbC, en el resultado ambas claves aparezcan juntas y en el orden original: aBC, AbC. Cuando los elementos son indistinguibles (porque cada elemento se ordena por la clave completa) la estabilidad no interesa. Los algoritmos de ordenamiento que no son estables se pueden implementar para que sí lo sean. Una manera de hacer esto es modificar artificialmente la clave de ordenamiento de modo que la posición original en la lista participe del ordenamiento en caso de coincidencia.

LOS ALGORITMOS SE DISTINGUEN POR LAS SIGUIENTES CARACTERÍSTICAS:

• Complejidad computacional (peor caso, caso promedio y mejor caso) en términos de n, el tamaño de la lista o arreglo. Para esto se usa el concepto de orden de una función y se usa la notación O(n). El mejor comportamiento para ordenar (si no se aprovecha la estructura de las claves) es O(n log n). Los algoritmos más simples son cuadráticos, es decir O(n²). Los algoritmos que aprovechan la estructura de las claves de ordenamiento (p. ej. bucket sort) pueden ordenar en O(kn) donde k es el tamaño del espacio de claves. Como dicho tamaño es conocido a priori, se puede decir que estos algoritmos tienen un desempeño lineal, es decir O(n).

• Uso de memoria y otros recursos computacionales. También se usa la notación O(n).

LISTADO DE ALGORITMOS DE ORDENAMIENTO



Algunos algoritmos de ordenamiento agrupados según estabilidad tomando en cuenta la complejidad computacional.

Estables

Nombre traducido Nombre original Complejidad Memoria Método

Ordenamiento de burbuja

Bubblesort O(n²)

O(1)

Intercambio

Ordenamiento de burbuja bidireccional

Cocktail sort O(n²)

O(1)

Intercambio

Ordenamiento por inserción

Insertion sort O(n²)

O(1)

Inserción

Ordenamiento por casilleros

Bucket sort O(n)

O(n) No comparativo

Ordenamiento por cuentas

Counting sort O(n+k)

O(n+k) No comparativo

Ordenamiento por mezcla

Merge sort O(n log n)

O(n)

Mezcla

Ordenamiento con árbol binario

Binary tree sort O(n log n)

O(n) Inserción

Pigeonhole sort

O(n+k)

O(k)

Ordenamiento Radix

Radix sort O(nk)

O(n) No comparativo

Distribution sort

O(n³) versión recursiva O(n²)

Gnome sort

O(n²)



Inestables

Nombre traducido Nombre original Complejidad Memoria Método

Ordenamiento Shell

Shell sort O(n1.25)

O(1)

Inserción

Comb sort

O(n log n)

O(1)

Intercambio

Ordenamiento por selección

Selection sort O(n²)

O(1)

Selección

Ordenamiento por montículos

Heapsort O(n log n)

O(1)

Selección

Smoothsort

O(n log n)

O(1)

Selección

Ordenamiento rápido

Quicksort Promedio: O(n log n),

peor caso: O(n²) O(log n)

Partición

Several Unique Sort

Promedio: O(n u),

peor caso: O(n²);

u=n; u = número único de registros

Cuestionables, imprácticos

Nombre traducido Nombre original Complejidad Memoria Método

Bogosort

O(n × n!), peor: no termina

Pancake sorting

O(n), excepto en

máquinas de Von Neumann



Randomsort







ALGORITMO DE BÚSQUEDA



Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento concreto dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de un elemento determinado en un conjunto finito de elementos, es decir, si el elemento en cuestión pertenece o no a dicho conjunto, además de su localización dentro de éste.

Este problema puede reducirse a devolver la existencia de un número en un vector.









BÚSQUEDA SECUENCIAL



Se utiliza cuando el contenido del vector no se encuentra o no puede ser ordenado. Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del arreglo hasta que éste se encuentre, o hasta que se llegue al final del arreglo. La existencia se puede asegurar desde el momento que el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del arreglo. A continuación se muestra el pseudocódigo del algoritmo:

Datos de Entrada:

vec: vector en el que se desea buscar el elemento

tam: tamaño del vector

dato: elemento que se quiere buscar.



Variables

pos: posición actual en el arreglo



pos = 0

Mientras pos < tam:

Si vec[pos]== dato devolver verdadero y/o pos, de lo contrario:

pos = pos + 1



Fin (Mientras)

Devolver falso





BÚSQUEDA BINARIA (DICOTÓMICA)



Se utiliza cuando el vector en el que queremos determinar la existencia o no de un elemento está ordenado, o puede estarlo, este algoritmo reduce el tiempo de búsqueda considerablemente, ya que disminuye exponencialmente con el número de iteraciones.

Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del arreglo (normalmente el elemento central), si el valor de éste es mayor que el del elemento buscado se repite el procedimiento en la parte del arreglo que va desde el inicio de éste hasta el elemento tomado, en caso contrario se toma la parte del arreglo que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible, con el elemento buscado como elemento central. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en el arreglo.

A continuación se presenta el pseudocódigo del algoritmo, tomando como elemento inicial el elemento central del arreglo.

Datos de Entrada:

vec: vector en el que se desea buscar el elemento

tam: tamaño del vector

dato: elemento que se quiere buscar.



Variables

centro: elemento central del intervalo

inf: limite inferior del intervalo

sup: limite superior del intervalo



inf = 0

sup = tam



Mientras inf <= sup:

centro = ((sup + inf) / 2) /* división entera: se trunca la parte decimal */

Si vec[centro] == dato devolver verdadero y/o pos, de lo contrario:

Si dato < vec[centro] entonces:

sup=centro-1

En caso contrario:

inf=centro+1



Fin (Mientras)

Devolver Falso

Etiquetas: