Erro comparação com Retorno

Galera, estou com uma dúvida sobre um exercício que eu tenho que fazer, a dúvida é a seguite.

Tenho um método confirmar() que foi chamado por outro método, nele eu digito “s” pra sim ou “n” pra não, caso eu digite “s” eu quero que retorne true, caso eu digite “n” eu quero que retorne false, mas aparentemente não está retornando nada…eu fiz um teste retornando true independente se eu digitar “s” ou “n” e vai normal…gostaria de saber qual o problema, vou mandar o método pra ficar mais facil a visualização.

public boolean confirma(String msg) throws IOException { char opcao; System.out.println("\n" + msg); do{ opcao = (char) System.in.read(); } while((opcao == 's') || (opcao == 'n')); if(opcao == 's') return true; else return false; }

Outra pergunta, tem como eu passar o que foi digitado pra minúsculo ?? Eu sei que no caso de String eu posso usar o toLowerCase(), mas e no caso de char ???

Vlw Galera.

[code]public boolean confirma(String msg) throws IOException {
char opcao;
char aux;
System.out.println("\n" + msg);
do{
opcao = (char) System.in.read();
aux = Character.toLowerCase(opcao)
} while((aux != ‘s’) || (aux != ‘n’));

    if(aux == 's')   
        return true;   
    else   
        return false;   

}[/code]

Oi, veja se isso te ajuda.
Tem o Character.toUpperCase(), Character.isUpperCase() e por ai adiante. Veja a classe Character.

Eu coloquei o != ‘s’ porque se forem == você está dizendo que enquanto o usuário digitar ‘s’ ou ‘n’ ele permanece no loop, era isso mesmo?
Tente como fiz ali.

Abraços.

O erro está no teu do/while. Ele ficará ali para sempre, até que você digite algo diferente de s ou n

char opcao;   
        System.out.println("\n" + msg);   
        do{   
            opcao = (char) System.in.read();   
        }   
        while((opcao == 's') || (opcao == 'n'));   
        if(opcao == 's')   
            return true;   
        else   
            return false;   

E o Character possui o método toLowerCase sobrecarregado com int e char como argumentos.

Da uma olhada na minha resposta logo acima que editei ela, arrumei o método porque esqueci de substituir a variavél :slight_smile:

eu coloquei aqui tudo certinho, mas não está saindo do looping…se eu colocar o == ele sai mas chama o método errado, isso se eu usar o if, se eu usar o == e tirar o if vai certo mas quando eu digitar “n” não é pro método que chamou continuar…

eu tenho um modelo desse método em português estruturado, ajuda se eu mandar ele ? as vezes eu posso ter feito alguma coisa errado…

Não, manda o seu código JAVA com as alterações.
Recomendo que use o System.out.println() e imprima o valor digitado do char, para ver se está efetuando a leitura corretamente.

Abraços.

Pronto, o método main tbm está nessa classe, coloquei ai pra não mandar mais um arquivo com 1/2 duzia de linhas.

Java != Javascript

Em Javascript você compara 2 strings com “==”

Em Java você usa .equals

Exemplo 1:

if ("s".equals (resposta.toLowerCase()) {
 ....
}

[quote=entanglement]Java != Javascript

Em Javascript você compara 2 strings com “==”

Em Java você usa .equals

Exemplo 1:

if ("s".equals (resposta.toLowerCase()) { .... } [/quote]

Concordo perfeitamente, mas até o momento está usando char, sendo assim está correto o ‘==’.

[code]public boolean confirma(String msg)throws IOException{
char opcao;
char aux;
System.out.println("\n" + msg);
do {
opcao = (char) System.in.read();
System.out.println("Opcao: " + opcao);
aux = Character.toLowerCase(opcao);
System.out.println("Aux: " + aux);
} while((aux != ‘s’) || (aux != ‘n’));

	if(aux == 's')
        return true;
    else
        return false;
}[/code]

Veja qual será o valor apresentado no console. Obviamente, a diferença é que um vai sair como foi digitado e o outro, com o mesmo valor mas em minusculo.

Testei aqui, as variaveis estão recebendo o valor corretamente mas não está saindo do laço.

Analisando bem o teu while, pude verificar o seguinte:

Como você está utilizando o operando || (ou) sempre que UM ou OUTRO ou AMBOS vier a ser verdade, o laço continuará.

Como você lê um char, que é apenas um, a condição do while jamais é satisfeita.
Por quê?

Simples:
Case ‘s’:
primeira parte do while é verdadeira, pode seguir.
segunda parte do while é falsa, continua no laço.
break;
Case ‘n’:
primeira parte do while é falsa, continua no laço.
nem verifica a segunda.
break;

Isso tanto para

... while((aux != 's') || (aux != 'n'));
quanto para

... while((aux == 's') || (aux == 'n'));
O que apenas inverteria a ordem, mas a lógica seria a mesma.

Sendo assim, o uso de || se torna incorreto para a solução desejada.
É preciso trocar por um operando cuja tabela verdade seja verdadeira para ambas as expressões.
Como estamos trabalhando com while, consideramos que o laço será repetido enquanto a condição aux != ‘s’ for verdadeira (ou seja, aux seja diferente de ‘s’ e, ao mesmo tempo, aux != ‘n’, portanto, aux diferente de ‘n’.
Somente o operador lógico AND, representado no java por && possui tal característica.
Para ilustrar:

O1 O2  Saída
V   V    V
F   V    F
V   F    F
F   F    F 

O que quer dizer que somente

while (aux != 's' && aux != 'n');

e Jesus salvam.

Analisando bem o teu while, pude verificar o seguinte:

Como você está utilizando o operando || (ou) sempre que UM ou OUTRO ou AMBOS vier a ser verdade, o laço continuará.

Como você lê um char, que é apenas um, a condição do while jamais é satisfeita.
Por quê?

Simples:
Case ‘s’:
primeira parte do while é verdadeira, pode seguir.
segunda parte do while é falsa, continua no laço.
break;
Case ‘n’:
primeira parte do while é falsa, continua no laço.
nem verifica a segunda.
break;

Isso tanto para

... while((aux != 's') || (aux != 'n'));
quanto para

... while((aux == 's') || (aux == 'n'));
O que apenas inverteria a ordem, mas a lógica seria a mesma.

Sendo assim, o uso de || se torna incorreto para a solução desejada.
É preciso trocar por um operando cuja tabela verdade seja verdadeira para ambas as expressões.
Como estamos trabalhando com while, consideramos que o laço será repetido enquanto a condição aux != ‘s’ for verdadeira (ou seja, aux seja diferente de ‘s’ e, ao mesmo tempo, aux != ‘n’, portanto, aux diferente de ‘n’.
Somente o operador lógico AND, representado no java por && possui tal característica.
Para ilustrar:

O1 O2  Saída
V   V    V
F   V    F
V  F     F
F   F    F 

O que quer dizer que somente

while (aux != 's' && aux != 'n');

e Jesus salvam.[/quote]

Perfeita a explicação. Eu não me atentei ao caso do || e a tabela verdade.

Puts… agente quebrando a cabeça e era uma coisa tão simples…testei aqui e funcionou perfeitamente.

Vlw pela ajuda gente, vivendo e aprendendo… =].