Autor Tema: pedir datos JOptionPane validar numéricos e imprimir en consola en java eclipse  (Leído 21005 veces)

LeoSavitar

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Hola todos, soy nuevo aquí, espero que puedan ayudarme por favor, debo hacer un programa en java eclipse que pida datos de varios clientes en una interfaz que tiene text fields o campos texto;  por cada cliente vaya validando que los datos estén bien.   Si están bien entonces imprime los datos de ese cliente en la consola  y regresa a seguir pidiendo datos de otro cliente.

Tengo como referencia esto:

Código: [Seleccionar]
//package tareas;

import javax.swing.JOptionPane;

public class CAPTURARCLIENTES {
public static void main (String args[])
{

String valor1="";
String valor2="";

int numeroValor1=0;
int numeroValor2=0;
int resultado=0;
int resultado2=0;
int resultado3=0;
int resultado4=0;
int resultado5=0;
int iSiga=0;
String mensajeResultado="";// otros tipos de variable son int, float, double, char
boolean indBien=false;




//tomar datos de las cajas de ingreso de datos


while (true)

{
indBien=false;
while (indBien==false)

{
valor1=JOptionPane.showInputDialog("Ingrese primer valor");
valor2=JOptionPane.showInputDialog("Ingrese segundo valor");
indBien=true;
try{

// aplicar la operación matemática para el cálculo transformando primero los datos string (texto) capturados a int (enteros)
numeroValor1=Integer.parseInt(valor1);
numeroValor2=Integer.parseInt(valor2);

}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "\n\ndebe digitar valores numericos" , "Mensaje de error al digitar", JOptionPane.ERROR_MESSAGE);
indBien=false;

}

}
indBien=true;
resultado=numeroValor1 + numeroValor2;
resultado2=numeroValor1 - numeroValor2;
resultado3=numeroValor1 * numeroValor2;

// El texto de resultado lo concatena en una variable String
mensajeResultado="primer numero:" + numeroValor1 + "\nsegundo numero:" + numeroValor2 + "\n\nLas suma es:" + resultado +"\nla resta es: " + resultado2 + "\nla multiplicacion es:" + resultado3;

// ejecuta división y residuo solo si el valor del denominador es mayor que 0
if (numeroValor2>0)
{
resultado4=numeroValor1 / numeroValor2;
resultado5=numeroValor1 % numeroValor2;

// El texto de resultado lo concatena en una variable String
mensajeResultado+="\n\nla división es :" + resultado4 ;
mensajeResultado+="\nel residuo es :" + resultado5 ;

}


//desplegar resultado en la caja de mensaje
JOptionPane.showMessageDialog(null,mensajeResultado , "Mensaje de Resultado", JOptionPane.PLAIN_MESSAGE);

// caja de confirmación para que el usuario decida si quiere más operaciones.
iSiga=JOptionPane.showConfirmDialog(null, "Confirme si desea realizar cálculos");
System.out.println("Valor de iSiga " + iSiga);

if (iSiga!=0)
{
break;

}


}//fin lazo mas calculos
System.exit(0); // finaliza la aplicación con la ventana
}//

}//fin clase//

Pero lo que debo capturar son sus Nombre, Apellido, Edad, y cédula, sé como hacer operaciones con números usando el try y cath, dentro de While, pero con números, y que haya una validación que en el cuadro de texto se hayan ingresado números, en caso de que ingresen letras, pero ¿Cómo puedo hacer que se impriman en la consola como una tabla?  :(

Gracias por su ayuda
« Última modificación: 27 de Junio 2018, 20:11 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #1 en: 08 de Mayo 2018, 13:23 »
¿Solo se ha de imprimir los datos del cliente actual?
¿O han de ir acumulándose los datos de cada cliente?

Es decir, supongamos que Paco Pelucas mete sus datos. Y se imprimen en pantalla.
Luego Juanito Calvicie mete sus datos.
¿Ahora en pantalla solo han de salir los datos de Juanito Calvicie?
¿O han de salir también los datos de Paco Pelucas seguidos de los datos de Juanito Calvicie?

Si en pantalla han de salir solo los datos del usuario actual, entonces no hay problema. Pides los datos, cada uno lo almacenas en su correspondiente variable String, imprimes en pantalla y el bucle se repite.

Pero si los datos de cada nuevo usuario se han de ir guardando para mostrarlos todos en pantalla, entonces es un poquito (solo un poquito) más complicado. Si fuera este el caso, dilo y ya veríamos como hacerlo.

Vamos a suponer que solo se han de mostrar los datos del cliente actual. Como digo, esto no presenta ninguna dificultad.

Pero antes quiero comentar lo siguiente:
el código que pones como referencia, lo veo un poco lioso de forma innecesaria. Y sobre todo veo algo que me horroriza..
Ese while(true).... eso es algo que se debe evitar, es algo que muy rara vez es realmente necesario recurrir a ello (yo nunca lo he necesitado), y es algo que veo que incluso profesores y expertos lo utilizan habitualmente.
Y repito, me horroriza...aunque funcione, no es una buena práctica a seguir.

Un programa no solo ha de funcionar, ha de seguir una lógica y ha de ser lo más simple posible.

Para conseguir esto, lo mejor es afrontar el ejercicio construyendolo poco a poco, ir por objetivos.

Para este ejercicio necesitamos un bucle que se repita hasta que el usuario, desde una ventana de confirmación, pulse el boton "NO" (NO seguir introduciendo datos)
Pues empecemos por ahí, vamos a crear un bucle que cumpla esto. Luego ya veremos que escribimos dentro del bucle.
Eso lo conseguimos con algo tan sencillo como esto:

Código: [Seleccionar]
package datosPersona;

import javax.swing.JOptionPane;

public class DatosPersona {

public static void main(String[] args) {

//Variables para los datos del usuario
String nombre;
String apellidos;
String edad;
String cedula;

do
{

//Aqui pondremos el codigo para pedir datos

}while(JOptionPane.showConfirmDialog(null, "¿Introducir mas datos?", "Elija opcion", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION);
//El programa termina aqui
}

}

Ese código puedes ejecutarlo tal cual y verás que funciona. No hace nada útil, solo repite un bucle vacío mientras el usuario pulse el botón "SI".
Cuando pulse "NO", termina el bucle y termina el programa.
Se podría hacer un bucle while(), pero para este caso me gusta mas usar su variante do...while()
Como se puede ver, la condición para que se repita es que el usuario pulse el boton "SI", por eso comparamos el showConfirmDialog() con el valor JOptionPane.YES_OPTION
Si el usuario ha pulsado el boton "SI" (o "YES" según el idioma de nuestro sistema operativo) esa comparación dara como resultado TRUE y el bucle se repetirá de nuevo.

Vale, ahora hay que pedir los datos al usuario y sacarlos en pantalla.
No hay que realizar ninguna operación especial, solo pedir y mostrar.
Intenta hacerlo y muestranos como te ha ido.


También hablas de validar los datos. Yo esto lo pensaría después, de momento me centraría solo en pedir y mostrar. Una vez esto funcione, ya miraría que comprobaciones son necesarias para validar datos.

Por ejemplo, NOMBRE y APELLIDO, no hay mucho que validar.
A lo sumo, podemos comprobar que el dato introducido no este vacío, es decir, que haya introducido al menos una letra, o tal vez obligar que como mínimo sean dos letras.

EDAD si tiene más opciones de validación. Lo primero sería transformar el dato introducido (entra como un String) a un valor int. Si esta transformacion falla, es que el usuario ha metido letras en lugar de numeros.
Si la transformación ha funcionado, entonces habría que comprobar la "calidad" del dato, es decir, si estamos pidiendo una edad, pues no puede ser un numero negativo ni tampoco un numero demasiado alto.
Normalmente solo se admiten edades entre 0 y 99. Tampoco tiene importancia ponernos ahora a filosofar sobre cuál debería ser el máximo de edad. Lo importante es poner un máximo simplemente para practicar el ejercicio de programación.

Para la CEDULA..., para hacer una validación realista habría que complicar aún más el programa y no creo que valga la pena.
Yo haría algo parecido a lo pensado para NOMBRE y APELLIDO, exigir una longitud mínima para el dato.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

LeoSavitar

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #2 en: 13 de Mayo 2018, 18:31 »
Gracias por tu respuesta Kabuto, me sirvió de guía, sin embargo, tenía que utilizar el while(true) ya que era una de las condiciones. Debía hacerlo para infinitos clientes, pero ya logré solucionarlo, pero ahora debo hacer otra tares con eso.
Con los números de la edad que se han introducido, debo hacer un arreglo para al finalizar, sacar un promedio, el número máximo y mínimo.
Código: [Seleccionar]
public static void main (String args[])
{
String strNombre = "";
String strApellido = "";
String strEdad = "";
String strCedula = "";
String strError = "";
String strBlancos = "                                                   ";

int intEdad = 0;
int iSiga=0;
boolean indBien=false;


System.out.println("NOMBRE               APELLIDO               EDAD               CÉDULA");

while (true)

{
//capturar nombre
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strNombre = JOptionPane.showInputDialog("Digite su nombre : ", strNombre).toUpperCase().trim();
if(strNombre.length()<3){
strError += "longitud de nombre menor que 3\n";
}
if(strNombre.length()>15){
strError += "longitud de nombre mayor que 15\n";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}

//capturar apellido
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strApellido = JOptionPane.showInputDialog("\nDigite su apellido : ", strApellido).toUpperCase().trim();
if(strApellido.length()<3){
strError += "longitud de nombre menor que 3\n";
}
if(strApellido.length()>15){
strError += "longitud de nombre mayor que 15\n";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}

//capturar edad

indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();

try{
intEdad=Integer.parseInt(strEdad);
}
catch (Exception e)
{
strError += "debe ingresar valores numéricos\n";
JOptionPane.showMessageDialog(null, strError);
indBien=false;
continue;
}

if(intEdad<18||intEdad>125){
strError += "Edad fuera del rango entre 18 y 125";
}

if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}



}

//capturar cédula
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strCedula = JOptionPane.showInputDialog("\nDigite su cédula : ", strCedula).trim();
if(strCedula.length()<9){
strError += "longitud de la cédula es menor que 9\n";
}
if(strCedula.length()>12){
strError += "longitud de la cédula es mayor que 11\n";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}

strNombre=strNombre+strBlancos.substring(0, 21-strNombre.length());
strApellido=strApellido+strBlancos.substring(0, 25-strApellido.length());
strEdad=strEdad+strBlancos.substring(0, 17-strEdad.length());
strCedula=strCedula+strBlancos.substring(0, 12-strCedula.length());

System.out.println( strNombre+ strApellido+ strEdad+ strCedula);

iSiga=JOptionPane.showConfirmDialog(null, "Otro cliente?");


if (iSiga!=0)
{

System.exit(0);

}

}//fin while

}public static void main (String args[])
{
String strNombre = "";
String strApellido = "";
String strEdad = "";
String strCedula = "";
String strError = "";
String strBlancos = "                                                   ";

int intEdad = 0;
int iSiga=0;
boolean indBien=false;


System.out.println("NOMBRE               APELLIDO               EDAD               CÉDULA");

while (true)

{
//capturar nombre
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strNombre = JOptionPane.showInputDialog("Digite su nombre : ", strNombre).toUpperCase().trim();
if(strNombre.length()<3){
strError += "longitud de nombre menor que 3\n";
}
if(strNombre.length()>15){
strError += "longitud de nombre mayor que 15\n";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}

//capturar apellido
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strApellido = JOptionPane.showInputDialog("\nDigite su apellido : ", strApellido).toUpperCase().trim();
if(strApellido.length()<3){
strError += "longitud de nombre menor que 3\n";
}
if(strApellido.length()>15){
strError += "longitud de nombre mayor que 15\n";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}

//capturar edad

indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();

try{
intEdad=Integer.parseInt(strEdad);
}
catch (Exception e)
{
strError += "debe ingresar valores numéricos\n";
JOptionPane.showMessageDialog(null, strError);
indBien=false;
continue;
}

if(intEdad<18||intEdad>125){
strError += "Edad fuera del rango entre 18 y 125";
}

if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}



}

//capturar cédula
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strCedula = JOptionPane.showInputDialog("\nDigite su cédula : ", strCedula).trim();
if(strCedula.length()<9){
strError += "longitud de la cédula es menor que 9\n";
}
if(strCedula.length()>12){
strError += "longitud de la cédula es mayor que 11\n";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}

strNombre=strNombre+strBlancos.substring(0, 21-strNombre.length());
strApellido=strApellido+strBlancos.substring(0, 25-strApellido.length());
strEdad=strEdad+strBlancos.substring(0, 17-strEdad.length());
strCedula=strCedula+strBlancos.substring(0, 12-strCedula.length());

System.out.println( strNombre+ strApellido+ strEdad+ strCedula);

iSiga=JOptionPane.showConfirmDialog(null, "Otro cliente?");


if (iSiga!=0)
{

System.exit(0);

}

}//fin while

}

Eso es lo que debía hacer, pero para introducir el arreglo. lo hice asi

Código: [Seleccionar]
int [] arrEnteros = new int [strEdad.length()];
int intSuma = 0;
int intPromedio = 0;
y para el promedio lo hice así
Código: [Seleccionar]
for(int i=0; i<=arrEnteros.length; i++){
intSuma = intSuma + arrEnteros[i];
};
intPromedio = (intSuma/arrEnteros.length);
System.out.println("\n\nEl promedio de la edad es:\n" + intPromedio);
el problema es que no sé si está bien, o dónde debería ponerlo, porque cuando le corro sl programa me dice que esta linea (intSuma = intSuma + arrEnteros) pero no sé porqué.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #3 en: 13 de Mayo 2018, 21:57 »
Sobre el while(true)...
Aquí entra la problemática que mencioné antes, hay profesores y "expertos" que lo utilizan y piensan que es un buen recurso a la hora de programar.
Pues no solo es un mal recurso, si no que es totalmente innecesario.
Para terminar un while(true), hay que utilizar un:
if (<condicion>).... break;

O bien:
if (<condicion>).... System.exit(0);

¿Pues no es más lógico y útil poner esa <condicion> directamente en el while()?
Si necesitamos que ese bucle se ejecute como mínimo una vez independientemente de si se cumple o no esa condición, para ello tenemos el do...while(), que es el utilicé en mi ejemplo.
Con este bucle, este se ejecuta como mínimo una sola vez y luego evalúa la condición para decidir si el bucle se repite o se termina.

Si haces una búsqueda por Internet, verás que la opinión generalizada es que es una mala práctica, incluso en este otro enlace una persona comenta que está cursando un grado y al usarlo en un ejercicio le penalizaron restándole puntos.

Ahora bien, por desgracia, quien "manda" son tus profesores, así que si te dicen que uses el while(true), hazlo.
Pero hazlo solo por contentarles, luego tú intenta recordar que es mala práctica, que en ejercicios simples no importa pero en programas más avanzados usar un while (true) conlleva inevitablemente problemas a posteriori, especialmente de "legibilidad" del programa y de mantenimiento.

Cuando te pasan un código que tú no has escrito para mantenerlo y modificarlo, y ves un while(respuesta == "si"), enseguida ves claramente cuál es la condición necesaria para que el bucle se repita o no.
Pero si te encuentras un while(true), no sabes cuál es la condición real que mantiene el bucle funcionando y tienes que empezar a revisar lineas de código hasta encontrar un break; un System.exit(0)...o similar.
Y como digo, en un programa profesional avanzado, puede ser una locura.


Sobre esto:
Citar
Con los números de la edad que se han introducido, debo hacer un arreglo para al finalizar, sacar un promedio, el número máximo y mínimo.
De nuevo, para contentar al profesor y cumplir lo que pide el anunciado, hay que complicar más el código inútilmente.

Para calcular el promedio, el máximo y el mínimo, no hace falta ningún arreglo, es un paso totalmente innecesario, se puede prescindir de él.
Pero si piden que se use, pues habrá que usarlo... pero esto plantea un problema importante.

En Java, para declarar un arreglo, tienes que saber de antemano que dimensión va a tener.
Es decir, necesitamos saber cuantas edades vamos a almacenar..., pero esto no lo podemos saber..., porque cada vez que se ejecute el programa no sabemos si el usuario va a meter los datos de 3 personas, de 5 personas, de 50, de 10000....

Tu declaración:
Código: [Seleccionar]
int [] arrEnteros = new int [strEdad.length()];Esto no te sirve, le estás diciendo que la dimensión del arreglo ha de ser la longitud del valor de la variable String que contiene la edad.

Es decir, si en ese momento tiene almacenada la edad de una persona de 25 años:
strEdad = "25";
Entonces le estas diciendo al arreglo que su dimensión es de tan solo dos elementos. Porque la longitud del valor de esa variable, es decir, strEdad.length() es de dos, puesto que el string "25" tiene dos caracteres, el '2' y el '5'.

Vamos, que no puedes deducir cuál va a ser el tamaño del arreglo valiéndote de la longitud ( .length() ) de esa varaible, ni de ninguna otra.

De hecho, repito, no puedes deducir cuál ha de ser el tamaño de ninguna manera, porque tu no puedes saber cuantos datos de personas va a introducir el usuario.

En estos casos, se usa unas clases más avanzadas, como puede ser la clase Vector o la clase ArrayList.
Estas clases tienen la ventaja de que no hace falta indicarles ninguna dimensión al declararlos. Son como los arreglos "normales", pero puedes ir añadiendo y quitando datos y ellos irán aumentando o disminuyendo su longitud de forma dinámica.

Como aún no te los han explicado, supongo que no puedes recurrir a ellos.

Si vas a tener que usar un arreglo "normal", no te queda otra que decidir una dimensión lo suficientemente grande para poder hacer el ejercicio.
Total, es solo eso, un ejercicio, y no tiene porque ser perfecto si no tan solo servirte para aprender.
Puedes poner por ejemplo que mida 50, y ya vas sobrado porque para el ejercicio no vas a necesitar meter más de 50 personas.
Código: [Seleccionar]
int[] edades = new int[50];
Para calcular el promedio, vas a necesitar otra variable para contar de cuantas personas se han introducido datos.
Código: [Seleccionar]
int contPsn = 0;//Para contar personasEsta variable, además, te puede servir como "indice" para el arreglo.
Ya que la primera vez que se meta el dato de una persona, la edad habrá que guardarla en la posicion 0 del arreglo y contar esa persona.
La próxima edad se ha de guardar en la posicion 1, y contra otra persona más.
Y así continuamente.....

Pero solo se han de introducir y contar cuando la edad haya quedado validada.
Tú has usado este código para capturar y validar la edad:
Citar
//capturar edad

         indBien=false;
         while (indBien==false)
         {
            strError = "";
            indBien=true;
            strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();

            try{
               intEdad=Integer.parseInt(strEdad);
            }
            catch (Exception e)
            {
               strError += "debe ingresar valores numéricos\n";
               JOptionPane.showMessageDialog(null, strError);
               indBien=false;
               continue;
            }

            if(intEdad<18||intEdad>125){
               strError += "Edad fuera del rango entre 18 y 125";
            }

            if(strError.length()>0){
               JOptionPane.showMessageDialog(null, strError);
               indBien=false;
            }
            
                     
            
         }      

Yo lo habría hecho de otra forma, pero para seguir con tu enfoque, podríamos añadir lo siguiente (en color rojo):
Citar
//capturar edad

         indBien=false;
         while (indBien==false)
         {
            strError = "";
            indBien=true;
            strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();

            try{
               intEdad=Integer.parseInt(strEdad);
            }
            catch (Exception e)
            {
               strError += "debe ingresar valores numéricos\n";
               JOptionPane.showMessageDialog(null, strError);
               indBien=false;
               continue;
            }

            if(intEdad<18||intEdad>125){
               strError += "Edad fuera del rango entre 18 y 125";
            }

            if(strError.length()>0){
               JOptionPane.showMessageDialog(null, strError);
               indBien=false;
            }

                            if (indBien == true){
                                        edades[contPsn] = intEdad;//Guardamos la edad validada en el arreglo
                                        contPsn++;//Aumentamos en 1 el contador de personas, que a su vez nos sirver de indice para el arreglo
                                }

                     
         }      

De este modo cada vez que se repite el bucle, se guarda la edad validad en la posición adecuada del arreglo y al mismo tiempo contamos las personas introducidas.


Bien, para mostrar y calcular el promedio, tenemos que esperar a que el usuario termine de introducir datos, es decir, hay que hacerlo cuando haya terminado el bucle while().

Ahora mismo, tu bucle while en realidad no termina, sino que estamos cerrando el programa brúscamente con el System.exit(0) (otra mala práctica por cierto)
Esto implica que no tenemos oportunidad de seguir haciendo operaciones al terminar de introducir datos de personas.
Para evitarlo, podemos cambiar el System.exit(0) por la sentencia break;

De este modo, el bucle while() terminará pero el programa seguirá funcionando si le añadimos más codigo tras el //fin while

Así ahora ya tenemos la oportunidad de hacer más operaciones con los datos de la edad, como lo de calcular el promedio.
Para ello, necesitamos otra variable para sumar las edades que hemos almacenado en el arreglo.
Hay que recordar que para nuestro arreglo decidimos darle una dimension de 50, pero en realidad puede que solo tenga 5 edades, ó 7, ó 23..
Así que para sumar las edades, no debemos recorrer el arreglo entero, solo según las personas que hayamos introducido.
Y para esto nos servimos de la variable que hemos usado para contar personas:

Código: [Seleccionar]
//Calcular promedio edad
int sumaEdad = 0;
for (int i=0; i<contPsn; i++)
{
sumaEdad = sumaEdad + edades[i];
}
System.out.println("La edad promedio es: " + (sumaEdad / contPsn));

Con eso ya tienes el promedio de las edades validas introducidas, y funciona para cualquier número de personas introducidas (máximo 50).

Ahora te faltaría lo de calcular la edad máxima y la edad mínima. A ver si consigues averiguar como hacerlo.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

LeoSavitar

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #4 en: 14 de Mayo 2018, 00:53 »
Gracias por tu ayuda Kabuto, me ayudó a entender mejor esto de los arreglos, mi profesor me dio esto
Código: [Seleccionar]
import java.util.*;

public class A_UsoArreglos {
//se define un arreglo de números enteros al que se le asigna (inicializa) valores 2, 588, 645, 101, 222, 1
private int arregloDeEnteros[] = { 2, 588, 645, 101, 222, 1 };
//se define un arreglo de números enteros al que se le asigna (inicializa) valores 2, 588, 645, 101, 222, 1
private int arregloDeEnteros2[] = { 2, 588, 645, 101, 222, 1 };
//se define un arreglo de números decimales o double al que se le asigna (inicializa) valores 33.21, 88.12, 0.135,6.67, 4.55
private double arregloDecimales[] = { 33.21, 88.12, 0.135,6.67, 4.55 };

private int arregloEnteroLLenado[], copiaArregloDeEnteros[];
private double copiaArregloDeDecimales[];

// inicializar los arreglos
public A_UsoArreglos()
{
   arregloEnteroLLenado = new int[ 10 ];
   copiaArregloDeEnteros = new int[ arregloDeEnteros.length ];
   copiaArregloDeDecimales = new double[arregloDecimales.length];

   Arrays.fill( arregloEnteroLLenado, 455 );   // llenar con 7s

   // copiar el arreglo arregloDecimales en el arreglo copiaArregloDeDecimales
   System.arraycopy( arregloDecimales, 0, copiaArregloDeDecimales,
      0, arregloDecimales.length );
   
   Arrays.sort( copiaArregloDeDecimales );   // ordenar copiaArregloDecimales en forma ascendente

   // copiar el arreglo arregloDeEnteros en el arreglo copiaArregloDeEnteros
   System.arraycopy( arregloDeEnteros, 0, copiaArregloDeEnteros,
      0, arregloDeEnteros.length );
   
   Arrays.sort( copiaArregloDeEnteros );   // ordenar copiaArregloDeEnteros en forma ascendente
}

// mostrar los valores en cada arreglo
public void imprimirArreglos()
{     
   System.out.print( "\narregloDecimales original : " );

   for ( int i = 0; i < arregloDecimales.length; i++ )
      System.out.print( arregloDecimales[ i ] + " " );
   
   System.out.print( "\narregloDecimales copiado y ordenado : " );

   for ( int i = 0; i < copiaArregloDeDecimales.length; i++ )
      System.out.print( copiaArregloDeDecimales[ i ] + " " );

   System.out.print( "\n\narregloDeEnteros original : " );

   for ( int i = 0; i < arregloDeEnteros.length; i++ )
      System.out.print( arregloDeEnteros[ i ] + " " );


   System.out.print( "\ncopiaArregloDeEnteros copiado y ordenado: " );

   for ( int i = 0; i < copiaArregloDeEnteros.length; i++ )
      System.out.print( copiaArregloDeEnteros[ i ] + " " );
   
   
   System.out.print( "\n\narregloEnteroLLenado: " );

   for ( int i = 0; i < arregloEnteroLLenado.length; i++ )
      System.out.print( arregloEnteroLLenado[ i ] + " " );

   System.out.println();

} // fin del método imprimirArreglos

// encontrar valor en el arreglo arregloDeEnteros
public int buscarEnArreglo( int valor )

   return Arrays.binarySearch( arregloDeEnteros, valor );
}

// comparar el contenido de los arreglos
public void compararArreglos()
{
   boolean b = Arrays.equals( arregloDeEnteros, copiaArregloDeEnteros );

   System.out.println( "\narregloDeEnteros " + ( b ? " es iguala" : " no es igual a " ) +
      " copiaArregloDeEnteros" );

   b = Arrays.equals( arregloDeEnteros, arregloEnteroLLenado );

   System.out.println( "\narregloDeEnteros " + ( b ? " es igual a " : " no es igual a " ) +
      " arregloEnteroLLenado" );
   
   b = Arrays.equals( arregloDeEnteros, arregloDeEnteros2 );

   System.out.println( "\narregloDeEnteros " + ( b ? " es igual a " : " no es igual a " ) +
      " arregloDeEnteros2" );
}

public static void main( String args[] )
{
A_UsoArreglos usoArreglos = new A_UsoArreglos();

usoArreglos.imprimirArreglos();
usoArreglos.compararArreglos();
int posicion=88;
//System.out.println(  posicion );
   posicion = usoArreglos.buscarEnArreglo( 588 );
   //System.out.println(  posicion );
   System.out.println( ( posicion >= 0 ? "\n\nSe encontro el 588 en la posición " +
   (posicion + 1) : "\n\nNo se encontro el 1" ) + " en arregloDeEnteros"  );

   posicion = usoArreglos.buscarEnArreglo( 8763 );
   System.out.println( ( posicion >= 0 ? "Se encontro el 6464 en en la posición " +
   (posicion + 1) : "No se encontro el 6464" ) + " en arregloDeEnteros" );
}

Pero llevo dos días tratando de entenderlo, y no lo logro, todo está mezclado.

Tu ayuda si me sirvió para los promedios, encontré como sacar los mínimos y máximos de esta manera
Código: [Seleccionar]
int max = 0;
int min = 0;
max = min = Edades[0];

 for (int i=1; i<Edades.length; i++)
{
if (Edades[i]>max) {
max = Edades[i];
}

if (Edades[i]<min) {
min = Edades[i];
}
}

System.out.println( "\nla edad mínima es: " + min +
"\nla edad máxima es: " + max);

Pero aún tengo un problema, la salir el resultado, el valor mínimo siempre me sale 0, no importa que números estén, y todo parece estar como debe estar, no sé cuál es el problema?

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #5 en: 14 de Mayo 2018, 01:33 »
Lo que te ha pasado tu profesor es cierto que es confuso, son varios ejemplos de operaciones con arrays (arreglos) todo en una misma clase.
No perdería demasiado tiempo intentando comprenderlo.


Sobre esto:
Citar
Pero aún tengo un problema, la salir el resultado, el valor mínimo siempre me sale 0, no importa que números estén, y todo parece estar como debe estar, no sé cuál es el problema?
Creo que se cual es el problema.

Para calcular el máximo y minimo, estás recorriendo el arreglo completo, hasta el final
Citar
for (int i=1; i<Edades.length; i++)

Recuerda que hemos puesto un arreglo de 50 elementos, pero al introducir edades, estamos usando unicamente las primeras posiciones de este arreglo.
Si por ejemplo ejecutas el programa y metes datos de cinco personas, en el arreglo solo te interesan sus primeras 5 posiciones pues son las que van a tener edades.
El resto de posiciones tienen valor 0 y estas posiciones son las que te están haciendo fallar.
Es decir, los valores del arreglo se parecen a esto (no pongo 50 valores porque seria enorme):
edades = {18, 24, 56, 32, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ......, 0, 0, 0, 0, 0, };

Los valores en azul son las edades que habríamos introducido como ejemplo.
Los valores en rojo son posiciones que no hemos utilizado, pero que automaticamente tienen valor 0.

Esto para calcular el maximo no importa.
Pero para el mínimo sí, pues donde comparas para decidir cual es el mínimo:
Código: [Seleccionar]
if (Edades[i]<min) {
min = Edades[i];
}
Como estas recorriendo el arreglo al completo, estamos haciendo comparaciones también con los valores 0.
El codigo piensa que todos los 0 del arreglo (los que he puesto en rojo como ejemplo) son también edades válidas y al usarlos para comparar, pues decide que la edad minima es 0.

Para evitar comparar posiciones del arreglo donde no hemos introducido edades, en este bucle for tendríamos que hacer como en el anterior para calcular el promedio y poner como límite la variable usada para contar personas, y no la longitud total del arreglo.
Esto:
Citar
for (int i=1; i<Edades.length; i++)
Habría que cambiarlo:
Citar
for (int i=1; i<contPsn; i++)

Así en las comparaciones para decidir maximo y minimo, solo pasaremos por las posiciones del arreglo que realmente tienen edades validas. Las posiciones que tienen valores 0, no pasaremos por ellas.

No es un fallo importante, de hecho, es muy habitual ya que lo normal es recorrer los arreglos enteros y ya por acto reflejo en el bucle for ponemos como limite la longitud total del arreglo, pero hay casos como este en los que NO querremos recorrerlo al completo.

Por lo demás está muy bien.
Lo de cómo encontrar el máximo y el mínimo de una serie de numeros, creeme que a muchísima gente le cuesta conseguirlo la primera vez.
No todo el mundo se da cuenta de lo evidente y sencilla que es esta lógica:
Código: [Seleccionar]
max = min = Edades[0];Es decir, establecer el primer número de la serie como máximo y a la vez como mínimo, y a partir de ahí comparar con el resto de números de la serie.

Parece una cosa tonta, pero repito que mucha gente no es capaz de deducirlo, y algunos incluso explicándoselo no terminan de entenderlo.

Sigue así, cualquier duda que tengas aquí estaremos en el foro para ayudarte en lo posible.




NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

LeoSavitar

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #6 en: 14 de Mayo 2018, 02:36 »
Gracias por tu ayuda Kabuto, realmente es muy útil, sin embargo después de haberlo cambiado en las condiciones del for, aún tengo el problema con el mínimo, es posible que sea otra cosa?
Código: [Seleccionar]
int max = 0;
int min = 0;
int intContador = 0;

max = min = Edades[0];

 for (int i=1; i<intContador; i++)
{
if (Edades[i]>max) {
max = Edades[i];
}

if (Edades[i]<min) {
min = Edades[i];
}
}

System.out.println( "\nla edad mínima es: " + min +
"\nla edad máxima es: " + max);

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #7 en: 14 de Mayo 2018, 12:09 »
Esa varaible intContador no te sirve y no la necesitas.

Has de usar la variable que usábamos para contar personas, la misma que te marco aquí en rojo negrita

Citar
//capturar edad

         indBien=false;
         while (indBien==false)
         {
            strError = "";
            indBien=true;
            strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();

            try{
               intEdad=Integer.parseInt(strEdad);
            }
            catch (Exception e)
            {
               strError += "debe ingresar valores numéricos\n";
               JOptionPane.showMessageDialog(null, strError);
               indBien=false;
               continue;
            }

            if(intEdad<18||intEdad>125){
               strError += "Edad fuera del rango entre 18 y 125";
            }

            if(strError.length()>0){
               JOptionPane.showMessageDialog(null, strError);
               indBien=false;
            }

                            if (indBien == true){
                                        edades[contPsn] = intEdad;//Guardamos la edad validada en el arreglo
                                        contPsn++;//Aumentamos en 1 el contador de personas, que a su vez nos sirver de indice para el arreglo
                                }

                     
         }     


Citar
//Calcular promedio edad
       int sumaEdad = 0;
       for (int i=0; i<contPsn; i++)
       {
          sumaEdad = sumaEdad + edades[ i ];
       }
       System.out.println("La edad promedio es: " + (sumaEdad / contPsn));

Esa es la variable que hemos usado (bueno, al menos la que yo usé en mi ejemplo) para contar el número de personas de las que hemos introducido datos.
Así que también nos sirve para saber hasta cual posición vamos a recorrer el arreglo de edades, ya que nos indica hasta donde vamos a encontrar edades validadas.

Por lo tanto, eliminamos la variable intContador y usamos contPsn (no sé si le pusiste el mismo nombre o uno diferente...)

Citar
int max = 0;
int min = 0;
int intContador = 0;

max = min = Edades[0];

 for (int i=1; i<contPsn; i++)
       {
         if (Edades[ i ]>max) {
            max = Edades[ i ];
         }
         
         if (Edades[ i ]<min) {
            min = Edades[ i ];
         }
       }
      
       System.out.println(      "\nla edad mínima es: " + min +
                      "\nla edad máxima es: " + max);
« Última modificación: 14 de Mayo 2018, 12:13 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

LeoSavitar

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #8 en: 15 de Mayo 2018, 01:23 »
Si, si tengo así, es que yo le cambié de nombre porque mi profesor prefiere que le pongamos así.
pero lo cambié en todos los lugares, así que no creo que sea por eso

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:pedir datos de clientes e imprimir en consola en java eclipse
« Respuesta #9 en: 15 de Mayo 2018, 23:40 »
Si, si tengo así, es que yo le cambié de nombre porque mi profesor prefiere que le pongamos así.
pero lo cambié en todos los lugares, así que no creo que sea por eso

Pues comprueba en que posición esta declarada esa variable.

Si nos fijamos en este código que pusiste, atento a lo señalado en rojo:

Citar
int max = 0;
int min = 0;
int intContador = 0;

max = min = Edades[0];

 for (int i=1; i<intContador; i++)
       {
         if (Edades>max) {
            max = Edades;
         }
         
         if (Edades<min) {
            min = Edades;
         }
       }
      
       System.out.println(      "\nla edad mínima es: " + min +
                      "\nla edad máxima es: " + max);

Primero declaras la nueva varaible intContador con valor = 0...

Y acto seguido la usas para el bucle for.

Esto significaría que el bucle no hace ninguna comprobación de edades, ya la condición para que el bucle se inicie y se mantenga, es que la variable i sea menor que intContador

Si desde el primer momento la variable i = 1 e intContador = 0...
...1 no es menor que 0... por lo tanto el bucle for no se inicia.

Para que funcione correctamente, la variable intContador ha de ser declarada e inicializada al principio del programa, antes de la petición de datos de personas.
Y asegurarnos de que cada vez que se introduzca una edad y sea validada, intContador se vaya incrementando para que cuente el número de personas introducidas.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".