Código C# WPF: Conjunto Aleatorio con Temporizador DispatcherTimer

Informática5,29 KB

Código C# WPF: conjunto aleatorio con temporizador

A continuación se presenta el código de una aplicación WPF en C# que gestiona un conjunto de 16 elementos mediante un DispatcherTimer. El programa permite insertar y extraer elementos de forma aleatoria, actualizando la interfaz gráfica y mostrando un registro del proceso.

Clase principal: MainWindow

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        extraer.IsEnabled = false;
        vaciar.IsEnabled = false;
        salida.Clear();
        mi_timer.Interval = new TimeSpan(0, 0, 0, 1, 0);
        mi_timer.Tick += new EventHandler(ejecutar_cada_tick);
    }

    bool[] vector = new bool[16];
    bool llenar = true;
    Random r = new Random();
    DispatcherTimer mi_timer = new DispatcherTimer();

    private void vaciar_Click(object sender, RoutedEventArgs e)
    {
        empty_set();
        for (int i = 0; i < 16; i++)
        {
            cambia_imagen(i, 0, false);
        }
        insertar.IsEnabled = true;
        extraer.IsEnabled = false;
        vaciar.IsEnabled = false;
        llenar = true;
    }

    private void cambia_imagen(int valor, int contador, bool on_off)
    {
        string cadena;
        if (on_off)
        {
            cadena = "imagen_" + valor + "_on.png";
            progreso_1.Value = progreso_1.Value + 1;
            salida.Text = salida.Text + "Elemento " + valor + " encontrado después de " + contador + " intento(s)\n";
        }
        else
        {
            cadena = "imagen_" + valor + "_off.png";
            salida.Text = salida.Text + "Elemento " + valor + " extraído después de " + contador + " intento(s)\n";
            progreso_1.Value = progreso_1.Value - 1;
        }
        salida.ScrollToEnd();
        Image image = (Image)this.FindName("image_" + valor.ToString());
        image.Source = new BitmapImage(new Uri(@cadena, UriKind.Relative));
    }

    private void ejecutar_cada_tick(object sender, EventArgs e)
    {
        if (llenar == true) // acción de llenar
        {
            int valor = 0;
            int contador = 0;
            insert(ref valor, ref contador);
            if (valor != -1) // conjunto no lleno
            {
                cambia_imagen(valor, contador, true);
            }
            if (cardinal() == 16) // conjunto lleno
            {
                llenar = false;
                insertar.IsEnabled = false;
                extraer.IsEnabled = true;
                vaciar.IsEnabled = true;
                mi_timer.Stop();
            }
        }
        else // acción de vaciar
        {
            int valor = 0;
            int contador = extract(ref valor);
            if (valor != -1) // conjunto no vacío
            {
                cambia_imagen(valor, contador, false);
            }
            if (cardinal() == 0) // conjunto vacío
            {
                llenar = true;
                insertar.IsEnabled = true;
                extraer.IsEnabled = false;
                vaciar.IsEnabled = false;
                mi_timer.Stop();
            }
        }
    }

    private bool is_in(int i)
    {
        if (vector[i] == true)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    private int cardinal()
    {
        int contador = 0;
        for (int i = 0; i < 16; i++)
        {
            if (is_in(i) == true)
            {
                contador++;
            }
        }
        return contador;
    }

    private void insert(ref int valor, ref int contador)
    {
        contador = 0;
        while (true)
        {
            if (cardinal() == 16)
            {
                valor = -1; // conjunto lleno, no se puede insertar
                break;
            }
            else
            {
                valor = r.Next(0, 16);
                if (is_in(valor) == false)
                {
                    vector[valor] = true;
                    contador++;
                    break; // inserción exitosa
                }
                else
                {
                    contador++;
                }
            }
        }
    }

    private int extract(ref int valor)
    {
        int contador = 0;
        while (true)
        {
            if (cardinal() == 0)
            {
                valor = -1; // conjunto vacío, no se puede extraer
                break;
            }
            else
            {
                valor = r.Next(0, 16);
                if (is_in(valor) == true)
                {
                    vector[valor] = false;
                    contador++;
                    break; // extracción exitosa
                }
                else
                {
                    contador++;
                }
            }
        }
        return contador;
    }

    private void empty_set()
    {
        for (int i = 0; i < 16; i++)
        {
            vector[i] = false;
        }
    }

    private void insertar_Click(object sender, RoutedEventArgs e)
    {
        insertar.IsEnabled = false;
        mi_timer.Start();
    }

    private void extraer_Click(object sender, RoutedEventArgs e)
    {
        extraer.IsEnabled = false;
        vaciar.IsEnabled = false;
        mi_timer.Start();
    }
}

Descargar

PDF Word HTML