Pages: 1 [2] 3 4   Go Down
Print
Author Topic: Esercizi di laboratorio  (Read 12419 times)
0 Members e 2 Utenti non registrati stanno visualizzando questa discussione.
Vivynz
Forumista Eroico
*****
Offline Offline

Gender: Female
Posts: 2.033


File reality.sys corrupted, Reboot Universe? Y/N


« Reply #15 on: 28-01-2009, 12:11:07 »

c'è da rimanerci male dalla semplicità  [Emoticon] Asd mi aspettavo chissa cosa!!meglio così 
Logged

L'odrine delle lttere dnetro una praorla non è ipmortatne, la sloa cosa ipmortatne è che la pmria e l'utlima ltteera sinao nel potso giutso. Il rseto può essree in un dsiodrine più totlae e voi ptoerte smerpe lggeree sneza porblmea.
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #16 on: 28-01-2009, 12:23:10 »

c'è da rimanerci male dalla semplicità  [Emoticon] Asd mi aspettavo chissa cosa!!meglio così 
comunque infatti meglio così
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...
Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
hax
Matricola
*
Offline Offline

Posts: 64


« Reply #17 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()...
Logged
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #18 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 ) 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.
« Last Edit: 28-01-2009, 13:25:14 by Fr3d3R!K » Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
Vivynz
Forumista Eroico
*****
Offline Offline

Gender: Female
Posts: 2.033


File reality.sys corrupted, Reboot Universe? Y/N


« Reply #19 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?
Logged

L'odrine delle lttere dnetro una praorla non è ipmortatne, la sloa cosa ipmortatne è che la pmria e l'utlima ltteera sinao nel potso giutso. Il rseto può essree in un dsiodrine più totlae e voi ptoerte smerpe lggeree sneza porblmea.
hax
Matricola
*
Offline Offline

Posts: 64


« Reply #20 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 )
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  testate
Logged
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #21 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...
Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
hax
Matricola
*
Offline Offline

Posts: 64


« Reply #22 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());
}
}
Logged
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #23 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 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 ).
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 .
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.
« Last Edit: 29-01-2009, 16:06:01 by Fr3d3R!K » Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
hax
Matricola
*
Offline Offline

Posts: 64


« Reply #24 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  testate
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()
Logged
Alex_47
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 409


The spiral's King


« Reply #25 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?

Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #26 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 Smiley

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 Smiley
« Last Edit: 29-01-2009, 15:55:18 by Crasher » Logged

Diventa ciò che sei nato per essere
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #27 on: 29-01-2009, 15:57:35 »

Io il metodo getTotale l'ho implementato in quest maniera:
[...]
Ditemi se è corretto Smiley
Direi che va bene! yoh
Logged
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #28 on: 29-01-2009, 16:00:00 »

@Crasher: hai ragione errore di distrazione mio la sintassi corretta è quella che hai scritto tu (a volte pure io sbaglio  ^^ )
Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
hax
Matricola
*
Offline Offline

Posts: 64


« Reply #29 on: 29-01-2009, 16:12:44 »

Ok grazie dell'aiuto.  ciao
Logged
Pages: 1 [2] 3 4   Go Up
Print
Jump to: