Java - Calcular los descuentos sobre las venta

 
Vista:

Calcular los descuentos sobre las venta

Publicado por Juan (24 intervenciones) el 17/09/2020 21:57:16
Saludos a todos. Escribo rogando su ayuda para la resolución del enunciado que adjunto. Necesito sus opiniones y criticas. Desde ya muy agradecido.


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
/*Calcular los descuentos sobre las ventas.
Los primeros Gs. 50.000 no tienen descuento,
los siguientes 30.000 tienen
un 10% de descuento; y el resto,
el 20% de descuento (eje:  si el monto es 120.000
el descuento sera 11.000).
Hacer un
proceso que permita ingresar:
*Nro. de factura (Enter p/ fin)
*Monto
 */
 
 
 
 
import java.util.Scanner;
 
 
public class Discount {
 
 
    public static void main(String[] args) {
 
        int Monto =0;
        int Descuento =0;
        int NroFactura=9999999;
 
         Scanner sc = new Scanner(System.in);
 
 
        while (NroFactura > 0) {
          System.out.println("Ingrese Monto");
          Monto = sc.nextInt();
          switch (Descuento)
          {
              case 1: if (Monto == 50000) ;
                 Descuento = Monto *0;
                 System.out.println("No posee descuento");
 
          }
 
 
        }
    }
 
}
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

Calcular los descuentos sobre las venta

Publicado por Kabuto (1382 intervenciones) el 18/09/2020 01:34:57
Que bien, por fin alguien que aporta un código empezado por él mismo.
Alguien que al menos lo intenta, aunque no le salga ni esté acertando en la forma de conseguirlo.
Pero lo importante es intentarlo y equivocarse, no hay otra forma de aprender.

Primero te voy a comentar fallos que veo en tu código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) {
 
int Monto =0;
int Descuento =0;
int NroFactura=9999999; //Numero de factura sería mejor leerlo en un String
 
Scanner sc = new Scanner(System.in);
 
 
while (NroFactura > 0) { //Este bucle será infinito, porque no estás pidiendo numero de factura al usuario
System.out.println("Ingrese Monto");
Monto = sc.nextInt(); //Pides el monto...
switch (Descuento) //pero analizas el descuento con switch.
// En todo caso has de analizar monto, para CALCULAR descuento
{
//¿case 1? Un switch no es para "enumerar" posibles casos,
//es para analizar el valor de la variable que recibe el switch
case 1: if (Monto == 50000) ; //¿Y si el monto es 50001, o 49999, o 45000,.. ¿que ocurre con las otras 49999 posibilidades entre 0 y 50000
Descuento = Monto *0;
System.out.println("No posee descuento");

Esos son los fallos que veo. Espero haberte sabido explicar el motivo. Si no terminas de entenderlo vuelve a preguntarlos por favor.

A continuación te voy a indicar como lo resolvería yo.
La factura la pido con un String. Cuando con un dato no vamos a hacer operaciones aritméticas, mejor pedirla con String aunque tenga números, ya sea un teléfono, un código postal, etc...

Y el bucle hago que se repita mientras que el usuario NO teclee la palabra fin.
Si teclea fin, lanzo mensaje de despedida del programa y el bucle termina. Se acabó.

Si no teclea fin, entonces paso a pedir el monto.
En este caso no nos conviene usar switch, porque con switch solo podemos preguntar por valores concretos.
Yo no necesito saber si el monto es EXACTAMENTE el valor 50000.
Lo que necesito saber es por ejemplo si es mayor que 50000, y para esto no me sirve el switch

Hay que usar IF para poder usar condicionales más amplios.

Entonces, si el monto es menor o igual que 50000, no hago nada, el descuento conserva su valor inicial que es 0.
Así que ni siquiera voy a preguntar por esta posibilidad.

Directamente voy a preguntar si el monto es mayor que 50000, es entonces cuando voy a tener que calcular descuentos.

Bien, si es mayor que 50000...
Sabemos que los primeros 50000, NO tienen descuento. Así que esos 50000, los resto del monto actual.
Para no perder el valor del monto durante el programa, hago una copia y trabajo con ella.

Bien, pues resto 50000 y ahora me queda cierta cantidad.

Si esta cantidad es menor o igual que 30000, solo se aplica el 10% sobre esta cantidad, así que es el descuento a calcular y ya he terminado

Pero, si esa cantidad es mayor de 30000, también se aplicará el 20% a la cantidad que supera esos 30000.
Así que en este caso, el descuento va a tener seguro el 10% de 30000 y es lo primero que calculo.
Luego resto al monto, esos 30000 de los que ya he obtenido su 10%

Y ahora de nuevo me queda otra cierta cantidad restante. Para esta cantidad, ya me es indiferente a cuánto asciende, simplemente he de obtener su 20% y sumarlo al 10% de los 30000 que he calculado previamente.

Y ya está, ya he calculado los descuentos para todos los casos posibles. Solo queda mostrar resultado en pantalla y pasar a pedir una nueva factura.

Te dejo el código, con multitud de comentarios explicando cada línea. Creo que se entiende bastante bien:

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
public class Discount {
 
	public static void main(String[] args) {
 
		Scanner teclado = new Scanner(System.in);
		String numFactura ="";
 
		while (!numFactura.equals("fin")) {
			//Inicializamos variables monto y descuento
			int monto = 0, descuento = 0;
			//Pedimos nº factura
			System.out.print("\nNum. Factura (teclee fin para terminar): ");
			numFactura = teclado.nextLine();
			if (numFactura.equals("fin")) //Fin de programa, no hay que hacer nada
				System.out.println("\nFIN DE PROGRAMA");
			else {
				//Pedimos el monto
				System.out.print("Monto: ");
				monto = Integer.parseInt(teclado.nextLine());
				//Para averiguar descuentos modificaré el valor del monto, así que hago copia
				int montoCop = monto;
				//Analizamos el monto
				if (montoCop > 50000) {
					//Restamos los 50000 que carecen de descuento
					montoCop -= 50000;
					//Comprobamos si nos quedan más o menos de 30000
					if (montoCop <= 30000) {
						//Quedan 30000 o menos, solo se aplica el 10% del monto que queda
						descuento = montoCop * 10  / 100;
					}
					else { //Quedan más de 30000..
						//El descuento seá el 10% de 30000 más
						//el 20% de la cantidad restante al quitar los 30000
						descuento = 30000 * 10 / 100; //10% de 30000
						montoCop -= 30000; //Quito los 30000 que ya he calculado su 10%
						descuento += montoCop * 20 / 100;//Sumo al descuento el 20% del monto restante
					}
				}
				//Monto analizado y descuentos calculados, muestro resultados
				System.out.println("\nDatos de la factura: " + numFactura);
				System.out.println("Monto: " + monto);
				System.out.println("Descuento aplicable: " + descuento);
				System.out.println("TOTAL: " + (monto - descuento));
				System.out.println("\n\t\tPulse INTRO para seguir...");
			}
 
		}
 
		teclado.close();
	}
 
}


En pantalla, sale este resultado y parece funcionar correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
Num. Factura (teclee fin para terminar): FAC0001
Monto: 120000
 
Datos de la factura: FAC0001
Monto: 120000
Descuento aplicable: 11000
TOTAL: 109000
 
		Pulse INTRO para seguir...
 
Num. Factura (teclee fin para terminar): fin
 
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
Imágen de perfil de Sandro
Val: 392
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Calcular los descuentos sobre las venta

Publicado por Sandro (166 intervenciones) el 18/09/2020 02:20:28
hay algo además que dice en las instrucciones que es el porcentaje del 11%, pero no especificas en que cantidad entre que y que
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

Calcular los descuentos sobre las venta

Publicado por Juan (24 intervenciones) el 19/09/2020 18:53:11
Gracias por contestar mi solicitud de ayuda. No me proporcionaron un detalle sobre esa instrucción lastimosamente. Gracias. Éxitos.
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

Calcular los descuentos sobre las venta

Publicado por Juan (24 intervenciones) el 19/09/2020 18:51:43
Eternamente agradecido por su ayuda. ¿ Monto y Descuento es mejor definirlos como int? ¿no definirlos como double? Muchas Gracias.
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

Calcular los descuentos sobre las venta

Publicado por Kabuto (1382 intervenciones) el 19/09/2020 22:46:01
Hola Juan.

Primero.
Las clases de Java son muchas y muy extensas. Y no siempre te van a indicar TODOS los métodos de una clase, porque seguramente nadie se los sabe al 100%.
Y no se los sabe porque no es necesario. No es óptimo memorizarlas.

Lo óptimo, es saber buscar. Si algo bueno tiene Java, es su documentación disponible en la web de Oracle.

Basta con que en el buscador de Internet pongas por ejemplo: "java string class"
y los primeros resultados será la documentación de Oracle, donde puedes ver la Clase String al completo, todos sus métodos detallando que tipo de dato reciben, que proceso hacen y que tipo de dato retornan.

Está en inglés, pero no es difícil de entender y cuando veas un método que quizás pueda resolver lo que necesitas, vuelves a buscar ejemplos de su uso en Internet y encontrarás cientos de resultados en la web.


Segundo.
Monto y Descuento, sí, sería más correcto usar el tipo float, ya que las monedas son fraccionarias, no son valores enteros.
Sin embargo, lo importante es entender la lógica del proceso.
A veces es más cómodo resolver el problema directamente con int, y luego cuando ya funcione todo, pues ya sí pasarlo a float.

Más que nada, porque a veces con float podemos encontrarnos con alguna incomodidad.
Por ejemplo, al introducir el valor por teclado, según el idioma/región de tus sistema puede que la entrada falle si usas coma decimal en lugar del punto decimal, o viceversa.

Y luego, al mostrar resultados en pantalla, a veces pueden salir números decimales muy largos, tipo: 34.0000000123 que afean el resultado en pantalla.
Hay modos de formatear ese valor (método estático String.format()) para que solo salgan por ejemplo dos decimales.
Pero ya tienes que perder tiempo en esos detalles cuando deberías invertirlo en resolver primero la lógica del programa.

Por eso muchas veces, si es posible, vale la pena usar primero tipo int y ya luego cuando todo este funcionando y bien encarrilado, cambiar a float, o double, o lo que corresponda.
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

Agradecimiento

Publicado por Juan (24 intervenciones) el 20/09/2020 22:45:12
Eternamente agradecido por su respuesta. Éxitos. Salud.
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