Programmieren 1 – VL 2
Spaß am Programmieren
Bachelor Medieninformatik
Winteremester 2015
Dipl.-Inform. Ilse Schmiedecke
schmiedecke@beuth-hochschule.de
Schmiedecke – Programmieren 1
1
Erinnern Sie sich an Eliza?
public class Eliza {
public static void main(String[] args) {
System.out.println(„Hello, I‘m Eliza,"
+" – what‘s your name?");
String input = Console.readln();
System.out.println(„Nice to meet you, "
+ input + "! How are you today?");
input = Tastatur.readln();
System.out.println(„Really? Why?");
input = Console.readln();
System.out.println(„What do you mean by: "
+ input + "?");
}
}
Programm, das nur einen Algorithmus implementiert
interaktiv es Batch-Programm: Es läuft durch und endet.
Schmiedecke – Programmieren 1
2
2
Wir haben etwas über Programmstruktur gelernt
Was bedeutet:
class
method
main method
statement
sequence
alternative
loop
variable
String
assignation
Schmiedecke – Programmieren 1
3
3
Schreiben wir ein paar "typische" Programme
Einige Algorithmen-Aufgaben:
Das Haufenspiel
Berechnen der Zahl Pi
Berechnen der Zahl E
Berechnen der ersten
100 Primzahlen
Schmiedecke – Programmieren 1
4
4
Wir brauchen Zahlen und Rechenoperationen...
•
•
•
•
Bisher waren alle unsere Daten Texte, d.h. vom Typ String
jetzt brauchen wir Ganzzahlen (engl. integers) vom Typ int
und Bruchzahlen (engl. floating point numbers) vom Typ double (oder float)
Alle üblichen arithmetischen Operatoren, wie + und *, sind in Java vorhanden
Beispiele:
int schachtelgroesse = 20*12*14; // in cm
double tempoAnrechnung = tempoMessung * 0.98;
// 2% Toleranz
Daumenregel: Datentypen nicht mischen....
Schmiedecke – Programmieren 1
5
5
Wir brauchen Verzweigungen
"Wenn x kleiner ist als 0, multipliziere es mit -1"
if (x<0) {
x = x*(-1);
}
"Wenn x kleiner ist als null, multipliziere es mit -1,
sonst kopiere den Wert nach y und setze x auf 0."
if (x<0)
x = x*(-1);
else {
y = x;
x = 0;
}
// {..} nicht nötig, weil nur 1 Befehl
Schmiedecke – Programmieren 1
6
6
Wir brauchen Schleifen (Wiederholungen)
Solange x kleiner als 100 ist, verdoppele den Wert.
while (x<100) {
x = x*2;
}
Achtung: Endlosschleife, falls (x <=0) !!
Kombination:
if (x<=0) x=1;
while (x<100) {
x = x*2;
}
Schmiedecke – Programmieren 1
7
7
Das Haufenspiel
2 Spieler räumen einen Haufen Streichhölzer ab.
Der erste Spieler kann beliebig viele Streichhölzer abräumen, es
müssen nur mind. 2 übrigbleiben.
Danach ziehen die Spieler abwechselnd:
Jeder entnimmt mindestens ein Holz und max. eins mehr als der
Spieler vor ihm.
Wer das letzte Holz nimmt, hat verloren
Schmiedecke – Programmieren 1
8
8
Strategie 1
Nimm soviele Hölzer wie möglich,
Lass genau 2 übrig.
Schmiedecke – Programmieren 1
9
9
Haufenspiel: Der Dialog
public class Heap {
static int heapSize;
static int myRemoval;
static int otherRemoval;
public static void main(String[] args) {
setHeapSize();
while (heapSize>1)
{
askForRemoval();
otherRemoval=Integer.parseInt(Console.readln());
checkRemoval();
heapSize=heapSize-otherRemoval;
draw(); // and find out about end of game
}
}
Schmiedecke – Programmieren 1
10
10
Hilfsprozeduren
private static void setHeapSize()
{
System.out.println("How many matches do we play with?");
heapSize=Integer.parseInt(Console.readln());
myRemoval = heapSize-3;
}
private static void askForRemoval()
{
System.out.println("Our heap contains "+heapSize+" matches");
System.out.println("Don't take more than "+(myRemoval+1));
System.out.println("How many do you take? ");
}
private static void checkRemoval()
{
if (otherRemoval<=0 | otherRemoval >heapSize
| otherRemoval >myRemoval+1)
{ System.out.println(""+removal+ "was not allowed."+
" So you take 1!");
otherRemoval=1;
}
Schmiedecke – Programmieren 1
11
11
Haufenspiel: der strategische Kern
private static void draw()
{
if (heapSize==1)
System.out.println("I lost. Well done!");
else if (heapSize==0)
System.out.println("You lost, too bad :(");
else
{ findOptimum();
System.out.println("I take "+ myRemoval);
heapSize=heapSize- myRemoval;
if (heapSize==1)
System.out.println("You lost, too bad :(");
}
}
private static void findOptimum() // 1st strategy
{
if (heapSize-otherRemoval-1 >= 2)
myRemoval=otherRemoval+1;
else (if heapSize > 2)
myRemoval=heapSize-2;
else myRemoval = 1;
}
Schmiedecke – Programmieren 1
12
12
Strategie 2
Kontrolliere die Optionen des anderen Spielers, indem du je
nach Haufenbestand 1-3 Hölzer nimmst,
Damit wird die Runde auf 1-5 Hölzer heruntergebrochen:
Teile den Haufen durch 5 und betrachte den Teilungsrest
("modulo" genannt, geschrieben %)
Wenn der Teilungsrest 3 oder größer ist, versuche, den
Teilungsrest minus 1 zu nehmen.
Andernfalls nimm 1.
Schmiedecke – Programmieren 1
13
13
Haufenspiel: Dialog und Hilfsprozeduren
unverändert .......
Schmiedecke – Programmieren 1
14
14
Haufenspiel: der strategische Kern
public static void findOptimum() // 2nd strategy
{ if (heapSize%5==3)
myRemoval=2;
else if (heapSize%5==4 & otherRemoval>=2)
myRemoval=3;
else
myRemoval=1;
}
Nur diese Prozedur wird ausgetauscht
Schmiedecke – Programmieren 1
15
15
Nun ein bisschen Mathe
Die Leibnitz-formel für Pi
Pi/4= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - ...
Reihenentwicklung für die Eulersche Zahl e
ex= x + 1 + x2/2! + x3/3! + x4/4! + ...
einfach für x=1
Schmiedecke – Programmieren 1
16
16
Euler
public class FindE {
/* this program calculates Euler's number e
* according to the formula
* e^x = x + 1 + x^2/2! + x^3/3! + x^4/4! + ...
* using x=1
*/
static double factorial = 1;
static double e = 2; // start value x +1
public static void main(String[] args) {
int numTerms = 2; // two terms in start value
while (numTerms <1000){
factorial = factorial * numTerms;
e = e + 1 / factorial;
numTerms = numTerms +1;
System.out.format("%4d e = %21.20f",numTerms, e);
System.out.println();
}
}
}
Schmiedecke – Programmieren 1
17
17
Pi
public class FindPi {
/* This program calculates the number pi according to
* Leibnitz's formula:
* Pi/4= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - ...
*
* The max number of terms is preset to 10000;
*
*/
static double piBy4 = 0;
static double denominator = 1;
static double factor = 1;
static int maxTerms = 100000;
Schmiedecke – Programmieren 1
18
18
Pi - Fortsetzung
public static void main(String[] args) {
int numTerms = 0;
while (numTerms <= maxTerms)
{ double term = factor / denominator;
piBy4 = piBy4 + term;
factor = -factor; // either 1 or -1
denominator = denominator +2;
numTerms = numTerms + 1;
System.out.format("%4d
pi = %21.20f",
numTerms,
piBy4*4);
System.out.println();
}
}
}
Schmiedecke – Programmieren 1
19
19
Programmiersprachen
Java ist eine formale Sprache.
Sie konnten Heap, FindE, FindE von Hand ausführen.
Wieso?
Weil sie <ein bisschen> Java "sprechen"
D.h. Sie verstehen die <grundlegende> Struktur der
Sprache
Syntax
und die Ausführungsbedeutung des Java-Textes
Semantik
Schmiedecke – Programmieren 1
20
20
Java Syntax: Klasse
Class declaration
class header
class body
<option>
<sequence>
public class
class name
{
declaration
}
<choice>
Identifier
<sequence>
method
declaration
attribute
declaration
<choice>
letter
letter
digit
hint: <sequence> means 0 or more elements
Schmiedecke – Programmieren 1
<choice> exactly one element
21
21
Java Syntax: Methoden-Deklaration
method declaration
method header
<option>
method body
<option>
Access static
<choice>
public private
return
type
method
name
<choice>
Identifier
(
<sequence>
)
{
statement
method
call
void
}
;
type
Schmiedecke – Programmieren 1
22
22
Syntax Definition in Backus Naur Form (BNF)
ClassDeclaration :: ClassHeader, ClassBody
ClassHeader :: [ "public" ], "class", ClassName
ClassName :: Identifier
Identifier :: Letter , { Letter | Digit} *
Digit :: "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
ClassBody :: "{", Declaration*, "}"
Declaration :: MethodDeclaration | AttributeDeclaration
Legend:
::
{}
[]
definition
grouping
option
*
|
0 or more repetions
choice
Schmiedecke – Programmieren 1
23
23
Test
Welches sind gültige Identifier?
toysRus
MAMAMIA
12345
12-March-2005
Ist dies eine gültige Klassendeklaration?
class MAMAMIA {}
Sind dies gültige Methodendeklarationen?
private method() { }
void main() { Console.println("") }
Schmiedecke – Programmieren 1
24
24
Freier Text
Kommentare ermöglichen das Einfügen beliebiger (erläuternder) Texte
in den Code.
Sie werden vom Compiler ignoriert.
Zwei Sorten von Kommentaren:
Zeilenkommentar:
alles von // bis zum Zeilenende ist ein Kommentar
public int age; // max 100
Mehrzeilenkommentar:
Alles zwischen /* und */ ist ein Kommentat
public /* static not allowed */ int age;
/* otherwise all Objects
* would have
* the same age
*/
Schmiedecke – Programmieren 1
25
25
... und Konventionen
Die Java Community hat sich auf die Einhaltung einiger Konventionen geeinigt:
Nur Klassennamen werden groß geschrieben
Worttrennung in Namen durch "CamelCase"
MyFirstJavaProgram
Öffnende und schließende geschweifte Klammer in derselben Spalte
(auch zulässig: öffende Klammer am Zeilenende, dann Einrückung)
Einrücken bei jeder öffnenden geschweiften Klammer!
Für jede Anweisung eine neue Zeile
Schmiedecke – Programmieren 1
Konventionen
unterstützen die
Lesbarkeit
26
26
Programme sollten immer lesbar sein!
Schmiedecke – Programmieren 1
27
27
Der Programm-Entwicklungsprozess
Problem:
Strukturierter Text
Löungskonzept:
Spezifikation: Text und/oder Zeichnung
Programm-Prototyp:
Erstimplementierung,
lauffähig und dokumentiert
Programm
gründlich gestestet!
Schmiedecke – Programmieren 1
28
28
Das Haufenspiel
2 Spieler räumen einen Haufen Streichhölzer ab.
Der erste Spieler kann beliebig viele Streichhölzer abräumen, es
müssen nur mind. 2 übrigbleiben.
Danach ziehen die Spieler abwechselnd:
Jeder entnimmt mindestens ein Holz und max. eins mehr als der
Spieler vor dir.
Wer das letzte Holz nimmt, hat verloren
Nicht wirklich genau genug!
- Wieviele Steichhölzer?
- Wer spielt als erster?
- ...
Schmiedecke – Programmieren 1
29
29
ategy
Teile den Haufen durch 5 und betrachte den Teilungsrest
("modulo" genannt, geschrieben %)
Wenn der Teilungsrest 3 oder größer ist, versuche, den
Teilungsrest minus 1 zu nehmen.
Andernfalls nimm 1.
Wenn Zahl % 5 größer oder gleich 3 , versuche
Zahl % 5-1 zu nehmen. Beachte die Obergrenze
letzter Zug +1.
Sonst nimm 1
Modell des Algorithmus
Schmiedecke – Programmieren 1
30
30
Implementierung
Schreibe den Java-Code und kompiliere ihn.
Korrigiere die Syntaxfehler!
Bringe das Programm zu Laufen!
Das war noch nicht alles!
Tut das Programm das Richtige?
Tut es das immer?
Schmiedecke – Programmieren 1
31
31
Teste das Programm gründlich!
Es wird sich falsch benehmen, jedenfalls manchmal!!
teste mit verschiedenen Haufengrößen
versuche es mit negativer Haufengröße
versuche verbotene Züge
versuche, seltsame Eingaben zu machen
....
Dann endlich ist es
einProgramm
Schmiedecke – Programmieren 1
32
32
Übesetzung
Java ist eine besondere Sprache:
Java wird kompiliert UND interpretiert.
Java wird nicht nach Assembler kompiliert
sondern nach JavaByteCode.
JavaByteCode kann auf jeder Maschine sehr effizient
interpretiert werden.
Kompilierte Java-Programme können auf
verschiedenen Rechern laufen:
Plattform-Unabhängigkeit
Schmiedecke – Programmieren 1
Hat das etwas
mit dem
Internet zu tun?
33
33
Interpretation vs. Kompilation
Progr.
Source
Interpreter
Output
plattformunabhängig
langsam
Input
Progr.
Source
Program
Compiler
load
Input
Interpretation
Program
Schmiedecke – Programmieren 1
Output
Kompilation
und Ausführung
plattformabhängig
schnell
34
34
Java-Übersetzung und Ausführung
JavaSource
Compiler
ByteCode
Kompilation
und
ByteCode
Interpreter
Input
platform
specific
Schmiedecke – Programmieren 1
Output
Interpretation:
plattformunabhängig
schnell
35
35
Ihr Entwicklungs-Werkzeugkoffer
Task
Tool
Result
Type or correct program,
save in file
(1 file per class)
Editor
e.g Notepad++, Textpad
Text file (ASCII)
Name.java
Translate program into ByteCode
Compiler
javac.exe
Bytecode file (binary)
Name.class
Execute bytecode,
Test program
Interpreter
java.exe
Program output
Preparation:
set search paths,
provide libraries,
track versions, etc.
Operating System,
File System
adapted working
environment
Schmiedecke – Programmieren 1
36
36
Integrated Programming Tools
simplify program development and reduce errors
Großartige IDE(e)!
Integrated
Development
Environment
ein Multi-Tool – all in one...
Dateien zusammengefasst zu Projekten (incl. Textdateien, Daten, Medien,...)
Automatische Einrichtung der Arbeitsumgebung (classpath...)
Editieren, Übersetzen, Ausführen, Debuggen – alles in einem Werkzeug
... und noch viel mehr...
Schmiedecke – Programmieren 1
37
37
Wir benutzen Eclipse
In Java
geschrieben,
läuft auch auf
Ihrem
Rechner!!
Schmiedecke – Programmieren 1
38
38
Schmiedecke – Programmieren 1
39
39
Schwindelig im Kopf?
Wir haben die Passhöhe erreicht...
Jetzt geht es in kleineren Schritten voran.
Schmiedecke – Programmieren 1
40
40