Duvida de iniciante

10 respostas
thiago_hora

ola eu estou começando em java ,entendo um pouco de POO em delphi .Ainda estou nos programas bem bobinhos soh queria saber pq q nesse codigo que vou mostra abaixo o java naum entra no for (laço).

public class estudos
{
 private static int contimpar,ind;

 public static void main(String[] args)
    {
     int numero;
     contimpar = 0;
     numero = 10;
     System.out.println(metodo1(numero));

    }

    public static int metodo1(int x)
   {
   
     for(ind = 0;ind == x;++ind)
     {
         if (ind % 2!=0)
             contimpar = contimpar + 1;
     }
     
     return contimpar;
   }
   
}

10 Respostas

malves_info

Tente colocar ind++ e não ++ind

[]'s

ViniGodoy

É um bom chute, mas o jeito que ele fez está certo.

O problema está na condição. Você está dizendo para o for repetir enquanto que x == ind. E isso nunca é verdade.
for(ind = 0;ind == x;++ind)

Acho que você queria dizer:
for(ind = 0;ind < x;++ind)

thiago_hora

jah tentei ele naum entra no for ele pula direto pro return !!
:frowning:

Andre_Brito

Olha a condição de parada do for (se ind for igual a número, pare).

Malves,
Isso não influencia não. Até li uma vez no TopCoder que é mais rápido ++i do que i++ em C++… Até hoje não conseguiram me convencer disso.

ViniGodoy,
Desculpa! Acho que cliquei em responder e fui ver o código do Thiago. Desculpa mesmo!

thiago_hora

valew ViniGodoy era isso mesmo pior q eu olhei olhei e naum vi isso obrigado !!!

malves_info

Não foi chute e sim o padrão utilizado. Mas tinha visto esse == e ja ia alerta sobre isso.

T

a) Não use um monte de "static". O único "static" que deve haver em um programa de iniciante é o "public static void main". Vou adaptar seu programa e corrigi-lo.
b) Leia os comentários.

// Comece os nomes das classes por maísculas
public class Estudos {
    // evite o uso indiscriminado de variáveis de instância ou estáticas, se elas não forem necessárias

    public static void main(String[] args) {
        // Acostume-se sempre a criar um objeto, mesmo que seja para uma coisa simples como esta:
        Estudos es = new Estudos();
        int numero = 10;
        System.out.println ("Contagem dos inteiros positivos impares que vao de 1 até " + numero + ", inclusive");
        System.out.println(es.metodo1(numero));
    }

    // Use um nome mais elucidativo para um método
    public int metodo1(int x) {
        int contimpar = 0;
        // a) O "for" normalmente é com "=", "<=", "++" ou então "=", "<", "++"
        // (Se for contar de trás para frente, use "=", ">=", "--" ou "=", ">", "--")
        // b) Declare a variável de contagem o mais perto possível de seu uso, ou seja, dentro do for
        for (int i = 1; i <= x; ++i) {
            if (i % 2 != 0) {
                contimpar = contimpar + 1;
            }
        }
        return contimpar;
    }
}
ViniGodoy

É sim.

Veja bem, para fazer i++, o compilador precisa manter o estado da variável inalterado por durante toda a execução da linha.
Para fazer isso, o C++ gera uma cópia da variável i, que será usada na linha, e já faz a atribuição na variável real, que será usada na linha seguinte.

Isso não é um problema se i for uma variável de tipo primitivo (a menos que você esteja rodando num dispositivo muito restrito), mas pode se tornar se i for um SmartPointer ou um outro objeto mais complexo qualquer, com um tempo de cópia longo.

No caso do ++i, não existe esse problema.

Não se fala em padrão no código dos outros, a menos que fujam muito do padrão da Sun. De qualquer forma, o que você falou não tem qualquer relevância para solução do problema.

T

Andre Brito:
Até li uma vez no TopCoder que é mais rápido ++i do que i++ em C++…

++i em vez de i++ é mais rápido em loops em C++
SE o tipo da variável não for primitivo
E o operador ++ for sobreescrito na declaração da classe dessa variável
E houver alguma particularidade no “copy constructor”
E (a otimização do compilador estiver desligada OU o copy constructor for muito complicado para o compilador conseguir otimizá-lo).

Ou seja, na média você não precisa se preocupar.

Eu gosto de usar “++i” porque até agora não me acostumei com o “i++” (que, obviamente, rima com “C++”, e é por isso que é muito usado).

ViniGodoy

Na verdade, na programação atual, você muito, muito, muito dificilmente terá problemas com microcódigo como esse.

Geralmente, problemas de performance concentram-se em:

  1. I/O (SQLs lentas ou redundantes, leituras de arquivo mal escritas, maus caches, etc).
  2. Rede (que não deixa de ser I/O, mas com certas particularidades);
  3. Estruturas de dados mal utilizadas (lists no lugar de sets, algoritmos de ordenação ineficientes, etc);

Você só terá problemas com minuncias dessas se estiver escrevendo software em dispositivos minúsculos. Ou software para hardware muito otimizado (como vídeo).

Em resumo, use ++i no lugar de i++, porque i++ rima com c++. :lol:

Criado 15 de julho de 2009
Ultima resposta 15 de jul. de 2009
Respostas 10
Participantes 5