Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

msmsms

interpretação de pedaço de código

Recommended Posts

msmsms

tenho o seguinte pedaço de codigo e gostava de saber o que ele faz e como se interpreta o código linha a linha:

    Carro obterCondutorComMaisVitorias() {
        Carro vencedor = new Carro();

        for (int i =0; i< numeroCarros; i++)
        {
           Resultado resultadoi = ListaCarros[i].obtemResultado();

           for (int j=0; j<numeroCarros; j++)
           {
               Resultado resultadoj = ListaCarros[i].obtemResultado();

               if(resultadoj.eMenor(resultadoi))
                   vencedor = ListaCarros[i];
               else
                   vencedor = ListaCarros[i];
           }

 

- existe em todo o programa uma classe chamada Carro, será isto um metodo da classe carro?

metodos têm tipo?

- no objectivo do trabalho podem haver varios condutores com o mesmo numero de vitorias e se isso acontecer devem ser devolvidos todos os condutores

Share this post


Link to post
Share on other sites
KTachyon

O ListaCarros[] deverá ser um array de Carros, que deve estar a ser declarada globalmente na classe onde se encontra. Não significa necessariamente que se encontra na classe Carro.

Resultado resultadoi = ListaCarros[i].obtemResultado();

Chama um método da classe Carro que obtem um objecto da classe Resultado.

if(resultadoj.eMenor(resultadoi))

Aparentemente compara dois resultados. E, pela forma de leitura, se resultadoj é menor que resultadoi...

if(resultadoj.eMenor(resultadoi))
    vencedor = ListaCarros[i];
else
    vencedor = ListaCarros[i];

Em qualquer caso, o carro vencedor é o último carro da ListaCarros[]. Ou seja, se quisesse simplificar esse código, faria:

Carro obterCondutorComMaisVitorias() {
    Carro vencedor = ListaCarros[ListaCarros.length-1];

Ou seja, esse código ou não está bem feito, ou foi mal copiado. Para além do facto de ser fácil de obter o carro com melhor resultado apenas com um ciclo for, não vejo a necessidade de haverem dois ciclos.

Em relação à segunda pergunta, o que é necessário é retornares uma lista de carros com a mesma "pontuação". Para isso tens que estabelecer uma comparação de igualdade. A forma mais fácil seria com ArrayList:

ArrayList<Carro> obterCondutorComMaisVitorias() {
    ArrayList<Carro> vencedores = new ArrayList<Carro>();
    vencedores.add(ListaCarros[0]);

    Resultado venc_res = ListaCarros[0].obtemResultado();

    for (int i = 1; i< numeroCarros; i++) {
        Resultado resultado = ListaCarros[i].obtemResultado();

        if(venc_res.eMenor(resultado)) {
            vencedores.clear(); // remove todos os elementos da lista
            vencedores.add(ListaCarros[i]);
            venc_res = resultado;
        }
        else if (venc_res.eIgual(resultado) { // verifica se eIgual() está implementado
            vencedores.add(ListaCarros[i]);
        }
    }
    
    return vencedores;
}


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
msmsms

mas porquê que no final do código tem 2 vezes a mesma coisa como if e como else?

(if) se o resultado é menor do que o resultado i

vencedor = ListaCarros[i];

(else) caso contrário

vencedor = ListaCarros[i];

TAMBÉM?

''é isto que entendo neste pedaço de código na nossa escrita e não percebo o porquê do else, ou então ainda nao sei interpretar os ciclos''

if(resultadoj.eMenor(resultadoi))
       vencedor = ListaCarros[i];
else
       vencedor = ListaCarros[i];

Share this post


Link to post
Share on other sites
bioshock

Não entendes porque não é racional. Isso está errado.

Se independentemente ser eMenor ou não o resultado for o mesmo, não precisas dessa condição.

A lógica de como deves proceder já te foi dada.

Share this post


Link to post
Share on other sites
KTachyon

E para o que se pretende, como também tinha dito, um dos ciclos não é necessário.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
msmsms

o programa errado não está pois ele roda e utilizando todo esse método ou não ele roda e faz o efeito esperado, nesse caso um vencedor é devolvido!

quando coloquei a duvida não queria conhecer alternativas a este método mas sim percebe-lo completamente e ver o que nele é útil e o que se calhar era desnecessário...

''ArrayList não poderia ser utilizado na realização deste exercício, é regra!''

Share this post


Link to post
Share on other sites
KTachyon

o programa errado não está pois ele roda e utilizando todo esse método ou não ele roda e faz o efeito esperado, nesse caso um vencedor é devolvido!

É devolvido um vencedor, mas será que esse vencedor é de facto o carro que teve o melhor resultado? A não ser que o carro que esteja na última posição tenha a melhor pontuação, isso não vai acontecer. E, mesmo que assim fosse, seria mais fácil simplesmente retornar o último carro da lista, que se faz numa só linha:

Carro obterCondutorComMaisVitorias() {
   return ListaCarros[ListaCarros.length-1];
}


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
msmsms

É devolvido um vencedor, mas será que esse vencedor é de facto o carro que teve o melhor resultado? A não ser que o carro que esteja na última posição tenha a melhor pontuação, isso não vai acontecer. E, mesmo que assim fosse, seria mais fácil simplesmente retornar o último carro da lista, que se faz numa só linha:

Carro obterCondutorComMaisVitorias() {
   return ListaCarros[ListaCarros.length-1];
}

mas devolver o ultimo carro da lista nao é devolver todos os vencedores é devolver apenas um

e pode haver mais de um vencedor...

Share this post


Link to post
Share on other sites
KTachyon

Não era essa a conclusão a que eu queria que chegasses, mas tass... Vai ver o post que fiz ontem às 16:12. Tens lá o código para retornares todos os vencedores.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.