[ Foro de C# ]

ArrayList no guarda datos cuando se implementa en POO

24-Aug-2015 18:32
Invitado (JCamaleon)
4 Respuestas

Buen día a todos los participantes,

es la primer vez que participo en un foro con el tema a tratar en relación a programación, pues recién inicio mi estudio en C#. disculpas de antemano por los errores que pudiera cometer al preguntar y/o por lo extenso del mensaje.

les comento que estoy realizando un programa muy simple, que utiliza una estructura switch en conjunto con un ArrayList para guardar sueldos en el mismo, dando al usuario la posibilidad de agregarlos, modificarlos, eliminarlos, y ordenarlos. me refiero desde luego, a los datos de la lista.

comentar que el programa se realiza en consola, y si el mismo se realiza en programación estructurada, funciona sin problemas, salvo unos pequeños errores. sin embargo, el requisito es realizarle bajo el concepto de programación orientada a objetos. es en éste caso, cuando el arreglo parece guardar los datos, pero al momento de seleccionar otras opciones del switch para modificar dichos datos, éstos parecen ya no estar en la lista. por tanto, no es posible modificarles, ordenarlos, etc..

dejo el código al final...

alguien me pudiera dar luz sobre qué estoy haciendo mal?

muy agradecido a quien se tome el tiempo de leer mi consulta.

código


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

namespace sueldos.turnos
{
    class arreglos
    {
        ArrayList listasueldos = new ArrayList();

        public void agregar()
        {

            double sueld;
            char R;
            R = 's';



            while (R == 's' | R == 'S')
            {

                Console.WriteLine("Ingrese sueldo:");

                sueld = Convert.ToDouble(Console.ReadLine());

                listasueldos.Add(sueld);

                Console.WriteLine("¿Desea ingresar otro sueldo? (S/N)");
                R = Convert.ToChar(Console.ReadLine());
            } //while

        } // método

        public void mostrar()
        {

            foreach (double i in listasueldos)
            {
                Console.WriteLine("{0}", i);

            }




        } // método

        public void eliminar()
        {

            int se;

            char R;
            R = 's';

            while (R == 's' | R == 'S')
            {

                Console.WriteLine("Ingrese el índice correspondiente al sueldo a eliminar:");
                se = int.Parse(Console.ReadLine());

                listasueldos.RemoveAt(se);


                Console.WriteLine("¿Desea eliminar otro sueldo? (S/N)");
                R = Convert.ToChar(Console.ReadLine());

            } //while
        } // método


        public void ordenar()
        {
            listasueldos.Sort();

        } // metodo


        public void reordenar()
        {
            listasueldos.Reverse();

        } // metodo

        public void modificar()
        {
            int m, d;


            Console.WriteLine("Introduzca el índice del dato a modificar:");
            m = int.Parse(Console.ReadLine());

            Console.WriteLine("Introduzca el dato a agregar:");
            d = int.Parse(Console.ReadLine());


            listasueldos[m] = d;

            Console.ReadKey();

        } // cierra método


        public void menu()
        {
            arreglos b = new arreglos();
            arreglos a = new arreglos();



            Console.WriteLine("Sueldos de trabajadores");

            Console.WriteLine("1. Agregar");

            Console.WriteLine("2. Modificar");

            Console.WriteLine("3. Eliminar");

            Console.WriteLine("4. Mostrar sueldos");

            Console.WriteLine("5. Ordenar sueldos de forma acendente");

            Console.WriteLine("6. Ordenar de forma descendente");

            Console.WriteLine("7. Salir");

            Console.Write("Elija una opción: ");

            int Op = Convert.ToInt16(Console.ReadLine());

            switch (Op)
            {

                case 1:

                    Console.Clear();


                    b.agregar();
                    b.mostrar();


                    Console.WriteLine("Presiona una tecla para regresar al menú");

                    Console.ReadKey();


                    Console.Clear();

                    a.menu();




                    break;

                case 2:

                    Console.Clear();
                    b.modificar();
                    b.mostrar();

                    Console.WriteLine("Presiona una tecla para regresar al menú");
                    Console.ReadKey();

                    Console.Clear();

                    a.menu();




                    break;

                case 3:

                    Console.Clear();
                    b.eliminar();
                    b.mostrar();


                    Console.WriteLine("Presiona una tecla para regresar al menú");
                    Console.ReadKey();

                    Console.Clear();
                    a.menu();


                    break;

                case 4:

                    Console.Clear();

                    b.mostrar();

                    Console.WriteLine("Presiona una tecla para regresar al menú");
                    Console.ReadKey();

                    Console.Clear();

                    a.menu();


                    break;

                case 5:


                    Console.Clear();

                    b.ordenar();
                    b.mostrar();


                    Console.WriteLine("Presiona una tecla para regresar al menú");
                    Console.ReadKey();

                    Console.Clear();

                    a.menu();

                    break;

                case 6:

                    Console.Clear();

                    b.reordenar();
                    b.mostrar();


                    Console.WriteLine("Presiona una tecla para regresar al menú");
                    Console.ReadKey();

                    Console.Clear();

                    a.menu();


                    break;

                case 7:

                    Console.Clear();


                    Console.WriteLine("Presiona una tecla para salir");
                    Console.ReadKey();


                    break;


                default:

                    Console.WriteLine("Opción no válida");

                    break;

            }//switch
        } //metodo

    } //clase



    class principal
    {
        static void Main(string[] args)
        {
            arreglos a = new arreglos();
            a.menu();





        }
    }
}



saludos


25-Aug-2015 11:01
Invitado (Caranim)

Antes de nada me voy a permitir la licencia de aconsejarte el uso de nombres de variables un poco más "autoexplicativo": Si un objeto es de tipo "menu", siempre es mejor que la variable se llame "menú", a qué se llame "a". Mucho más sencillo para entender el programa; tanto para otros como para ti mismo si dentro de unos días tienes que revisar el código.

Lo primero que veo es que cada vez qué entras a "menú()" creas una instancia nueva de "b", por lo cual se pierde el objeto "b" anterior que era donde guardabas los datos. También creas un nuevo "a" cada vez que entras al menú y no es necesario.

En la clase arreglos modifica la declaración de "listasueldos"  y añade un constructor que se encargue de crear el array. Así solo se crea una vez y no se pierden los datos de los sueldos.


 ArrayList listasueldos;        
        public arreglos()
        {
            listasueldos = new ArrayList();
        }


En el proceso menú() de la clase "arreglos" elimina las líneas donde creas las nuevas instancias tanto de "a" como de "b".

Ahora tendrás errores porqué ya no tienes definidas, dentro de tu clase, ni "a" ni "b", pero es que realmente no las necesitas para nada. En todo caso podrías usar "this", porqué realmente tratas de invocar un proceso que está dentro del mismo objeto que lo llama.

Resumiendo: Elimina todos los "a." y "b." que tienes dentro del código de la clase "arreglo" de manera que llames al proceso directamente:
mostrar() en vez de b.mostrar(), ordenar() en vez de b.ordenar()...

Con esto te debería de funcionar.

Eso sí, a mi me parecería más lógico que la clase se encargase únicamente de "sus labores": Mantener el array. Mostrar el menú, los mensajes de pantalla e incluso la captura de datos del usuario no creo que deban de ser tareas de la clase.

Espero que te sirva de ayuda y haberme explicado de manera comprensible. Cualquier cosa que me haya quedado difícil de entender no dudes en preguntar.

Un saludo.

Caranim


25-Aug-2015 18:30
Invitado (JCamaleon)

hola, muy agradecido estoy por tu respuesta y el tiempo empleado en la misma, ahora ya se guardan los datos en la lista.

respondiendo a las observaciones realizadas, te comento que el programa es simplemente para demostrar el uso de ArrayList, por ello no está diseñado de la mejor manera conveniente, pero aún así me son de gran ayuda dichos comentarios, en mis inicios como estudiante de programación.

paso a comentar los cambios realizados.

en realidad el problema estaba, como bien lo indicaste,  en la creación del objeto "b", cada vez que se ingresaba al método menú().
a decir verdad, tengo que reconocer que ignoraba que "b" guardaba información, pues creía que solo se utilizaba para llamar al método en cuestión.

también desconocía que se podía llamar al processo solo con escribir su nombre (mostrar();), sin necesidad de utilizar objetos (b.mostrar). ignoro que son "this", ya me tocará investigar al respecto.

por cierto, el objeto "a" no fue posible prescindir de él, pues al momento de llamar al método menú() desde la clase principal, me arroja en error que dicho nombre no existe definido. supongo, por estar llamándole desde otra clase en la que no se encuentra el mismo.

aún sin crear un constructor al momento de definir el ArrayList, el programa es funcional, pero de todos modos lo implementé, tal como me indicaste.

un error que vengo arrastrando desde que creé el programa, es al momento de modificar un dato del array, pues al ingresar el nuevo valor, se detiene el programa y me arroja:
"
No se controló InvalidCastException
La conversión especificada no es válida.
Asegúrese de que el tipo de origen se puede convertir en el tipo de destino.
"

pero es algo que me tocará revisar, al fin de cuentas hace referencia al tipo de datos utilizados.

nuevamente, muchas muchas gracias por tu tiempo para responder, en verdad ya avía invertido muchas muchas horas en buscar la solución, hasta que decidí acudir a un foro.
mil disculpas si no me expreso de la mejor manera posible, utilizando conceptos correctos, es debido a que recién comienzo en esto.

gracias y un abrazo a la distancia!
saludos desde México


26-Aug-2015 10:22
Invitado (Caranim)


ignoro que son "this"

Échale un vistazo a este enlace:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=755


" el objeto "a" no fue posible prescindir de él, pues al momento de llamar al método menú() desde la clase principal,"

Tienes toda la razón: Error mío. Esa la tienes que dejar porqué en este caso no intentas llamar al proceso "menú()" desde el mismo objeto, sino desde fuera del mismo. Elimina todos los demás y deja ese y te funcionará.


"al momento de modificar un dato del array, pues al ingresar el nuevo valor, se detiene el programa "

En el proceso "modificar()", el valor nuevo lo capturas en una variable ( "d") de tipo entero. Por lo tanto el valor que se guarde en el array será de ese tipo.

En el proceso "mostrar()" tienes este bucle:

foreach ( double i in listasueldos)

Al tratar de mostrar el valor que has modificado da error porqué has guardado un entero, pero en el bucle señalas que "i" es de tipo double. Posiblemente lo más sencillo sea que en "modificar()" declares la variable "d" de tipo double y ya funciona.

Un saludo.

Caranim.


26-Aug-2015 18:29
Invitado (JCamaleon)

Muchas gracias nuevamente, así solucioné lo del nuevo error, definiendo la variable como double, desde el día de ayer.

en verdad muchas gracias por todo...

un gran abrazo!






(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.)