Java - Tienda de Electrodomesticos

 
Vista:
Imágen de perfil de Geraldine
Val: 53
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tienda de Electrodomesticos

Publicado por Geraldine (25 intervenciones) el 30/11/2018 21:50:18
Que tal compañeros? Necesito ayuda con un error que me da el siguiente ejercicio...

Crear un proyecto en NetBean en cual en un paquete llamado Tienda defina las siguientes clases:

a) Clase Electrodoméstico: tendrá como atributo protegidos el precio base, el consumo eléctrico (que será un entero entre 1 y 4) y el peso. Tendrá un constructor que recibirá el valor de todos los atributos y dos métodos abstractos mostrar y precio final, este ultimo será ejecutado cuando se ejecute el método mostrar. Al momento de calcular el precio final el precio base se incrementara tomando en cuenta el consumo energético y el peso del electrodoméstico de acuerdo a las siguientes tablas:

https://ibb.co/smf7p6P

b) Clase Lavadora que deriva de Electrodoméstico: tendrá como atributo privado la carga de la Lavadora (este tendrá como valor mínimo 5 kg en caso de que la carga indicada sea menor que 5 kg). El constructor recibirá todos los atributos de la lavadora. Cuando se calcule el precio final si la carga es mayor a los 30 kg se aumentara el precio final en 50$, de no ser así no habrá ningún incremento.

c) Clase Televisor que deriva de Electrodoméstico: tendrá como atributo privado tamaño (de la pantalla en pulgadas), el constructor recibirá todos los valores del televisor. Al momento del calcular el precio final si el televisor tiene más de 40 pulgadas se incrementara el precio final en un 30%. d) Clase Principal: se definirán las variables requeridas y un ArrayList del tipo de la clase Electrodoméstico, y usaremos el siguiente menú de opciones para manejar el proyecto:
Menú
1._ Leer archivo Tienda
2._ Mostrar electrodomésticos.
3._ Terminar.

>La opción 1: leerá el contenido del archivo Tienda.txt y lo almacenara en un ArrayList del tipo Electrodoméstico.
>La opción 2: recorrerá el ArrayList y mostrara los datos del electrodoméstico dependiendo el electrodoméstico se indicar si es un Televisor o una Lavadora.
>La opcion3: terminara la aplicación.

Clase Electrodomesticos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package Tienda;
 
public abstract class Electrodomesticos {
    //Atributos:
    protected double precioBase;
    protected int consumoElectrico;
    protected int peso;
 
    //Constructor:
    public Electrodomesticos(double pre, int consu, int pe) {
        precioBase = pre;
        consumoElectrico = consu;
        peso = pe;
    }
    //Declaramos los metodos get:
    public double getPrecioBase() {
        return precioBase;
    }
 
    public int getConsumoElectrico() {
        return consumoElectrico;
    }
 
    public int getPeso() {
        return peso;
    }
    //calcular pago:
    public double precioFinal(){
        //Variables:
        double monto = 0;
        //Creamos un switch para que determine el tipo de consumo electrico 
        //(si es tipo 1 al monto se le suma 100, si es tipo 4 se le suma 50):
        switch (consumoElectrico) {
            case 1:
                monto += 100;
                break;
            case 2:
                monto += 80;
                break;
            case 3:
                monto += 60;
                break;
            case 4:
                monto += 50;
                break;
        }
        //Creamos el metodo if, el cual permitira que identifiquemos que digitos
        //son de "Peso". Ademas, con el if calcularemos el monto del peso segun 
        //la tabla "Peso del aparato"
        if (peso >= 0 && peso <= 19) {
            monto += 10;
        } else if (peso == 20 && peso <= 49) {
            monto += 50;
        } else if (peso == 50 && peso <= 79) {
            monto += 80;
        }else if (peso > 79) {
            monto += 100;
        }
        //Creamos un return, donde regresara el valor del precio base y lo sumara
        //con el monto calculado de acuerdo a lo establecido en el ejercicio.
        return precioBase + monto;
    }
    //Mostramos los datos a recibir:
    public abstract void mostrar();
}

Clase Lavadora
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package Tienda;
 
public class Lavadora extends Electrodomesticos{
    //Atributos:
    private int cargaLavadora = 5;
 
    //Constructor:
    public Lavadora(int carLavadora, double pre, int consu, int pe) {
        super(pre, consu, pe);
        cargaLavadora = carLavadora;
    }
    //Metodo que muestre los datos:
    public void mostrar(){
        System.out.println("-------------------------------------");
        System.out.println("Tipo de Electrodomestico (1:Lavadora)");
        System.out.println("Precio Base: " + getPrecioBase());
        System.out.println("Consumo Electrico: " + getConsumoElectrico());
        System.out.println("Peso: " + getPeso() + "Kg");
        System.out.println("Carga: " + cargaLavadora + "Kg");
        System.out.println("Precio final: " + precioFinal() + " Bs.S");
        System.out.println();
    }
    //calcular pago:
    public double precioFinal(){
        //Variables: Invocamos el método precioFinal de la calse Electrodomestico
        double monto = super.precioFinal();
        //Creamos el condicional if:
        if (cargaLavadora > 30 ) {
            monto += 50;
        }
        return monto;
    }
}

Clase Televisor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package Tienda;
 
public class Televisor extends Electrodomesticos {
    //Atributos:
    private int tamañoPantalla;
 
    //Contructor:
    public Televisor(int tam, double pre, int consu, int pe) {
        super(pre, consu, pe);
        tamañoPantalla = tam;
    }
    //Metodo que muestre los datos:
    public void mostrar(){
        System.out.println("-------------------------------------");
        System.out.println("Tipo de Electrodomestico (2:Televisor)");
        System.out.println("Precio Base: " + getPrecioBase());
        System.out.println("Consumo Electrico: " + getConsumoElectrico());
        System.out.println("Peso: " + getPeso() + "Kg");
        System.out.println("Tamaño: " + tamañoPantalla + " Pulgadas");
        System.out.println("Precio final: " + precioFinal() + " Bs.S");
        System.out.println();
    }
 
    public double precioFinal(){
        //Variables: Invocamos el método precioFinal de la calse Electrodomestico
        double monto = super.precioFinal();
        //Condicional if:
        if (tamañoPantalla >= 40 ) {
            monto += precioBase*0.3;
        }
        return monto;
    }
}

Clase Apoyo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package Tienda;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
 
public class Apoyo {
 
    public static int tamArchivo(ArrayList<Electrodomesticos> elec) throws IOException{
        //Instanciamos;
        Scanner sc = new Scanner(new File("Tienda.txt"));
        //Variables:
        String arch;
        int cantArch = 0;
       //Metodo while:
        while (sc.hasNextLine()) {
            arch = sc.nextLine();
            cantArch++;
        }
        return cantArch;
    }
 
    public static void leerArchivo(ArrayList<Electrodomesticos> elec)throws IOException{
        //Instanciamos:
        Scanner sc = new Scanner(new File("Tienda.txt"));
        Electrodomesticos electrodomestico = null;
        int t;
        //Metodo while:
        while (sc.hasNextLine()) {
            t = sc.nextInt();
            //Creamos el condicional if:
            if (t == 1) {
                electrodomestico = new Lavadora(sc.nextInt(), sc.nextDouble(), sc.nextInt(), sc.nextInt());
            } else if (t == 2) {
                electrodomestico = new Televisor(sc.nextInt(), sc.nextDouble(), sc.nextInt(), sc.nextInt());
            }
            elec.add(electrodomestico);
        }
        sc.close();
    }
 
    public static void mostrar(ArrayList<Electrodomesticos> elec){
        //Creamos el ciclo for:
        for (int i = 0; i < elec.size(); i++) {
            elec.get(i).mostrar();
        }
    }
    //Creamos el menu de inicio:
    public static int menu() {
        int opc = 0;
        Scanner teclado = new Scanner(System.in);
        System.out.println("Menu");
        System.out.println("1-Leer archivo Tienda");
        System.out.println("2-Mostrar Electrodomesticos");
        System.out.println("3-Terminar");
        System.out.print("Escoja una opcion: ");
        opc = teclado.nextInt();
        System.out.println("");
        return opc;
    }
 
}

Clase Principal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package Tienda;
import java.io.IOException;
import java.util.*;
 
public class Principal {
 
    public static void main(String[] args) throws IOException{
        //Creamos una nueva lista:
        ArrayList<Electrodomesticos> electrodomestic = new ArrayList<>(0);
        //Variables:
        int opc = 0, tam = 0;
        tam = Apoyo.tamArchivo(electrodomestic);
        //Metodo while:
        while(opc != 3) {
            opc = Apoyo.menu();
 
            switch(opc) {
                case 1:
                    Apoyo.leerArchivo(electrodomestic);
                    break;
 
                case 2:
                    Apoyo.mostrar(electrodomestic);
                    break;
            }
        }
    }
}

El problema que noto en mi código es que al leer el archivo de texto Tienda, al mostrar los resultados el programa identifica mal el Precio Base, el Consumo Energético y la Carga/Tamaño.

Por ejemplo, el Precio Base debería ser 100, el Consumo Energético ser tipo 2 y la Carga ser 150. Ademas, sospecho que el precio final no es el correcto.
https://ibb.co/rQSCkhK

Les dejo el archivo en Java con el texto. Si pueden decirme en que me estoy equivocando se los agradecería full.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tienda de Electrodomesticos

Publicado por Kabuto (1381 intervenciones) el 03/12/2018 15:00:32
Hola, el problema está en que el orden que tienen los datos en cada linea del archivo de texto, no coincide con el orden de los datos en los constructores de los electrodomésticos.

Así que, o cambias los constructores, o cambias el orden en que proporcionas los datos a los constructores.
Si quisieras hacer esto último, no podrías hacerlo debido a la forma en que estás leyendos los datos:

1
2
3
4
5
6
if (t == 1) {
	electrodomestico = new Lavadora(sc.nextInt(), sc.nextDouble(), sc.nextInt(), sc.nextInt());
} else if (t == 2) {
	electrodomestico = new Televisor(sc.nextInt(), sc.nextDouble(), sc.nextInt(), sc.nextInt());
}
elec.add(electrodomestico);

Como vas leyendo dato a dato, (siguiente a siguiente..) y los pasas directamente al constructor, no puedes alterar el orden en que entregas los datos.
A no ser que hagas una lectura distintas de los datos.
Puedes leer la linea entera, y con el metodo split() generar un array de String[] con los 5 datos que contiene la linea.

Al tener ya los 5 datos en el array, ahora si puedes pasarlos en el orden que quieras, parseandolo a int o a double segun corresponda:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while (sc.hasNextLine()) {
	/*
	t = sc.nextInt();
	//Creamos el condicional if:
	if (t == 1) {
		electrodomestico = new Lavadora(sc.nextInt(), sc.nextDouble(), sc.nextInt(), sc.nextInt());
	} else if (t == 2) {
		electrodomestico = new Televisor(sc.nextInt(), sc.nextDouble(), sc.nextInt(), sc.nextInt());
	}
	elec.add(electrodomestico);
	*/
	String[] datos = sc.nextLine().split(" ");
	if (datos[0].equals("1")) {
		electrodomestico = new Lavadora(Integer.parseInt(datos[3]), Double.parseDouble(datos[1]), Integer.parseInt(datos[2]), Integer.parseInt(datos[4]));
	} else if (datos[0].equals("2")) {
		electrodomestico = new Televisor(Integer.parseInt(datos[3]), Double.parseDouble(datos[1]), Integer.parseInt(datos[2]), Integer.parseInt(datos[4]));
	}
	elec.add(electrodomestico);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Geraldine
Val: 53
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tienda de Electrodomesticos

Publicado por Geraldine (25 intervenciones) el 05/12/2018 00:10:24
KABUTOOOOOOO TE AMOOOOOOO!!!! Eres el mejor viejo, ahora si me corre bien el programa

Ahora ya se por que no funcionaba "bien" en un principio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar