Exercício "java como programar"

6 respostas
javahunter

Ola pessoal,

no livro java como programar 8ª, tem um exemplo de array que ta difícil entender

o programa vai lançar um dado de 6 face 6000 vezes e no final marca quantas vezes parou em cada face do cubo
tipo assim na
face01: 968 vezes
face02: 1068 vezes
face03: 946 vezes
.....

public class Array{			
	public static void main(String args[]) {	
		Random randomNumbers = new Random();
		int[] frequency = new int[7];
		
		for (int roll = 1; roll <= 6; roll++)
			++frequency[1 + randomNumbers.nextInt(6) ];
		
		System.out.printf( "%s%10s\n", "Face", "Frequency" );
		
		for (int face = 1; face < frequency.length; face++)
			System.out.printf( "%4d%10d\n", face, frequency[face] );
	}
}

alguém pode ajudar a entender a linha 04. porque tem 7 elementos ma o cubo tem 6 face, e a linha 07. ++frequency o que ta acontecendo aqui

existe uma mão amiga pra essa ajudinha =)

abraços

6 Respostas

T

javahunter
Boa tarde.

Bom vamos por partes.

A)

int[] frequency = new int[7];

aqui ele criou um vetor do tipo int e tamanho 7
a princípio eu também achei estranho mas é só juntar as peças que dá para entender.

1º o vetor sempre começa o índice em 0 , mas se pensar, tipo o dado não tem o número 0.
esse vetor de tamanho 7, vai de 0 à 6 ou seja
[0]-[1]-[2]-[3]-[4]-[5]-[6] => 7 posições/índices

aí o programa vai atribuir o incremento de +1 na posição relativa ao número que voltou do Random

  1. você pode usar um vetor de tamanho 6 para condizer com o tamanho real do dado mas terá que guardar
    na cabeça que:
    a posição/índice 0 do vetor guarda quantas vezes caiu o número 1 no dado
    a posição/índice 1 do vetor guarda quantas vezes caiu o número 2 no dado
    a posição/índice 2 do vetor guarda quantas vezes caiu o número 3 no dado
    a posição/índice 3 do vetor guarda quantas vezes caiu o número 4 no dado
    a posição/índice 4 do vetor guarda quantas vezes caiu o número 5 no dado
    a posição/índice 5 do vetor guarda quantas vezes caiu o número 6 no dado

isso é difícil pois é complexo e confunde…

por isso em alguns casos eles adotam desconsiderar a posição 0 do vetor para ficar
mais fácil a didática de explicação.

B) agora vamos ao mais simples

++frequency[1 + randomNumbers.nextInt(6) ];

1º o código ++frequency
é tipo assim
se vc fizer:

int a=0; a++;

é o mesmo que fazer

int a=0; ++a;

e para vetores também é a mesma coisa dizer

int[ ] vetor = new int[2];

vetor[0] ++;

ou

int[ ] vetor = new int[5];

++vetor[0] ;

isso é uma coisa determinada na linguagem ou seja
é igual dizer
Português => A casa azul
Inglês => The blue house
ou seja duas coisas que fazem o mesmo.

agora a parte complicada
2º o código completo

++frequency[1 + randomNumbers.nextInt(6) ];

isso aí quer dizer o seguinte
o vetor frequency vai ganhar um incremento de +1 ou seja ++frequency
e isso vai ocorrer na posição [1 + randomNumbers.nextInt(6) ];

ou seja ao invés dele colocar a posição como 1,2,3,4,5 ou 6
ele já está chamando o random dentro da posição em que será passada
para o frequency incrementar o +1

dessa forma o que ocorre é um empilhamento
ou seja

++frequency
vai incrementar +1
na posição [?]

onde ? será o número resultante da chamada do random
que está dentro do colchete

ou seja

ele primeiro vai executar o que está dentro do colchete
aí o random retorna para ele um número de 1 a 6
ai o frequency incrementa +1
na posição que foi retornada pelo frequency

FIM

se tiver dúvida pode perguntar de novo
pois esse tema é complexo no início mas depois
você acostuma e entende.

Eu te indico duas coisas
1 - Leia também o Livro Java Use a Cabeça
pois é mais fácil de didática do que o Como Programar
aí depois de ler o Use a Cabeça, você lê o Como Programa.
2 - Aprenda a fazer o debug
muito importante pois você vai ver onde as coisas acontecem
ou seja a ordem das chamadas e empilhamentos

no youtube tem vários vídeos ensinando como debugar no eclipse e netbeans

Abraço e sucesso.
Precisando é só chamar hehehe

C

Isso mesmo que o TiagoSena explicou, muito boa a explicação.

Abraço

javahunter

Vlw TiagoSena,

agora tudo faz sentido hehehe,

vlw pelas dicas

T

javahunter:
Vlw TiagoSena,

agora tudo faz sentido hehehe,

vlw pelas dicas

Precisando estamos aí

:smiley:

ribclauport
1º o código ++frequency é tipo assim se vc fizer: view plaincopy to clipboardprint?

int a=0;
a++;

é o mesmo que fazer
view plaincopy to clipboardprint?

int a=0;
++a;

Realmente a explicação foi ótima, porém faria uma ressalva neste ponto, pois o resultado não é o mesmo se isso for usado em uma atribuição.

a++; --> usa primeiro e incrementa depois
++a; --> incrementa primeiro e usa depois

se rodar o seguinte progama java verás a diferença:

public class Incremento {
	public static void main(String[] args) {
		int a = 0;
		int atribuicao = -10;
		
		//----------Usando primeiro
		atribuicao = a++;
		/**
		 * O valor será 0 pois foi feita a operação de incremento depois da atribuição
		 */
		System.out.println(&quot;Usando Primeiro :&quot;+atribuicao);
		
	   //------voltando ao estado inicial as varíáveis
		a = 0;
		atribuicao = -10;
		
		atribuicao = ++a;
		/**
		 * O valor será 1 pois foi feita a operação de incremento antes da atribuição
		 */
		System.out.println(&quot;Incrementando Primeiro: &quot;+atribuicao);
		
	}
}

Verás que o resultado é o seguinte:

Usando Primeiro :0
Incrementando Primeiro: 1

Espero ter acrescentado algo ao post.

T

ribclauport

ajudou muito mesmo, pois eu não sabia como funcionava a esse ponto.

Valeu pela dica e ajuda

Criado 8 de novembro de 2012
Ultima resposta 9 de nov. de 2012
Respostas 6
Participantes 4