Problema com funções

Boa noite à todos,

Comecei a aprender Java ontem. Eu já tenho bastante noção da linguagem C, então, a maioria do que eu estou fazendo, eu estou deduzindo de como “seria”. Se der erro, eu vou buscar em algum outro lugar a informação que eu quero.

Bem, sem mais enrolações. O problema é o seguinte: eu fiz um algoritmo em Java semelhante ao que eu faria em C, com “funções” ou métodos (uma galerinha gosta de chamar assim). Enfim, ele funciona perfeitamente se eu requisitar as funções apenas uma vez. Agora, se eu criar outra variável e forçar essa nova variável a fazer “parte” dessa função, ele simplesmente dá erro. E o erro é só quando chega na linha da segunda requisição da função. Sem mais delongas, o código é este:

import java.util.Scanner;

public class Matrizes {
    public static void lerMatriz(int m, int n, int[][] matriz) {
        System.out.printf("%n");
        try(Scanner entrada = new Scanner(System.in)) {
            for(int i = 0; i < m; i++) {
                for(int j = 0; j < n; j++) {
                    System.out.printf("Entre com a posição (%d, %d): ", i, j);
                    matriz[i][j] = entrada.nextInt();
                }
            }
        }
    }
    
    public static void imprimirMatriz(int m, int n, int[][] matriz) {
        System.out.printf("%nMatriz impressa: %n%n");
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                System.out.printf("%4d ", matriz[i][j]);
            }
            System.out.println("");
        }
        System.out.printf("%n");
    }

    public static void main(String[] args) {
        int m, n;

        try(Scanner entrada = new Scanner(System.in)) {
            System.out.print("Digite a quantidade de linhas da matriz: ");
            m = entrada.nextInt();

            System.out.print("Digite a quantidade de colunas da matriz: ");
            n = entrada.nextInt();

            int[][] matriz = new int[m][n];
            int[][] matriz2 = new int[m][n];        // (1) E essa, claro.

            lerMatriz(m, n, matriz);          
            imprimirMatriz(m, n, matriz);

            lerMatriz(m, n, matriz2);              // Se tirar essa linha,
            imprimirMatriz(m, n, matriz2);         // E essa, ele funciona normalmente. (1)
        }
    }
}

Edit: É um código simples para imprimir uma matriz na qual o usuário digite.

Como eu havia dito, estou me baseando no mesmo método que seria em C, então, se puderem me dizer o que eu estou fazendo de errado, fico extremamente grato.

A questão não é o que uma galerinha gosta, mas o nome que as coisas têm. Toda palavra tem significado no contexto em que é utilizada. Em Java não existem funções, mas sim métodos, mesmo que estes desempenhem algum papel parecido, ou igual em algumas situações, ao das funções. O errado, por exemplo, é chamar array de vetor ou um array bidimensional de matriz, coisa que brasileiro faz por causa de um maldito background de engenharia e que é ensinado errado ano a ano.

Você está criando 2 Scanners que estão lendo do mesmo stream. Você não precisa passar as dimensões das “matrizes” para o método, pois você consegue extrair essa informação da própria estrutura de dados. Assim deve funcionar:

import java.util.Scanner;

public class Matrizes {

    public static void lerMatriz( int[][] matriz, Scanner entrada ) {
        System.out.printf("%n");
        for(int i = 0; i < matriz.length; i++) {
            for(int j = 0; j < matriz[i].length; j++) {
                System.out.printf("Entre com a posição (%d, %d): ", i, j);
                matriz[i][j] = entrada.nextInt();
            }
        }
    }
    
    public static void imprimirMatriz( int[][] matriz ) {
        System.out.printf("%nMatriz impressa: %n%n");
        for(int i = 0; i < matriz.length; i++) {
            for(int j = 0; j < matriz[i].length; j++) {
                System.out.printf("%4d ", matriz[i][j]);
            }
            System.out.println("");
        }
        System.out.printf("%n");
    }

    public static void main(String[] args) {
        int m, n;

        try(Scanner entrada = new Scanner(System.in)) {
            System.out.print("Digite a quantidade de linhas da matriz: ");
            m = entrada.nextInt();

            System.out.print("Digite a quantidade de colunas da matriz: ");
            n = entrada.nextInt();

            int[][] matriz = new int[m][n];
            int[][] matriz2 = new int[m][n];

            lerMatriz( matriz, entrada );
            imprimirMatriz( matriz );

            lerMatriz( matriz2, entrada );
            imprimirMatriz( matriz2 );
        }
    }
}
3 curtidas

Funcionou perfeitamente. Obrigado! E quanto a nomenclatura, realmente, eu não fazia ideia qual delas era a correta. Muitos falam funções, ou usam a palavra “método” como sinônimo. Enfim, fico extremamente agradecido, obrigado.

Sem problema, todos estamos aprendendo sempre. Existem sinônimos, claro, mas na maioria das vezes, quando há um nome diferente para algo que você acha que é igual, provavelmente há um motivo para aquilo. Funções da linguagem C não estão atreladas a nenhum tipo específico, elas são o bloco de construção principal da linguagem, visto que a linguagem C é uma linguagem do paradigma estruturado. Na linguagem Pascal, por exemplo, existem as funções (function), que são os subprogramas que retornam valor e os procedimentos (procedure), que são os subprogramas que não retornam valor, análogos às funções da linguagem C que têm void como “tipo de retorno”. Métodos em Java estão sempre relacionados a tipos, pois estão sempre dentro de um tipo. Em Java você não consegue declarar nem implementar um método fora de uma classe ou algo que a valha do ponto de vista de ser um tipo de dados.

Em outras linguagens, por exemplo em C++, a construção análoga aos métodos do Java é a das “funções membro”, sendo que em C++ vc pode também ter funções independentes de tipo. Normalmente, linguagens de programação orientadas a objetos e mais “modernas” vão chamar as operações atreladas a tipos de métodos mesmo, pois a ideia é que quem invoca um método está enviando uma “mensagem” ao objeto -ou à classe- que o contém.

1 curtida

Termo utilizado em linguagens procedurais para rotinas que retornam algum valor, quando não retorna nenhum valor, são chamadas de procedimentos.

Em linguagens orientadas à objeto, essas funções e procedimentos são chamados de métodos.

A grande diferença é que nas linguagens procedurarais as funções e procedimentos são declaradas “soltas” em qualquer lugar, já em linguagem orientada à objetos, os métodos sempre pertencem à um objeto ou à uma classe, no caso de métodos estáticos, não podem ser declarados soltos por aí.

1 curtida