Boas ppl,
Estou a tentar fazer este exercício que encontrei na net…
Utilizando a classe Scanner faça um programa que solicite a entrada de 10 números inteiros, logo após solicite a entrada de mais 5 números inteiros, compare os números obtidos e verifique se o segundo vetor está contido dentro do primeiro.
Já fiz a maior parte do código…
[code]
int i=1;
int [] num = new int[11];
int [] numdois = new int[10];
Scanner teclado = new Scanner (System.in);
do{ //Utilizo dois tipos de laços apenas para 'ser diferente' kkk
System.out.println("Indique o "+i+"º nº para X: ");
num[i] = teclado.nextInt();
i++;
}while(i<=10);
for (int j=1;j<=5;j++){
System.out.println("Indique o "+j+"º nº para Y: ");
numdois[j] = teclado.nextInt();}
for(int y=1;y<=num.length;y++){ //percorre o primeiro array
for(int x=1;x<=numdois.length;x++){ //percorre o segundo array
if (num[y] == numdois[x]){ //compara as posições de um array c/ o outro
System.out.println("\nOs nºs "+num[y]+" e "+numdois[x]+" estão em ambos arrays"); //se as posições forem iguais
}else{
System.out.println("\nNão há iguais");} //se forem diferentes
}
}[/code]
Agora falta perceber o que estou a fazer mal porque o output não é o que pretendo… alguma sugestão?
Você está começando a preencher os valores a partir da segunda posição, 1. Vetores são base 0, começam a ser preenchidos na posição 0.
int [] num = new int[10]; //vetor com 10 posicoes
x[0]; //primeira posicao
x[1]; //segunda posição
x[2]; //Terceira posição
...
x[9]; //ultima posição
Outro problema é que você não está preenchendo o vetor todo, então ele preenche as outras posições automaticamente com 0 (valor default do int). Assim, como tem zeros em ambos os vetores e em diversas posições, a condição do seu if fica verdadeira.
Crie o vetor apenas com a quantidade de posições que irá preencher:
int [] num = new int[10];
int [] numdois = new int[5];
E percorra os vetores sempre partindo da posição 0, a inicial:
O problema é que quando corro o programa dá o seguinte erro…
“java.lang.ArrayIndexOutOfBoundsException: 10
at exercicio_10.main(exercicio_10.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)”
Faça o for como eu falei no post anterior. O problema é que você está tentando acessar uma posição que não existe…
você declara um vetor com 10 posições:
int [] vetor = new int[10];
Se você tentar acessar a posicao numero 10, irá aparecer esse erro, pois a posição nao existe.
System.out.println(vetor[10]);//Da esse erro!
A última posição do vetor é [9], pois começa a contar do 0, e[color=red] não [10][/color].
Em algum for você está tentando pegar a posição 10. Como eu disse logo no inicio, faça o for como o meu exemplo, assim ele irá começar do 0 até a ultima posição.
Além disso, pra saber se um está contido no outro, você precisa de um contador a ser incrementado no último if e retirar o último else. Se o contador terminar a execução encontrando 5 números iguais, é porque o menor está contido no maior.
Para arrays muito grandes, essa abordagem é pouco performática, pois precisa de nm comparações, sendo n e m a quantidade de posições em cada array. Uma alternativa é ordenar os dois vetores antes das comparações. Pensando um pouco, você consegue executar em no máximo n+m comparações. Mesmo a ordenação exigindo nlog(n) + m*log(m), vale a pena para arrays muito grandes.