Einfaches Quiz (Java-Beispielcode): Unterschied zwischen den Versionen
K (→3.) |
K (→4.) |
||
Zeile 173: | Zeile 173: | ||
auftrag = Integer.parseInt( br.readLine() ); | auftrag = Integer.parseInt( br.readLine() ); | ||
</code=java> | </code=java> | ||
− | Erinnern Sie sich, dass unser BufferedReader Strings speichert? Unsere seiteA ist aber vom Typ double! Was können wir jetzt machen? Ganz einfach, wir "parsen". Das bedeutet, dass wir den String in ein double umwandeln müssen. Dafür benötigen wir die Klasse {{API|java/lang/Double|Double}}, die die Klassenmethode parseDouble() besitzt. Als Parameter übergeben wir br.readLine(), also | + | Erinnern Sie sich, dass unser BufferedReader '''Strings''' speichert? Unsere seiteA ist aber vom Typ '''double'''! Was können wir jetzt machen? Ganz einfach, wir "parsen". Das bedeutet, dass wir den String in ein double umwandeln müssen. Dafür benötigen wir die Klasse {{API|java/lang/Double|Double}}, die die Klassenmethode parseDouble() besitzt. Als Parameter übergeben wir br.readLine(), also den '''String''', der umgewandelt werden soll. Und dann speichern wir den Wert vom Typ '''double''' in die Variable seiteA. Mit seiteB und auftrag machen wir dasselbe, nur daß auftrag vom Typ int ist und wir für das "parsen" die Klasse {{API|java/lang/Integer|Integer}}benötigen. |
====5.==== | ====5.==== |
Version vom 8. August 2008, 20:27 Uhr
Inhaltsverzeichnis
Einfaches Quiz
<code=java> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
public class Quiz {
public static void main(String[] args) {
int punkte = 0;
String[] frage1 = { "Wieviel ist 1 + 1?", "<1> Eins", "<2> Zwei", "<3> Drei", "2" };
String[] frage2 = { "Wieviel ist 1 + 2?", "<1> Eins", "<2> Zwei", "<3> Drei", "3" }; String[] frage3 = { "Wieviel ist 2 - 1?", "<1> Eins", "<2> Zwei", "<3> Drei", "1" }; //Fragen werden in einem zweidimensionalen String-Array gespeichert String[][] liste = { frage1,frage2,frage3 }; //Ausgabe von Fragen in der Konsole for(int i=0;i<liste.length;i++) {
System.out.println(liste[i][0]); System.out.println(liste[i][1]); System.out.println(liste[i][2]); System.out.println(liste[i][3]); System.out.println("Bitte Antwort eingeben: ");
//Einlesen von Eingabe BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
try { String antwort = eingabe.readLine(); System.out.println("Sie haben als Antwort: "+antwort+" eingegeben.");
//Vergleichen von Antworten if(antwort.equals(liste[i][4])) { System.out.println("Sie sind ein Genie!\n"); punkte++; } else { System.out.println("Gehen Sie zurück in die erste Klasse!\n"); }
} catch (IOException e) { System.out.println("Falsche Eingabe!"); } } System.out.println("Sie haben "+punkte+" von 3 Punkten erreicht."); if(punkte==3) { System.out.println("Sie können in die zweite Klasse gehen, gratuliere!"); } else { System.out.println("Sie müssen leider die erste Klasse nochmal wiederholen!"); } }
} </code=java>
Switch-Case und Streams
<code=java> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter;
public class Flaechenberechnung {
public static void main(String[] args) throws IOException {
double seiteA, seiteB, ergebnis; int auftrag;
InputStreamReader isr = new InputStreamReader( System.in ); BufferedReader br = new BufferedReader( isr );
PrintWriter pw = new PrintWriter( System.out, true); pw.println("Rechteckberechnung\n");
pw.println("Seite A eingeben: "); seiteA = Double.parseDouble( br.readLine() ); pw.println("Seite B eingeben: "); seiteB = Double.parseDouble( br.readLine() ); pw.println("<1> für Flächenberechnung, <2> für Umfangberechnung eingeben:"); auftrag = Integer.parseInt( br.readLine() );
switch ( auftrag ) { case 1: { ergebnis = seiteA*seiteB; pw.println("Die Fläche beträgt "+ergebnis); break; } case 2: { ergebnis = 2*seiteA + 2*seiteB; pw.println("Der Umfang beträgt "+ergebnis); break; } default: pw.println("Leider verstehe ich Ihne eingabe nicht."); } pw.println("Programm wird beendet."); }
} </code=java>
Erklärung
Mit diesem Programm kann man Umfang und Fläche von einem Rechteck berechnen. Ich werde jetzt dieses Programm auseinandernehmen und versuchen zu erklären, wie es funktioniert.
1.
<code=java> public class Flaechenberechnung {
public static void main(String[] args) throws IOException {
double seiteA, seiteB, ergebnis; int auftrag;
</code=java> Wir erstellen hier eine Klasse, die wir Flaechenberechnung nennen. In die main()-Methode setzen wir eine Vorlage:APIum Fehler, die bei Ein- oder Ausgabe passieren können, abzufangen und uns anzuzeigen. Danach deklarieren wir 4 Variablen, 3 vom Typ double und 1 vom Typ int.
2.
<code=java> InputStreamReader isr = new InputStreamReader( System.in ); BufferedReader br = new BufferedReader( isr ); </code=java> Jetzt erstellen wir neue Instanzen der Klassen Vorlage:APIund Vorlage:APIund übergeben 2 Parameter, ein mal System.in und dann isr. Wir haben gerade 2 Streams verwendet. Was sind eigentlich Streams? Streams sind Datenströme, die Informationen in jede Richtung übertragen können. Man kann Datenströme manipulieren, was wir gerade gemacht haben. Doch warum haben wir das gemacht? Wir haben einen InputStreamReader verwendet, um die Tasten, die wir eintippen werden, einzulesen, deshalb haben wir als Parameter Vorlage:APIeingegeben, was für Eingabe steht. Jedoch kann der InputStreamReader nur einzelne Zeichen einlesen, was sehr unbequem für uns ist, deshalb verwenden wir hier einen Puffer, der diese Zeichen als Strings speichert und den Datenstrom so lange offen hält, wie wir es wollen und erst dann die Daten sendet, sobald wir ihm das sagen.
3.
<code=java> PrintWriter pw = new PrintWriter( System.out, true); pw.println("Rechteckberechnung\n"); </code=java> Wir haben jetzt ein Stream für die Eingabe, wir brauchen aber noch ein Stream für die Ausgabe, damit wir etwas in der Konsole sehen können. Dafür können wir die Klasse Vorlage:APIverwenden. Wir erstellen eine neue Instanz dieser Klasse und übergeben 2 Parameter. Der erste Parameter ist für die Ausgabe und den zweiten Parameter brauchen wir um den Datenstrom nach jedem println anzustossen, da er sonst die Daten weitersammeln wird ohne die Ausgabe zu generieren. Danach greifen wir mit dem Punktoperator auf die Methoden der Klasse PrintWriter zu. Wir wollen etwas in der Konsole anzeigen, also nehmen wir die println()-Methode.
4.
<code=java> pw.println("Seite A eingeben: "); seiteA = Double.parseDouble( br.readLine() ); pw.println("Seite B eingeben: "); seiteB = Double.parseDouble( br.readLine() ); pw.println("<1> für Flächenberechnung, <2> für Umfangberechnung eingeben:"); auftrag = Integer.parseInt( br.readLine() ); </code=java> Erinnern Sie sich, dass unser BufferedReader Strings speichert? Unsere seiteA ist aber vom Typ double! Was können wir jetzt machen? Ganz einfach, wir "parsen". Das bedeutet, dass wir den String in ein double umwandeln müssen. Dafür benötigen wir die Klasse Vorlage:API, die die Klassenmethode parseDouble() besitzt. Als Parameter übergeben wir br.readLine(), also den String, der umgewandelt werden soll. Und dann speichern wir den Wert vom Typ double in die Variable seiteA. Mit seiteB und auftrag machen wir dasselbe, nur daß auftrag vom Typ int ist und wir für das "parsen" die Klasse Vorlage:APIbenötigen.
5.
<code=java> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; </code=java> Wenn wir Klassen verwenden wollen, müssen wir die zunächst importieren.
6.
<code=java> switch ( auftrag ) { case 1: { ergebnis = seiteA*seiteB; pw.println("Die Fläche beträgt "+ergebnis); break; } case 2: { ergebnis = 2*seiteA + 2*seiteB; pw.println("Der Umfang beträgt "+ergebnis); break; } default: pw.println("Leider verstehe ich Ihne eingabe nicht."); } </code=java> Jetzt kommen wir zu switch-case. Wir haben eine Abfrage, z.B: wenn die Farbe rot ist, dann schreibe "rot", sonst schreibe "nicht rot". In diesem Fall können wir if nehmen. Wenn wir aber 10 Abfragen haben, dann müssten wir 10 mal if schreiben, was sehr unbequem ist. In diesem Fall können wir switch-case verwenden. In den switch-Klammern steht unsere Variable die überprüft wird. Wenn die Variable eine Eins ist, dann wird der Block case 1 ausgeführt, wenn die Variable eine zwei ist, dann wird der Block case 2 ausgeführt, wenn die aber keine eins oder zwei ist, dann wird default Block ausgeführt. Warum haben wir bei case break verwendet? Break bedeutet "brich ab dieser Stelle ab und beende switch". Wenn wir break nicht reinschreiben, dann wird das Programm alle case Blöcke durchführen, was wir nicht wollen. Bei default brauchen wir kein break, da switch danach sowieso beendet wird.
Zufällige Begrüßung
<code=java> public class Begruessung {
public static void main(String[] args) {
String[] begruessung = { "Hallo", "Guten Tag", "Guten Morgen", "Guten Abend" };
int laenge = begruessung.length;
int zufallszahl = (int)Math.round( Math.random()*(laenge - 1) );
System.out.print(begruessung[zufallszahl]);
}
} </code=java>
Erklärung
Wir haben in diesem Beispiel zuerst ein String-Array erstellt, in das wir verschiedene Strings gespeichert haben. Danach haben wir mit Hilfe der length-Eigenschaft die Anzahl der Strings rausgekriegt. Vergessen Sie nicht, dass der erste String den Index 0 hat, der zweite String den Index 1 und so weiter. Danach haben wir eine Zufallszahl vom Typ int generiert, in dem wir die random()-Methode der Klasse Vorlage:APIverwendet haben. Da die random()-Methode double Werte von 0 bis 1 zurückgibt und wir int Werte von 0 bis 3 benötigen (unser Index), müssen wir diese double Werte mit der Variable laenge multiplizieren. Wir haben laenge -1 gemacht, weil unsere laenge den Wert 4 besitzt und unser Index nur bis 3 geht. Die random()-Methode nimmt dann eine zufällige Fließkommazahl von 0.0 bis 1.0 und multipliziert sie mit 3. Danach müssen wir unser Ergebnis runden und haben schon eine Zufallszahl generiert. Jetzt müssen wir nur noch die Zufallszahl in int umwandeln, weil unsere Variable vom Typ int ist. Dann geben wir unser String-Array aus und geben als Index unsere Zufallszahl ein. Fertig!