Ciao, stabilire se un numero è in virgola mobile non è così semplice come sembra.
Ad esempio in java un numero in virgola mobile potrebbe essere nella forma:
234 234,5 .234 +2.4 -.3 17E10 2E-3 -.6E2
Ti mostro un metodo
molto grezzo, ma che non necessita conoscenze approfondite, per poter risolvere il problema.
Per prima cosa devi prendere carta e penna e disegnare un automa a stati finiti che rappresenti un numero in virgola mobile. Se hai fatto un itis a indirizzo informatico dovresti già sapere di che si parla; è argomento di terza.
Un numero in virgola mobile si può rappresentare così:
Se non sai come funziona un automa ti faccio un brevissimo sunto:
prendi in input il numero come una stringa poi parti da q0 (stato iniziale), consumi il primo carattere, se c'è una transizione valida con quel carattere (una freccia etichettata con il carattere che da q0 ti porta in un altro stato qn) ti sposti in quello stato altrimenti sai che quella stringa non appartiene al linguaggio (non è un numero in virgola mobile); riesegui il tutto finchè, carattere dopo carattere, consumi tutta la stringa (oppure ti fermi prima perchè trovi una transazione non valida). A questo punto controlli in che stato sei arrivato: se sei in uno stato accettante (uno stato rappresentato con il doppio cerchio) allora accetti la stringa (fa parte del linguaggio), no altrimenti.
NOTA: 0-9 rappresenta 0,1,2,...,9
Es con 2E-3:
parti da q0, consumi il 2 (rimane E-3) , con il carattere 2 vai in q2;
da q2, consumi E (rimane -3) con il carattere E vai in q5;
da q5, consumi - (rimane 3) con il carattere - vai in q6;
da q6, consumi 3 (rimane la stringa vuota) con il carattere 3 vai in q7;
Hai consumato tutto l'input e ti ritrovi in q7; è uno stato accettante quindi accetti la stringa (è un numero in virgola mobile).
Comunque è una spiegazione molto terra terra, se ti interessa l'argomento trovi molto materiale anche on line; ti basta cercare DFA o automi a stati finiti.
In java puoi rappresentarlo con uno switch sugli stati:
public static boolean scan(String s) {
int state = 0;
int i = 0;
while (state >= 0 && i < s.length()) {
final char ch = s.charAt(i++);
switch (state) {
case 0:
if (Character.isDigit(ch))
state = 2;
else if (ch == '+' || ch == '-')
state = 1;
else if (ch == '.')
state = 3;
else if (ch == ' ')
state = 0;
else
state = - 1;
break;
case 1:
if (Character.isDigit(ch))
state = 2;
else if
(ch == '.')
state = 3;
else
state = - 1;
break;
case 2:
if (Character.isDigit(ch))
state = 2;
else if (ch == '.')
state = 3;
else if (ch == 'E')
state = 5;
else if (ch == ' ')
state = 8;
else
state = - 1;
break;
case 3:
if (Character.isDigit(ch))
state = 4;
else
state = - 1;
break;
case 4:
if (Character.isDigit(ch))
state = 4;
else if (ch == 'E')
state = 5;
else if (ch == ' ')
state = 8;
else
state = - 1;
break;
case 5:
if (ch == '+' || ch == '-')
state = 6;
else if (Character.isDigit(ch))
state = 7;
else
state = - 1;
break;
case 6:
if (Character.isDigit(ch))
state = 7;
else
state = - 1;
break;
case 7:
if (Character.isDigit(ch))
state = 7;
else if (ch == ' ')
state = 8;
else
state = - 1;
break;
case 8:
if (ch == ' ')
state = 8;
else
state = - 1;
break;
}
}
return i == s.length() && (state == 2 || state == 4 || state == 7 || state == 8);
}
È un approcio non OOP, poco leggibile e non riutilizzabile (esistono approci molto più sofisticati ed eleganti per gestire il problema ma che necessitano di conoscenze teoriche molto più ampie) ma spero che ti possa essere d'aiuto per inquadrare il problema.