[Java] matrice
ciao a tutti! ho un problema con un programma che dovrebbe generare una matrice di n righe e m colonne. Allora il problema è che in input dovrei dare il numero di righe e colonne per poi stampare la corrispondente matrice, ma quando la schermata richiede di inserire il numero di colonne, devo continuare a inserire tante volte un numero perchè non riesce ad andare avanti, mentre dovrebbe chederlo una sola volta (come fà per le righe). E non capisco perchè. Qualcuno può aiutarmi? grazie ! Il codice è il seguente:
import system.System;
import system.Scanner;
public class Matrice {
public static void main (String [] args){
Scanner read= new Scanner (System.in);
System.out.println("inserisci il numero di righe");
int r = read.nextInt();
System.out.println("inserisci il numero di colonne");
int c = read.nextInt();
int A[][]=new int [r][c];
for (int i =0;i
for(int j =0;j
A[j]=read.nextInt();
}
}
System.out.println(A);
}
}
import system.System;
import system.Scanner;
public class Matrice {
public static void main (String [] args){
Scanner read= new Scanner (System.in);
System.out.println("inserisci il numero di righe");
int r = read.nextInt();
System.out.println("inserisci il numero di colonne");
int c = read.nextInt();
int A[][]=new int [r][c];
for (int i =0;i
}
}
System.out.println(A);
}
}
Risposte
Ciao Kate, dunque il problema sta nel fatto che dopo l'immissione del numero di righe e colonne
il programma richiede i valori da inserire nella matrice stessa nel ciclo for più interno...
questo codice ti mostra la matrice vuota
il programma richiede i valori da inserire nella matrice stessa nel ciclo for più interno...
questo codice ti mostra la matrice vuota
import java.util.Scanner; public class Matrice { public static void main(String[] args) { Scanner read = new Scanner(System.in); System.out.println("inserisci il numero di righe"); int r = read.nextInt(); System.out.println("inserisci il numero di colonne"); int c = read.nextInt(); int A[][] = new int[r][c]; for (int i = 0; i < A.length; i++) { for (int j = 0; j < A[0].length; j++) { // A[i][j] = read.nextInt(); lettura System.out.print(A[i][j]); } System.out.println(); } } }
grazie della risposta Giux
, grazie della spiegazione, ora mi è un pò più chiaro quale dovrebbe essere il codice dopo il for, e ho apportato alcune modifiche, ma ancora mi dà lo stesso identico problema, itera l'immissione del numero di colonne n volte . Ho anche provato a far girare il codice con il print in aggiuta ma è la tessa cosa

quali modifiche , hai effettuato, riposta il codice che ne parliamo.....
elimina questa riga di codice
io l'avevo commentata per renderla inattiva....
// A[i][j] = read.nextInt(); lettura
io l'avevo commentata per renderla inattiva....
eliminare quella riga Xd. Tu hai inserito il prinln finale per poter andare d accapo vero? comunque in effetti non mi itera più la richiesta ma non stampa una amtrice, solo una lunga riga di zeri : ). perdonami se magari stò sbagliando cavolate, ma ho iniziato da poco. Il codice è come prima solo che ho aggiunto le tue modifiche
Tranquilla siamo qui per questo,
, si esatto il printl() subito dopo la graffa di chiusura del for più interno serve solo per visualizzare in maniera ordinata le singole righe della matrice....cmq controlla bene le parentesi graffe e che appartenga al for esterno altrimenti vedi la colonna di soli zeri.....

va bene grazie mille!! ultima cosa, in quale cosa lasciare il "read.nextInt(), dopo il for interno è corretto? perchè se non me lo dicevi tu non lo avrei mai elinato : D
dunque: funziona così
quando il programma va in esecuzione viene eseguita la prima istruzione contenuta nella funzione main()
nell'esempio la riga
dopodiché vengono eseguite tutte le istruzioni compresi i costrutti più complessi tipo il for
in ordine sequenziale, quindi dopo l'ultima nextInt() quella che legge il numero di colonne....
la prossima istruzione è quella contenuta nel for più interno, e se questa istruzione è proprio una A[j] = read.nextInt()
allora il programma ti richiederà sempre un input fino a quando tutta la matrice non sara riempita....se tu vuoi vedere la matrice devi semplicemente stampare il valore di ogni cella.... quindi devi sostituire al posto della nextInt, una System.out.print(); ovviamente il problema dipende dal contesto e da cosa vuoi fare.. è un problema di semantica e di logica del programma.... cosa che imparerai con un pò di tempo... e di esercizio.. Ciao
quando il programma va in esecuzione viene eseguita la prima istruzione contenuta nella funzione main()
nell'esempio la riga
Scanner read = new Scanner(System.in);
dopodiché vengono eseguite tutte le istruzioni compresi i costrutti più complessi tipo il for
in ordine sequenziale, quindi dopo l'ultima nextInt() quella che legge il numero di colonne....
la prossima istruzione è quella contenuta nel for più interno, e se questa istruzione è proprio una A[j] = read.nextInt()
allora il programma ti richiederà sempre un input fino a quando tutta la matrice non sara riempita....se tu vuoi vedere la matrice devi semplicemente stampare il valore di ogni cella.... quindi devi sostituire al posto della nextInt, una System.out.print(); ovviamente il problema dipende dal contesto e da cosa vuoi fare.. è un problema di semantica e di logica del programma.... cosa che imparerai con un pò di tempo... e di esercizio.. Ciao
ho capito : ) si lo so, è una tipologia di ragionamento che si deve "imparare", confesso di avere davvero poca esperienza.
Scusate sono ancora io ! Andando avanti con l'esercizio ho un altro problema. Non riesco a capire come mai il mio professore ha fatto il seguente procedimento. Spiego l'esercizio:" Si scriva un applicazione per la gestione di un agenzia di viaggi. L'agenzia ha in archivio n clienti e può offrire vacanze in m città. Le informazioni sono memorizzate in una matrice di interi A di dimensione nxm dove nella generica cella A[j] viene memorizzato -1 se il cliente i non ha visitato la città j, altrimenti viene meomrizzato il voto (compreso tra 0 e 5) che il cliente i ha assegnato alla città j. L'applicazione deve fornire la funzione alike_city che riceve la matrice A rappresentante l'agenzia e una città c e restituisce la città valutata positivamente dal maggior numero di clienti che hanno valutato positivamente anche la città c. Una valutazione è positiva se è superiore a 2."
Con la matrice non ho avuto problemi, mentre invece non comprendo la funzione. Potreste spiegarmi passo passo la funzione di quei for?
Con la matrice non ho avuto problemi, mentre invece non comprendo la funzione. Potreste spiegarmi passo passo la funzione di quei for?

allora: tu hai una matrice n*m la cui posizione A[j] contiene la valutazione da 0 a 5 del cliente i-esimo della città j-esima; -1 se l'utente i non ha ancora visitato la città j.
una colonna contiene le valutazioni di tutti i clienti per la città j
una riga contiene le valutazioni di tutte le città per il cliente j
il primo for itera n volte; A.length rappresenta la lunghezza in verticale della matrice.
ad ogni iterazione si controlla se lil cliente i ha effettuato una valutazione positiva (>2) della città d che si passa come parametro alla funzione;
in ogni caso, alla fine, la variabile cont_c conterrà il numero di clienti che hanno valutato positivamente la città d.
ovviamente d deve essere 0 < d < m-1;
adesso viene la parte più complessa:
ci sono quattro cicli for annidati ....
se ti concentri sui due cicli più interni (quelli su k e z) essi scandiscono la matrice e per ogni cella
viene valutata l'espressione contenuta nell'if(...)
vediamola più in dettaglio:
è una espressione composta da tre condizioni elementari legate
dall'operatore logico && (and), cioè è vera se e solo se le tre espressioni:
(
A[z][k] > 2 il cliente in posizione (k, z) deve aver fatto una valutazione positiva.
z == i che la riga z cioè il cliente z sia uguale alla i-esima iterazione esterna
corrisponde a controllare gli elementi associati ad un unica riga per ogni iterazione della matrice.
quindi a controllare le valutazioni del cliente z su tutte le città.
z <= cont_c se il cliente z ha effettuato un numero di valutazioni positive al massimo pari
al numero di clienti che hanno effettuato una valutazione positiva per la città d.
)
sono verificate tutte e tre contemporaneamente.
nel momento in cui la condizione è soddisfatta allora la città che ti interessa corrisponde alla colonna k
e quindi viene assegnata alla variabile citta (nota che l'assegnamento è effettuato ogni qualvolta
la condizione nell'if è verificata questo perchè ci può essere una città che più si avvicina alla richiesta
della specifica dela funzione, nelle posizioni successive..
anche se da un punto di vista intuitivo quattro cicli innestati sono difficili da interpretare
i due cicli esterni non ti danno un'idea grafica ma puoi comunque immaginare che la matrice venga scandita tutta
per un numero di volte pari al prodotto di m*n
ad esempio se la matrice è 3*4 allora verra scandita 12 volte...
ovviamente questa è una mia interpretazione perchè non l'ho scritto io quel codice e quindi non posso delucidarti sui
tecnicismi ed i dettagli del codice da un punto di vista semantico, è buona abitudine
mettere della documentazione e dei commenti nel codice specie quando hanno una notazione complessa come nell'esempio
faresti bene a chiedere, comunque al tuo Prof, eventualmente qualche dettaglio in più sull'esempio....
una colonna contiene le valutazioni di tutti i clienti per la città j
una riga contiene le valutazioni di tutte le città per il cliente j
il primo for itera n volte; A.length rappresenta la lunghezza in verticale della matrice.
ad ogni iterazione si controlla se lil cliente i ha effettuato una valutazione positiva (>2) della città d che si passa come parametro alla funzione;
in ogni caso, alla fine, la variabile cont_c conterrà il numero di clienti che hanno valutato positivamente la città d.
ovviamente d deve essere 0 < d < m-1;
adesso viene la parte più complessa:
ci sono quattro cicli for annidati ....
se ti concentri sui due cicli più interni (quelli su k e z) essi scandiscono la matrice e per ogni cella
viene valutata l'espressione contenuta nell'if(...)
vediamola più in dettaglio:
è una espressione composta da tre condizioni elementari legate
dall'operatore logico && (and), cioè è vera se e solo se le tre espressioni:
(
A[z][k] > 2 il cliente in posizione (k, z) deve aver fatto una valutazione positiva.
z == i che la riga z cioè il cliente z sia uguale alla i-esima iterazione esterna
corrisponde a controllare gli elementi associati ad un unica riga per ogni iterazione della matrice.
quindi a controllare le valutazioni del cliente z su tutte le città.
z <= cont_c se il cliente z ha effettuato un numero di valutazioni positive al massimo pari
al numero di clienti che hanno effettuato una valutazione positiva per la città d.
)
sono verificate tutte e tre contemporaneamente.
nel momento in cui la condizione è soddisfatta allora la città che ti interessa corrisponde alla colonna k
e quindi viene assegnata alla variabile citta (nota che l'assegnamento è effettuato ogni qualvolta
la condizione nell'if è verificata questo perchè ci può essere una città che più si avvicina alla richiesta
della specifica dela funzione, nelle posizioni successive..
anche se da un punto di vista intuitivo quattro cicli innestati sono difficili da interpretare
i due cicli esterni non ti danno un'idea grafica ma puoi comunque immaginare che la matrice venga scandita tutta
per un numero di volte pari al prodotto di m*n
ad esempio se la matrice è 3*4 allora verra scandita 12 volte...
ovviamente questa è una mia interpretazione perchè non l'ho scritto io quel codice e quindi non posso delucidarti sui
tecnicismi ed i dettagli del codice da un punto di vista semantico, è buona abitudine
mettere della documentazione e dei commenti nel codice specie quando hanno una notazione complessa come nell'esempio
faresti bene a chiedere, comunque al tuo Prof, eventualmente qualche dettaglio in più sull'esempio....
