Valor de sentinela (while)

Olá!
Você poderiam me dá um exemplo de como funciona o valor de sentinela (while) ?

[quote=hackum]Olá!
Vocês poderiam me dá um exemplo de como funciona o valor de sentinela (while) ?
[/quote]

sentinela?

Exato!
Repetição controlada por sentinela.
Será se alguem poderia me ajudar ?

sentinela? x-man?

hackum,
explica-se melhor kra!
da onde vc tirou esse ‘sentila’ ?
pelomenos aqui em java, n usamos este termo para estrutura de repetição WHILE

nao seria a verificação true ou false n?

por exemplo:

[code]int contador = -1;

while(contador != 0){

}[/code]

Sou iniciante em Java, estou falando na lingua do livro “Java como programar”, foi ele que me disse isso. Veja: Formulando algoritmos: repetição contrada por sentinela

Desenvolva um programa para tirar a média da classe que processe s notas de acordo com um número arbitrário de alunos toda vez que é executado.

Código:

// Fig. 4.9: GradeBook.java
// Classe GradeBook que resolve o programa da média da classe utilizando
// repetição controlado por sentinela.
import java.util.Scanner; // programa utiliza a classe Scanner

public class GradeBook 
{
   private String courseName; // nome do curso que essa GradeBook representa

   // construtor inicializa courseName
   public GradeBook( String name )
   {
      courseName = name; // inicializa courseName
   } // fim do construtor

   // método para configurar o nome do curso
   public void setCourseName( String name )
   {
      courseName = name; // armazena o nome do curso
   } // fim do método setCourseName

   // método para recuperar o nome do curso
   public String getCourseName()
   {
      return courseName;
   } // fim do método getCourseName

   // exibe uma mensagem de boas-vindas para o usuário GradeBook
   public void displayMessage()
   {
      // getCourseName obtém o nome do curso
      System.out.printf( "Welcome to the grade book for\n%s!\n\n", 
         getCourseName() );
   } // fim do método displayMessage

   // determina a média de um número arbitrário de notas
   public void determineClassAverage()
   {
      // cria Scanner para obter entrada a partir da janela de comando
      Scanner input = new Scanner( System.in );

      int total; // soma das notas
      int gradeCounter; // número de notas inseridas
      int grade; // valor da nota
      double average; // número com ponto de fração decimal para a média

      // fase de inicialização
      total = 0; // inicializa o total
      gradeCounter = 0; // inicializa o contador de loops
      
      // fase de processamento
      // solicita entrada e lê a nota do usuário
      System.out.print( "Enter grade or -1 to quit: " );
      grade = input.nextInt();                          

      // faz um loop até ler o valor de sentinela inserido pelo usuário
      while ( grade != -1 ) 
      {
         total = total + grade; // adiciona grade a total
         gradeCounter = gradeCounter + 1; // incrementa counter

         // solicita entrada e lê a próxima nota fornecida pelo usuário
         System.out.print( "Enter grade or -1 to quit: " );
         grade = input.nextInt();                          
      } // fim do while

      // fase de término
      // se usuário inseriu pelo menos uma nota...
      if ( gradeCounter != 0 ) 
      {
         // calcula a média de todas as notas inseridas
         average = (double) total / gradeCounter;  

         // exibe o total e a média (com dois dígitos de precisão)
         System.out.printf( "\nTotal of the %d grades entered is %d\n", 
            gradeCounter, total );
         System.out.printf( "Class average is %.2f\n", average ); 
      } // fim do if
      else // nenhuma nota foi inserida, assim gera a saída da mensagem apropriada
         System.out.println( "No grades were entered" ); 
   } // fim do método determineClassAverage

} // fim da classe GradeBook
// Fig. 4.10: GradeBookTest.Java
// Cria o objeto da classe GradeBook e invoca seu método determineClassAverage

public class GradeBookTest
{
   public static void main( String args[] )
   {
      // cria o objeto myGradeBookda classe GradeBook e
      // passa o nome de cursor para o construtor
      GradeBook myGradeBook = new GradeBook( 
         "CS101 Introduction to Java Programming" );

      myGradeBook.displayMessage(); // exibe a mensagem welcome
      myGradeBook.determineClassAverage(); // encontra a média das notas
   } // fim de main

} // fim da classe GradeBookTest

Desculpe, enviei dois tópicos seguidos contendo as mesmas informações.

Pois é cara ao meu ver esse sentinela ai cujo nome nunca vi deve ser a verificaçao dentro do while mesmo mas “true ou false” simples.

Ah, entendi. Ele chama de sentinela a condição.

Ok, você simplesmente coloca uma condição no while para que o código se repita. Por exemplo:

public class InfladorDeEgo { public static void main(String args[]) { Scanner in = new Scanner(System.in); System.out.println("Você é o melhor! Diga "Eu sou o melhor" para sair!"); String sentinela = in.nextLine(); while (!sentinela.equalsIgnoreCase("Eu sou o melhor")) { System.out.println("Você é o melhor! Diga \"Eu sou o melhor\" para sair!"); String sentinela = in.nextLine(); } } }

Olá Everton!
É exatamente isso, é pq estou estudando pelo livro do Java como programar, ele não me disse nada de true ou false, simplesmente deu o nome de valor de sentinela. E eu não estou consiguindo compreender como está no código a qual eu passei logo acima. Será se você poderia me dá um exemplo de como funciona o while false ou true ? Parece que o deitel complicou um pouco nesse ensinamento.

Olá ViniGody

Não consigui compreender o códico que você colocou.
No caso você colocou duas vezes o “System.out.println(“Você é o melhor! Diga “Eu sou o melhor” para sair!”);” ?
Pq ?

Claro cara o Vini deu um exemplo ai em cima mas, dou um tb

por exemplo se eu quiser imprimir meu nome dez vezes:

[code]int contador = 0;

// aqui no While ele verifica se contador realmente é menor do que 10 se for verdade(true) ele entra dentro do while e imprime everton a 1º vez
while(contador < 10){

System.out.println(“everton”); // aqui ele vai imprimir no Console everton

contador ++; // esse contador++ significa que estou adicionando um ao contador seria mesma coisa que contador = contador +1, entao toda vez que ele passar por aqui contador vai receber 1. Após contador receber 1 ele volta de novo na verificaçao do While e verifica se contador é menor do que 10. No caso agora contador vale 1, como 1 e menor do que 10 ele vai entrar de novo no While e imprimir everton de novo. E vai fazer isso até contador ser menor do que 10. Quando for mentira(false) ou quando contador for maior do que dez ai ele sai do while e nao imprime mais everton. Entendeu?

}[/code]

Certo. Mas no caso eu quero que o usuário digita um valor para que o contador pare na hora que ele deseja. Como seria ?

Hum ai vc pergunta para o usuario por exemplo: “Digite 1 para sair”.

[code]int contador = 0;

	Scanner verificaContador = new Scanner(System.in);
	
	while(contador != 1){
		
		System.out.println( contador +"e");
		
		System.out.println("digite 1 para sair");
		
		contador = verificaContador.nextInt(); // aqui eu uso nextInt pq estou assumindo que o usuario ira digitar o numero "1" que é um inteiro para ele poder sair

}[/code]

Analisando o código que eu postei, como seria?

#    // fase de inicialização  
#       total = 0; // inicializa o total  
#       gradeCounter = 0; // inicializa o contador de loops  
#         
#       // fase de processamento  
#       // solicita entrada e lê a nota do usuário  
#       System.out.print( "Enter grade or -1 to quit: " );  
#       grade = input.nextInt();                            
#   
#       // faz um loop até ler o valor de sentinela inserido pelo usuário  
#       while ( grade != -1 )   
#       {  
#          total = total + grade; // adiciona grade a total  
#          gradeCounter = gradeCounter + 1; // incrementa counter  
#   
#          // solicita entrada e lê a próxima nota fornecida pelo usuário  
#          System.out.print( "Enter grade or -1 to quit: " );  
#          grade = input.nextInt();                            
#       } // fim do while  

Poderia me explicar em base nesse código ?

[quote=hackum]Analisando o código que eu postei, como seria?

#    // fase de inicialização  
#       total = 0; // inicializa o total  
#       gradeCounter = 0; // inicializa o contador de loops  
#         
#       // fase de processamento  
#       // solicita entrada e lê a nota do usuário  
#       System.out.print( "Enter grade or -1 to quit: " );  
#       grade = input.nextInt();                            
#   
#       // faz um loop até ler o valor de sentinela inserido pelo usuário  
#       while ( grade != -1 )   
#       {  
#          total = total + grade; // adiciona grade a total  
#          gradeCounter = gradeCounter + 1; // incrementa counter  
#   
#          // solicita entrada e lê a próxima nota fornecida pelo usuário  
#          System.out.print( "Enter grade or -1 to quit: " );  
#          grade = input.nextInt();                            
#       } // fim do while  

Poderia me explicar em base nesse código ?[/quote]

No eu codigo grade que verifica se o while vai se repetir ou nao note que aqui ele pedei para o usuario digitar:

System.out.print( "Enter grade or -1 to quit: " ); 

e aqui grade recebe o que o cara digitar:

grade = input.nextInt(); 

Se grade receber -1 ele vai sair do while se ele receber algo diferente de -1 ele repetir novamente o while.

[quote=hackum]Não consigui compreender o códico que você colocou.
No caso você colocou duas vezes o “System.out.println(“Você é o melhor! Diga “Eu sou o melhor” para sair!”);” ?
Pq ?[/quote]

Porque o while testa a condição antes de entrar na repetição. E qual seria o valor da variável sentinela antes da repetição?

Daria para eliminar essa repetição se colocarmos um valor que não invalida o while:

public class InfladorDeEgo { public static void main(String args[]) { Scanner in = new Scanner(System.in); String sentinela = ""; //Ao invés de fazer a leitura, inicializamos com um valor diferente de "Eu sou o melhor" while (!sentinela.equalsIgnoreCase("Eu sou o melhor")) { System.out.println("Você é o melhor! Diga \"Eu sou o melhor\" para sair!"); String sentinela = in.nextLine(); } } }

Ou se trocarmos para um bloco do…while:

public class InfladorDeEgo { public static void main(String args[]) { Scanner in = new Scanner(System.in); String sentinela; //A leitura agora será feita antes do teste do { System.out.println("Você é o melhor! Diga \"Eu sou o melhor\" para sair!"); String sentinela = in.nextLine(); } while (!sentinela.equalsIgnoreCase("Eu sou o melhor")) } }

Obrigado Everton e ViniGodoy, enfim… vocês tiraram minha dúvida. No caso no exemplo do ViniGodoy, eu achei mais fácil utilizar o do…while, fica mais fácil de ler o código.
Enfim… Um grande abraço!