Duvida Iniciante (Vetores)

Olá!
Sou novato aqui e em programação.
Estou com problema com exercício de vetores…

Leia dois vetores de 3 posições e calcule outro vetor contendo:
Nas posições pares os valores do primeiro vetor e nas posições impares os valores do segundo vetor.

public class Ex08 {

public static void main(String[] args){
    
    Scanner in = new Scanner(System.in);
    
    int vetA[] = new int[3];
    int vetB[] = new int[3];
    int vetC[] = new int[6];
    
    int a = 0, b = 0;
    
    for(int i = 0; i < vetA.length; i++){
        System.out.print("Digite o valor " + (i + 1) + " de " + vetA.length + " do vetor 1: ");
        vetA[i] = in.nextInt();  
    }
    for(int i = 0; i < vetB.length; i++){
        System.out.print("Digite o valor " + (i + 1) + " de " + vetB.length + " do vetor 2: ");
        vetB[i] = in.nextInt();            
    }        
    for(int i = 0; i < vetC.length; i++){
        if(vetC[i] % 2 == 0){
            vetC[i] = vetA[a];
            a++;
        }
        if(vetC[i] % 2 != 0){
            vetC[i] = vetB[i];
            b++;
        }            
    }
    for(int i = 0; i < vetC.length; i++){
        System.out.print(vetC + ", ");         
    }              
}

}

Opa!

Bem, você esqueceu de especificar no seu post qual o erro que está dando. Mas eu quebro essa pra você:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

Certo… o que isso significa?

O erro ArrayIndexOutOfBounds tem a tradução (quase literal) “Index do Array fora dos limites”.

Isso significa que o array que você tá instanciando tá recebendo valores fora do escopo definido. Se você definiu, por exemplo, 8 como limite, ele vai de 0-7, abrangendo as 8 posições.

Alguma interação sua está excedendo os limites do array… agora, o que pode ser? Tenta arrumar e me diz (:

DICA: O que está quebrando não é o seu Array C, e sim quantas vezes você está forçando os arrays A e B a rodarem! Se eles tem limite 3, como podem rodar 4, 5 ou 6 vezes?

No vetA, pro exemplo, tem limite 3. Isso significa:
vetA[0], vetA[1], vetA[2].
Sabendo disso, não existe
vetA[4], vetA[5], vetA[6].

Então, o que cê pode fazer?

2 curtidas

NOTA: TENTE RESOLVER SOZINHO! USE O COMENTÁRIO ACIMA COMO REFERÊNCIA, E CASO NÃO CONSIGA, CONSULTE O CÓDIGO ABAIXO!

SÉRIO! Aprender a programar envolve prática. Copiar e colar transforma você no famoso Programador Orientado a StackOverFlow e você com certeza não quer isso

Ou, se você realmente estiver com dificuldade de entender, esse código aqui deve te ajudar. Lembre-se: um vetor começa na posição 0, mas o usuário pode achar que começa na primeira posição, fazendo com que seu código fique errado. Como alterar isso? Aí é com você.

[]'s!

public static void main(String[] args){

    Scanner in = new Scanner(System.in);

    int vetA[] = new int[3];
    int vetB[] = new int[3];
    int vetC[] = new int[6];

    for(int i = 0; i < vetA.length; i++){
        System.out.print("Digite o valor " + (i + 1) + " de " + vetA.length + " do vetor 1: ");
        vetA[i] = in.nextInt();
    }
    for(int i = 0; i < vetB.length; i++){
        System.out.print("Digite o valor " + (i + 1) + " de " + vetB.length + " do vetor 2: ");
        vetB[i] = in.nextInt();
    }

    for(int i = 0, j = 0, k = 0; i < vetC.length; i++){
    if(i%2==0){
        vetC[i]=vetA[j++];
    }else{
        vetC[i]=vetB[k++];
    }

    }
    for(int i = 0; i < vetC.length; i++){
        System.out.print(vetC[i] + " ");
    }
}
}
2 curtidas

Muito obrigado FearX…

O erro era esse mesmo, realmente esqueci de mencionar no tópico…

Bom fiz do meu jeito aqui e deu certo… valeu pela dica…

PS: Se tiver algo que vc considere “gambiarra” no meu código e quiser me dar um toque para eu nunca fazer… fique a vontade…
Algo errado sobre indentação também é valido!

/* Leia dois vetores de 20 posições e calcule outro vetor contendo:
Nas posições pares os valores do primeiro vetor e nas posições impares os valores do segundo vetor. */

public static void main(String[] args){
    
    Scanner in = new Scanner(System.in);
    
    int vetA[] = new int[3];
    int vetB[] = new int[3];
    int vetC[] = new int[6];
    
    int a = 0, b = 0;
    
    for(int i = 0; i < vetA.length; i++){
        System.out.print("Digite o valor " + (i + 1) + " de " + vetA.length + " do vetor 1: ");
        vetA[i] = in.nextInt();  
    }
    for(int i = 0; i < vetB.length; i++){
        System.out.print("Digite o valor " + (i + 1) + " de " + vetB.length + " do vetor 2: ");
        vetB[i] = in.nextInt();            
    }        
    for(int i = 0; i < vetC.length; i++){
        if(i % 2 == 0){
            vetC[i] = vetA[a];
            a++;
        }else{
            vetC[i] = vetB[b];
            b++;
        }            
    }
    for(int i = 0; i < vetC.length-1; i++){
        System.out.print(vetC[i] + ", ");         
    }
    System.out.println(vetC[5] + ". ");   
}

}

2 curtidas

É isso aí, cara! Muito legal! Seu código tá certinho. Uma prática que você pode adotar é a incrementação da variável durante uma operação. Como assim? Vou te mostrar.

Nesse trecho, você podia ter feito:

if(i % 2 == 0){
            vetC[i] = vetA[a++];
        }else{
            vetC[i] = vetB[b++];
}

Eles são exatamente o mesmo código. A diferença é que to incrementando (ou seja, acrescendo, dando o “++”) durante a operação.

Mas pode isso? Pode sim! Só se deve tomar cuidado com a posição do ++. Se você coloca antes da variável, ele “ACRESCE e depois executa a operação”. Se coloca na frente, ele EXECUTA A OPERAÇÃO e depois acresce. Por exemplo:

int i=0
sout(i++);
sout(i);

Isso vai me retornar:

0
1

Isso por que o sout(i++); EXECUTOU (no caso, printou na tela) antes de ACRESCER (:

Mas se eu fizesse:

int i=0
sout(++i);
sout(i);

Ele me retornaria:

1
1

Isso por que o sout(++i); ACRESCEU antes de EXECUTAR (no caso, printar no console) :slight_smile:

Espero que isso te ajude! (:

[]'s

2 curtidas

Muito obrigado @FearX, me ajudou muito…

Vou passar a usar!

Grande abraço!

1 curtida

Apenas uma dica para vc ir estudando, ao usar a classe Scanner, cuidado com os métodos, netxInt, nextFloat, nextDouble, etc…

Isso pq ela possui um “bug” de buffer (dados enfileirados em memória, coisas assim…) e dependendo do uso, pode gerar comportamento inesperado no seu código, já vai soltando “o pulo do gato” estando um passo a frente nos estudos, boa sorte e parabéns pelo empenho!

1 curtida

Obrigado pela dica @rodevops

Realmente já havia dado esse tipo de problemas aqui comigo.

Valeu

Queria em c++ :smirk::smirk: