[SOLUCIONADO] C# Estructuras dinámicas: Listas tipo Cola-Problemas de aplicación

Iniciado por Noporfavor, Julio 17, 2016, 08:34:01 AM

Tema anterior - Siguiente tema

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

Hola,
en realidad es un simple duda. Pero creo importante mostrarlo todo.

Queria desarrollar un programa para la simulación de un cajero automático.
Se cuenta con la siguiente información:
- Llegan clientes a la puerta del cajero cada 2 ó 3 minutos.
- Cada cliente tarda entre 2 y 4 minutos para ser atendido.

Queria que el programa obtenga las siguientes informaciónes:
1 - Cantidad de clientes que se atienden en 10 horas.
2 - Cantidad de clientes que hay en cola después de 10 horas.
3 - Hora de llegada del primer cliente que no es atendido luego de 10 horas (es decir la persona que está primera en la cola cuando se cumplen 10 horas)

Para eso hice en Form1.cs [Diseno] lo siguiente:


Y en Form1.cs puse lo siguiente:
Código: text

using ListaTipoCola2;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
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)
        {
            Random ale = new Random();
            int estado = 0;
            int llegada = 2 + ale.Next(0, 2);
            int salida = -1;
            int cantAtendidas = 0;
            Cola cola = new Cola();
            for (int minuto = 0; minuto < 600; minuto++)
            {
                if (llegada == minuto)
                {
                    if (estado == 0)
                    {
                        estado = 1;
                        salida = minuto + 2 + ale.Next(0, 3);
                    }
                    else
                    {
                        cola.Insertar(minuto);
                    }
                    llegada = minuto + 2 + ale.Next(0, 2);
                }
                if (salida == minuto)
                {
                    estado = 0;
                    cantAtendidas++;
                    if (!cola.Vacia())
                    {
                        cola.Extraer();
                        estado = 1;
                        salida = minuto + 2 + ale.Next(0, 3);
                    }
                }
            }
            label1.Text = "Atendidos: " + cantAtendidas.ToString();
            label2.Text = "En cola: " + cola.Cantidad().ToString();
            label3.Text = "Minuto llegada: " + cola.Extraer().ToString();
        }
    }
}


Y en Cola.cs lo siguiente:
Código: text

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ListaTipoCola2
{
    class Cola
    {
        class Nodo
        {
            public int info;
            public Nodo sig;
        }

        private Nodo raiz, fondo;

        public Cola()
        {
            raiz = null;
            fondo = null;
        }

        public bool Vacia()
        {
            if (raiz == null)
                return true;
            else
                return false;
        }

        public void Insertar(int info)
        {
            Nodo nuevo;
            nuevo = new Nodo();
            nuevo.info = info;
            nuevo.sig = null;
            if (Vacia())
            {
                raiz = nuevo;
                fondo = nuevo;
            }
            else
            {
                fondo.sig = nuevo;
                fondo = nuevo;
            }
        }

        public int Extraer()
        {
            if (!Vacia())
            {
                int informacion = raiz.info;
                if (raiz == fondo)
                {
                    raiz = null;
                    fondo = null;
                }
                else
                {
                    raiz = raiz.sig;
                }
                return informacion;
            }
            else
                return int.MaxValue;
        }

        public int Cantidad()
        {
            int cant = 0;
            Nodo reco = raiz;
            while (reco != null)
            {
                cant++;
                reco = reco.sig;
            }
            return cant;
        }
    }
}


Puesto que copie Form1.cs tengo una duda aqui:
Código: text

Random ale=new Random();
            int estado = 0;
            int llegada = 2 + ale.Next(0,2);
            int salida = -1;
            int cantAtendidas = 0;
            Cola cola = new Cola();


Que significa esta linea?
Random ale=new Random();

Hace mucho aprendi lo que es Random pero me olvide. Y en internet no lo explican tan bien como lo hace grep. Razon por la que no lo entiendo.

Gracias y saludos

Veamos:

Random ale = new Random();

Se crea una variable tipo Random llamada ale, y seguidamente inicializamos esta variable con una instancia de la clase Random. Esto es obvio, la variable es de tipo Random y solo puede referenciar a una instancia de tipo Random (o alguna clase derivada).

Random es una clase definida en el namespace System (de la librería mscorlib.dll). Como tu código tiene un using System; entonces tu código puede crear variables tipo Random e instancias tipo Random.

Random permite generar números aleatorios(en realidad pseudo-números aleatorios). Viendo tu código tenemos algunas partes en donde invocas, por ejemplo, No tienes permitido ver enlaces. Registrate o Entra a tu cuenta(0, 2). El método Next(a, b) devuelve un int aleatorio entre a y b  (el valor devuelto puede ser mayor o igual a a, y menor que b).

Resumiendo, aquí un ejemplo:

Código: csharp
Random generador = new Random(); // creamos un generador de números aleatorios
int nuevoNumero = generador.Next(0, 2); // nuevoNumero será un numero mayor o igual a 0 y menor que 2



Saludos

Gracias!
Siempre logras que lo entiendo!

Veras....
No te quiero molestar de nuevo; pero tendria otra dudita:

Hemos dicho que llegan clientes a la puerta del cajero cada 2 ó 3 minutos.

Pero mira esto:

Código: text

Random ale=new Random();
            int estado = 0;
            int llegada = 2 + ale.Next(0,2);
            int salida = -1;
            int cantAtendidas = 0;
            Cola cola = new Cola();


En esta linea mira:
int llegada = 2 + No tienes permitido ver enlaces. Registrate o Entra a tu cuenta(0,2);

La variable llegada almacena en que minuto llegará el próximo cliente (debemos generar un valor entre 2 y 3).
Supongamos que el numero aleatoria sea 2. 2+2=4. Si es 4 no se generara un valor entre 2 y 3.
No deberia, entonces quedar la linea asi?:
int llegada = 2 + No tienes permitido ver enlaces. Registrate o Entra a tu cuenta(0,1);

Gracias y saludos

Con No tienes permitido ver enlaces. Registrate o Entra a tu cuenta(0, 2) no vas a poder obtener el valor 2. Next() asegura la siguiente regla matemática:

a <= valor_a_devolver < b

Osea, valor_a_devolver será mayor o igual que 0 y menor pero NO igual a 2.

Saludos

Ahhh ok; gracias  ;D

Pero... si no te molestaria

Viste a donde dice:
if (llegada == minuto)

En realidad esta pensado para cuando llega una persona al cajero. Pero llegada tendria que ser igual a minuto. Pero en llegada vimos:
int llegada = 2 + No tienes permitido ver enlaces. Registrate o Entra a tu cuenta(0,2);

Entonces resultado 2 o 3

Y vemos que en la primera vuelta de la estructura repetitiva for minuto es 0

Pero 2 o 3 no es igual a 0.

Sere que soy tonto?

Gracias y saludos

Tu análisis es correcto,

en los primeros dos ciclos del bucle for, en donde la variable minuto es 0 y 1, el programa no ejecutará el cuerpo del bloque if. Osea, no se realiza ninguna acción.

Saludos