[Resolvido] Que tipo de REPETIÇÃO usar?

29 respostas
quil

Eu queria que após o alguém inserir um número maior que [color=blue]10[/color] aparece uma mensagem, pedindo para que ele entre com um valor
menor que 10. E essa mensagem só pararia de aparecer quando ele digitasse um valor menor que [color=blue]10[/color]

import javax.swing.JOptionPane;

public class MenorQueDez {

    public static void main(String[] args) {

        String nota;



        nota = JOptionPane.showInputDialog(null, "Digite um número de um a Dez");

        int note = Integer.parseInt(nota);
//Aqui esta fazendo um "Casting " para passar uma string digitada pelo usuário
//para um int.
//while(note > 10){


//}

        if (note > 10) {
            JOptionPane.showMessageDialog(null, "Digite um número abaixo de Dez! ");


        }
        
        if (note < 10) {
            JOptionPane.showMessageDialog(null, "O número digitado é: " + note);
//Para que apareça uma mensagem e um valor int você deve cocatenar o que você
//deseja.

        }


        System.out.println(note);

    }
}

Eu sou muito leigo ainda nessa coisa de repetição em java, eu até tentei usar o While mas não tive muito sucesso então o deixei comentado, alguém poderia me ajudar dizendo como eu faço para conseguir que esse programa execute do jeito que eu gostaria.

29 Respostas

d34d_d3v1l

Olha,

geralmente seguidos o seguinte paradigma:

Quando sabemos exatamente quantas vezes o loop (laço de repetição) for executar, nós usamos o for
for (inicialização ;  condição ; incremento ) {

}
E quando não sabemos, usamos o while
while ( condição ){
  
}

Espero ter ajudado. :D

JhowTroMundo

Use um Do While.

crie sua variavel antes do DO e leia o valor dentro do DO. Na condição dentro do WHILE faça variavel>=10

int variavel = 0;
do{
//le variavel
while(variavel>=10);
d34d_d3v1l

JhowTroMundo, você está ensinando errado. Não leu o que eu disse?
kkkkkkkk

É por esse motivo que não se deve colocar break; dentro de um for.
:slight_smile:

Por que o for vc sabe quantas vezes vai repetir.

O While (do while e etc e tal) não sabem…

Rodrigo_Sasaki

d34d_d3v1l:
JhowTroMundo, você está ensinando errado. Não leu o que eu disse?
kkkkkkkk

É por esse motivo que não se deve colocar break; dentro de um for.
:slight_smile:

Por que o for vc sabe quantas vezes vai repetir.

O While (do while e etc e tal) não sabem…

não entendi o problema… do jeito que o laço dele está formado, o bloco será executado um numero indefinido de vezes… só vai sair do laço quando o número digitado for menor do que 10…

eu achei o seu jeito de ensinar mais educativo, não gosto muito de respostas dadas assim…
mas o código está correto, não está?

nel

digaoneves:
d34d_d3v1l:
JhowTroMundo, você está ensinando errado. Não leu o que eu disse?
kkkkkkkk

É por esse motivo que não se deve colocar break; dentro de um for.
:slight_smile:

Por que o for vc sabe quantas vezes vai repetir.

O While (do while e etc e tal) não sabem…

não entendi o problema… do jeito que o laço dele está formado, o bloco será executado um numero indefinido de vezes… só vai sair do laço quando o número digitado for menor do que 10…

eu achei o seu jeito de ensinar mais educativo, não gosto muito de respostas dadas assim…
mas o código está correto, não está?

Sim, o código funciona como foi citado, usando o do…while(condição).
Não vi problema algum, nesse caso.

E o breaker, pode sim, ser utilizado em um while, para um tratamento particular.
Mas para o seu caso, não vejo essa necessidade.

Abraços.

JhowTroMundo

d34d_d3v1l:
JhowTroMundo, você está ensinando errado. Não leu o que eu disse?
kkkkkkkk

É por esse motivo que não se deve colocar break; dentro de um for.
:slight_smile:

Por que o for vc sabe quantas vezes vai repetir.

O While (do while e etc e tal) não sabem…

Você está equivocado, moço :wink:

com break ficaria algo do tipo:

int variavel = 0;
while (true){
//ler variavel
if(variavel<10)
break;
System.out.println("Digite um valor menor do que dez");
}

Ou mesmo mudando o valor do boolean

int variavel = 0;
boolean isMaiorQueDez = true;
while (isMaiorQueDez ){
//ler variavel
if(variavel<10)
isMaiorQueDez = false
}

Há várias formas de se fazer o proposto e cabe ao programador escolher qual gambiarra melhor lhe apráz. Lembre-se de que o modo com que você trata um loop pode definir se você é ou não contratado num teste.

Por que vou fazer um if pra definir o ponto de parada dentro do laço se o próprio laço verifica essa condição?

Rodrigo_Guedes

Use While.

Abraço!

d34d_d3v1l

Amigo JhowTroMundo,

estou me referindo a BREAK dentro de um FOR.
Não é uma boa prática, pois o for foi ‘criado’ com a intenção de repetir um numero x de vezes.
Ou seja, um laço que vai de 1 a x.

O while pode executar de 0 a infinitas vezes…

São questões teoricas quando se aprende programação.
Se voces nunca ouviram falar sobre isso, então beleza,
pensem no jeito mais prático e usual das coisas… Se tiver um pouco mais de
mente aberta, pode aceitar o que estou falando e aprender algo novo.

Se não, continuem com suas vidas pensando que o que eu estou falando é bobagem.
Isso não fará a mínima diferença em minha vida.

Meu intuito é apenas ajudar.
Abraços.

nel

d34d_d3v1l:
Amigo JhowTroMundo,

estou me referindo a BREAK dentro de um FOR.
Não é uma boa prática, pois o for foi ‘criado’ com a intenção de repetir um numero x de vezes.
Ou seja, um laço que vai de 1 a x.

O while pode executar de 0 a infinitas vezes…

São questões teoricas quando se aprende programação.
Se voces nunca ouviram falar sobre isso, então beleza,
pensem no jeito mais prático e usual das coisas… Se tiver um pouco mais de
mente aberta, pode aceitar o que estou falando e aprender algo novo.

Se não, continuem com suas vidas pensando que o que eu estou falando é bobagem.
Isso não fará a mínima diferença em minha vida.

Meu intuito é apenas ajudar.
Abraços.

Acalme-se e tenha a mente aberta. Não se pode dizer que não é boa pratica, pois discordo, já que não é 100% dos casos que não se deve aplicar o break.
Você pode ter uma situação em que, dada um certo momento, você deve realizar um break, ou seja, “quebrar” o seu laço de repetição.

Sendo assim, é questão de ponto de vista.
Abraços amigo.

JhowTroMundo

d34d_d3v1l:
Amigo JhowTroMundo,

estou me referindo a BREAK dentro de um FOR.
Não é uma boa prática, pois o for foi ‘criado’ com a intenção de repetir um numero x de vezes.
Ou seja, um laço que vai de 1 a x.

O while pode executar de 0 a infinitas vezes…

São questões teoricas quando se aprende programação.
Se voces nunca ouviram falar sobre isso, então beleza,
pensem no jeito mais prático e usual das coisas… Se tiver um pouco mais de
mente aberta, pode aceitar o que estou falando e aprender algo novo.

Se não, continuem com suas vidas pensando que o que eu estou falando é bobagem.
Isso não fará a mínima diferença em minha vida.

Meu intuito é apenas ajudar.
Abraços.

Igualmente.

Entenda que um for não é a melhor escolha para o nosso amigo, pois ele não sabe quantas vezes o usuário vai tentar digitar um número inválido (Entenda a duvida antes de responderum tópico). Nao vejo o por quê dos seus argumentos. Não se sinta magoado. Eu também me equivoco em minhas respostas quando não presto atenção.

break é boa pratica quando realmente precisa-se dele. Nesse caso, seria uma gambiarra. O while ‘PODE’ executar infinitas vezes. Nesse c´so ele só vai ser executado quantas vezes eu quiser que ele seja, que é o numero de vezes em que o usuário entrar com um valor acima de 10. Vai da (má) lógica de cada um. Se isso acontece com frequencia com você, não é culpa minha e não sou eu que preciso aprender “algo novo”.

Se você percebeu, aconselhei um DO WHILE, e não um WHILE. Qual a diferença?

Eu não disse que o que você está falando é bobagem, só quis dizer que nao se aplica ao caso, e acho muito difícil achar alguem mais indiferente do que eu.

Se seu intuito é apenas ajudar, o meu também é. Caso contrário, não estaria aqui.
A gente ainda pode se ajudar um dia.

Abraço.

L

hihih já vão começar a discutir!

nel

Se for com educação e inteligência, é a melhor coisa.
Isso é algo que eu gosto nesse fórum, só nos ajuda a crescer :slight_smile:

Basta que saiba filtras as informações, certo?
Abraços.

JhowTroMundo

kkkkk

Quer entrar na roda??
:twisted:
:lol:

d34d_d3v1l

kkkkk…

Tudo certo então…
Desculpe se meu post ficou meio agressivo…

Um abraço…

quil

Eu tentei usar o "do . While " mas não tive nenhum progresso com isso, então eu usei o while e o programam fica repetindo infinitamente a parte do if em que diz " Digite um número de um a Dez " mas eu não quero que ele fique repetindo essa mensagem sem o usuário poder fazer nada, eu quero que o programa mostre essa mensagem e depois que o usuário possa entrar com um novo valor e após ele entrar com um valor abaixo de DEZ ele pare caso contraio ele continue pedindo para o usuário digitar um número infinitamente até que o usário digite um número menor que DEZ. :twisted: :twisted: :twisted:

import javax.swing.JOptionPane;

public class MenorQueDez {

    public static void main(String[] args) {

        String nota;



        nota = JOptionPane.showInputDialog(null, "Digite um número de um a Dez" , " Digite um número de um a Dez" , JOptionPane.INFORMATION_MESSAGE );

        int note = Integer.parseInt(nota);
//Aqui esta fazendo um "Casting " para passar uma string digitada pelo usuário
//para um int.

while(note > 10){




        if (note > 10) {
            JOptionPane.showMessageDialog(null, "Digite um número abaixo de Dez! ");


        }
        
        if (note < 10) {
            JOptionPane.showMessageDialog(null, "O número digitado é: " + note);
//Para que apareça uma mensagem e um valor int você deve cocatenar o que você
//deseja.

        }


        System.out.println(note);

    }
}

}
quil

Opá Double Post.

Será que alguém poderia dar uma ajudinha.

Anime

Oi,

Da uma olhada aqui, por favor…http://javanoroeste.com.br/javanoroeste/aula_04/aula_04.pdf

Segue um exemplo, mas se não entender a lógica, não adianta nada… :roll:

import java.io.*;
class P41
{
	public static void main(String args[])
	{
		DataInputStream d;
		String s;
		int num=-1;
		try
		{
			while(num<0 || num>10)
			{
				System.out.println("Digite um numero de 0 a 10");
				d=new DataInputStream(System.in);
				s=d.readLine();
				num=Integer.parseInt(s);
				 if (num<0 || num>10)
				 System.out.println("Numero invalido \n");
		    }//Fim do while
		}//Fim do try
		catch(IOException e)
 		{
 			System.out.println("Erro na entrada de dados");
 		}
		catch(NumberFormatException e)
		{
			System.out.println("Erro na entrada de dados");
		}
    }//Fim do main
}//Fim do class
luizfelipetx

concordo com o amigo Jhow tmb…

abcs

Vingdel

Bom Dia!!!

Eu faria assim:
import javax.swing.*;

public class aa{
	public static void main(String[] args){
		String nota;
		int num;
		boolean blz = false;

			do{

				nota = JOptionPane.showInputDialog(null, "Digite um número de 1 a 10" , "Entrada..." , JOptionPane.INFORMATION_MESSAGE );
				try{
					num = Integer.parseInt(nota);
					if(num > 10 || num < 0){
						System.out.println("O numero "+num+" nao esta entre 1 e 10");
					}else{
						blz = true;
					}
				}catch(NumberFormatException e){
					System.out.println("Voce precisa digitar um numero");
				}

			}while(!blz);
			System.out.println("O numero "+nota+" esta OK");
	}
}
Veja se atende o que você precisa.

Qualquer dúvida, sinta-se a vontade para perguntar.

Abraço!

nel

rsrs…desculpe, uma variavél chamada “blz” foi ótimo.
Mas concordo, isso resolve seu problema!

Abraços.

Vingdel

nel:
rsrs…desculpe, uma variavél chamada “blz” foi ótimo.
Mas concordo, isso resolve seu problema!

Abraços.

Hehe. Eu até imaginei que a variavel blz soaria estranho, apesar de entrar no contexto, mas achei na verdade que haveria outros questionamentos, tipo try/catch dentro do while (causa polêmica) e o último println que usa a variável nota em vez da num.

Mas é isso ae… Abraço!

nel

Vingdel:
nel:
rsrs…desculpe, uma variavél chamada “blz” foi ótimo.
Mas concordo, isso resolve seu problema!

Abraços.

Hehe. Eu até imaginei que a variavel blz soaria estranho, apesar de entrar no contexto, mas achei na verdade que haveria outros questionamentos, tipo try/catch dentro do while (causa polêmica) e o último println que usa a variável nota em vez da num.

Mas é isso ae… Abraço!

Não vejo problema/polêmica para um try-catch em um While nesse caso. É algo “simples” e um tratamento básico de número.
Ele até poderia usar um regex (algo como [0-9]) e testar se é verdadeiro isso, caso não fosse, não seria um número válido.

Sobre os nomes dados as variavéis, foi apenas um exemplo de como resolver o problema, e resolveu.
Depois, ele escolhe os nomes adequados, certo?

Abraços amigo.

Vingdel

O polemico que digo é quanto a usar o try/catch dentro ou fora do loop, uns defendem o uso fora já outros defendem o uso dentro do loop. Nesse caso aí, incusive, a variável blz foi um recurso que tive que adotar devido ao tratamento da exceção, pois se eu não fosse trata-la eu simplesmente poderia usar como condição para o while num < 10. Já caso eu utilizasse o do/while dentro do try eu teria que fazer de outra forma.

Agora quanto ao uso da variável, usei nota no último println pelo mesmo motivo de eu ter criado a variável blz, pois se eu usasse num iria dar erro. Por ela estar sendo inicializada dentro do try.

Veja o erro:C:\Users\Delano\Desktop>javac aa.java aa.java:24: variable num might not have been initialized System.out.println("O numero "+num+" esta OK"); ^

Você conseguiu perceber isso?

nel

Vingdel:
O polemico que digo é quanto a usar o try/catch dentro ou fora do loop, uns defendem o uso fora já outros defendem o uso dentro do loop. Nesse caso aí, incusive, a variável blz foi um recurso que tive que adotar devido ao tratamento da exceção, pois se eu não fosse trata-la eu simplesmente poderia usar como condição para o while num < 10. Já caso eu utilizasse o do/while dentro do try eu teria que fazer de outra forma.

Agora quanto ao uso da variável, usei nota no último println pois se eu usasse num iria dar erro. Por ela estar dentro do try.

Veja o erro:C:\Users\Delano\Desktop>javac aa.java aa.java:24: variable num might not have been initialized System.out.println("O numero "+num+" esta OK"); ^

Você conseguiu perceber isso?

Ah claro, é isso que refere-se.
O try-catch cria um novo bloco de código, por isso não reconhece a variavél e etc.
Sim, teria de alterar a lógica nesse caso.

Vingdel

Hummm, não... não é o caso de escopo, se é isso que vc quis dizer, pois a variavel num é uma variável da classe então ela existe em toda classe. O que eu entendo desse erro é que o try pode passar ou não, então se ela é inicializada somente dentro do try o valor dela é incerto.

Digamos que o meu código fosse assim:
import javax.swing.*;

public class aa{
	public static void main(String[] args){
		String nota;
		//int num;
		boolean blz = false;

			do{ int num;

				nota = JOptionPane.showInputDialog(null, "Digite um número de 1 a 10" , 

"Entrada..." , JOptionPane.INFORMATION_MESSAGE );
				try{
					num = Integer.parseInt(nota);
					if(num > 10 || num < 0){
						System.out.println("O numero "+num+" nao esta entre 1 e 10");
					}else{
						blz = true;
					}
				}catch(NumberFormatException e){
					System.out.println("Voce precisa digitar um numero");
				}

			}while(!blz);
			System.out.println("O numero "+num+" esta OK");
	}
}
Aí sim o problema seria de escopo, pois a variável pertence somente ao do/while. E o erro seria:
C:\Users\Delano\Desktop>javac aa.java
aa.java:24: cannot find symbol
symbol  : variable num
location: class aa
                        System.out.println("O numero "+num+" esta OK");
                                                       ^

Entende?

JhowTroMundo
quil:
Eu tentei usar o "do . While " mas não tive nenhum progresso com isso, então eu usei o while e o programam fica repetindo infinitamente a parte do if em que diz " Digite um número de um a Dez " mas eu não quero que ele fique repetindo essa mensagem sem o usuário poder fazer nada, eu quero que o programa mostre essa mensagem e depois que o usuário possa entrar com um novo valor e após ele entrar com um valor abaixo de DEZ ele pare caso contraio ele continue pedindo para o usuário digitar um número infinitamente até que o usário digite um número menor que DEZ. :twisted: :twisted: :twisted:
import javax.swing.JOptionPane;

public class MenorQueDez {

    public static void main(String[] args) {

        String nota;



        nota = JOptionPane.showInputDialog(null, "Digite um número de um a Dez" , " Digite um número de um a Dez" , JOptionPane.INFORMATION_MESSAGE );

        int note = Integer.parseInt(nota);
//Aqui esta fazendo um "Casting " para passar uma string digitada pelo usuário
//para um int.

while(note > 10){




        if (note > 10) {
            JOptionPane.showMessageDialog(null, "Digite um número abaixo de Dez! ");


        }
        
        if (note < 10) {
            JOptionPane.showMessageDialog(null, "O número digitado é: " + note);
//Para que apareça uma mensagem e um valor int você deve cocatenar o que você
//deseja.

        }


        System.out.println(note);

    }
}

}

Atenção na lógica.

Exemplo em que o unico ponto de parada é uma nota válida de 0 a 10:

public int getNota(){				
		while(true){
			String notaString = JOptionPane.showInputDialog("Digite uma nota");			
			if(notaString != null 
					&& !notaString.equals("") 
					&& notaString.matches("[0-9]{"+notaString.length()+"}")
					&& Integer.parseInt(notaString)<=10){				
				return Integer.parseInt(notaString);			
			}
			JOptionPane.showMessageDialog(null, "Nota Inválida");
		}
	}
JhowTroMundo

Post duplicado.

nel
Vingdel:
Hummm, não... não é o caso de escopo, se é isso que vc quis dizer, pois a variavel num é uma variável da classe então ela existe em toda classe. O que eu entendo desse erro é que o try pode passar ou não, então se ela é inicializada somente dentro do try o valor dela é incerto. Digamos que o meu código fosse assim:
import javax.swing.*;

public class aa{
	public static void main(String[] args){
		String nota;
		//int num;
		boolean blz = false;

			do{ int num;

				nota = JOptionPane.showInputDialog(null, "Digite um número de 1 a 10" , 

"Entrada..." , JOptionPane.INFORMATION_MESSAGE );
				try{
					num = Integer.parseInt(nota);
					if(num > 10 || num < 0){
						System.out.println("O numero "+num+" nao esta entre 1 e 10");
					}else{
						blz = true;
					}
				}catch(NumberFormatException e){
					System.out.println("Voce precisa digitar um numero");
				}

			}while(!blz);
			System.out.println("O numero "+num+" esta OK");
	}
}
Aí sim o problema seria de escopo, pois a variável pertence somente ao do/while. E o erro seria:
C:\Users\Delano\Desktop>javac aa.java
aa.java:24: cannot find symbol
symbol  : variable num
location: class aa
                        System.out.println("O numero "+num+" esta OK");
                                                       ^

Entende?

Exatamente por ser incerto, é que ela não pode ser inicializada no try-catch, perfeito. Era isso que eu me referia mas me expressei erroneamente.
Afinal, a exceção pode ocorrer na primeira linha do try-catch e poderia nem mesmo iniciar um valor a variavél em questão.

Abraços!

quil

Eu só vim aqui para dizer que consegui resolver esse problema utilizando o " while ", como desde o inicio eu já vinha querendo utiliza-lo
finalmente eu consegui, e agradeço a todos que tentaram me ajudar também Veleu pessoal .
Agora vejam a gambiarra que eu fiz para conseguir o que eu queria. :twisted: :twisted: :twisted:

//agora sim o programa esta cem por cento.

import javax.swing.JOptionPane;


public class Gula

{

public static void main(String[] args )

{

String gula;

gula = JOptionPane.showInputDialog(null,"Digite um numero Menor que Dez:  ", "primeiro Box",JOptionPane.INFORMATION_MESSAGE );
int gul = Integer.parseInt(gula);
//Aqui  esta fazendo um casting para converter uma string para um numero inteiro.

if (gul > 10  )


{


 while (gul > 10)
//Enquanto o usuário digitar um número maior que Dez, o while continuara a executar um
//loop ate que o usuário digite um número menor que Dez.
 {

 String gule = JOptionPane.showInputDialog(null, "Digite um numero menor que Dez: ", "segundo Box", JOptionPane.INFORMATION_MESSAGE);

 int gulu = Integer.parseInt(gule);
  


if (gulu < 10 )
//Quando o usuário digitar um número menor que Dez esse if exibira uma mensagem
//dizendo qual foi o número digitado.
{

JOptionPane.showMessageDialog(null, "O numero que digitastes foi: " +  gulu );

break;
//Esse break não deixa o while continuar a executar loops quando a instrução se tornar
//verdadeira.
}

 }

    }



if (gul < 10 )
//Se o usuário digitar um número menor que Dez essa instrução é executada sem passar
//pelo while.
{

JOptionPane.showMessageDialog(null, "O numero que digitastes foi: " +  gul );



}



System.out.println("Fulmetal alchemist");


    }
}
Criado 6 de junho de 2011
Ultima resposta 14 de jun. de 2011
Respostas 29
Participantes 10