Matriz:
Exception in thread “main” java.lang.NullPointerException
at EstruturaMatriz.imprimeMatriz(EstruturaMatriz.java:86)
at Matriz.main(Matriz.java:29)
olha o erro que dá.
Matriz:
Exception in thread “main” java.lang.NullPointerException
at EstruturaMatriz.imprimeMatriz(EstruturaMatriz.java:86)
at Matriz.main(Matriz.java:29)
olha o erro que dá.
[quote=olivercld]Matriz:
Exception in thread “main” java.lang.NullPointerException
at EstruturaMatriz.imprimeMatriz(EstruturaMatriz.java:86)
at Matriz.main(Matriz.java:29)
olha o erro que dá.[/quote]
Esse erro está acontecendo pois você está trabalhando de forma errada. Você já tem uma instância da classe EstruturaMatriz, então você não tem que chamar o método assim:EstruturaMatriz.imprimeMatriz();
Você tem que chamar ele assim:imprimeMatriz();
Mas meu amigo, na verdade, para ficar tudo certinho, você vai ter que fazer seu código todo trabalhar com a matriz criada pela classe EstruturaMatriz, ou seja, você vai ter que reformular todos os métodos além de criar os que faltam.
Basicamente você vai ter que tornar os métodos da clase EstruturaMatriz métodos sem valor de retorno (void), além disso você vai tirar os argumentos de todos os métodos, pois esses argumentos estão servindo para receber a matriz que está vindo classe Matriz.
Por exemplo o método para trocar a linha 3 pela coluna 9 ficaria assim:
[code]public void trocaColuna() {
int temp = 0;
for (int indice = 0; indice < dimensao; indice++) {
temp = matriz[2][indice];
matriz[2][indice] = matriz[indice][8];
matriz[indice][8] = temp;
}
}[/code]
[color=red]OBS.:[/color] Esse método pode ser mais genérico, se você passar como parâmetros os índices da linha e da coluna para ele. Assim ele não trabalharia com índices fixos como como está acima.
Daí você chamaria ele no método main da classe Matriz simplesmente assim:
trocaColuna();
Abraço!
estou tentando…
na verdade ele pode chamar dessa forma : EstruturaMatriz.metodoQualquer(parametros);
bastando pra isso trabalhar com um metodo estatico.
Mas concordo que como e classe se chama EstruturaMAtriz e ele tem um matriz dentro dela, o melhor seria instanciar a classe e chamar o metodo. O que pode ta acontecendo é que ele ta usando uma das matrizes erroneamente.
se ele usou o metodo da forma que passei, com a assinatura recebendo uma matriz e o tamanho dela, nao tem como dar errado. a nao ser que ele esteja passando uma matriz que nao esteja instanciada (que seja null).
o problema que ele mostrou é que tinha um objeto nulo, ne? entao tem que ser a matriz. A nao ser que ele tenha feito mais alguma alteração que bugou o metodo… =/
Olivercld,
Segue o código com tudo que você precisa, use o código da melhor forma possível, porem só peço que mantenha os créditos do mesmo.
Classe com o métodos que manipulam a Matriz:[code]/*
import java.util.Scanner;
import java.util.Random;
public class EstruturaMatriz {
Scanner entrada = new Scanner(System.in);
Random numero = new Random();
private int dimensao = 0;
public int[][] matriz;
// CONTRUTOR DA CLASSE
public EstruturaMatriz(){
System.out.println("Digite a dimensão da Matriz: ");
dimensao = entrada.nextInt();
matriz = new int[dimensao][dimensao];
// POPULANDO A MATRIZ
/*
System.out.println("Leitura dos valores da matriz");
for (int linha = 0; linha < dimensao; linha++) {
for (int coluna = 0; coluna < dimensao; coluna++) {
System.out.println("Digite valor da matriz na posicao ["
+ (linha+1) + "][" + (coluna+1) + "]: ");
matriz[linha][coluna] = entrada.nextInt();
}
} */
for (int linha = 0; linha < dimensao; linha++) {
for (int coluna = 0; coluna < dimensao; coluna++) {
matriz[linha][coluna] = numero.nextInt(10);
}
}
}
// TROCA LINHA POR COLUNA [OK]
// Processo só indicado para linha e coluna de mesmo índice
public void trocaLinhasColunas(){
System.out.println("Digite a linha: ");
int linha = entrada.nextInt();
System.out.println("Digite a coluna: ");
int coluna = entrada.nextInt();
for(int indice = 0; indice < dimensao; indice++ ){
int temp = matriz[linha-1][indice];
matriz[linha-1][indice] = matriz[indice][coluna-1];
matriz[indice][coluna-1] = temp;
}
}
// TROCA DIAGONAL SECUNDARIA COM PRIMARIA [OK]
public void trocaDiagonais(){
for (int linha = 0; linha < dimensao; linha++)
for (int coluna = 0; coluna < dimensao; coluna++) {
if (linha + coluna == (dimensao-1)) {
int temp = matriz[linha][(dimensao-1)-linha];
//System.out.println(linha+""+coluna+": "+temp);
matriz[linha][(dimensao-1)-linha] = matriz[linha][linha];
matriz[linha][linha] = temp;
}
}
}
// TROCA TRIANGULOS
public void trocaTriangulos(){
int temp;
for(int linha = 0; linha < dimensao; linha++)
for(int coluna = 0; coluna < dimensao; coluna++){
if(coluna > linha){
temp = matriz[linha][coluna];
matriz[linha][coluna] = matriz[coluna][linha];
matriz[coluna][linha] = temp;
}
}
}
// IMPRIME MATRIZ [OK]
public void imprimeMatriz(){
System.out.println("Matriz: ");
for (int linha = 0; linha < dimensao; linha++){
System.out.print("|");
for (int coluna = 0; coluna < dimensao; coluna++) {
System.out.print(" "+matriz[linha][coluna]+" ");
}
System.out.print("|");
System.out.println();
}
}
}[/code]
Classe com o método main:[code]/*
public class Matriz {
public static void main(String[] args) {
EstruturaMatriz estMatriz = new EstruturaMatriz();
estMatriz.imprimeMatriz();
System.out.println("Troca diagonais");
estMatriz.trocaDiagonais();
estMatriz.imprimeMatriz();
System.out.println("Troca linha por coluna\n");
estMatriz.trocaLinhasColunas();
estMatriz.imprimeMatriz();
System.out.println("Troca triangulos");
estMatriz.trocaTriangulos();
estMatriz.imprimeMatriz();
}
}[/code]Meu camarada, observe cada linha das duas classes e entenda o que cada uma faz, estude, mas estude bastante, pois querer fazer o que for em JAVA, sem ao menos uma base, é quase impossível. Portanto pegue umas apostilas que se encontram pela net, consulte sempre a documentação JAVA e pratique para que você possa estar sempre evoluindo.
Qualquer coisa que não tenha ficado entendido é só perguntar.
Abraço e boa sorte!
// TROCA LINHA POR COLUNA [OK]
// Processo só indicado para linha e coluna de mesmo índice
public void trocaLinhasColunas(){
System.out.println("Digite a linha: "); // vai pedir para digitar a matriz novamente pq?
int linha = entrada.nextInt();
System.out.println("Digite a coluna: ");
int coluna = entrada.nextInt();
for(int indice = 0; indice < dimensao; indice++ ){
int temp = matriz[linha-1][indice]; // porque linha -1 ?
matriz[linha-1][indice] = matriz[indice][coluna-1]; //coluna -1 ?
matriz[indice][coluna-1] = temp;
}
}
me explique onde eu comentei nao entendi.
obrigado
[list]
estude, mas estude bastante, pois querer fazer o que for em JAVA, sem ao menos uma base, é quase impossível. Portanto pegue umas apostilas que se encontram pela net, consulte sempre a documentação JAVA e pratique para que você possa estar sempre evoluindo
[/list]
concordo com voçe, não e falta de praticar, eu pratico tenho apostilas tenho agora o livro, eu tenho dificuldade, o que prejudica e o tempo e conciliar trabalho, trabalhos de faculdade de outras materias, provas o tempo que vou ter para estudar melhor vai ser nas ferias de julho e dezembro, vou continuar porque quero aprender se eu estudar rpaticar e rpaticar e nao conseguir evoluir bom acho que é o caso de eu partir pra outra area. Bom não sei bom o tempo dirá isso.
obrigadão a vcs que me ajudaram.
olivercld, boa tarde!
Segunda vez que vejo você perguntando do “-1”, você tem implicância com o “-1”? rsrsrs, brincadeira!!!
Nessas linhas:System.out.println("Digite a linha: "); // vai pedir para digitar a matriz novamente pq?
int linha = entrada.nextInt();
Simplemente pede para o usuário digitar a linha que ele quer trocar, para o seu exercício basta digitar “3”.
Caso você queira mudar isso para que não peça a linha basta você substituir essas duas linhas por:int linha = 3;
O mesmo aconte com a coluna.
Agora quanto ao seu “-1”… hehhee int temp = matriz[linha-1][indice]; // porque linha -1 ?
matriz[linha-1][indice] = matriz[indice][coluna-1]; //coluna -1 ?
matriz[indice][coluna-1] = temp;
Nas linhas acima, as variáveis linha e coluna são reduzidas em -1 pois alí tratam do índice, ou seja, como a linha é a 3 o índice tem que ser 2. linha-1 seria 3-1. entendeu? Lembre-se que os índices dos arrays em java começam de 0 (zero) e a matriz começa em 1.
O mesmo aconte com a coluna.
Abraço!
entendido vou estudar mais isso ai, é seguinte la onde eu vou pedir para o usuario digitar alinha e a coluna que eu qeuro so uma duvida caso eu queira por exemplo quero a 5 linha troca com a 7 coluna por exemplo vai funcionar vai nhe?
Bom dia, olivercld!
Sim, vai funcionar.
Foi por isso que fiz assim, para funcionar com qualquer linha/coluna, desde que seja menor que a dimensão da matriz.
Inclusive esse código pode ser melhorado nesse sentido, de forma que se o usuário digite uma linha/coluna maior que a dimensão da matriz gere um alerta e volte a pedir a linha/coluna correta.
Abraço!
eu só teria algumas observações a fazer…
Como vc ainda ta meio enrolado em java, é bom lembrar que o exercício que foi pedido é pra pegar um linha e uma coluna estática, que são a linha 2 e a coluna 8, ne? ou a 2 e a 9? algo assim…
entao quando vc coloca esse codigo pra o usuario entrar com a linha e a colunas que ele quer, ficameio perigoso, porque ele pode colocar QUALQUER valor. se ele coloca 100 e manda o algoritmo rodar, vai bugar! Se teu professor for meio chato ele vai fazer esse teste e ai vc chega la cheio de moral e tal e o negocio buga…
segundo, já que estao falando de melhorias, esses algoritmos aqui ainda podem ser melhorados :
TROCA DIAGONAL SECUNDARIA COM PRIMARIA - da pra fazer com UM “for” so :
public static void trocaDiagonais(int[][] mat, int tamanho) {
int diagonalSecundaria = tamanho - 1;
int temp = -1;
for (int i = 0; i < tamanho; i++) {
temp = mat[i][i];
mat[i][i] = mat[i][diagonalSecundaria];
mat[i][diagonalSecundaria] = temp;
diagonalSecundaria--;
}
}
isso é importante pra desempenho.
em TROCA LINHA POR COLUNA:
na linha int temp = matriz[linha-1][indice];, essa variavel int temp ta sendo criada dentro do for. isso nao faz com que a cada iteração java tente alocar um espaço de memoria pra ela, nao? porque ela ta sendo CRIADA dentro do for… ela pode ficar fora do for (ser criada fora e apenas usada no for). tb nao é preciso calcular esse
(linha-1) toda vez, mas isso é só uma operação a mais, entao nao tem tanta importancia…
na minha visao o bug de pedir a linha e coluna e o outro melhoramento la de um for so sao as coisas mais criticas…
tenho muito a aprender com vcs obrigado pela ajuda tirar as duvidas os erros e tudo, sem querer citar nomes e desmerecer ninguem eu agradeço a todos.
Disponha, olivercld!
Estamos aqui para aprender juntos.
Surgindo mais dúvidas é só postar que garanto que vai haver alguém para te ajudar.
Se seu problema já estiver resolvido, por favor, edite o nome do tópico deixando-o assim: “[RESOLVIDO] Problema de lógica na matriz”, dessa forma esse tópico torna-se uma referência para alguém com a mesma dúvida caracterizando que a solução foi encontrada.
Abraço e bons estudos!
´so um pequeno problema vc ja inicializou a matriz co m random e eu quero que o usuario digite ela toda, fiu tentar arrumar nao cnsegui du alguns erros…
quando tiver quase la eu edito pode deixar.
cara, tu ja tem esse codigo, rapaz!
lembra q te mandaram la um que le a matriz? sei la em que metodo tinha.
tu le o tamanho do pelo teclado e cria matriz[tamanho][tamanho]
depois tu faz:
for (int i = 0; i < tamanho; i++)
for (int j = 0; j < tamanho; j++) {
le um numero aqui
matriz[i][j] = numero;
}
foi mal mas eu nao lembro como e que le do teclado, quase nao faço isso… mas tb ja tem em algum lugar por ai nos exemplos.
[quote=olivercld]´so um pequeno problema vc ja inicializou a matriz co m random e eu quero que o usuario digite ela toda, fiu tentar arrumar nao cnsegui du alguns erros…
quando tiver quase la eu edito pode deixar.[/quote]
oliver, bom dia!
Amigão, no código que te mandei tem isso feito já, só está como comentário, você só precisa descomentar. Fiz a parte com Random só para agilizar nos testes, afinal ficar digitando uma matriz com dimensão maior que 3 ou 4 toda vez que for testar é chato demais… rsrrs
Seguinte no códifo que te mandei está assim, ache essa parte lá:
// POPULANDO A MATRIZ
/*
System.out.println("Leitura dos valores da matriz");
for (int linha = 0; linha < dimensao; linha++) {
for (int coluna = 0; coluna < dimensao; coluna++) {
System.out.println("Digite valor da matriz na posicao ["
+ (linha+1) + "][" + (coluna+1) + "]: ");
matriz[linha][coluna] = entrada.nextInt();
}
} */
for (int linha = 0; linha < dimensao; linha++) {
for (int coluna = 0; coluna < dimensao; coluna++) {
matriz[linha][coluna] = numero.nextInt(10);
}
}
Para tirar o Random e o programa pedir os valores ao usuário, você deleta os dois for que estão fora do comentário e descomenta o que sobrou. Vai ficar assim:
// POPULANDO A MATRIZ
System.out.println("Leitura dos valores da matriz");
for (int linha = 0; linha < dimensao; linha++) {
for (int coluna = 0; coluna < dimensao; coluna++) {
System.out.println("Digite valor da matriz na posicao ["
+ (linha+1) + "][" + (coluna+1) + "]: ");
matriz[linha][coluna] = entrada.nextInt();
}
}
Abraço!
foi mal gente, realmente nao parei essa ansiedade me atrapalha… vou dormi uma semana dormindo quas dia amanheçendo…
cara, tu ta mt estressado
faz o seguinte : compra uma guitarra, uma pedaleira bem massa p colocar uns efeitos e pega umas musicas p tocar huahuhauhua
relaxa ai, véi!
pois é a ansiedade de aprender algo, ta me matando corpo nao responde mais so ando cansado, vou com calma estudando aos poucos rs e muita coisa acumula trabalhos ai fico doido hehehe.
no caso de tocar guitarra putz ai ferrou eu nao sei, ja toquei bateria.
ok vou colocar tópico resolvido fica em aberto para outros que tiverem duvidas . estou fazendo agora a matriz determinante hehe.
valeu.