Autor Tema: Java - Sumar con bucle y Scanner- Pequeña diferencia entre 2 clases  (Leído 10706 veces)

LPM

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 35
    • Ver Perfil
Hola. Anduve probando un poco y me topé con esto.

Con la primer clase me resulta bien:

Código: [Seleccionar]
import java.util.Scanner;

public class ConAsignarBucle {
    private static int total=0;
    private static int permiteBucle=-1;
   
    public ConAsignarBucle (){
        total=0;
        permiteBucle=-1;
}
       
    public static void main (String [] args) { 
        Scanner teclado=new Scanner (System.in);
        System.out.println ("Escriba un numero. Escribir 0 indica que ha terminado :");
               
        while (permiteBucle !=0){
            permiteBucle=teclado.nextInt ();
            total+=permiteBucle ;
            if (permiteBucle!=0)
            System.out.print ("Escriba un numero: ");   
        }
       
System.out.println ("El total es : "+total);
     }

}

Probé poner a esto

Código: [Seleccionar]
            if (permiteBucle!=0)
            System.out.print ("Escriba un numero:");   

ponerle corchetes (perdon, aun no me se bien los nombres de cada linea, parte)

Código: [Seleccionar]
            if (permiteBucle!=0) {
System.out.print ("Escriba un numero:");   
}

La clase sigue funcionando bien. Pero por qué? Agregar corchetes no deberia afectar al código?



Bueno, luego probé lo siguiente, lo que ya no me resultó bien:

Código: [Seleccionar]
import java.util.Scanner;

public class SinAsignarBucle {

public static void main (String [] args) { 
int total=0;

Scanner teclado=new Scanner (System.in);
System.out.println ("Escriba un numero. Escribir 0 indica que ha terminado: ");

while (teclado.nextInt () !=0){
total+=teclado.nextInt (); 
if (teclado.nextInt () !=0)
System.out.println ("Escriba la duracion del siguiente tema: ");
}

System.out.println ("El total es "+total);
}



Compila, se ejecuta, y me da el resultado final, la suma, lo unico que tengo que tipear 3 veces algun numero.

Me interesa saber qué hice mal, y si hay alguna forma de arreglarlo sin hacerlo como la primer clase.

Tambien me interesa mucho saber por qué, al ejecutar el código, tengo que ingresar 3 veces un número. Por qué justo 3? si es que se me entiende. Variando un poco el codigo me llegó a pedir 2 veces.





Y una ultima consulta.  No se si ya esto tendría que ir en un nuevo tema o no, el caso es que no podía lograr tipear decimales, me tiraba error. Y encontré esto que me funcionó

Código: [Seleccionar]
import java.util.Scanner;

public class Prueba1 {

public static void main(String[] args) {
Scanner AH=new Scanner (System.in);
System.out.println("Introduce Un Numero:");

float num=0;
float bandera=-1;
while (bandera!=0){
bandera=Float.parseFloat(AH.next());
num+=bandera;
if(bandera==0)

System.out.println("la suma final es:"+num);
}
}
}


De aca me surgen 2 dudas.  Para poder tipear decimales lo que me sirve es esta linea?

Código: [Seleccionar]
x=Float.parseFloat(AH.next());
especificando, seria esto:
Código: [Seleccionar]
Float.parseFloat(AH.next());

Perdon si junté varias cosas en un mismo tema. O si omití algo importante.


Príncipe_Azul

  • Principiante
  • **
  • Mensajes: 71
    • Ver Perfil
    • Foro ArgentinaIRC - Ayuda de Programación General, IRC y mIRC Scripting!
Re:Java - Sumar con bucle y Scanner- Pequeña diferencia entre 2 clases
« Respuesta #1 en: 12 de Noviembre 2014, 09:13 »
Hola. Anduve probando un poco y me topé con esto.

Con la primer clase me resulta bien:

Código: [Seleccionar]
import java.util.Scanner;

public class ConAsignarBucle {
    private static int total=0;
    private static int permiteBucle=-1;
   
    public ConAsignarBucle (){
        total=0;
        permiteBucle=-1;
}
       
    public static void main (String [] args) { 
        Scanner teclado=new Scanner (System.in);
        System.out.println ("Escriba un numero. Escribir 0 indica que ha terminado :");
               
        while (permiteBucle !=0){
            permiteBucle=teclado.nextInt ();
            total+=permiteBucle ;
            if (permiteBucle!=0)
            System.out.print ("Escriba un numero: ");   
        }
       
System.out.println ("El total es : "+total);
     }

}

Probé poner a esto

Código: [Seleccionar]
            if (permiteBucle!=0)
            System.out.print ("Escriba un numero:");   

ponerle corchetes (perdon, aun no me se bien los nombres de cada linea, parte)

Código: [Seleccionar]
            if (permiteBucle!=0) {
System.out.print ("Escriba un numero:");   
}

La clase sigue funcionando bien. Pero por qué? Agregar corchetes no deberia afectar al código?

Las llaves { } debés usarlas siempre.

Probá en esta parte:

Código: [Seleccionar]
System.out.print ("Escriba un numero:");

de dejarlo así por ejemplo:

Código: [Seleccionar]
System.out.print ("Escriba un numero:");
System.out.print ("Escriba otro numero:");

y posiblemente el programa no ejecute la segunda instrucción System.out.print ("Escriba otro numero:");
eso sucede porque al código le está faltando las llaves, siempre va a salir la primer instrucción y no las demás, ya que no están las llaves puestas, voy con 1 ejemplo en C++, que es similar a C# para que entiendas mejor:

Código: [Seleccionar]
#include <iostream>

using namespace std;

int main() {
    int num = 10;
    if (num == 20)
        cout << "Mensaje 1" << endl;
        cout << "Mensaje 2" << endl;
        cout << "Mensaje 3" << endl;
    cout << "Mensaje 4" << endl;
}

este programa muestra en la consola los siguientes mensajes:

Mensaje 2
Mensaje 3
Mensaje 4


aaaahhh porqué pasa eso???? Si supuestamente está bien la identación?  ::) ¿Que acaso no debería imprimer el mensaje 4 solamente?, pues no!
Justamente porque como bien decía, al no usar llaves, solamente se ejecutará la primer instrucción o cualquier que sea después de la primera, como en este caso, que la variable num no es igual a 20, pero sin embargo se ejecutan las 2 instrucciones que son:

Código: [Seleccionar]
        cout << "Mensaje 2" << endl;
        cout << "Mensaje 3" << endl;

ahora, que pasaría si yo al código lo dejo así?:

Código: [Seleccionar]
#include <iostream>

using namespace std;

int main() {
    int num = 10;
    if (num == 20) {
        cout << "Mensaje 1" << endl;
        cout << "Mensaje 2" << endl;
        cout << "Mensaje 3" << endl;
    }
    cout << "Mensaje 4" << endl;
}

me imprime solamente el mensaje 4, muy bien! eso es porque se ha utilizado las llaves y en C++ por lo menos la identación no es lo requerido para los programas, lo requerido son las llaves, por eso lenguajes como C, C++, C#, etc. se diferencian de los demás por las llaves { }

Para que no queden dudas sobre tu pregunta, vamos a probar estos 2 programas:

Código: [Seleccionar]
#include <iostream>

using namespace std;

int main() {
    int num = 10;
    if (num == 20) {
cout << "Mensaje 1" << endl;
cout << "Mensaje 2" << endl;
cout << "Mensaje 3" << endl;
    }
    cout << "Mensaje 4" << endl;
}

y ahora este:

Código: [Seleccionar]
#include <iostream>

using namespace std;

int main() {
    int num = 10;
    if (num == 20) {
                            cout << "Mensaje 1" << endl;
                            cout << "Mensaje 2" << endl;
                            cout << "Mensaje 3" << endl;
    }
    cout << "Mensaje 4" << endl;
}


oohhh vaya que identación de mala!!!!!!! jajaja pero el programa funciona perfectamente, es decir que solamente muestra "Mensaje 4", como dije, la sintáxis de C++ y C# en cuanto al conjunto de instrucciones, funciones, seteo de variables, etc. que se ejecutarán en un condicional por ejemplo, son las llaves, no la identación.

De la misma manera que el ; (punto y coma) es totalmente requerido en C#, de la misma forma débes acostumbrarte a usar siempre las llaves { }

:) Te mando 1 abrazo maestro! Buena suerte con tu programa!! :)
« Última modificación: 12 de Noviembre 2014, 09:26 por Principe_Azul »

LPM

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 35
    • Ver Perfil
Re:Java - Sumar con bucle y Scanner- Pequeña diferencia entre 2 clases
« Respuesta #2 en: 12 de Noviembre 2014, 19:10 »
hola Principe

gracias por la respuesta.

lei muchas veces tu respuesta, hasta que por fin entendí xd
hace poco empecé con esto de la programación.

luego probé poniendo y borrando llaves en diferentes partes y me quedó bastante claro.

de paso probé la diferencia entre System.out.print y System.out.println

gracias de nuevo =)



me puse a revisar el siguiente codigo que funciona a medias, me pide ingresar mas de una vez algun numeropara pasar a la siguiente instruccion

Código: [Seleccionar]
import java.util.Scanner;

public class SinAsignarBucle {

public static void main (String [] args) { 
int total=0;

Scanner teclado=new Scanner (System.in);
System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");
total+=teclado.nextInt ();
while (teclado.nextInt () !=0){
System.out.print ("Escriba el siguiente numero: ");
total+=teclado.nextInt ();
}

System.out.println ("El total es "+total);
}



pero, creo que el problema seria el siguiente

Código: [Seleccionar]
while (teclado.nextInt () !=0){
al escribir "teclado.nextInt" indico que tiene que escribir algo, aunque no modifica nada. ahi está el motivo de por qué tengo que ingresar mas de una vez.

entonces, lo que tengo que hacer antes es asignar una variable que tome el valor de lo que escriba, y que haga 2 cosas:

  • sumar el numero tipeado a "total"
  • hacer saber al bucle si tiene que inicializar (asi se dice?) segun lo sentenciado en él

Entonces quedaria así

[/list]
Código: [Seleccionar]
import java.util.Scanner;

public class SinAsignarBucle {

public static void main (String [] args) { 
int numero=-1;
int total=0;

Scanner teclado=new Scanner (System.in);

System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");

while (numero  !=0){
System.out.print ("Escriba el siguiente numero: ");
numero=teclado.nextInt ();
total+=numero;
}

System.out.println ("El total es "+total);
}



creo que entiendo cual era el problema. ahora, no se si habrá alguna manera mas directa, o simple

Príncipe_Azul

  • Principiante
  • **
  • Mensajes: 71
    • Ver Perfil
    • Foro ArgentinaIRC - Ayuda de Programación General, IRC y mIRC Scripting!
Re:Java - Sumar con bucle y Scanner- Pequeña diferencia entre 2 clases
« Respuesta #3 en: 13 de Noviembre 2014, 08:48 »
Citar
hola Principe

gracias por la respuesta.

lei muchas veces tu respuesta, hasta que por fin entendí xd
hace poco empecé con esto de la programación.

luego probé poniendo y borrando llaves en diferentes partes y me quedó bastante claro.

de paso probé la diferencia entre System.out.print y System.out.println

gracias de nuevo =)

hola amigo!!

Me alegro que lo hayas entendido :) :)

No estoy seguro, pero creo que la diferencia de System.out.print y System.out.println es que, System.out.println deja un salto de línea, de esa manera evitás tener que poner el \n

Esta parte:

Código: [Seleccionar]
int total=0;

Scanner teclado=new Scanner (System.in);
System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");
total+=teclado.nextInt ();
while (teclado.nextInt () !=0){
System.out.print ("Escriba el siguiente numero: ");
total+=teclado.nextInt ();



yo la dejaría así:

Código: [Seleccionar]
Scanner teclado=new Scanner (System.in);
System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");
int total=teclado.nextInt ();
while (teclado.nextInt () !=0){
System.out.print ("Escriba el siguiente numero: ");
total+=teclado.nextInt ();


Quizás no sea posible dejarlo así... Pero habría que probar :P


Citar
pero, creo que el problema seria el siguiente


Código: [Seleccionar]
while (teclado.nextInt () !=0){

cláro, exactamente, ahí está el problema, simplemente, podés dejarlo así:

Código: [Seleccionar]
while (total !=0){ [/quote]

ya que se puede utilizar tranquilamente la variable "total" para almacenar el valor ingresado por consola y como total siempre va a almacenar el valor que escriba el usuario, entónces se hace la comparación que total != 0, y en el caso que lo sea, entónces el bucle se rompe.

Nos vemos amigo!! Buena suerte!! :)

PD: Disculpame, pensé que tu programa era en C#, pero es en Java, es que son tan parecidos que me confundí, disculpame.

LPM

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 35
    • Ver Perfil
Re:Java - Sumar con bucle y Scanner- Pequeña diferencia entre 2 clases
« Respuesta #4 en: 13 de Noviembre 2014, 19:16 »
si! funciona!!!

Código: [Seleccionar]
Scanner teclado=new Scanner (System.in);
System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");
int total=teclado.nextInt ();
while (teclado.nextInt () !=0){
System.out.print ("Escriba el siguiente numero: ");
total+=teclado.nextInt ();

luego probé lo otro:

Código: [Seleccionar]
while (total !=0){
total+=teclado.nextInt ();
          }

si por ejemplo escribo 5, "total" vale 5. el bucle compara "total" con 0. no es igual.

empieza el bucle. quiero escribir 0 para finalizar. pero se va a sumar 0+"total", y 0+5 es 5, con lo que el bucle continua hasta infinito



no se si estuve 1, 2 horas probando esto último. y son solo 2 o 3 sentencias.

pero lo ando disfrutando.

lo que me sorprende es lo mucho que ayuda cambiar ideas, o codigos con alguien mas.

de unas 18 lineas creo que era al principio, ahora quedan 14. supongo que eso ahorra recursos de la pc para ejecutar un programa.

mil gracias, Principe.

---------------

queriendo agregar algo me di cuenta que estaba mal el bucle

Código: [Seleccionar]
Scanner teclado=new Scanner (System.in);
System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");
int total=teclado.nextInt ();
while (teclado.nextInt () !=0){
System.out.print ("Escriba el siguiente numero: ");
total+=teclado.nextInt ();

aca me pide ingresar 2 veces algun numero para solo asignar 1 a la variable

Código: [Seleccionar]
while (total !=0){
aca "total" siempre va a ser mayor que 0, con lo que nunca termina



con lo que esto estaba bien

Código: [Seleccionar]
int numero=-1;//inicia el bucle
int total=0;//asigno una variable para llevar la cuenta

Scanner teclado=new Scanner (System.in);
System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");

while (numero  !=0){
System.out.print ("Escriba el siguiente numero: ");
numero=teclado.nextInt ();//sumará y controlará la condicion dl bucle
total+=numero;//voy sumando lo tipeado

por ahora me rindo xd

queria simplificar el codigo pero no pude. aprendí varias cosas igualmente




« Última modificación: 13 de Noviembre 2014, 22:35 por LPM »

Príncipe_Azul

  • Principiante
  • **
  • Mensajes: 71
    • Ver Perfil
    • Foro ArgentinaIRC - Ayuda de Programación General, IRC y mIRC Scripting!
Re:Java - Sumar con bucle y Scanner- Pequeña diferencia entre 2 clases
« Respuesta #5 en: 14 de Noviembre 2014, 02:06 »
Citar
si por ejemplo escribo 5, "total" vale 5. el bucle compara "total" con 0. no es igual.

empieza el bucle. quiero escribir 0 para finalizar. pero se va a sumar 0+"total", y 0+5 es 5, con lo que el bucle continua hasta infinito

Tienes razón, es cierto, se haría un bucle infinito, no me di cuenta de eso!!



Yo en tu caso, dejaría el código así:

Código: [Seleccionar]
import java.util.Scanner;

public class SinAsignarBucle {

    public static void main (String [] args) { 
        int total=0;

        Scanner teclado=new Scanner (System.in);
        System.out.print ("Escriba un numero. Escribir 0 indica que ha terminado: ");
        total+=teclado.nextInt ();
        for (;;) {
            System.out.print ("Escriba el siguiente numero: ");
            total+=teclado.nextInt ();
            if (total == 0) {
                System.out.println ("El total es "+total);
                break;
            }
        }
    }
}

Quizás te preguntes, ¿Qué es esto:  for (;;) { ?
Simple! un bucle for infinito, esto es muy útil muchas veces, por ejemplo si se necesita recibir y enviar datos constantemente a una conexión.

Y en vez de usar tabulaciones para la identación, yo uso espacios, las tabulaciones me han dado problemas alguna vez, así que me gustan más los espacios, pero vos usá lo que quieras.

Saludos!
« Última modificación: 14 de Noviembre 2014, 02:11 por Principe_Azul »

 

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".