View
219
Download
0
Category
Preview:
Citation preview
Informatik I - Einstiegskurs
Dr. Henrik BrosenneGeorg-August-Universitat Gottingen
Institut fur Informatik
Basiert auf dem Einstiegskurs im Wintersemester 2009/10 vonMarkus Osterhoff
Wintersemester 2012/13
Inhalt
EinstiegskursProgrammiersprachenBedingungenSchleifenCompilermeldungen, typische Fehler
Programmiersprachen
Programme”sagen“ dem Computer, was er tun soll.
Aber wie sagt es der Benutzer?
Beispiel
Star Trek IV, Zuruck in die Gegenwart
Scott:
”Computer! Computer? Hallo Computer!
. . . Tastatur, wie ruckstandig!“
Editor – Compiler – Ausfuhrung
EditorDer Quellcode wird vom Programmierer in einem Editor geschrieben und als Datei(datei.java) abgespeichert.
CompilerDer Quellcode wird vom Compiler (javac) in einen Bytecode (datei.class)ubersetzt, der weitgehend betriebssystem- und plattformunabhangig ist, aber nochkein maschinenverstandliches Programm.
Java Virtual Machine (JVM)Der Bytecode kann mit der JVM java ausgefuhrt werden. Das Programm wirdzur Laufzeit interpretiert und so auf der jeweiligen Maschine (Prozessor +Betriebssystem) lauffahig.
Editor – Compiler – Ausfuhrung
Ausführung
Quellcode
class Hallo { public static void main(String args[]) {
System.out.println( "Hallo Welt!" ); }}
file: Hallo.java
Bytecode
000000001001111010001111101101101100001110101100101010101101110100001101111111000011110100001000100111010001110101011101110110000011011010110111110100000000000001011001001101010100001111011110101100111000110111000011011110000
file: Hallo.class
$ cat > Hallo.java
javac Hallo.java
java Hallo
Grundgerüst
HelloWorld
$ cat -n HelloWorld.java
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
$ javac HelloWorld.java
$ java HelloWorld
Hallo Einstiegswelt!
HelloWorld
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
class HelloWorld { ... }
eine”Klasse“ mit dem Namen HelloWorld wird erstellt
HelloWorld
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
public static void main (...) { ... }
Dies ist das Hauptprogramm, der Einstiegspunkt.
Details zu dem unverstandlichen Blah-Blah – in Info I.
HelloWorld
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
System.out.println("Hallo");
Eine Anweisung: Eine bestimmte Funktion, System.out.println, wirdaufgerufen. Ergebnis: Der Text wird ausgegeben.
HelloWorld
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
"Hallo Einstiegswelt!"
Dies ist ein String-Literal, ein im Quellcode”hart eincodierter“ Text.
HelloWorld
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
"Hallo Einstiegswelt!"
Strings,”Zeichenketten“, stehen in Anfuhrungszeichen.
HelloWorld
1 class HelloWorld {
2 public static void main (String [] args) {
3 System.out.println("Hallo Einstiegswelt!");
4 }
5 }
System.out.println( ... )
Dieser Aufruf einer Java-Bibliothek kann Texte und Zahlen ausgeben.
HalloKommentar
1 class HalloKommentar {
2 /* Hier beginnt das Hauptprogramm */
3 public static void main (String [] args) {
4 System.out.println("Hallo Einstiegswelt!");
5 // Wir haben eine Meldung ausgegeben
6 }
7 /* Hier endet das Hauptprogramm */
8 }
$ javac HalloKommentar.java
$ java HalloKommentar
Hallo Kommentar!
Zwischen /* und */ steht ein Kommentar; dieser ist fur den Menschen undwird vom Compiler ignoriert.
Alles ab // bis zum Zeilenende ist ebenfalls ein Kommentar.
HalloKommentar
Kommentare
dienen dem Programmierer, sich in seinem Wust von Programmzeilenzurechtzufinden,
dienen anderen Programmierern, zu verstehen, was in einem Programmpassiert.
Erfahrungswert. Nach drei Wochen hat man alles uber sein Programm vergessen,egal wie gut man es mal kannte.
Moglichst gute Variablennamen.
Moglichst aussagekraftig kommentieren.
HalloGrafZahl
1 class HalloGrafZahl {
2 public static void main (String [] args) {
3 System.out.println("Hallo Graf Zahl!");
4 System.out.println (1337 + 42);
5 }
6 }
$ javac HalloGrafZahl.java
$ java HalloGrafZahl
Hallo Graf Zahl!
1379
HalloVariable
1 class HalloVariable {
2 public static void main (String [] args) {
3 int sieben = 7;
4 System.out.println( sieben );
5 }
6 }
$ javac HalloVariable.java
$ java HalloVariable
7
int sieben = 7;
Eine Variable vom Typ int (Integer = Ganzzahl) wird angelegt und mit demWert 7 initialisiert.
HalloFormel
1 class HalloFormel {
2 public static void main (String [] args) {
3 double pi = 3.14159;
4 int fuenf = 5;
5 double umfang;
6
7 umfang = 2 * pi * fuenf;
8 System.out.println( "Umfang = " + umfang );
9 }
10 }
$ javac HalloFormel.java
$ java HalloFormel
Umfang = 31.4159
double pi = 3.14159;
Eine Variable vom Typ double (Gleitkommazahl) wird angelegt und mit demWert 3.14159 initialisiert.
double umfang;
Eine Variable vom Typ double (Gleitkommazahl) wird angelegt.
HalloFormel
1 class HalloFormel {
2 public static void main (String [] args) {
3 double pi = 3.14159;
4 int fuenf = 5;
5 double umfang;
6
7 umfang = 2 * pi * fuenf;
8 System.out.println( "Umfang = " + umfang );
9 }
10 }
$ javac HalloFormel.java
$ java HalloFormel
Umfang = 31.4159
umfang = 2 * pi * fuenf;
Die Berechnung wird ausgefuhrt, das Ergebnis wird in der Variablen umfang
gespeichert.
HalloFormel
1 class HalloFormel {
2 public static void main (String [] args) {
3 double pi = 3.14159;
4 int fuenf = 5;
5 double umfang;
6
7 umfang = 2 * pi * fuenf;
8 System.out.println( "Umfang = " + umfang );
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 konnen / es mussen Dateien eingelesenwerden konnen.
Zwischenergebnisse mussen 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 Ausdrucke (bool: true,
false).
→ Datentypen
Konstanten
int: Ganze Zahlen, dezimale Schreibweise, keine Anfuhrungszeichen:
1 , 42 , -17
double:”Reelle zahlen“, Punkt statt Komma:
3.14159 , -17.5 , 0.0
String: Zeichenketten zwischen Anfuhrungszeichen:
"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 naturlich 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 ausgefuhrt.
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 Zahlschleifen wird eine Variable bei jedem Durchlauf um 1 erhoht.
Dies ist relativ viel zu schreiben, kommt sehr haufig vor – es gibt eineabkurzende Schreibweise, die (fast) jeder Programmierer versteht:
i++
Der Wert der Variablen i wird ausgelesen; es wird 1 addiert; das Ergebniswird 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
Aneinanderhangen)
Die”Addition“ von Zeichenketten mit Zahlen ist das Anhangen der
dezimalen Schreibweise der Zahl an den String.
Inhalt
EinstiegskursProgrammiersprachenBedingungenSchleifenCompilermeldungen, typische Fehler
Bedingungen
Java-Programme werden Anweisung fur Anweisung ausgefuhrt: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 dieseBedingungErfulltIst: tueDieses; SONST: tueJenes;
mache jenes; rechne aus; gib aus;
Alternativen
tue dies;tue das;tue jenes;
if ( x == 1 )
else
und immer das hier;und dann auch noch dieses;
höre auf;
{tue dies hier;und das noch;und jenes;
}
{oder halt dies;und dann das;
und schließlich mich;}
Alternativen
Alternative if -- else
1 class ifelsetest {
2 public static void main () {
3 int a = 3;
4 int b = 7;
5
6 if (a == b)
7 System.out.println("a und b sind gleich");
8 else
9 System.out.println("a und b sind anders");
10 }
11 }
Nur wenn die Bedingung erfullt (== true) ist, wird die nachste Anweisungausgefuhrt.
Ist die Bedingung jedoch nicht erfullt (== false), wird die Anweisungubersprungen. Stattdessen wird die Anweisung hinter else ausgefuhrt.
Alternativen
Der else-Zweig ist optional:
1 class iftest {
2 public static void main () {
3 int m = 3;
4 int n = 7;
5
6 if (m < n)
7 System.out.println("m ist kleiner als n.");
8 }
9 }
Nach if bzw. else wird genau eine Anweisung ausgefuhrt.
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 class Block {
2 public static void main (String [] args) {
3 if ( 1 == 2 ) {
4 System.out.println("1 ist gleich 2.");
5 System.out.println("Das ist falsch.");
6 }
7 else {
8 System.out.println("1 ist ungleich 2.");
9 System.out.println("Das ist richtig.");
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 ausgefuhrt, es findet kein Vergleich statt.
Neu: Der Vergleichsoperator, ==
if ( summe == b+c ) ...else ...
Inhalt
EinstiegskursProgrammiersprachenBedingungenSchleifenCompilermeldungen, typische Fehler
Konzepte: Schleifen
Eine Alternativen kann die eine oder die andere Anweisung einmal ausfuhren.
Eine Schleife kann eine Anweisung (oder einen Block von Anweisungen)mehrmals ausfuhren.
Beispiel
1 class Nullkommaeins {
2 public static void main (String [] args) {
3 double nke = 0.1;
4 double sum = 0.0;
5 int i;
6
7 for (i=0; i<10; i++)
8 sum = sum + nke;
9
10 System.out.println("Summe: " + sum);
11 }
12 }
Konzepte: Schleifen
for ( i=0 ; i<10 ; i++ )
System.out.println( i );
;
;
vor der Schleife
nach der Schleife
Initialisierung
Schleifen-BedingungErhöhung
des Zählers
Schleifen-Durchlauf
Konzepte: Schleifen
for ( i=0 ; i<10 ; i++ )
anweisung;
for wird typischerweise fur Zahlschleifen verwendet:
i=0 — ein Index (Zahlvariable) wird initialisiert
i<10 — solange eine Bedingung erfullt ist, wird
anweisung; — die Anweisung (oder der Block) wiederholt
i++ — nach jedem Schleifendurchlauf (vor dem nachsten Test derBedingung) wird der Wert von i um 1 erhoht
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 zahlt von 1 bis 10
die zweite zahlt in Zweierschritten von 2 bis 20.
weitere Schleifen
while (bedingung) ...
Ahnlich zu for, aber nur ein Argument
do ... while (bedingung);
Ahnlich zu while, aber Test nach dem Durchlauf
for (String s: args) ...
Ein Iterator uber ein Feld von Objekten
Inhalt
EinstiegskursProgrammiersprachenBedingungenSchleifenCompilermeldungen, 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
1 public static int xxx(int m, int n) {
2 if (m == 0)
3 return 1;
4 if (n == 0)
5 return 2;
6 if (m != 0 && n != 0)
7 return 3;
8 }
fehler2.java:8: missing return statement
javac erkennt nicht die Logik:
das dritte if ist automatisch erfullt
Recommended