aiuto per Stack: struttura LIFO

Discussioni inerenti a C# e agli altri linguaggi .NET.

Re: aiuto per Stack: struttura LIFO

Messaggioda Pol » mar mar 13, 2012 10:00 am

Devo utilizzare l'array dinamico e i comandi push(T), T pop, Tpeek(), il tutto simulato in form, cioè devo inserire dei valori nello stack visualizzarli e poi toglierli.
Le mie conoscenze sono relative al 4° anno info, questo che devo fare è un argomento nuovo, e non sò da dove iniziare.
Il programma lo devo scrivere direttamente nella classe form, senza fare una classe a parte con le funzioni.

grazie

ciao
Pol
 
Messaggi: 23
Iscritto il: lun lug 11, 2011 11:50 am

Re: aiuto per Stack: struttura LIFO

Messaggioda Alberto » mar mar 13, 2012 2:44 pm

Ciao Pol
Perchè non posti il testo originale dell' esercizio? Quello che hai scritto non è chiaro. :?: Comunqua cominciamo a scrivere qualcosa. Col termine array dinamico potresti volerti riferire all' ArrayList (vi sono altre possibilità). Uno stack LIFO (Last In First Out) è una lista in cui ciò che viene inserito per ultimo viene estratto per primo, pensa a un mazzo di carte appogiato sul tavolo. Ebbene vuoi usare un array per simulare uno stack. Nel form dichiari:
Codice: Seleziona tutto
...
using System.Collections;

   public partial class Form1 : Form
   {
        private ArrayList myStack = new ArrayList();

        public Form1()
        {
            InitializeComponent();
        }
   ....

Nel form metti tre TextBox e tre Button per gestire il Push/Pop/Peek, i TextBox visualizzeranno i valori che devi inserire o che estrai e i pulsanti richiameranno le azioni corrispondenti.
Si pone la questione del tipo di dati da inserire nello stack, interi, stringhe, altro, oppure vuoi che il problema sia risolto coi generics? (La scritta Push(T) lo fa supporre), se posti il testo originale è meglio), supponiamo siano stringhe.
Le funzioni associate ai pulsanti potrebbero essere.
Codice: Seleziona tutto
        private void buttonPush_Click(object sender, EventArgs e)
        {
            string s = textBoxPush.Text;
            myStack.Add(s);   // aggiunge un elemento in coda all' array
        }

        private void buttonPeek_Click(object sender, EventArgs e)
        {
            string value = "";
            int last = myStack.Count - 1;

            if (last >= 0)
                value = (string)myStack[last];      // legge l' ultimo elemento ma non lo elimina.

            textBoxPeek.Text = value;
        }

        private void buttonPop_Click(object sender, EventArgs e)
        {
            string value = "";
            int last = myStack.Count - 1;

            if (last >= 0)
            {
                value = (string)myStack[last];      // legge l' ultimo elemento.
                myStack.RemoveAt(last);             // elimina l' ultimo elemento
            }

            textBoxPeek.Text = value;
        }
Alberto
 
Messaggi: 28
Iscritto il: mar mar 22, 2011 1:19 pm

Re: aiuto per Stack: struttura LIFO

Messaggioda Pol » sab mar 24, 2012 12:03 am

Ciao,
chiedo scusa per la mia mancata partecipazione, visto che ho chiesto aiuto, ma ho avuto dei problemi.
Ho scritto del codice, funziona ma non riesco a fermarlo alla 10 posizione.
come faccio?
MAgari si può migliorare

Grazie in anticipo. :)

namespace Stack
{
public partial class Form1 : Form
{
List<string> s = new List<string>(9);
public Form1()
{
InitializeComponent();
}
string lettere = "abcdefghilmnopqrstuvwzxyàèò'ìjk0123456789[]{}_.;|!£$%&/";//dichiarazione variabile di lettere di possibile inserimento
private void cmdPush_Click(object sender, EventArgs e)
{
check();
string a = txtElement.Text;
s.Add(a); // aggiunge un elemento in coda all' array
switch (s.Count)
{
case 1: label1.Text = s[0];
break;
case 2: label2.Text = s[1];
break;
case 3: label3.Text = s[2];
break;
case 4: label4.Text = s[3];
break;
case 5: label5.Text = s[4];
break;
case 6: label6.Text = s[5];
break;
case 7: label7.Text = s[6];
break;
case 8: label8.Text = s[7];
break;
case 9: label9.Text = s[8];
break;
case 10: label10.Text = s[9];
break;
}
progressBar1.Minimum = 0;
progressBar1.Maximum = 10;
progressBar1.Value = s.Count;
cmdPush.Enabled = false;
txtElement.Clear();
txtElement.Focus();
}
private void Form1_Load(object sender, EventArgs e)
{
cmdPush.Enabled = false;
txtElement.Focus();
}
private void cmdPop_Click(object sender, EventArgs e)
{
string value = "";
int last = s.Count - 1;

if (last >= 0)
{
value = (string)s[last]; // legge l' ultimo elemento.
s.RemoveAt(last); // elimina l' ultimo elemento
}
switch (last)
{
case 0: label1.Text = "";
break;
case 1: label2.Text = "";
break;
case 2: label3.Text = "";
break;
case 3: label4.Text = "";
break;
case 4: label5.Text = "";
break;
case 5: label6.Text = "";
break;
case 6: label7.Text = "";
break;
case 7: label8.Text = "";
break;
case 8: label9.Text = "";
break;
case 9: label10.Text = "";
break;
}
progressBar1.Minimum = 0;
progressBar1.Maximum = 10;
progressBar1.Value = s.Count;
txtElement.Focus();
}

private void check()
{
if (txtElement.Text.Length<1)
{
cmdPush.Enabled = false;
}
else
{
cmdPush.Enabled = true;
}

}

private void txtElement_TextChanged(object sender, EventArgs e)
{
if(txtElement.Text.Length>0)
{
cmdPush.Enabled = true;
}
}

private void txtElement_KeyPress(object sender, KeyPressEventArgs e)
{
{//funzione che permette l'inserimento di soli numeri
int stringa = lettere.IndexOf(e.KeyChar);
if (stringa == -1)
{
if (e.KeyChar != 8)
{
e.Handled = true;
}
}
}
}
}
}
Pol
 
Messaggi: 23
Iscritto il: lun lug 11, 2011 11:50 am

Re: aiuto per Stack: struttura LIFO

Messaggioda Alberto » sab mar 24, 2012 9:32 am

Ciao Pol
Quando posti un messaggio dovresti selezionare le parti di codice e premere il pulsante 'code' in questo modo vengono messe in un riquadro, rimangono indentate e sono più leggibili.
Alcuni consigli a caso:
- Raggruppa tutte le dichiarazioni dei campi della classe prima del costruttore, oppure altrove ma tutte insieme, hai messo 's' prima e 'lettere' dopo, diventa poco leggibile.
- La lista invece di chiamarla s (nome che di solito si attribuisce ad una variabile stringa) chiamala 'stack'.
- Al posto delle 10 label ti converrebbe mettere un TextBox in cui scrivere lo stack (metti la property multiLine=true in modo da poterlo allungare in altezza) , ad esempio:
Codice: Seleziona tutto
private void WriteStack()
{
    StringBuilder sb = new StringBuilder();
    foreach (string s in stack)
        sb.AppendLine(s);

    textBoxReport.Text = sb.ToString();
}

- La funzione 'check' dovresti richiamarla in 'txtElement_TextChanged'.
Pol ha scritto:Ho scritto del codice, funziona ma non riesco a fermarlo alla 10 posizione.
come faccio?

- Per limitare il mumero di elementi da inserire potresti scrivere in cmdPush_Click:
Codice: Seleziona tutto
private void cmdPush_Click(object sender, EventArgs e)
{
   if (stack.Count >= 3)
   {
        MessageBox.Show("Lo stack è pieno");
        return;
   }
   ...

Buon lavoro
Alberto
 
Messaggi: 28
Iscritto il: mar mar 22, 2011 1:19 pm

Re: aiuto per Stack: struttura LIFO

Messaggioda Pol » sab mar 24, 2012 10:19 am

Grazie Alberto,
mi hai dato un grande aiuto.

Ps. Sei veramente un esperto programmatore di c#.

ciao
Pol
 
Messaggi: 23
Iscritto il: lun lug 11, 2011 11:50 am

Re: aiuto per Stack: struttura LIFO

Messaggioda Pol » sab mar 24, 2012 10:39 am

Ciao Alberto,
ho riscontrato un problema, nella text i dati vengono impilati da sopra verso sotto, invece io avrei bisogno di impilarli da sotto verso sopra.
secondo te come posso fare?
garzie



Codice: Seleziona tutto
namespace Stack
{
    public partial class Form1 : Form
    {
        List<string> stack = new List<string>(9);
        public Form1()
        {
            InitializeComponent();
        }
        string lettere = "abcdefghilmnopqrstuvwzxyàèò'ìjk0123456789[]{}_.;|!£$%&/";//dichiarazione variabile di lettere di possibile inserimento
        private void cmdPush_Click(object sender, EventArgs e)
        {
            if (stack.Count >= 10)
            {
                MessageBox.Show("Lo stack è pieno");
                return;
            }
            string a = txtElement.Text;
            stack.Add(a);   // aggiunge un elemento in coda all' array
            WriteStack();
           
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 10;
            progressBar1.Value = stack.Count;
            cmdPush.Enabled = false;
            txtElement.Clear();
            txtElement.Focus();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            cmdPush.Enabled = false;
            txtElement.Focus();
        }
        private void cmdPop_Click(object sender, EventArgs e)
        {
            string value = "";
            int last = stack.Count - 1;

            if (last >= 0)
            {
                value = (string)stack[last];      // legge l' ultimo elemento.
                stack.RemoveAt(last);             // elimina l' ultimo elemento
            }
            WriteStack();
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 10;
            progressBar1.Value = stack.Count;
            txtElement.Focus();
        }
        private void txtElement_TextChanged(object sender, EventArgs e)
        {
            if(txtElement.Text.Length>0)
            {
                cmdPush.Enabled = true;
            }
            if (txtElement.Text.Length < 1)
            {
                cmdPush.Enabled = false;
            }
            else
            {
                cmdPush.Enabled = true;
            }
        }

        private void txtElement_KeyPress(object sender, KeyPressEventArgs e)
        {
            {//funzione che permette l'inserimento di soli numeri
                int stringa = lettere.IndexOf(e.KeyChar);
                if (stringa == -1)
                {
                    if (e.KeyChar != 8)
                    {
                        e.Handled = true;
                    }
                }
            }
        }
        private void WriteStack()
        {
            StringBuilder sb = new StringBuilder();
            foreach (string s in stack)
                sb.AppendLine(s);

            txtBoxReport.Text = sb.ToString();
        }

    }
}

Pol
 
Messaggi: 23
Iscritto il: lun lug 11, 2011 11:50 am

Re: aiuto per Stack: struttura LIFO

Messaggioda Alberto » sab mar 24, 2012 1:57 pm

Ciao Pol
Ti do qualche altro parere non richiesto perchè ho voglia di chiacchierare :)
- Gli estremi (0 e 10) della ProgressBar ti conviene scriverli a design-time nel pannello delle properties, è inutile assegnarli ogni volta in cmdPop_Click e cmdPush_Click, tanto non cambiano mai.
- In cmdPush_Click è inutile fare 'cmdPush.Enabled = false', dato che fai 'txtElement.Clear()' questo richiamerà txtElement_TextChanged che a sua volta disabilita il bottone.
- L' espressione all' interno di un if (ad esempio 'if(txtElement.Text.Length > 0)') è una espressione booleana e come tale puo essere assegnata ad una variabile boolenana (ad esempio a 'cmdPush.Enabled'), quindi potresti riscrivere la 'txtElement_TextChanged' in questo modo:
Codice: Seleziona tutto
private void txtElement_TextChanged(object sender, EventArgs e)
{
  cmdPush.Enabled = (txtElement.Text.Length > 0);
}

Come vedi basta una riga (le parentesi tonde non servono le ho messe per chiarezza), quando l' espressione è vera (ovvero la lunghezza della stringa è maggiore di zero) il controllo è abilitato, se è falsa (quindi stringa vuota) invece è disabilitatò. Non sempre questi giochetti sono chiari, se hai dei dubbi usa gli 'if'.

- Per scrivere l' elenco al contrario basta ciclare al contrario usando un for invece del foreach (è un po meno chiaro ma pazienza):
Codice: Seleziona tutto
private void WriteStack()
{
    StringBuilder sb = new StringBuilder();
    for(int i = stack.Count - 1; i >= 0; --i)
        sb.AppendLine(stack[i]);

    txtBoxReport.Text = sb.ToString();
}
Alberto
 
Messaggi: 28
Iscritto il: mar mar 22, 2011 1:19 pm

Re: aiuto per Stack: struttura LIFO

Messaggioda Pol » sab mar 24, 2012 2:18 pm

Grazie Alberto,
sei stato chiaro.

ciao :D
Pol
 
Messaggi: 23
Iscritto il: lun lug 11, 2011 11:50 am

Re: aiuto per Stack: struttura LIFO

Messaggioda Pol » sab mar 31, 2012 6:44 pm

Ciao Alberto,
avrei bisogno, per cortesia, ancora della tua consulenza.
Devo simulare una coda FIFO facendo vedere sul form il movimento della coda stessa, ma la cosa che mi viene difficile e quando tolgo l'elemento dalla coda, secondo te va bene quello che che ho fatto? o forse devo usare Queue, Enqueque.
Ti ringrazio in anticipo

:)

Codice: Seleziona tutto
 public partial class Form2 : Form
    {//Istanzio la classe List per creare l'array dinamico (pubblico)
        List<string> coda = new List<string>();
        public Form2()
        {
            InitializeComponent();
        }
        string lettere = "ABCDEFGHILMNOPQRSTUVZYJabcdefghilmnopqrstuvwzxyàèò'ìjk0123456789[]{}_.;|!£$%&/";//dichiarazione variabile di lettere di possibile inserimento
        private void Form2_Load(object sender, EventArgs e)
        {

        }
        private void cmdPush_Click(object sender, EventArgs e)
        {
            if (coda.Count >= 10)//dimensione massima stack
            {
                MessageBox.Show("La coda è piena");//messaggio
                txtInsDati.Clear();//pulisce textbox
                return;
            }
            string a = txtInsDati.Text;//variabile acquisizione elemento
            coda.Add(a);   // aggiunge un elemento in coda all' array
            progressBar1.Value = coda.Count;
            if (coda.Count == 1)
            {
                label2.Text += a.ToString();
            }
            else if (coda.Count == 2)
            {
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 3)
            {
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 4)
            {
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 5)
            {
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 6)
            {
                label7.Text += label6.Text;
                label6.Text = "";
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 7)
            {
                label8.Text += label7.Text;
                label7.Text = "";
                label7.Text += label6.Text;
                label6.Text = "";
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 8)
            {
                label9.Text += label8.Text;
                label8.Text = "";
                label8.Text += label7.Text;
                label7.Text = "";
                label7.Text += label6.Text;
                label6.Text = "";
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 9)
            {
                label10.Text += label9.Text;
                label9.Text = "";
                label9.Text += label8.Text;
                label8.Text = "";
                label8.Text += label7.Text;
                label7.Text = "";
                label7.Text += label6.Text;
                label6.Text = "";
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            else if (coda.Count == 10)
            {
                label11.Text += label10.Text;
                label10.Text = "";
                label10.Text += label9.Text;
                label9.Text = "";
                label9.Text += label8.Text;
                label8.Text = "";
                label8.Text += label7.Text;
                label7.Text = "";
                label7.Text += label6.Text;
                label6.Text = "";
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = a.ToString();
            }
            txtInsDati.Clear();
            txtInsDati.Focus();
        }

        private void txtInsDati_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtInsDati_KeyPress(object sender, KeyPressEventArgs e)
        {
            {//funzione che permette l'inserimento di soli numeri
                int stringa = lettere.IndexOf(e.KeyChar);
                if (stringa == -1)
                {
                    if (e.KeyChar != 8)
                    {
                        e.Handled = true;
                    }
                }
            }
        }

        private void cmdPop_Click(object sender, EventArgs e)
        {
            string val = "";//variabile di tipo string
            int last = coda.Count -1;//variabile che memorizza l'elemento da eliminare
            if (last >= 0)//condizione
            {
                val = (string)coda[last];  // legge l' ultimo elemento.
                coda.RemoveAt(last); // elimina l' ultimo elemento inserito
            }
            progressBar1.Value = coda.Count;
            switch (coda.Count)
            {
                case 9:
                label11.Text += label10.Text;
                label10.Text = "";
                label10.Text += label9.Text;
                label9.Text = "";
                label9.Text += label8.Text;
                label8.Text = "";
                label8.Text += label7.Text;
                label7.Text = "";
                label7.Text += label6.Text;
                label6.Text = "";
                label6.Text += label5.Text;
                label5.Text = "";
                label5.Text += label4.Text;
                label4.Text = "";
                label4.Text += label3.Text;
                label3.Text = "";
                label3.Text += label2.Text;
                label2.Text = "";
                label2.Text = "0";
                break;
            }
        }
       
    }
}

Pol
 
Messaggi: 23
Iscritto il: lun lug 11, 2011 11:50 am

Precedente

Torna a Il linguaggio C#

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron