Skriptum - Georg von Peuerbach Gymnasium

Werbung
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
Herunterladen