Exercício de lógica de programação

Crie um algoritmo para copiar um vetor (utilize laço de repetição).

Use a nomenclatura vetor1 para o vetor original e vetor2 para o vetor copiado.

Linguagem C

#include <stdio.h>
#include <assert.h>

int main() {

    int vetor1[3] = {10, 20, 30},
        vetor2[3];

    // Aqui entra a lógica do programa.


    //
    // Testes
    //
    assert(vetor2[0] == 10);
    assert(vetor2[1] == 20);
    assert(vetor2[2] == 30);

    return 0;
}

Solução na linguagem C

Já sabemos que em C, se quisermos trabalhar com vetor e funções, teremos que passar um valor extra como parâmetro indicando o tamanho do vetor. Então, para simplificar o resultado, não utilizamos funções.

Repare também que incluímos a variável i.

#include <stdio.h>
#include <assert.h>

int main() {

    int i,
        vetor1[3] = {10, 20, 30},
        vetor2[3];

    for(i = 0; i < 3; i++) {
        vetor2[i] = vetor1[i];
    }

    //
    // Testes
    //
    assert(vetor2[0] == 10);
    assert(vetor2[1] == 20);
    assert(vetor2[2] == 30);

    return 0;
}

Linguagem Python

Em Python, a princípio, não precisamos nem de lógica, podemos criar a outra lista fazendo uma simples atribuição.

# -*- coding: utf-8 -*-

lista1 = [10, 20, 30]
lista2 = lista1

#
# Será que as listas são iguais?
#
assert lista1 == lista2

O que estamos fazendo na verdade é criar uma referência para a lista2, ou seja, as alterações na lista1 refletem na lista2. Podemos tirar uma cópia real (um clone) utilizando-se o operador de fatia [:], veja…

# -*- coding: utf-8 -*-

lista1 = [10, 20, 30]
lista2 = lista1[:]

#
# Será que as listas são iguais?
#
assert lista1 == lista2

Leia mais sobre listas na seção Python.

Mas os exercícios envolvendo vetores (listas) são para treinarmos os laços de repetição, então vamos ver como seria um código semelhante ao mostrado na linguagem C.

# -*- coding: utf-8 -*-

lista1 = [10, 20, 30]

lista2 = []
for i in lista1:
    lista2.append(i)

#
# Será que as listas são iguais?
#
assert lista1 == lista2

Em Python podemos utilizar lista e funções sem o inconveniente de ter que passar o tamanho da lista como parâmetro extra.

# -*- coding: utf-8 -*-

def copiarLista(lista1):
    nova_lista = []
    for i in lista1:
        nova_lista.append(i)
    return nova_lista

#
# Será que as listas são iguais?
#
lista1 = [10, 20, 30]
lista2 = copiarLista(lista1)
assert lista1 == lista2

Que tal simplificarmos o teste?

...

#
# Testes
#
assert [10, 20, 30] == copiarLista([10, 20, 30])

Linguagem JavaScript (Node.js)

Em JavaScript também não podemos simplesmente atribuir de uma variável para outra pois estaríamos, na verdade, criando um vínculo com a variável anterior e não, de fato, criando uma cópia independente (um clone).

var a = [1, 2]
console.log(a); // [ 1, 2 ]

var b = a
console.log(b); // [ 1, 2 ]

a.push(3)
console.log(a); // [ 1, 2, 3 ]
console.log(b); // [ 1, 2, 3 ]

Para efetuarmos um cópia, ou melhor, um clone, podemos fazer simplesmente isso…

var b = a.slice();

E também poderíamos criar o clone através de um laço de repetição.

Mas repare bem que mudamos o teste.

var assert = require('assert');

//
// Seu código
//
var clonar = function(data){
    var clone = [];
    for(var i = 0; i < data.length; i++){
        clone.push(data[i]);
    }
    return clone;
}
//
// Seu teste
//
try {

    assert.deepEqual([10, 20, 30, 0], clonar([10, 20, 30, 0]));

} catch(e) {
    console.log(e);
}

Para comparar dois arrays precisamos usar deepEqual() ao invés de equal().