View Full Version : [JAVA] Aiuto codice!!!
Squall_90
05-12-2009, 15:59
Salve gente!!!
Dovrei fare questo codice:
Scrivere un metodo che restituisce true se e solo sè la matrice M di interi è triangolare inferiore!!!
Grazie!!! :)
blackgin
05-12-2009, 18:09
Salve gente!!!
Dovrei fare questo codice:
Scrivere un metodo che restituisce true se e solo sè la matrice M di interi è triangolare inferiore!!!
Grazie!!! :)
Non è un buon esercizio farsi scrivere un codice da altri. Il mio consiglio è di provarci e postare quello che hai scritto per capire cosa manca/sbagli..
Frank1962
05-12-2009, 23:12
Salve gente!!!
Dovrei fare questo codice:
Scrivere un metodo che restituisce true se e solo sè la matrice M di interi è triangolare inferiore!!!
Grazie!!! :)
dipende molto da come ti viene passata al metodo che devi scrivere....
:.Blizzard.:
05-12-2009, 23:22
Non è un buon esercizio farsi scrivere un codice da altri. Il mio consiglio è di provarci e postare quello che hai scritto per capire cosa manca/sbagli..
Quoto.
Comunque, una matrice triangolare inferiore è del tipo:
http://upload.wikimedia.org/math/a/d/7/ad758296e952dd8c784eebb50421e8f8.png
Dovrai quindi lavorare , a meno che tu non definisca una tua classe matrice, con un array bidimensionale. E sicuramente dovrai muoverti in maniera correttra con dei cicli for. Però ora il codice devi scriverlo tu.
morskott
05-12-2009, 23:54
8 righe di codice essendo verbosi (ed escluso segnature, solo il corpo del metodo)(non essendo verbosi bastano 5)
Frank1962
06-12-2009, 00:10
8 righe di codice essendo verbosi (ed escluso segnature, solo il corpo del metodo)(non essendo verbosi bastano 5)
io la butto lì ....fatta all'1 di notte con il notepad
public boolean isATriangleMatrix(int[][] mtx) {
for(int i=0;i<mtx.length;i++) {
for(int e=0;e<i;e++) {
if(mtx[i][e]!=0)
return false;
}
}
return true;
}
non l'ho testata ...
morskott
06-12-2009, 12:54
io la butto lì ....fatta all'1 di notte con il notepad
public boolean isATriangleMatrix(int[][] mtx) {
for(int i=0;i<mtx.length;i++) {
for(int e=0;e<i;e++) {
if(mtx[i][e]!=0)
return false;
}
}
return true;
}
non l'ho testata ...
Chiedeva la triangolare inferiore, non la superiore, ma l'unica differenza tra la tua (triangolare superiore) e la triangolare inferiore è l'inizializzazione dell''indice e controllo di uscita sul secondo for, in pratica abbiamo detto la soluzione però!!!! (se la doveva trovare da solo)
Squall_90
06-12-2009, 20:53
io la butto lì ....fatta all'1 di notte con il notepad
public boolean isATriangleMatrix(int[][] mtx) {
for(int i=0;i<mtx.length;i++) {
for(int e=0;e<i;e++) {
if(mtx[i][e]!=0)
return false;
}
}
return true;
}
non l'ho testata ...
Ho sbagliato, volevo dire triangolare superiore!!!
Comunque avete ragione, domani provo a farlo io e lo posto, cosi mi correggete :)
Questo qui purtroppo non lo capisco, perchè ci sono delle cose che ancora non ho fatto (sono praticamente all'inizio) :D
Frank1962
06-12-2009, 22:30
Ho sbagliato, volevo dire triangolare superiore!!!
Comunque avete ragione, domani provo a farlo io e lo posto, cosi mi correggete :)
Questo qui purtroppo non lo capisco, perchè ci sono delle cose che ancora non ho fatto (sono praticamente all'inizio) :D
tò guarda ...quei pochi casi in cui sbagliando si trova quel che si voleva :D
morskott
07-12-2009, 01:11
Ho sbagliato, volevo dire triangolare superiore!!!
Comunque avete ragione, domani provo a farlo io e lo posto, cosi mi correggete :)
Questo qui purtroppo non lo capisco, perchè ci sono delle cose che ancora non ho fatto (sono praticamente all'inizio) :D
scusa la poca diplomazia, ma se non capisci quel codice lì (due for e un if) che codice vorresti scrivere?
Andando nello specifico, cosa non capisci?
Ricorda che prima di tutto c'è l'algoritmo, e poi dopo la sua traduzione in codice. L'algoritmo dietro quel codice l'hai capito? L'algoritmo che vuoi applicare l'hai bene in mente?
Ragiona su quel che vuoi, sapere se una matrice è triangolare superiore (o inferiore, è speculare). Che vuol dire che una matrice è triangolare superiore (inferiore)? Che tutti gli elementi a sinistra (destra) della diagonale sono zero, quindi quando non lo è? quando uno di quegli elementi è diverso da zero.
Adesso scomponi il problema, ragiona in termini di righe. Una matrice è composta da n righe, ogni riga la partizioniamo in 3 insiemi [a_0,a_k-1],[a_k],[a_k+1,a_n] dove k è l'indice della diagonale. Fatto questo nelle matrici triangolari superiori (inferiori) gli elementi della partizione [a_0,a_k-1] ([a_k+1,a_n]) devono essere tutti zeri, detta in un altro modo appena trovi un elemento diverso da zero sai per certo che la matrice NON è triangolare superiore (inferiore). Questo vale per ogni riga della matrice, il punto è adesso trovare l'indice dell'elemento diagonale. Alla prima riga l'elemento diagonale è il primo, nella seconda il secondo etc. etc. Come vedi è sempre l'elemento (i,i). Quindi l'algoritmo è:
per ogni riga della matrice
per ogni elemento della partizione [a_0,a_k-1] ([a_k+1,a_n])
se l'elemento è diverso da zero
la matrice NON è triangolare superiore (inferiore), quindi ritorna falso
ritorna vero
Passiamo adesso alla trascrizione di questo algoritmo in codice Java, prima cosa rappresentazione dell'input. La matrice è di interi, in Java diventa un array di array, notazione doppie parentesi quadre dopo la dichiarazione del tipo di variabileint[][] matrix
Secondo passo, scorrere le righe della matrice, soluzione, ciclo for che ha sintassifor(dichiarazione e inizializzazione variabile d'indice;condizione di permanenza nel ciclo;incremento variabile) che in codice reale diventa (per sapere il numero di righe di una variabile array di array basta accedere alla proprietà "length")for (int i=0;i<matrix.length;i++).
Terzo passo, scorrere la partizione desiderata, gli zeri devono stare alla sinistra, quindi inizializiamo l'indice a 0 e lo facciamo finire subito prima dell'elemento diagonale che è l'i-esimofor(int j=0;j<i;j++) (per l'inferiore devo partire un elemento dopo quello diagonale e finire alla fine della rigafor(int j=i+1;j<matrix[i].length;j++))
Quarto passo, se quell'elemento non è zero uscireif (matrix[i][j]!=0) return false;
Ultimo passo, se tutti i controlli hanno avuto esito negativo la matrice è triangolare superiore (inferiore), quindi ritorniamo veroreturn true
Tutto chiaro?
banryu79
07-12-2009, 01:31
Ricorda che prima di tutto c'è l'algoritmo, e poi dopo la sua traduzione in codice. L'algoritmo dietro quel codice l'hai capito? L'algoritmo che vuoi applicare l'hai bene in mente?
Forse, essendo agli inzi, è bene che non lo tenga solo in mente, ma che provi a fissarlo su carta.
Nottambulo anche te? :)
Squall_90
07-12-2009, 11:08
scusa la poca diplomazia, ma se non capisci quel codice lì (due for e un if) che codice vorresti scrivere?
Andando nello specifico, cosa non capisci?
Ricorda che prima di tutto c'è l'algoritmo, e poi dopo la sua traduzione in codice. L'algoritmo dietro quel codice l'hai capito? L'algoritmo che vuoi applicare l'hai bene in mente?
Ragiona su quel che vuoi, sapere se una matrice è triangolare superiore (o inferiore, è speculare). Che vuol dire che una matrice è triangolare superiore (inferiore)? Che tutti gli elementi a sinistra (destra) della diagonale sono zero, quindi quando non lo è? quando uno di quegli elementi è diverso da zero.
Adesso scomponi il problema, ragiona in termini di righe. Una matrice è composta da n righe, queste righe le partizioniamo in 3 insiemi [a_0,a_k-1],[a_k],[a_k+1,a_n] dove k è l'indice della diagonale. Fatto questo nelle matrici triangolari superiori (inferiori) gli elementi della partizione [a_0,a_k-1] ([a_k+1,a_n]) devono essere tutti zeri, detta in un altro modo appena trovi un elemento diverso da zero sai per certo che la matrice NON è triangolare superiore (inferiore). Questo vale per ogni riga della matrice, il punto è adesso trovare l'indice dell'elemento diagonale. Alla prima riga l'elemento diagonale è il primo, nella seconda il secondo etc. etc. Come vedi è sempre l'elemento (i,i). Quindi l'algoritmo è:
per ogni riga della matrice
per ogni elemento della partizione [a_0,a_k-1] ([a_k+1,a_n])
se l'elemento è diverso da zero
la matrice NON è triangolare superiore (inferiore), quindi ritorna falso
ritorna vero
Passiamo adesso alla trascrizione di questo algoritmo in codice Java, prima cosa rappresentazione dell'input. La matrice è di interi, in Java diventa un array di array, notazione doppie parentesi quadre dopo la dichiarazione del tipo di variabileint[][] matrix
Secondo passo, scorrere le righe della matrice, soluzione, ciclo for che ha sintassifor(dichiarazione e inizializzazione variabile d'indice;condizione di permanenza nel ciclo;incremento variabile) che in codice reale diventa (per sapere il numero di righe di una variabile array di array basta accedere alla proprietà "length")for (int i=0;i<matrix.length;i++).
Terzo passo, scorrere la partizione desiderata, gli zeri devono stare alla sinistra, quindi inizializiamo l'indice a 0 e lo facciamo finire subito prima dell'elemento diagonale che è l'i-esimofor(int j=0;j<i;j++) (per l'inferiore devo partire un elemento dopo quello diagonale e finire alla fine della rigafor(int j=i+1;j<matrix[i].length;j++))
Quarto passo, se quell'elemento non è zero uscireif (matrix[i][j]!=0) return false;
Ultimo passo, se tutti i controlli hanno avuto esito negativo la matrice è triangolare superiore (inferiore), quindi ritorniamo veroreturn true
Tutto chiaro?
Chiarissimo, grazie mille!!! :)
Comunque di quel codice non capivo i isATriangleMatrix e mtx (si possono scrivere in un altro modo???), dato che non li avevo mai scritto...I for e l'if si, ci mancherebbe...
Chiarissimo, grazie mille!!! :)
Comunque di quel codice non capivo i isATriangleMatrix e mtx (si possono scrivere in un altro modo???), dato che non li avevo mai scritto...I for e l'if si, ci mancherebbe...
Sono semplicemente il nome del metodo e il nome del parametro che gli passi. Potevi benissimo dichiararla come: public boolean pincoPallino (int[][] matrice)
Squall_90
07-12-2009, 11:31
Sono semplicemente il nome del metodo e il nome del parametro che gli passi. Potevi benissimo dichiararla come: public boolean pincoPallino (int[][] matrice)
Perfetto, allora avevo capito!!!
E se invece di public boolean usassi public static void è un errore???
Perfetto, allora avevo capito!!!
E se invece di public boolean usassi public static void è un errore???
Si. Void significa che il metodo non restituisce nulla, nel caso da te richiesto è necessario un boolean che restituisce true/false.
Squall_90
07-12-2009, 11:39
Si. Void significa che il metodo non restituisce nulla, nel caso da te richiesto è necessario un boolean che restituisce true/false.
Ho capito, grazie :D
Squall_90
07-12-2009, 11:54
Quindi alla fine verrebbe cosi:
import fiji.io.*;
public class Matrici
{
public boolean MatriceTriangolareSup (int[][] m)
{
for (int i=0; i<m.length; i++)
{
for (int j=0; j<i; j++)
{
if (m[i][j] != 0)
return false;
}
}
return true;
}
}
Frank1962
07-12-2009, 11:58
esatto :)
Squall_90
07-12-2009, 12:00
Ottimo, grazie a tutti per avermi aiutato!!! :)
Per convenzione i nomi dei metodi iniziano con lettera minuscola, quindi sarebbe consigliabile matriceTriangolareSup. Ovviamente è solo una convenzione e come hai scritto te non pregiudica minimamente la corretta esecuzione del programma :)
morskott
07-12-2009, 12:37
giusto per essere pignoli il metodo dovrebbe esser dichiarato static, perché non fa riferimento a nessun oggetto, alla fine sarebbe
public class Matrici
{
public static boolean matriceTriangolareSup (int[][] m)
{
for (int i=0; i<m.length; i++)
{
for (int j=0; j<i; j++)
{
if (m[i][j] != 0)
return false;
}
}
return true;
}
}
Squall_90
07-12-2009, 13:12
Perfetto, grazie ancora ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.