Faz login para seguires isto  
Seguidores 0
Lopson

Problema a fazer programa Java

22 mensagens neste tópico

Estou a fazer um simples programa de Scanner, para procurar e printar inteiros dentro dum ficheiro. Mas, sendo eu o azelha que sou a Java, gostaria que me ajudassem com ele. Eis o código do programa:

import java.io.*;
import java.util.*;

class readnumbers {
    public static void main(String[] args) throws Exception
    {
Scanner i = new Scanner(new File("aula2_2.txt"));
do {
    int num = i.nextInt();
    System.out.println(num);
} while(i.hasNextInt());
    }
}

E eis o ficheiro em questão a levar com o Scanner:

  123   12345678912345
     
123.456789 @      last
      not-garbage     MORE  garbage
  3456  90
  3456  90
  3456  90
  3456  90

O programa, de momento, simplesmente retorna o primeiro número, 123. Halp!

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Problema com o iterador, apostaria.

Scanner i = new Scanner(new File("aula2_2.txt"));

do {

    int num = i.nextInt();

    System.out.println(num);

} while(i.hasNextInt());

O Scanner é uma classe já existente? Vai espreitar como funciona o iterador da classe.

Pelo nome dos metodos, parece que o codigo devia  funcionar sim.[br]

Mensagem unida a: 22-03-2009, 01:59:18


Ja fui ver a interface, pois, parece q devia funcionar. Talvez nao aceite o numero seguinte por ser um int demasiado grande. Tenta com nextLong ou assim[br]

Mensagem unida a: 22-03-2009, 02:08:14


Isso do Scanner parece mesmo giro, porque será q o david matos nao falou nisso lol.

Ah Java, linguagens de alto nivel, ja c tudo feito, e por isso só sendo preciso ler o manual[br]

Mensagem unida a: 22-03-2009, 02:10:48


'Java SE Platform Complete Specification Manual', deverá ser mais longo q o Guerra e Paz e Os Miseráveis juntos, lol.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Pá, não percebo o que queres fazer. 12345678912345 não cabe num int (experimenta o que o Maje disse), e 123.456789 nem sequer é inteiro. É suposto ignorá-los? Nesse caso tens de fazer um parser para tokens ou strings, acho eu. Nesse caso espreita o StreamTokenizer.

Referencia, para ter sempre aberta num browser quando se está a lidar com Java: http://java.sun.com/javase/6/docs/api/

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Int vai de -2^31 até 2^31, portanto esse não é o problema. De qualquer forma, a verdade é que ele não lança cá para fora nem o 3456 nem o 90, porque não lançar o 123.456789 já eu esperava (visto não ser um Int, mas um Float).

Já agora, Maje, o Scanner é uma classe já definida em java.util.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

ya, ja fui ver. parece uma classe gira de usar (hmm, tb de classes IO de java só conheço o BufferedReader ou FormattedReader ou la como se chama).

De qualquer forma, a verdade é que ele não lança cá para fora nem o 3456 nem o 90, porque não lançar o 123.456789 já eu esperava

ora, se começas a ler no  '123' e o teu ciclo tem como condição o 'i.hasNextInt()', como o numero a seguir não é um Int o ciclo acaba. é o que acontece no '12345678912345' provavelmente.

Int vai de -2^31 até 2^31, portanto esse não é o problema.

12345678912345 =  12 345 678 912 345, ou seja, ~10^13. É muito maior q um int lol. O UINT vai até ~4 mil milhoes

É suposto ignorá-los? Nesse caso tens de fazer um parser para tokens ou strings, acho eu. Nesse caso espreita o StreamTokenizer.

Acho q o objectivo era esse, ignorar o q não fosse ints.

Usando o Scanner, eu faria:

while ( i.hasNext())

{

     if (i.hasNextInt())

          num = i.nextInt();

     else 

          lixo = next();

}

para avançar o stream pointer saltando pelos tokens/strings não validos.

[br]

Mensagem unida a: 22-03-2009, 14:15:41


assumindo q o scanner ignora os classicos 'caracters brancos' e os usa como separadores de tokens.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Okay, já o consegui meter a funceminar. Eis o código final:

import java.io.*;
import java.util.*;

class readnumbers {
    public static void main(String[] args) throws Exception
    {
Scanner i = new Scanner(new File("aula2_1.txt"));
int num;
String lixo;
do {
    if(i.hasNextInt()){
	num = i.nextInt();
	System.out.println(num);
    }
    else{
	lixo = i.next();
    }
} while(i.hasNext());
    }
}

Obrigado pela vossa ajuda. É que, muito honestamente, o Java não é uma linguagem fácil de se entrar logo à primeira.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais
É que, muito honestamente, o Java não é uma linguagem fácil de se entrar logo à primeira.
Só podes estar a gozar.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Uh, nop, não estou. Bem, agora que pratiquei um pouco, posso dizer que não é tão difícil como esperava, mas mesmo assim troco-me todo quando é para definir coisas como rectângulos e afins. É só uma questão de tempo e de leitura constante da API...

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Pensei o mesmo q o wildstar lol. "Java é amigo" ~~ :P

rectângulos?[br]

Mensagem unida a: 22-03-2009, 21:17:09


ainda sobre o programa, provavelmente não precisavas do lixo sequer, era só chamares o next(); sem mais nada.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais
import java.util.Scanner;

import java.io.File;

import java.io.IOException;

public class MainClass {

  public static void main(String args[]) throws IOException {

Scanner i = new Scanner(new File("aula2_2.txt"));

while (i.hasNext()) {

if (i.hasNextInt())

System.out.println(i.nextInt());

else

    i.next();

}

  }

}

Começa com a condição logo, visto o ficheiro poder estar vazio, poupas logo um ciclo desnecessário. A única variável que precisas é também a i, visto ires imprimir logo de seguida o número, não o precisas de guardar. As bibliotecas pus separadas, prefiro chamar apenas o que vou usar em vez de toda a biblioteca, mas também os professores estão-se pouco cagando para isso. Podes condensar mais a escrita, mas é desnecessário e até mau hábito (garanto-te, levas com cortes 'violentos' nas notas de início se te pões com isso, tipo eu).

E Lopson, Java é uma linguagem fácil de se entrar, o método que ensino é que é, a meu ver, bastante mau para quem começa agora a programar. Nem que se desse 1 mês de básicos, mesmo, ou então algo tipo Pascal uma semana ou duas para se ambientar.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Uhm, onde? Ah desculpem, estava "test.txt" em vez de "aula2_2.txt", era isso?

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Okapa, nota tomada e memorizada. Danke pela vossa ajuda, pessoal.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Uhm, onde? Ah desculpem, estava "test.txt" em vez de "aula2_2.txt", era isso?

um ponto e virgula a mais q, pelo q vejo, dps retiraste lol.

para alguem com o teu nivel de picuinhice a escrever nas nets, pensei q lficasses agradecido pela chamada de atençao ;)[br]

Mensagem unida a: 23-03-2009, 20:18:18


Lopson, a q rectângulos te referias? janelas graficas?

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Uhm? Simplesmente copiei de novo o .txt e alterei a parte do "test". Se tinha a mais não notei, deve ter sido do primeiro.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

Não, Maje, referia-me a rectângulos sem serem gráficos, apenas uma classe capaz de dar quatro coordenadas que, juntas, pudessem formar um rectângulo.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

hmm. que usas para definir os rectangulos? alguma classe ja da java framework/alguma api?

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

http://www.dcc.fc.up.pt/~fds/aulas/EDados/0809/Praticas/problemas/prob88.html

Tenho que fazer isto em duas semanas, sem saber uma ponta de arrays e matrizes, fuck yeah.

Se alguém chegou a fazer isto e estiver disposto a me explicar como raio transformo o input numa matriz, ficaria-lhe grato. Se não, então caguem. O resto ainda se vai fazendo, mas o input disto é lixado até dizer chega. Sei apenas que tenho obrigatoriamente de lidar com ele como se fosse um input de teclado, o que sei fazer, mas a transformação para matriz ultrapassa-me.

Já agora, Maje: os rectângulos são definidos à labrego, sem APIzinhas e frameworks. Em vez de te enfiar o rectângulo, dou-te o exemplo de como definir um ponto:

class Point {
    // Variáveis privadas da classe
    private int x, y;

    // Construtor 'default'
    Point() {
x = y = 0;
    }

    // Construtor com 2 argumentos
    Point(int x, int y) {
/* Para referenciar á própria classe usa-se
           a palavra reservada 'this' */
this.x = x;
this.y = y;
    }

    int getX() {
return x;
    }

    int getY() {
return y;
    }

    void setX(int x) {
this.x = x;
    }

    void setY(int y) {
this.y = y;
    }    
}


class TestPoint {
    public static void main (String[] args){
Point p1 = new Point();

System.out.println("Ponto 1: " + p1.getX() + "," + p1.getY());
p1.setX(1);
System.out.println("Ponto 1: " + p1.getX() + "," + p1.getY());

// Variáveis novas podem ser declaradas em qualquer parte do código
Point p2 = new Point(2,3);
System.out.println("Ponto 2: " + p2.getX() + "," + p2.getY());

    }
}

A classe no final, a Test Point, é só mariquices, caga nela.

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

http://www.dcc.fc.up.pt/~fds/aulas/EDados/0809/Praticas/problemas/prob88.html

Tenho que fazer isto em duas semanas, sem saber uma ponta de arrays e matrizes, fuck yeah.

well, o pior é a alocaçao/declaração, mas java é amigo - o new é bastante facil de usar, e o garbage collector limpa-te os dados no final sem problemas.

Manipular matrizes (se tou a interpretar bem a tua duvid) é feito c 2 indices, como se fosse 1 pra o nº da coluna e outro pra linha (só importa que o index q parece primeiro é o principal).

isto acho q dá pra usar um simples ciclo for-each. deve ficar assim, para uma matriz NxM ( Tipo mat[N][M]):

Tipo[][] mat = new Tipo[N] [M]; // declaração

for ( Tipo i : mat )

    do_something(i);

para alterares a matriz, nao deves poder usar o proprio iterador daquela forma. usando um classico for:

for ( int i = 0; i <N; i++ )

     for ( int j = 0; j <N; j++ )

          mat[ i][j] = xpto;

mat[ i][j] é o proprio valor dessa entrada da matriz. no ciclo anterior, o iterador-elemento 'i' provavelmente (mind you, nao sei mesmo como implementem eles o for-each) é copiado para memoria, e por isso se mudares o seu valor, isso nao se repercute na matriz mesmo.

Para leres o input, só precisas de ler char a char. Esta classe deve-te servir:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataInput.html

Não sei como funcionam os wide-char's (chars de 2 bytes) em java, mas isso tb deve ser transparente se usares essa classe.


Se interpretei bem o problema (só li o enunciado do projecto na diagonal, so..) o que tens de fazer é só isto:

int N = readChar();
int M = readChar();
char matriz[][[] = new char[N][M];

for ( int i = 0; i <N; i++ )
     for ( int j = 0; j <N; j++ )
         matriz[ i][j] = readChar();

Isto se souberes exactamente as dimensões à partida.

[edit]

Input

A primeira linha contém três inteiros positivos: o número de linhas L e de colunas C que determinam a dimensão da grelha do jogo e o número de iterações I que devrá realizar.

Seguem-se L linhas de caracteres a representar o estado actual do jogo. As células mortas estão representadas por '.' e as vivas por 'O'.

ok, dão-te as dimensões, podes fazer daquela forma.

Se não te dessem as dimensões á partida ja se tornava interessante :3 Se eu soubesse mais de java podia fazer isto eficientemente, mas como sou noob ainda... tenho de sair, ja ca volto e faço isto[br]

Mensagem unida a: 11-04-2009, 15:23:20


Quando não se sabe as dimensoes a priori, tem-se de usar uma das seguintes estrategias:

1 - 'seekar' o input: fazer varias leituras reposicionando o stream pointer. nao é grande solução, nada elegante

2 - copiar o input todo para memoria e dps parsar em memória.

3 - pre-alocar uma matriz suficientemente grande para conter todo o input, e dps do parsing feito e da matriz ficar sub-preenchida, ou ignora-se a parte não usada, ou realoca-se a matriz

Eu usaria-se a 2ª hipotese:

char buffer[] = new char[MAX_SIZE];

for ( int i = 0; i < MAX_SIZE; i++ )           // set a 0

      buffer[ i] = 0;

int flag = 0;

try readFully(buffer);

catch(EOFException eo)

     flag = 1;

catch(IOException eo)

{

     System.out.println(eo);

     flag = 1;

}

finally

     if (!flag)     

           System.out.println("Buffer overflow");

int N = MAX_SIZE;   // a ser mudada, segundo indice da matriz

int k = 0, i = 0;

     for ( int j = 0; buffer[k] ; k++, j = 0, i++ )

         if ( buffer[k] != '\n')

              matriz[ i][j] = buffer[k];

         else

         {

                if ( N == MAX_SIZE) N = j;

                break;

          }

int M = i;

O ciclo de leitura do buffer termina qd buffer[k] == 0, ou seja, qd se chega à 1ª posição não lida do input.[br]

Mensagem unida a: 11-04-2009, 19:35:24


o codigo tá pouco refinado, mas serve pra dar uma ideia geral

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais

/*
* Titulo do Trablho: O Jogo da Vida
* 
* Autor:
*  Gonçalo Manuel Duarte Lourenço
*/
import java.util.*;
class ojogodavida{
/*
* Secção geradora de Matriz
*/
    public static void main(String args[]){
        Scanner stdin = new Scanner(System.in);
        int L = stdin.nextInt();//Linhas
        int C = stdin.nextInt();//Colunas
        int I = stdin.nextInt();//Iterações
        int c;
        char matriz[][] = new char[L][C];
        
        stdin.nextLine();
        for (int i=0; i<L; i++){
            String linha=stdin.nextLine();
            for (int j=0; j<C; j++){
                matriz[i][j] = linha.charAt(j);
            }
        }
                
        for (int g=I; g>0; g--){
            char matroz[][] = new char[L][C];   
            for (int i=0; i<L; i++){
                for (int j=0; j<C; j++){
                    c=0;//Contador das células vizinhas vivas
                
                    /*
                     * Vamos verificas os vizinhos, mas se ele tiver na posição (0,0), 
                     * não verifica a linha de cima nem a coluna anterior
                     */
                    if (i!=0){
                        if(j!=0){
                            if(matriz[i-1][j-1]=='O'){
                                c++;
                            }
                        }
                    }
                
                    /*
                     * * Só verifica os vizinhos da linha anterior, se não estiver na posição de coordendas (0,j)
                     * * */
                    if (i!=0){
                        if (matriz[i-1][j]=='O'){
                            c++;
                        }
                    }
                    
                    /*
                     * Os vizinhos são verificados na linha anterior, coluna seguinte, se não estiver
                     * na primeira linha e última coluna
                     */
                    if (i!=0){
                        if(j!=(C-1)){
                            if (matriz[i-1][j+1]=='O'){
                                c++;
                            
                            }
                        }
                    } 
                    
                    /*
                     * Só analisa o elemento da mesma linha, coluna seguinte, se nao estiver na última coluna
                     */
                    if (j!=(C-1)){
                        if(matriz[i][j+1]=='O'){
                            c++;
                        }
                    }
                    
                    /*
                     * É analisado o elemento da linha e coluna seguinte, se este não estiver na última linha e coluna
                     */
                    if (i!=(L-1)){
                        if(j!=(C-1)){
                            if(matriz[i+1][j+1]=='O'){
                                c++;
                            }
                        }
                    }
                                    
                    /*
                     * A análise é feita ao elemento da mesma coluna e da linha seguinte, se o elemento, 
                     * cuja vizinhança está a ser analisada, não estiver na última linha
                     */
                    if (i!=(L-1)){
                        if(matriz[i+1][j]=='O'){
                            c++;
                        }
                    }
                    
                    /*
                     * A verificação é feita ao elemento da linha seguinte e de coluna anterior apenas se
                     * a célula a ser investigada não estiver localizada na linha final da matriz
                     */
                    if (i!=(L-1)){
                        if(j!=0){
                            if(matriz[i+1][j-1]=='O'){
                                c++;
                            }
                        }
                    }
                    /*
                     * A verificação é realizada ao elemento em questão apenas se ele 
                     * não se localizar na última coluna
                     */
                    if (j!=0){
                        if(matriz[i][j-1]=='O'){
                            c++;
                        }
                    }                
                    
                    /*
                     * Condições a verificar se o conteúdo da célula a ser analisada for um ponto (.),
                     * isto é, se estiver morta:
                     * -- Se o nº de células vivas na vizinhança for igual a 3, então a cécula muda para o estado viva
                     * -- Se o nº de células vivas na vizinhança for diferente, então a célula mantem-se no estado morta
                     */
                    if (matriz[i][j]=='.'){
                        if (c==3){
                            matroz[i][j]='O';
                        }
                        else{
                            matroz[i][j]='.';
                        }
                    }
                    
                    /*
                     * Condições a verificar se o conteúdo da célula a ser analisada for um "O",
                     * isto é, se estiver viva:
                     * -- Se o nº de células vivas na vizinhança for igual a 2 ou 3, então a célula mantem-se no estado viva
                     * -- Se o nº de células vivas na vizinhança for diferente, então a célula muda para o estado morto
                     */
                    if (matriz[i][j]=='O'){
                       if (c==2 || c==3){
                            matroz[i][j]='O';
                        }
                        else{
                            matroz[i][j]='.';
                        }
                    }
                }
                
            }
            matriz=matroz;
        }
        for(int i=0; i<L; i++){
            for(int j=0;j<C; j++){
                System.out.print(matriz[i][j]);
            }
            System.out.println();
        }
    }
}

hy mage, ow r u doin.

Caga nisso, mage, já o fiz. Brigado pela ajuda na mesma. ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar nas redes sociais
Faz login para seguires isto  
Seguidores 0