Iae galerinha, professor passou um trabalho pra fazer eu fiz e apresentei ontem, ele achou o trabalho bom e tal, mas ele disse que eu poderia economizar mais linhas de código colocando todos os println dentro de um unico for e baixou minha nota por isso aff… eu tentei aqui e não consegui sempre estoura os vetores.
Explicando o que o programa faz
(PARTE 1) ele joga um dado N vezes e diz quantas vezes deu cada face
(PARTE 2) ele joga 2 dados N vezes e diz quantas vezes deu cada soma possivel.
(PARTE 3) ele joga 3 dados N vezes e diz quantas vezes deu cada soma possivel.
obrigado a todos que puderem ajudar.
import java.util.Scanner;
public class SimulacaoDeDados {
public static void main (String args[]) {
int dados[] = new int[7];
int soma2Dados[] = new int[13];
int soma3Dados[] = new int[19];
Scanner s = new Scanner(System.in);
System.out.println("Digite o número de vezes que os dados serão lançados");
int n = s.nextInt();
// PARTE 1
for (int i=0; i<n; i++) {
dados[(int) (1 + Math.random() * 6)]+=1;
}
// PARTE 2
for (int i=0; i<n; i++) {
soma2Dados[(int) (1 + Math.random() * 6) + (int) (1 + Math.random() * 6)]+=1;
}
// PARTE 3
for (int i=0; i<n; i++) {
soma3Dados[(int) (1 + Math.random() * 6) + (int) (1 + Math.random() * 6) + (int) (1 + Math.random() * 6)]+=1;
}
// IMPRIME PARTE 1
System.out.println("Lançamento de um dado " + n + " vezes e mostrando quantas vezes deu cada face do dado.");
for (int i=1; i<dados.length; i++) {
System.out.println("Face " + i + ": " + dados[i] + "x");
}
// IMPRIME PARTE 2
System.out.println("Lançamento de dois dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
for (int i=2; i<soma2Dados.length; i++) {
if (soma2Dados[i] > 0) {
System.out.println("Soma = " + i + "\t" + soma2Dados[i] + "x");
}
}
// IMPRIME PARTE 3
System.out.println("Lançamento de três dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
for (int i=3; i<soma3Dados.length; i++) {
if (soma3Dados[i] > 0) {
System.out.println("Soma = " + i + "\t" + soma3Dados[i] + "x");
}
}
}
}
o modo que eu tentei e queria fazer imprimir os dados em um unico for foi ± assim, mais ae n imprimiria os blocos tipo PARTE 1, PARTE 2 e PARTE 3 imprimiria uma linha de cada por vez e não ficaria legal isso -.- eu to começando a achar q o professor não vai com minha cara :evil:
for (int i=0; i<soma3Dados.length; i++) {
System.out.println("Face " + i + ": " + dados[i] + "x");
if (soma2Dados[i] > 0) {
System.out.println("Soma = " + i + "\t" + soma2Dados[i] + "x");
}
if (soma3Dados[i] > 0) {
System.out.println("Soma = " + i + "\t" + soma3Dados[i] + "x");
}
}
haeiuheai tipo se uma das bagunças que você se refere é colocar o Math.random direto no indice do array eu também achei ruim, antes eu tinha atribuido variaveis do tipo dado1, dado2 e dado3, mas o professor disso pra eu fazer do jeito que está que o codigo fica mais enxuto o.O
Eu não sei de muita coisa não to começando a ver java agora na faculdade…
[quote=Bruno Laturner]
Não entendi esses dois últimos. Como assim quantas vezes deu cada soma possível se só vai dar uma soma?[/quote]
eu me expressei errado, ja corrigi no post principal, esse codigo todo eu arrumei depois que ele reclamou do meu trabalho :evil:
mas quando eu me referi ali cada soma possivel é lançar 2 dados e somar os dois e dizer quantas vezes deu cada soma e a mesma coisa para 3 dados
um pedacinho do codigo original antes do professor da os ataques dele.
for (int i=0; i<n; i++) {
dado1 = (int) (1 + Math.random() * 6); // Gera um número aleatório de 1 a 6
dado2 = (int) (1 + Math.random() * 6); // Gera um número aleatório de 1 a 6
dado3 = (int) (1 + Math.random() * 6); // Gera um número aleatório de 1 a 6
soma = dado1+dado2+dado3; // Faz a soma dos dados lançados
soma3Dados[soma]+=1; // Incrementa a quantidade de vezes que deu cada soma no vetor
}
for (int i=3; i<soma3Dados.length; i++) {
if (soma3Dados[i] > 0) {
System.out.println("Soma = " + i + "\t" + soma3Dados[i] + "x"); // Imprime a quantidade que deu cada soma possível
}
}
Ainda não aprendemos isso estamos iniciando OO, mas olha você me deu tanta força que eu poderia criar metodos e funções que eu acabei dando uma lida aqui e acho que melhorei um pouquinho o meu código e o jeito de pensar, deve ta um pouco bagunçado ainda eu acho que passei muitos parametros nos metodos, mas foi um jeito que eu arrumei, com o tempo eu vou melhorando… iae mereço um 9 pelo omenos? 8)
public class SimulacaoDeDados {
public static void main (String args[]) {
int dados[] = new int[7];
int soma2Dados[] = new int[13];
int soma3Dados[] = new int[19];
java.util.Scanner s = new java.util.Scanner(System.in);
try {
System.out.println("Digite o número de vezes que os dados serão lançados.");
int n = s.nextInt();
iniciando(n, 1, dados);
iniciando(n, 2, soma2Dados);
iniciando(n, 3, soma3Dados);
System.out.println("Lançamento de um dado " + n + " vezes e mostrando quantas vezes deu cada face do dado.");
imprimir(1, dados.length, dados, "Face = ");
System.out.println("Lançamento de dois dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
imprimir(2, soma2Dados.length, soma2Dados, "Soma = ");
System.out.println("Lançamento de três dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
imprimir(3, soma3Dados.length, soma3Dados, "Soma = ");
} catch (java.util.InputMismatchException ime) {
System.err.println("Você não digitou um número válido.");
}
}
public static void iniciando(int n, int x, int dado[]) {
for (int i=0; i<n; i++) {
dado[somar(x)]+=1;
}
}
public static void imprimir(int x, int tamanho, int dado[], String tipo) {
for (int i=x; i<tamanho; i++) {
if (dado[i] > 0) {
System.out.println(tipo + i + "\t" + dado[i] + "x");
}
}
}
public static int somar(int x) {
int soma = 0;
for (int i = 0; i < x; i++) {
soma += (int) (1 + Math.random() * 6);
} return soma;
}
}
Só uma perguntinha, por que as variaveis e métodos de classe tem que ser estaticos para ficarem acessiveis pelo main e outros métodos?
não precisa criar atributos static e metodos static para ser testado no main. seria muito bom vc testa o metodo main em outra classe, o metodo main não retorna nada ele e estatico não modifica e recebe uma Array de String. se voce criar uma variavel sem ser static e testar no main não vai dar serto o main e estatico.
[quote=jolivier] não precisa criar atributos static e metodos static para ser testado no main. seria muito bom vc testa o metodo main em outra classe, o metodo main não retorna nada ele e estatico não modifica e recebe uma Array de String. se voce criar uma variavel sem ser static e testar no main não vai dar serto o main e estatico.
[/quote]
É eu vi isso depois de da uma lida no tutorial que o thgdias colocou ai sobre static deu uma clariada nas ideias, arrumei o código dinovo, acho que ficou bomzinho agora…
[quote=jolivier]Tira uma duvida por que vc usa o primitivo int entre chaves? Ex: soma += (int) (1 + Math.random() * 6);
[/quote]
Se eu não estou enganado o Math.random ele retorna um double entre 0 e 1 esse (int) é um casting para para colocar o double dentro do int