// Implementiamo qui un contatore binario // il cui numero di bit viene fissato al // momento della costruzione. // Le operazioni previste sono: // (0) costruzione e (ri)azzeramento; // (1) incremento unitario (fino a un valore massimo stabilito al momento della costruz.); // (2) accesso progressivo ai bit del contatore, cominciando dal meno significativo; // (3) ''esposizione'', sotto forma di String, del valore corrente del contatore. // Firma dei metodi: // Costruttori: // public Contatore( int nrBit ) // public Contatore( ) // // Metodi di accesso: // public Boolean leggiRotella( ) // il prossimo bit (metaforicam. 'rotella') // public String toString( ) // versione stampabile del contatore // // Metodi di modifica dello stato: // public void azzera( ) // inizializzazione / reset // public boolean incr( ) // incremento unitario del contatore class Contatore{ private boolean[] rot; // 'rotelle' che formano il contatore final int lungh; // numero delle rotelle, fissato al momento della costruzione private int r; // posizione del prossimo bit che verra` erogato final static int nrRot = 8; // in mancanza d'indicaz., sara` adottato questo valore public Contatore( int nrRot ){ // costruttore con indicaz. del numero di rotelle lungh = nrRot; rot = new boolean[ lungh ]; azzera(); } public Contatore( ){ // costruttore senza parametri this( nrRot ); } public void azzera( ){ // azzera il contatore (la 1.a volta non occorrerebbe farlo) // e ne mette a fuoco la posizione meno significativa for( int i = 0; i < lungh; i++ ) rot[ i ] = false; r = 0; } public Boolean leggiRotella( ){ // eroga il valore della rotella corrente if( r == lungh ){ r = 0; return null; } // l'erogazione sara` circolare return rot[ r++ ]; // acquisisco il dato e preparo la prossima acquisiz. } public String toString( ){ // qui i bit saranno rappresentati con 0/1 String acc = ""; for( boolean bit : rot ) acc += (bit) ? 1 : 0; // esercizio: costruire il risultato 'acc' sottosopra return acc; } public boolean incr( ){ int i = 0; while( i < lungh && ! (rot[ i ] = ! rot[ i ])){ i++; } r = 0; return i != lungh; } }