Trasformazione in lettere di un importo dato in cifre.
Si costruisce un programma che, in una finestra, mostra:
  • una casella di testo in cui introdurre un numero in cifre,
  • un pulsante,
  • una casella di testo in cui presentare lo stesso numero espresso in lettere.
NrLa classe di gestione degli eventi sulla finestra
1 import java.io.*;
2 import java.awt.*;
3 import java.awt.event.*;
4 class GestoreFinestra implements WindowListener {
5     public void windowIconified(WindowEvent e) {}
6     public void windowDeiconified(WindowEvent e){}
7     public void windowActivated(WindowEvent e){}
8     public void windowDeactivated(WindowEvent e){}
9     public void windowOpened(WindowEvent e){}
10     public void windowClosed(WindowEvent e){}
11    public void windowClosing(WindowEvent e){
12         System.exit(0);
13    }
14 }
Commenti:
Nr. lineadescrizione
1, 2I prototipi delle classi WindowListener e WindowEvent, cui si fa riferimento nella definizione della classe GestoreFinestra, sono contenuti nella libreria AWT
3La classe GestoreFinestra è derivata dalla classe WindowListener e ne ridefinisce i metodi.
4÷9Si devono elencare tutti i metodi della classe, anche se non vengono ridefiniti.
10÷11Il metodo windowClosing viene ridefinito. L’evento windowClosing si verifica quando si chiude la finestra. L’operazione svolta consiste nel restituire il controllo al sistema operativo mediante il metodo exit dell’oggetto System. Il parametro 0, del metodo exit, è un codice che il sistema operativo si aspetta e che usa per individuare la terminazione con o senza errore del programma.

La classe che svolge la trasformazione da Cifre a lettere

NrIstruzioni del programma
1 class Trasforma extends Frame implements ActionListener {
2 private String Num[] = new String[30];
3 private Panel p1 = new Panel();
4 private Panel p2 = new Panel();
5 private TextField ImportoNum = new TextField(15);
6 private TextField ImportoLett = new TextField(50);
7 private Button converti = new Button("Converti");

Qui termina la sezione proprietà della classe.

La linea 1 dichiara la classe Trasforma, che eredita le proprietà e i metodi della classe Frame, quindi possiede le caratteristiche di una finestra, e ridefinisce i metodi della classe ActionListener, quella che contiene il gestore dell'evento generato dal pulsante.

Nella linea 2 viene dichiarato ed inizializzato il riferimento ad un array in grado di contenere 30 stringhe.

Le linee da 3 a 7 sono dichiarazioni, con inizializzazione, di riferimenti a componenti dell'interfaccia grafica: due pannelli, due caselle di testo ed un pulsante.

il Costruttore della classe.

NrIstruzioni del programma
8 public Trasforma() {
9   super("Da cifre a lettere");
10  addWindowListener(new GestoreFinestra());
11  p1.add(new Label("Importo Numerico: "));
12  p1.add(ImportoNum);
13  p2.add(new Label("Importo in Lettere: "));
14  p2.add(ImportoLett);
15  setLayout(new GridLayout(3,1,5,10));
16  add(p1);
17  add(converti);
18  add(p2);
19  converti.addActionListener(this);
20  NumLet();
21}
Il costruttore non restituisce alcun parametro.

La linea 9: super("Da Cifre a Lettere") - assegna un titolo alla finestra.

linea 10: viene creata (new) un'istanza della classe GestoreFinestra a cui vengono passati (per essere gestiti) i messaggi generati dagli eventi che si verificano sulla finestra

linee 11÷18: si aggiungono i componenti al pannello e i pannelli alla finestra.

linea 19: in questa classe si trova il gestore dell'evento generato dal pulsante.

La linea 20 richiama un metodo, non ancora elencato, che stabilisce l'associazione iniziale tra i numeri in cifre e la loro lettura, come descritto nell'esempio.



Riepilogando, per associare un gestore di evento al pulsante:
  1. si deve dichiarare una classe ascoltatore dell’evento generato dal pulsante nella quale siano ridefiniti i metodi della classe ActionListener, ad esempio:

    class ascoltaPulsante implements ActionListener {
  2. si deve ridefinire il metodo actionPerformed:

    public void actionPerformed(ActionEvent e) {
  3. Al pulsante poi bisogna associare la classe ascoltatore:

    pulsante.addActionListener(new ascoltaPulsante());
Nel caso specifico la classe si chiama Trasforma, il pulsante si chiama converti il gestore dell'evento si trova nella stessa classe (this) che contiene anche il pulsante.

Analisi del procedimento di trasformazione di un numero da cifre a lettere.
cifre → lettere:
0 Zero
1 Uno
2 Due
3 Tre
4 Quattro
5 Cinque
6 Sei
7 Sette
8 Otto
9 Nove
10Dieci
11Undici
12Dodici
13Tredici
14Quattordici
15Quindici
16Sedici
17Diciassette
18Diciotto
19Diciannove
I primi venti numeri non presentano una regola di lettura del numero.

I numeri compresi tra 21 e 29 si leggono "venti" seguito dalla cifra delle unità (a parte l’elisione per i numeri che iniziano con vocale): venti-uno, venti-due, venti-tre, ecc.

La stessa osservazione vale per i numeri compresi tra 30 e 39: trenta-uno, trenta-due, trenta-tre, ecc... Così come pure per quelli compresi tra 40 e 49, tra 50 e 59 ecc.

Quindi
  • se il numero N è minore di 20 la sua forma letterale viene ottenuta accedendo direttamente alla posizione dell’array, specificata dal numero N,
  • Se il numero N è maggiore o uguale a 20 lo si deve scomporre in Decine ed Unità.
L’array viene completato aggiungendo i seguenti elementi:
posizionestringa
22 venti
23 trenta
24 quaranta
25 cinquanta
26 sessanta
27 settanta
28 ottanta
29 novanta
Gli elementi in posizione 20 e 21 restano vuoti.

Si supponga, come esempio, di separare le cifre del numero 56:

il quoziente della divisione tra 56 e 10 fornisce la cifra delle decine=5, mentre il resto della divisione fornisce la cifra delle unità=6.

La stringa risultante sarà ottenuta concatenando la stringa che si trova in posizione 25 =(decine+20) con quella che si trova in posizione 6 (=unita): Secondo la seguente espressione:
Numero in lettere ← Array[decine+20] concatenato con Array[unità].
Se il numero è di tre cifre la sua lettura inizia con cento-, due-cento-, tre-cento, ecc. Cioè la cifra delle centinaia, a parte se è 1, si legge allo stesso modo in cui si leggono le cifre da 2 a 9, apponendo "cento".

il metodo della classe che associa al numero in cifre la sua espressione in lettere.
22private void NumLet(){
23  Num[0]="zero";
24  Num[1]="uno";
25  Num[2]="due";
26  Num[3]="tre";
27  Num[4]="quattro";
28  Num[5]="cinque";
29  Num[6]="sei";
30  Num[7]="sette";
31  Num[8]="otto";
32  Num[9]="nove";
33  Num[10]="dieci";
34  Num[11]="undici";
35  Num[12]="dodici";
36  Num[13]="tredici";
37  Num[14]="quattordici";
38  Num[15]="quindici";
39  Num[16]="sedici";
40  Num[17]="diciassette";
41  Num[18]="diciotto";
42  Num[19]="diciannove";
43  Num[20]="";
44  Num[21]="";
45  Num[22]="venti";
46  Num[23]="trenta";
47  Num[24]="quaranta";
48  Num[25]="cinquanta";
49  Num[26]="sessanta";
50  Num[27]="settanta";
51  Num[28]="ottanta";
52  Num[29]="novanta";
53}
Questo metodo svolge il solo compito di assegnare i valori iniziali all'array Num di 30 stringhe.

Poichè l'array è stato dichiarato private la classe deve contenere un metodo per accedere all'array e restituire il valore desiderato. Questo è lo scopo del metodo seguente:

NrIstruzioni del programma
54 public String Converti(long u){
55   return Num[(int)u];
56 }

Il metodo riceve un parametro di tipo long che usa come indice per accedere all'array e restituisce la stringa con cui si legge il numero.

il gestore dell'evento generato dal pulsante.

NrIstruzioni del programma
57public void actionPerformed(ActionEvent e) {
58  String bottone = e.getActionCommand();
59  long Numero;
60  String Lettere;
61  if (bottone.equals("Converti")) {
62    try {
63      String numeroLetto = ImportoNum.getText();
64      Numero = Long.valueOf(numeroLetto).longValue();
65      Lettere = TrasformaDaCifre(Numero);
66      ImportoLett.setText(" "+Lettere);
67    }
68    catch(Exception exc){
69      ImportoLett.setText("usa il punto per separare i decimali");
70    }
71  }
72}

  • Linea 57: nome del gestore dell'evento clic sul pulsante. Il gestore riceve il messaggio e.
  • linea 58: il metodo getActionCommand dell'oggetto e contenente il messaggio restituisce la didascalia del pulsante (non il nome).
  • linee 59÷60: variabili locali.
  • linea 61: il metodo equals dell'oggetto stringa bottone restituisce vero se la stringa contiene lo stesso valore specificato tra parentesi.
    Il gestore dell'evento clic sul pulsante ha il compito di individuare il pulsante che ha generato il messaggio. L'unico modo in cui il gestore può individuarlo consiste nel confrontare il testo scritto sul pulsante (didascalia).
  • la sezione try si usa ogni volta che si potrebbe verificare un errore generato in fase di esecuzione del programma. Nella sezione try si deve acquisire il valore scritto nella casella di testo (linea 63) e lo si deve convertire in long (linea 64).
    poi (linea 65) si richiama il metodo che effettua la trasformazione in lettere del numero letto e, infine (linea 66), si scrive il risultato nella casella di testo.
  • Linea 68: la sezione catch specifica le azioni per gestire l'errore, se si verifica. In questo caso si è supposto che l'errore più probabile sia l'uso della virgola al posto del punto

Scomposizione del numero di lunghezza 3 cifre e costruzione della stringa.

NrIstruzioni del programma
73public String TrasformaDaCifre(long N){
74String str;
75str = Converti3Cifre(N);
76return str;
77}

La funzione TrasformaDaCifre riceve un parametro di tipo long nella variabile N e restituisce un oggetto di tipo Stringa.


Scomposizione.

NrIstruzioni del programma
78public String Converti3Cifre(long TreCifre){
79long Centinaia, Decine, UltimaCifra;
80String strCentinaia, strDecine, strUnita;
81  Centinaia = TreCifre/100;
82  strCentinaia = "";
83  if (Centinaia > 0) {
84    strCentinaia = "cento";
85    if (Centinaia>1) strCentinaia = Converti(Centinaia) + strCentinaia;
86  }
87  Decine = TreCifre % 100;
88  if (Decine < 20) {
89    strDecine = Converti(Decine);
90    return strCentinaia + strDecine;
91  }
92  Decine = Decine/10;
93  UltimaCifra = TreCifre % 10;
94    strDecine = Converti(Decine+20);
95    if ((UltimaCifra==1) || (UltimaCifra==8)) {
96      strDecine = strDecine.substring(0,strDecine.length()-1);
97    }
98    if (UltimaCifra>0) strUnita = Converti(UltimaCifra);
99  else strUnita = "";
101   return strCentinaia + strDecine + strUnita;
102}
103 }


La classe principale.

Nr Istruzioni del programma
104class DaCifreaLettere {
105  public static void main (String argv[]) {
106    Trasforma f = new Trasforma();
107    f. pack();
108    f.setVisible(true);
109  }
110}

Scomposizione del numero di 9 cifre e costruzione della stringa.
Questa è la versione completa del metodo TrasformaDaCifre

73public String TrasformaDaCifre(long N){
74int Milioni, Migliaia, Unita;
75String strMilioni, strMigliaia, strUnita, str;

dichiarazioni di variabili locali alla funzione.

75 Milioni = (int) (N/1000000);
76 Migliaia = (int) (N % 1000000);
77 Migliaia = (int) (Migliaia/1000);
78 Unita = (int) (N % 1000);
79 str="";
80 strMilioni="";
81 strMigliaia="";
82 strUnita="";
83 if (Milioni > 1) strMilioni = Converti3Cifre(Milioni);
84 if (Migliaia>1) strMigliaia = Converti3Cifre(Migliaia);
85 if (Unita>1) strUnita = Converti3Cifre(Unita);
86 if (Milioni>0) {
87 if (Milioni==1) str = str+"unmilione";
88 else str = str+strMilioni+"milioni";
89 }
90 if (Migliaia>0) {
91 if (Migliaia==1) str=str + "mille";
92 else str = str+strMigliaia + "mila";
93 }
94 if (Unita>0) {
95 if (Unita==1) str = str + "uno";
96 else str = str + strUnita;
97 }
98 if (str=="") str = "zero";
99 return str;
100}

Commenti