PDA

View Full Version : programmazione in java di un automa


iannez
20-01-2021, 14:11
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é?

misterx
21-01-2021, 08:16
non ho un compilatore java per provare, ma hai provato a sostituire / con // oppure in luogo del simbolo mettere 47 ?????

iannez
21-01-2021, 13:09
Si ho provato a confrontare i caratteri con il loro corrispettivo ascii e mi da sempre errore sulle stringhe, ma solo su “/**/“ oppure “/*a*/“

misterx
21-01-2021, 13:28
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?

iannez
21-01-2021, 14:25
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

misterx
21-01-2021, 16:21
chiaramente hai provato step by step giusto?

iannez
21-01-2021, 16:28
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.

Lampo89
21-01-2021, 18:04
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

iannez
21-01-2021, 21:12
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

Lampo89
21-01-2021, 21:42
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 ;)

iannez
21-01-2021, 22:37
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?

Lampo89
21-01-2021, 23: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 :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.

iannez
22-01-2021, 12:42
Va bene grazie mille

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.

iannez
22-01-2021, 21:40
Ci ho provato è appunto nelle stringhe di lunghezza inferiore di /*aa*/ il carattere non viene letto correttamente

Lampo89
22-01-2021, 22:01
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 '*'

Lampo89
22-01-2021, 22:21
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 ...

iannez
23-01-2021, 10:52
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