[Java] Matrice rannidata

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
CRIMON
Prode Principiante
Messaggi: 136
Iscrizione: domenica 30 agosto 2015, 18:38
Desktop: Unity\Mate
Distribuzione: Ubuntu 15.10
Sesso: Maschile

[Java] Matrice rannidata

Messaggio da CRIMON »

Salve, volevo una mano, vorrei realizzare una "matrice" i cui numeri vadano via via crescendo in questo modo: sono sulla prima riga vado da sn a dx di tot poi ma li (prima riga tutto a dx) vado in basso sempre sulla stessa colonna, poi da in basso a dx torno a sn e poi di nuovo in altro fino alla seconda riga per poi riportarmi a dx, pensavo di usare un array bidimensionale, ma mi blocco, non so come fare dopo la rima riga:per ora è così ma è un semplice aray di array stampato:

public class Matriceconcat {

public static void main(String[] args) {
// TODO Auto-generated method stub
int a[][];
int i=0;
a = new int[5][5];
for(int x=0;x<5;x++)
for(int y=0;y<5;y++){
a[x][y]= i++;
if(i==5||i==10||i==15||i==20){
System.out.println();
}
System.out.print(i);

}
}
}
Ultima modifica di CRIMON il domenica 26 febbraio 2017, 14:49, modificato 2 volte in totale.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Java] Matrice

Messaggio da nuzzopippo »

Regole piuttosto confuse, quelle esposte, ovviamente stai parlando di array di array, dichiarazione di uno bidimensionale : "int [][] matrice" i cui elementi possono essere individuati tramite due indici indicati riga e colonna, tipo "matrice[1][¹]" per indicare il 2° elemento della seconda riga.

In merito al popolamento della matrice è necessario stabilire univocamente quali sono le regole di composizione prima di poterlo fare, sovente si utilizzano cicli for annidati su tal genere di oggetti, ma dipende dalla logica da applicarsi.
Fatti non foste a viver come bruti ...
Avatar utente
Mdfalcubo
Moderatore Globale
Moderatore Globale
Messaggi: 20415
Iscrizione: venerdì 26 dicembre 2008, 11:17
Desktop: Solo XFCE
Distribuzione: Xubuntu 64 bit
Sesso: Maschile

Re: [Java] Matrice

Messaggio da Mdfalcubo »

Per favore metti un titolo più esplicativo. Grazie.
"Il genere umano è stimolante, è la gente che non sopporto,, (Linus - Peanuts)
neofitabo
Prode Principiante
Messaggi: 6
Iscrizione: sabato 4 febbraio 2017, 10:41
Sesso: Maschile

Re: [Java] Matrice

Messaggio da neofitabo »

Ciao, prova a vedere se te ne esci in questo modo: potresti gestire ogni lato con un ciclo for facendo attenzione agli indici che variano dopo ogni for. All esterno dei 4 for ci dovrebbe essere un ciclo (for o while è indifferente) in maniera tale da gestire il numero totale delle operazioni sulla matrice. Buon divertimento.
CRIMON
Prode Principiante
Messaggi: 136
Iscrizione: domenica 30 agosto 2015, 18:38
Desktop: Unity\Mate
Distribuzione: Ubuntu 15.10
Sesso: Maschile

Re: [Java] Matrice rannidata

Messaggio da CRIMON »

il codice per ora è questo:

public class Matriceconcat {

public static void main(String[] args) {
// TODO Auto-generated method stub
int a[][];
int i=0;
a = new int[5][5];
for(int x=0;x<5;x++)
for(int y=0;y<5;y++){
a[x][y]= i++;
if(i==5||i==10||i==15||i==20){
System.out.println();
}
System.out.print(i);

}
}
}

Però non segue la regola del continuare a chiudere il quadrato, non so come fare e in più non so come si esprime la generica i = 5 o multipli in:
if(i==5||i==10||i==15||i==20){
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Java] Matrice rannidata

Messaggio da nuzzopippo »

CRIMON [url=http://forum.ubuntu-it.org/viewtopic.php?p=4961789#p4961789][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Salve, volevo una mano, vorrei realizzare una "matrice" i cui numeri vadano via via crescendo in questo modo: sono sulla prima riga vado da sn a dx di tot poi ma li (prima riga tutto a dx) vado in basso sempre sulla stessa colonna, poi da in basso a dx torno a sn e poi di nuovo in altro fino alla seconda riga per poi riportarmi a dx, pensavo di usare un array bidimensionale, ma mi blocco, non so come fare dopo la rima riga:per ora è così ma è un semplice aray di array stampato:
Se ho interpretato bene,
Non mi sembra sia rispettato l'andamento sinistra => destra => basso => sinistra => alto definito.

L'andamento a destra od a sinistra può essere impostato giocando sulle righe pari o dispari, non è chiaro come dovrebbe agire la procedura quando deve salire; occupa la riga superiore alla prima valutata o cosa?

[Edit] - nel caso abbia interpretato male e la matrice deve solo scendere, è sufficiente definire l'andamento giocando sui numeri di riga pari, tenendo presente che il valore iniziale è zero
Fatti non foste a viver come bruti ...
CRIMON
Prode Principiante
Messaggi: 136
Iscrizione: domenica 30 agosto 2015, 18:38
Desktop: Unity\Mate
Distribuzione: Ubuntu 15.10
Sesso: Maschile

Re: [Java] Matrice rannidata

Messaggio da CRIMON »

si, putroppo non sono riuscito a farla andare solo sotto, non ho capito come fare e poi farla tornare da li a sn per poi risalire
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Java] Matrice rannidata

Messaggio da nuzzopippo »

CRIMON [url=http://forum.ubuntu-it.org/viewtopic.php?p=4962402#p4962402][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:si, putroppo non sono riuscito a farla andare solo sotto, non ho capito come fare e poi farla tornare da li a sn per poi risalire
Giusto per sfizio, ieri, ho preparato il codice per "solo discesa" basato sul Tuo, Te lo posterò, con spiegazioni, questo pomeriggio, ora non ho disponibile il file, da quella base potrai ripartire per la versione con "Salita", per tale seconda versione Ti suggerisco di leggere la documentazione sugli ArrayList ed escogitare un algoritmo di controllo dello step verticale.
Gli esercizi che stai facendo sono istruttivi, a patto che ci si ingegni ad affrontare il problema, certamente suggerimenti ed esempi non guastano ma aiutano poco, è bene esercitarsi ad affrontare i problemi ed a trovare soluzioni.

[Edit] Non necessariamente bisogna usare gli arraylist, gli ho posti essenzialmente per abitudine, anche i vettori multipli dei Tuoi esempi vanno bene, a patto di definire un opportuno utilizzo degli indici di riga.
Ultima modifica di nuzzopippo il lunedì 27 febbraio 2017, 11:25, modificato 1 volta in totale.
Fatti non foste a viver come bruti ...
CRIMON
Prode Principiante
Messaggi: 136
Iscrizione: domenica 30 agosto 2015, 18:38
Desktop: Unity\Mate
Distribuzione: Ubuntu 15.10
Sesso: Maschile

Re: [Java] Matrice rannidata

Messaggio da CRIMON »

Grazie mille, si so che non ne ricaverei troppo a livello istruttivo è che mi sono bloccato
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Java] Matrice rannidata

Messaggio da nuzzopippo »

Allora, Il Tuo codice ha un errore di base : vuoi stampare subito i dati, ovviamente li stamperesti consecutivamente, dato che i ha un incremento lineare; quello che in realtà vuoi stampare credo sia la matrice, pertanto devi prima crearla.

Ragionando sulla "Sola discesa"

La matrice deve venir popolata in sequenza inversa cambiando riga, la prima riga deve andare da sinistra a destra, la successiva destra => sinistra e così via; un possibile metodo per affrontare il problema è utilizzare l'indice di riga per definire l'andamento, se la riga è pari si va verso sinistra, verso destra se è dispari, puoi deciderlo tramite la divisione con resto dell'indice se "(x % 2) == 0" la riga è pari.
Quando la riga deve andare da destra a sinistra devi, ovviamente, partire dal più alto indice di colonna (4) per giungere allo zero.
Una volta popolata la matrice la stampi.

il codice :

Codice: Seleziona tutto

public class Matriceconcat {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[][];
		int i=0;
		a = new int[5][5];
		for(int x=0;x<5;x++) {
			if ((x % 2) == 0) {		// N.B. - la matriee inizia da 0
				for(int y=0;y<5;y++){
					a[x][y]= ++i;
				}
			} else {
				for(int y=4;y>=0;y--){
					a[x][y]= ++i;
				}
			}
		}
		for (int x=0; x<5; x++) {
			for (int y=0; y<5; y++) {
				String tmp = "" + a[x][y];
				if (tmp.length() < 3) {
					String spazi = "";
					for (int j=0; j<(3 - tmp.length()); j++) {
						spazi += " ";
					}
					tmp = spazi + tmp;
				}
				System.out.print(tmp);
			}
			System.out.println();
		}
	}
}
Noterai come assegni la "i" con l'operatore di pre-incremento, così il valore prima incrementato e poi assegnato in modo da avere "1" e non "0" quale primo elemento della matice.

Per altro ho utilizzato un elementare accorgimento di assegnazione spazi per avere una stampa ordinata della matrice, l'ouput del programma su :

Codice: Seleziona tutto

 java Matriceconcat
  1  2  3  4  5
 10  9  8  7  6
 11 12 13 14 15
 20 19 18 17 16
 21 22 23 24 25
Ritengo che Ti sarà facile derivare da Te un ordinamento alternato basso/alto di righe, basta pensarci un attimo, ti lascio nello spoiler un suggerimento per una possibile implementazione da usare se proprio non Ti riesce ma cerca di derivarlo da Te e, magari, leggilo poi (non barare ;) )
Spoiler
Mostra
Parti dalla riga centrale della matrice ed utilizza una variabile per la riga corrente e due variabili pivot per il limite superiore ed inferiore raggiunto, una ulteriore variabile booleana controllerà quale pivot incrementare e rendere riga corrente, il tutto racchiuso in un ciclo che esce solo quando entrambi i pivot saranno ai bordi (sup. ed inf.) della matrice
Fatti non foste a viver come bruti ...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 11 ospiti