Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Valores int no suman correctamente.

Hola de nuevo,
Voy a pasar el domingo haciendo ejercicios sin salir de casa.

Ahora tengo el problema que tengo que sacar los siguientes datos:

Productos vendidos:
Ingresos:
Descuentos aplicados:

Sobre estos dos ultimos no creo que tenga problemas, sin embargo no es así en productos vendidos.

Si digo tres productos, necesito que siga el bucle for hasta el final, pero que lo descuente del numero de productos vendidos.

He querido hacerlo así:

He añadido la constante al valor de lector.
System.out.print("Cual es el numero máximos de productos : ");
MAX_PRODUCTO = lector.nextInt();

Le doy el mismo valor a las variable de repeticion y totProducto

int repeticiones=MAX_PRODUCTO;
int totProducto=MAX_PRODUCTO;
La variable de repeticion se lo añado a la sentencia for con lo que el valor queda fijado.
//Se crea un bucle de tres intentos.
for (int i=0;i<repeticiones;i++){

Y en aquello lugares donde el valor del precio se ha negativo o no sea un entero
al totProducto le resto 1

/* Entiendo que si MAX_PRODUCTO es 3 y que totProducto tiene el mismo valor que MAX_PRODUCTO. Si totProducto-=1 ahora el valor tendría que ser 2
* y con MAX_PRODUCTO=totProducto; MAX_PRODUCTO tendria que ser 2 tambien
*/
totProducto-=1;
MAX_PRODUCTO=totProducto;

sin embargo al hacer esto:
System.out.println("Productos vendidos en total: " + MAX_PRODUCTO); el valor es 0

Esta es el resultado del programa y su codigo esta debajo:

Cual es el numero máximos de productos : 3
Cual es el precio del producto en Euros : 90
El precio final por pagar es de 90.0 Euros
El valor introducido no es un entero
Cual es el precio del producto en Euros : a
El valor introducido no es un entero
Cual es el precio del producto en Euros : 90
El precio final por pagar es de 90.0 Euros
El valor introducido no es un entero
Productos vendidos en total: 0
Ingresos totales: 180.0Euros
Descuentos totales: 0.0Euros

27 de octubre de 2013
Jose Luis Rodriguez Andradez

EL CODIGO

package EAC2;

//Se importa referencia de teclado
import java.util.Scanner;
//Se importa referencias para la fecha
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exer3draft {
//Constante de descuento del 8%
public static final float DESCUENTO = 8;
//Constante de descuento del 10% sólo en productos de 100€ o más
public static final float COMPRA_MIN = 100;
//Constante del descuento máximo en euros
public static final float DESC_MAX = 10;
//Constante del máximo del producto
public static int MAX_PRODUCTO;



public static void main(String[] args){
Scanner lector = new Scanner(System.in);

float desc=0;
float ingresos=0;


System.out.print("Cual es el numero máximos de productos : ");
MAX_PRODUCTO = lector.nextInt();

int repeticiones=MAX_PRODUCTO;
int totProducto=MAX_PRODUCTO;

//Se crea un bucle de tres intentos.
for (int i=0;i<repeticiones;i++){


System.out.print("Cual es el precio del producto en Euros : ");
boolean tipoCorrecto = lector.hasNextFloat();
//Si la entrada de datos es correcta.
if (tipoCorrecto) {
float precio = lector.nextFloat();
lector.nextLine();
ingresos +=precio;

//Si precio es mayor a 0
if(precio>0){
/*Si precio es mayor o igual a la constante COMPRA_MIN (100)
* Se crea variable desHecho (descuento hecho) que calcula el 10 por ciento del valor
*/
if(precio>=COMPRA_MIN){
float desHecho = precio * DESCUENTO / 100;
//Si el valor desHecho es igual al descuento máximo que es 10, obtendra ese valor
if(desHecho > DESC_MAX){
desHecho=DESC_MAX;

}
precio=precio-desHecho;
desc +=precio;
System.out.println("Descuento realizado " + desHecho + " Euros");

}
System.out.println("El precio final por pagar es de " + precio + " Euros");
/* Si el valor de prcio es inferior a 0, se imprimira "El precio es incorrecto, es negativo"
* al numero total de productos restale uno
*/
}else if (precio<0){
System.out.println("El precio es incorrecto, es negativo");
totProducto -=1;
MAX_PRODUCTO=totProducto;
}
/*Si no se ha introducido un entero, limpiamos el valor lector
* para poder continuar el bucle
* e imprimimos "El valor introducido no es un entero"
*/
}
//Si el valor entrado es no es un numero entero, entonces se resta uno al numero total de productos
lector = new Scanner(System.in);
System.out.println("El valor introducido no es un entero");
totProducto-=1;
MAX_PRODUCTO=totProducto;
}
System.out.println("Productos vendidos en total: " + MAX_PRODUCTO);
System.out.println("Ingresos totales: " + ingresos + "Euros");
System.out.println("Descuentos totales: " + desc + "Euros");

//Imprime la fecha actual al final y nombre del autor
System.out.println(new SimpleDateFormat("\ndd 'de' MMMM 'de' yyyy").format(new Date()));
System.out.println("Jose Luis Rodriguez Andradez");
}}

¿CUAL PUEDE SER EL PROBLEMA?

Gracias de antemano.

octubre 27, 2013 | Registered Commenterjoserodriguezan

Creo que está resuelto. Faltaba un else para el if de tipoCorrecto. Por eso salía siempre a cero el total de vendidos.

public class Exer3draft {
//Constante de descuento del 8%

public static final float DESCUENTO = 8;
//Constante de descuento del 10% sólo en productos de 100€ o más
public static final float COMPRA_MIN = 100;
//Constante del descuento máximo en euros
public static final float DESC_MAX = 10;
//Constante del máximo del producto

public static void main(String[] args) {
Scanner lector = new Scanner(System.in);

float desc = 0;
float ingresos = 0;

System.out.print("Cual es el numero máximos de productos : ");
int maxProducto = lector.nextInt();

int repeticiones = maxProducto;
int totProducto = maxProducto;

//Se crea un bucle de tres intentos.
for (int i = 0; i < repeticiones; i++) {

System.out.print("Cual es el precio del producto en Euros : ");
boolean tipoCorrecto = lector.hasNextFloat();
//Si la entrada de datos es correcta.
if (tipoCorrecto) {
float precio = lector.nextFloat();
ingresos += precio;

//Si precio es mayor a 0
if (precio > 0) {
/*Si precio es mayor o igual a la constante COMPRA_MIN (100)
* Se crea variable desHecho (descuento hecho) que calcula el 10 por ciento del valor
*/
if (precio >= COMPRA_MIN) {
float desHecho = precio * DESCUENTO / 100;
//Si el valor desHecho es igual al descuento máximo que es 10, obtendra ese valor
if (desHecho > DESC_MAX) {
desHecho = DESC_MAX;

}
precio = precio - desHecho;
desc += precio;
System.out.println("Descuento realizado " + desHecho + " Euros");

}
System.out.println("El precio final por pagar es de " + precio + " Euros");
/* Si el valor de prcio es inferior a 0, se imprimira "El precio es incorrecto, es negativo"
* al numero total de productos restale uno
*/
} else if (precio < 0) {
System.out.println("El precio es incorrecto, es negativo");
totProducto -= 1;
maxProducto = totProducto;
}
/*Si no se ha introducido un entero, limpiamos el valor lector
* para poder continuar el bucle
* e imprimimos "El valor introducido no es un entero"
*/
} else {
//Si el valor entrado es no es un numero entero, entonces se resta uno al numero total de productos
lector = new Scanner(System.in);
System.out.println("El valor introducido no es un entero");
totProducto -= 1;
maxProducto = totProducto;
}
}

System.out.println("Productos vendidos en total: " + maxProducto);
System.out.println("Ingresos totales: " + ingresos + "Euros");
System.out.println("Descuentos totales: " + desc + "Euros");

//Imprime la fecha actual al final y nombre del autor
System.out.println(new SimpleDateFormat("\ndd 'de' MMMM 'de' yyyy").format(new Date()));
System.out.println("Jose Luis Rodriguez Andradez");
}
}

octubre 28, 2013 | Registered Commenterchoces

Hola choces,

Lo acabo de solucionar de otra forma, aqui te dejo el codigo.
Lo que he hecho es añadir un contador que hace la suma, y elimnar los que decrementan, con ello he podido quitar dos variables. Tambien me di cuenta que me MAX_PRODUTO era una constante, por lo que no hacia falta preguntar por la cantidad de productos dado que el valor es fijo.

Muchas gracias choces, me has ayudado un monton.

package EAC2;

//Se importa referencia de teclado
import java.util.Scanner;
//Se importa referencias para la fecha
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.*;

public class Exer3 {
//Constante de descuento del 8%
public static final float DESCUENTO = 8;
//Constante de descuento del 10% sólo en productos de 100€ o más
public static final float COMPRA_MIN = 100;
//Constante del descuento máximo en euros
public static final float DESC_MAX = 10;
//Constante del máximo del producto
public static final int MAX_PRODUCTO = 7;



public static void main(String[] args){
Scanner lector = new Scanner(System.in);

//Creamos e inciamos las variables
float desc=0;
float ingresos=0;
int totalProductos = 0;

//Se crea un bucle de tres intentos.
for (int i=1;i<MAX_PRODUCTO;i++){


System.out.print("Cual es el precio del producto "+ i +" en Euros : ");
boolean tipoCorrecto = lector.hasNextFloat();
//Si la entrada de datos es correcta.
if (tipoCorrecto) {
float precio = lector.nextFloat();
lector.nextLine();


/* Si precio es mayor a 0 incrementa el contador a 1,
* siempre que no no se a numerico y superior a 0
*/

if(precio>0){
totalProductos+=1;

if(precio>=COMPRA_MIN){
/*Si precio es mayor o igual a la constante COMPRA_MIN (100)
* Se crea variable desHecho (descuento hecho) que calcula el 8 por ciento del valor
*/
float desHecho = precio * DESCUENTO / 100;
//Si el valor desHecho es igual al descuento máximo que es 10, obtendra este último valor
if(desHecho > DESC_MAX){
desHecho=DESC_MAX;
}
/* Si el el precio es superior a COMPRA_MIN (100), descuenta el desHecho a precio.
* luego suma desHecho a desc (variable descuento). Con ello desHecho tiene un valor y desc es el acomulado de dicho valor.
*/
precio=precio-desHecho;
desc +=desHecho;
System.out.println("Descuento realizado " + desHecho + " Euros");
}
// Siempre que el valor sea entero imprime el Precio y acomula el precio, con el descuento realizado, en una variable (ingresos)
System.out.println("El precio final por pagar es de " + precio + " Euros");
ingresos +=precio;
}else if (precio<0){
// Si el valor de precio es inferior a 0, se imprimira "El precio es incorrecto, es negativo"
System.out.println("El precio es incorrecto, es negativo");
}
/*Si no se ha introducido un entero, limpiamos el valor lector
* para poder continuar el bucle
* e imprimimos "El valor introducido no es un entero"
*/
} else {
/*Si no se ha introducido un entero, limpiamos el valor lector para evitar que se repita el bucle.
* e imprimimos "El valor introducido no es un entero"
*/
lector = new Scanner(System.in);
System.out.println("El valor introducido no es un entero");
}
}
//Descontamos a los ingresos totales todos los descuentos e imprimimos sus resultados.
ingresos-=desc;
//Se crea formato para que sólo aparezcan dos decimales
DecimalFormat df = new DecimalFormat("#.##");
System.out.println("________________________________________________");
System.out.println("\nProductos vendidos en total: " + totalProductos);
System.out.println("Ingresos totales: " + df.format(ingresos)+ " Euros");
System.out.println("Descuentos totales: "+ df.format(desc)+" Euros");

//Imprime la fecha actual al final y nombre del autor
System.out.println(new SimpleDateFormat("\ndd 'de' MMMM 'de' yyyy").format(new Date()));
System.out.println("Jose Luis Rodriguez Andradez");
}}

octubre 28, 2013 | Registered Commenterjoserodriguezan