PR02-Programmierung

Werbung
Programmieren 1 – VL 2
Spaß am Programmieren
Bachelor Medieninformatik
Winteremester 2015
Dipl.-Inform. Ilse Schmiedecke
[email protected]
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
Herunterladen