Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: TheSpecialOne on 26-01-2009, 16:23:28



Title: Esercizi di laboratorio
Post by: TheSpecialOne on 26-01-2009, 16:23:28
Salve a tutti, avete x caso altri esercizi di laboratorio???
non posso mica fare x una settimana l'esempio che ci ha lasciato il prof!


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 26-01-2009, 17:04:40
 .quoto .quoto .quoto


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 27-01-2009, 11:05:57
nessuno ha una risp???? .poverinoi


Title: Re:Esercizi di laboratorio
Post by: TheSpecialOne on 27-01-2009, 12:30:09
nessuno ha una risp???? .poverinoi

mi sà di no, ci facciamo lo stesso esercizio per l'ennesima volta, ormai lo sò a memoria!
voglio quello all'esame!! |-O


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 27-01-2009, 12:32:26
Bè si ma non è molto produttivo...non riesco a capire se è il caso di tentare la prova di laboratorio o no!!un esercizio rifatto diverse volte è logico che riesco a farlo  .poverinoi


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 27-01-2009, 13:21:30
avrò messo almeno due volte (se non di più) i link ad altri esercizi di laboratorio. Ma eventualmente ne prendete uno dal sito del prof. Cincotti e provate a svilupparlo (il compilatore è il miglior aiuto per vedere se funziona o no). Ariecco gli altri esercizi comunque (risolti):
1. http://forum.sdai.unict.it/index.php?topic=178.0
2. http://www.dmi.unict.it/u2/index.php?option=com_joomlaboard&Itemid=34&func=view&id=45580&catid=6
3. http://www.dmi.unict.it/u2//index.php?option=com_joomlaboard&Itemid=34&func=view&id=24487&catid=6#msg24487
Sempre se c'è qualche altro problema che invece non ho capito...
Ho dimenticato il link del dispenser di programmazione: http://www.dmi.unict.it/u2/index.php?option=com_docman&task=cat_view&gid=84&Itemid=27


Title: Re:Esercizi di laboratorio
Post by: TheSpecialOne on 27-01-2009, 13:41:07
io e vivynz (scusa la pronuncia!) intendevamo quelli di laboratorio, con l'uml da implementare in java e 3 richieste da assolvere
ti ringrazio cmq x la tua disponibilità!


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 27-01-2009, 13:46:11
io e vivynz (scusa la pronuncia!) intendevamo quelli di laboratorio, con l'uml da implementare in java e 3 richieste da assolvere
ti ringrazio cmq x la tua disponibilità!
esattamente...implementare tutti i metodi e le classi di un esercizio di 3parte è molto più complicato dell'esercizio tipo che il prof cincotti ha messo online http://www.dmi.unict.it/~cincotti/prog1/file/prova2.pdf (http://www.dmi.unict.it/~cincotti/prog1/file/prova2.pdf)...

Volevo sapere anche una cosa...quando nel diagramma uml una classe è legata ad un'altra con un rombo(se non sbaglio si indica con il termine composizione???), nella creazione del codice java questo si rappresenta in qualche modo particolare?o basta implementare una classe separata ed utilizzarla nell'altra?


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 27-01-2009, 14:54:01
allora ho capito bene. Ed in questo caso se vedete i collegamenti sopra (del vecchio forum) gli esercizi sono svolti proprio seguendo questa linea (in quanto anche gli esercizi della ex terza parte per verificarne l'efficienza dovevano essere implementati interamente in java). Ci sono l'esercizio sui prodotti agricoli e quello sugli strumenti chirurgici. Gli altri vanno fatti ALLA STESSA MANIERA, se riscontrate problemi potete postare qui sul forum (come fatto finora). Saluti. .ciaociao
EDIT: rispondo al tuo dubbio con un SI, il rombo indica una caratteristica chiamata aggregazione, ovvero sta a significare che l'oggetto in questione "appartiene" ad un altro senza tuttavia esserne figlio. Questo presuppone che l'oggetto al quale è aggregato esista. In parole povere se nella classe Etichetta c'è l'attributo rappresentato dall'oggetto Data, significa che la data è una parte dell'etichetta. Se non esistesse l'etichetta, nemmeno la data avrebbe motivo di esistere. La differenza dalla composizione (sostanzialmente) è che, per essere composizione, l'oggetto deve essere aggregato per forza ad una superclasse o figli (che non siano quindi aggregati a nessuno). Se tu aggreghi un altro oggetto alla classe Data (aggregata ad Etichetta), quella è ancora aggregazione, ma non più composizione.
Vedi questo (http://programmazione.html.it/guide/lezione/1335/aggregazioni/) come esempio per capire meglio il discorso. In java (come puoi vedere negli esempi dei post che ho indicato) sono implementate come classi a sè stanti.


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 27-01-2009, 14:58:51
si, ho capito...solo che sono molto più complessi e per farli dobbiamo esercitarci anche sulla terza parte, solo questo era il problema  .arrossisco

EDIT: grazie Fr3d3R!K ora ho capito  .smile


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 28-01-2009, 11:02:07
ho mandato un'email al prof...e ha detto che questo è il primo anno che la prova è strutturata così quindi nessun altro esempio come quello che già abbiamo..


Title: Re:Esercizi di laboratorio
Post by: Crasher on 28-01-2009, 11:28:54
andiamo bene :(


Title: Re:Esercizi di laboratorio
Post by: hax on 28-01-2009, 11:37:14
Io ho un dubbio sul metodo getTotale di alcuni esercizi, tra cui quello dell'azienda agricola.

getTotale; restituisce il numero di prodotti esistenti fino all’istante di
invocazione del metodo;

Ho pensato che se creo un array nel main, il metodo getTotale deve contare gli oggetti dell'array diversi da null.
Ma come fa a vedere tutto l'array? l'unico modo è passare l'intero array come parametro? Se è così, non mi sembra una buona soluzione...

L'alternativa è quella di non creare l'array nel main ma nel costruttore passando come parametro la grandezza dell'array...
così il metodo vede tranquillamente tutto l'array.

non so quale soluzione usare... .penso


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 28-01-2009, 11:47:42
qualcuno può illuminarci?ho lo stesso problema...come faccio a contare tutti gli oggetti istanziati fino ad un dato momento???


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 28-01-2009, 12:07:57
è più semplice di quello che pensiate, basta mettere dentro il costruttore della superclasse un bel "totale++;" così ogni volta che viene creata una nuova istanza dell'oggetto (quindi chiamato il costruttore) il contatore si incrementa .wink .
EDIT: la dichiarazione dell'array è semplicemente dichiarazione, come ho già spiegato quando parlavo dell'aggregazione. L'instanziazione vera e propria degli oggetti avviene dentro switch contenuto nel for (vedasi main degli esempi sopra). Per ogni locazione viene istanziato l'oggetto "corrispondente", chiamato in causa il costruttore della superclasse, e quindi incrementato il contatore.


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 28-01-2009, 12:11:07
c'è da rimanerci male dalla semplicità  :[Emoticon] Asd: mi aspettavo chissa cosa!!meglio così  .whistling


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 28-01-2009, 12:23:10
c'è da rimanerci male dalla semplicità  :[Emoticon] Asd: mi aspettavo chissa cosa!!meglio così  .whistling
.rido .smile comunque infatti meglio così .timido
ho mandato un'email al prof...e ha detto che questo è il primo anno che la prova è strutturata così quindi nessun altro esempio come quello che già abbiamo..
io ho visto l'esempio e mi è sembrato come la prova di laboratorio dell'anno scorso...mah...


Title: Re:Esercizi di laboratorio
Post by: hax on 28-01-2009, 12:49:47
ma per avere richiamare il getTotale devo scrivere per forza prodotto(i).getTotale, che secondo me non ha senzo visto che darà lo stesso risultato per qualunque i...

credi sia meglio questa soluzione sotto?
L'alternativa è quella di non creare l'array nel main ma nel costruttore passando come parametro la grandezza dell'array...
così posso scrivere prodotto.getTotale()...


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 28-01-2009, 13:23:11
non capisco cosa vuoi dire hax, quando crei l'array di oggetti poi vai ad istanziare ogni singolo oggetto nelle singole locazioni. Per ottenere il totale non devi fare nessun
Code:
prodotto[i].getTotale()
(con le quadre non con le tonde .wink ) perchè come dici tu non avrebbe senso. Nella soluzione che dico io la variabile totale è una variabile privata della (eventuale) superclasse, che quindi ottieni tramite il metodo
Code:
public int getTotale()
{
     return totale;
}
richiamabile tramite l'istruzione
Code:
prodotto.getTotale();
in quanto è una variabile "globale" (messa tra virgolette di proposito per non creare confusione con la definizione vera e propria di variabile globale che è un'altra cosa) che appartiene (e quindi verrà ereditata) a tutte le classi figlie.
Saluti.


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 28-01-2009, 13:31:35
ho mandato un'email al prof...e ha detto che questo è il primo anno che la prova è strutturata così quindi nessun altro esempio come quello che già abbiamo..
io ho visto l'esempio e mi è sembrato come la prova di laboratorio dell'anno scorso...mah...
come può essere???ma la prova dell'anno scorso qual era??c'è da qualche parte?


Title: Re:Esercizi di laboratorio
Post by: hax on 28-01-2009, 14:12:36
Per ottenere il totale non devi fare nessun
Code:
prodotto[i].getTotale()
(con le quadre non con le tonde .wink )
vabbè le tonde erano perchè sennò mi scriveva in corsivo visto che non l'ho messo come codice...

quello che non capisco io è:
se nel main metto:
Code:
Prodotto[] p=new Prodotto[30];
p[1]=new VinoBianco(....)
p[2]=new VinoRosso(...)
......
......
se richiamo p.getTotale() mi da ovviamente errore visto che p è un array. Non riesco a cogliere la tua soluzione a questo  :-)|


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 28-01-2009, 16:02:25
errore? ho dei dubbi visto che quando sviluppavo quelle situazioni in java non ho avuto problemi simili. Posta il codice e vediamo, magari è qualcos'altro che ti genera l'eccezione...


Title: Re:Esercizi di laboratorio
Post by: hax on 28-01-2009, 19:33:34
il codice è questo:
Code:
import java.util.*;
import java.math.*;
import javax.swing.*;

//CLASSE ABSTRACT PRODOTTO
abstract class Prodotto{
int totale=0;
float peso; //peso prodotto
final float c=3; //costante per il calcolo del prezzo

//COSTRUTTORI
public Prodotto(float x){
peso=x;
}

//METODI
public float getPeso(){
return peso;
}
public String toString(){
String oggetto="";
if (this instanceof Olio)
oggetto="Olio";
else
if (this instanceof Rosso)
oggetto="Rosso";
else
if (this instanceof Bianco)
oggetto="Bianco";
else
oggetto="prodotto sconosciuto";
return ("Prodotto: " + oggetto);
}
public abstract float getPrezzo();
public int getTotale(){
return totale;
}
}
//CLASSE OLIO
class Olio extends Prodotto{
float viscosita;
boolean aromatizzato=false;

//COSTRUTTORI
public Olio(float peso, float visc){
super(peso);
viscosita=visc;
totale++;
}

//METODI
public void aromatizza(){
aromatizzato=true;
}
public float getPrezzo(){
return c*peso;
}
public String toString(){
return ("\n\n" + super.toString() + "\nPeso: "+ super.getPeso());
}
}

//CLASSE ABSTRACT VINI
abstract class Vini extends Prodotto{
float percCons;
InfoProv informazioni;

//COSTRUTTORI
public Vini(float peso, float consistenza, String local, String cVigna,Data rUva){
super(peso);
percCons=consistenza;
informazioni=new InfoProv(local,cVigna,rUva);
}

public String toString(){
return (super.toString() + "\nPercentuale consistenza: " + percCons + informazioni);
}
}

//CLASSE INFOPROV
class InfoProv{
String localita="";
String codVigna="";
Data dataRaccoltaUva;

//COSTRUTTORI
public InfoProv(String x, String y,Data rUva){
localita=x;
codVigna=y;
dataRaccoltaUva=rUva;
}

//METODI
public Data getDataRaccoltaUva(){
return dataRaccoltaUva;
}
public String toString(){
return ("\nLocalità: " + localita + "\nCodice vigna: " + codVigna + "\nData raccolta uva: " + dataRaccoltaUva);
}
}

//CLASSE DATA
class Data{
int gg,mm,aa;

//COSTRUTTORI
public Data(int g, int m, int a){
gg=g;
mm=m;
aa=a;
}

//METODI
public int giorniMancanti(Data d){
return 100; //metodo provvisorio (implementare metodo corretto)
}
public String toString(){
return (gg + "\\" + mm + "\\" + aa);
}
}

//CLASSE BIANCO
class Bianco extends Vini{
Etichetta et;

//COSTRUTTORI
public Bianco(float peso,float consist,String loc,String cvigna,Data dataRaccUva,String cod,Data imbott,Data scadenza){
super(peso,consist,loc,cvigna,dataRaccUva);
et=new Etichetta(cod, imbott, scadenza);
totale++;
}

//METODI
public float getPrezzo(){
Data raccolta= informazioni.getDataRaccoltaUva(); //prendo la data di raccolta uva
Data scadenza=et.getScadenza(); //prendo la data di scadenza del prodotto
int m=raccolta.giorniMancanti(scadenza); //calcolo i giorni che intercorrono tra la raccolta e la scadenza
return 52*c+3*m;
}
public String toString(){
return ("\n\n" + super.toString() + et.toString() + "\nPrezzo del prodotto: " + getPrezzo() + " €");
}
}

//CLASSE ETICHETTA
class Etichetta{
String codBarre="";
Data dataImbott;
Data dataScad;

//COSTRUTTORI
public Etichetta(String cod,Data imbott, Data scad){
codBarre=cod;
dataImbott=imbott;
dataScad=scad;
}

//METODI
public Data getScadenza(){
return dataScad;
}
public String toString(){
return ("Codice a barre: " + codBarre + "\nData imbottigliamento: " + dataImbott + "\nData Scadenza: " + dataScad);
}
}

//CLASSE ROSSO
class Rosso extends Vini{
boolean colorato=false;
String descrizione="";
float conservante;
//COSTRUTTORI
public Rosso(String s, float conserv,float peso,float consist,String loc,String cvigna,Data raccUva){
super(peso,consist,loc,cvigna,raccUva);
descrizione=s;
conservante=conserv;
totale++;
}

//METODI
public boolean isColorato(){
return colorato;
}
public void colora(){
colorato=true;
}
public float getPrezzo(){
return (float)((Math.pow(c+peso,5))*conservante/0.3);
}
public String toString(){
return ("\n\n" + super.toString() + "\nPrezzo prodotto: " + getPrezzo() + " €");
}
}

//CLASSE SPUMANTE
class Spumante extends Bianco{

//COSTRUTTORI
float percGas;
public Spumante(float perGas,float peso,float consist,String loc,String cvigna,Data dataRaccUva,String cod,Data imbott,Data scadenza){
super(peso,consist,loc,cvigna,dataRaccUva,cod,imbott,scadenza);
percGas=perGas;
}
//METODI
public String toString(){
return (super.toString() + "\nPercentuale di gas: " + percGas);
}
}

//MAIN

public class AziendaAgricola{

public static void main (String args[]){
int num=30;
Prodotto[] p=new Prodotto[num];

//creazione prodotti
for (int i=0;i<p.length;i++)
{
int tipo=(int)(Math.random()*3+1);
switch (tipo)
{
case 1: //BIANCO
{

//creazione prodotto
float peso=(float)(Math.random()*20);
float consist=(float)(Math.random()*20);
String loc="";
int lungstring=(int)(Math.random()*10+1);
for (int k=0;k<lungstring;k++)
loc+=(char)(Math.random()*26+'a');
lungstring=(int)(Math.random()*10+1);
String cvigna="";
for (int k=0;k<lungstring;k++)
cvigna+=(char)(Math.random()*26+'a');
int g=(int)(Math.random()*30+1);
int m=(int)(Math.random()*12+1);
int a=(int)(Math.random()*10+2010);
Data dataRaccUva=new Data(g,m,a);
String cod="";
for (int k=0;k<10;k++)
cod+=(char)(Math.random()*10+'0');
g=(int)(Math.random()*30+1);
m=(int)(Math.random()*12+1);
a=(int)(Math.random()*10+2010);
Data imbot=new Data(g,m,a);
g=(int)(Math.random()*30+1);
m=(int)(Math.random()*12+1);
a=(int)(Math.random()*10+2010);
Data scad=new Data(g,m,a);
p[i]=new Bianco(peso,consist,loc,cvigna,dataRaccUva,cod,imbot,scad);
break;
}
case 2: //ROSSO
{
float peso=(float)(Math.random()*20);
float consist=(float)(Math.random()*20);
float conserv=(float)(Math.random()*20);
String loc="";
int lungstring=(int)(Math.random()*10+1);
for (int k=0;k<lungstring;k++)
loc+=(char)(Math.random()*26+'a');
lungstring=(int)(Math.random()*10+1);
String cvigna="";
for (int k=0;k<lungstring;k++)
cvigna+=(char)(Math.random()*26+'a');
lungstring=(int)(Math.random()*10+1);
String s="";
for (int k=0;k<lungstring;k++)
s+=(char)(Math.random()*26+'a');
int g=(int)(Math.random()*30+1);
int m=(int)(Math.random()*12+1);
int a=(int)(Math.random()*10+2010);
Data dataRaccUva=new Data(g,m,a);

//creazione vino rosso
p[i]=new Rosso(s,conserv,peso,consist,loc,cvigna,dataRaccUva);
break;
}
case 3: //OLIO
{

float peso=(float)(Math.random()*20);
float visc=(float)(Math.random()*20);
//creazione olio
p[i]=new Olio(peso,visc);
break;
}
default: //PRODOTTO SCONOSCIUTO
{
JOptionPane.showMessageDialog(null,"Tipologia prodotto sconosciuta!");
--i;
}
} //FINE SWITCH
}

//stampa info prodotti
for (int i=0;i<p.length;i++)
System.out.println(p[i]);

//calcola prodotto più pesante
int max=0;
for (int i=0;i<p.length;i++)
if ((p[i] instanceof Bianco) && (p[max].getPeso()<p[i].getPeso()))
max=i;
System.out.println("\n\nIl vino con il peso maggiore è nella posizione " + max);

//ordinamento vini in base al prezzo
Prodotto[] pOrdinato=new Prodotto [p.length];
pOrdinato=p;
Prodotto temp=pOrdinato[0];
for (int i=0; i<pOrdinato.length;i++)
for (int j=i+1; j<pOrdinato.length;j++) //scorre sottomatrice
if (pOrdinato[i].getPrezzo()<pOrdinato[j].getPrezzo())
{
temp = pOrdinato[i];
pOrdinato[i]=pOrdinato[j];
pOrdinato[j]=temp;
}
System.out.println("\n---------------\n---------------\n---------------\n");
for (int i=0;i<pOrdinato.length;i++)
System.out.println(pOrdinato[i]);
System.out.println("Numero prodotti: " + p.getTotale());
}
}


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 29-01-2009, 12:20:59
mi permetto di consigliarti qualche piccolo accorgimento per migliorare i programmi (soprattutto) dal punto della comprensione per le altre persone che guarderanno il codice (ed anche per te stesso), non prenderle come critiche ma come consigli amichevoli però:
1. classi totalmente differenti dal main conviene separarle "fisicamente" dal main, cioè scriverle direttamente in un'altro file .java così da avere il main (e metodi annessi) in un posto, ed il resto nell'altro (parlo della classe prodotti). Nel nostro esempio conviene avere il file prodotti.java che contiene tutte le classi progettate nel diagramma UML, ed il file (ad esempio) prova.java che contiene il main con annessi e connessi. Non è un obbligo ma è semplicemente un consiglio per mettere ordine che servirà a te e a chi legge il codice.
2. il toString è un metodo che adotteranno tutti, quindi in questo caso è meglio scriverlo abstract nella superclasse e poi fare l'overriding nelle sottoclassi così da fargli adempiere in pieno il suo compito: ritornare una stringa con tutte le informazioni dell'oggetto.
3. Per evitare di perdere tempo ad inventarsi nomi differenti per i parametri (col rischio di confondersi) è meglio usare la parola chiave this (http://java.sun.com/docs/books/tutorial/java/javaOO/thiskey.html) nel modo spiegato dal tutorial che ti ho linkato (che vedo tu usi invece nel toString quando invece non ce n'è bisogno).
4. Le variabili di istanza delle classi conviene metterle con attributo private in quanto ti servono solamente in quella classe. Per richiamarle si usano i metodi (pubblici ovviamente) getAttributo() per evitare di influenzare in qualche modo la variabile (un modo per non correre rischi in poche parole .wink).
5. I nomi dei metodi e della classi è convenzione scriverli al plurale e con la sintassi MetodoMio() e MiaClasse. Ma questa è solo una convenzione poi sei libero di scrivere nomi a tuo piacimento. Per le variabili stesso discorso ma, a meno di situazioni che lo richiedano, solitamente vanno al singolare (peso, scadenza etc). Le costanti invece vengono scritte sempre in MAIUSCOLO per distinguerle dalle variabili semplici (anche questa è una convenzione ma seguirle non fa male e rende solo il codice meno confusionario).
6. Nel main la stampa dei prodotti potevi farla direttamente nel for che comprendeva la switch, così avresti risparmiato righe di codice ed un ciclo iterativo. Questa si chiama ottimizzazione del codice, non necessaria con programmini semplici e piccoli come questo, ma in caso di programmi grossi la differenza si nota .wink .
7. Il totale dove sta? nelle singole classi? e perchè? visto che è un attributo comune a tutti, conviene metterlo come parametro della superclasse (così verrà ereditato da tutti). In codice significa:
Code:
abstract class Prodotti
{
     private static int totale=0;
     private float peso;
     final float C=3;
     public Prodotti(int peso)
     {
           this.peso=peso;
           totale++;
     }
     public static int getTotale()
     {
           return totale;
     }
     //altri metodi come getPeso() etc...
}
se nel main dichiari un array di prodotti senza la sintassi sopra e poi fai
Code:
Prodotti.getTotale()
ti dà ovviamente errore perchè totale non è una variabile della classe Prodotti (quindi non la trova).
Spero di non essere stato confusionario ma che sia tutto abbastanza chiaro! ^^
Saluti!
EDIT: Corretto grazie alla segnalazione di crasher.


Title: Re:Esercizi di laboratorio
Post by: hax on 29-01-2009, 13:23:08
Non le prendo affatto come critiche, anzi ti ringrazio dato che sono consigli di cui avevo bisogno. :-OK
Comunque ho apportato le modifiche alla classe prodotti ma il problema del getTotale rimane  :-)|
Code:
//CLASSE ABSTRACT PRODOTTI
abstract class Prodotti{
private static int totale=0;
private float peso; //peso prodotto
final float C=3; //costante per il calcolo del prezzo

//COSTRUTTORI
public Prodotti(float x){
this.peso=x;
totale++;
}

//METODI
public float getPeso(){
return this.peso;
}
public String toString(){
String oggetto="";
if (this instanceof Olio)
oggetto="Olio";
else
if (this instanceof Rosso)
oggetto="Rosso";
else
if (this instanceof Bianco)
oggetto="Bianco";
else
oggetto="prodotto sconosciuto";
return ("Prodotto: " + oggetto);
}
public abstract float getPrezzo();
public int getTotale()
{
return totale;
}
}
l'errore è questo:
Code:
cannot find symbol
symbol  : method getTotale()
location: class Prodotti[]
System.out.println("Numero prodotti: " + p.getTotale());
e viene risolto solo se metto:
Code:
p[i].getTotale()


Title: Re:Esercizi di laboratorio
Post by: Alex_47 on 29-01-2009, 14:45:18
Nel testo dell'esercizio riguardante i veicoli postato da frederik non ho capito come costruire il metodo GetG() e GetP() , che vengono richiesti per implementare il get Prezzo!

In poche parole che P  è la somma della pressione delle ruote del veicolo , vorrà dire che devo fare

Code:
public int getP()
{
        if(this instanceof bici)
        {
               return R.getPressione() *2;
        }

        if(this instanceof tricicli)
        {
               return R.getPressione() *3;
        }

        if(this instanceof quad)
        {
               return R.getPressione() *4;
        }

}

oppure devo implementare il metodo in un altro modo?



Title: Re:Esercizi di laboratorio
Post by: Crasher on 29-01-2009, 14:57:27
Io il metodo getTotale l'ho implementato in quest maniera:

classe Prodotti
Code:
public Prodotti(int _peso)
{
peso = _peso;
contatore++;
}

public static int getTotale()
{
return contatore;
}

MAIN
Code:
System.out.println(Prodotti.getTotale());

Questo dopo aver fatto il ciclo for x l'inizializzazione degli oggetti
Ditemi se è corretto :)

EDIT:

Fr3d3R!K
ho provato il tuo metodo p.getTotale(), ma non funziona... e, come dice hax, non potrebbe mai funzionare xchè p è un ARRAY di oggetti, non un oggetto :)


Title: Re:Esercizi di laboratorio
Post by: MisteroLupo on 29-01-2009, 15:57:35
Io il metodo getTotale l'ho implementato in quest maniera:
[...]
Ditemi se è corretto :)
Direi che va bene! :yoh


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 29-01-2009, 16:00:00
@Crasher: hai ragione errore di distrazione mio .timido la sintassi corretta è quella che hai scritto tu (a volte pure io sbaglio  .whistling ^^ )


Title: Re:Esercizi di laboratorio
Post by: hax on 29-01-2009, 16:12:44
Ok grazie dell'aiuto.  :-ciao


Title: Re:Esercizi di laboratorio
Post by: Mito on 29-01-2009, 19:51:56
ho mandato un'email al prof...e ha detto che questo è il primo anno che la prova è strutturata così quindi nessun altro esempio come quello che già abbiamo...

Il Prof. ha detto bene.

io ho visto l'esempio e mi è sembrato come la prova di laboratorio dell'anno scorso...mah...

No.

come può essere???ma la prova dell'anno scorso qual era??c'è da qualche parte?

...da quest'anno --> Esempio Prova Lab. (http://www.dmi.unict.it/~cincotti/prog1/file/prova2.pdf)

...anni passati --> in soldoni, era una Terza Parte (da fare al PC) con meno classi da implementare.

Ecco un esempio:

Un' azienda vende dispositivi Magnetici di mem., caratterizzati dal numero di testine, e dispositivi di mem. su Microchip, caratterizzati da num.di piedini. Ogni dispositivo possiede il riferimento all'anno di creazione, una capacità in bit(max 1/2 Kb), e contiene lo spazio di immagazzinamento dei bit(dipendente dalla capacità). Inoltre, tra i Microchip si distinguono le mem.Flash (caratterizzate dalla velocità di scrittura), e tra quest'ultime quelle UltraFlash, contraddistinte dal tipo di tecnologia (A,B, o C).

Si implementi una gerarchia ereditaria in Java con i seguenti metodi eventualmente polimorfi:
-getTipo:restituisce 1 carattere che identifica il tipo di disp.('M' x quelli Magnetici, 'C' x quelli MicroChip,'F' x quelli Flash,'U' x quelli UltraFlash);
   
-getTestine:restituisce il num. di testine del disp.;
-getCapacita:restituisce la capacita in bit del dispositivo;
-getCosto: restituisce il costo di ogni disp., calcolato mediante la formula:
   - (testine + c) %7      x quelli MAgnetici;
   - (Piedini + Capacita) % 7 + 7   x quelli Microchip;
   - ((velocita * c) % 7 +14   x quelli Flash e ultraFlash;

dove c è un coefficiente costante per tutti i disp. che vale 3,7.

Si generi una collezione di 21 disp. casuali e
-si visualizzi una stringa per ogni disp.(mediante toString()) costituita da una sequenza di N caratteri getTipo() terminata da un '\n', dove N è il costo del disp.;
-si trovi il disp. con il minor. numero di testine;
-si visualizzino  tutti i disp.(mediante il toString() ),ordinati in senso non decrescente in base al loro costo.


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 29-01-2009, 20:14:13
di questo me ne sono accorto anche io, quello che volevo dire e che fondamentalmente (o come dici tu in soldoni) la prova non ha avuto questo cambiamento così radicale...


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 29-01-2009, 20:20:06
bè ma nella prova di quest'anno il diagramma uml è già bell'e pronto  .smile


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 29-01-2009, 21:19:43
C'è un modo per utilizzare volontariamente un metodo della superclasse(anzichè quello della sottoclasse) di cui è stato fatto l'overriding??Non so se mi sono fatta capire  .smile


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 29-01-2009, 21:22:24
ad esempio?


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 29-01-2009, 21:31:38
Ad esempio se ho un oggetto di una sottoclasse e anzichè voler utilizzare il toString() della sottoclasse voglio utilizzare quello della superclasse..si può fare??


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 29-01-2009, 21:46:29
Magari mi spiego meglio se parlo più concretamente  .smile
Ho implementato le classi di quest'esercizio:

"Un club privato di elicotteristi organizza dei tour su Manhattan, caratterizzati dalla quota di navigazione, e sul fiume Hudson, caratterizzati dal numero di ponti incrociati. Ogni tour ha una data d’inizio ed una durata in ore. Inoltre, tra i tour sull’Hudson si distinguono quelli attorno alla statua della libertà (caratterizzati dal numero di giri), e tra quest’ultimi quelli per celebrare matrimoni, contraddistinti dal numero di ecclesiastici a bordo. 

Si implementi una gerarchia ereditaria in Java con i seguenti metodi eventualmente polimorfi:
•   getTipo;     restituisce un carattere che identifica il tipo di tour (‘M’ per quelli su Manhattan,  ‘H’ per quelli sull’Hudson, ‘L‘ per quelli sulla statua della libertà, ‘#’ per quelli matrimoniali);
•   getQuota;       restituisce la quota di navigazione;
•   getDurata;       restituisce la durata del volo;
•   getCosto;       restituisce il costo di ogni volo, calcolato mediante la formula:
o   (Quota +  c) % 8            per i tour su Manhattan, 
o   8 + (Ponti +  Durata) % 8      per i tour sull’Hudson, 
o   16 + (Giri  • c)  % 8         per i tour della statua della libertà, 
o   24 + (Durata^Ecclesiastici)  %  8  per i tour matrimoniali,
dove c  è un coefficiente costante per tutti i voli che vale 6,3.

Si generi una collezione di 25 tour casuali e
   si visualizzi una stringa per ogni tour (mediante il toString() ) costituita da una sequenza di N caratteri getTipo() terminata da un ‘\n’, dove N è il costo del tour;
   si trovi il tour che vola alla quota più bassa;
   si visualizzino tutti i voli (mediante il toString() ), ordinati in senso non-decrescente in base al loro costo."

Però non so come fare per il punto 1 delle tre consegne alla fine...se io con il metodo toString() visualizzo tutte le informazioni sul tour allo stesso tempo come faccio a  visualizzare con lo stesso metodo la sequenza di caratteri??
Perciò avevo pensato di risolvere il punto 1 con il toString() della superclasse e poi utilizzare quello nel main..non so bene come spiegare..questo è tutto il codice...poi al di là di questo mi dici com'è...se ci sono cose che non vanno..
Code:
public class Elicotteristi
{
public static void ordina (Tour[] a)
{
for(int i=0;i<a.length-1;i++)
{
int min=i;
for(int j=i+1;j<a.length;j++)
if(a[j].getPrezzo()<a[min].getPrezzo())
min=j;
scambia(a,min,i);
}
}
public static void scambia(Tour[] a,int b,int c)
{
Tour temp=a[b];
a[b]=a[c];
a[c]=temp;
}
public static void main (String[] args)
{
Tour[] t=new Tour[25];
for(int i=0;i<t.length;i++)
{
int x=(int)(Math.random()*4);
switch(x)
{
case 0:
{
t[i]=new Manhattan(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(10+Math.random()*30));
break;
}
case 1:
{
t[i]=new Hudson(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(Math.random()*4));
break;
}
case 2:
{
t[i]=new StatuaLibertà(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(Math.random()*4),(int)(1+Math.random()*3));
break;
}
case 3:
{
t[i]=new Matrimonio(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(Math.random()*4),(int)(1+Math.random()*3));
break;
}
}
}
//------------------------------------------------------------------------------------------------------------------------



//------------------------------------------------------------------------------------------------------------------------
int indice=-1;
int min=50;
for(int i=0;i<t.length;i++)
if(t[i] instanceof Manhattan)
if(((Manhattan)t[i]).getQuota()<min)
{
min=((Manhattan)t[i]).getQuota();
indice=i;
}
if(indice!=-1)
System.out.println("Il tour che vola a quota più bassa è quello di indice: "+indice+" e vola a "+((Manhattan)t[indice]).getQuota()+" metri.");
else
System.out.println("Non ci sono tour su Manhattan.");
//-------------------------------------------------------------------------------------------------------------------------
Tour[] tt=new Tour[t.length];
for(int i=0;i<tt.length;i++)
tt[i]=t[i];
ordina(tt);
for(int i=0;i<tt.length;i++)
System.out.println(tt[i]);
}
}
abstract class Tour
{
private Data DataInizio;
private int Durata;
protected static float c=6.3F;
public Tour(Data datainizio,int durata)
{
DataInizio=datainizio;
Durata=durata;
}
public Data getDataInizio()
{
return DataInizio;
}
public int getDurata()
{
return Durata;
}
abstract public char getTipo();
abstract public float getPrezzo();
public String toString()
{
String str="";
for(int i=0;i<(int)(getPrezzo());i++)
str+=getTipo();
str+="\n";
return str;
}
}
class Data
{
private int Giorno;
private int Mese;
private int Anno;
public Data(int giorno,int mese,int anno)
{
Giorno=giorno;
Mese=mese;
Anno=anno;
if(Mese==2&&(Giorno==30||Giorno==31))
Giorno=28;
if((Mese==11||Mese==4||Mese==6||Mese==9)&&(Giorno==30));
}
public int getGiorno()
{
return Giorno;
}
public int getMese()
{
return Mese;
}
public int getAnno()
{
return Anno;
}
public String toString()
{
return getGiorno()+"/"+getMese()+"/"+getAnno();
}
}
class Manhattan extends Tour
{
private int Quota;
public Manhattan(Data datainizio,int durata,int quota)
{
super(datainizio,durata);
Quota=quota;
}
public int getQuota()
{
return Quota;
}
public char getTipo()
{
return 'M';
}
public float getPrezzo()
{
return (getQuota()+c)%8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, vola alla quota di: "+getQuota()+" metri, costa: "+getPrezzo()+" euro.\n";
}
}
class Hudson extends Tour
{
private int PontiIncrociati;
public Hudson(Data datainizio,int durata,int pontiincrociati)
{
super(datainizio,durata);
PontiIncrociati=pontiincrociati;
}
public int getPontiIncrociati()
{
return PontiIncrociati;
}
public char getTipo()
{
return 'H';
}
public float getPrezzo()
{
return 8+(getPontiIncrociati()+getDurata())%(float)8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, passa da: "+getPontiIncrociati()+" ponti incrociati, costa: "+getPrezzo()+" euro.\n";
}
}
class StatuaLibertà extends Hudson
{
private int Giri;
public StatuaLibertà(Data datainizio,int durata,int pontiincrociati,int giri)
{
super(datainizio,durata,pontiincrociati);
Giri=giri;
}
public int getGiri()
{
return Giri;
}
public char getTipo()
{
return 'L';
}
public float getPrezzo()
{
return 16+(getGiri()*c)%8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, passa da: "+getPontiIncrociati()+" ponti incrociati, fa "+getGiri()+" giri, costa: "+getPrezzo()+" euro.\n";
}
}
class Matrimonio extends Hudson
{
private int Ecclesiastici;
public Matrimonio(Data datainizio,int durata,int pontiincrociati,int ecclesiastici)
{
super(datainizio,durata,pontiincrociati);
Ecclesiastici=ecclesiastici;
}
public int getEcclesiastici()
{
return Ecclesiastici;
}
public char getTipo()
{
return '#';
}
public float getPrezzo()
{
return 24+(float)(Math.pow(getDurata(),getEcclesiastici()))%8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, passa da: "+getPontiIncrociati()+" ponti incrociati, ha a bordo +"+getEcclesiastici()+" ecclesiastici, costa: "+getPrezzo()+" euro.\n";
}
}


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 29-01-2009, 21:47:31
se non è abstract certo che puoi. Se è abstract devi ridefinire per forza il metodo.
Ho visto ora l'altra risposta però potresti ridefinire (tramite overriding) semplicemente il toString() per adattarlo a quel caso, visto che comunque, se implementi il toString() abstract va ridefinito comunque. Non so se mi spiego.


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 29-01-2009, 21:59:45
mhm...no  .smile scusa non ho capito...come faccio a ridefinirlo in due modi diversi??


Title: Re:Esercizi di laboratorio
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 30-01-2009, 01:23:21
mhm...no  .smile scusa non ho capito...come faccio a ridefinirlo in due modi diversi??
Ok. Ho capito cosa intendi.
Ciò normalmente non è possibile.
Si può aggirare il problema creando un nuovo metodo con la signature diversa (cioè dove cambi almeno uno tra: nome, numero parametri, tipo di almeno uno dei parametri, ordine dei parametri, elenco dei parametri) all'interno della classe figlia, e fare in modo che il body di tale metodo contenga una chiamata a super.metodoComune (...), e poi "dall'esterno", invocare questo nuovo metodo .smile.


Title: Re:Esercizi di laboratorio
Post by: Fr3d3R!K on 30-01-2009, 11:12:26
Ciò normalmente non è possibile.
Si può aggirare il problema creando un nuovo metodo con la signature diversa (cioè dove cambi almeno uno tra: nome, numero parametri, tipo di almeno uno dei parametri, ordine dei parametri, elenco dei parametri) all'interno della classe figlia, e fare in modo che il body di tale metodo contenga una chiamata a super.metodoComune (...), e poi "dall'esterno", invocare questo nuovo metodo .smile.
quello che intendevo, scusa ma avevo da fare ieri sera per cui non ho potuto approfondire il discorso...
Saluti. .ciaociao


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 30-01-2009, 11:55:56
ecco infatti!!va bene allora è tutto chiaro!!grazie a entrambi!!


Title: Re:Esercizi di laboratorio
Post by: Mito on 30-01-2009, 13:45:31
ecco infatti!!va bene allora è tutto chiaro!!grazie a entrambi!!

Alla fine come hai risolto?

Code:
public String toString()
{
String str="";
for(int i=0;i<(int)(getPrezzo());i++)
str+=getTipo();
str+="\n";
return str;
}


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 30-01-2009, 13:47:45
creando un altro metodo...non c'è altro!


Title: Re:Esercizi di laboratorio
Post by: Mito on 30-01-2009, 13:51:17
creando un altro metodo...non c'è altro!

Puoi postare l'esercizio completo (svolto), giusto per completezza?  .wink

Grazie.


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 30-01-2009, 14:18:41
Eccolo...non considerate tanto la classe Data perchè l'ho fatta tanto così!ci vorrebbe molto più lavoro!
Code:
public class Elicotteristi
{
public static void ordina (Tour[] a)
{
for(int i=0;i<a.length-1;i++)
{
int min=i;
for(int j=i+1;j<a.length;j++)
if(a[j].getPrezzo()<a[min].getPrezzo())
min=j;
scambia(a,min,i);
}
}
public static void scambia(Tour[] a,int b,int c)
{
Tour temp=a[b];
a[b]=a[c];
a[c]=temp;
}
public static void main (String[] args)
{
Tour[] t=new Tour[25];
for(int i=0;i<t.length;i++)
{
int x=(int)(Math.random()*4);
switch(x)
{
case 0:
{
t[i]=new Manhattan(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(10+Math.random()*30));
break;
}
case 1:
{
t[i]=new Hudson(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(Math.random()*4));
break;
}
case 2:
{
t[i]=new StatuaLibertà(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(Math.random()*4),(int)(1+Math.random()*3));
break;
}
case 3:
{
t[i]=new Matrimonio(new Data((int)(1+Math.random()*31),(int)(1+Math.random()*12),(int)(2009+Math.random()*2)),
(int)(20+Math.random()*70),(int)(Math.random()*4),(int)(1+Math.random()*3));
break;
}
}
}
//------------------------------------------------------------------------------------------------------------------------
for(int i=0;i<t.length;i++)
System.out.println(t[i].altrotoString());
//------------------------------------------------------------------------------------------------------------------------
int indice=-1;
int min=50;
for(int i=0;i<t.length;i++)
if(t[i] instanceof Manhattan)
if(((Manhattan)t[i]).getQuota()<min)
{
min=((Manhattan)t[i]).getQuota();
indice=i;
}
if(indice!=-1)
System.out.println("Il tour che vola a quota più bassa è quello di indice: "+indice+" e vola a "+((Manhattan)t[indice]).getQuota()+" metri.");
else
System.out.println("Non ci sono tour su Manhattan.");
//-------------------------------------------------------------------------------------------------------------------------
Tour[] tt=new Tour[t.length];
for(int i=0;i<tt.length;i++)
tt[i]=t[i];
ordina(tt);
for(int i=0;i<tt.length;i++)
System.out.println(tt[i]);
}
}
abstract class Tour
{
private Data DataInizio;
private int Durata;
protected static float c=6.3F;
public Tour(Data datainizio,int durata)
{
DataInizio=datainizio;
Durata=durata;
}
public Data getDataInizio()
{
return DataInizio;
}
public int getDurata()
{
return Durata;
}
abstract public char getTipo();
abstract public float getPrezzo();
abstract public String toString();
public String altrotoString()
{
String str="";
for(int i=0;i<(int)(getPrezzo());i++)
str+=getTipo();
str+="\n";
return str;
}
}
class Data
{
private int Giorno;
private int Mese;
private int Anno;
public Data(int giorno,int mese,int anno)
{
Giorno=giorno;
Mese=mese;
Anno=anno;
if(Mese==2&&(Giorno==30||Giorno==31))
Giorno=28;
if((Mese==11||Mese==4||Mese==6||Mese==9)&&(Giorno==30));
}
public int getGiorno()
{
return Giorno;
}
public int getMese()
{
return Mese;
}
public int getAnno()
{
return Anno;
}
public String toString()
{
return getGiorno()+"/"+getMese()+"/"+getAnno();
}
}
class Manhattan extends Tour
{
private int Quota;
public Manhattan(Data datainizio,int durata,int quota)
{
super(datainizio,durata);
Quota=quota;
}
public int getQuota()
{
return Quota;
}
public char getTipo()
{
return 'M';
}
public float getPrezzo()
{
return (getQuota()+c)%8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, vola alla quota di: "+getQuota()+" metri, costa: "+getPrezzo()+" euro.\n";
}
}
class Hudson extends Tour
{
private int PontiIncrociati;
public Hudson(Data datainizio,int durata,int pontiincrociati)
{
super(datainizio,durata);
PontiIncrociati=pontiincrociati;
}
public int getPontiIncrociati()
{
return PontiIncrociati;
}
public char getTipo()
{
return 'H';
}
public float getPrezzo()
{
return 8+(getPontiIncrociati()+getDurata())%(float)8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, passa da: "+getPontiIncrociati()+" ponti incrociati, costa: "+getPrezzo()+" euro.\n";
}
}
class StatuaLibertà extends Hudson
{
private int Giri;
public StatuaLibertà(Data datainizio,int durata,int pontiincrociati,int giri)
{
super(datainizio,durata,pontiincrociati);
Giri=giri;
}
public int getGiri()
{
return Giri;
}
public char getTipo()
{
return 'L';
}
public float getPrezzo()
{
return 16+(getGiri()*c)%8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, passa da: "+getPontiIncrociati()+" ponti incrociati, fa "+getGiri()+" giri, costa: "+getPrezzo()+" euro.\n";
}
}
class Matrimonio extends Hudson
{
private int Ecclesiastici;
public Matrimonio(Data datainizio,int durata,int pontiincrociati,int ecclesiastici)
{
super(datainizio,durata,pontiincrociati);
Ecclesiastici=ecclesiastici;
}
public int getEcclesiastici()
{
return Ecclesiastici;
}
public char getTipo()
{
return '#';
}
public float getPrezzo()
{
return 24+(float)(Math.pow(getDurata(),getEcclesiastici()))%8;
}
public String toString()
{
return "Il tour è del tipo: "+getTipo()+", ha data di inzio: "+getDataInizio()+", durata: "+getDurata()+
"minuti, passa da: "+getPontiIncrociati()+" ponti incrociati, ha a bordo +"+getEcclesiastici()+" ecclesiastici, costa: "+getPrezzo()+" euro.\n";
}
}


Title: Re:Esercizi di laboratorio
Post by: MisteroLupo on 30-01-2009, 14:36:23
...non considerate tanto la classe Data perchè l'ho fatta tanto così!ci vorrebbe molto più lavoro!
Cos'altro aggiungeresti alla classe data? .penso


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 30-01-2009, 15:06:01
Bè l'ho fatta superficiale...ci sono diversi problemi...tipo gli anni bisestili...oppure ad esempio in altri esercizi bisognerebbe calcolare la distanza tra una data e l'altra in giorni..e non saprei come fare..


Title: Re:Esercizi di laboratorio
Post by: Alex_47 on 30-01-2009, 15:08:54
Vyvniz...
Ho creato un topic apposito  per questo problema..

http://forum.sdai.unict.it/index.php?topic=1151.0 (http://forum.sdai.unict.it/index.php?topic=1151.0)

Invece vorrei capire come dobbiamo usare le percentuali quando ci dice di aggiungere una certa percentuale a una variabile


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 30-01-2009, 15:11:28
perchè Vyvniz?mi anagrammi il nome? :[Emoticon] Asd: :[Emoticon] Asd: :[Emoticon] Asd: :[Emoticon] Asd:
cmq bho non lo so...


Title: Re:Esercizi di laboratorio
Post by: MisteroLupo on 30-01-2009, 15:12:54
Bè l'ho fatta superficiale...ci sono diversi problemi...tipo gli anni bisestili...oppure ad esempio in altri esercizi bisognerebbe calcolare la distanza tra una data e l'altra in giorni..e non saprei come fare..
Vyznvi pensi che si debba implementare pure con gli anni bisestili nel compito? :-)|


Title: Re:Esercizi di laboratorio
Post by: Alex_47 on 30-01-2009, 16:00:46
perchè Vyvniz?mi anagrammi il nome? :[Emoticon] Asd: :[Emoticon] Asd: :[Emoticon] Asd: :[Emoticon] Asd:
cmq bho non lo so...

Scusami scrivevo di fretta XD

Comunque spero che questo casino della data non ci sia nel laboratorio di lunedi!

per quanto riguarda il Totale che si è spiegato prima , per evocarlo nel main dobbiamo scrivere..

Code:

NomeClasse.getTotale()


metto il nome della classe perchè Totale è static


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 30-01-2009, 16:35:34
per quanto riguarda il Totale che si è spiegato prima , per evocarlo nel main dobbiamo scrivere..

Code:

NomeClasse.getTotale()


metto il nome della classe perchè Totale è static

si è giusto!
Vyznvi pensi che si debba implementare pure con gli anni bisestili nel compito? :-)|
wow è nata la caccia all'anagramma migliore? :[Emoticon] Asd: :[Emoticon] Asd: cmq no non credo proprio  .smile

posto il codice anche di quest'esercizio che ho appena finito non si sa mai può servire..

Un’azienda vende dispositivi Magnetici di memoria, caratterizzati dal numero di testine, e dispositivi di memoria su Microchip, caratterizzati dal numero di piedini. Ogni dispositivo possiede il riferimento all’anno di creazione, una capacità in bit (max ½Kb), e contiene lo spazio di immagazzinamento dei bit (dipendente dalla capacità). Inoltre, tra i Microchip si distinguono le memorie Flash (caratterizzate dalla velocità di scrittura), e tra quest’ultime quelle UltraFlash, contraddistinte dal tipo di tecnologia (A,B,o C). 

Si implementi una gerarchia ereditaria in Java con i seguenti metodi eventualmente polimorfi:
•   getTipo;    restituisce un carattere che identifica il tipo di dispositivo (‘M’ per quelli Magnetici,  ‘C’ per quelli Microchip, ‘F‘ per quelli Flash, ‘U’ per quelli UltraFlash);
•   getTestine;       restituisce il numero di testine del dispositivo;
•   getCapacità;    restituisce la capacità in bit del dispositivo;
•   getCosto;       restituisce il costo di ogni dispositivo, calcolato mediante la formula:
o   (Testine +  c) % 7            per quelli Magnetici, 
o   (Piedini +  Capacità) % 7 +7      per quelli a Microchip, 
o   (Velocità  • c)  % 7 + 14         per quelli Flash e UltraFlash, 
dove c  è un coefficiente costante per tutti i dispositivi che vale 3,7.

Si generi una collezione di 21 dispositivi casuali e
   si visualizzi una stringa per ogni dispositivo (mediante il toString() ) costituita da una sequenza di N caratteri getTipo() terminata da un ‘\n’, dove N è il costo del dispositivo;
   si trovi il dispositivo con il minor numero di testine;
   si visualizzino tutti i dispositivi (mediante il toString() ), ordinati in senso non-decrescente in base al loro costo.

Code:
public class AziendaDispositivi
{
public static void ordina (DispositiviMemoria[] a)
{
for(int i=0;i<a.length-1;i++)
{
int min=i;
for(int j=i+1;j<a.length;j++)
if(a[j].getCosto()<a[min].getCosto())
min=j;
scambia(a,min,i);
}
}
public static void scambia(DispositiviMemoria[] a,int b,int c)
{
DispositiviMemoria temp=a[b];
a[b]=a[c];
a[c]=temp;
}
public static void main (String[] args)
{
DispositiviMemoria[] d=new DispositiviMemoria[21];
for(int i=0;i<d.length;i++)
{
int x=(int)(Math.random()*4);
switch(x)
{
case 0:
{
d[i]=new Magnetico((int)(2007+Math.random()*3),(int)(1+Math.random()*512),(int)(Math.random()*4));
break;
}
case 1:
{
d[i]=new Microchip((int)(2007+Math.random()*3),(int)(1+Math.random()*512),(int)(10+Math.random()*20));
break;
}
case 2:
{
d[i]=new Flash((int)(2007+Math.random()*3),(int)(1+Math.random()*512),(int)(10+Math.random()*20),(float)(4+Math.random()*48));
break;
}
case 3:
{
d[i]=new UltraFlash((int)(2007+Math.random()*3),(int)(1+Math.random()*512),(int)(10+Math.random()*20),(float)(4+Math.random()*48),(char)('A'+Math.random()*3));
break;
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------------
for(int i=0;i<d.length;i++)
System.out.println(d[i].altrotoString());
//-----------------------------------------------------------------------------------------------------------------------------------------
int indice=-1;
int min=4;
for(int i=0;i<d.length-1;i++)
if(d[i] instanceof Magnetico)
if(((Magnetico)d[i]).getTestine()<min)
{
min=((Magnetico)d[i]).getTestine();
indice=i;
}
if(indice!=-1)
System.out.println("Il dispositivo magnetico con minor numero di testine è quello di indice"+indice+
" e ha numero di testine: "+((Magnetico)d[indice]).getTestine()+".");
else
System.out.println("Non ci sono dispositivi magnetici");
//------------------------------------------------------------------------------------------------------------------------------------------
DispositiviMemoria[] dd=new DispositiviMemoria[d.length];
for(int i=0;i<dd.length;i++)
dd[i]=d[i];
ordina(dd);
for(int i=0;i<dd.length;i++)
System.out.println(dd[i]);

}
}
abstract class DispositiviMemoria
{
protected static float c=3.7F;
private int AnnoCreazione;
private int Capacita;
private int[] ImmagazinamentoBit;
public DispositiviMemoria(int annocreazione,int capacita)
{
AnnoCreazione=annocreazione;
Capacita=capacita;
ImmagazinamentoBit=new int[Capacita];
}
public int getAnnoCreazione()
{
return AnnoCreazione;
}
public int getCapacita()
{
return Capacita;
}
public String altrotoString()
{
String str="";
for(int i=0;i<(int)(getCosto());i++)
str+=getTipo();
str+="\n";
return str;
}
public abstract char getTipo();
public abstract float getCosto();
public abstract String toString();
}
class Magnetico extends DispositiviMemoria
{
private int Testine;
public Magnetico(int annocreazione,int capacita,int testine)
{
super(annocreazione,capacita);
Testine=testine;
}
public int getTestine()
{
return Testine;
}
public char getTipo()
{
return 'M';
}
public float getCosto()
{
return (getTestine()+c)%(float)7;
}
public String toString()
{
return "Il dispositivo di memoria è di tipo: "+getTipo()+", anno creazione: "+getAnnoCreazione()+
", capacita: "+getCapacita()+"bit, "+getTestine()+" testine, costo: "+getCosto()+".\n";
}
}
class Microchip extends DispositiviMemoria
{
private int Piedini;
public Microchip(int annocreazione,int capacita,int piedini)
{
super(annocreazione,capacita);
Piedini=piedini;
}
public int getPiedini()
{
return Piedini;
}
public char getTipo()
{
return 'C';
}
public float getCosto()
{
return (getPiedini()+getCapacita())%(float)7+7;
}
public String toString()
{
return "Il dispositivo di memoria è di tipo: "+getTipo()+", anno creazione: "+getAnnoCreazione()+
", capacita: "+getCapacita()+"bit, "+getPiedini()+" piedini, costo: "+getCosto()+".\n";
}
}
class Flash extends Microchip
{
private float VelocitaScrittura;
public Flash(int annocreazione,int capacita,int piedini,float velocitascrittura)
{
super(annocreazione,capacita,piedini);
VelocitaScrittura=velocitascrittura;
}
public float getVelocitaScrittura()
{
return VelocitaScrittura;
}
public char getTipo()
{
return 'F';
}
public float getCosto()
{
return (getVelocitaScrittura()*c)%7+14;
}
public String toString()
{
return "Il dispositivo di memoria è di tipo: "+getTipo()+", anno creazione: "+getAnnoCreazione()+
", capacita: "+getCapacita()+"bit, "+getPiedini()+" piedini, velocita di scrittura: "+getVelocitaScrittura()+", costo: "+getCosto()+".\n";
}
}
class UltraFlash extends Flash
{
private char TipoTecnologia;
public UltraFlash(int annocreazione,int capacita,int piedini,float velocitascrittura,char tipotecnologia)
{
super(annocreazione,capacita,piedini,velocitascrittura);
TipoTecnologia=tipotecnologia;
}
public char getTipoTecnologia()
{
return TipoTecnologia;
}
public char getTipo()
{
return 'U';
}
public String toString()
{
return "Il dispositivo di memoria è di tipo: "+getTipo()+", anno creazione: "+getAnnoCreazione()+
", capacita: "+getCapacita()+"bit, "+getPiedini()+" piedini, velocita di scrittura: "+getVelocitaScrittura()+
", tipo di tecnologia: "+getTipoTecnologia()+", costo: "+getCosto()+".\n";
}
}


Title: Re:Esercizi di laboratorio
Post by: MisteroLupo on 30-01-2009, 17:08:47
wow è nata la caccia all'anagramma migliore? :[Emoticon] Asd: :[Emoticon] Asd:
|-O
cmq no non credo proprio  .smile
Ho avuto un attimo di panico :-K


Title: Re:Esercizi di laboratorio
Post by: Mito on 30-01-2009, 17:13:49
Quote from: Vivynz
Però non so come fare per il punto 1 delle tre consegne alla fine...se io con il metodo toString() visualizzo tutte le informazioni sul tour allo stesso tempo come faccio a  visualizzare con lo stesso metodo la sequenza di caratteri??
Perciò avevo pensato di risolvere il punto 1 con il toString() della superclasse e poi utilizzare quello nel main..non so bene come spiegare..questo è tutto il codice...poi al di là di questo mi dici com'è...se ci sono cose che non vanno..

creando un altro metodo...non c'è altro!

Invece di creare un altrotoString() nella classe principale abstract, potresti fare una concatenazione di stringhe nel toString() delle sottoclassi, ove serve (ritornando per es. --> return str1+str2).

Direi che in questo modo è anche più logico e corretto.  :-OK

PS: ringrazio un amico per il consiglio...


Title: Re:Esercizi di laboratorio
Post by: Acicatena86 on 30-01-2009, 17:55:48
Quote from: Vivynz
Però non so come fare per il punto 1 delle tre consegne alla fine...se io con il metodo toString() visualizzo tutte le informazioni sul tour allo stesso tempo come faccio a  visualizzare con lo stesso metodo la sequenza di caratteri??
Perciò avevo pensato di risolvere il punto 1 con il toString() della superclasse e poi utilizzare quello nel main..non so bene come spiegare..questo è tutto il codice...poi al di là di questo mi dici com'è...se ci sono cose che non vanno..

creando un altro metodo...non c'è altro!

Invece di creare un altrotoString() nella classe principale abstract, potresti fare una concatenazione di stringhe nel toString() delle sottoclassi, ove serve (ritornando per es. --> return str1+str2).

Direi che in questo modo è anche più logico e corretto.  :-OK

Bravo bravo prenditi il merito .risatona


Title: Re:Esercizi di laboratorio
Post by: Mito on 30-01-2009, 18:12:34
Bravo bravo prenditi il merito .risatona

Ringrazio il mio amico Acicatena86 che mi ha consigliato questa soluzione. Il merito è suo. Un grande! .wink

 .risatona


Title: Re:Esercizi di laboratorio
Post by: Vivynz on 31-01-2009, 09:11:24
grazie per il consiglio  .smile quindi nello stesso toString() comparirebbero sia le informazioni e sia la sequenza di caratteri giusto?