Java - Ayuda examen en java (ciclos)

 
Vista:
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Camilo (6 intervenciones) el 07/05/2020 07:33:28
Hola, tengo un examen de java en el cual me evalúan ciclos y me piden plantear una solución. estoy confundido con el enunciado y no he logrado realizarlo, agradezco si alguien puede ayudarme.

IMG_20200507_002838
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-2
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

Ayuda examen en java (ciclos)

Publicado por Kabuto (1381 intervenciones) el 07/05/2020 14:47:50
Hola.

Hay que introducir una serie de ventas.
Por cada venta se pide:
nº vendedor,
tipo de pago,
importe de la venta.

Con esos tres datos, hay que calcular el importe final.
El importe final es el importe de la venta más DOS comisiones.
Una comisión es fija para todas las operaciones, la X.
La otra, depende del método de pago, se aplicará Y, Z o H.

Cuando se tenga este importe final, este importe lo acumulamos en una variable acumuladora que tiene cada mesero, según el nº de vendedor introducido.

Aumentar un contador que va a tener cada medio de pago, según el medio introducido.

Repetir este proceso dentro de un bucle, hasta que se introduzca -1 para nº de vendedor.

Cuando termina el bucle, se muestra el resumen de datos que se pide:
- Cuanto se paga a cada mesero
- Cuanto ha recaudado el restaurante (suma de lo acumulado por los 3 meseros)
- Cuál medio de pago ha sido el más usado.

Y eso es todo. Mira, si quieres, te dejo un "esqueleto" de como podría ser el programa, a mi entender claro.
Dejo ya definidas las principales variables que vas a necesitar. El valor de las comisiones no nos los indican, así que los inventamos.

En el main, pongo los pasos aproximados que habría que seguir. A ver si consigues completar tú el código, procurando usar métodos allá donde tengan sentido.

Inténtalo, lo consigas o no, muestra aquí lo que tengas y te ayudamos a completarlo.

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
public class Main {
 
	//Valores fijos de las Comisiones
	private static final float X = 4.5f; //..4.5% sobre la cuenta del cliente
	private static final float Y = 3.5f; //..3.5% si la venta es de contado
	private static final float Z = 2.5f; //..2.5% si la venta es con cheque
	private static final float H = 1.5f; //..1.5% si la venta es con T. credito
 
	//Recaudacion total por meseros
	private static float mesero1 = 0f, mesero2 = 0f, mesero3 = 0f;
 
	//Contadores de medios de pago
	private static int contado = 0, cheque = 0, tarjeta = 0;
 
	private static Scanner teclado = new Scanner(System.in);
 
	public static void main(String[] args) {
 
		//Iniciar bucle
 
		//Pedir nº vendedor
		//Pedir tipo de pago
		//Pedir valor de la cuenta
 
		//Calcular importe final según comisiones, se requiere:
			//Obtener porcentaje sobre la cuenta: comision X
			//Obtener porcentaje segun tipo pago: comision Y, Z o H
			//Sumar valor de cuenta + las dos comisiones calculadas
 
		//Acumular el importe final en el mesero correspondiente según nº vendedor
 
		//Incrementar el contador correspondiente del tipo de pago
 
		//Repetir bucle o finalizar si nº vendedor es -1
 
		//Mostrar en pantalla los datos:
			//Valor a pagar a cada mesero
			//Valor total recaudado (suma de lo acumulado por los 3 meseros)
			//Medio de pago más utilizado
 
		//FIN DE PROGRAMA
 
	}
 
}
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
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Camilo (6 intervenciones) el 07/05/2020 17:00:24
Hola Kabuto,

Gracias por tu ayuda, voy a intentarlo trabajar con la información que me das.
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
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Camilo (6 intervenciones) el 07/05/2020 18:00:22
Hola, tengo una duda el bucle ideal para la solcuión de ejercicio ¿sería el bucle mientras?
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
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Rodrigo (623 intervenciones) el 08/05/2020 00:17:55
Hay que mover parte de (o toda?) la logica a metodos, sino te va a faltar esto que te solicitan.
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
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

Ayuda examen en java (ciclos)

Publicado por Kabuto (1381 intervenciones) el 08/05/2020 18:43:37
Sí.
Siempre que un bucle se vaya a repetir una serie INDETERMINADA de veces, lo mejor es un while(), o do ..while()

El bucle for() es más adecuado cuando se va a repetir una serie DETERMINADA de veces.

En este ejercicio no sabemos cuántas veces se va a repetir, porque lo decidirá el usuario tecleando -1 para ponerle fin. Así que mejor un while(), o un do..while().

Recuerda lo que dice Rodrigo, hay que usar métodos, allá donde tenga sentido usarlos.

Por ejemplo un método llamado calcularImporteFinal(), que reciba como parámetros el importe de la venta y el tipo de pago (tu decides si leerlo como String, o como un int..), lo evalúe con un switch, decida que promoción hay que aplicar y que retorne el precio final, ya con las dos promociones aplicadas.

U otro que podría llamarse mostrarResumenDatos(), que se ejecute al final del programa, cuando el bucle haya terminado, y se encargue de mostrar en pantalla los datos finales.
Este método, puede valerse de otro método para determinar cuál ha sido el método de pago más utilizado, ya que tendrá que revisar los tres contadores y averiguar cuál tiene el valor mayor.
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
Imágen de perfil de Lisa
Val: 172
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Lisa (34 intervenciones) el 08/05/2020 02:31:51
Ha sido un problema algo largo, pero yo lo resuelvo así:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
/**
 *
 * @author Lisa C
 */
public class Restaurante {
 
    public static final double COMISION_CUENTA = 0.05;
    public static final double COMISION_CONTADO = 0.1;
    public static final double COMISION_CHEQUE = 0.08;
    public static final double COMISION_TARJETA_CREDITO = 0.02;
 
    /**
     * Redondea una variable Double a 2 decimales
     *
     * @param val
     * @return
     */
    public static Double redondear(Double val) {
        return new BigDecimal(val.toString()).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
    }
 
    public static void main(String[] args) {
 
        //TODO: Capturar los datos de las ventas
//        Venta[] ventas = {
//            new Venta(1, Venta.TIPO_PAGO_CHEQUE, 111.95),
//            new Venta(1, Venta.TIPO_PAGO_CONTADO, 10.95),
//            new Venta(1, Venta.TIPO_PAGO_TARJETA, 200.35),
//            new Venta(2, Venta.TIPO_PAGO_CHEQUE, 121.95),
//            new Venta(2, Venta.TIPO_PAGO_CONTADO, 5.95),
//            new Venta(2, Venta.TIPO_PAGO_TARJETA, 300.35),
//            new Venta(3, Venta.TIPO_PAGO_CHEQUE, 51.95),
//            new Venta(3, Venta.TIPO_PAGO_TARJETA, 35.95),
//            new Venta(3, Venta.TIPO_PAGO_CONTADO, 25.95),
//            new Venta(3, Venta.TIPO_PAGO_TARJETA, 150.35)
//        };
        List<Venta> ventas = new ArrayList();
        Scanner sc = new Scanner(System.in);
        int idVentdedor;
        do {
            System.out.print("Nueva venta\nIntroduzca el id del vendedor: ");
            idVentdedor = Integer.parseInt(sc.nextLine());
            if (idVentdedor >= 1 && idVentdedor <= 3) {
                System.out.print("Introduzca 1 para el tipo de pago Contado"
                        + "\nIntroduzca 2 para el tipo de pago Cheque"
                        + "\nIntroduzca 3 para el tipo de pago Tarjeta: ");
                String tipo = sc.nextLine();
                if (!tipo.equals("1") && !tipo.equals("2") && !tipo.equals("3")) {
                    System.out.println("Error de tipo de pago. Vuelva a intentar");
                } else {
                    System.out.print("Introduzca el valor de la cuenta: ");
                    double valorCuenta = Double.parseDouble(sc.nextLine());
                    tipo = tipo.equals("1") ? Venta.TIPO_PAGO_CONTADO : (tipo.equals("2") ? Venta.TIPO_PAGO_CHEQUE : Venta.TIPO_PAGO_TARJETA);
                    ventas.add(new Venta(idVentdedor, tipo, valorCuenta));
                }
            } else if (idVentdedor > 3) {
                System.out.println("id incorrecto");
            }
        } while (idVentdedor != -1);
 
        /**
         * Ahora vamos a realizar los cálculos
         */
        double comision_1 = 0;
        double comision_2 = 0;
        double comision_3 = 0;
        double total = 0;
        int contadorTipoCheque = 0;
        int contadorTipoContado = 0;
        int contadorTipoTarjeta = 0;
 
        double comision;
        for (Venta v : ventas) {
            total += v.getValorCuenta();
            comision = v.getValorCuenta() * COMISION_CUENTA;
            switch (v.getTipoPago()) {
                case Venta.TIPO_PAGO_CHEQUE:
                    comision += v.getValorCuenta() * COMISION_CHEQUE;
                    contadorTipoCheque++;
                    break;
                case Venta.TIPO_PAGO_CONTADO:
                    comision += v.getValorCuenta() * COMISION_CONTADO;
                    contadorTipoContado++;
                    break;
                case Venta.TIPO_PAGO_TARJETA:
                    comision += v.getValorCuenta() * COMISION_TARJETA_CREDITO;
                    contadorTipoTarjeta++;
                    break;
            }
 
            switch (v.getIdVendedor()) {
                case 1:
                    comision_1 += comision;
                    break;
                case 2:
                    comision_2 += comision;
                    break;
                case 3:
                    comision_3 += comision;
                    break;
            }
        }
 
        String medio;
        if (contadorTipoCheque > contadorTipoContado && contadorTipoCheque > contadorTipoTarjeta) {
            medio = "Cheque";
        } else if (contadorTipoContado > contadorTipoCheque && contadorTipoContado > contadorTipoTarjeta) {
            medio = "Contado";
        } else {
            medio = "Tarjeta";
        }
 
        System.out.println("\n\nValor a pagar al mesero 1: " + redondear(comision_1)
                + "\nValor a pagar al mesero 2: " + redondear(comision_2)
                + "\nValor a pagar al mesero 3: " + redondear(comision_3)
                + "\nTotal recaudado en el restaurante: " + redondear(total)
                + "\nMedio de pago mas utilizado fue: " + medio
        );
    }
}
 
class Venta {
 
    private final int idVendedor;
    private final String tipoPago;
    private final double valorCuenta;
 
    public static final String TIPO_PAGO_CONTADO = "Co";
    public static final String TIPO_PAGO_CHEQUE = "Ch";
    public static final String TIPO_PAGO_TARJETA = "Ta";
 
    public Venta(int idVendedor, String tipoPago, double valorCuenta) {
        this.idVendedor = idVendedor;
        this.tipoPago = tipoPago;
        this.valorCuenta = valorCuenta;
    }
 
    /**
     * @return the idVendedor
     */
    public int getIdVendedor() {
        return idVendedor;
    }
 
    /**
     * @return the tipoPago
     */
    public String getTipoPago() {
        return tipoPago;
    }
 
    /**
     * @return the valorCuenta
     */
    public double getValorCuenta() {
        return valorCuenta;
    }
}

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
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Camilo (6 intervenciones) el 08/05/2020 04:33:33
Hola, muchas gracias por tu ayuda!!!!
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
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Billy Joel (876 intervenciones) el 08/05/2020 18:22:21
Leyendo el enunciado, el problema es básicamente de acumulación, entonces es posible hacer los cálculos sin tener que almacenar las ventas en una lista:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
 
/**
 *
 * @author Lisa C
 */
public class Restaurante {
 
    public static final double COMISION_CUENTA = 0.05;
    public static final double COMISION_CONTADO = 0.1;
    public static final double COMISION_CHEQUE = 0.08;
    public static final double COMISION_TARJETA_CREDITO = 0.02;
    public static final String TIPO_PAGO_CONTADO = "Co";
    public static final String TIPO_PAGO_CHEQUE = "Ch";
    public static final String TIPO_PAGO_TARJETA = "Ta";
 
    /**
     * Redondea una variable Double a 2 decimales
     *
     * @param val
     * @return
     */
    public static Double redondear(Double val) {
        return new BigDecimal(val.toString()).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
    }
 
    public static void main(String[] args) {
        double comision_1 = 0;
        double comision_2 = 0;
        double comision_3 = 0;
        double total = 0;
        int contadorTipoCheque = 0;
        int contadorTipoContado = 0;
        int contadorTipoTarjeta = 0;
        double comision;
        Scanner sc = new Scanner(System.in);
        int idVentdedor;
        do {
            System.out.print("Nueva venta\nIntroduzca el id del vendedor: ");
            idVentdedor = Integer.parseInt(sc.nextLine());
            if (idVentdedor >= 1 && idVentdedor <= 3) {
                System.out.print("Introduzca 1 para el tipo de pago Contado"
                        + "\nIntroduzca 2 para el tipo de pago Cheque"
                        + "\nIntroduzca 3 para el tipo de pago Tarjeta: ");
                String tipo = sc.nextLine();
                if (!tipo.equals("1") && !tipo.equals("2") && !tipo.equals("3")) {
                    System.out.println("Error de tipo de pago. Vuelva a intentar");
                } else {
                    System.out.print("Introduzca el valor de la cuenta: ");
                    double valorCuenta = Double.parseDouble(sc.nextLine());
                    tipo = tipo.equals("1") ? TIPO_PAGO_CONTADO : (tipo.equals("2") ? TIPO_PAGO_CHEQUE : TIPO_PAGO_TARJETA);
                    //ventas.add(new Venta(idVentdedor, tipo, valorCuenta));
                    ///////////////////////////////////////////////////////
                    total += valorCuenta;
                    comision = valorCuenta * COMISION_CUENTA;
                    switch (tipo) {
                        case TIPO_PAGO_CHEQUE:
                            comision += valorCuenta * COMISION_CHEQUE;
                            contadorTipoCheque++;
                            break;
                        case TIPO_PAGO_CONTADO:
                            comision += valorCuenta * COMISION_CONTADO;
                            contadorTipoContado++;
                            break;
                        case TIPO_PAGO_TARJETA:
                            comision += valorCuenta * COMISION_TARJETA_CREDITO;
                            contadorTipoTarjeta++;
                            break;
                    }
 
                    switch (idVentdedor) {
                        case 1:
                            comision_1 += comision;
                            break;
                        case 2:
                            comision_2 += comision;
                            break;
                        case 3:
                            comision_3 += comision;
                            break;
                    }
                    ///////////////////////////////////////////////////////
                }
            } else if (idVentdedor > 3) {
                System.out.println("id incorrecto");
            }
        } while (idVentdedor != -1);
 
        String medio;
        if (contadorTipoCheque > contadorTipoContado && contadorTipoCheque > contadorTipoTarjeta) {
            medio = "Cheque";
        } else if (contadorTipoContado > contadorTipoCheque && contadorTipoContado > contadorTipoTarjeta) {
            medio = "Contado";
        } else {
            medio = "Tarjeta";
        }
 
        System.out.println("\n\nValor a pagar al mesero 1: " + redondear(comision_1)
                + "\nValor a pagar al mesero 2: " + redondear(comision_2)
                + "\nValor a pagar al mesero 3: " + redondear(comision_3)
                + "\nTotal recaudado en el restaurante: " + redondear(total)
                + "\nMedio de pago mas utilizado fue: " + medio
        );
    }
}

Se pueden hacer los calculos junto con las capturas de datos y así nos ahorramos unas cuantas líneas.
Ahora, si al final piden imprimir las ventas entonces si toca acumular los datos en alguna estructura como un List.

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Rodrigo (623 intervenciones) el 08/05/2020 18:50:18
Para ahorrar codigo hay q abusar del hecho que los tipos son numericos y usarlos como indices (restandole 1) y no usar variables sueltas, sino usar arreglos.
Los switch se pueden reducir a 1 linea asi.
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
sin imagen de perfil
Val: 96
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda examen en java (ciclos)

Publicado por Bruno (43 intervenciones) el 09/05/2020 19:03:14
Hola. Aquí colaboro conun código para que tengas otro punto de vista. Espero te sirva.
Saludos
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