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.
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];
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)
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.
// 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 { ... } }
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) + "]"); } }
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++; }
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++; }
Escrito por Gabriel Capella.