Dúvida de como criar método que verifica validade

Estou estudando algoritmos e fazendo um exercício de lógica. Na parte de lógica até que está indo bem. mas não estou conseguindo criar o método que valida apenas o caracter ‘s’ ou ‘n’. Não se preocupem com o restante do código. Preciso de ajuda pra construir o método verificaOpcao. segue o que eu já fiz.

import java.util.Scanner;

public class Animais{
	public static void main(String args[]){
		char opcao = ' ';
		Scanner leitura = new Scanner(System.in);
		
		System.out.println(" \nEscolha um dentre os possiveis animais: \n "+
		" \nleao, cavalo, homem, macaco, morcego, baleia, avestruz, pinguim," +
		"pato, aguia, tartaruga, crocodilo e cobra\n");
		
		public void verificaOpcao(){
			if(opcao != 's' || opcao != 'n'){ 
				System.out.println("Resposta invalida\n");
				System.out.println("Responda s pra sim ou n para nao!\n");

			}
		}
		
		System.out.println("O animal escolhido e mamifero? ");
		opcao = leitura.next().charAt(0);
		if(opcao == 's'){
			System.out.println("mamifero");
		}

		System.out.println("O animal escolhido e uma ave? ");
		opcao = leitura.next().charAt(0);
		if(opcao == 's'){
			System.out.println("ave");
		}

		System.out.println("O animal escolhido e reptil? ");
		opcao = leitura.next().charAt(0);
		if(opcao == 's'){
			System.out.println("reptil");
		}else{
			System.out.println("O animal escolhido nao esta na lista!");
		}
	}
}

tentei fazer com boolean ao invés de void, mas aí é que eu fiquei confuso mesmo. Help-me. :?:

Para fazer verificação de String, utiliza-se .equals…

[quote=diego.sas]Para fazer verificação de String, utiliza-se .equals…
[/quote]

Ainda não cheguei nessa parte de Strings. Mas o importante pra mim não é a comparação e sim o que eu estou fazendo de errado no método. Se eu coloco void dá erro no construtor, se eu coloco boolean eu não tenho ideia de pra onde ir.
Tentei assim, mas tb não funciona.

public boolean verificaOpcao(char opt){
			if(opt != 's' || opt != 'n'){ 
				System.out.println("Resposta invalida\n");
				System.out.println("Responda s pra sim ou n para nao!\n");
				return false;
			}else{
				return true;
			}
		}
		
		System.out.println("O animal escolhido e mamifero? ");
		opcao = leitura.next().charAt(0);
		verificaOpcao(opcao);
		if(opcao == 's'){
			System.out.println("mamifero");
		}

Boa tarde ksmarini.
Depois que verifiquei que estava comparando char e não String.
Neste caso esta correto a comparação…
Acredito que deveria partir do principio na 1ª Msg…

System.out.println(" \nEscolha um dentre os possiveis animais: \n "+   
        " \nDigite 1 para escolher o leao, Digite 2 para escolher o cavalo...."); // E assim por diante  

Fica mais fácil de saber o animal escolhido…

Após pode utilizar um switch/case para saber qual animal foi escolhido.

Espero ter ajudado.
abraços,

[quote=diego.sas]Para fazer verificação de String, utiliza-se .equals…
[/quote]

Ele está usando char, portanto, a verificação está correta.
ksmarini, o seu problema é o OU (||), o modo como está sendo verificado.

Se tu digitar o ‘s’ ele vai cair no OU do diferente de ‘n’, se tu digitar ‘n’, ele cai no OU do diferente de ‘s’.
Entende? Tu não consegue fugir dessa forma, então, altere assim:

[code]public void verificaOpcao(){
if(opcao != ‘s’ && opcao != ‘n’){
System.out.println(“Resposta invalida\n”);
System.out.println(“Responda s pra sim ou n para nao!\n”);

        }  
    } [/code]

Assim, tu está falando algo como: “se a minha ‘opcao’ for diferente de ‘s’ e diferente de ‘n’, é qualquer outro valor”. Isso funciona, pois, para entrar nessa condição as duas condições impostas pelo AND (&&) tem de ser verdadeira, entende ? Espero ter ajudado.

Abraços.

Boa tarde, não sei se entendi a dúvida …

Então, você está tentando criar o método dentro do método main. Isso não pode.

Coloque seu método verificaOpcao() para fora do bloco do método main.

Lembrando que o método main é static, logo, se você for utilizar o método verificaOpcao() dentro do main, esse também deverá ser static.

[]'s

[quote=alex.brito]Boa tarde, não sei se entendi a dúvida …

Então, você está tentando criar o método dentro do método main. Isso não pode.

Coloque seu método verificaOpcao() para fora do bloco do método main.

Lembrando que o método main é static, logo, se você for utilizar o método verificaOpcao() dentro do main, esse também deverá ser static.

[]'s[/quote]
Não fazia a menor ideia que não podia fazer isso. rs

Mas e a variavel opcao? ela vai ser global? é isso?

[quote=ksmarini][quote=alex.brito]Boa tarde, não sei se entendi a dúvida …

Então, você está tentando criar o método dentro do método main. Isso não pode.

Coloque seu método verificaOpcao() para fora do bloco do método main.

Lembrando que o método main é static, logo, se você for utilizar o método verificaOpcao() dentro do main, esse também deverá ser static.

[]'s[/quote]
Não fazia a menor ideia que não podia fazer isso. rs

Mas e a variavel opcao? ela vai ser global? é isso?[/quote]

Não precisa, você pode fazer seu método verificaOpcao receber e opcao digitada.

Ex:

public static void verificaOpcao(char opcao){
   // seu codigo
} 

é so um detalhe de lógica… teu if quer verificar se o usuário digitou qualquer coisa diferente de S ou N, certo? então voce precisa usar um && no lugar de || como disse o nel

ficaria assim:


// médoto que verifica 
    public boolean verificaOpcao(char opt){  
                if(opt != 's' && opt != 'n'){   
                    System.out.println("Resposta invalida\n");  
                    System.out.println("Responda s pra sim ou n para nao!\n");  
                    return false;  
                }else{  
                    return true;  
                }  
            }  

// --  MAIN --
            System.out.println("O animal escolhido e mamifero? ");  
            opcao = leitura.next().charAt(0);  

            if(verificaOpcao(opcao) == true && opcao == 's'){  
                System.out.println("mamifero");  
            }  

pensando melhor, não haveria necessidade de verificar a opção antes, já que vc só irá mostrar a msg se for igual a S.

[quote=ksmarini][quote=alex.brito]Boa tarde, não sei se entendi a dúvida …

Então, você está tentando criar o método dentro do método main. Isso não pode.

Coloque seu método verificaOpcao() para fora do bloco do método main.

Lembrando que o método main é static, logo, se você for utilizar o método verificaOpcao() dentro do main, esse também deverá ser static.

[]'s[/quote]
Não fazia a menor ideia que não podia fazer isso. rs

Mas e a variavel opcao? ela vai ser global? é isso?[/quote]

Está lhe faltando bastante conhecimento sobre o básico (bem básico) do Java.
E ele é Orientado a Objetos, como deve saber, portanto, deve evitar variáveis globais.

Segue exemplo:

[code]public class Test {

public static void main(String[] args) {
	boolean resultado = Test.valida('j');
	System.out.println(resultado);
}

public static boolean valida(char op) {
	return op == 's' || op == 'n';
}

}[/code]

Nesse caso, o método ‘valida’ pertence a classe e não a uma instancia, por ser estático.
Bem, recomendo a leitura da apostila da Caelum sobre OO, vai lhe ser bem útil.

Abraços.

[quote=alex.brito][quote=ksmarini][quote=alex.brito]Boa tarde, não sei se entendi a dúvida …

Então, você está tentando criar o método dentro do método main. Isso não pode.

Coloque seu método verificaOpcao() para fora do bloco do método main.

Lembrando que o método main é static, logo, se você for utilizar o método verificaOpcao() dentro do main, esse também deverá ser static.

[]'s[/quote]
Não fazia a menor ideia que não podia fazer isso. rs

Mas e a variavel opcao? ela vai ser global? é isso?[/quote]

Não precisa, você pode fazer seu método verificaOpcao receber e opcao digitada.

Ex:

public static void verificaOpcao(char opcao){ // seu codigo } [/quote]

Se eu entendi direito é pra fazer assim:

import java.util.Scanner;

public static void verificaOpcao(char opt){
	if(opt != 's' && opt != 'n'){ 
		System.out.println("Resposta invalida\n");
		System.out.println("Responda s pra sim ou n para nao!\n");
	}
}

public class Animais{
	public static void main(String args[]){
		char opcao = ' ';
		Scanner leitura = new Scanner(System.in);
		
		System.out.println(" \nEscolha um dentre os possiveis animais: \n "+
		" \nleao, cavalo, homem, macaco, morcego, baleia, avestruz, pinguim," +
		"pato, aguia, tartaruga, crocodilo e cobra\n");
		
		System.out.println("O animal escolhido e mamifero? ");
		opcao = leitura.next().charAt(0);
		verificaOpcao(opcao);
		if(opcao == 's'){
			System.out.println("mamifero");
		}

		System.out.println("O animal escolhido e uma ave? ");
		opcao = leitura.next().charAt(0);
		if(opcao == 's'){
			System.out.println("ave");
		}

		System.out.println("O animal escolhido e reptil? ");
		opcao = leitura.next().charAt(0);
		if(opcao == 's'){
			System.out.println("reptil");
		}else{
			System.out.println("O animal escolhido nao esta na lista!");
		}
	}
}

Mas o compilador retorna esse erro:
C:\java>javac Animais.java
Animais.java:3: error: class, interface, or enum expected
public static void verificaOpcao(char opt){
^
Animais.java:6: error: class, interface, or enum expected
System.out.println(“Responda s pra sim ou n para nao!\n”);
^
Animais.java:7: error: class, interface, or enum expected
}
^
3 errors

C:\java>

ksmarini, voce está estudando por algum livro? se quiser postar a questão, podemos te ajudar melhor…

[quote=nel][quote=diego.sas]Para fazer verificação de String, utiliza-se .equals…
[/quote]

Ele está usando char, portanto, a verificação está correta.
ksmarini, o seu problema é o OU (||), o modo como está sendo verificado.

Se tu digitar o ‘s’ ele vai cair no OU do diferente de ‘n’, se tu digitar ‘n’, ele cai no OU do diferente de ‘s’.
Entende? Tu não consegue fugir dessa forma, então, altere assim:

[code]public void verificaOpcao(){
if(opcao != ‘s’ && opcao != ‘n’){
System.out.println(“Resposta invalida\n”);
System.out.println(“Responda s pra sim ou n para nao!\n”);

        }  
    } [/code]

Assim, tu está falando algo como: “se a minha ‘opcao’ for diferente de ‘s’ e diferente de ‘n’, é qualquer outro valor”. Isso funciona, pois, para entrar nessa condição as duas condições impostas pelo AND (&&) tem de ser verdadeira, entende ? Espero ter ajudado.

Abraços. [/quote]
Nel, Valew corrigir o OU e AND, mas ainda não consegui nem compilar meu código depois que coloquei o método. :frowning:
Entender esses tais de métodos tá pior que pensei. rs

na verdade MaYaRa_SaN, estou estudando por um monte de livros, Esse exercício dos animais é de um livro sobre lógica de programação, mas o método tem haver com outra apostila da caelum. Estou praticando os dois pra ver se tinha entendido o conceito dos métodos, mais ainda estou meio perdido. :oops:
Uma hora eu chego lá. rs

Acho que não precisaria fazer todas estas verificações,
switch/case resolveria este exercício

Não Não …

O método deve ficar dentro da classe Animais e fora do método main …

Ex.

    import java.util.Scanner;  
      
        
    public class Animais{  

       public static void verificaOpcao(char opt){  
          if(opt != 's' && opt != 'n'){   
             System.out.println("Resposta invalida\n");  
             System.out.println("Responda s pra sim ou n para nao!\n");  
          }  
        }  

        public static void main(String args[]){  
            char opcao = ' ';  
            Scanner leitura = new Scanner(System.in);  
              
            System.out.println(" \nEscolha um dentre os possiveis animais: \n "+  
            " \nleao, cavalo, homem, macaco, morcego, baleia, avestruz, pinguim," +  
            "pato, aguia, tartaruga, crocodilo e cobra\n");  
              
            System.out.println("O animal escolhido e mamifero? ");  
            opcao = leitura.next().charAt(0);  
            verificaOpcao(opcao);  
            if(opcao == 's'){  
                System.out.println("mamifero");  
            }  
      
            System.out.println("O animal escolhido e uma ave? ");  
            opcao = leitura.next().charAt(0);  
            if(opcao == 's'){  
                System.out.println("ave");  
            }  
      
            System.out.println("O animal escolhido e reptil? ");  
            opcao = leitura.next().charAt(0);  
            if(opcao == 's'){  
                System.out.println("reptil");  
            }else{  
                System.out.println("O animal escolhido nao esta na lista!");  
            }  
        }  
    }  

PS. ksmarini como você disse no começo do tópico, isso é um exercicio / estudo de lógica, certo ? Então, você já está estudando lógica Orientada a Objetos ou lógica Estruturada ??
Enfim, gostaria de deixar só a dica para você também estudar sobre a Programação Orientada a Objetos (POO). Por que isso irá lhe ajudar muito a superar esses primeiros desafios.
Se você continuar a desenvolver em java isso será muito importante.
Dá uma pesquisada aqui no fórum mesmo, tem a apostila da caelum e da k19 sobre POO que são excelentes.

@ficaadica

Boa sorte.

[]'s

Por isso eu disse para ler a apostila da Caelum, em particular, a FJ-11.
Você precisa entender o que é um objeto, depois uma classe para ai sim compreender a utilização de métodos.

Há um detalhe importante, você isolou uma verificação em um método, se fizer o retorno void ao invés de boolean, como vai saber se o usuário digitou um carácter válido ou não ? Você precisa que o método lhe dê algum retorno para que você faça a verificação necessária, se ela for inválida, você pode simplesmente dar um ‘return;’, tendo em vista que o método é void. Isso vai interromper a execução do mesmo.

O seus erros de compilação é porque faltou fechar corretamente alguma chave, dá uma olhada com atenção.
Abraços.

[quote=diego.sas]Acho que não precisaria fazer todas estas verificações,
switch/case resolveria este exercício[/quote]

Concordo, mas eu iria sem continuar a entender como funciona o método que estou estudando. Ficaria sem saber pq não compila, pq tenho que enviar parâmetros (se é que tenho que enviar. rs) e preciso superar os obstáculos. :wink:

entendi… OO não é dos conceitos mais simples de entender mesmo…

os métodos devem ser declarados dentro de classes, e as classes voce pode criar objetos para usar tudo que tem dentro dela.
o JAVA nao permite que voce crie metodos dentro de outros métodos.

o método main é o metodo responsável pelo inicio do teu sistema, é por ele que a JVM vai começar a executar.

eu nao gosto muito da abordagem de alguns livros/apostilas que criam subclasse, então minha sugestão é voce ter 2 classes, uma chamada principal que terá o metodo main e voce fará a “conversa” com o usuário, e outra que verifica se é mamífero.

import java.util.Scanner;


public class Principal {

	public static void main(String args[]){  
        String animal = "";  
        Scanner leitura = new Scanner(System.in);  
        VerificaAnimal verif = new VerificaAnimal(); //aqui voce cria um obj da outra classe para usar os métodos dentro dela.
          
        System.out.println(" \nEscolha um dentre os possiveis animais: \n "+  
        " \nleao, cavalo, homem, macaco, morcego, baleia, avestruz, pinguim," +  
        "pato, aguia, tartaruga, crocodilo e cobra\n");  
          
        System.out.println("Informe o nome do animal ");  
        animal = leitura.next();  
        
        String msg = verif.verificaAnimal(animal);  
        
        System.out.println(msg);
        
    }  
	
}
public class VerificaAnimal {

	public String verificaAnimal(String animal) {
		String msg = "";
	
		if (animal.equals("leao") || animal.equals("cavalo")
				|| animal.equals("macaco") || animal.equals("morcego")
				|| animal.equals("baleia")) {
			msg = "O animal escolhido é um mamifero!";
			
		} else if (animal.equals("avestruz") || animal.equals("pinguim")
				|| animal.equals("pato") || animal.equals("aguia")) {
			msg = "O animal escolhido é uma ave!";
			
		} else if (animal.equals("tartaruga") || animal.equals("crocodilo")
				|| animal.equals("cobra")) {
			msg = "O animal escolhido é um reptil!";
			
		} else {
			msg = "O animal escolhido nao esta na lista!";
			
		}

		return msg;
	}

}

PS: escrevi rapidinho e nao teste… se der erro avisa!

Pessoal, muito obrigado. Vou tentar desenvolver com as dicas apresentadas e procurar mais material na net. acho que até amanhã eu posto as novidades. Muito obrigado mesmo.