Ir para o conteúdo
  • 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

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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];

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!''

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.