[ Foro de C# ]

Ejercicio de arrays

26-Apr-2014 19:02
Invitado (Pepe)
3 Respuestas

Hola  ,
En primer lugar enhorabuena por la página web .

Me han mandado en clase un ejercicio y lo estoy haciendo y no consigo hacerlo es este el ejercicio:
Vamos a realizar una aplicación para la gestión de un aparcamiento de coches. Para ello debemos tener en cuenta que en el aparcamiento leemos los datos de la matricula de un coche cuando entra y cuando sale también. La cantidad de plazas libres de cada aparcamiento se fija en la creacción del objeto parking. En un parking debemos saber las plazas libres y ocupadas, insertar un coche informando de su matrícula, retirarlo y ver la lista de coches que están dentro del parking en un momento dado.

Piensa cómo poder hacer esta clase parking y poder usarla.

Piensa en añadirle nuevas funcionalidades como anotar la hora de entrada y salida, etc...
(al ver que no me funcionaba no he añadido  la hora de entrada y de salida).

Esta es mi solucion:


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

namespace Parking
{
    class Parking
    {
        String _matricula;
         int _plaza=0;
        public int plaza{

            get {return _plaza;}
        }
        public String matricula
        {
            get { return _matricula; }
        }

        public Parking() { }
        public Parking(String matricula)
        {
            this._matricula = matricula;
            _plaza++;

        }

        public void salir()
        {
            _plaza--;
        }
        public override string ToString()
        {
            return _plaza + "  " + _matricula;
        }
        static void Main(string[] args)
        {
            int plazas=2;
            Parking []pa = new Parking[plazas];
            int opcion;
            String captura;
            Console.WriteLine(" Pulse 1 si desea entrar en el parking ,\n Pulse 2 si desea  salir  3. Saber el numero de coches y sus matriculas");
            int plaza = 0; int i = 0;
            opcion = Convert.ToInt32(Console.ReadLine());
            do
            {
                switch (opcion)
                {
                    case 1:
                        if (plaza < plazas) // aqui me  crea un bucle que no para de coger matriculas.
                        {
                            Console.WriteLine("introduzca el numero de matricula");
                            captura = Convert.ToString(Console.ReadLine());
                            
                                if (pa[i] == null)
                                {
                                    pa[i] = new Parking(captura);
                                }

                                else { i++; }


                                plaza++;
                        }
                        else { Console.WriteLine("el parking esta lleno"); }


                        break;

                    case 2:
                        {
                            Console.WriteLine("introduzca el numero de matricula");
                            captura = Convert.ToString(Console.ReadLine());
                            for (i = 0; i < plazas; i++)
                            {
                                if (pa[i].matricula == captura )
                                {
                                    pa[i] = null;
                                }

                            }


                            plaza--;
                        }
                      
                        break;
                    case 3:
                        for (i = 0; i < plazas; i++)
                            {
                                Console.WriteLine(pa[i]);
                        }
                        break;
                    default: break;
                }
            } while (opcion != 0);

           
            Console.ReadKey();
        }
    }
}


A ver si me podeis ayudar a ver que esta mal.


26-Apr-2014 23:58
Nacho Cabanes (+83)

Tienes dos contadores: como atributo un tal "_plaza", pero además un "i", que te dará problemas en la opción de añadir, porque tiene el valor 0.

Declara el "i" dentro de los "for" y no lo uses fuera de ellos:


for (int i = 0; i < plazas; i++)
    ...



27-Apr-2014 18:16
Invitado (Pepe)

Hola , gracias por la respuesta .

Lo he intentado solucionar pero me sigue dando fallo mismamente al instanciar el objeto ya da fallo, dejo aqui el codigo.


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

namespace Parking
{
    class Parking
    {
        String _matricula;
  
         static int plazatotal = 4;
    
        public String matricula
        {
            get { return _matricula; }
        }

    
        public Parking(String matricula)
        {
            this._matricula = matricula;
            plazatotal--;

        }

       
        public static int saberPlazas()
        {
            return plazatotal;

        }
        public override string ToString()
        {
            return plazatotal + "  " + _matricula;
        }
        static void Main(string[] args)
        {
           
            int plaza = 0;
            Parking []pa= new Parking[plaza];
            int opcion;
            String captura;
            Console.WriteLine("El numero de plazas disponibles es :"+ Parking.saberPlazas() +"\n\nPulse 1 si desea entrar en el parking ,\n Pulse 2 si desea  salir  \n 3. Saber el numero de coches y sus matriculas");
            int plazas= 0; int j = 0;
          Parking nuevo1 = new Parking("3454hng");
            pa[0] = nuevo1;
            opcion = Convert.ToInt32(Console.ReadLine());
            do
            {
                switch (opcion)
                {
                    case 1:
                        if (plazatotal>0)
                        {
                            Console.WriteLine("introduzca el numero de matricula");
                            captura = Convert.ToString(Console.ReadLine());
                            Parking nuevo = new Parking(captura);
                                if (pa[j] != null)
                                {
                                    j++;
                                  
                                }

                                else { pa[j] = nuevo;
                                plazatotal--;
                                }


                             
                        }
                        else { Console.WriteLine("el parking esta lleno"); }


                        break;

                    case 2:
                        {
                            Console.WriteLine("introduzca el numero de matricula");
                            captura = Convert.ToString(Console.ReadLine());
                            for (int i = 0; i < plazas; i++)
                            {
                                if (pa[i].matricula == captura )
                                {
                                    pa[i] = null;
                                    plazatotal++;
                                }

                            }


                           
                        }
                      
                        break;
                    case 3:
                        for (int i = 0; i < plazas; i++)
                            {
                                Console.WriteLine(pa[i]);
                        }
                        break;
                    default: break;
                }
            } while (opcion != 0);

           
            Console.ReadKey();
        }
    }
}



28-Apr-2014 21:42
Nacho Cabanes (+83)

El error que da el programa es IndexOutOfRangeException: accedes a un elemento de un array que está más allá del tamaño de éste.

Sigues teniendo variables peligrosas: "plaza", "plazas", "j" que se refieren a cosas muy parecidas. Pero el problema en sí está aquí:


int plaza = 0;
Parking []pa= new Parking[plaza];
...
pa[0] = nuevo1;


Si el array tiene tamaño 0, no podrás guardar nada en su primera posición.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)