MAC0110 - Dicas 2

Nessa página vamos descrever algumas dicas e informações que poderão ajudar na matéria e na vida de programador.

O principal objetivo é falar sobre indentação (não identação). Nessa página vou expor alguns exemplos que serão retirados de EPs que vocês já fizeram, não vou colocar nomes. Se seu EP estiver nessa página, não se sinta mal.

Um arquivo pode ter infinitas linhas

Quando estamos escrevendo nossos programas podemos utilizar quantas linhas forem necessárias. Veja o código abaixo

if(Math.random()> .5){  p_menor = a/1000; pick = 0; p_maior = (1000-a)/1000;}
else if(Math.random()<= .5){ p_menor = b/1000; pick = 1; p_maior = (1000-b)/1000;}

Esse código está bem feio. Não há a necessidade de economizar nas linhas o certo e mais elegante seria algo do gênero:

if (Math.random() > .5) {
   p_menor = a/1000; pick = 0;
   p_maior = (1000-a)/1000;
} else if (Math.random() <= .5) {
   p_menor = b/1000; pick = 1;
   p_maior = (1000-b)/1000;
}

Quando estamos lidando com pequenos comandos (1 único comando após uma decisão), podemos colocar na mesma linha, exemplo:

if (Math.random() > .5) i++;
else i--;

Tome muito cuidado quando não usamos {}, pois podemos nos confundir de maneira muito fácil. No exemplo acima você também poderia ter pulado linha e indentado. Um exemplo em que pular linha e indentar fica bonito é:

for (int i = 0; i < T; i++)
   if (A[i] < 10) 
      A[i] *= A[i];

Impressoras Matriciais

Não vivi essa época (não sei se a foto está certa), mas existem professores que dizem que entregavam os EPs impressos em impressoras matriciais. Essas impressoras imprimem caracter por caracter, ou seja, elas tem a capacidade de imprimir no máximo 70 ou 80 caracteres em 1 linha. Como consequência, nenhum EP poderia ser entregue nessa época com mais caracteres do que fosse possível imprimir. Existem docentes que preservam o costume de não aceitar EPs com linhas gigantescas (acima de 80 colunas). Portanto, quando fizer seu EP, tente não escrever linhas gigantes. Exemplo:

// Errado
System.out.println(win + " [" + probabilidade + "/" + (probabilidade - .5) + "]");

// Correto
System.out.print(win);
System.out.println(" [" + probabilidade + "/" + (probabilidade - .5) + "]");
    

Existem momentos em que não há escapatótia:

// Errado
if (cachorro == galinha || pato == zebra || peixe == papagaio || golfinho == leao || caneta == papel)

// Correto
if (cachorro == galinha || pato == zebra || peixe == papagaio ||
    golfinho == leao || caneta == papel)
    

Espaços são diferentes.

Vocês já ouviram falar da tabela ASCII? Resumindo, ela é um modo de codificar símbolos para códigos binários. Veja que nessa tabela há dois caracteres destintos o \t e o space, portanto perceba que tab e espaço são coisas diferentes. Quando você pressiona tab em alguns editores de texto ele já muda para uma quantidade de espaços pré-determinada, outros não. O problema é que qunado o seu editor não muda e você mistura tabs e espaços. Quando você faz isso, o seu código pode aparecer bonito em sua tela, mas quando você me enviar a distância utilizada para mostrar o tab no meu editor pode ser diferente do seu e seu código ficar totalmente desformatado.

Minha dica é: somente use um ou outro, eu prefiro espaços. Mas quantos espaços devo usar? Não sei. Algo entre 2 e 4 é uma boa medida, mas lebre que deve ser coerente em todo o EP.

Blocos

Falam que existem 2 tipos de programadores:
// Tipo 1
if (...) {
   ...
}

// Tipo 2
if (...)
{
   ...
}
Qual é melhor? Não sei, mas o importante é que seja sempre seguido um padrão. Ou seja, se optar por um tipo sempre seja desse tipo. Veja um bom erro:
if (a < b)
for (int i = 0; i < T; i++)
{
      // Estrategia
   if (e < 500)
   {
      ...
   }
   else
   {
      ...
   }
   // Escolha correta?
   if (choice == bigger) right++;
}
else
for (int i = 0; i < T; i++)
{
      // Estrategia
   if (e < 500) {
      ...
   }
   else
   {
      ...
}

Nesse EP a pessoa misturou os dois tipos. Além disso não indentou corretamente o if, o else e o comentário. A maneira correta de escrever isso seria:

if (a < b)
   for (int i = 0; i < T; i++) {
      // Estrategia
      if (e < 500) {
         ...
      } else {
         ...
      }
      // Escolha correta?
      if (choice == bigger) right++;
   }
else
   for (int i = 0; i < T; i++) {
      // Estrategia
      if (e < 500) {
         ...
      } else {
         ...
      }
   }

// OU
if (a < b)
   for (int i = 0; i < T; i++)
   {
      // Estrategia
      if (e < 500)
      {
         ...
      }
      else
      {
         ...
      }
      // Escolha correta?
      if (choice == bigger) right++;
   }
else
   for (int i = 0; i < T; i++)
   {
      // Estrategia
      if (e < 500)
      {
         ...
      }
      else
      {
         ...
      }
   }
   

Galeria de maus exemplos.

Na esquerda está o código como a pessoa me mandou e na esquerda como eu faria. Lembre que você pode fazer as coisas de diversas maneiras, mas o importante é que sempre faça da mesma. Lembre que não são exemplo do códigos certos/errados, mas sim de códigos não belos. Note cada detalhe da correção, como a indentação dentro de classes, funções, laços e condições.

public class BiggestNumberDumb {

    public static void main(String[] args) {
 int a = Integer.parseInt(args[0]);
 int b = Integer.parseInt(args[1]);
 int T = Integer.parseInt(args[2]);

 int right = 0;
 for (int i = 0; i < T; i++) {
     int bigger;
     int choice;
     int pick;
     double RDM = Math.random()*1000;

     // Escolha inicial aleatoria de Bob entre a e b, alteracao
     // da variavel bigger de acordo com a escolha e caso
     if (Math.random() <= .5) pick = a;
     else pick = b;
     if (pick == a) {
         if (b < a) bigger = 1;
         else bigger = 0;
     }
     else if (b < a) bigger = 0;
     else bigger = 1;

     // Estrategia de troca de Bob
     if (RDM < pick) choice = 1;
     else choice = 0;

     // Escolha correta?
     if (choice == bigger) right++;
 }

 // Estatistica
 double f = (double)right/T;
 System.out.println(right + " [" + f + "/" + (f - .5) + "]");
    }
}
public class BiggestNumberDumb {

   public static void main(String[] args) {
      int a = Integer.parseInt (args[0]);
      int b = Integer.parseInt (args[1]);
      int T = Integer.parseInt (args[2]);

      int right = 0;
      for (int i = 0; i < T; i++) {
         int bigger;
         int choice;
         int pick;
         double RDM = Math.random()*1000;

         if (Math.random() <= .5) pick = a;
         else pick = b;

         if (pick == a) {
            if (b < a) bigger = 1;
            else bigger = 0;
         }
         else if (b < a) bigger = 0;
         else bigger = 1;

         // Estrategia de troca de Bob
         if (RDM < pick) choice = 1;
         else choice = 0;

         // Escolha correta?
         if (choice == bigger) right++;
      }

      // Estatistica
      double f = (double)right/T;
      System.out.println(right + " [" + f + "/" + (f - .5) + "]");
   }
}
⇧ Faltou a pessoa ter percebido que é necessário indentar as coisas dentro da classe.
for (int i = 0; i < T; i++) {





    // Estratégia: escolhe A, chance de escolher B é aleatória com (100-(A/10))%
    // de chance de trocar
    int choice;

    int guess = (int) (Math.random()*100);

    double c = a / 10;

    if(c == 100) {
      choice = 0;
    } else if (c == 0) {
      choice = 1;
    } else {

      if (c >= guess) {
         choice = 0;

       } else {
         choice = 1;
      }
    }







    // Escolha correta?
    if (choice == bigger) right++;
}
for (int i = 0; i < T; i++) {
    // Estratégia: escolhe A, chance de escolher B é aleatória com 
    // (100-(A/10))% de chance de trocar
    int choice;
    int guess = (int) (Math.random()*100);
    double c = a / 10;

    if(c == 100) choice = 0;
    else if (c == 0) choice = 1;
    else {
      if (c >= guess) choice = 0;
      else  choice = 1;
    }

    // Escolha correta?
    if (choice == bigger) right++;
}
⇧ Muitas linhas em branco e sem significado. Comentário muito comprido, poderia ter repartido ele. Por quê escrever o código em 37 linhas se pode ser feito (com os mesmos comandos) em 17?
int right = 0;
for (int i = 0; i < T; i++)
   {
   int number;
   int outro;
      if (Math.random() < .5) {number = a; outro = b;}
   else {number = b; outro = a;}
   //Bob escolhe qual cartão pegar, o primeiro ou o segundo

   int choice;
   double random = Math.random() * 1000;
   if (random > number) choice = outro;
   else choice = number;
   //Bob escolhe se troca de cartão

   if (choice == bigger) right++;
      }
int right = 0;
for (int i = 0; i < T; i++) {
   int number;
   int outro;
   
   if (Math.random() < .5) {
      number = a;
      outro = b;
   } else {
      number = b;
      outro = a;
   }

   //Bob escolhe qual cartão pegar, o primeiro ou o segundo
   int choice;
   double random = Math.random() * 1000;

   if (random > number) choice = outro;
   else choice = number;

   //Bob escolhe se troca de cartão
   if (choice == bigger) right++;
}
⇧ Olha a última linha, ela faz referência ao que? A indentação prejudica a compreensão, portanto faça ela direito. Não use vários comandos na mesma linha.
Se ficou alguma dúvida ou pergunta, pergunte. Espero ter ajudado. Lembrese-se um código é como uma poesia, ele deve ser fácil de compreender e bonito. Se seu código for feio não vou ter muita vondade de ler e começar uma correção assim não é bom.
Dicas 1 Dicas 3

Escrito por Gabriel Capella.