quarta-feira, 27 de agosto de 2014

Java Programa de Tabuada de Multiplicação

Meu primeiro código escrito em Java foi este aqui:
Trata-se de um programa simples, executando em modo console, mas já utilizando algumas técnicas interessantes que aprendi lendo o Tutorial da Oracle. Meus meninos gostaram muito, pois os ajudou a estudar matemática. A versão abaixo é a Tabuada de Multiplicação, onde o computador escolhe numeros de 1 a 10 e você deve informar o resultado da multiplicação. Para encerrar, informe 99. No fim, algumas estatísticas são apresentadas, para você avaliar o desempenho do aluno.
Ainda existe espaço para melhorias, o que pretendo fazer em breve, envolvendo executa-lo num browser, por exemplo, para rodar no Tablet do meu filho.

Sâo 2 códigos fontes: TabuadaMultiplica.java e Timer.java, que auxilia na marcação do tempo. Os créditos do Timer.java estão no corpo do código fonte.

import java.io.Console;
import java.util.Arrays;
import java.io.IOException;


// TabuadaMultiplica.java
public class TabuadaMultiplica {

     public static final int TOTAL_CONTADORES = 4; // quantidade total de contadores que serão controlados no vetor
     public static final int CONTA_TESTES = 0; // indice do contador de quantidade de testes realizados
     public static final int CONTA_ERROS = 1; // indice do contador de quantidade de respostas erradas
     public static final int CONTA_ACERTOS_BONS = 2; // indice do contador de quantidade de acertos dentro do tempo limite estipulado
     public static final int CONTA_ACERTOS_DIRETO = 3; // indice do contador de quantidade de acertos na primeira tentativa
     public static final int TOTAL_ELEMENTOS = 10; // numero total de elementos que serão usados para montar as operações 
     public static final int LIMITE_RESPOSTA = 5; // tempo em segundos considerado limite maximo estipulado

     public static void main(String[] args) {

          int[] anElementos; // declara o vetor de elementos 
          int[] anContador; // declara o vetor de contadores
          int i; // controle para o indice e loops
          int a,b; // indices para os multiplicadores

          int nresposta,nacertos,nerros,ntestes,nacertos2;
          int nacertosBons; // acertos dentro da faixa de 5 segundos
          boolean lsorteia; // controla se deve ocorrer o sorteio de novos elementos ou não
          boolean lprimeira; // controla se a resposta dada é a primeira tentativa ou não
          
          Timer tempoTeste = new Timer(); // objeto para marcar o tempo inicial de cada teste
          Timer tempoTotal = new Timer(); // objeto para marcar o tempo inicial dos testes

          long tempoResposta; // conterá tempo, em segundos, levado para dar a resposta.

          anElementos = new int[TOTAL_ELEMENTOS]; // inicializa o vetor de elementos
          anContador = new int[TOTAL_CONTADORES]; // inicializa o vetor de contadores



         // preenche o vetor
         for (i=0; i<TOTAL_ELEMENTOS; i++) {
             anElementos[i] = i+1;
         }


         // teste da console
         Console c = System.console();
         if (c == null) {
            System.err.println("Não há console.");
            System.exit(1);
         }


         nresposta = 0;
         anContador[CONTA_TESTES] = 0; 
         anContador[CONTA_ERROS] = 0; 
         anContador[CONTA_ACERTOS_BONS] = 0; 
         anContador[CONTA_ACERTOS_DIRETO] = 0; 
         // nacertos = 0;
         // nacertosBons = 0;
         nacertos2 = 0;
         // nerros = 0;
         // ntestes = 0;
         lsorteia = true;
         lprimeira = false;
         a = 0;
         b = 0;
         tempoTotal.start(); // inicia a marcação do tempo total do teste
         // loop para apresentar as questões
         teste:
         do {
              System.out.println("-------------------------------------------------------------------------:)");

            if (lsorteia) {
               tempoTeste.start(); // inicia a marcação do tempo da pergunta
               a = (int)(Math.random()*TOTAL_ELEMENTOS);
               b = (int)(Math.random()*TOTAL_ELEMENTOS);
               System.out.println("");
               anContador[CONTA_TESTES]++;
               lprimeira = true;
            } 
            System.out.println(anContador[CONTA_TESTES] + ") Responda: quanto é " + anElementos[a] + " * " + anElementos[b] + " (99 se quiser parar)?");
            try {
                String sresposta = c.readLine("? "); // leitura em tipo String
                nresposta = (Integer.valueOf(sresposta)).intValue();
            } catch (NumberFormatException e) {
                    System.out.println("Voce não digitou número valido ou não digitou nada... Erro. " );
                    System.out.println("tente novamente...");
                    lsorteia = false;
                    continue teste;
              }
           switch (nresposta) {
                  case 99: anContador[CONTA_TESTES]--; // o ultimo teste não foi utilizado e não entrará na conta.
                       break;  
                  default: if ((anElementos[a] * anElementos[b]) == nresposta) {
                              if (lprimeira) { anContador[CONTA_ACERTOS_DIRETO]++;
                              }
                              nacertos2++;
                              tempoTeste.end();
                              tempoResposta = tempoTeste.getTotalTime();
                              switch (nacertos2) {
                                     case 1: case 5: case 9: System.out.println("Correto!");
                                          break;
                                     case 2: case 6: case 10: System.out.println("Muito Bem!");
                                          break;
                                     case 3: case 7: case 11: System.out.println("Excelente!");
                                          break;
                                     case 4: case 8: case 12: System.out.println("Perfeito!");
                                          break;
                                     case 13: case 14: case 15: case 16: case 17: case 18: case 19: System.out.println("Incrivel! Bruxaria!");
                                          break;
                                     default: System.out.println("Acertou!");
                              }
                           } else {
                                  anContador[CONTA_ERROS]++;
                                  System.out.println("Errou... você já tem " + anContador[CONTA_ERROS] + ".");
                                  nacertos2 = 0;
                                  lsorteia = false;
                                  lprimeira = false;
                                  continue teste;
                             }   
                           lsorteia = true;
                           if (tempoResposta <=LIMITE_RESPOSTA) { 
                              System.out.println("você respondeu dentro do prazo de " + LIMITE_RESPOSTA + " segundos! Muito Bom!"); 
                              anContador[CONTA_ACERTOS_BONS]++; 
                           }
                           System.out.println("tempo utilizado " + tempoResposta + " segundos.");
           }
         } while (nresposta != 99);
         tempoTotal.end();
         System.out.println("-------------------------------------------------------------------------:)");
         System.out.println("Estatisticas:");
         System.out.println("Total de Testes : " + anContador[CONTA_TESTES]);
         try { System.out.println("Acertos na Primeira Tentativa: " + anContador[CONTA_ACERTOS_DIRETO] + " ou " + ((anContador[CONTA_ACERTOS_DIRETO]*100)/anContador[CONTA_TESTES]) + "%" );
             System.out.println("Acertos Bons (em ate " + LIMITE_RESPOSTA + " segundos): " + anContador[CONTA_ACERTOS_BONS] + " ou " + ((anContador[CONTA_ACERTOS_BONS]*100)/anContador[CONTA_TESTES]) + "%" );
             System.out.println("Total de Erros  : " + anContador[CONTA_ERROS] );
             System.out.println("Tempo Total dos testes: " + (tempoTotal.getTotalTime()) + " segundos.");
             System.out.println("Tempo Medio para responder: " + (tempoTotal.getTotalTime()/anContador[CONTA_TESTES]) + " segundos.");
         } catch (ArithmeticException e) { 
                 System.out.println("não há dados estatísticos." + e.getMessage()); 
           }

     }
}



//Timer.java
/*
  http://tutorials.jenkov.com/java-date-time/time-measurement.html
  permite registrar 2 momentos e encontrar e diferença entre eles, em milissegundos

*/


/* exemplo de uso
   Timer timer = new Timer();

   timer.start(); // registra o tempo inicial

   // trecho de codigo que terá seu tempo de operação medido

   timer.end(); // registra o fim do tempo

   long totalTime = timer.getTotalTime(); // retorna o tempo total em segundos

*/
// package meupacote;

public class Timer {

  private long startTime = 0;
  private long endTime   = 0;

  public void start(){
    this.startTime = System.currentTimeMillis();
  }

  public void end() {
    this.endTime   = System.currentTimeMillis();  
  }

  public long getStartTime() {
    return this.startTime;
  }

  public long getEndTime() {
    return this.endTime;
  }

  public long getTotalTime() {
    // retorna o tempo total, convertido em segundos
    return (this.endTime - this.startTime)/1000;
  }
}

Ubuntu alterando variável PATH

para adicionar um caminho na pesquisa do path, o melhor lugar para fazer isso é editar o arquivo /etc/environment e ajustar a variável PATH

sudo gedit /etc/environment

Observe que os caminhos estão entre aspas "" e são separados por ":", um do outro. Ajuste o valor de PATH conforme seu desejo:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/java/jdk/bin"


Se quiser saber o valor atual de PATH, use o comando:

printenv PATH (sem parâmetro, mostra todas as variáveis existentes)



Ubuntu adicionar Usuário a Grupo

comando para adicionar, via terminal, um login de usuário a um grupo existente:
neste exemplo, o login mafra fará parte do grupo de usuários do VirtuaBox vboxsf

sudo usermod -g vboxsf mafra

para fazer valer, tem que logar novamente.