Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Martin Häcker/Java Kurs/Tag 1

Version vom 25. Februar 2006, 16:50 Uhr von Buchholz (Diskussion) (Java: void main)

LE 1: Hello, World!

Organisatorisches

  • Was Passiert
  • Wann passiert was
  • Wie passierts
  • Vorstellung
  • Was ist das genau
  • Wer sind wir: Freiwillig, Umsonst
  • Ziel des Kurses
  • Was sie am Ende können sollen
  • Gruppeneinteilung
    • am Ende der ersten Vorlesung
    • Vorher per e-mail

Jemand vom Rechnerbetrieb soll bitte da sein, damit wir Login-Probleme lösen können

Inhalt (Vorgehen, Beispiele, Ideen)

Methodik

Was ist Programmieren?

  • imperativ (prozedural) vs. funktionales Programmieren
    • relation problem <-> lösung / kochrezept
  • Zustandsmaschine
  • Einführung nach SICP Kapitel 1 (bis "Programming in Lisp")
    • Damit ist die Philosophie von Programmieren gemeint

Drei Dinge, die wichtig sind für Programmierer:

  • Primitive Ausdrücke
  • Kombinationsmöglichkeiten
  • Abstraktionsmöglichkeiten

Java

Wie fangen wir Java an

  • Werte und operatoren +,*,/,-, % (?)
  • Wenige Variablentypen int, String, (double)
  • Zuweisung
  • <, >, ==, <=, >=
  • if
  • Methoden vorgeben: Input, Output
  • Was passiert da, wieso erst Compilieren, dann ausführen


Alter Plan

Aufbau eines Java-Programms

  • Variablen und Identifier-Namen
    • Variablendeklaration - Namen vergeben für Dinge, die man berechnet hat!
    • Lokale Namen und wieso: (vielleicht?) [1]
  • Literale
  • Datenstrukturen und Typen:
    • Primitive
    • String: einführen mit dem Hinweis, dass bei den Primitiven alles normal sei, während bei String "alles anders" ist. Dann später diesen Unterschied aufgreifen. (String ist ja nun "immutable", trotzdem?)
    • Arrays (?)

Ein Beispiel bringen und daran erklären, was primitive Ausdrücke, Kombinationen und Abstraktionsmöglichkeiten sind (evtl. langsam entwickeln):

class Test {
	static void print(double aNumber) {
		System.out.println("> " + aNumber);
	}

	public static void main(String [] arguments) {
		print(3 * 4);
		print(7 + 23 * 8 - 3);
		// ....
	}
}


  • Zuweisung, einfache Operatoren (+, *, <=, %)
  • ++ oder += (?)
  • Kommentare
  • if, else
  • javac

Methodik

Fehlermeldungen lesen und verstehen

  • Klammer vergessen
  • Semikolon vergessen
  • Klasse heißt anders als Datei
  • Compiler falsch aufgerufen

Übungsaufgaben

  • cd üben
  • Hello World eintippen (kate, gedit, nano, ..)
  • javac / java benutzen
  • Ergebnisse sehen
  • Fehler einbauen, Fehler finden (laufzeit/compilezeit)
  • Einige Expressions angeben und die Teilnehmer sollen feststellen, was die ausgeben/berechnen würden
  • Das gleiche dann nochmal mit if/else
  • Einen mathematischen Ausdruck in Java übersetzen

LE 2: Standardkonstrukte in Java

Inhalt

Methodik

Java

  • Typen
    • boolean
    • was wir im ersten Teil weggelassen haben?
  • Methoden:
    • Namend
    • Aufruf
    • Parameter und Rückgabe -> Call by Value
    • main
    • return
    • Nachtrag Datenstrukturen: void
    • Beispiel: System.out.println()


  • Blöcke
    • if-else
      • Formulieren von Bedingungen für if, while
    • while
      • Schleife als zweite Lösung für duplikation von Code
      • Diskussion Schleife <-> Rekursion???
    • Weitere Schleifenkonstrukte später - gar nicht?
      • for
      • continue
      • break
  • Anwendung von Schleifen
  • Rekursion <-> Schleifen (Beispiel)
  • Warum/wann Schleifen?
    • als Alternative zu Akkumulator Parametern (Vergleich zu OPAL)
    • wenn die Anzahl der Durchläufe nicht konstant ist
    • als Luxus - Bsp: for( int i = 0; i < 3; i++ )


  • Gute Namen
    • Abstrakter Gedanke: Für den Computer ists wurscht, wie man das was man meint aufschreibt. Wir Menschen dagegen sind von sowaas verwirrt:
class _{static long _
(long __,long  ___) {
return __==0 ?___+ 1:
___==0?_(__-1,1):_(__
-1,_(__, ___-1)) ;  }
static  {int _=2 ,___
= 2;System.out.print(
"a("+_+','+___+ ")="+
_ (_,  ___) ) ;System
.exit(1);}}//(C) Ulli

Wir können uns aber helfen indem wir das so schreiben:

/** @see: http://de.wikipedia.org/wiki/Ackermann-Funktion */
class AckermannFunctionDemo {
	static long ackermann(long n, long  m) {
		if (n == 0) {
			return m + 1;
		}
		else if (m == 0) {
			return ackermann(n - 1, 1)
		}
		else {
			return ackermann(n - 1, ackermann(n, m - 1));
		}
	}
	static void main {
		int n = 2, m = 2;
		System.out.print("ackermann(" + n + ',' + m + ") = " 
			+ ackermann(n, m));
		System.exit(1);
	}
}//(C) Ulli + Martin


  • Testen: wie testet man ob und wie etwas geht? (Java Ausprobieren)
    • assert-Methode selber schreiben -> Später!
  • Werte ausgeben! -> printf-Debugging
    • Variablen haben unterschiedliche Werte während das Program läuft!

Übungsaufgaben

  • Methoden definieren, die bestimmte Eigenschaften haben
  • Beispiele dann Abtippen und ausprobieren
  • Sie sollen Nachfragen, wenn sie was anderes hatten (oder sowas)
  • Verschiedene Eingabewerte
  • erste Endlosschleife