Programmieren in Java mit JBuilder - Einführung Jede Programmiersprache verfügt über eine eigene „Grammatik“ (Syntax), d.h. eine fix vorgegebene Anzahl an verfügbaren Wörtern, die nur in bestimmter Weise verwendet werden dürfen, damit das Programm den Text übersetzen kann. Wie bei jeder Sprache ist es wichtig, möglichst viele von diesen „Vokabeln“ zu kennen. Grundsätzlicher Aufbau eines Java-Programmes: package Klasse5; Name des Packages, in dem sich Dieses Package heißt Klasse5 das Programm befindet class Hallowelt extends basic { Die einzelnen Programme werden als Klassen bezeichnet. Verwendet eine Klasse Befehle einer anderen Klasse, muss dies mit extends angegeben werden. Eine Klasse besteht aus Methoden. Links wird eine Klasse mit dem Namen Hallowelt erzeugt, die eine Klasse mit dem Namen basic verwendet. Anweisungen Hier stehen Befehle, die Zeile für Zeile ausgeführt werden. public static void main(String[] args) { .... } Die Methode main muss immer vorhanden sein und wird als erste ausgeführt. Programmende } Vorarbeiten: Package, Klasse anlegen Anlegen eines Packages: Datei/Neues Projekt Projektname: Klasse5 Stammpfad: euer Ordner/java Anlegen einer Klasse: Datei/Neu Package: Klasse5 Klassenname: Hallowelt Nur „main-Methode generieren“ anhaken Die vordefinierte Klasse basic muss importiert werden: Datei/Neu, Package: Klasse5; Klassenname: basic; Danach Quellcode löschen und Quelltext von basic.txt hineinkopieren. Das erste Programm – Hallo Welt package Klasse5; // Package mit dem Namen Klasse5 public class Hallowelt extends basic { // // // // // // // public static void main(String[] args){ out.writeln("Hallo Welt!"); } } Klasse Hallowelt; verwendet die Klasse basic Beginn der Anweisungen der Klasse Hallowelt Methode main Beginn der Anweisungen der Methode main Ausgabe des Satzes "Hallo Welt!“ Ende der Anweisungen der Methode main Ende der Anweisungen der Klasse Hallowelt Achte auf die öffnenden und schließenden geschwungenen Klammern! Kommentare werden mit // begonnen. Mehrzeilige Kommentare stehen zwischen /* und */ Start des Programms Start/Konfigurationen/<vorgabe> Bearbeiten/Hauptklasse Klasse5.Hallowelt einstellen. Dann Start/Projekt ausführen. Der Compiler übersetzt nun den Quellcode in Maschinencode (Binärcode), meldet eventuelle Fehler und startet das Programm, falls keine Fehler gefunden wurden. Übung: Ergänze das Programm so, dass noch einige weitere Zeilen mit Text ausgegeben werden. Einfache Variablentypen Für Variable können fast beliebige Bezeichnungen (Variablennamen) vergeben werden. Sie müssen allerdings mit einem Buchstaben beginnen, dürfen keine Leerzeichen oder Punkte enthalten und dürfen nicht identisch mit einem reservierten Schlüsselwort sein (z.B.: class). Außer dem Variablennamen muss auch der Variablentyp festgelegt werden. Durch den Variablentyp wird der erforderliche Speicherplatz reserviert und außerdem die Art der Interpretation der Binärzahl festgelegt. Name byte short int long Art ganze Zahl ganze Zahl ganze Zahl ganze Zahl kleinster Wert –128 –32.768 –2.147.483.648 –9.223.372.036.854.775.808 double Fließkommazahl Genauigkeit: -1,7976931348623157E+308 bis 17 Stellen char String einzelnes Zeichen Zeichenkette bis bis bis bis größter Wert +127 +32.767 +2.147.483.647 +9.223.372.036.854.775.807 Größe 1 Byte 2 Byte 4 Byte 8 Byte +1,7976931348623157E+308 8 Byte Unicode-Zeichensatz aus 65.536=216 verschiedenen Zeichen 2 Byte beliebige Aneinanderfügung von Zeichen (Achtung: Großschreibung) boolean Boolescher Wert true oder false 1 Bit Ein- und Ausgabe Ausgabe: out.write("Hallo"); out.writeln("Hallo"); schreibt das Wort "Hallo“ auf den Bildschirm schreibt das Wort "Hallo“ auf den Bildschirm und geht in die nächste Zeile Eingabe: wort=in.readline(); zahl=in.readint(); in.read(); zeichen=in.read(); Weist der String-Variablen wort die eingegebene Zeichenkette zu Weist der Int-Variablen zahl die eingegebene Zahl zu Weist der Char-Variablen zeichen das eingegebene Zeichen zu durch in.read(); werden Eingaben im Tastaturspeicher gelöscht Beispiel: Programm EinAus package klasse5; class EinAus extends basic { public static void main(String[] args){ String vorname,nachname; int alter; char geschlecht; // Variablendeklaration out.write("Geben Sie Ihren Vornamen ein: "); vorname = in.readline(); // Eingabe eines Strings out.write("Geben Sie Ihren Nachnamen ein: "); nachname = in.readline(); out.write("Geben Sie Ihr Alter ein: "); alter = in.readint(); // Eingabe einer ganzen Zahl out.write("Geben Sie Ihr Geschlecht ein (m/w): "); in.read(); geschlecht = in.read(); // Eingabe eines einzelnen Zeichens out.writeln(); out.writeln("Hallo "+vorname+" " +nachname); out.writeln("Sie sind "+alter+" Jahre alt"); out.writeln("Ihr Geschlecht: "+geschlecht); out.writeln("Ich wünsche Ihnen einen schönen Tag"); } } Übung: Schreibe ein Programm Adresse, das nach Namen, Adresse und Telefonnummer fragt und diese Daten dann wieder ausgibt. Programmieren in Java mit JBuilder – Einführung Seite 2 Grundrechenoperationen Beispiel: Programm ZweiZahlen Das Programm soll Summe, Differenz, Produkt und Quotient von zwei eingegebenen Zahlen berechnen und ausgeben. Grundrechenoperationen: +...Addition, -...Subtraktion, *...Multiplikation, /...Division Deklariere die Eingabevariablen zunächst als int, danach als double. Was ändert sich? Sind a und b als int deklariert, dann lautet die Anweisung für den Quotienten: q = (double) a/b; // Explizite Typumwandlung, da sonst zuerst das Ergebnis von a/b in int // umgewandelt und erst dann der Variable q zugewiesen wird IF – Bedingung / Logische Verknüpfungen Um im Programm ZweiZahlen einen Absturz bei der Eingabe eines Nenners mit dem Wert 0 zu vermeiden, muss das Programm um eine IF-Bedingung erweitern. Syntax 1: if (Bedingung) { Anweisungen; } Wenn Bedingung zutrifft, dann erledige Anweisungen Syntax 2: if (Bedingung) { Anweisungen1; } else { Anweisungen2; } Wenn Bedingung zutrifft, dann erledige Anweisungen1, ansonsten erledige Anweisungen2 Für die Bedingungen benötigt man Vergleichsoperatoren und logische Verknüpfungen: == != && || Gleichheit Ungleichheit Logisches UND Logisches ODER if if if if (b == 0) ... (b != 0) ... ( (x > 1) && (x <=10) ) ... ( (x < 0) || (x >= 10) ) ... Beide Bedingungen müssen erfüllt sein Eine Bedingung muss erfüllt sein Beispiel: if (b != 0) { q = a/b; } if (b == 0) { out.writeln("Division durch 0!"); } else { out.writeln("a / b = "+q); } Übungen: Ergänze das Programm EinAus so, dass bei einer Alterseingabe alter<20 ausgegeben wird: „Du bist noch grün hinter den Ohren!“, ansonsten „Du bist ein alter Knacker!“ if (alter<20) { out.writeln("Sie sind noch grün hinter den Ohren!"); } else { out.writeln("Sie sind ein alter Knacker!"); } Verzweigung bei der Geschlechtseingabe: wenn weiblich: "name ist eine alter-jährige Frau“, wenn männlich: "name ist ein alter-jähriger Mann“. Der Benutzer soll seine Größe in cm eingeben. Ausgabe: wenn groesse>170, dann "Sie sind schon groß!“, sonst "Sie können noch wachsen.“ Programmieren in Java mit JBuilder – Einführung Seite 3 Ein Programm ZahlPrüfen soll überprüfen, ob eine eingegebene Zahl zwischen 100 und 1000 liegt. Bei der Ausgabe sollen alle drei Fälle (zahl<100, zahl>1000, zahl dazwischen) unterschieden werden. if ( (zahl>=100) && (zahl<=1000) ) ...// beide Vergleiche müssen eingeklammert werden! else ... // zusätzlich wird die gesamte Bedingung geklammert! Ein Programm Kilometer soll Kilometerangaben in Meilen umrechnen (1 Meile = 1,524 km). Erweitere das Programm so, dass der Benutzer zu Beginn aussuchen kann ob er km in Meilen oder Meilen in km umrechnen will. Diese Auswahl soll über eine Menü-Auswahl getroffen werden: 1...Eingabe in km, Ausgabe in Meilen 2...Eingabe in Meilen, Ausgabe in km Wenn der Benutzer nun das entsprechende Zeichen (Typ char) eingibt, passiert das jeweils Angegebene. if ((auswahl=='1') || (auswahl=='2')) { if (auswahl=='1') {…} // in allen anderen Fällen wird // der ganze Block übersprungen // Eingabe in km, Ausgabe in Meilen if (auswahl=='2') {…} // Eingabe in Meilen, Ausgabe in km } else {out.writeln("Falsche Eingabe! Programm beendet");} // Falsche Eingabe Ein Programm Vokal soll nach Eingabe eines Zeichens feststellen, ob das Zeichen ein Konsonant oder ein Vokal ist: if ((zeichen=='a') || (zeichen=='A') || (zeichen=='e') || ... || (zeichen=='U')) else {...} {...} Ein Programm Celsius soll Fahrenheitsgrade in Celsiusgrade umrechnen. Dabei gilt: °C=(°F–32)*5/9. Verwende die Variablen celsius und fahrenheit vom Typ double. Erweitere das Programm so, dass man in beide Richtungen umrechnen kann (vgl. Bsp Kilometer) Erweitere das Programm so, dass bei Temperaturen kleiner oder gleich 0 Grad Celsius zusätzlich der Text „Achtung: Glatteisgefahr“ erscheint. Ein Programm KlFormel soll die Lösungen der quadratischen Gleichung der Form x px q 0 berechnen. Das Programm soll nach der Eingabe von p und q die Lösungen der Gleichung ausgeben. Achte auf die Fallunterscheidungen ( Diskriminante!). Zeichne ein Strukogramm (vgl. JavaWeb)! 2 1 2 3 if (diskriminante>0) { out.writeln("Es gibt 2 Lösungen"); x1=-p/2.0+Math.sqrt(diskriminante); x2=...; out.writeln("1. Lösung: "+x1); ... } else { if (diskriminante==0) { out.writeln("Es gibt 1 Lösung"); .... } if (diskriminante<0) { out.writeln("Es gibt keine Lösung"); } } Programmieren in Java mit JBuilder – Einführung // 1. Fall: Diskriminante >0 // x1 und x2 sind Variable vom Typ double // Ausgabe der 1. Lösung // Ende IF-Zweig // wenn also die Diskriminante nicht >0 ist // 2. Fall: Diskriminante =0 // 3. Fall: Diskriminante <0 // Ende ELSE-Zweig Seite 4 Schleifen Die For-Schleife: Diese Schleife ist günstig, wenn man die Anzahl der Durchläufe kennt. Syntax: for ( Zählvariableninitialisierung; Abbruchbedingung; Hochzählanweisung ) { Anweisungen; } Programm Quadrat: Es werden die Quadratzahlen von 02 bis 1002 berechnet und ausgegeben for (i=0; i<=100; i++) { // Initialisierung von i (i ist zu Beginn 0) // Abbruchbedingung (Wiederholung solange i<=100) // Hochzählanweisung (i wird pro Durchlauf um 1 erhöht) quadrat=i*i; out.writeln(i+" zum Quadrat ist "+quadrat); } // Berechnung der Quadratzahl // Ausgabe // Ende der For-Schleife Will man pro Durchlauf nicht um 1 erhöhen, kann man andere Hochzählanweisungen verwenden. Beispiele: i+=2 oder i=i+2 Erhöhung um 2 i-=1 oder i=i-1 Reduzierung um 1 i-=3 oder i=i-3 Reduzierung um 3 Achte stets darauf, dass die Abbruchbedingung auch irgendwann erfüllt wird. Folgende Schleife würde nie abgebrochen werden (Endlosschleife): for (i=100; i != 1; i-=2) {...} // Der Wert 1 wird nie angenommen Programm Summe: Es soll die Summe der geraden Zahlen von 2 bis 100 berechnet werden. Die While-Schleife Bei dieser Schleife sind die Intitialisierung und die Abbruchbedingung nicht so kompakt beieinander: Syntax: Initialisierung der Zählvariable; while (Abbruchbedingung) { Anweisungen; Hochzählanweisung; } Programm Funktion: Berechnung der Funktionswerte der Fkt. y=x2–3 im Intervall [–2;2] in Abständen von 0.1 x=-2.0; while (x<=2.0) { y=Math.pow(x,2.0)-3.0; out.writeln(x+"/"+y); x=x+0.1; } // // // // // // Initialisierung der Zählvariable Abbruchbedingung Berechnung des y-Wertes Ausgabe Hochzählanweisung Ende der while-Schleife Bemerkungen: Math.pow(a,b)...Funktion zur Berechnung von ab Startet man das Programm mit dem Quellcode wie oben, sieht man, wie schnell Rundungsfehler in der 16. Nachkommastelle auftreten. Eine bessere Ausgabe erhält man über formatierte Ausgabe: import java.text.*; // gleich nach package klasse5; // importiert alle Klassen des packages java.text ... NumberFormat f=new DecimalFormat("###,##0.00"); // // // // ... out.writeln(f.format(x)+"/"+f.format(y)); // Programmieren in Java mit JBuilder – Einführung z.B. nach der Variablendeklaration; Formatierung: mind. eine Stelle vor dem Komma, genau 2 Nachkommastellen formatierte Ausgabe Seite 5 Übungen zur For- und While-Schleife: Ein Programm Teilbar soll alle Zahlen von 1 bis 100 aufzählen, die durch 7 teilbar sind. Allgemein: ...alle Zahlen von 1 bis zu einer wählbaren Zahl n, die durch eine wählbare Zahl t teilbar sind. Verwende dazu die Modulo-Division: r= i % t; (r ist der Rest, der bei Division von i durch t bleibt) Ein Programm CelsiusTab soll Celsiusgrade in Fahrenheitsgrade umrechnen und umgekehrt. Die Umrechnungsformel lautet °C=(°F–32)*5/9. Es soll jeweils eine Tabelle ausgegeben werden, von der man die entsprechenden Werte ablesen kann. Ein Programm Primzahl soll nach Eingabe einer Zahl überprüfen, ob diese Zahl eine Primzahl ist. Verwende dazu wieder die Modulo-Division. Grundalgorithmus: boolean prim; ... prim=true; for (i=2;i<zahl;i++) { r=zahl % i; if (r==0) {prim=false;} } // Deklaration der Boolean-Variable prim // Initialisierung der Variable prim // r ist der Rest bei Division von zahl durch i // wenn r=0, dann teilbar, also keine Primzahl if (prim==true) {out.writeln(zahl+" ist eine Primzahl");} else {out.writeln(zahl+" ist keine Primzahl");} // Ausgabe Überlege, wie man den Algorithmus optimieren kann. Optimierung 1: Gerade Zahlen müssen überhaupt nicht geprüft werden. Die Prüfung soll außerdem abgeschlossen werden, sobald ein Teiler gefunden ist (break). for (i=3;i<zahl;i+=2) {… if (r==0) {prim=false; break;} // nur ungerade Teiler werden geprüft // Unterbrechung, sobald prim=false (Teiler gefunden) Optimierung2: Es muss nicht bis zahl-1 geprüft werden, sondern es genügt, bis wurzel=Math.sqrt(zahl); ... for (i=3;i<=wurzel;i+=2) { zahl zu rechnen! // Berechnung von Wurzel(zahl) // nur ungerade Teiler werden geprüft; nur bis zur Wurzel Folgende Zeiten wurden bei einem Testlauf gemessen: Zahl Grundalgorithmus 999 999 937 (prim) 40 sec. 999 999 938 (gerade) 40 sec. 999 999 943 (=5 623*177 841) 40 sec. 100 000 980 001 501 46 Tage (=10 000 019*10 000 079) 100 000 000 000 031 (prim) 46 Tage Optimierung 1 20 sec. 0 sec. 0 sec. 1 sec. Optimierung 2 0 sec. 0 sec. 0 sec. 0 sec. 23 Tage 0 sec. Ein Programm PrimAufzaehlen soll nach Eingabe von Start- und Endzahl alle Primzahlen dazwischen aufzählen. Programmieren in Java mit JBuilder – Einführung Seite 6 Struktogramm für das Programm KlFormel (vgl. JavaWeb) Ausgabe erklärender Text (was macht das Programm?) Eingabeaufforderung p Eingabeaufforderung p Berechnung der Diskriminante Diskriminante>0 wahr falsch Diskriminante=0 wahr falsch Ausgabe: Ausgabe: Ausgabe: "2 Lösungen" "1 Lösung" "keine Lösung" Berechnung x1, x2 Berechnung x1 Ausgabe x1, x2 Ausgabe x1 Programmieren in Java mit JBuilder – Einführung Seite 7