Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

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

  • 6 Respuestas
  • 2449 Vistas

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

Desconectado Noporfavor

  • *
  • Underc0der
  • Mensajes: 105
  • Actividad:
    0%
  • Reputación 0
  • Que el debil mate a todos, mis queridos angeles
    • Ver Perfil
« en: Julio 17, 2016, 08:34:01 am »
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: [Seleccionar]
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: [Seleccionar]
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: [Seleccionar]
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
« Última modificación: Julio 23, 2016, 08:57:32 am por Stiuvert »

Desconectado grep

  • *
  • Underc0der
  • Mensajes: 178
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
    • Grep's personal site
« Respuesta #1 en: Julio 18, 2016, 12:38:45 pm »
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, ale.Next(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: C#
  1. Random generador = new Random(); // creamos un generador de números aleatorios
  2. int nuevoNumero = generador.Next(0, 2); // nuevoNumero será un numero mayor o igual a 0 y menor que 2


Saludos
« Última modificación: Julio 18, 2016, 12:42:34 pm por grep »

Desconectado Noporfavor

  • *
  • Underc0der
  • Mensajes: 105
  • Actividad:
    0%
  • Reputación 0
  • Que el debil mate a todos, mis queridos angeles
    • Ver Perfil
« Respuesta #2 en: Julio 18, 2016, 04:13:15 pm »
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: [Seleccionar]
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 + ale.Next(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 + ale.Next(0,1);

Gracias y saludos

Desconectado grep

  • *
  • Underc0der
  • Mensajes: 178
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
    • Grep's personal site
« Respuesta #3 en: Julio 18, 2016, 08:25:32 pm »
Con ale.Next(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

Desconectado Noporfavor

  • *
  • Underc0der
  • Mensajes: 105
  • Actividad:
    0%
  • Reputación 0
  • Que el debil mate a todos, mis queridos angeles
    • Ver Perfil
« Respuesta #4 en: Julio 19, 2016, 02:32:12 pm »
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 + ale.Next(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

Desconectado grep

  • *
  • Underc0der
  • Mensajes: 178
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
    • Grep's personal site
« Respuesta #5 en: Julio 19, 2016, 05:10:13 pm »
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

Desconectado Noporfavor

  • *
  • Underc0der
  • Mensajes: 105
  • Actividad:
    0%
  • Reputación 0
  • Que el debil mate a todos, mis queridos angeles
    • Ver Perfil
« Respuesta #6 en: Julio 22, 2016, 08:34:09 am »
Muchisimas gracias grep.

 

¿Te gustó el post? COMPARTILO!



[SOLUCIONADO] ¿Kali Linux o Kali Linux Ligth ?

Iniciado por worq

Respuestas: 2
Vistas: 14313
Último mensaje Noviembre 21, 2017, 12:28:54 pm
por Codig0Bit
[SOLUCIONADO] ¿Como publicar un software como software libre?

Iniciado por FuriosoJack

Respuestas: 2
Vistas: 2742
Último mensaje Mayo 23, 2017, 07:24:22 am
por HATI
[SOLUCIONADO] Multiuploader de imagenes con mysql, hosting de imagenes con mysql

Iniciado por graphixx

Respuestas: 4
Vistas: 3366
Último mensaje Marzo 26, 2013, 05:42:58 pm
por Xt3mP
[SOLUCIONADO] Linux Mint, errores, errores y mas errores...

Iniciado por n1sendev

Respuestas: 12
Vistas: 4963
Último mensaje Noviembre 22, 2017, 06:50:55 am
por RuidosoBSD
[SOLUCIONADO] Ayuda urgente con Virus "Virus.Win32Sality"

Iniciado por Napsters

Respuestas: 6
Vistas: 4776
Último mensaje Junio 11, 2012, 03:38:18 am
por Satyricon