Informatik I - Einstiegskurs - Institute of Computer ... · Programmiersprachen Programme " sagen\...

Post on 15-Aug-2019

219 views 0 download

Transcript of Informatik I - Einstiegskurs - Institute of Computer ... · Programmiersprachen Programme " sagen\...

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