Tastatureingabe & Optimierung Programm
-
Hallo zusammen,
ein C++ Programmierer wagt sich an Java... Wie kann ich eine Zahl von der Kommandozeile einlesen? Ist folgendes Vorgehen zwingend notwendig oder geht das auch einfacher?
Das Programm ist eine applikative Lösungsmöglichkeit von dem Logikspiel Türme von Hanoi.
Kann ich das Programm noch optimieren?
import java.io.*; public class main { public static void main(String args[]) throws IOException { System.out.print("Anzahl Scheiben: "); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String c = in.readLine(); int n = Integer.parseInt(c); for (int i=1; i < 1<<n; ++i) System.out.println("" + (i & i-1) % 3 + " > " + ((i | i-1) + 1) % 3); } }
Grüße
Martin
-
Die Eingabe kann auch über "Scanner" erfolgen. Siehe Java-Dokumentation vom Package "java.util."(http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html)
import java.util.*;
public class Hanoi {
static void bewege(int anzahl, char von, char nach, char mit) {
if ( anzahl > 0 ) {
bewege(anzahl-1,von,mit,nach);
System.out.println("" + von + " --> " + nach);
bewege(anzahl-1,mit,nach,von);
}
}public static void main(String[] args) {
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);System.out.print("Anzahl eingeben : ");
int n = sc.nextInt();bewege(n,'A','B','C');
}
}
-
Hier nochmal der Code in formatierter Version.
import java.util.*; public class Hanoi { static void bewege(int anzahl, char von, char nach, char mit) { if ( anzahl > 0 ) { bewege(anzahl-1,von,mit,nach); System.out.println("" + von + " --> " + nach); bewege(anzahl-1,mit,nach,von); } } public static void main(String[] args) { Locale.setDefault(Locale.US); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); bewege(n,'A','B','C'); } }
-
Vielen Dank 'der, der gerade da ist',
Deine rekursive Version gefällt mir sehr gut, obgleich die applikative Variante ein wenig performanter ist und nicht an Limits bezüglich der Hardwareressourcen gebunden ist (rein hypothetisch könnte man das Programm mit 64 Scheiben laufen lassen, ohne das der Stack voll läuft... dann kann man sich ein paar Jährchen zurücklehnen :).
Ist es für die Verwendung der Klasse Scanner notwendig via Locale.setDefault die Standardumgebung zu setzen?
Kann mir jemand den Unterschied zwischen Scanner und den anderen Klassen zur Eingabe erläutern?
Grüße
Martin
-
Das Locale hab ich bei mir noch nie benötigt
"Scanner" ist ein Wrapper um die anderen Klassen (InputStreams, Readers) herum. Der Scannner wurde speziell für eine einfach zu handhabende Textverarbeitung geschrieben, und bietet deshalb lustige Methode wie "nextInt" (und ein Dutzend weitere) welche andere Klassen nicht haben.
-
Locale sind dann praktisch, wenn man z.B. spezielle Nummernformate zulassen moechte. So haben die Amis z.B. das Komma als Tausendertrennzeichen, waehrend es bei uns der Punkt ist. Mit dem Scanner kannst du dann 10,000 als 10000 beu Locale.US auslesen.