Einstieg in Java - Georg-August

Werbung
Informatik I - Einstiegskurs
Dr. Henrik Brosenne
Georg-August-Universität Göttingen
Institut für Informatik
Basiert auf dem Einstiegskurs im Wintersemester 2009/10 von
Markus Osterhoff
Wintersemester 2012/13
Inhalt
Einstiegskurs
Programmiersprachen
Bedingungen
Schleifen
Compilermeldungen, typische Fehler
Programmiersprachen
Programme sagen“ dem Computer, was er tun soll.
”
Aber wie sagt es der Benutzer?
Beispiel
Star Trek IV, Zurück in die Gegenwart
Scott:
Computer! Computer? Hallo Computer!
”
. . . Tastatur, wie rückständig!“
Editor – Compiler – Ausführung
Editor
Der Quellcode wird vom Programmierer in einem Editor geschrieben und als Datei
(datei.java) abgespeichert.
Compiler
Der Quellcode wird vom Compiler (javac) in einen Bytecode (datei.class)
übersetzt, der weitgehend betriebssystem- und plattformunabhängig ist, aber noch
kein maschinenverständliches Programm.
Java Virtual Machine (JVM)
Der Bytecode kann mit der JVM java ausgeführt werden. Das Programm wird
zur Laufzeit interpretiert und so auf der jeweiligen Maschine (Prozessor +
Betriebssystem) lauffähig.
Editor – Compiler – Ausführung
Quellcode
$ cat > Hallo.java
file: Hallo.java
class Hallo {
public static void
main(String args[]) {
System.out.println(
"Hallo Welt!"
);
javac Hallo.java
}
Bytecode
file: Hallo.class
0000000010011110100011111
0110110110000111010110010
1010101101110100001101111
1110000111101000010001001
1101000111010101110111011
0000011011010110111110100
0000000000010110010011010
1010000111101111010110011
1000110111000011011110000
}
Grundgerüst
java Hallo
Ausführung
HelloWorld
$ cat -n HelloWorld.java
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
$ javac HelloWorld.java
$ java HelloWorld
Hallo Einstiegswelt!
HelloWorld
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
class HelloWorld { ... }
eine Klasse“ mit dem Namen HelloWorld wird erstellt
”
HelloWorld
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
public static void main (...) { ... }
Dies ist das Hauptprogramm, der Einstiegspunkt.
Details zu dem unverständlichen Blah-Blah – in Info I.
HelloWorld
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
System.out.println("Hallo");
Eine Anweisung: Eine bestimmte Funktion, System.out.println, wird
aufgerufen. Ergebnis: Der Text wird ausgegeben.
HelloWorld
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
"Hallo Einstiegswelt!"
Dies ist ein String-Literal, ein im Quellcode hart eincodierter“ Text.
”
HelloWorld
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
"Hallo Einstiegswelt!"
Strings, Zeichenketten“, stehen in Anführungszeichen.
”
HelloWorld
1
2
class HelloWorld {
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
3
}
4
5
}
System.out.println( ... )
Dieser Aufruf einer Java-Bibliothek kann Texte und Zahlen ausgeben.
HalloKommentar
1
class Hall oKomment ar {
/* Hier beginnt das Hauptprogramm */
public static void main ( String [] args ) {
System . out . println ( " Hallo Einstiegswelt ! " );
// Wir haben eine Meldung ausgegeben
}
/* Hier endet das Hauptprogramm */
2
3
4
5
6
7
8
}
$ javac HalloKommentar.java
$ java HalloKommentar
Hallo Kommentar!
Zwischen /* und */ steht ein Kommentar; dieser ist für den Menschen und
wird vom Compiler ignoriert.
Alles ab // bis zum Zeilenende ist ebenfalls ein Kommentar.
HalloKommentar
Kommentare
dienen dem Programmierer, sich in seinem Wust von Programmzeilen
zurechtzufinden,
dienen anderen Programmierern, zu verstehen, was in einem Programm
passiert.
Erfahrungswert. Nach drei Wochen hat man alles über sein Programm vergessen,
egal wie gut man es mal kannte.
Möglichst gute Variablennamen.
Möglichst aussagekräftig kommentieren.
HalloGrafZahl
1
2
class HalloGrafZahl {
public static void main ( String [] args ) {
System . out . println ( " Hallo Graf Zahl ! " );
System . out . println (1337 + 42);
3
4
}
5
6
}
$ javac HalloGrafZahl.java
$ java HalloGrafZahl
Hallo Graf Zahl!
1379
HalloVariable
1
2
3
class HalloVariable {
public static void main ( String [] args ) {
int sieben = 7;
System . out . println ( sieben );
4
}
5
6
}
$ javac HalloVariable.java
$ java HalloVariable
7
int sieben = 7;
Eine Variable vom Typ int (Integer = Ganzzahl) wird angelegt und mit dem
Wert 7 initialisiert.
HalloFormel
1
2
3
4
5
class HalloFormel {
public static void main ( String [] args ) {
double pi = 3.14159;
int fuenf = 5;
double umfang ;
6
umfang = 2 * pi * fuenf ;
System . out . println ( " Umfang = " + umfang );
7
8
}
9
10
}
$ javac HalloFormel.java
$ java HalloFormel
Umfang = 31.4159
double pi = 3.14159;
Eine Variable vom Typ double (Gleitkommazahl) wird angelegt und mit dem
Wert 3.14159 initialisiert.
double umfang;
Eine Variable vom Typ double (Gleitkommazahl) wird angelegt.
HalloFormel
1
2
3
4
5
class HalloFormel {
public static void main ( String [] args ) {
double pi = 3.14159;
int fuenf = 5;
double umfang ;
6
umfang = 2 * pi * fuenf ;
System . out . println ( " Umfang = " + umfang );
7
8
}
9
10
}
$ javac HalloFormel.java
$ java HalloFormel
Umfang = 31.4159
umfang = 2 * pi * fuenf;
Die Berechnung wird ausgeführt, das Ergebnis wird in der Variablen umfang
gespeichert.
HalloFormel
1
2
3
4
5
class HalloFormel {
public static void main ( String [] args ) {
double pi = 3.14159;
int fuenf = 5;
double umfang ;
6
umfang = 2 * pi * fuenf ;
System . out . println ( " Umfang = " + umfang );
7
8
}
9
10
}
$ javac HalloFormel.java
$ java HalloFormel
Umfang = 31.4159
System.out.println("Umfang" + umfang);
Die Addition“ von einem String mit einer Zahl ist ein String.
”
Die Zahl wird als Zeichenkette im Zehnersystem dargestellt.
Vorsicht, Fallen!
Java achtet auf Groß- und Kleinschreibung
Linux achtet auf Groß- und Kleinschreibung
$ javac programmdatei.java — Endung!
$ java klassenname — keine Endung!
Konzepte: Variablen, Datentypen
Ein Programm, in dem alle Zahlen fest einprogrammiert sind, ist langweilig.
Der Benutzer muss Eingaben machen können / es müssen Dateien eingelesen
werden können.
Zwischenergebnisse müssen gespeichert werden.
→ Variablen ≡ benannte Speicherbereiche
Es gibt unterschiedliche Arten von Zahlen“
”
Zum Beispiel ganze Zahlen (int) und Gleitkommazahlen (double).
Es gibt auch Zeichenketten (String) und Boolsche Ausdrücke (bool: true,
false).
→ Datentypen
Konstanten
int: Ganze Zahlen, dezimale Schreibweise, keine Anführungszeichen:
1 , 42 , -17
double: Reelle zahlen“, Punkt statt Komma:
”
3.14159 , -17.5 , 0.0
String: Zeichenketten zwischen Anführungszeichen:
"Hallo Welt" , "3.14159" , ""
Der Wert steht zur Compile-Zeit fest.
Variablen
Deklaration:
double PI;
Zuweisung:
PI = 3.14159;
Deklaration + Zuweisung (Initialisierung):
double E = 2.718;
Bei einem String:
String grussworte = "Liebe Programmierer";
Variablen
Und was kann man damit machen?
Ausgeben:
String grussworte = "Liebe Programmierer";
System.out.println(grussworte);
Neu zuweisen:
int ganzeZahl = 3;
ganzeZahl = 42;
Rechnen!
Operatoren
Rechnen!
Java kennt natürlich die vier Grundrechenarten“:
”
int b, c, summe, differenz, produkt, quotient;
oder alternativ:
double b, c, summe, differenz, produkt, quotient;
summe = b+c;
differenz = b-c;
produkt = b*c;
quotient = b/c;
Operatoren
summe = b+c;
differenz = b-c;
produkt = b*c;
quotient = b/c;
Der Wert, der aktuell in der Variablen b gespeichert ist, wird abgerufen.
Der Wert, der aktuell in der Variablen c gespeichert ist, wird abgerufen.
Die mathematische Operation wird ausgeführt.
Das Ergebnis wird in der Variablen (z.B. summe) gespeichert –
der Variablen wird ein neuer Wert zugewiesen.
Der Zuweisungsoperator
int b = 3, c = 7;
int summe = 11;
summe = b+c;
Der Zuweisungsoperator ist kein mathematisches Gleichheitszeichen!
Es wird zugewiesen; der Wert von summe spielt keine Rolle!
Dies ist kein Vergleich!
Inkrement-/Dekrementoperatoren
int i = 1;
i = i+1;
i++;
In Zählschleifen wird eine Variable bei jedem Durchlauf um 1 erhöht.
Dies ist relativ viel zu schreiben, kommt sehr häufig vor – es gibt eine
abkürzende Schreibweise, die (fast) jeder Programmierer versteht:
i++
Der Wert der Variablen i wird ausgelesen; es wird 1 addiert; das Ergebnis
wird der Variablen i zugewiesen.
Analog: i--
Operatoren mit Strings
String text = "Das Ergebnis lautet "
double radius = 5;
double umfang = 2*3.14159*radius;
System.out.println( text + umfang );
Die Addition“ von Zeichenketten ist die Konkatenation“ (das
”
”
Aneinanderhängen)
Die Addition“ von Zeichenketten mit Zahlen ist das Anhängen der
”
dezimalen Schreibweise der Zahl an den String.
Inhalt
Einstiegskurs
Programmiersprachen
Bedingungen
Schleifen
Compilermeldungen, typische Fehler
Bedingungen
Java-Programme werden Anweisung für Anweisung ausgeführt:
tue dies; tue das; nun dies; mache jenes; rechne aus; gib aus;
Man braucht Kontrollstrukturen
Alternativen (Abzweigungen, Entscheidungen)
Wiederholungen (Schleifen)
Alternativen
Alternativen
tue dies; tue das; nun dies;
WENN dieseBedingungErfülltIst: tueDieses; SONST: tueJenes;
mache jenes; rechne aus; gib aus;
Alternativen
tue dies;
tue das;
tue jenes;
if ( x == 1 )
{
tue dies hier;
und das noch;
und jenes;
}
else
{
oder halt dies;
und dann das;
und schließlich mich;
}
und immer das hier;
und dann auch noch dieses;
höre auf;
Alternativen
Alternative if -- else
1
2
3
4
class ifelsetest {
public static void main () {
int a = 3;
int b = 7;
5
if ( a == b )
6
7
else
8
System . out . println ( " a und b sind anders " );
9
}
10
11
System . out . println ( " a und b sind gleich " );
}
Nur wenn die Bedingung erfüllt (== true) ist, wird die nächste Anweisung
ausgeführt.
Ist die Bedingung jedoch nicht erfüllt (== false), wird die Anweisung
übersprungen. Stattdessen wird die Anweisung hinter else ausgeführt.
Alternativen
Der else-Zweig ist optional:
1
2
3
4
class iftest {
public static void main () {
int m = 3;
int n = 7;
5
if ( m < n )
6
System . out . println ( " m ist kleiner als n . " );
7
}
8
9
}
Nach if bzw. else wird genau eine Anweisung ausgeführt.
Ist das nicht meistens zu wenig?
Ein Block von Anweisungen ist eine Anweisung.“
”
Mehrere Anweisungen lassen sich zu einem Block zusammenfassen.
Alternativen
Mehrere Anweisungen lassen sich zu einem Block zusammenfassen:
1
2
3
class Block {
public static void main ( String [] args ) {
if ( 1 == 2 ) {
System . out . println ( " 1 ist gleich 2. " );
System . out . println ( " Das ist falsch . " );
4
5
}
6
else {
7
System . out . println ( " 1 ist ungleich 2. " );
System . out . println ( " Das ist richtig . " );
8
9
}
10
}
11
12
}
$ javac block.java ; java Block
1 ist ungleich 2.
Das ist richtig.
Ein Block wird durch geschweifte Klammern definiert.
Auch die Klassendefinition und die Main-Funktion sind ein Block!
Der Vergleichsoperator
Erinnerung: Der Zuweisungsoperator, =
int b = 3, c = 7;
int summe = 11;
summe = b+c;
Die Zuweisung wird ausgeführt, es findet kein Vergleich statt.
Neu: Der Vergleichsoperator, ==
if ( summe == b+c ) ...else ...
Inhalt
Einstiegskurs
Programmiersprachen
Bedingungen
Schleifen
Compilermeldungen, typische Fehler
Konzepte: Schleifen
Eine Alternativen kann die eine oder die andere Anweisung einmal ausführen.
Eine Schleife kann eine Anweisung (oder einen Block von Anweisungen)
mehrmals ausführen.
Beispiel
1
2
3
4
5
class Nullkommaeins {
public static void main ( String [] args ) {
double nke = 0.1;
double sum = 0.0;
int i ;
6
for ( i =0; i <10; i ++)
7
sum = sum + nke ;
8
9
System . out . println ( " Summe : " + sum );
10
}
11
12
}
Konzepte: Schleifen
;
for ( i=0 ; i<10 ; i++ )
vor der Schleife
System.out.println( i );
;
Initialisierung
Schleifen-Bedingung
Erhöhung
des Zählers
Schleifen-Durchlauf
nach der Schleife
Konzepte: Schleifen
for ( i=0 ; i<10 ; i++ )
anweisung;
for wird typischerweise für Zählschleifen verwendet:
i=0 — ein Index (Zählvariable) wird initialisiert
i<10 — solange eine Bedingung erfüllt ist, wird
anweisung; — die Anweisung (oder der Block) wiederholt
i++ — nach jedem Schleifendurchlauf (vor dem nächsten Test der
Bedingung) wird der Wert von i um 1 erhöht
Schleifen: Beispiele
for ( i=0 ; i<10 ; i++ )
System.out.println( i );
Die Zahlen von 0 bis 9 werden zeilenweise ausgegeben.
Schleifen: Beispiele
for ( i=10 ; i>0 ; i-- )
System.out.println( i );
Die Zahlen von 10 bis 1 werden zeilenweise ausgegeben.
Schleifen: Beispiele
for ( i=10 ; i>0 ; i-- )
System.out.println( 2*i + 1 );
Die Zahlen von 21 bis 3 werden in Zweierschritten zeilenweise ausgegeben.
Schleifen: Beispiele
for ( i=1 ; i<11 ; i++ )
System.out.println( i + " " + 2*i );
Es werden immer zwei Zahlen nebeneinander ausgegeben,
die erste zählt von 1 bis 10
die zweite zählt in Zweierschritten von 2 bis 20.
weitere Schleifen
while (bedingung) ...
Ähnlich zu for, aber nur ein Argument
do ... while (bedingung);
Ähnlich zu while, aber Test nach dem Durchlauf
for (String s: args) ...
Ein Iterator über ein Feld von Objekten
Inhalt
Einstiegskurs
Programmiersprachen
Bedingungen
Schleifen
Compilermeldungen, typische Fehler
Compilermeldungen, typische Fehler
KLASSE.java:1: class, interface, or enum expected
CLASS KLASSE {
class wird klein geschrieben
Compilermeldungen, typische Fehler
KLASSE.java:2: ’;’ expected
PUBLIC STATIC VOID main(String[] args) {
public static void wird klein geschrieben
Compilermeldungen, typische Fehler
KLASSE.java:6: not a statement
for (i=0, i<13; i++)
Semikolon, kein Komma
Compilermeldungen, typische Fehler
KLASSE.java:7: not a statement
for (j==i; j>0; j--)
Zuweisungsoperator!
Compilermeldungen, typische Fehler
KLASSE.java:13: ’)’ expected
System.out.println("Ergebnis: " result);
KLASSE.java:13: illegal start of expression
System.out.println("Ergebnis: " result);
Konkatenation mit ’+’
Compilermeldungen, typische Fehler
7
public static int xxx ( int m , int n ) {
if ( m == 0)
return 1;
if ( n == 0)
return 2;
if ( m != 0 && n != 0)
return 3;
8
}
1
2
3
4
5
6
fehler2.java:8: missing return statement
javac erkennt nicht die Logik:
das dritte if ist automatisch erfüllt
Herunterladen