1

Buenas noches gentes del buen saber:

Estoy buscando el error en este codigo:

class PruebaLibro
{               
    static void Main()
    {
        int opcion, paginas;
        int x = 0;
        string autor, titulo, ubica, procedencia;
        Documento[] Documentos = new Documento[1000];
        do
        {

            Console.WriteLine("MENU");
            Console.WriteLine("------------");
            Console.WriteLine("1.-Añadir un documento a la biblioteca");
            Console.WriteLine("2.-Ver los datos ya guardados");
            Console.WriteLine("3.- Salir");
            opcion = Convert.ToInt32(Console.ReadLine());

            switch (opcion)
            {
                case 1:
                    if (x < Documentos.Length)
                    {
                        Console.WriteLine("Que tipo de documento quieres guardar?");
                        Console.WriteLine("1.- Libro.");
                        Console.WriteLine("2.- Articulo.");
                        Console.WriteLine();
                        int op;
                        op = Convert.ToInt32(Console.ReadLine());
                        switch (op)
                        {
                            case 1:                                   
                                Console.WriteLine("Introduce el titulo: ");
                                titulo = Console.ReadLine();
                                Console.WriteLine("Introduce el autor: ");
                                autor = Console.ReadLine();
                                Console.WriteLine("Introduce su ubicacion: ");
                                ubica = Console.ReadLine();
                                Console.WriteLine("Introduce nº de paginas");
                                paginas = Convert.ToInt32(Console.ReadLine());                                    
                                Documentos[x] = new Libro();
                                Documentos[x].SetAutor(autor);
                                Documentos[x].SetTitulo(titulo);
                                Documentos[x].SetUbicacion(ubica);
                                Documentos[x].SetPaginas(paginas);
                                x++;
                                break;
                            case 2:                                   
                                Console.WriteLine("Introduce el autor: ");
                                autor = Console.ReadLine();
                                Console.WriteLine("Introduce el titulo articulo: ");
                                titulo = Console.ReadLine();
                                Console.WriteLine("Introduce ubicacion: ");
                                ubica = Console.ReadLine();
                                Console.WriteLine("Introduce la procedencia");
                                procedencia = Console.ReadLine();                                                                        
                                Documentos[x] = new Articulo();
                                Documentos[x].SetAutor(autor);
                                Documentos[x].SetTitulo(titulo);
                                Documentos[x].SetUbicacion(ubica);
                                Documentos[x].SetProcedencia(procedencia);
                                x++;

                                break;
                            default:
                                Console.WriteLine("No se reconoce opcion");
                                break;
                        }

                    }
                    else
                    {
                        Console.WriteLine("No se pueden añadir mas libros o articulos");
                    }
                    break;
                case 2:                                    

                    foreach(Documento documento in Documentos)
                    {
                        documento.MuestraDatos();
                    }
                    break;
                case 3:
                    Console.WriteLine("Saliendo");
                    break;
                default:
                    Console.WriteLine("No se reconoce tecla");
                    break;
            }

        } while (opcion != 3);
    }
}

El error reside en la zona del foreach que dice que no he instanciado la clase en cuestion, pero si que creo la instancia en cada pasada del do-while, alguien podria darme alguna idea de donde estoy metiendo la pata.

Un fuerte y caluroso saludo desde Murcia Isra

EDITO 1-- CLASE DOCUMENTO

public class Documento
{
    protected string autor;
    protected string titulo;
    protected string ubicacion;
    protected string procedencia;
    protected int paginas;
    public Documento()
    {            
    }
    public override string ToString()        
    {
        return titulo + "-" + autor + "-" + ubicacion; 

    }
    public void SetAutor(string nombreAutor)
    {
        autor = nombreAutor;
    }
    public void SetTitulo(string nombreLibro)
    {
        titulo = nombreLibro;
    }
    public void SetUbicacion(string donde)
    {
        ubicacion = donde;
    }
    public virtual void SetPaginas(int pag)
    {
        paginas = pag;
    }
    public virtual void SetProcedencia(string procede)
    {
        procedencia = procede;
    }

    public string GetAutor()
    {
        return autor;
    }

    public string GetTitulo()
    {
        return titulo;
    }
    public string GetUbicacion()
    {
        return ubicacion;
    }
    public virtual int GetPaginas()
    {
        return paginas;
    }
    public string GetProcedencia()
    {
        return procedencia;
    }

    public virtual void MuestraDatos()
    {
        Console.WriteLine("----------------------");
        Console.WriteLine("{0}", ToString());
    }
}

2 Answers2

0

Implementa esto en el foreach:

                    foreach (Documento documento in Documentos)
                    {
                        if (documento != null)
                            documento.MuestraDatos();
                        else
                            break;//implementa esto para que no te recorra las 1000 posiciones del arreglo en el caso de que hayan, por ejemplo, 300 registros
                    }

Espero te sirva!

Michael Ospina
  • 378
  • 1
  • 11
  • Sirvio, lo que no entiendo es por que recorre los 1000 documentos... Gracias a ambos por vuestro tiempo. – Israel miguel saura Jul 23 '18 at 19:38
  • @Israelmiguelsaura el tema es que tu instancias el arreglo documentos con un tamaño especifico y mientras lo vas llenando hay varios que se van quedando null. ya tendras que ver como replantear esa parte si lo ves necesario. Ahora, si quieres puedes mirar como implementar listas, que son un poco mas dinamicas. – Michael Ospina Jul 23 '18 at 19:40
0

Claro, se recomienda el uso de listas para estos casos, para implementarlo deberías cambiar algunas cosas, cosa que quedaría algo así

    static void Main()
    {
        int opcion, paginas;
        int x = 0;
        string autor, titulo, ubica, procedencia;
        List<Documento> lsDocumentos = new List<Documento>();
        var documento = new Documento();
        do
        {

            Console.WriteLine("MENU");
            Console.WriteLine("------------");
            Console.WriteLine("1.-Añadir un documento a la biblioteca");
            Console.WriteLine("2.-Ver los datos ya guardados");
            Console.WriteLine("3.- Salir");
            opcion = Convert.ToInt32(Console.ReadLine());

            switch (opcion)
            {
                case 1:
                    Console.WriteLine("Que tipo de documento quieres guardar?");
                    Console.WriteLine("1.- Libro.");
                    Console.WriteLine("2.- Articulo.");
                    Console.WriteLine();
                    int op;
                    op = Convert.ToInt32(Console.ReadLine());
                    switch (op)
                    {
                        case 1:
                            Console.WriteLine("Introduce el titulo: ");
                            titulo = Console.ReadLine();
                            Console.WriteLine("Introduce el autor: ");
                            autor = Console.ReadLine();
                            Console.WriteLine("Introduce su ubicacion: ");
                            ubica = Console.ReadLine();
                            Console.WriteLine("Introduce nº de paginas");
                            paginas = Convert.ToInt32(Console.ReadLine());
                            documento = new Libro();
                            documento.SetAutor(autor);
                            documento.SetTitulo(titulo);
                            documento.SetUbicacion(ubica);
                            documento.SetPaginas(paginas);
                            lsDocumentos.Add(documento);
                            break;
                        case 2:
                            Console.WriteLine("Introduce el autor: ");
                            autor = Console.ReadLine();
                            Console.WriteLine("Introduce el titulo articulo: ");
                            titulo = Console.ReadLine();
                            Console.WriteLine("Introduce ubicacion: ");
                            ubica = Console.ReadLine();
                            Console.WriteLine("Introduce la procedencia");
                            procedencia = Console.ReadLine();
                            documento = new Articulo();
                            documento.SetAutor(autor);
                            documento.SetTitulo(titulo);
                            documento.SetUbicacion(ubica);
                            documento.SetProcedencia(procedencia);                               
                            lsDocumentos.Add(documento);

                            break;
                        default:
                            Console.WriteLine("No se reconoce opcion");
                            break;
                    }

                    break;
                case 2:                      

                    foreach (Documento item in lsDocumentos)
                    {
                        item.MuestraDatos();
                    }
                    break;
                case 3:
                    Console.WriteLine("Saliendo");
                    break;
                default:
                    Console.WriteLine("No se reconoce tecla");
                    break;
            }

        } while (opcion != 3);
    }
Luciano Montañez
  • 2,426
  • 1
  • 7
  • 23