|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2010
Messaggi: 47
|
[JAVA] Comandi con "\"
Qualcouno sa dirmi dove posso trovare una lista dei comandi di java con il "\". Ad esempio \n serve per andare a capo. Però a me servirebbe quello per andare ad inizio riga
|
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
le altre http://download.oracle.com/javase/tu...haracters.html per la cronaca si chiamano sequenze di escape ( Escape Sequences ) |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ciao, "\n" è la sequenza di escape che nella codifica ASCII corrisponde al caratter di controllo "Line Feed".
Il carattere '\', all'interno di una stringa letterale, è un metacarattere che serve a introdurre una sequenza di escape. Eccoti un link a una tabella ASCII: i primi 32 sono i "caratteri di conrtollo", cioè caratteri non stampabili che includono vari "comandi": solo per alcuni di questi sono presenti anche le relative sequenze di escape (nella tabella, sotto la colonna "CEC").
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Apr 2010
Messaggi: 47
|
Grazie mille per le risposte ho provato ad usare il carriage return (\r) ma sembra non funzionarmi. Perchè ho provato a stampare una cosa che viene stampata ogni tot di secondi e poi volevo far in modo che venisse sovrascritto quello che è stato scritto precedentemente. Se serve ecco il codice che è piuttosto semplice:
Codice:
public class StellaAnimata { public static void main(String[] args) throws InterruptedException { int stato = 0; while (true) { if(stato == 0 || stato == 4) { System.out.print("| \r"); if(stato == 4) { stato = 1; } else { stato += 1; } Thread.sleep(100); } if(stato == 1) { System.out.print("\\ \r"); stato += 1; Thread.sleep(100); } if(stato == 2) { System.out.print("- \r"); stato += 1; Thread.sleep(100); } if(stato == 3) { System.out.print("/ \r"); stato += 1; Thread.sleep(100); } } } } Ultima modifica di abenobashi : 06-09-2011 alle 17:57. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ciao, cerco di essere esaustivo, allora:
Quote:
Ci sono alcuni caratteri di controllo ASCII associati al concetto del "cancellare" qualcosa che è stato scritto, ad esempio "Backspace" oppure "Delete" (vedi la tabella precedentemente linkata). Ma anche con questi caratteri di controllo, da codice Java, non ci fai molto. Immagino che il tuo sia una sorta di esercizio, e che tu stia imparando a programmare. Un conto quindi è lo scopo del programma in sè stesso (ottenere un preciso risultato: un rudimentale effetto di animazione usando dei caratteri ascii stampati sulla consolle) e un conto è lo scopo dello scrivere quel programma (esercitarsi, scrivere codice sintatticamente e semanticamente corretto, imparare cose nuove, ecc...). Per quanto riguarda "lo scopo dello scrivere quel programma (esercitarsi)", forse non ti sei accorto che puoi semplificare la struttura del tuo codice eliminando le "cose inutili". Ad esempio: hai definito 5 stati, da 0 a 4; per passare da uno stato al successivo incrementi il valore dello stato di uno e siccome l'ultimo stato utile è quello che vale 3, e viene quindi poi incrementato a 4, hai mappato il valore 1 e 4 per il primo stato. Il tuo sistema è correto da un punto di vista logico, ma non era meno confusionario mappare i valori 1, 2, 3, 4 con i rispettivi stati per poi passare da uno all'altro semplicemente assegnando allo stato il valore desiderato? Il tuo ciclo while diventerebbe così: Codice:
while (true) { if (stato == 1) { System.out.print("| \r"); stato = 2 Thread.sleep(100); } if (stato == 2) { System.out.print("\\ \r"); stato = 3; Thread.sleep(100); } if (stato == 3) { System.out.print("- \r"); stato = 4; Thread.sleep(100); } if (stato == 4) { System.out.print("/ \r"); stato = 1; Thread.sleep(100); } } E quindi il while si riduce a: Codice:
while (true) { System.out.print("| \r"); Thread.sleep(100); System.out.print("\\ \r"); Thread.sleep(100); System.out.print("- \r"); Thread.sleep(100); System.out.print("/ \r"); Thread.sleep(100); } Esaminando meglio, si può notare che ciò che ogni volta cambia in questa sorta di "istruzione logica" è solo ciò che viene stampato. A questo punto si può sintetizzare questa "istruzione logica" con un metodo: gli si da un nome e lo si definisce con un argomento in ingresso (una String), ad esempio: Codice:
private static void printAndWait(String string) { System.out.print(string); Thread.sleep(100); } Codice:
public class StellaAnimata { public static void main(String[] args) throws InterruptedException { while (true) { printAndWait("| \r"); printAndWait("\\ \r"); printAndWait("- \r"); printAndWait("/ \r"); } } private static void printAndWait(String string) { System.out.print(string); Thread.sleep(100); } } ----- Per quanto riguarda invece "lo scopo del programma in sè stesso (ottenere l'animazione ascii)" ti dico che non lo puoi ottenere nel modo in cui pensi; ovvero non c'e' un modo, tramite System.out, di "sovvrascrivere" quello che vedi in consolle. Questo perchè le stringhe che stampi con i comandi "print" in System.out, vengono per prima cosa accodate in uno stream che funge da buffer di accumulazione interno a System stesso (quell'out si System.out è uno PrintWriter, cioè lo stream su cui si può stampare). Ogni volta che stampi delle stringhe, non fai altro che accodarle in out (il PrintWriter). Se le accodi con i metodi "print", lo stream non viene "flushato" (leggi: scaricato) immediatamente sulla destinazione (la consolle), invece con "println" (e non mi ricordo più che altri metodi) memorizzi la stringa passata e forzi un "flush" del contenuto dello stream sulla destinazione alla quale è collegato (uno stream collega una sorgente con una destinazione). Esiste un apposito metodo per forzare lo scaricamento dello stream: flush. Lo usiamo così, ad esempio: Codice:
... private static void printAndWait(String string) { System.out.print(string); System.out.flush(); Thread.sleep(100); } ... E' per questo che se stampi su System.out caratteri di controllo come ad esempio \b (Basckspace) non ottieni ciò che ti aspetteresti: se ci pensi non puoi cancellare i dati già inviati sullo stream, perchè magari nel frattempo lo stream è stato svuotato. Quello che vorresti cancellare è già stato stampato sullo stream di output collegato, la consolle. Servirebbe quindi un comando per dire alla consolle: cancella, fai backspace. Ma la "consolle" non è un componente Java: la consolle viene messa a disposizione dal sistema operativo specifico e quindi per fare quello che vuoi tu bisogna percorrere altre strade, che esulano dal contesto Java puro e semplice e c'entrano poco con la tua esercitazione. Posso farti due esempi con cui riesco a ottenere l'effetto di animazione sul mio pc. Io uso un IDE per programmare in Java, che si chiama NetBeans. Posso lanciare i miei programmi direttamente da NetBeans e se il programma gira in consolle, NetBeans stampa l'output sulla sua implementazione interna di consolle e non su la consolle del sistema operativo. Questo programma esegue l'effeto di animazione se lanciato dall'IDE NetBeans (e se la finestra di consolle è dimensionata a 16 righe di altezza): Codice:
public class StellaAnimata { public static void main(String[] args) { while (true) { printAndWait("|"); printAndWait("\\"); printAndWait("-"); printAndWait("/"); } } private static void printAndWait(String string) { // uso 15 newline perche' sto lanciando il programma // dall'IDE NetBeans e attualmente l'altezza della // consolle di output integrata e' tale da mostrare // 16 linee (quindi ne stampo 15 vuote e sulla 16esima // stampo il carattere. System.out.print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); System.out.print(string); System.out.flush(); try { Thread.sleep(250); } catch (InterruptedException ignored) {}; } } si può sfruttare il comando "CLS" (clear screen) e qualche barbatrucco particolare per ottere un dalay di esecuzione dei comandi specificati in un file .bat da mandare in esecuzione. Dopo qualche prova ho trovato che 'sta roba da me funziona: Codice:
@echo off REM create a wb script used to sleep for some time REM each time it is invoked (calling to WScript.Sleep) > "%Temp%.\sleep.vbs" echo WScript.Sleep 50 REM counter used to exit the loop setlocal set /a max=10 set /a counter=0 :START if %counter%==%max% goto :END cls echo ^| cscript //NoLogo "%Temp%.\sleep.vbs" cls echo ^/ cscript //NoLogo "%Temp%.\sleep.vbs" cls echo ^- cscript //NoLogo "%Temp%.\sleep.vbs" cls echo ^\ cscript //NoLogo "%Temp%.\sleep.vbs" set /a counter=%counter%+1 goto :START endlocal :END cls del "%Temp%.\sleep.vbs" Spero di averti chiarito qualche dubbio ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 07-09-2011 alle 12:27. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:12.