Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
La seconda generazione della citycar elettrica di Dacia passa alla piattaforma RGEV small di Renault Group, cresce di 15 cm in lunghezza e 18 cm in larghezza, adotta un motore da 80 CV e una batteria LFP da 27,5 kWh per 250 km WLTP. Prezzi da 17.900 euro, produzione a Novo Mesto in Slovenia.
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2011, 22:38   #1
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
[JAVA] Chiarimento su strutture lineari

Ciao a tutti,
questo è un metodo di una struttura lineare
Codice PHP:
public void rimuoviUtente(String n) {
        
Utente p = inizio;
        if (
p == null)
            return;
        if (
p.nome.equals(n)) {
            
inizio = inizio.prox;
            return;
        }
        while ((
p.prox != null) && (!p.prox.nome.equals(n)))
            
p = p.prox;
        if (
p.prox != null) 
            
p.prox = p.prox.prox;
        
//QUI!


    
} 
Codice PHP:
public class Utente {
    
String nome;
    
String email;
    
Utente prox;
  
    public 
Utente(String n, String e) {
        
nome = n;
        
email = e;
        
prox = null;
    }
} 
Il metodo rimuove correttamente un utente dalla lista. Quello che non capisco è: La nuova lista "p", creata all'interno del metodo, è accessibile solo all'interno del metodo. Perchè non viene copiata dentro this.inizio che è pubblico?

O meglio, siccome il metodo rimuoviUtente viene chiamato dall'esterno e dall'esterno viene letto solamente this.inizio perchè "p" non viene copiato in this.inizio?

La classe e il collaudo funziona correttamente. Ma non capisco come diavolo faccia se non gli aggiungo
Codice PHP:
this.inizio = p; 
Se lo aggiungo dopo viene cancellato il primo nodo della lista e anche l'ultimo. E non capisco il perchè...
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 13:42   #2
Gin&&Tonic
Member
 
L'Avatar di Gin&&Tonic
 
Iscritto dal: Aug 2010
Messaggi: 138
A

Ultima modifica di Gin&&Tonic : 14-06-2011 alle 13:44.
Gin&&Tonic è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 13:43   #3
Gin&&Tonic
Member
 
L'Avatar di Gin&&Tonic
 
Iscritto dal: Aug 2010
Messaggi: 138
Codice:
while ((p.prox != null) && (!p.prox.nome.equals(n))) 
            p = p.prox; 
        if (p.prox != null) 
            p.prox = p.prox.prox; 
        //QUI! ??
devi togliere completamente l'if interno al while , non serve a nulla. La tua "lista utenti" viene già esaminata nodo per nodo dall'istruzione:

while (p.prox != null) 
     p = p.prox; 

    }



In altre parole il metodo è questo:

Codice:
public void rimuoviUtente(String n) { 
        Utente p = inizio; 
        if (p == null) 
            return; 
      
        while (p.prox != null) {
            p = p.prox; 
            if (p.nome.equals(n)) { 
            inizio = inizio.prox; 
            return; 
      }
   } 
}


Non ho capito bene cosa fà questo : Utente p = inizio;

Ultima modifica di Gin&&Tonic : 14-06-2011 alle 13:45.
Gin&&Tonic è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 22:07   #4
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Si, ma non capisco perchè non viene aggiornata la variabile this.inizio, ma solo la variabile locale

Questo ad esempio è un altro pezzo di codice.
Io ragiono così:
- Inizializzo "p" al valore this.inizio. (Prodott inizio è il primo nodo della lista)
perchè non posso scorrere direttamente su this.inizio altrimenti viene cambiato il valore e rimangono con solamente l'ultimo nodo in mano.
- Se è nullo, ovvero se sto al primo nodo, allora aggiungo un nuovo nodo al primo (this.inizio)
(Fin qui ha senso..)
- Poi ciclo i successivi nodi della lista "p"
- Quando si verifica una certa condizione, aggiorno l'attributo "quantità" di "p".

Questo codice funziona (e' un esercizio d'esempio).
Quello che non capisco è come faccia a funzionare se la variabile "p" è una variabile locale!!
Avrebbe più senso se la modifica della quantità fosse stata fatta a this.inizio (come per il primo nodo).

Illuminatemi. Non riesco a venirne a capo! Please

Codice PHP:
public void aggiornaMagazzino(String c, String d, int q) {
        
Prodotto p = this.inizio;
        if (
p == null)
            
this.inizio = new Prodotto(c, d, q);
        else {
            while (
p.prox != null)
                
p = p.prox;
            if (
condizione) 
                
p.quant += q;
            
        }
    } 
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 22:19   #5
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
non è che potresti postare i codici completi di tutte le classi? così non si riesce a ragionare
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 22:22   #6
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Si, certo. Ecco qui...


Codice PHP:
public class Magazzino
{
    
Prodotto inizio;

    public 
void aggiornaMagazzino(String c, String d, int q) {
        
Prodotto p = inizio;
        if (
p == null)
            
inizio = new Prodotto(c, d, q);
        else {
            while (
p.prox != null)
                
p = p.prox;
            if (
condizione) 
                
p.quant += q;
        }
    }
} 

Codice PHP:
public class Prodotto {
    
String codice;
    
String desc;
    
int quant;
    
Prodotto prox;
   
    public 
Prodotto(String c, String d, int q) {
        
codice = c;
        
desc = d;
        
quant = q;
        
prox = null;
    }
} 
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 08:56   #7
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
allora il punto è che fai casino con i campi della classe prodotto.
nel paradigma ad oggetti è sempre sconsigliabile lasciare accessibili dall'esterno campi di una classe, e quindi è anche sconsigliabile andarvi ad accedere.

il mio consiglio è di rendere disponibili dei metodi nella classe prodotto che ne accedano ai campi.

ad esempio quando vuoi settare il prossimo prodotto, invece di fare p=p.prox avrai un metodo
Codice:
public boolean setProx(Prodotto p){
     if(this.prox!=null){
          this.prox=p;
          return true;
     }
     else
          return false;
}
e poi richiami in "magazino" inizio.setProx(p);


ma perchè non usare una List?
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 21:11   #8
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Non posso usare List perchè è un esercizio d'esame. La difficoltà è farlo senza List e framework vari.

A parte il fatto di incapsulare this.inizio. Quello è chiaro ma non è un problema ora.

Provo a spiegarmi meglio. Questo codice funziona perfettamente.
Il problema è che non capisco come faccia a funzionare.
se "p" non è nullo viene modificato un valore di un nodo della lista.
Fin qui tutto ok.
Il fatto è che la variabile "p" è locale, quindi dovrebbe morire alla fine del metodo e, subito dopo la modifica della lista, non c'è alcun legame con this.inizio!
Quando vado a stampare l'intera lista (da un altro metodo), ovvero "inizio" non vado a leggere "p"! Ma la lista risulta modificata! Cosa fà??

Codice PHP:
public class Magazzino 
{ 
    
Prodotto inizio; 

    public 
void aggiornaMagazzino(String c, String d, int q)
 { 
        
Prodotto p = inizio; 
        if (
p == null) 
            
inizio = new Prodotto(c, d, q); 
        else { 
            while (
p.prox != null) 
                
p = p.prox; 
            if (
condizione) 
                
p.quant += q; 
        } 
    } 
} 
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 21:21   #9
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
tu modifichi però inizio e il campo quantità della classe prodotto, è ovvio che la tua struttura dati ne sarà modificata!

o forse non ho capito bene cosa vuoi dire...
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 16-06-2011, 09:33   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da x3d0 Guarda i messaggi
...
Il fatto è che la variabile "p" è locale, quindi dovrebbe morire alla fine del metodo e, subito dopo la modifica della lista, non c'è alcun legame con this.inizio!
...
Quando vado a stampare l'intera lista (da un altro metodo), ovvero "inizio" non vado a leggere "p"! Ma la lista risulta modificata! Cosa fà??
...
Ciao x3d0,
credo che tu non abbia ben chiara la distinzione, in Java, tra un'istanza e il riferimento ad un'istanza.

Questa è la dichiarazione di un riferimento ad una istanza di tipo Prodotto con inizializzazione al valore di default:
Codice:
Prodotto p;
// equivale a: 
// Prodotto p = null;
Anche questa è la dichiarazione di un riferimento ad una istanza di tipo Prodotto (con inizializzazione al valore di default):
Codice:
Prodotto inizio;
// equivale a:
// Prodotto inizio = null;
"p" e "inizio", nei codici qui sopra, sono dei riferimenti inizializzati a null, cioè non si riferiscono (oppure non puntano, non sono collegati, come preferisci) a nessuna istanza di Prodotto.
Se provi ad accedere ad un membro di istanza di Prodotto (ad esempio al membro "codice" così: "p.codice;") tramite uno di questi due riferimenti viene lanciata una NullPointerException.

Come abbiamo detto, "p" e "inizio" sono dei riferimenti. Ma quando entrano in gioco le istanze vere e proprie?
Quando vengono create con la keyword "new".
Qui, ad esempio:
Codice:
Prodotto p = new Prodotto(c, d, q);
Cosa succede? A sinistra dell'operatore di assegnamento viene dichiarato "p" come un riferimento di tipo Prodotto; a destra dell'operatore di assegnamento viene creata un'istanza di Prodotto.
Il risultato ora è che "p" si riferisce a quell'istanza di Prodotto.
Nota come nel codice un'istanza di per se non ha un nome, è anonima; a venire nominati sono solo i riferimenti alle istanze (in Java).

Un ultimo esempio.
Nel codice che segue immagina che la chiamata a stampa() abbia l'effetto di stampare il nome di ogni riferimento a Prodotto esistente seguito dal valore dei membri dell'istanza di Prodotto a cui è collegato.
Codice:
Prodotto inizio, p;

// 1)
inizio = new Prodotto("123", "istanza1", 1);
p = inizio;
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["123", "istanza1", 1]

// 2
inizio = null;
stampa();
// inizio = null
// p = ["123", "istanza1", 1]

// 3
inizio =  new Prodotto("456", "istanza2", 1);
stampa();
// inizio = ["456", "istanza2", 1]
// p = ["123", "istanza1", 1]

// 4
Prodotto tmp = inizio:
inizio = p;
p = tmp;
tmp = null;
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["456", "istanza2", 1]
// tmp = null

// 5
Prodotto a, b;
a = new Prodotto("789, "istanza3", 1);
b = a;
a.codice = "999";
b.desc = "istanzaX";
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["456", "istanza2", 1]
// tmp = null
// a = ["999", "istanzaX", 1]
// b = ["999", "istanzaX", 1]
La morale è che l'operatore di assegnamento (=) applicato ad un riferimento collega quel riferimento con un'istanza, o indicando l'istanza a cui collegarsi direttamente (il caso del new) o indicandola indirettamente tramite un'altro riferimento.
Cioè l'assegnamento è un'operazione che modifica il riferimento (lo fa puntare ad un'altra istanza) e non tocca le istanze.

Invece l'assegnamento applicato a un membro di istanza attraverso un riferimento a quella istanza (il caso di a.codice = ... oppure b.desc = ..., con a e b che puntano alla stessa istanza) è una mutazione che si applica all'istanza stessa e non tocca i riferimenti (cioè non sono "a" e "b" a venire modificati, ma l'istanza a cui entrambi si riferiscono).


Ora prova ad analizzare nuovamente la classe Magazzino e il suo metodo aggiornaMagazzino: dovresti essere in grado di spiegarci cosa fa, e quindi perchè "funziona"
__________________

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)

Ultima modifica di banryu79 : 16-06-2011 alle 14:47.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa Nuova Dacia Spring, del modello precedente resta...
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
God of War: Sons of Sparta debutta su PS...
Dalle schede madri agli ospedali: ASUS p...
Perché Windows non permette di ch...
Il meglio in 7 articoli del Black Friday...
Black Friday Dyson: sconti fino al 43% s...
Cerebras cresce del 70% nel trimestre e ...
Black Friday Amazon, robot aspirapolvere...
22 milioni di persone coinvolte: il giga...
CPU desktop, Intel rialza la testa e AMD...
NVIDIA, una petizione chiede il ritorno ...
SpaceX Starship: Ship 42 è stata ...
Meta multata per 805 milioni di euro dal...
Jensen Huang avrebbe nascosto ai vertici...
Le prime cuffie over-ear di Vivo arrivan...
GPU, CPU e fotoni: il piano di AMD per p...
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: 15:04.


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