View Full Version : 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?
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");
}
}
Ho provato ad usare un compilatore online e mi da sempre i risultati giusto mentre da pc mi da sempre errore, qualcuno sa dirmi perché?
non ho un compilatore java per provare, ma hai provato a sostituire / con // oppure in luogo del simbolo mettere 47 ?????
Si ho provato a confrontare i caratteri con il loro corrispettivo ascii e mi da sempre errore sulle stringhe, ma solo su “/**/“ oppure “/*a*/“
ase 1:
if(ch == '*')
state = 2;
else
state = -1;
break;
case 2:
if(ch == 'a')
state = 2;
un dubbio su quell'assegnamento, setti state = 2 in due casi diversi: è corretto?
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
chiaramente hai provato step by step giusto?
Si e ho anche provato a togliere l’errore forzatamente e fargli stampare la stringa che legge ma risulta completamente diversa da quella inserita
wingman87
21-01-2021, 17:10
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.
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
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>
Questo è come io avvio il programma dal prompt dei comandi e anche il risultato che mi restituisce
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>
Questo è come io avvio il programma dal prompt dei comandi e anche il risultato che mi restituisce
Forse non c'entra nulla ma ... la virgoletta finale mancante " è un refuso di copia e incolla?
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 ;)
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 :doh: sarà un problema del compilatore o di com’è installato?
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 :doh: sarà un problema del compilatore o di com’è installato?
Ho trovato un problema molto simile a quello che hai segnalato:
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8154036
https://bugs.java.com/bugdatabase/view_bug.do?bug_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.
wingman87
22-01-2021, 14:36
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.
Ci ho provato è appunto nelle stringhe di lunghezza inferiore di /*aa*/ il carattere non viene letto correttamente
Ci ho provato è appunto nelle stringhe di lunghezza inferiore di /*aa*/ il carattere non viene letto correttamente
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 '*'
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:
PS C:\Users\lmp\Desktop\tmp> java Esercizio "/*aa*/"
ciclo 1carattere / stato 0
ciclo 2carattere * stato 1
ciclo 3carattere a stato 2
ciclo 4carattere a stato 2
ciclo 5carattere * stato 2
ciclo 6carattere / stato 4
OK
PS C:\Users\lmp\Desktop\tmp> java Esercizio "/*a*/"
ciclo 1carattere \ stato 0
NOPE
PS C:\Users\lmp\Desktop\tmp> java Esercizio "/*a*/"
[\$WinREAgent, \apache-maven-3.6.3, \Documents and Settings, \DumpStack.log.tmp, \pagefile.sys, \Program Files, \Program Files (x86), \ProgramData, \swapfile.sys, \System Volume Information]
ciclo 1carattere \ stato 0
NOPE
esecuzione sotto cmd:
C:\Users\lmp\Desktop\tmp>java Esercizio "/*aa*/"
[/*aa*/]
ciclo 1carattere / stato 0
ciclo 2carattere * stato 1
ciclo 3carattere a stato 2
ciclo 4carattere a stato 2
ciclo 5carattere * stato 2
ciclo 6carattere / stato 4
OK
C:\Users\lmp\Desktop\tmp>java Esercizio "/*a*/"
[/*a*/]
ciclo 1carattere / stato 0
ciclo 2carattere * stato 1
ciclo 3carattere a stato 2
ciclo 4carattere * stato 2
ciclo 5carattere / stato 4
OK
Powershell mi espande in malo modo la wildcard "*". Provando invece:
PS C:\Users\lmp\Desktop\tmp> java Esercizio '"/*a*/"'
[/*a*/]
ciclo 1carattere / stato 0
ciclo 2carattere * stato 1
ciclo 3carattere a stato 2
ciclo 4carattere * stato 2
ciclo 5carattere / stato 4
OK
Ora, da quello che hai scritto sembra che tu stia già utilizzando cmd; nel dubbio proverei comunque a stampare i parametri a video come suggerito prima e a provare a lanciare il programma inserendo la stringa "/*a*/" all'interno dei singoli apici: '"/*a*/"'
Prova a dare un occhio anche qua:
https://stackoverflow.com/questions/55748451/how-to-pass-a-string-constant-as-it-is-in-powershell
a meno che tu non l'abbia già fatto, eviterei a questo punto l'update di java ...
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.