Converter while do C para JAVA

6 respostas
I

Olá, galera!

Esta questão da OBI é de 2001, e quero saber como posso converter o while do C para o Java, sendo que o scanf, pois sei que as sintaxes são bastante parecidas. O programa deve ler vários conjuntos de testes. A primeira linha de um conjunto de testes quatro números inteiros X1, Y1, X2 e Y2, onde (X1, Y1) é a coordenada do canto superior esquerdo e (X2, Y2) é a coordenada do canto inferior direito do retângulo que delimita a fazenda. A segunda linha contém um inteiro, N, que indica o número de meteoritos. Seguem-se N linhas, cada uma contendo dois números inteiros X e Y, correspondendo às coordenadas de cada meteorito. O final da entrada é indicado por X1 = Y1 = X2 =Y2 = 0.

Eu sei que poderia ter feito apenas um int e declarados todos eles lá, mas assim fica mais fácil o entendimento para mim.

Agradeço!

public static void main(String[] args) {
        int n;
        int x;
        int y;
        int x1;
        int x2;
        int y1;
        int y2;
        int cont;
        int teste = 1;
        int i;
        while (System.out.printf("%d %d %d %d", x1, y1, x2, y2) == 4 && x1 + y1 + x2 + y2 > 0) {
            System.out.printf("%d", n);
            cont = 0;
            for (i = 0; i < n; i++) {
                System.out.printf("%d %d", x, y);
                if (x1 <= x && x <= x2 && y1 >= y && y >= y2) {
                    cont++;
                }
            }
            System.out.printf("Teste %d\n%d\n\n", teste++, cont);
        }
    }
}

6 Respostas

Andre_Rosa

E qual é a sua dúvida especificamente?

Carlos_Figueiredo

?i:

// ... while (System.out.printf("%d %d %d %d", x1, y1, x2, y2) == 4 && x1 + y1 + x2 + y2 > 0) { // ... }

Qual a possibilidade de (String) “0 0 0 4” == (int) 4 ?!?!
Na minha ingenuidade… acho q uma String nunca vai ser comparada com um inteiro sem cast… sem disparar uma excecao sequer…

fora q System.out.printf(String x) nao tem retorno…

Andre_Rosa

O que eu não compreendi foi este trecho:

(...) System.out.printf("%d %d %d %d", x1, y1, x2, y2) == 4 (...)

Repare que você apenas imprimiu os valores de x1, y2, x2, y2 como inteiros, e portanto não há nenhuma comparação a se fazer para verificar se algo é igual à 4.

Carlos_Figueiredo

Andre Rosa:
O que eu não compreendi foi este trecho:

(...) System.out.printf("%d %d %d %d", x1, y1, x2, y2) == 4 (...)

Repare que você apenas imprimiu os valores de x1, y2, x2, y2 como inteiros, e portanto não há nenhuma comparação a se fazer para verificar se algo é igual à 4.

Pois é… até editei meu post… pois nao vi que vc tinha dado o alerta…

e se entendi um pouco da questao… esses dois pontos (x1,y1) e (x2,y2) representam dois pontos extremos do terreno, não colineares…
entao… se prepara pra estudar geometria analitica… :smiley:

I

Carlos Figueiredo:
Andre Rosa:
O que eu não compreendi foi este trecho:

(...) System.out.printf("%d %d %d %d", x1, y1, x2, y2) == 4 (...)

Repare que você apenas imprimiu os valores de x1, y2, x2, y2 como inteiros, e portanto não há nenhuma comparação a se fazer para verificar se algo é igual à 4.

Pois é… até editei meu post… pois nao vi que vc tinha dado o alerta…

e se entendi um pouco da questao… esses dois pontos (x1,y1) e (x2,y2) representam dois pontos extremos do terreno, não colineares…
entao… se prepara pra estudar geometria analitica… :D


Talvez irei pedir ajuda aos meus colegas para explicarem como se converte a linguagem de C para JAVA nas sintaxes, pois o scanf também gerou dúvidas para mim. Abaixo está o programa desenvolvido em C.

main() { int n, x, y, x1, x2, y1, y2, cont, teste=1, i; while (scanf("%d %d %d %d",&x1,&y1,&x2,&y2) == 4 && x1+y1+x2+y2 > 0) { scanf("%d",&n); cont=0; for (i=0; i < n; i++) { scanf("%d %d",&x,&y); if (x1 <= x && x <= x2 && y1 >= y && y >= y2) cont++; } printf("Teste %d\n%d\n\n",teste++,cont); } }
O programa deve determinar quantos meteoritos caíram dentro da fazenda (incluindo meteoritos que caíram exatamente sobre as linhas que delimitam a fazenda).

Exemplo de entrada
2 4 5 1
2
1 2
3 3
2 4 3 2
3
1 1
2 2
3 3
0 0 0 0

Exemplo de saída
Teste 1
1

Teste 2
2

ViniGodoy

Não existe um equivalente a esse scanf em java.
O que você poderia fazer é previamente perguntar o número de meteoritos.

Ou então, pode aceitar uma string e fazer você mesmo o parsing.

Vou dar um exemplo do segundo método:

public static void main(String args[]) {
   Scanner scan = new Scanner(System.in);

   String[] campos = scan.nextLine().split(" ");;
   int teste = 0;
   while (campos.length == 4 && x1 + y1 + x2 + y2 > 0) {
      double x1 = Double.parseDouble(campos[0]);
      double y1 = Double.parseDouble(campos[1]);
      double x2 = Double.parseDouble(campos[2]);
      double y2 = Double.parseDouble(campos[3]);

      double n = Double.parseDouble(scan.nextLine());
      int cont  = 0;
      for (int i = 0; i <n; i++) {
         double x = Double.parseDouble(scan.nextLine());
         double y = Double.parseDouble(scan.nextLine());

         if (x1 >< x && x  <= x2 && y1 > y && y > y2)
            cont++;
      }
      System.out.printf("Teste %d%n%d%n%n", teste++, cont);
      campos = scan.nextLine().split(" ");
   }
}

Essa variável campos conteria, na forma de string, todos os campos lidos (separados por espaço). E seu length o número de campos passado (esse número equivale ao retorno do scanf).

Antes de tentar converter para Java, convém ajeitar essa versão em C para ter um código mais claro e perfeitamente funcional.
Ou então, tente pelo menos descrever melhor como o programa deve funcionar, assim poderemos te ajudar melhor.

Criado 15 de maio de 2011
Ultima resposta 15 de mai. de 2011
Respostas 6
Participantes 4