Incorrect visualization of items in POO code in C#

Asked

Viewed 52 times

1

My code it needs to receive the values of three books that are code, title, author, publisher and value. Only that the view is confused.

The impression that

nome do livro 0: q // Devia mostrar livro 1 Digite o autor do livro 0:
w // Devia mostrar livro 1 Digite a editora do livro 0: e // Devia
mostrar livro 1 Digite o valor do livro 0: 12.12 // Devia mostrar
livro 1

Digite o código do livro 0: 89 // Devia mostrar livro 2 Digite o nome
do livro 0: a // Devia mostrar livro 2 Digite o autor do livro 0: s //
Devia mostrar livro 2 Digite a editora do livro 0: // Devia mostrar
livro 2 Digite o valor do livro 0: 34.67 // Devia mostrar livro 2

Digite o código do livro 0: 98 // Devia mostrar livro 3 Digite o nome
do livro 0: t // Devia mostrar livro 3 Digite o autor do livro 0: y //
Devia mostrar livro 3 Digite a editora do livro 0: h // Devia mostrar
livro 3 Digite o valor do livro 0: 32.54 // Devia mostrar livro 3

Novo interessado Novo interessado Novo interessado

76 q w e 1212 1 // Devia mostra o index do primeiro livro

89 a s d 3467 1 // Devia mostra o index do segundo livro

98 t y h 3254 1 // Devia mostra o index do terceiro livro

The desired impression

Digite o código do livro 1: 76 Digite o nome do livro 1: q Digite o autor do livro 1: w Digite a editora do
livro 1: e Digite o valor do livro 1: 12.12

Digite o código do livro 2: 89 Digite o nome do livro 2: a Digite o
autor do livro 2: s Digite a editora do livro 2: d Digite o valor do
livro 2: 34.67

Digite o código do livro 3: 98 Digite o nome do livro 3: t Digite o
autor do livro 3: y Digite a editora do livro 3: h Digite o valor do
livro 3: 32.54

Novo interessado Novo interessado Novo interessado

76 q w e 1212 1 // Livro1

89 a s d 3467 2 // Livro 2

98 t y h 3254 3 // Livro3
using System;

namespace POO1
{
    public class Livro
    {
        public int codigo;
        public string autor;
        public string titulo;
        public string editora;
        public double valor;
        public int interessados;

        public void NovoInteressado()
        {
            Console.WriteLine("Novo interessado");
            interessados++;
        }

        public void ImprimirDadosLivro()
        {
            Console.WriteLine();
            Console.WriteLine(codigo);
            Console.WriteLine(titulo);
            Console.WriteLine(autor);
            Console.WriteLine(editora);
            Console.WriteLine(valor);
            Console.WriteLine(interessados);
        }

        public class AppLivro
        {
            static int Main(string[] args)
            {
                Livro livro1 = new Livro();
                Livro livro2 = new Livro();
                Livro livro3 = new Livro();

                Console.Write($"Digite o código do livro {livro1.interessados}: ");
                livro1.codigo = Convert.ToInt32(Console.ReadLine());
                Console.Write($"Digite o nome do livro {livro1.interessados}: ");
                livro1.titulo = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite o autor do livro {livro1.interessados}: ");
                livro1.autor = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite a editora do livro {livro1.interessados}: ");
                livro1.editora = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite o valor do livro {livro1.interessados}: ");
                livro1.valor = double.Parse(Console.ReadLine());

                Console.WriteLine();

                Console.Write($"Digite o código do livro {livro2.interessados}: ");
                livro2.codigo = Convert.ToInt32(Console.ReadLine());
                Console.Write($"Digite o nome do livro {livro2.interessados}: ");
                livro2.titulo = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite o autor do livro {livro2.interessados}: ");
                livro2.autor = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite a editora do livro {livro2.interessados}: ");
                livro2.editora = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite o valor do livro {livro2.interessados}: ");
                livro2.valor = double.Parse(Console.ReadLine());

                Console.WriteLine();

                Console.Write($"Digite o código do livro {livro3.interessados}: ");
                livro3.codigo = Convert.ToInt32(Console.ReadLine());
                Console.Write($"Digite o nome do livro {livro3.interessados}: ");
                livro3.titulo = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite o autor do livro {livro3.interessados}: ");
                livro3.autor = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite a editora do livro {livro3.interessados}: ");
                livro3.editora = Convert.ToString(Console.ReadLine());
                Console.Write($"Digite o valor do livro {livro3.interessados}: ");
                livro3.valor = double.Parse(Console.ReadLine());

                Console.WriteLine();

                livro1.NovoInteressado();
                livro2.NovoInteressado();
                livro3.NovoInteressado();

                livro1.ImprimirDadosLivro();
                livro2.ImprimirDadosLivro();
                livro3.ImprimirDadosLivro();
                Console.ReadKey();
                return 0;
            }
        }
    }
}

1 answer

1


The code has several problems, especially if you are looking to learn about object orientation. This code mixes responsibilities (printing and controlling data, maybe even something else) and initializes an invalid state object. Note that I changed the code a lot, some things just to be more organized and with more modern style of how to write C#.

Fixed the error of trying to convert things that might give error and break the application. The ideal is to treat the error in a more sophisticated way, but I did just close the application, can better this. I took conversion that doesn’t make any sense, doesn’t convert a guy to himself.

I also switched the type of value that is unsuitable for monetary values.

Do not fix small logic errors that do not cause major difficulties.

Another great improvement was to eliminate code repetition, or if you make a loop or a function that handles it, I preferred a function, but if you want to switch to a loop, it’s easy.

The mistake you’re making is that you’re printing information that has nothing to do with the description. If you want to print the number of the book you are entering then this control has to be done in this logic and not in the object. The description is quite clear that you want an entry order and not the amount of interested in that book. I changed it, but it’s not the ideal way, it seems to me that to say which is the order and it doesn’t make sense there, asks for the data of the book and good, but I solved what I wanted. Of course the message could be different, but I can’t guess if that’s the case.

This idea of interested is not clear to me, if it is what I am thinking then the logic is inadequate, registering a book is one thing, having one interested in it is something else. But it can be so many other things, because it doesn’t have a definition of what that means and code doesn’t make it clear either, I would have to speculate a lot, but in any case it seems something wrong.

So I couldn’t solve the other issue of printing, Is this a code? Is it the order? If it’s the order where it’s stored? You cannot print something that is not stored anywhere. You are having the amount of interested people printed, so you are right. If you don’t do what you expect, then the concept is confused. With the wrong concept the code will always be wrong, First conceitue right and then have a proper solution. In what was posted can only solve this part.

using static System.Console;

namespace POO1 {
    public class AppLivro {
        static int Main(string[] args) {
            var livro1 = new Livro();
            if (!PegaDados(livro1, 1)) return 1;
            var livro2 = new Livro();
            if (!PegaDados(livro2, 2)) return 1;
            var livro3 = new Livro();
            if (!PegaDados(livro3, 3)) return 1;
            livro1.NovoInteressado();
            livro2.NovoInteressado();
            livro3.NovoInteressado();
            livro1.Imprimir();
            livro2.Imprimir();
            livro3.Imprimir();
            return 0;
        }
        private static bool PegaDados(Livro livro, int ordem) {
            Write($"Digite o código do livro {ordem}: ");
            if (!int.TryParse(ReadLine(), out livro.codigo)) return false;
            Write($"Digite o nome do livro {ordem}: ");
            livro.titulo = ReadLine();
            Write($"Digite o autor do livro {ordem}: ");
            livro.autor = ReadLine();
            Write($"Digite a editora do livro {ordem}: ");
            livro.editora = ReadLine();
            Write($"Digite o valor do livro {ordem}: ");
            if (!decimal.TryParse(ReadLine(), out livro.valor)) return false;
            WriteLine();
            return true;
        }
    }
    public class Livro {
        public int codigo;
        public string autor;
        public string titulo;
        public string editora;
        public decimal valor;
        public int interessados;
        public void NovoInteressado() {
            WriteLine("Novo interessado");
            interessados++;
        }
        public void Imprimir() {
            WriteLine();
            WriteLine(codigo);
            WriteLine(titulo);
            WriteLine(autor);
            WriteLine(editora);
            WriteLine(valor);
            WriteLine(interessados);
        }
    }
}

Behold working in the ideone. And in the .NET Fiddle. Also put on the Github for future reference.

  • Thanks for the explanation.

  • What means the lines if (!int.TryParse(ReadLine(), out livro.codigo)) return false; and if (!PegaDados(livro1, 1)) return 1;?

  • I know there are others like it, but explaining these similar ones are automatically explained as well

  • using static System.Console; it dispenses with the need to qualify access with type name?

  • See https://answall.com/q/16089/101 and https://answall.com/q/135423/101. Almost everything you want to know already has on the site, just search, what you don’t have open a new question and we answered.

  • what the line private static bool PegaDados(Livro livro, int ordem) means?

  • 1

    I didn’t know you had trouble with such basic things, it would be better to study every detail. I thought because I wanted to do something object-oriented that is something advanced indicated that I already knew the basics, but now I see that the foundation is still missing. Start doing more basic things, learn one thing at a time, and forget OOP, it will only hinder your evolution. Once you’ve mastered the basics, you’ll be able to move on to something more sophisticated. If skipping steps like you were doing won’t learn anything right, you’ll only decorate cake recipes without understanding what’s going on.

Show 2 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.