martes, 16 de noviembre de 2010

ARREGLOS UNIDIMENSIONALES

Un arreglo unidimensional es un tipo de datos estructurado que está formado de una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales.

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o posteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da su posición relativa.

Para implementar arreglos unidimensionales se debe reservar espacio en memoria, y se debe proporcionar la dirección base del arreglo, la cota superior y la inferior.
REPRESENTACION EN MEMORIA
Los arreglos se representan en memoria de la forma siguiente:

x : array[1..5] of integer

Para establecer el rango del arreglo (número total de elementos) que componen el arreglo se utiliza la siguiente formula:

RANGO = Ls - (Li+1)

donde:

ls = Límite superior del arreglo

li = Límite inferior del arreglo

Para calcular la dirección de memoria de un elemento dentro de un arreglo se usa la siguiente formula:

A[i] = base(A) + [(i-li) * w]

donde :

A = Identificador único del arreglo

i = Indice del elemento

li = Límite inferior

w = Número de bytes tipo componente

Si el arreglo en el cual estamos trabajando tiene un índice numerativo utilizaremos las siguientes fórmulas:

RANGO = ord (ls) - (ord (li)+1)

A[i] = base (A) + [ord (i) - ord (li) * w]




ARREGLOS BIDIMENSIONALES

Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito ordenado y homogéneo. El acceso a ellos también es en forma directa por medio de un par de índices.

Los arreglos bidimensionales se usan para representar datos que pueden verse como una tabla con filas y columnas. La primera dimensión del arreglo representa las columnas, cada elemento contiene un valor y cada dimensión representa una relación

La representación en memoria se realiza de dos formas : almacenamiento por columnas o por renglones.

Para determinar el número total de elementos en un arreglo bidimensional usaremos las siguientes fórmulas:

RANGO DE RENGLONES (R1) = Ls1 - (Li1+1)

RANGO DE COLUMNAS (R2) = Ls2 - (Li2+1)

No. TOTAL DE COMPONENTES = R1 * R2

REPRESENTACION EN MEMORIA POR COLUMNAS

x : array [1..5,1..7] of integer

Para calcular la dirección de memoria de un elemento se usan la siguiente formula:

A[i,j] = base (A) + [((j - li2) R1 + (i + li1))*w]

REPRESENTACION EN MEMORIA POR RENGLONES

x : array [1..5,1..7] of integer

Para calcular la dirección de memoria de un elemento se usan la siguiente formula:

A[i,j] = base (A) + [((i - li1) R2 + (j + li2))*w]

donde:

i = Indice del renglón a calcular

j = Indice de la columna a calcular

li1 = Límite inferior de renglones

li2 = Límite inferior de columnas

w = Número de bytes tipo componente

sábado, 23 de octubre de 2010

Ordenamiento de vectores

¿Qué es ordenamiento?

Es la operación de arreglar los registros de una tabla en algún orden secuencial de acuerdo a un criterio de ordenamiento.

El ordenamiento se efectúa con base en el valor de algún campo en un registro.

El propósito principal de un ordenamiento es el de facilitar las búsquedas de los miembros del conjunto ordenado.

Ej. de ordenamientos:

Dir. telefónico, tablas de contenido, bibliotecas y diccionarios, etc.

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso alfanumérico, ascendente o descendente.

¿Cuándo conviene usar un método de ordenamiento?

Cuando se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo.

Tipos de ordenamientos:

Los 2 tipos de ordenamientos que se pueden realizar son: los internos y los externos.

Los internos:

Son aquellos en los que los valores a ordenar están en memoria principal, por lo que se asume que el tiempo que se requiere para acceder cualquier elemento sea el mismo (a[1], a[500], etc).

Los externos:

Son aquellos en los que los valores a ordenar están en memoria secundaria (disco, cinta, cilindro magnético, etc), por lo que se asume que el tiempo que se requiere para acceder a cualquier elemento depende de la última posición accesada (posición 1, posición 500, etc

Algoritmos de ordenamiento:

Internos:

1.
1. Inserción directa.
2. Inserción binaria.

2. Inserción directa.

2. Selección directa.

3. Selección directa.
1. Burbuja.
2. Shake.

4. Intercambio directo.
1. Shell.

5. Inserción disminución incremental.
1. Heap.
2. Tournament.

6. Ordenamiento de árbol.
2. Quick sort.

7. Sort particionado.
8. Merge sort.
9. Radix sort.

10. Cálculo de dirección.

Externos:

1. Straight merging.
2. Natural merging.
3. Balanced multiway merging.
4. Polyphase sort.
5. Distribution of initial runs.


-METODO DE INSERCIÓN.

Este método toma cada elemento del arreglo para ser ordenado y lo compara con los que se encuentran en posiciones anteriores a la de él dentro del arreglo. Si resulta que el elemento con el que se está comparando es mayor que el elemento a ordenar, se recorre hacia la siguiente posición superior. Si por el contrario, resulta que el elemento con el que se está comparando es menor que el elemento a ordenar, se detiene el proceso de comparación pues se encontró que el elemento ya está ordenado y se coloca en su posición (que es la siguiente a la del último número con el que se comparó).

Procedimiento Insertion Sort

Este procedimiento recibe el arreglo de datos a ordenar a[] y altera las posiciones de sus elementos hasta dejarlos ordenados de menor a mayor. N representa el número de elementos que contiene a[].

paso 1: [Para cada pos. del arreglo] For i <- 2 to N do paso 2: [Inicializa v y j] v <- a[i] j <- i. paso 3: [Compara v con los anteriores] While a[j-1] > v AND j>1 do

paso 4: [Recorre los datos mayores] Set a[j] <- a[j-1],

paso 5: [Decrementa j] set j <- j-1.

paso 5: [Inserta v en su posición] Set a[j] <- v.

paso 6: [Fin] End.

Ejemplo:

Si el arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e'], el algoritmo va a recorrer el arreglo de izquierda a derecha. Primero toma el segundo dato 's' y lo asigna a v y i toma el valor de la posición actual de v.

Luego compara esta 's' con lo que hay en la posición j-1, es decir, con 'a'. Debido a que 's' no es menor que 'a' no sucede nada y avanza i.

Ahora v toma el valor 'o' y lo compara con 's', como es menor recorre a la 's' a la posición de la 'o'; decrementa j, la cual ahora tiene la posición en dónde estaba la 's'; compara a 'o' con a[j-1] , es decir, con 'a'. Como no es menor que la 'a' sale del for y pone la 'o' en la posición a[j]. El resultado hasta este punto es el arreglo siguiente: a = ['a','o','s','r',....]

Así se continúa y el resultado final es el arreglo ordenado :

a = ['a','a','e','e','g','i','l','m','n','o','p','r','s','t','x']

-MÉTODO DE SELECCIÓN.

El método de ordenamiento por selección consiste en encontrar el menor de todos los elementos del arreglo e intercambiarlo con el que está en la primera posición. Luego el segundo mas pequeño, y así sucesivamente hasta ordenar todo el arreglo.

Procedimiento Selection Sort

paso 1: [Para cada pos. del arreglo] For i <- 1 to N do

paso 2: [Inicializa la pos. del menor] menor <- i

paso 3: [Recorre todo el arreglo] For j <- i+1 to N do

paso 4: [Si a[j] es menor] If a[j] < a[menor] then

paso 5: [Reasigna el apuntador al menor] min = j

paso 6: [Intercambia los datos de la pos.

min y posición i] Swap(a, min, j).

paso 7: [Fin] End.

Ejemplo:

El arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e'].

Se empieza por recorrer el arreglo hasta encontrar el menor elemento. En este caso el menor elemento es la primera 'a'. De manera que no ocurre ningún cambio. Luego se procede a buscar el siguiente elemento y se encuentra la segunda 'a'.

Esta se intercambia con el dato que está en la segunda posición, la 's', quedando el arreglo así después de dos recorridos: a = ['a','a','o','r','t','i','n','g','e','x','s','m','p','l','e'].

El siguiente elemento, el tercero en orden de menor mayor es la primera 'e', la cual se intercambia con lo que está en la tercera posición, o sea, la 'o'. Le sigue la segunda 's', la cual es intercambiada con la 'r'.

El arreglo ahora se ve de la siguiente manera: a = ['a','a','e','e','t','i','n','g','o','x','s','m','p','l','r'].

De esta manera se va buscando el elemento que debe ir en la siguiente posición hasta ordenar todo el arreglo.

El número de comparaciones que realiza este algoritmo es :

Para el primer elemento se comparan n-1 datos, en general para el elemento i-ésimo se hacen n-i comparaciones, por lo tanto, el total de comparaciones es:

la sumatoria para i de 1 a n-1 (n-i) = 1/2 n (n-1).

-MÉTODO BURBUJA.

El bubble sort, también conocido como ordenamiento burbuja, funciona de la siguiente manera: Se recorre el arreglo intercambiando los elementos adyacentes que estén desordenados. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente lo que hace es tomar el elemento mayor y lo va recorriendo de posición en posición hasta ponerlo en su lugar.

Procedimiento Bubble Sort

paso 1: [Inicializa i al final de arreglo] For i <- N down to 1 do

paso 2: [Inicia desde la segunda pos.] For j <- 2 to i do

paso 4: [Si a[j-1] es mayor que el que le sigue] If a[j-1] < a[j] then

paso 5: [Los intercambia] Swap(a, j-1, j).

paso 7: [Fin] End.

Tiempo de ejecución del algoritmo burbuja:

1. Para el mejor caso (un paso) O(n)
2. Peor caso n(n-1)/2
3. Promedio O(n2)

sábado, 25 de septiembre de 2010

VARIABLES GLOBALES Y LOCALES

-Una variable global es, en informática, una variable accesible en todos los ámbitos de un programa informático. Los mecanismos de interacción con variables globales se denominan mecanismos de entorno global. El concepto de entorno global contrasta con el de entorno local donde todas las variables son locales sin memoria compartida (y por ello todas las iteraciones pueden restringirse al intercambio de mensajes).

El uso de este tipo de variables suele considerarse como una mala práctica, por el riesgo que conlleva esa deslocalización: una variable global puede ser modificada en cualquier parte del programa (a menos que resida en una sección de memoria protegida) y cualquier parte del programa depende de ella. Es por ello que una variable global tiene un potencial ilimitado para crear dependencias, factor éste que aumenta la complejidad. Sin embargo, en algunas ocasiones, las variables globales resultan muy útiles. Por ejemplo, se pueden usar para evitar tener que pasar variables usadas muy frecuentemente de forma continua entre diferentes subrutinas.

El uso de variables globales se desaconseja especialmente para lenguajes de programación funcionales (como puede ser Scheme). Viola la transparencia referencial y dificulta la legibilidad del código fuente.

Las variables globales se usan de forma frecuente para pasar información entre diferentes secciones del código que no comparten una relación de "función llamadora" - "función llamada", como ocurre con hilos concurrentes y módulos para el manejo de señales. Los lenguajes de programación donde cada archivo define un espacio de nombres implícito elminan la mayor parte de los problemas de los lenguajes con nombres de espacios gloables, aunque pueda haber algunos problemas si no se tiene cuidado a la hora de encapsular el código. Sin las restricciones adecuadas (como por ejemplo con un mutex), el código que usa variables globales no será a prueba de hilos excepto para los valores de sólo lectura en la memoria protegida.

Ejemplo de una variable global en C++:

#include

int global = 3; // Esta es la variable global.

void ChangeGlobal()
{
global = 5; // Se referencia la variable global en una función.
}

int main()
{
std::cout << global << '\n'; // Se referencia la variable global en una segunda función.
ChangeGlobal();
std::cout << global << '\n';
return 0;
}


-Una variable local es, en informática, la variable a la que se le otorga un ámbito local. Tales variables sólo pueden accederse desde la función o bloque de instrucciones en donde se declaran. Las variables locales se contraponen a las variables globales.

En la mayoría de lenguajes de programación las variables locales son variables automáticas almacenadas directamente en la pila de llamadas. Esto significa que cuando una función recursiva se llama a sí misma, las variables locales reciben, en cada instancia de la función, espacio para el direccionamiento de memoria separados. De esta forma las variables con este ámbito se pueden declarar, reescribir y leer sin riesgo de efectos secundarios para los procesos fuera del bloque en el que son declarados.

Los lenguajes de programación que se sirven de la semántica llamada por valor semantics proven una subrutina llamada con su propia copia local de los argumentos que se pasan. En la mayoría de lenguajes, a estos parámetros locales se les trata igual que otras variables locales dentro de la subrutina. Por otro lado las semánticas llamada por referencia y llamada por nombre permiten que los parámetros actuen como alias de los argumentos que se pasan, permitiendo a la subrutina modificar variables al margen de su ámbito.

Algunos expertos abogan por limitarse al uso de variables locales para evitar efectos laterales en el resto del software motivados por un cambio en un módulo en particular.

martes, 14 de septiembre de 2010

La instrucción while permite ejecutar un bloque de instrucciones mientras se de una cierta instrucción. Su sintaxis de uso es:

 

            while ()

                       

 

Su significado es el siguiente: Se evalúa la indicada, que ha de producir un valor lógico. Si es cierta (valor lógico true) se ejecutan las y se repite el proceso de evaluación de y ejecución de hasta que deje de serlo. Cuando sea falsa (false) se pasará a ejecutar la instrucción siguiente al while. En realidad puede ser una única instrucción o un bloque de instrucciones.

 

Un ejemplo cómo utilizar esta instrucción es el siguiente:

 

                using System;

 

                class HolaMundoWhile

                {

                               public static void Main(String[] args)

                               {

                                               int actual = 0;

 

                                               if (args.Length > 0)

                                                               while (actual < args.Length)

                                                               {

                                                                               Console.WriteLine(“¡Hola {0}!”, args[actual]);

                                                                              actual  = actual + 1;

                                                               }

                                               else

                                                               Console.WriteLine(“¡Hola mundo!”);

                               }

                }

 

En este caso, si se indica más de un argumento al llamar al programa se mostrará por pantalla un mensaje de saludo para cada uno de ellos. Para ello se usa una variable actual que almacena cuál es el número de argumento a mostrar en cada ejecución del while. Para mantenerla siempre actualizada lo que se hace es aumentar en una unidad su valor tras cada ejecución de las del bucle.

martes, 13 de julio de 2010

VARIABLES Y TIPOS DE DATOS

Definición de variables

Una variable puede verse simplemente como un hueco en el que se puede almacenar un objeto de un determinado tipo al que se le da un cierto nombre. Para poderla utilizar sólo hay que definirla indicando cual erá su nombre y cual será el tipo de datos que podrá almacenar, lo que se hace siguiendo la siguiente intaxis:

;
Una variable puede ser definida dentro de una definición de clase, en cuyo caso se correspondería con el tipo de miembro que hasta ahora hemos denominado campo. También puede definirse como un variable local a un método, que es una variable definida dentro del código del método a la que sólo puede accederse desde dentro de dicho código. Otra posibilidad es definirla como parámetro de un método, que son variables que almacenan los valores de llamada al método y que, al igual que las variables locales, sólo puede ser accedidas desde código ubicado dentro del método. El siguiente ejemplo muestra como definir variables de todos estos casos:

class A{int x, z;int y; void F(string a, string b) { Persona p; }}
En este ejemplo las variables x, z e y son campos de tipo int, mientras que p es una variable local de tipo Persona y a y b son parámetros de tipo string. Como se muestra en el ejemplo, si un método toma varios parámetros las definiciones de éstos se separan mediante comas (carácter ,), y si queremos definir varios campos o variables locales (no válido para parámetros) de un mismo tipo podemos incluirlos en una misma definición incluyendo en sus nombres separados por comas.


Con la sintaxis de definición de variables anteriormente dada simplemente definimos variables pero no almacenamos ningún objeto inicial en ellas. El compilador dará un valor por defecto a los campos para los que no se indique explícitamente ningún valor según se explica en el siguiente apartado. Sin embargo, a la variables locales no les da ningún valor inicial, pero detecta cualquier intento de leerlas antes de darles valor y produce errores de compilación en esos casos.

INSTRUCCION IF

PARTES
condition
Obligatorio. Expresión. Se debe evaluar como True o False, o como un tipo de datos que es implícitamente convertible a Boolean.

Then
Obligatorio en la forma de una línea, opcional en la forma de varias líneas.

statements
Opcional. Se ejecutan una o más instrucciones que siguen a If...Then que se ejecutan si condition se evalúa como True.

elseifcondition
Obligatorio si ElseIf está presente. Expresión. Se debe evaluar como True o False, o como un tipo de datos que es implícitamente convertible a Boolean.

elseifstatements
Opcional. Se ejecutan una o más instrucciones que siguen a ElseIf...Then que se ejecutan si elseifcondition se evalúa como True.

elsestatements
Opcional. Una o más instrucciones que se ejecutan si ninguna expresión condition o elseifcondition anterior se evalúa como True.

End If
Termina el bloque If...Then...Else.


EJEMPLO
En el ejemplo siguiente se muestran los formatos de varias líneas y de una sola línea de la instrucción If...Then...Else.

VBC#C++F#JScript
CopiarDim number, digits As Integer
Dim myString As String
number = 53
If number < 10 Then
digits = 1
ElseIf number < 100 Then
digits = 2
Else
digits = 3
End If
If digits = 1 Then myString = "One" Else myString = "More than one"

En el ejemplo anterior, la condición ElseIf se evalúa como True y se asigna a digits un valor de 2. A continuación, la última instrucción le asigna un valor de "Más de una" a myString.

instruccion for next

For...Next cuando desee repetir un conjunto de instrucciones un número fijo de veces.

Una Instrucción While...End While (Visual Basic) o una Instrucción Do...Loop (Visual Basic) funciona bien cuando no se sabe de antemano cuántas veces se necesita ejecutar las instrucciones del bucle. Sin embargo, cuando espere ejecutar el bucle un número concreto de veces, For...Next es una mejor elección. Determina el número de iteraciones cuando se entra en el bucle por primera vez.

El valor de step puede ser positivo o negativo. Determina el procesamiento del bucle como sigue:

Valor de step El bucle se ejecuta si
Positivo o cero
counter <= end

Negativo
counter >= end


PARTES

counter
Se requiere en la instrucción For. Variable numérica. Variable de control para el bucle.

datatype
Obligatorio, a menos que counter ya se haya declarado. Tipo de datos de counter.

start
Obligatorio. Expresión numérica. Valor inicial de counter.

end
Obligatorio. Expresión numérica. Valor final de counter.

step
Opcional. Expresión numérica. Cantidad en la que se incrementa counter cada vez que se recorre el bucle.

statements
Opcional. Una o más instrucciones entre For y Next que se ejecutan un número especificado de veces.

Exit For
Opcional. Transfiere el control fuera del bucle For.

Next
Obligatorio. Termina la definición del bucle For.