Estructuras dinámicas: Listas tipo Pila - Problema de aplicación - C# - Error

Iniciado por Noporfavor, Julio 03, 2016, 04:29:02 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Hola,
en Form1.cs [Diseno]* hice esto:




en Pila.cs puse este codigo:

Código: php

Pila pila1;
            pila1 = new Pila();
            string cadena = textBox1.Text;
            for (int f = 0; f < cadena.Length; f++)
            {
                if (cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{')
                {
                    pila1.Insertar(cadena.ElementAt(f));
                }
                else
                {
                    if (cadena.ElementAt(f) == ')')
                    {
                        if (pila1.Extraer() != '(')
                        {
                            Text = "Incorrecta";
                            return;
                        }
                    }
                    else
                    {
                        if (cadena.ElementAt(f) == ']')
                        {
                            if (pila1.Extraer() != '[')
                            {
                                Text = "Incorrecta";
                                return;
                            }
                        }
                        else
                        {
                            if (cadena.ElementAt(f) == '}')
                            {
                                if (pila1.Extraer() != '{')
                                {
                                    Text = "Incorrecta";
                                    return;
                                }
                            }
                        }
                    }
                }
            }
            if (pila1.Vacia())
            {
                Text = "Correcta";
            }
            else
            {
                Text = "Incorrecta";
            }
        }
    }
}


en Form1.cs* puse este codigo:

Código: php

using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Pila pila1;
            pila1 = new Pila();
            string cadena = textBox1.Text;
            for (int f = 0; f < cadena.Length; f++)
            {
                if (cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{')
                {
                    pila1.Insertar(cadena.ElementAt(f));
                }
                else
                {
                    if (cadena.ElementAt(f) == ')')
                    {
                        if (pila1.Extraer() != '(')
                        {
                            Text = "Incorrecta";
                            return;
                        }
                    }
                    else
                    {
                        if (cadena.ElementAt(f) == ']')
                        {
                            if (pila1.Extraer() != '[')
                            {
                                Text = "Incorrecta";
                                return;
                            }
                        }
                        else
                        {
                            if (cadena.ElementAt(f) == '}')
                            {
                                if (pila1.Extraer() != '{')
                                {
                                    Text = "Incorrecta";
                                    return;
                                }
                            }
                        }
                    }
                }
            }
            if (pila1.Vacia())
            {
                Text = "Correcta";
            }
            else
            {
                Text = "Incorrecta";
            }
        }
    }
}


Pero cuando quiero iniciar el programa me aparecen los siguientes errores:




Luego me voy a Form1.cs* en la linea 22 y adonde dice Pila le doy a mostrar posibles correcciones.
Luego le doy click a Formul.Pila.

Y me aparece este error que no lo puedo sacar:




Alguien me puedo ayudar?

Gracias y saludos


Además no creo que el código de Pila.cs sea el que has subido. Ese es el código para manejar el evento click de button1.


¿Qué procedimiento has seguido para crear el proyecto?

El primer error me dice que NO has creado un proyecto "Windows Forms Application".

Cuando creas un proyecto tipo "Windows Forms Application", la plantilla crea, entre otras cosas, un archivo Program.cs que contiene este código:

Código: csharp

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}


Toda aplicación C# tiene un método static void Main, y el primer error señala esto.

Se supone que en Pila.cs tienes una clase. No tienes definida ninguna clase Pila. Eso son los dos últimos errores.

Hola grep,

gracias por avisarme esto. Debi hacer primero una clase para Pila.cs.

Pero ya que estas tengo una duda en este programa. En el codigo Form1.cs esta escrito:

Código: php

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Formula
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Pila pila1;
            pila1 = new Pila();
            string cadena = textBox1.Text;
            for (int f = 0; f < cadena.Length; f++)
            {
                if (cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{')
                {
                    pila1.Insertar(cadena.ElementAt(f));
                }
                else
                {
                    if (cadena.ElementAt(f) == ')')
                    {
                        if (pila1.Extraer() != '(')
                        {
                            Text = "Incorrecta";
                            return;
                        }
                    }
                    else
                    {
                        if (cadena.ElementAt(f) == ']')
                        {
                            if (pila1.Extraer() != '[')
                            {
                                Text = "Incorrecta";
                                return;
                            }
                        }
                        else
                        {
                            if (cadena.ElementAt(f) == '}')
                            {
                                if (pila1.Extraer() != '{')
                                {
                                    Text = "Incorrecta";
                                    return;
                                }
                            }
                        }
                    }
                }
            }
            if (pila1.Vacia())
            {
                Text = "Correcta";
            }
            else
            {
                Text = "Incorrecta";
            }
        }
    }
}


Y mi duda estaba a donde dice:
Código: php

if (cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{')


De donde viene el ElementAt? Y que significa esto junto con (f)?

Gracias y saludos

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
De donde viene el ElementAt?

ElementAt es un método que se puede llamar en cualquier objeto tipo string.

Como la variable cadena referencia a un string, entonces puedes hacer cadena.ElementAt(<posición>)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Y que significa esto junto con (f)?

Como ElementAt es un método, la forma de llamar a este método es <objeto>.ElementAt(<algo que el método necesite como entrada>).

ElementAt devuelve un caracter tipo char, este caracter es el que se encuentra en la posición indicada por parámetro. Entonces, como el parámetro es el valor de la variable f, si suponemos que f es igual a 0 y cadena es igual a "(Hola Mundo)", cadena.ElementAt(f) == '(' es como decir: ¿El caracter que se encuentra en la posición 0 del string "(Hola Mundo)" es igual al caracter '(' ?.

En un string las posiciones de los elementos comienzan en cero. El caracter de la posición cero de "(Hola Mundo)" es '(', y el caracter de la posición cuatro es 'a', etc.

Saludos

Citar
ElementAt devuelve un caracter tipo char, este caracter es el que se encuentra en la posición indicada por parámetro. Entonces, como el parámetro es el valor de la variable f, si suponemos que f es igual a 0 y cadena es igual a "(Hola Mundo)", cadena.ElementAt(f) == '(' es como decir: ¿El caracter que se encuentra en la posición 0 del string "(Hola Mundo)" es igual al caracter '(' ?.

Ok, ( se encuentra en la posicion 0. Pero no se puede decir lo mismo de [ y {. Sin embargo se pregunta lo mismo. Tiene sentido? Cual?

Gracias y saludos

La condición es la siguiente:

Código: php
cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{'


|| es un operador lógico que se lee como un OR u O. El mismo determina si el resultado final es True o False.

Si alguna de las tres comparaciones retorna True, entonces el resultado final es True. Pero si las tres comparaciones retornan False, el resultado final es False.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Tiene sentido? Cual?

El sentido lo tiene el programador, esto es algo subjetivo.

En este caso el programa hará lo que se encuentra en el cuerpo del if (la sentencia pila1.Insertar(cadena.ElementAt(f)); ) si en una determinada posición existe un símbolo ( o un [ o un {.

Ok grep,
pero visto esto, que funcion cumple (f) en esta linea?:
if (cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{')

Eso me cuesta entender.

Gracias y saludos

La variable f contiene un valor. Este valor es un entero.

El método ElementAt requiere un entero como parámetro. Este valor es copiado desde f al hacer ElementAt(f).

Como tienes un for (int f = 0; f < cadena.Length; f++) entonces tienes varias iteraciones con f igual a 0, 1, 2, 3, 4, etc.. hasta cadena.Length.

Ahhhhh
Y en esta formula por ejemplo: (2+[3-12]*{8/3})
Aqui cadena.Lenght es igual a 16?


Correcto,

pero como la condición del for es f < cadena.Length, cuando f sea 16, ya no se ejecutará el bloque.

Saludos

Pero hay una cosa que no entiendo. Mira:
for (int f = 0; f < cadena.Length; f++)

f ya empieza con 0. No es, entonces, imposible que ( este en la posicion 0?

Saludos

Lee atentamente,

las posiciones en un string comienzan en cero.

"HOLA" tiene 'H' en su posicion cero, y 'A' en su posición tres. Pero "HOLA".Length es igual a 4.

Ahhh, osea que por ejemplo en esta formula: (2+[3-12]*{8/3})

La primera vuelta de la estructura repititiva for; el ( pasa por esta linea:
if (cadena.ElementAt(f) == '(' || cadena.ElementAt(f) == '[' || cadena.ElementAt(f) == '{')

Correcto?