elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Análisis del vídeo del hackeo al Sindicato de los Mossos de Esquadra


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Guardar informacion en una pila
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Guardar informacion en una pila  (Leído 513 veces)
TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Guardar informacion en una pila
« en: 17 Julio 2017, 11:08 »

Hola,

la idea era guardar informacion en una lista tipo pila con un comando /report y luego ver todas las informaciones de la lista en un listBox con /reports.

En el formulario hice un listBox y un textBox.

El problema es que no se me muestra ninguna informacion.


Aqui el codigo fuente:

Código:
private Nodo raiz;

        public Form1()
        {
            InitializeComponent();
        }

        private void textBox2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if(textBox2.Text.Contains("/report"))
                {
                    Insertar(textBox2.Text.Substring(8));
                    textBox2.Clear();
                }

                if(textBox2.Text == "/reports")
                {
                    Imprimir();
                    textBox2.Clear();
                }
                e.SuppressKeyPress = true;
            }
        }

        public void Insertar(string x)
        {
            Nodo nuevo;
            nuevo = new Nodo();
            nuevo.info = x;
            if (raiz == null)
            {
                nuevo.sig = null;
                raiz = nuevo;
            }
            else
            {
                nuevo.sig = raiz;
                raiz = nuevo;
            }
        }

        class Nodo
        {
            public string info;
            public Nodo sig;
        }

        public void Imprimir()
        {
            Nodo reco = raiz;
            listBox1.Items.Add("Listado de todos los elementos de la pila.");
            while (reco != null)
            {
                listBox1.Items.Add(reco.info + "-");
                reco = reco.sig;
            }
            listBox1.Items.Add(Environment.NewLine);
        }

Gracias y saludos

PD.: Si no quieren mostrarme el codigo no importa. Pueden hacerme preguntas como: "Te fijaste lo que hiciste ahi o ahi" o "Te acuerdas que esto es asi y asi?"


En línea

NEBIRE


Desconectado Desconectado

Mensajes: 441


Ver Perfil
Re: Guardar informacion en una pila
« Respuesta #1 en: 17 Julio 2017, 16:22 »

Te pongo el pseudocódigo de lo que podría ser la estructura de una pila. Tu luego lo transformas a código NET, y después creas la interfaz para usarla...

Es mejor separar siempre que sea posible, el objeto que se crea de la operatoria que haga el cliente con ese objeto.

Entonces crea un nuevo proyecto, llámale  como quieras, luego añade una clase y llámala Pîla

Código:
clase pública Pila

    privado array entero ePila()  // los valores se alamcenarán aquí
    privado entero sCapacidad  // cantidad total de ítems que caben en la pila
    privado entero sItems   // cantidad de ítems que tiene la pila en un momento dado.

    Entero = publico Propiedad solo lectura Capacidad
        devolver sCapacidad  
    fin Propiedad

    Entero = publico Propiedad solo lectura Items
        Devolver sItems
    Fin Propiedad

    Buleano = publico Funcion EstaVacia
        Devolver (sItems=0)     // Si sItems es 0, la pila está vacía.
    Fin funcion

    Buleano = publico Funcion EstaLlena
        Devolver (sItems = sCapacidad)  // Si el valor de lo que contiene es igual a la capacidad, la pila está llena.
    Fin Funcion

    // Constructor de la clase, exige una cantidad para limitar la Pila.
    publico Funcion Nuevo(entero Cantidad)
       Si (cantidad > 0) luego
           Redimensionar array sPila(0 a Cantidad-1)
           sCapacidad = Cantidad
           sItems = 0
       Si no
           Generar ERROR "La cantidad de elementos en la Pila no puede ser 0 (ni un valor negativo)"
        Fin si
    Fin Funcion

    Buleano = Publico Funcion Meter(entero Valor)
        Si (EstaLlena = FALSE) entonces // invocamos un método de la propia clase
            ePila(sItems) = Valor
            sItems += 1  
            Devolver TRUE  
        Si no
            Generar ERROR " La pila está llena. Imposible añadir más elementos."
            Devolver FALSE
        Fin si
    Fin Funcion

    entero = publico Funcion Sacar // no lleva parámetros, la pila siempre saca elementos de la cima.
        Si (EstaVacia = FALSE) luego            
            sItems -=1    // simplemente se baja el puntero, no es preciso eliminar nada (salvo que se guardaren referencias de objetos).
            Devolver ePila(sItems)
        Si no
            Generar ERROR "La pila está vacía. no contiene elementos para extraer.
            Devolver 0
        Fin Si
    Fin funcion

    privada Funcion Destruir // el desctructor de la clase.
        Vaciar  
    Fin funcion

    privada Funcion Vaciar  //si esta función se hace pública necesitaría otra pareja llamada NuevaCapacidad(Cantidad) que haga lo mismo que hace el constructor... si no quedaría vacía y sin posibilidad de ser populada...
        sCapacidad=0
        sItems = 0
        Borrar array ePila
    Fin Funcion

    
Fin Clase

Éste pseudocódigo es un sencillo código pero completo para una pila. Incluso contiene dos métodos para consultar el estado de la pila (estaLlena y EstaVacia), que no son imprescindibles, pero internamente las vamos a usar, así que por que no hacerlos públicos...

Cómo usarla ?:
La pila es limitada, al valor que se le indica cuando se contruye una instancia de la clase. Es decir, tú puedes hacer uso de la pila por ejemplo desde una ventana o desde otra clase, lo mejor para probarlo es crear unos botones en un formulario y unas cajas de texto, los botones podrían ser 'crear()', Meter(), Sacar:  (los paréntesis en Crear y Meter, indican que requieren un parámetro que podría tomarlo de una caja de texto asociado a dicho botón.

Crear una instancia de la pil:
Código:
Pila p = Nueva Pila(25) //y creas una instancia de la Pila en p, que puede contener hasta 25 elementos.

Esta pila tiene varias limitaciones, no solo la cantidad de elemntos que puede contener (las pilas en general se diseñan para contener pequeñas cantidades, no cientos de millones, rara vez se necesitará un pila muy grande, un ejemplo de esas excepciones son precisamente los programas compiladores.
Bueno, otra limitación de esta pila es que la hemos limitado al tipo de datos entero. como es un proyecto de prueba, es suficiente, pero podrías hacerla de cualquier tipo incluso para admitir cualquier tipo...

Una Pila, es una estructura para guardar elementos y luego obtenerlos en orden inverso a como se metieron, es decir, la forma lógica de verlo, es imaginandose poner un libro en el suelo y lueo otro encima y luego otro y luego otro... esto es: "apilar libros"... directamente solo puedes coger el último, el que está arriba en  la cima, para coger otro más abajo, debes primero retirar los que tienes encima. Las pilas, por esto mismo se usan en casos donde se requiere precisamente mantener ese orden (inverso al que se ha metido).

Apilar datos:
Código:
p.Meter(12)
p.Meter(567)
entero n= -1234
p.Meter(n)
p.Meter(-44)

Probar los métodos y propiedades:
Código:
Mensaje p.Capacidad
Mensaje p.Items
Mensaje p.EstaLlena
Mensaje p.EstaVacia

Retirar datos:
Código:
entero n = p.Sacar
mensaje n  // el último valor metido fue -44, luego este es el primer valor sacado.
n = p.Sacar // se obtiene -1234, que fue el penúltimo metido.

Mensaje p.Items

etc....

Si tienes alguna duda, pregunta...

p.d.: no te conformes con ejecutar el proyecto a "saco" (F5, run), si no paso a paso (F11, debug... no recuerdo si en C# es también esa tecla F11 )


« Última modificación: 17 Julio 2017, 16:29 por NEBIRE » En línea

Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.054


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Guardar informacion en una pila
« Respuesta #2 en: 17 Julio 2017, 19:54 »

PD.: Si no quieren mostrarme el codigo no importa. Pueden hacerme preguntas como: "Te fijaste lo que hiciste ahi o ahi" o "Te acuerdas que esto es asi y asi?"

Ese comentario creo que está de más, sinceramente. Me habría gustado profundizar en el concepto "comandos" y por qué carece de sentido su utilización en una GUI ...al menos a simple vista sin que expliques más sobre tus intenciones.



El compañero @NEBIRE está claro que pretende que trabajes mucho en implementar las cosas por ti mismo para que vayas aprendiendo conceptos y de todo un poco en general, jeje, pero tampoco sería un delito hacerte saber que la librería de clases de .NET Framework ya expone una representación abstracta de una Pila, mediante la colección LIFO genérica System.Collections.Generic.Stack<T> (o la no genérica: System.Collections.Stack), y una representación de una Cola, la colección FIFO genérica System.Collections.Generic.Queue<T> (o la no genérica: System.Collections.Queue):

Código
  1. Stack<string> pila = new Stack<string>(capacidad);
  2. Queue<string> cola = new Queue<string>(capacidad);

Eso es en esencia todo lo que necesitarías para empezar a administrar el uso de una Pila (y de una Cola); ahora, y gracias al concepto de herencias, puedes tomar la clase Stack<T> y extenderla (para añadirle nuevos miembros/métodos/características) según las necesidades que tuvieses:

Código
  1. [ComVisible(false)]
  2. [DebuggerDisplay("Count = {Count}")]
  3. [DebuggerStepThrough()]
  4. public class ExtendedStack<T> : Stack<T> {
  5.  
  6.    [DebuggerNonUserCode()]
  7.    public ExtendedStack() : base() {}
  8.    public ExtendedStack(int capacity) : base(capacity) {}
  9.    public ExtendedStack(IEnumerable<T> collection) : base(collection) {}
  10.  
  11.    [EditorBrowsable(EditorBrowsableState.Always)]
  12.    public void PushRange(IEnumerable<T> items) {
  13.        foreach (T item in items) {
  14.            this.Push(item);
  15.        }
  16.    }
  17.  
  18.    [EditorBrowsable(EditorBrowsableState.Always)]
  19.    public T[] Pop(int amount) {
  20.        if (this.Count < amount) {
  21.            throw new ArgumentOutOfRangeException(paramName: "amount");
  22.        }
  23.        List<T> list = new List<T>();
  24.        for (int x = 0; x <= (amount - 1); x++) {
  25.            list.Add(this.Pop());
  26.        }
  27.        return list.ToArray();
  28.    }
  29.  
  30.    [EditorBrowsable(EditorBrowsableState.Always)]
  31.    public T[] Peek(int amount) {
  32.        if (this.Count < amount) {
  33.            throw new ArgumentOutOfRangeException(paramName: "amount");
  34.        }
  35.        Stack<T> tmpStack = new Stack<T>(Enumerable.Reverse(this));
  36.        List<T> list = new List<T>();
  37.        for (int x = 0; x <= (amount - 1); x++) {
  38.            list.Add(tmpStack.Pop());
  39.        }
  40.        tmpStack.Clear();
  41.        return list.ToArray();
  42.    }
  43.  
  44.    [EditorBrowsable(EditorBrowsableState.Always)]
  45.    public void Reverse() {
  46.        Stack<T> tmpStack = new Stack<T>(Enumerable.Reverse(this));
  47.        this.Clear();
  48.        this.PushRange(tmpStack);
  49.        tmpStack.Clear();
  50.    }
  51.  
  52. }

...El código de arriba es tan solo un ejemplo demostrativo y escrito al vuelo (no del todo optimizado), lo cierto es que nada de eso te debería resultar necesario hacerlo, pero no está de más enseñarte un poco el abanico de posibilidades que tienes a tu alcance...

Sencillamente limítate a usar la clase Stack<T> tal cual para representar una pila de objetos, o el ejercicio en pseudo-code que te ha indicado @NEBIRE para poner en práctica los conocimientos que lleves aprendidos...

Saludos.
« Última modificación: 17 Julio 2017, 20:37 por Eleкtro » En línea


TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Guardar informacion en una pila
« Respuesta #3 en: 19 Julio 2017, 14:51 »

Hola NEBIRE, hole Elektro,

muchas gracias por sus aportes. Aunque no se nada de VB, en internet se puede encontrar un traductor: http://converter.telerik.com/

Sus codigos sirven. Es bueno saber como usar una pila en C#.

Les queria comentar que antes de leer sus mensajes encontre una forma de guardar informacion en una lista (aparte de usar pilas). Y me familiarize mucho con ella. Es mas. Ustedes saben que soy el peor programador de este foro. Pero con esto yo nunca jamas tuve problemas. Ni en el aprendizaje ni en la practica. A saber: List <string>

Esta clase me ha ayudado muchisimo en mis programas. Que les parece?


PD.: Muchas gracias por su ayuda de nuevo.
En línea

NEBIRE


Desconectado Desconectado

Mensajes: 441


Ver Perfil
Re: Guardar informacion en una pila
« Respuesta #4 en: 19 Julio 2017, 15:12 »

Claro...
1 - La lista es el objeto por excelencia para guardar cosas un poco inconexas entre sí, pero masnteniendo cierto orden y cuya cantidad se desconoce a priori y/o pueda necesitarse muchos añadidos y eliminados contínuos.
2 - La pila se elige, sólo cuando los datos a almacenar deban ser mantenidos en orden inverso a como se han metido... (LIFO: Last In, First Out; Ultimo en Entrar, Primero en Salir, como la pila de libros).
3 - Igualmente (a una pila) una cola, se elige cuando los datos a lamacenar deban ser mantenidos en el orden de llegada... (FIFO: First In, first Out; Primero en entrar, Primero en Salir, justo como la cola del cine).

Las pilas y las colas, pueden construirse con arrays y también con nodos, igual que una lista enlazada.
4 - El array frente a la Lista, tiene la ventaja de la velocidad de acceso a los ítems, que además es elegible en acceso aleatorio (a cualquiera con total independencia), la lista enlazada al igual que con llas pilas y colas, se accede a sus elementos de forma secuencial...
5 - También tienes los árboles como estructura compleja, estos serñán tu preferencia cuando los datos tengan o deban mantener entre sí cierta dependencia. Hay una gran variedad de árboles que cubren muchas posibilidades. Pero en un primer encuentro, basta mirar los árboles de forma genérica.

6 - Los grafos, son como árboles 'irregulares', y tiene su uso porque al igual que en la vida es corriente que no haya nada de forma regular, los grafos permiten cierta flexiblidad mayor que los árboles a cambio de una mayor complejidad (en la estructura finalmente formada, que puede ser más abstracta).

Finalmente cuando la elección de preferencia sea la lista, pero deba hacerse un uso intensivo de búsquedas, y sea preciso un acceso aleatorio, la estructura de preferencia será la tabla hash. Es una estructura más compleja, pero tiene la flexibilidad de la lista enlazada, con la casi velocidad del array, en búsqueda incluso gana.

Documéntate sobre estos diferentes objetos y aprende a determinar cuando usar uno u otro...
En línea

TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Guardar informacion en una pila
« Respuesta #5 en: Ayer a las 14:20 »

Citar
Documéntate sobre estos diferentes objetos y aprende a determinar cuando usar uno u otro...

Vale.

Oye NEBIRE. Tu sabes de casualidad de un curso o tutorial que va despues de lo basico?


Gracias y saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Se puede guardar informacion que no sea en un archivo con .NET ?
.NET
nico56 7 2,436 Último mensaje 31 Enero 2010, 01:14
por nico56
Programa con problemas al guardar informacion y otros. vb.net
.NET
eduardogi 7 2,565 Último mensaje 29 Septiembre 2010, 14:13
por eduardogi
[AYUDA]Guardar informacion Con AutoIT
Scripting
Srare 0 314 Último mensaje 21 Abril 2014, 21:51
por Srare
[ayuda] Guardar información - java
Java
samirllorente 1 319 Último mensaje 14 Enero 2015, 14:37
por iGust4v0x
Guardar Información de una lista ligada en un archivo .txt
Programación C/C++
EdsonGuizar 2 494 Último mensaje 23 Abril 2016, 13:39
por AlbertoBSD
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines