Note di rilascio della versione 1.0
Premessa
Nell' applicazione proposta MBC/O la conversione e l'operazione sono possibili per numeri di qualsiasi lunghezza.
Installazione dell' ambiente di sviluppo
Se nel vostro computer non e' stato ancora installato Unity, seguire questa procedura:
Scaricare l'installer da questo
sito la versione 5.5.2, disponibile sia per Windows, che per Mac e procedere con l'installazione.
Dopo l'installazione, estrarre l'archvio, aprire Unity e cliccare su "Apri progetto" e selezionare il percorso della cartella estratta (src/MBCO).
Requisiti di sistema
Il progetto puo' essere visionato o modificato preferibilmente nella versione 5.5.2 di Unity (Questo per evitare possibili malfunzionamenti del programma).
OS: Windows 7 SP1+, 8, 10; Mac OS X 10.8+.
GPU: Graphics card with DX9 (shader model 3.0) or DX11 with feature level 9.3 capabilities.
Compilazione
Compilazione per Android scaricare e installare: Android SDK e Java Development Kit (JDK).
Architettura del software
Il programma e' strutturato in:
Tre scene: Menu, Converter, Operations;
Cinque classi: Cambia_Scena, Canvas_Manager, Char_Converter, Converter, Operation, tutte e cinque sono Singleton;
La classe Cambia_Scena consente il passaggio da una scena all'altra.
La classe Canvas_Manager consente l'apparizione delle diverse tastiere dedicate ad ogni base numerica.
La classe Char_Converter converte un singolo carattere nel numero corrispondente e viceversa (es. 'F' corrisponde a 15 e viceversa).
La classe Converter effettua tutte le conversioni di base.
La classe Operations effettua le operazioni somma, sottrazione, prodotto, divisione, potenza e modulo tra due numeri.
Tecniche di programmazione
Al fine di consentire l'utilizzo di numeri illimitatamente grandi, si è deciso di trattare i numeri sotto forma di stringhe, quindi quando si parla di numeri, in realtà ci riferiamo a stringhe rappresentanti numeri.
Le funzioni spiegate più avanti possono essere consultate nel dettaglio nei commenti del codice(src/MBCO/Assets/Scripts).
-Conversione
Per la conversione quando viene scritto un numero su una qualsiasi textBox, appena si preme il pulsante "Convert", la conversione viene effettuata convertendo
innanzitutto in base dieci: si fa una somma di ogni cifra convertita da carattere all' intero corrispondente e applicando la formula della somma
di ogni numero moltiplicato per la base elevata alla posizione nell'array di caratteri. La posizione nell'array viene stabilita partendo da destra da zero aumentando
verso sinistra. Successivamente il numero in base decimale viene convertito nelle altre basi numeriche: il numero decimale viene diviso di volta in volta
per la base, fino ad arrivare ad un numero minore di uno. Il totale è formato dai rispettivi resti di ogni divisione disposti dall'ultimo fino al primo.
-Operazioni
Per le operazioni vengono effettuati algoritmi di addizione, sottrazione, moltiplicazione, divisione, potenza e modulo, in tutti i casi le due stringhe vengono equalizzate inserendo a sinistra
della stringa gli zeri mancanti.
-Addizione
Per l'addizione, partendo da destra, si sommano i due caratteri convertiti ad intero più l'eventuale riporto, il tutto si
divide per la base, la parte intera della divisione restituisce il riporto da aggiungere alla cifra a sinistra, mentre il resto restituisce il risultato della somma
che viene concatenata alla stringa del totale.
-Sottrazione
Per la sottrazione si istanzia un array di interi grande come le due stringhe che tiene conto dei prestiti. Si parte dai caratteri a destra, se il carattere della stringa in alto è
più piccolo dell'altro, si cerca verso sinistra il primo numero diverso da zero per prendere in prestito una decina. Questo viene annotato nell'array dei prestiti.
Se non si trova nessun numero diverso da zero la sottrazione risulta impossibile. Nel caso contrario si effettua la sottrazione tra le due cifre più la decina in prestito.
-Moltiplicazione
Algoritmo della moltiplicazione in colonna, si prendono i due numeri e partendo dalla prima cifra a destra del moltiplicatore, si moltiplica quest'ultima con le cifre del moltiplicando, partendo da destra.
Si instanzia un array di stringhe grande quanto la lunghezza del moltiplicatore. Ogni elemento dell'array contiene la somma dei risultati dei prodotti tra la cifra del moltiplicatore e quelle del moltiplicando. A questa somma viene applicato lo scorrimento a sinistra corrispondente alla
posizione della cifra del moltiplicando usata per produrla.
Il prodotto totale sarà dato dalla somma dei valori dell'array.
-Divisione
Algoritmo della divisione in colonna, si prende la prima cifra a sinistra del dividendo, si inserisce in una variabile "tmp" e si controlla se è maggiore o uguale al divisore. Se è vero, si aggiunge una cifra a destra nel quoziente
che è il risultato della divisione intera tra "tmp" e il quoziente. Al posto di "tmp" si metterà il resto dell'operazione. Se è falso, invece, si aggiunge a "tmp" un' ulteriore cifra
del dividendo e si aggiunge uno zero al quoziente.
-Potenza
Funzione per il calcolo della potenza. Se il numero da calcolare è in base 2, il risultato può avere un massimo di 64 cifre, per le altre basi può avere un massimo di 20 cifre.
-Modulo
Restituisce il resto della divisione tra due numeri.
Metodi contenuti in:
Cambia_Scena
- void toMenu: Permette il ritorno al menù.
- void toConverter: Passa al convertitore.
- void toOperations: Passa alle operazioni.
- Canvas_Manager
- void canvasAppear(Canvas): Rende visibile il canvas passato come parametro (in questo caso si tratta delle diverse tastiere).
- void canvasAppear: Usata nelle operazioni, fa apparire la tastiera secondo la base selezionata dalla lista.
- void canvasDisappear(Canvas): Rende invisibile il canvas passato come parametro.
- void allCanvasDisappear: Rende invisibili tutti i canvas.
- Canvas getTastiera(int): Restituisce il canvas da far apparire.
- Char_Converter
- int convertCharToInt(char): Restituisce il carattere nell'intero corrispondente.
- char convertIntToChar(int): Restituisce l'intero nel carattere corrispondente.
- Converter
- string to10perCalcoli(string,int): Restituisce la stringa convertita in base dieci.
- string to10(string,int): Restituisce la stringa convertita in base dieci, questa funzione è utilizzata per operare su numeri molto grandi.
- string from10perCalcoli(string,int,int): Restituisce la stringa convertita dalla base dieci alla base passata come parametro.
- string from10(string,int,int): Restituisce la stringa convertita dalla base dieci alla base passata come parametro,questa funzione è utilizzata per operare su numeri molto grandi.
N.B. Viene fatta questa distinzione perché le conversioni non "perCalcoli" utilizzano le operazioni algebriche operando sulle stringhe. Dato che alcune operazioni algebriche necessitano
di numeri convertiti in base dieci, avviene questa distinzione per evitare ricorsione infinita tra le funzioni di conversione e operazione. Le funzioni "perCalcoli" invece
operano sui numeri e non sulle stringhe, quindi sono funzioni chiamabili dalle operazioni algebriche.
- void convert: Scrive nelle textBox i risultati delle conversioni.
- void setDaConvertire(Text): Imposta la textBox da usare per avviare la conversione.
- void setBaseDiPartenza(int): Imposta la base di partenza per la conversione in base dieci.
- void setDoveTesto(GameObject): Imposta la textBox da utilizzare per scrivere con la tastiera.
- void scriviSuTesto(string): Scrive il carattere sulla textBox per un massimo di 15 caratteri.
- void cancellaSuTesto: Cancella un carattere dalla textBox.
- Operation
- void Awake: Imposta la prima textBox come attiva, la base dieci e l'operazione di addizione di default.
- string addizione (int,string,string): Restituisce il risultato dell'addizione.
- string sottrazione (int,string,string): Restituisce il risultato della sottrazione.
- string moltiplicazione (int,string,string): Svolge il prodotto tra due numeri di una cifra.
- string moltiplicazioneInColonna (int,string,string): Svolge il prodotto tra due numeri.
- string divisione (int,string,string):Svolge la divisione tra le sottostringhe generate da "divisioneInColonna".
- string divisioneInColonna (int,string,string): Svolge la divisione tra due numeri.
- string potenza (int,string,string): Svolge la potenza tra base ed esponente.
- string modulo (int,string,string): Ritorna il resto di una divisione.
- void setnumber_1(string): Imposta la cifra in alto dell'operazione.
- void setnumber_2(string): Imposta la cifra in basso dell'operazione.
- int getBase: Restituisce la base su cui operare.
- char getOperation: Restituisce l'operazione da eseguire.
- void calcola: Effettua il calcolo dell'operazione.
- void equalizeArray(ref string, ref string) : Aggiunge zeri a sinistra alla stringa con meno caratteri.
- void stampaTotale(string) : Scrive sulla textBox.
- void cancellaCaselle : Svuota il contenuto delle textBox.
- void setDoveTesto(GameObject): Imposta la textBox da utilizzare per scrivere con la tastiera.
- void scriviSuTesto(string): Scrive il carattere sulla textBox per un massimo di 15 caratteri.
- void cancellaSuTesto: Cancella un carattere dalla textBox.
Idee per ulteriori sviluppi
Diminuzione della grandezza dell'eseguibile e inserimento di altre operazioni.