|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
programmazione in java di un automa
Buongiorno a tutti, ho un problema con il seguente codice che deve riconoscere un linguaggio dell'alfabeto{/,*,a}. Ogni stringa inserita va bene ma quando inserisco "/**/" oppure "/*a*/" mi da errore, inserendo una system.out ho notato che in questi casi il carattere '/' lo legge come '\' e se annullo il confronto mi cambia anche gli altri caratteri. Qualcuno può aiutarmi?
Codice:
public class Esercizio{
public static boolean scan(String s){
int state = 0;
int i = 0;
while(state >= 0 && i < s.length()){
final char ch = s.charAt(i++);
System.out.println("ciclo " +i+ " carattere " +ch+ " stato " +state);
switch(state){
case 0:
if(ch == '/')
state = 1;
else
state = -1;
break;
case 1:
if(ch == '*')
state = 2;
else
state = -1;
break;
case 2:
if(ch == 'a')
state = 2;
else if(ch == '/')
state = 3;
else if(ch == '*')
state = 4;
else
state = -1;
break;
case 3:
if(ch == '/')
state = 3;
else if(ch == 'a')
state = 2;
else if(ch == '*')
state = 4;
else
state = -1;
break;
case 4:
if(ch == '*')
state = 4;
else if(ch == 'a')
state = 2;
else if(ch == '/')
state = 5;
else
state = -1;
break;
case 5:
if(ch == '*' || ch == '/' || ch == 'a')
state = -1;
break;
}
}
return state == 5;
}
public static void main (String[] args){
System.out.println(scan(args[0]) ? "OK" : "NOPE");
}
}
Ultima modifica di iannez : 20-01-2021 alle 15:39. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
non ho un compilatore java per provare, ma hai provato a sostituire / con // oppure in luogo del simbolo mettere 47 ?????
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Si ho provato a confrontare i caratteri con il loro corrispettivo ascii e mi da sempre errore sulle stringhe, ma solo su “/**/“ oppure “/*a*/“
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
Codice:
ase 1: if(ch == '*') state = 2; else state = -1; break; case 2: if(ch == 'a') state = 2; Ultima modifica di misterx : 21-01-2021 alle 17:19. |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Si esattamente, perché dopo aver letto i caratteri di apertura se comprare una “a” non va avanti. Almeno io l’ho pensata in questo modo
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
chiaramente hai provato step by step giusto?
|
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Si e ho anche provato a togliere l’errore forzatamente e fargli stampare la stringa che legge ma risulta completamente diversa da quella inserita
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
Quando dici che "ti da errore" cosa intendi? Riporta tutte le informazioni che hai, così chi vuole aiutarti non deve investirci troppo tempo per provare a darti una mano.
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Per capire dove sia il problema, forse potrebbe essere utile avere la linea di comando con cui invochi java sul tuo pc - o la configurazione di run dell'IDE che usi
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Codice:
Microsoft Windows [Versione 10.0.19041.746] (c) 2020 Microsoft Corporation. Tutti i diritti sono riservati. C:\Users\gioel\OneDrive\Desktop\LFT laboratorio\esercizio 1>javac Es1_9.java C:\Users\gioel\OneDrive\Desktop\LFT laboratorio\esercizio 1>java Es1_9 "/*aa*/ ciclo 1 carattere / stato 0 ciclo 2 carattere * stato 1 ciclo 3 carattere a stato 2 ciclo 4 carattere a stato 2 ciclo 5 carattere * stato 2 ciclo 6 carattere / stato 4 OK C:\Users\gioel\OneDrive\Desktop\LFT laboratorio\esercizio 1>java Es1_9 "/*a*/ ciclo 1 carattere \ stato 0 NOPE C:\Users\gioel\OneDrive\Desktop\LFT laboratorio\esercizio 1>java Es1_9 "/**/ ciclo 1 carattere \ stato 0 NOPE C:\Users\gioel\OneDrive\Desktop\LFT laboratorio\esercizio 1> |
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Quote:
Non saprei aiutarti, mi sembra un problema assurdo ... mai visto problemi simili nel passaggio di parametri da parte della JVM. E tipicamente, quando le cose che vedi sono assurde è perché c'è sempre un problema banale che non si vede Ultima modifica di Lampo89 : 21-01-2021 alle 22:44. |
|
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Le virgolette non so perché non le ha copiate ma posso assicurare che le ho messe anche perché il primo esempio è corretto, comunque sto uscendo di testa perché proprio non riesco a capire
sarà un problema del compilatore o di com’è installato?
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Quote:
https://bugs.java.com/bugdatabase/vi...bug_id=8154036 https://bugs.java.com/bugdatabase/vi...id=JDK-8131329 Dai un occhio alla versione del JRE: tenterei l'aggiornamento - e per sicurezza anche la JDK aggiornata. edit: JDK-8131329 : JVM silently expands command line arguments before invoking "main()" è marcato come "not an issue" ci sono dei commenti interessanti a riguardo che dovrebbero chiarire il tuo problema. Ultima modifica di Lampo89 : 22-01-2021 alle 00:31. |
|
|
|
|
|
|
#14 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Va bene grazie mille
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
Hai provato a stampare args[0] per vedere cosa riceve il programma? Ancora meglio proverei a stampare la lunghezza di args e tutti i valori all'interno perché probabilmente è una questione di passaggio di argomenti che non avviene correttamente.
|
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Ci ho provato è appunto nelle stringhe di lunghezza inferiore di /*aa*/ il carattere non viene letto correttamente
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Potresti incollare qui il contenuto di argv[0] e in generale dell'intero vettore di parametri? Quello che ti è stato dato mi sembra un suggerimento valido, così almeno si capisce come viene espanso il '*'
|
|
|
|
|
|
#18 | |||
|
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Usando il tuo stesso tuo codice, aggiungendo la stampa del vettore dei parametri. Due esecuzioni, a parità di bytecode (cioé, ho compilato solo una volta e lanciato nei due ambienti diversi). Provato il tutto con JDK e JRE versione 8, update 261 (se non vado errato)
esecuzione sotto powershell: Quote:
Quote:
Quote:
Prova a dare un occhio anche qua: https://stackoverflow.com/questions/...-in-powershell a meno che tu non l'abbia già fatto, eviterei a questo punto l'update di java ... Ultima modifica di Lampo89 : 22-01-2021 alle 23:37. |
|||
|
|
|
|
|
#19 |
|
Junior Member
Iscritto dal: Jan 2021
Messaggi: 17
|
Si io compilo usando cmp, L’update di Java l’ho fatto perché pensavo di perde evitare l’errore grazie al consiglio di alcuni miei compagni di corso. Purtroppo anche tra apici continua a darmi lo stesso errore. La cosa strana è che nei compilatori online funziona tutto perfettamente
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:48.












sarà un problema del compilatore o di com’è installato?








