Esercitazioni per il laboratorio di Sistemi di elaborazione e trasmissione dell'informazione
Trasformazione in lettere di un importo dato in cifre.
Si costruisce un programma che, in una finestra, mostra:
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 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}


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