Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-05-2009, 13:16   #1
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
[JAVA] Esercizio d'esame...problema a capire l'inizializzazione di matrici, helpme

Ciao,
stò studiando per un esame che avrò tra poghi giorni ed ho qualche problema con la soluzione proposta in classe dal docente.

Il testo dice:
Si richiede il progetto di un dizionario, ossia un'insieme di associazionei, dove ogni associazione è del tipo PAROLA-TRADUZIONE e sia PAROLA che TRADUZIONE sono stringhe costituite da caratteri alfabetici minuscoli.
E' richiesta l'implementazione del solo operatore traduci() che data una PAROLA restituisce la sua TRADUZIONE.

In classe è stato risolto così:

Codice:
/** TIPO ASTRATTO DI DATO:
	
	V = {{<p,t>: p ^ t sono stringhe costituite da caratteri alfabetici minuscoli} *NB: Si tratta di un insieme di insiemi
	perchè voglio rappresentare una collezione di associazioni parola-traduzione.
	
	O = { 1) traduci: Data una parola p, se p € Dizionario restituisce la traduzione t
	
	C = 0 (non ci sono costanti significative */
	
public class Dizionario{
	
	private string [][] d;		// Rappresendo le associazioni parola-traduzione mediante una matrice quadrata
	
	/** REQUIRES: Il parametro deve essere un array bidimensionale di n righe e due colonne, interamente popolato da
				  stringhe di caratteri minuscoli */
				  
	public Dizionario(String[][] x){	// COSTRUTTORE
		int i,j;
		
		d = new String[x.length];		// Crea un array di stringhe lungo come x (numero righe)
		
		for(i=0; i<x.length; i++){
			if(x[i].length != 2) throw new FailureException();
			
			d[i] = new String[2];
			
			for(j=0; j<2; j++){
				if(corretto(x[i,j])
					d[i][j] = x[i][j];
				else throw new FailureException;
			}
		}
	}
	
	/** EFFECTS: Restituisce la traduzione dell'oggetto ricevente
		@param: il riferimento ad una oggetto di tipo String
		@return: il riferimento ad un oggetto di tipo String */
		
	public String traduci(String p){
		int i;
		Strint ris = null;
		
		for(i=0; i<d.length; i++)
			if(d[i][0] equals(p))
				ris = d[i][1];
		
		return ris;
	}
}
Praticamente il dizionario viene semplicemente gestito tramite una matrice bidimensionali di n righe e sole due colonne: la prima colonna di ogni rig conterrà una PAROLA e la seconda colonna conterrà la sua TRADUZIONE. Il metodo traduci() è molto semplice...

La cosa che mi crea qualche problema è il costruttore...praticamente prende come parametro una matrice di stringhe e dentro al costruttore viene allocata un'altra matrice di stringhe nel quale viene copiato il parametro...solo che non capisco come lo faccia...

Venendo da C mi pare differente (anche se non tocco C da quasi un annetto)...mi potete illuminare un pochino su cosa sta fecendo esattamente?

Tnx
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 14:19   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Rispondo in fretta e furia:
Quote:
Originariamente inviato da e-commerce84 Guarda i messaggi
Praticamente il dizionario viene semplicemente gestito tramite una matrice bidimensionale di n righe e sole due colonne: la prima colonna di ogni rig conterrà una PAROLA e la seconda colonna conterrà la sua TRADUZIONE. Il metodo traduci() è molto semplice...
Solo un appunto: se l'indicazione che leggo qui (evidenziato in grassetto):
Codice:
/** TIPO ASTRATTO DI DATO:
	
	V = {{<p,t>: p ^ t sono stringhe costituite da caratteri alfabetici minuscoli} *NB: Si tratta di un insieme di insiemi
	perchè voglio rappresentare una collezione di associazioni parola-traduzione.
	
	O = { 1) traduci: Data una parola p, se p € Dizionario restituisce la traduzione t
	
	C = 0 (non ci sono costanti significative */
starebbe a indicare che la complessità computazionale del metodo 'traduci' è costante, allora è errata; il metodo 'traduci', per come è stato implementato (cicla in ordine su ogni indice-riga della matrice e controlla se il primo elemento è la parola cercata) denota una complessità lineare.
Inoltre, cosa da notare, se la stringa passata in ingresso non è compresa nel dizionario, il metodo esegue tutte le N iterazioni prima di tornare.
Questo giusto per essere coscienti della cosa.


Quote:
Originariamente inviato da e-commerce84 Guarda i messaggi
La cosa che mi crea qualche problema è il costruttore...praticamente prende come parametro una matrice di stringhe e dentro al costruttore viene allocata un'altra matrice di stringhe nel quale viene copiato il parametro...solo che non capisco come lo faccia...

Venendo da C mi pare differente (anche se non tocco C da quasi un annetto)...mi potete illuminare un pochino su cosa sta fecendo esattamente?
La differenza che noti rispetto al linguaggio C è dovuta la fatto che in Java:
1) Non esistono i puntatori, esistono solo le reference (riferimenti) e non sono la stessa cosa;
2) il passaggio dei parametri ai metodi avviene sempre e solo per copia del valore.

Nello specifico il punto 2) significa che se passi una reference (come nel caso del tuo costruttore, dove 'x' è una reference a un oggetto di tipo String[][]) questa viene passata per copia del valore che contiene: la 'x' locale al metodo è una nuova reference il cui valore interno è lo stesso della reference passata in ingresso dal chiamante.

Il valore di una reference è l'indirizzo in memoria dove è memorizzato l'oggetto a cui ci si riferisce.

Quindi questo costruttore prende un riferimento a un oggetto String[][] già esistente, e dovendo inizializzare la reference locale alla classe ('d', di tipo String[][]) ad ogni iterazione del ciclo più esterno (ogni riga della matrice) alloca due nuove istanze di String (una per la PAROLA, l'altra per la TRADUZIONE) e copia le due String corrispondenti della matrice nelle due appena istanziate del dizionario 'd'.

Questo perchè in tal modo si vorrebbe realizzare una "copia interna" della matrice, in modo che agendo su i singoli nuovi oggetti istanziati nel dizionario non si vada a modificare quelli esterni della matrice passata al metodo.

In pratica l'esempio non è dei più felici per via della particolare natura degli oggetti String in Java (sono immutabili, il che vuol dire che se esegui un metodo che sembra avere l'effetto di modificare una String, in realtà stai creando un'altra String: il tipico caso è eseguire l'append tra oggetti string con l'operatore '+'; il risultato non è la modifica della String originaria ma la creazione di una nuova singola String ad ogni append eseguito [e anche questa affermazione non è del tutto corretta]).

Comuque questi sono probabilmente aspetti un po' più avanzati rispetto a ciò che state trattando adesso.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 15:12   #3
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Rispondo in fretta e furia:

Solo un appunto: se l'indicazione che leggo qui (evidenziato in grassetto):
Codice:
/** TIPO ASTRATTO DI DATO:
	
	V = {{<p,t>: p ^ t sono stringhe costituite da caratteri alfabetici minuscoli} *NB: Si tratta di un insieme di insiemi
	perchè voglio rappresentare una collezione di associazioni parola-traduzione.
	
	O = { 1) traduci: Data una parola p, se p € Dizionario restituisce la traduzione t
	
	C = 0 (non ci sono costanti significative */
starebbe a indicare che la complessità computazionale del metodo 'traduci' è costante, allora è errata; il metodo 'traduci', per come è stato implementato (cicla in ordine su ogni indice-riga della matrice e controlla se il primo elemento è la parola cercata) denota una complessità lineare.
Inoltre, cosa da notare, se la stringa passata in ingresso non è compresa nel dizionario, il metodo esegue tutte le N iterazioni prima di tornare.
Questo giusto per essere coscienti della cosa.



La differenza che noti rispetto al linguaggio C è dovuta la fatto che in Java:
1) Non esistono i puntatori, esistono solo le reference (riferimenti) e non sono la stessa cosa;
2) il passaggio dei parametri ai metodi avviene sempre e solo per copia del valore.

Nello specifico il punto 2) significa che se passi una reference (come nel caso del tuo costruttore, dove 'x' è una reference a un oggetto di tipo String[][]) questa viene passata per copia del valore che contiene: la 'x' locale al metodo è una nuova reference il cui valore interno è lo stesso della reference passata in ingresso dal chiamante.

Il valore di una reference è l'indirizzo in memoria dove è memorizzato l'oggetto a cui ci si riferisce.

Quindi questo costruttore prende un riferimento a un oggetto String[][] già esistente, e dovendo inizializzare la reference locale alla classe ('d', di tipo String[][]) ad ogni iterazione del ciclo più esterno (ogni riga della matrice) alloca due nuove istanze di String (una per la PAROLA, l'altra per la TRADUZIONE) e copia le due String corrispondenti della matrice nelle due appena istanziate del dizionario 'd'.

Questo perchè in tal modo si vorrebbe realizzare una "copia interna" della matrice, in modo che agendo su i singoli nuovi oggetti istanziati nel dizionario non si vada a modificare quelli esterni della matrice passata al metodo.

In pratica l'esempio non è dei più felici per via della particolare natura degli oggetti String in Java (sono immutabili, il che vuol dire che se esegui un metodo che sembra avere l'effetto di modificare una String, in realtà stai creando un'altra String: il tipico caso è eseguire l'append tra oggetti string con l'operatore '+'; il risultato non è la modifica della String originaria ma la creazione di una nuova singola String ad ogni append eseguito [e anche questa affermazione non è del tutto corretta]).

Comuque questi sono probabilmente aspetti un po' più avanzati rispetto a ciò che state trattando adesso.
Quell' 1) significa solo metodo numero 1 e visto che che l'insieme degli operatori O da implementare è solo traduzione c'è solo quello

Holetto quello che mi hai scritto e credo di aver capito...dopo devo provare a rivederlo sul testo e provare a farmi un paio di esempi pratici perchè cmq è un argomento un po' impiccioso...in pratica il ciclo esterno alloca le righe e per ogni riga c'è un ciclo interno che alloca le colonne, giusto?

Volendo con questo giochetto potrei farmi anche delle matrici "non quadrate" (del tipo la prima riga ha 4 colonne, la seconda riga ha 2 colonne,la terza riga 5 colonne...) ?

Si la storia delle stringhe che sono oggetti costanti la sapevo...se non erano stringhe ma altri oggetti non costanti avrei dovuto effettuare una copia hard e mettere nelle celle della matrice il riferimento al nuovo oggetto creato per non avere rischi di far casini da altre parti

Tnx
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 16:10   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Due note di colore. Java mutua da C l'esclusività del passaggio per copia e in Java i reference sono puntatori (quello che manca è l'aritmetica dei puntatori).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 16:51   #5
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
Ed una cosa del genere sarebbe corretta?
Posso pure evitare di fare la validazione del fatto che le stringhe siano composte da soli caratteri alfabetici minuscoli in quanto metto una bella clausola REQUIRES e chissene frega...

Codice:
d = new String[x.length][2];// Costruisco una matrice avente lo stesso numero di righe di x e avente sempre 2 colonne
		
		for(i=0; i<x.length; i++){		// Per ogni riga della nuova matrice d
			d[i][1] = x[i][1];		// Copia il contenuto della prima colonna della i-esima riga nella stessa posizione di d
			d[i][2] = x[i][2];	   // Copia il contenuto della seconda colonna della i-esima riga nella stessa posizione di d
		}
Sarebbe corretta una cosa del genere?

Tnx
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 18:36   #6
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
Ok...ora però ho qualche altro problema con la seconda parte dell'esame...sigh

Il testo del secondo esercizio(che si ricollega al primo esercizio) dice:
Codice:
Problema 2.
Sia data la classe InsiemeDiFrazioni che rappresenta e gestisce insiemi di frazioni. Della classe
InsiemeDiFrazioni viene fornita la specifica, descritta come segue:
public class InsiemeDiFrazioni {
/** OVERVIEW: implementa un tipo di dati astratto i cui elementi
appartengono all’insieme V={ {f1, f2, ...., fn}: ogni elemento fi è
una frazione, cioè, una coppia di interi relativamente primi};
gli oggetti istanza di questa classe sono mutabili;
l’insieme vuoto è rappresentabile mediante questa classe.
*/
/** EFFECTS: crea l’oggetto corrispondente ad un insieme vuoto di frazioni
*/
public InsiemeDiFrazioni() { .... }
/** REQUIRES: x != null ed x non contenuto in this
EFFECTS: inserisce x in this
MODIFIES: this
*/
public void inserisci(Frazione x) { .... }
/** REQUIRES: x != null
EFFECTS: se x è contenuto in this restituisce true, altrimenti
restituisce false
*/
public boolean contiene(Frazione x) { .... }
/** REQUIRES: this != insieme vuoto
EFFECTS: restituisce la frazione in this il cui valore è più vicino ad
x
*/
public Object get(double x) { .... }
/** REQUIRES: x != null e x this != insieme vuoto
EFFECTS: rimuove x da this se x è contenuto in this
MODIFIES: this
*/
public void rimuovi(Frazione x) { .... }
public String toString() { .... }
}
Si consideri, infine, una classe di test per le due classi sopra descritte che contenga, oltre al metodo main, il metodo
getFirst che prende come parametro, indifferentemente, un InsiemeDiFrazioni o un Dizionario (classe da
definire al problema 1) e che estrae dalla collezione ricevuta come parametro l’elemento che risulta primo rispetto
all’ordinamento definito, rispettivamente, nell’insieme delle frazioni e nell’insieme { parola-traduzione}, cioè:
· un oggetto f1 di tipo Frazione precede un oggetto f2 di tipo Frazione se
f1.getValore() < f2.getValore()
dove double getValore() è un metodo definito nella classe Frazione;
· una coppia parola1-traduzione1 precede una coppia parola2-traduzione2 se parola1 precede
lessicograficamente parola2.
Si richiede il progetto e l’implementazione del metodo getFirst e di tutte le entità Java coinvolte.
Io l'ho pensato così: creo un'interface chiamata CollConMinimo che al suo interno contiene solamente un metodo abstract calcolaMinimo()
Poi creo altre due classi: una classe che chiamo DizionarioConMinimo che estende Dizionario precedentemente definita ed implementa CollConMinimo. Ed un'altra classe chiamata InsiemediFrazioniConMinimo che sempre estende la classe InsiemeDiFrazioni di cui mi è stata fornita la specifica ed implementa l''interfaccia CollConMinimo.

Per DizionarioConMinimo dovrebbe bastare questo codice, l'unica cosa è che dovrei implementare il metodo get nella classe Dizionario ma vabbè quello è un attimo:

Codice:
public class DizionarioConMinimo extends Dizionario implements CollConMinimo{		// Ereditarietà multipla

	public DizionarioConMinimo(String[][] x){
		super(x);			// Invoca il costruttore della classe padre Dizionario passandogli la matrice di stringhe x
	}
	
	public Object calcolaMinimo(){
		
		int i = 1;
		boolean b = true;
		String s;
		
		try{
			s = get(0)
		}catch(IndiceErratoException e){}
		
		while(b){		// Finchè b è true
			try{		// Prova ad eseguire
				if(i.get(i).compare(s) < 0)	// Se l'i-esima stringa precede lessicograficamente la stringa contenuta in s
					s = get(i);				// Metti la stringa all'i-esimo posto in s
				}catch(IndiceErratoException e){b = false;}	// Quando viene sollevata l'eccezione imposta b a false per terminare il ciclo
				
			i++;		// Incrementa i per passare all'elemento successivo
		}
		
		return s;		// Restituisci la stringa calcolata
	}
}
Invece mi impippo nello scrivere il metodo calcolaMinimo per InsiemeDiFrazioniConMinimo in quanto dalla specifica non ho metodi per accedere agli oggetti della collezione di frazioni...qualche idea?

Poi vabbè per la classe di Test richiesta posso fare

Codice:
public class Test{
       public Object getFirst(CollConMinimo c){
                  return c.calcolaMin();
       }
}
Mi date una mano?

Tnx
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2009, 11:03   #7
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
up
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2009, 17:33   #8
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Secondo me il costruttore ti funziona anche se fai:

Codice:
d = x
Ma non sono praticissimo di Java xkè lavoro in C++ e Java non lo tocco quasi mai, xkè non mi piace e genera programmi troppo pesanti e lenti. Cmq la soluzione in classe è un buon modo per far notare allo studente come possa essere importante il controllo sull'input. Quella matrice x non è detto che sia formattata correttamente. Laddove non c'è sicurezza sul formato dei dati è importante prevedere tutti i necessari controlli. Questo principio fondamentale è rivolto ad evitare bug difficilmente individuabili, quando il progetto assume dimensioni elevate. In tal caso infatti un formato non corretto potrebbe produrre un output alterato che a seconda dell'applicazione potrebbe anche passare per buono.

Ultima modifica di Ikon O'Cluster : 28-05-2009 alle 17:40.
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
Axiom Space ha completato un importante ...
Gli aeroplani Airbus utilizzeranno i sat...
Una nuova immagine della cometa interste...
'La soluzione a un problema che non esis...
Radeon RX 9000 sì, Ryzen 9000 no:...
Amazon versa 180 milioni al Fisco e canc...
Meta, il Board di Supervisione guarda o...
DJI rivoluziona le consegne aeree: il nu...
Fibercop e Microsoft Italia uniscono per...
App Store Award 2025: scarica le 17 app ...
NVIDIA fa marcia indietro, il supporto P...
Addio definitivo alla GeForce GTX 1080: ...
Numeri record per gli iPhone 17: Apple s...
L'Italia del 2025 raccontata da Google: ...
Piaggio lancia Porter NPE, il pick-up el...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v