|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
[Java] convertitore che non converte
premetto, non conosco java.
per forza di cose però mi vedo costretto a scrivere un programma. ![]() ecco quello che sono riuscito a mettere insieme fino ad ora. il problema principale è che non ho idea di come gestire la parte relativa alla conversione. se qualcuno potesse aiutarmi a completarlo gliene sarei davvero grato. sottolineo che sono alla ricerca della massima semplicità, niente di troppo "avanzato". |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2000
Città: Parma
Messaggi: 2090
|
Un up per un amico che aiuterei volentieri se potessi
![]()
__________________
] I've had enough, sick and tired: bring the sun or I'm gone. [ |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2004
Città: Fidenza
Messaggi: 7252
|
up per due compaesani in mezzo a tutti questi utenti!!!
![]() ![]()
__________________
||Ryzen 1700||Asus Rog Strix X370-F Gaming||Corsair Vengeance LPX 3200/16Gb||My VGA||SilverStone SST-ST85F-PT||Samsung C34F791 34"||G29+TH8A||Lego™ Fans Club||Tu che ne sai di pc||PassioneF1||Diablo3|| Mi Note 10||Steam||Dai del gaaas|| |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Puoi creare una classe tipo:
Codice:
public class ConvertitoreUnità { private final double FATTORE_DI_CONVERSIONE; public ConvertitoreUnità(double fattoreDiConversione) { FATTORE_DI_CONVERSIONE = fattoreDiConversione; } public double converti(double valore) { return valore * FATTORE_DI_CONVERSIONE; } public double inverti(double valore) { return valore / FATTORE_DI_CONVERSIONE; } } Convertitore c = mappaConvertitore.get(startC.getSelectedValue()); double valoreIntermedio = c.inverit(i); Poi prendi il convertitore associato al valore corrente della seconda JComboBox: Convertitore c = mappaConvertitore.get(endC.getSelectedValue()); e applichi la conversione da Pascal a quello che deve essere: double valoreConvertito = c.converti(valoreIntermedio); Probabilmente è meglio se usi dei BigDecimal, così eviti valori strambi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
scusa la mia ingoranza ma...
1 - cosa intendi per mappa? 2 - la classe dove la devo inserire? in una altro file, nello stesso file (ma dove!?) 3 - in che senso creare tre convertitori? ovviamente grazie per la risposta. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Per creare tre convertitori intendo:
Codice:
ConvertitoreUnità pascalPascal = new ConvertitoreUnità(1); ConvertitoreUnità pascalBar = new ConvertitoreUnità(0.0001); ConvertitoreUnità pascalMMHG = new ConvertitoreUnità(0.0075); Codice:
Map<String, ConvertitoreUnità> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnità>(); Nella mappa metti i tre riferimenti ai converititori di pressione suddetti. Per la chiave puoi usare gli stessi valori che userai per le caselle combinate (JComboBox della pressione). Ad esempio: Codice:
mappaConvertitoriPressione.put("Pascal (Pa)", pascalPascal); mappaConvertitoriPressione.put("Bar", pascalBar); mappaConvertitoriPressione.put("Millimetri di mercurio (mmHg)", pascalMMHG); Nel metodo actionPerformed, nel blocco if che corrisponde alla richiesta di conversione della pressione (if(source == convert)) devi: 1. determinare se è richiesta una conversione della pressione. Puoi farlo guardando se il modello delle caselle combinate è quello della pressione 2. Ottenere il convertitore corrispondente al valore immesso nella prima casella combinata: Codice:
ConvertitoreUnità conv = mappaConvertitoriUnità.get((String)startc.getSelectedItem()); Codice:
String textValue = valuet.getText(); double value = Double.parseDouble(textValue); value = conv.inverti(value); Codice:
conv = mappaConvertitoriUnità.get((String)endc.getSelectedItem()); Codice:
value = conv.converti(value); ![]() La classe ConvertitoreUnità la scrivi un file sorgente a sè stante, nella stessa cartella di "convertitore.java".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! Ultima modifica di PGI-Bis : 11-02-2007 alle 18:21. Motivo: Un paio di correzioni... |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
ci lavoro un po' e vediamo cosa viene fuori.
grazie ancora per la disponibilità. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
Quote:
nel senso che non so come fare la dichiarazione. abbi pazienza... ![]() Ultima modifica di ZuMBi : 11-02-2007 alle 19:04. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Nessun problema.
"campo" sta per variabile immediatamente dichiarata nel corpo della classe. Il corpo di una classe è quella parte del file sorgente che inizia subito dopo la prima parentesi graffa e termina subito prima della corrispondente parentesi graffia di chiusura. Ad esempio: Codice:
public class convertitore {//qui inizia il corpo //qui è sempre corpo della classe public convertitore() {//qui inizia il corpo del costruttore /*qui finisce il corpo del costruttore*/} //qui siamo ancora nel corpo della classe /*qui finisce il corpo della classe*/} Codice:
public class convertitore { private int campo = 10; public convertitore() { int variabileLocale = 25; } } L'immediatezza del contenimento di una dichiarazione di variabile rispetto al corpo della classe in cui è dichiarata è ciò che distingue un campo da una variabile locale. Così quando dico "dichiara questa mappa come campo privato della classe convertitore" (più propriamente avrei dovuto dire come campo privato delle istanze della classe convertitore) intendo scrivi la dichiarazione di variabile: Codice:
private Map<String, ConvertitoreUnità> mappaConvertitoriUnità = eccetera
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
non riesco bene ad afferrare la funzione della nuova classe ConvertitoreUnita.
a questa classe viene delegato il compito di svolgere la conversione? però non capisco che cosa devo metterci dentro. purtroppo mi manca la logica stessa del java... ![]() Ultima modifica di ZuMBi : 12-02-2007 alle 21:55. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
A scanso di equivoci, non hai un problema con il linguaggio. Nè hai un problema con la prospettiva orientata agli oggetti. Hai un problema... con me
![]() Non voglio trascinarti in un dibattito per cui la faccio breve. Ogni programma orientato agli oggetti è la traduzione della soluzione "umana" di un problema. La ragione per cui ConvertitoreUnità ti pare un alieno nel sistema è che la sua necessità sorge perchè io ho risolto il problema della conversione in un certo modo e la rappresentazione di questa mia soluzione richiede, appunto, che esista questo tipo di oggetti. Essendo la mia soluzione, e non la tua, e non avendo discusso di come ho risolto il problema, mi pare assolutamente normale che ConvertitoreUnità ti sembri utile quanto una terza natica (che poeta, eh!? ![]() ConvertitoreUnità fa esattamente quello che hai notato: converte un valore da un'unità di misura ad un'altra e viceversa. L'idea è che se ho tre unità di misura e ne scelgo una (pascal) come unità che tutti quanti i convertitori conoscono (cioè tutti sanno convertire da X a Pascal e da Pascal a X) allora anzichè avere bisogno di NxN convertitori che trasformano un valore da X a Y mi bastano N convertitori da X a Pascal. La conversione tra due unità di misura X e Y viene fatta applicando il convertitore da X a Pascal e poi applicando il convertitore da Pascal a X. Se ogni converitore è in grado di cambiare l'unità di misura da X a Pascal e da Pascal a X (inverti e converti nella classe che ho proposto) e supponendo che per ogni ConvertitoreUnità: 1. "converti(valore)" trasformi un valore da Pascal alla specifica unità di misura del concreto ConverititoreUnità (Pascal, Bar, MMHg) 2. "inverti(valore)" trasformi un valore espresso nella specifica unità di misura del concreto ConvertitoreUnità (Pascal, Bar, MMHg) in Pascal allora il problema converti un valore di pressione da un'unità di misura X ad un'unità di misura Y si risolve in: 1. prendo il convertitore che sa come trasformare i Pascal in X e viceversa 2. gli chiedo di convertire il valore espresso in X in Pascal (inverti) 3. prendo il convertitore che sa come trasformare i Pascal in Y e viceversa 4. gli chiedo di convertire il valore espresso in Pascal in Y L'altro pezzo del problema è la classe che tu hai chiamato convertitore e che io vedo come l'oggetto che si occupa di raccogliere i dati ed eseguire la conversione. E' lui che la esegue: i vari ConvertitoreUnità hanno una capacità astratta di convertire ma concretamente non cambiano un bel niente. E' "convertitore" che passa da un valore ad un altro usando uno dei vari ConvertitoreUnità. E questo è quello che fa. "convertitore" piglia un valore numerico V e due unità di misura X e Y. Deve trasformare il valore dalla prima (X) alla seconda (Y) unità di misura. Per farlo: 1. prende il convertitore corrispondente all'unità di misura X 2. gli passa il valore V chiedendogli di convertirlo in Pascal e ottenendo il valore VPa 3. prende il convertitore corrispondente all'unità di misura Y 4. gli passa il valore VPa chiedendogli di convertirlo in Y ottenendo Vy 5. presenta all'utente Vy Il problema è, ribadisco, di condivisione della rappresentazione del problema risolto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
a cosa possono essere dovuti questi errori?
Codice:
G:\Documenti\programma esame borromei\convertitore.java:44: ';' expected private mappa Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita> (); ^ G:\Documenti\programma esame borromei\convertitore.java:44: <identifier> expected private mappa Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita> (); ^ G:\Documenti\programma esame borromei\convertitore.java:44: '(' expected private mappa Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita> (); ^ G:\Documenti\programma esame borromei\convertitore.java:44: <identifier> expected private mappa Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita> (); |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
tra private e Map<String, ... c'è una parola di troppo. Non:
private mappa Map<String, eccetera ma private Map<String, eccetera
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Mar 2000
Città: Parma
Messaggi: 2090
|
[OT]
Perdonatemi.. Quote:
![]() Ciao Ariz ![]() [/ot]
__________________
] I've had enough, sick and tired: bring the sun or I'm gone. [ |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
permane questo...
Codice:
G:\Documenti\programma esame borromei\convertitore.java:44: <identifier> expected private Map<String, ConvertitoreUnita> Codice:
private Map<String, ConvertitoreUnita> { mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita>(); } |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Le parentesi graffe non ci vanno.
private Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita>();
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
se tolgo le parentesi persistono questi errori:
Codice:
G:\Documenti\programma esame borromei\convertitore.java:44: cannot find symbol symbol : class Map location: class convertitore private Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita>(); ^ G:\Documenti\programma esame borromei\convertitore.java:44: cannot find symbol symbol : class HashMap location: class convertitore private Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita>(); quando dici di creare e associare i convertitori nella mappa intendi fare questo? Codice:
private Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita>(); { ConvertitoreUnita pascalPascal = new ConvertitoreUnita(1); ConvertitoreUnita pascalBar = new ConvertitoreUnita(0.0001); ConvertitoreUnita pascalMMHG = new ConvertitoreUnita(0.0075); } |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
All'inizio del file sorgente, dopo la dichiarazione di package (se c'è, nel nostro caso non c'è) scrivi, in una linea a sè:
import java.util.*; Questa dichiarazione farà sì che il compilatore, che ora ti dice che non riesce a capire cosa significhi "Map" riesca a risolvere quel nome riferendolo a java.util.Map. Nell'ultima porzione di codice che hai incollato crei i tre convertitori. Manca l'associazione tra ognugno di quei converitori ed una chiave (una String) di identificazione nella mappa. Codice:
private Map<String, ConvertitoreUnita> mappaConvertitoriPressione = new HashMap<String, ConvertitoreUnita>(); { ConvertitoreUnita pascalPascal = new ConvertitoreUnita(1); ConvertitoreUnita pascalBar = new ConvertitoreUnita(0.0001); ConvertitoreUnita pascalMMHG = new ConvertitoreUnita(0.0075); mappaConvertitoriPressione.put("Pascal (Pa)", pascalPascal); mappaConvertitoriPressione.put("Bar (ba)", pascalBar); mappaConvertitoriPressione.put("Millimetri di mercurio (mmHg)", pascalMMHG); }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2003
Città: Fidenza (PR)
Messaggi: 367
|
come non detto, avevo messo l'associazione dove non andava fatto.
adesso funziona tutto alla grande. non so come ringraziarti. ovviamente però ho alcune altre domandine da farti, non volermene ![]() in pratica quando vado ad inserire un valore che non sia numerico appare il messaggio d'errore. il messaggio però rimane anche quando, successivamente, viene inserito un valore corretto; hai un'idea di come potrei fare per farlo scomparire? |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Devi affinare il campo di testo che usi per inserire il valore numerico in modo tale da impedire la ricezione di valori non trasformabili in numeri.
Puoi usare un JFormattedTextField. Dove ora dichiari: valuet = new JTextField(); cambi in: valuet = new JTextField(new Float(0)); JFormattedTextField opera una convalida un po' primitiva dal punto di vista dell'interazione ma dovrebbe risolvere il problema "voglio che valuet.getText() restituisca una stringa che sia sempre trasformabile in float".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:12.