Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-08-2003, 00:39   #1
utrecht
Member
 
Iscritto dal: Jul 2002
Messaggi: 202
[JAVA] Esercizio (base?) su collezioni eterogenee e parametri polimorfi

Ho preso da un tutorial un esercizio per imparare il concetto di collezioni eterogenee nonchè paramentri polimorfi.
Lo scopo è di realizzare una classe che stabilisca le paghe dei dipendenti di un'azienda.
Dopo aver definito le classi 'Dipendente', 'Programmatore' e 'Dirigente', le indicazioni fornite sono quelle di utilizzare una collezione eterogenea di dipendenti ed un parametro polimorfo per risolvere il problema in un modo molto semplice, veloce ed elegante.

Tenete presente che il codice sarà pieno di cretinate perchè l'ho scritto io, cercando di venire a capo dell'esercizio (infatti in fase di compilazione ottengo un'errore!)
Mi aiutate a correggerlo? GRAZIE!
---

class Dipendente
{
int stipendio;
}
class Programmatore extends Dipendente
{
String cognome;
}

class Dirigente extends Dipendente
{
String orarioLavoro;
}

public class ParametroPolim
{
public void pagaDipendente(Dipendente dip)
{
Dipendente arr[] = new Dipendente [3];
arr[0]=new Dipendente();
arr[1]=new Programmatore();
arr[2]=new Dirigente();

if (dip instanceof Dipendente)
{
dip.stipendio=20;
}
else if (dip instanceof Programmatore)
{
dip.stipendio=500;
}
else
{
dip.stipendio=1000;
}
System.out.println(dip.stipendio);
}
/*
Suggerimento finale dell'autore: "... ora, possiamo chiamare questo metodo all’interno di un ciclo di n iterazioni, passandogli tutti gli elementi della collezione eterogenea, e raggiungere così il nostro scopo:"
. . .
for (int i=0; i<180; i++) //180 era il valore originale degli elementi dell'array
{
pagaDipendente(arr[i]);
. . .
}
*/

//Ed io ho pensato bene di tradurre in quello che segue ma non funziona...
public static void main (String args[])
{
for (int i=0; i<3; i++)
{
ParametroPolim obj =new ParametroPolim();
pagaDipendente(arr[i]);

}
}
}
utrecht è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2003, 01:38   #2
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Quote:
Originariamente inviato da utrecht
Codice:
	   //Ed io ho pensato bene di tradurre in quello che segue ma non funziona...
	   public static void main (String args[])
	   {
	   for (int i=0; i<3; i++)
         {
		 ParametroPolim obj =new ParametroPolim();
pagaDipendente(arr[i]);
			
         }
	   }
}
Per testare l'applicazione devi creare (nel main ad esempio) un array di oggetti Dipendente (che recita la parte della collezione eterogenea) di questo tipo:

Dipendente[] dipendenti={
new Dipendente(),
new Dirigente(),
new Programmatore(),
new Dipendente()
};

Sposta la creazione dell'oggetto Parametro Polim "obj" al di fuori del ciclo, cambia la condizione terminale del ciclo da "i<3" a "i<dipendenti.length" e poi passi "dipendent[i]i" come argomento di "pagaDipendenti".

Dovresti ottenere qualcosa così:

Codice:
public static void main(String[] a) {
  Dipendente[] dipendenti={
    new Dipendente(),
    new Dirigente(),
    new Programmatore(),
    new Dipendente()
  };

  ParametroPolim obj =new ParametroPolim();

  for(int i=0;i< dipendenti.length;i++) {
    obj.pagaDipendente(dipendenti[i]);
  }

  //per controllare
  for(int i=0;i< dipendenti.length;i++) {
    System.out.println("Dipendente "+i+" paga: "+dipendente[i].stipendio);
  }
}
Non l'ho provato ma dovrebbe funzionare.

L'errore in compilazione è dovuto al fatto che nel sorgente ad "arr[i]" (tradotto: elemento di indice "i" di "arr") non corrisponde un array definito come "arr".

Ciao.

P.S.

Le prime 4 righe del metodo paga dipendente non hanno funzione, puoi cancellarle.

Ultima modifica di PGI : 12-08-2003 alle 01:41.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2003, 13:56   #3
utrecht
Member
 
Iscritto dal: Jul 2002
Messaggi: 202
Innanzi tutto grazie per la risposta.
Quote:
Non l'ho provato ma dovrebbe funzionare.
In realtà, ottenevo un errore in fase di compilazione che però, una volta rivisitato (il codice che segue), mi faceva stampare sempre a zero il valore obj.pagaDipendente(dipendenti[i]).
---
public class ParametroPolim
{
public void pagaDipendente(Dipendente dip)
{
if (dip instanceof Dipendente)
{
dip.stipendio=20;
}
else if (dip instanceof Programmatore)
{
dip.stipendio=500;
}
else
{
dip.stipendio=1000;
}
System.out.println(dip.stipendio);
}

public static void main(String[] args)
{
Dipendente dipendenti [] =
{
new Dipendente(),
new Dirigente(),
new Programmatore(),
};

ParametroPolim obj =new ParametroPolim();

//per controllare
for(int i=0;i<dipendenti.length;i++)
{System.out.println("Dipendente "+i+" paga: "+obj.pagaDipendente(dipendenti[i]));}
}

}

... allora ho modificato il valore di ritorno del metordo pagaDipendente in
public int pagaDipendente(Dipendente dip)
{
. . .
return dip.stipendio;
}

ma mi restituisce sempre il valore '20', gli altri vengono ignorati........

Nessun 'aiutino'?
utrecht è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2003, 14:34   #4
utrecht
Member
 
Iscritto dal: Jul 2002
Messaggi: 202
......ora funziona!! Magari potrebbe anche non fregarvene niente ma la sintassi corretta all'interno del metodo pagaDipendente è:
. . .
if (dip instanceof Dipendente)
{
dip.stipendio=20;
}
if (dip instanceof Programmatore)
{
dip.stipendio=500;
}
if (dip instanceof Dirigente)
{
dip.stipendio=1000;
}
return dip.stipendio;
/* anche se non mi sembra elegantissimo! */
. . .

anzichè
. . .
if (dip instanceof Dipendente)
{
dip.stipendio=20;

}
else if (dip instanceof Programmatore)
{
dip.stipendio=500;

}
else
{
dip.stipendio=1000;
}
return dip.stipendio;
. . .

Certo è che non riesco a capire perchè nel primo caso non mi viene valutata correttamente l'intera espressione condizionale.......
utrecht è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2003, 15:25   #5
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Quote:
Originariamente inviato da utrecht
Certo è che non riesco a capire perchè nel primo caso non mi viene valutata correttamente l'intera espressione condizionale.......
Da occhio di falco quale sono non l'avevo notato...l'età! Beh, non si chi sia l'autore dell'esempio che hai seguito ma quello non è il paradiso dell'efficenza.

Perchè "if" si "else if" no?

Per dirla con una metafora,l'operatore "instanceof" restituisce "true" non quando l'elemento (oggetto) a sinistra appartiene al modello (classe) a destra ma, più genericamente, se l'elemento a sinistra si trova in un ramo "inferiore" dell'albero genealogico a cui appartiene l'elemento-classe di destra.

Programmatore e Dirigente sono tutti "figli" di Dipendente.

Per questo in un array di oggetti i cui elementi siano tutti figli o istanze di Dipendente "array[i] instanceof Dipendente" sarà sempre "true"

Poichè in una serie di condizionali "if...else if..." il secondo viene preso in considerazione solo se il primo sia falso ecco che ad ogni elemento dell'array viene assegnato lo stipendio da "Dipendente"

Con una serie if...if invece quello che fai è una sorta di "scrematura" successiva in cui il primo if è sempre vero e il secondo-terzo possono essere vero o falso. Apparentemente il programma funziona, ma solo se nel codice sorgente si rispetta un ordine definito nella serie di "if...instanceof"

Ma cosa succederebbe se decidessi di aggiungere un terzo modello di Dipendente, "figlio" di Dirigente, magari un "DirigenteDiSecondoLivello"? Si riproporrebbe lo stesso problema, perchè le verifiche su un Dirigente restituirebbero "true" anche sul nuovo (e diverso) dirigente. Ecco allora che la tua serie di if si arricchirebbe di un ulteriore elemento che ad ogni esecuzione del cilclo carica di lavoro il processore.

Per farla breve, tra vettori eterogenei e parametri polimorfici (nomi altisonanti, nascondono concetti elementari) alla fine abbiamo perso di vista le basi dell'ereditarietà. Se vuoi una soluzione alternativa fai un fischio, ma non credo sia necessario perchè l'esercizio era sui parametri polimorfici (tradotto è "passare un oggetto come parametro", nulla di più, che sia polimorfico è conseguenza dell'ereditarietà) e collezioni eterogenee (tanto per saperlo non c'è un bel nulla di eterogeneo, lo sarebbe invece se fosse un insieme di primitivi e oggetti).

Per curiosità chi è l'autore del libro che stai leggendo?

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2003, 19:13   #6
utrecht
Member
 
Iscritto dal: Jul 2002
Messaggi: 202
Nel dubbio (non voglio scatenare polemiche ) l'ho postato in pvt
utrecht è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2003, 20:30   #7
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Dal basso della mia esperienza lo trovo un ottimo manuale (bello condensato però!)

A fini d'esempio sul "polimorfismo" il codice del capitolo 6 è valido (nota che la classe Dipendente non viene mai usata direttamente ma solo come modello "astratto". Evito di essere "verboso", comunque quel particolare rende coerente il codice inserito nel manuale)

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2003, 10:44   #8
utrecht
Member
 
Iscritto dal: Jul 2002
Messaggi: 202
..... complimenti per la chiarezza e la semplicità con la quale ti spieghi!
Aggiungo che ho in realtà anche un tomo sul quale cerco di studiare: "Thinking in Java" di Bruce Eckel.

Approfitto della tua preparazione e della tua disponibiltà. Tempo fa avevo chiesto su un forum concorrente dove poter reperire esercizi, magari con difficoltà crescente e con annesse soluzioni, in maniera tale da testare non solo il mio grado di preparazione ma anche per comprendere come debba essere affrontato l'approccio ad un problema (soprattutto mi interesserebbe vedere del codice sorgente scritto da persone competenti). La risposta è stata "... cerca in rete".
Riesce a fornirmi qualche coordinata più precisa? Grazie.

E comunque non è detto che in futuro io non torni a massacrarti con qualche altre quesito
utrecht è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2003, 14:34   #9
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Se hai "thinking in java" potresti fare un pensierino sull'acquisto (20$, pagamento con carta di credito) della guida annotata alla soluzione degli esercizi proposti nel manuale di Bruce Eckel (link].

Per la verità è l'unica serie esercizi-soluzioni di cui io abbia notizia.

Ho provato a fare una rapida ricerca su google con "raccolta esercizi java"; è facile rendersi conto di quanto sia poco utile la risposta "cerca in rete"

Per esempi di codice, un tempo c'era una bella rubrica su mokabyte (http://www.mokabyte.com/mokacode/index.htm), attualmente è off-line per "aggiornamento" (?), non so quando tornerà in linea..

Dubbi e curiosità sono sempre risolubili su questo forum, c'è un bel gruppo di persone disponibili a condividere un po' si "sapere"

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Samsung Galaxy S26 Ultra: una sola novit...
Google prepara Gemini 3 Pro e Nano Banan...
TVS non è solo moto e scooter: ec...
Alexa+ arriva su BMW: gli automobilisti ...
Gemini Deep Research arriva su Google Fi...
Rinvii a catena, Marvel 1943: Rise of Hy...
Xiaomi inaugura uno spazio dedicato ai f...
Rilasciate le specifiche di Bluetooth 6....
L'obiettivo che mette tutto a fuoco: la ...
Meta avrebbe raccolto fino al 10% dei ri...
NVIDIA DGX Spark e videogiochi? Una pess...
Serie Oppo Reno15 confermata: arriva il ...
UPDF 2025: l'editor PDF che fa (quasi) t...
Partono altri sconti pesanti su Amazon, ...
OpenAI senza freni: centinaia di miliard...
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: 17:44.


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