sábado, 18 de octubre de 2008

3.2- Colas:

Es una estructura de Datos lineal donde las eliminaciones de elementos se realizan por uno de sus extremos denominado FRONT y las inserciones de elementos se realizan por el otro extremo denominado final o Rear.

Las colas son estructuras de datos FIFO(first-in, first-out) porque el primer dato que se inserto sera el primero que saldra de la Cola.

=Operaciones en Una Cola=

1.PUSH.- Es el metodo por el cual se va a agregar un nuevo dato a la cola, tomando en cuenta la capacidad maxima de
almacenar en la estructura y las posiciones del frente y final en la cola.

Algoritmo:
Push(Cola,Frente,Final,Max,Elemento)
si Frente=0 y Final =Max-1 entonces
Imprimir "La Cola Esta Llena", y Salir
si no si Frente =Nulo(-1)  entonces
Frente=0
Final=0
si no
Final=Final+1
Cola[Final]=Elemento
Salir
NOTA:INICIALIZAR AL PRINCIPIO DEL PROGRAMA
*TAMAÑO DE LA COLA
*FRONT=-1
*REAR=-1


2.POP.- Es el Método por el cual se va a sacar el primer dato de la cola tomando en cuenta solo la posicion del frente.

Algoritmo:
Pop(Cola,Frente,Final,Maximo)
si Frente!=-1 entonces
Imprimir "Eliminando Dato", Cola[Frente]
Cola[Frente]=0
Si Frente=Final
Cola[Frente]=0
Final=-1
si no 
Frente=Frente+1
si no
Imprimir "La Cola Esta Vacía"
Salir

3.-Recorrido: Es el Método en el cual se despliega el contenido de la cola, si no hay ni un elemento en ella desplegara el 
mensaje "La Cola Esta Vacía"

Algorítmo:
Recorrido(cola,frente,final,max)
si frente !=-1 entonces
apuntador=frente
repetir mientras apuntador <=final
imprimir "elemento",cola[apuntador],"posicion",apuntador
apuntador=apuntador+1
fin del ciclo
si no
imprimir "La Cola Esta Vacía"
Salir.

4.-Busqueda: Esta metodo utiliza el recorrido para encontrar el elemento deseado y desplegar un mensaje con la posicion 
donde se encuentra siempre y cuando la busqueda sea exitosa si no desplegara el mensaje de que no encontro el elemento. En 
el caso de que no existan elementos en la cola desplegara "La Cola Esta Vacía".

Algrítmo:
Búsqueda(cola,frente,final,max)
si frente!=-1 entonces
apuntador=Frente
repetir mientras apuntador<=final
si elemento=cola[apuntador] entonces
imprimir "dato encontrado",elemento,"posicion",apuntador
y salir
si no
apuntador=apuntador+1
fin del ciclo
imprimir "dato:",elemento,"no esta en la cola"
si no
imprimir "La Cola Esta Vacía"
Salir

Unidad III.- Estructuras Lineales y Dinámicas

3.1- Pilas
*Pila.- Es un conjunto ordenado de elementos en el cual se pueden agregar y eliminar datos por uno de sus extremos
llamado tope de la pila(top). "Siempre empieza con valor -1 (marca el estado vacío de cualquier estructura)". La pila es una estructura de datos LIFO porque el ultimo datos que se inserta es el primero que se elimina (Last in-first out).

=OPERACIONES EN UNA PILA=
1.-Push-> Es el método a traves del cual se va a agregar un dato nuevo a la pila tomando en cuenta la capacidad máxima de almacenar en la estructura.

Algorítmo:
Push(Pila,Top,Max,Elemento)
Si Top !=Max-1 entonces
Top<-Top+1
Pila[Top],_Elemento
Si no
Imprimir "La Pila Esta Llena"
Salir.

2.-Pop-> (Eliminar) Es el método con el cual se va a eliminar el ultimo dato de la pila basandose en la posicion de Top.
Si no esxisten elementos en la pila, desplegara el mensage "La Pila Esta Vacía".

Algorítmo:
Pop(Pila,Top)
Si Top !=Nulo(-1) entonces
Imprimir "Elemento:",Pila[Top],"Será Eliminado"
Pila[Top]<-0
Top,_Top-1
Si no
Imprimir "La Pila Esta Vacía"
Salir.

(Programa 15)
Menu Operaciones en una Pila
1 Insertar Datos en la Pila
2 Eliminar Datos en la Pila
3 Desplegar Datos en la Pila
4 Buscar Datos en la Pila
5 Fin del Programa

Instrucciones:
1.-Inicializar Top=-1
2.-Pedir el Tamaño Máximo de la Pila y enviarlo al constructor para establecer el tamaño máximo de la pila.
3.-Pedir desde el Menu de dato a insertar y enviar como parámetro al método PUSH.
4.-Hacer 2 Programas: Uno que maneje datos de tipo double (número) y otro que maneje datos de tipo string (nombres)

3. Recorrido: 
Es el método a través del cual se hace un recorrido a la pila para desplegar los elementos a partir
de la posicion del tope de la pila y se repite hasta que la variable auxiliar sea igual a nulo(-1).

Algorítmo:
Recorrido (Pila, Top)
si Top!=Nulo(-1) entonces
Apuntador=Top
Repetir mientras apuntador !=Nulo
Imprimir "Elemeno",Pila[Apuntador],"Posicion:",Apuntador
Apuntador=Apuntador-1
Fin del ciclo
si no
Imprimir "La pila esta Vacía"
Salir

4. Busqueda:
Es el método que se utiliza para localizar un elemento en particular en la pila. si esta resulta exitosa desplegara el elemento y la posicion en la que se encuentra, si no desplegara el mensaje de que el elemento no fue encontrado.

Algorítmo:
Busqueda (Pila,Top,Elemento)
si Top!=Nulo(-1)
Apuntador=Top
Repetir mientras Apuntador!=Nulo
Si Pila[Apuntador]=Elemento entonces
Imprimir "El dato",Elemento,"fue encontrado en la posicion",Apuntador
Salir (RETURN)
Si no 
Apuntador=Apuntador-1
Fin del ciclo
Imprimir "El dato",Elemento,"no esta en la Pila"
si no
Imprimir "La pila esta Vacía"
Salir

lunes, 22 de septiembre de 2008

2.1.2- Manejo de Memoria Dinámica

*Memoria Dinámica:
Las reservas de mamoria dinámica se hacen tiempo de ejecucion despues de leer los datos y de conocer el tamaño eacto del problema a resolver, como consecuancia se adapta mejor a las necesidades de cada caso pero en contrapartida es un poco mas dificil de programar.
Tanto la creación como destruccion de los objetos està en manos del programador a traves de los operadores "new" y "delette", el sitio donde se almacenan los objetos, suelen llamarse heap ò free store, traducido como montículo o memoria libre.
En c# no es necesario considerar la liberaciòn de la memoria dinamica puesto que FrameWork se encarga de liberar todas las referencias que no se esten utilizando y compactar la memoria para mejorar el rendimiento.

En C# todas las clases son tratadas sintacticamente como referencias y no permite elegir como reservar memoria para una instancia en particular, en cambio obliga a que un int sea un tipo valor.

class Program
{
void imprime_binario(int n)
{
if (n>=2)
{

imprime_binario(n/2);

Console.Write("{0}",n%2);

}
else
Console.Write("{0}",n);
}
static void Main (string []args)
{
Console.Write("Alimenta un Número Entero: ");

int numero=Int32.Parse(Console.ReadLine());

Program p=new Program();
Console.Write("\n\tNumero Entero {0} en Código Binario: ", numero); p.imprime_binario(numero);
Console.Write("\n\n\t\tDesea hacer otra Operación S/N: ");

op = char.Parse(Console.ReadLine());

}
while (op == 's' || op == 'S');
}
}

domingo, 21 de septiembre de 2008

Unidad II.- Manejo de Memoria

Toma arreglos y objetos en general, tiene una duracion determinada en el transcurso de un programa y son creados y destruidos, para su uso despues para que la memoria sea liberada, para que la utilicen otros objetos.

En C# existen 3 formas de usar la memoria para almacenar valores son:
a) Memoria Estatica
Es la utilizada por variables globales y las declaradas de tipo static. Estos objetos tienen asignada la misma direccion de memoria desde el comienzo hasta el final del programa.

b) Memoria Automatica
Es la utilizada por argumentos en una funcion y por las variables locales. Cada entrada en la funcion crea estos objetos y son destruidos al salir de ella.

c) Memoria dinamica
Es tambien llamado almacenamiento libre porque en estos casos el programador es el que solicita memoria para crear los objetos y es el responsable de liberar la memoria cuando ya no la necesita para
ser reutilizada.

La reserva y liberacion para variables globales, estaticas, locales y argumentos son realizadas en forma implicita por el programa, la unica que requiere intervencion del programador es la reserva y liberacion de memoria dinamica.

sábado, 20 de septiembre de 2008

2.1.1.- Manejo de Memoria Estática

La memoria estatica es la que se reserva en el momento de la compilacion ates de comenzar a ejecutarse el programa. Los objetos son creados en ese momento y destruidos al finalizar el programa. Mantienen la mismalocalizacion en memoria durante todo el transcurso del programa.
Los objetos administrados de este modo son:
  • Varialbes Estáticas
  • Varialbes Globales
  • Miembros státic de clases
  • Literales de cualquier tipo

Ejemplo1:
class CSimple1 //(PROGRAMA 13)
{
static void Main(string[]args)
{
int []Numeros=new int[]{1,2,3,4,5};
for (int i=0;i<5;i++)
console.Write("{0}",Numeros[i]);
}
}

Ejemplo2:
class CSimple2
{
static int Funcion(int p, int q)
{
return(p+q);
}
static void Main (string[]args)
{
int Resultado=Funcion(7,2);
Console.WriteLine(Resultado);
}
}


En el ejemplo 1 se muestra la declaracion estatica de un arreglo y la declaracion de la variable global de control dentro del for.
En el ejemplo 2 se muestra la declaracion estatica en una funcion la cual es ejecutada al enviarle 2 parametros que son literales numericas.

En resumen el inconveniente de utilizar memoria estatica aunque es mas facil de programar es que la cantidad de memoria se reserva siempre antes de conocer los datos completos del problema lo que aveces lleva a reservar un maximo de memoria que en la mayoria de las veces no se va a necesitar.

lunes, 15 de septiembre de 2008

1.4- Selección de un Algoritmo

Cuando se resuelve un problema y hay la necesidad de elegir entre varios algoritmos que nos puedan dar un resultado existen 2 objetivos que suelen contradecirse para elegir uno:
a) Que el algoritmo sea fácil de entender, codificar y depurar.

b) Que el algoritmo use eficientemente los recursos de la computadora y se ejecute con la mayor rapidez posible.

El primer punto (a) se debe elegir cuando se escribe un programa que se va a utilizar una o pocas veces ya que el costo del tiempo de programación no será tan relevante ya que solo se utilizara en pocas ocasiones.
El punto b es más importante cuando se presenta un problema cuya solución se va a utilizar muchas veces ya que el costo de ejecución del programa minimizara al costo de escritura.

En conclusión: Siempre será más ventajoso del punto de vista económico realizar un algoritmo complejo siempre y cuando el tiempo de ejecución del programa resulte significativamente menor.

1.3.2.- Complejidad en el Espacio

Complejidad espacial.- Es la memoria que utiliza un programa para su ejecución. Lo que implica que la eficiencia en memoria de un algoritmo lo indica la cantidad de espacio requerido para ejecutarlo es decir, el espacio en memoria que ocupan todas las variables propias del algoritmo.
Ej. Algoritmo de búsqueda en árboles.

Función búsqueda_arboles(problema)
devuelve solución/fallo
inicializa árbol de búsqueda con estado inicial
ciclo hacer
si no hay cantidades para expandir
entonces devolver “fallo”
en otro caso escoge r nodo para expandir
si el nodo es el objetivo
entonces devolver solución
en otro caso expandir nodo

=Resultados Obtenidos=


NOTAS: factor de ramificación --> 10 nodos sucesores p/cada uno como máximo profundidad del árbol

1.4.- Selección de un Algoritmo
Tarea: Como seleccionar un buen Algoritmo?