8
respostas

Lendo x e y

Oi pessoal, eu escrevi o código abaixo para ler duas variáveis de entrada x e y:

package General;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Locale;
    import java.util.Scanner;

        public class InputDatas2 


{        public InputDatas2()
{            super(); }        


        ComputationalProperties comprop = new ComputationalProperties();
        int imax = comprop.getImax();
        int jmax = comprop.getJmax();

        private double xynode [] [] [] = new double [imax+1] [jmax+1] [3];
        int i = 1;
        int j = 0;

        public static void main (String[] args) {}

        public void InputDatas2Procedure(double xynode[] [] []) throws FileNotFoundException


//        Fluxo de entrada com arquivo        

{        Scanner scanner = new Scanner(new File("Datas2.csv"));
        while (scanner.hasNextLine())
{            String linha = scanner.nextLine();
            Scanner linhaScanner = new Scanner(linha);
            linhaScanner.useLocale(Locale.US);                
            linhaScanner.useDelimiter(",");
            String text1  = linhaScanner.next();
            String text2  = linhaScanner.next();
            j = j+1;
            xynode [i] [j] [1] = Double.parseDouble(text1);
            xynode [i] [j] [2] = Double.parseDouble(text2);
            if (j == jmax)
{                i = i+1;
                j = 0; }
        linhaScanner.close(); }
        scanner.close();
        for (int i = 1; i <= imax; i++)
{            for (int j = 1; j <= jmax; j++)
{                System.out.println(xynode [i] [j] [1]);
                System.out.println(xynode [i] [j] [2]); } } } }

e imprimi-las no console. Só que aparentemente o programa não está lendo as variáveis. Alguém teria uma sugestão sobre aonde eu estou errando? Fico no aguardo e obrigado pela atenção.

8 respostas

Oi Edisson, tudo bem?

Para que o programa leia as entradas, você precisa chamar o método InputDatas2Procedure em um método main. Para isso, você precisa:

  1. Excluir o construtor da classe, já que ele não é utilizado, e essa é uma classe main, que executa as tarefas
  2. Passar seu código que está antes do método main para dentro do método InputDatas2Procedure;
  3. Declarar o método InputDatas2Procedure como static, para conseguir chamá-lo no main.
  4. No método main, apenas instanciar o xynode, e chamar o metodo InputDatas2Procedure paassando-o como parâmetro.

Depois das mudanças, fica assim:

public class InputDatas2 {

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


        double xynode[][][] = new double[imax + 1][jmax + 1][3];


        InputDatas2Procedure(xynode);
    }

    public static void InputDatas2Procedure(double xynode[][][]) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("Datas2.csv"));
        ComputationalProperties comprop = new ComputationalProperties();
        int imax = comprop.getImax();
        int jmax = comprop.getJmax();
        int i = 1;
        int j = 0;
        while (scanner.hasNextLine()) {
            String linha = scanner.nextLine();
            Scanner linhaScanner = new Scanner(linha);
            linhaScanner.useLocale(Locale.US);
            linhaScanner.useDelimiter(",");
            String text1 = linhaScanner.next();
            String text2 = linhaScanner.next();
            j = j + 1;
            xynode[i][j][1] = Double.parseDouble(text1);
            xynode[i][j][2] = Double.parseDouble(text2);
            if (j == jmax) {
                i = i + 1;
                j = 0;
            }
            linhaScanner.close();
        }
        scanner.close();
        for (int k = 1; k <= imax; k++) {
            for (int l = 1; l <= jmax; l++) {
                System.out.println(xynode[i][j][1]);
                System.out.println(xynode[i][j][2]);
            }
        }
    }
}

Acredito que, dessa forma, vovcê consiga ler as entradas normalmente.

Espero ter ajudado, abraços.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Boa tarde Yasmim,

Eu fiz a modificação que você sugeriu, resultando no código abaixo. Note que o computationalProperties teve que ser definido no começo do programa e no meio do programa. Isto porque o imax e o jmax definem a dimensão do xynode [] [] [] e o xynode foi definido no começo do código. Precisei definir novamente porque o código não compilava. Eu anexei no final desta mensagem a imagem com o erro acusado pelo compilador após a implementação. Mas se não der para ver, mais abaixo tem o erro indicado. Se você puder dar uma olhada e ver o que está errado eu lhe agradeço. Edisson Sávio.

package General;

import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Locale;
    import java.util.Scanner;

public class InputDatas2

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


{        ComputationalProperties comprop = new ComputationalProperties();
        int imax = comprop.getImax();
        int jmax = comprop.getJmax();

double xynode [] [] [] = new double [imax+1] [jmax+1] [3];

InputDatas2Procedure(xynode);  }

public static void InputDatas2Procedure(double xynode [] [] []) throws FileNotFoundException
//        Fluxo de entrada com arquivo                
{        Scanner scanner = new Scanner(new File("Datas2.csv"));
        ComputationalProperties comprop = new ComputationalProperties();
        int imax = comprop.getImax();
        int jmax = comprop.getJmax();
        int i = 1;
        int j = 0;
        while (scanner.hasNextLine())
{            String linha = scanner.nextLine();
            Scanner linhaScanner = new Scanner(linha);
            linhaScanner.useLocale(Locale.US);                
            linhaScanner.useDelimiter(",");
            Double number1  = linhaScanner.nextDouble();
            Double number2  = linhaScanner.nextDouble();
            j = j+1;
            xynode [i] [j] [1] = number1;
            xynode [i] [j] [2] = number2;
            if (j == jmax)
{                i = i+1;
                j = 0; }
        linhaScanner.close(); }
        scanner.close();
        for (int m = 1; m <= imax; m++)
{            for (int n = 1; n <= jmax; n++)
{                System.out.println(xynode [m] [n] [1]);
                System.out.println(xynode [m] [n] [2]); } } } }

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Código Executado

Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextDouble(Scanner.java:2564) at renecoreflows2d/General.InputDatas2.InputDatas2Procedure(InputDatas2.java:35) at renecoreflows2d/General.InputDatas2.main(InputDatas2.java:18)

Para que você nao instancie o objeto duas vezes, você pode passar imax e jmax como parametros, não tinha me atentado ao erro de compilação. O código dessa parte fica assim:

public class InputDatas2 {

    public static void main(String[] args) throws FileNotFoundException {
        ComputationalProperties comprop = new ComputationalProperties();
        int imax = comprop.getImax();
        int jmax = comprop.getJmax();

        double xynode[][][] = new double[imax + 1][jmax + 1][3];

        InputDatas2Procedure(xynode, imax, jmax);
    }

    public static void InputDatas2Procedure(double xynode[][][], int imax, int jmax) throws FileNotFoundException
//        Fluxo de entrada com arquivo
    {
        Scanner scanner = new Scanner(new File("Datas2.csv"));

        int i = 1;
        int j = 0;
        while (scanner.hasNextLine()) {
            String linha = scanner.nextLine();
            Scanner linhaScanner = new Scanner(linha);
            linhaScanner.useLocale(Locale.US);
            linhaScanner.useDelimiter(",");
            Double number1 = linhaScanner.nextDouble();
            Double number2 = linhaScanner.nextDouble();
            j = j + 1;
            xynode[i][j][1] = number1;
            xynode[i][j][2] = number2;
            if (j == jmax) {
                i = i + 1;
                j = 0;
            }
            linhaScanner.close();
        }
        scanner.close();
        for (int m = 1; m <= imax; m++) {
            for (int n = 1; n <= jmax; n++) {
                System.out.println(xynode[m][n][1]);
                System.out.println(xynode[m][n][2]);
            }
        }
    }
}

Com relação ao Scanner, confere por favor se, na hora de testar, você está passando os doubles no formato certo. Seu código espera entradas do tipo 1.0747,3.583, ou seja, dois números do tipo double, que devem sempre ter o ponto e as casas decimais. Esses números devem estar separados por uma vírgula e nada mais, porque senão o Scanner não entende os formatos diferentes. Caso queira inserir um espaço para ficar mais organizado, como nesse exemplo: 1.0747, 3.583, você pode adicionar um espaço no delimiter: linhaScanner.useDelimiter(", ");.

Espero que dê certo!

Boa noite Yasmim,

Muito obrigado, o problema era mesmo nos números de entrada. Agora eu já corrigi e passei para a primeira parte do comando de leitura. A primeira parte é a "InputDatas1". Com base no seu trabalho, eu refiz a minha classe InputDatas1 e ela está definida abaixo:

package General;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Locale;
import java.util.Scanner;

public class InputDatas1

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

{        InputDatas1Procedure(); }

public static void InputDatas1Procedure() throws FileNotFoundException

//        Fluxo de entrada com arquivo

{        Scanner scanner = new Scanner(new File("Datas1.csv"));
        while (scanner.hasNextLine())
{            String linha = scanner.nextLine();
            Scanner linhaScanner = new Scanner(linha);
            linhaScanner.useLocale(Locale.US);                
            linhaScanner.useDelimiter(",");
            String text1  = linhaScanner.next();
            String text2  = linhaScanner.next();

GeneralProperties genprop = new GeneralProperties();

switch(text2)
//            Defining general properties            
{            case "Thermal Equilibrium and Chemical Non-Equilibrium" : genprop.setFormulation(text2);
            case "Thermochemical Non-Equilibrium" : genprop.setFormulation(text2);
            case "Thermochemical Non-Equilibrium - Mars" : genprop.setFormulation(text2);
            case "Five Species Chemical Model" : genprop.setGasModel(text2); 
            case "Seven Species Chemical Model" : genprop.setGasModel(text2);
            case "Nine Species Chemical Model" : genprop.setGasModel(text2);
            case "Eleven Species Chemical Model (Standard)" : genprop.setGasModel(text2);
            case "Eleven Species Chemical Model (FULL)" : genprop.setGasModel(text2);
            case "Saxena and Nair (2005)" : genprop.setModelAuthors(text2);
            case "Blottner (1969)" : genprop.setModelAuthors(text2);
            case "Kay and Netterfield (1993)" : genprop.setModelAuthors(text2);
            case "Dunn and Kang (1973)" : genprop.setModelAuthors(text2);
            case "Park (1987)" : genprop.setModelAuthors(text2);
            case "One-Temperature Model" : genprop.setTemperatureModel(text2);
            case "Two-TemperatureModel" : genprop.setTemperatureModel(text2);
            case "Three-Temperature Model" : genprop.setTemperatureModel(text2);
            case "Multi-Temperature Model" : genprop.setTemperatureModel(text2);

System.out.println(genprop.getFormulation());
System.out.println(genprop.getGasModel());
System.out.println(genprop.getModelAuthors());
System.out.println(genprop.getTemperatureModel());

case "50" : genprop.setIterationsToSave(Integer.parseInt(text2));
case "100" : genprop.setIterationsToSave(Integer.parseInt(text2));
case "150" : genprop.setIterationsToSave(Integer.parseInt(text2));
case "START" : genprop.setInitial(text2);
case "RESTART" : genprop.setInitial(text2); }                                
linhaScanner.close(); }
scanner.close(); } }

O problema é que quando eu executo esta classe, aparece o seguinte erro:

Thermal Equilibrium and Chemical Non-Equilibrium Thermal Equilibrium and Chemical Non-Equilibrium Thermal Equilibrium and Chemical Non-Equilibrium Thermal Equilibrium and Chemical Non-Equilibrium Exception in thread "main" java.lang.NumberFormatException: For input string: "Thermal Equilibrium and Chemical Non-Equilibrium" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Integer.parseInt(Integer.java:668) at java.base/java.lang.Integer.parseInt(Integer.java:786) at renecoreflows2d/General.InputDatas1.InputDatas1Procedure(InputDatas1.java:87) at renecoreflows2d/General.InputDatas1.main(InputDatas1.java:12)

Ou seja, o código não está atribuindo as variáveis formulação, gasModel, modelAuthors e temperatureModel os seus respectivos valores. Além disso, não está fazendo as conversões de String para Integer e de String para Double. Eu agradeço a sua ajuda e peço para me ajudar em mais esta etapa de confecção do meu código. Obrigado, Edisson Sávio.

Bom dia Edisson!

Peço que novamente verifique suas entradas, porque com relação às atribuições realizadas, o código parece correto: talvez suas variáveis não estejam atribuindo exatamente porque o scanner não está pegando o texto certo, e ele não passa em nenhum caso do switch. Também por esse motivo ele não está fazendo as conversões de String corretamente, pois, ao pegar um texto diferente de um número, não é possível realizar a conversão.

Uma outra observação que gostaria de fazer é com relação aos seus case do switch. Sempre, depois de finalizar cada caso de teste, é necessário utilizar um break, senão todas as opções podem ser executadas, bugando seu código. A sintaxe seria:

case "100":
                    genprop.setIterationsToSave(Integer.parseInt(text2));
                    break;

Abraços,

Obrigado Yasmim pela ajuda. Você tem certeza que não pode me ajudar em um canal fechado como o seu email? Você esclarece muito bem as minhas dúvidas e eu não estou tentando ser intimo de você, é só a sua ajuda que é muito boa. Feliz Natal, Yasmim, muita saúde e paz!

Então Edisson, aqui na Alura nosso canal oficial é realmente o fórum, pra que todos se ajudem, como tinha comentado em outra postagem com você. Qualquer dúvida, recomendo que poste por aqui mesmo, estou sempre de olho nas dúvidas do pessoal. Fico muito feliz de contribuir para o seu aprendizado, de coração!

Feliz Natal pra você também, tudo de bom!

Tudo bem Yasmim, que seja como você diz. Obrigado pela ajuda!