1 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Projektwoche
Projektwoche 2010 2010 Sprechen
Sprechen Sie Sie D? D?
Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
Hochschule Harz
FB Automatisierung und Informatik
mwilhelm@hs-harz.de
http://mwilhelm.hs-harz.de
Raum 2.202
Tel. 03943 / 659 338
2 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Beispiele
1. Hello World
2. Datentypen, Grundstrukturen (if etc.) 3. printf
4. Funktionen 5. Felder 6. parameter 7. hashmap 8. Exception 9. File-IO
10. assert / Constraints 11. struct / class 12. Threads 13. Templates
3 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Kommentare
Zeilenweise //
Blockweise /* */
Blockweise /+ +/
4 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
1. Beispiel: Hello World
Installation der Programme
– C:\daten\d\dm dmc.exe link.exe
– C:\daten\d\dmd dmd.exe
– C:\daten\d\prog
Aufruf der Oberfläche: DCONSOLE.EXE
Neue Datei STRG+N
Eintragen des Quellcodes
Übersetzen F8
Starten F9
5 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Pfad zum Compiler
6 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
import std.stdio;
int main(char[][] args) {
writefln("hello world");
return 0;
}
1. Beispiel: Hello World
• Speichern
• starten mit Taste F9
7 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Datentypen
bool Boolean
byte sign 8 Bit
ubyte unsigned 8 Bit
short sign 16 Bit
ushort unsigned 16 Bit
int signed 32 Bit
uint unsigned 32 Bit
long signed 64 Bit
ulong unsigned 64 Bit
char 8 Bit
wchar 16 Bit
dchar 32 Bit
char[] String
float single
double double
real Größter Typ
ifloat imaginär
idouble imaginär
ireal imaginär
cfloat komplexe Zahl
cdouble komplexe Zahl
creal komplexe Zahl
8 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Suffix für Datentypen
Integer-Familie:
L long
UL ulong
U uint
Nichts int
Floating-Point-Familie:
F float
L real !
Nichts double
Imaginär-Familie:
i Imaginär
9 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Casting
int code = cast(int) ch; // Cast von char nach int int code = cast(int) d; // Cast double nach int char ch = cast(char) (i+65); // Cast von int nach Char cast(char *) // Cast nach C-String
printf("Text: %s \n", cast(char *) sName ); // Cast nach C-String printf("Text: %.*s \n", (sName~\0) ); // Cast nach C-String printf("Text: %.*s \n", toStringz( sName ) ); // Cast nach C-String Das zweite Beispiel schneidet alle Nachkommastellen ab. Es rundet nicht ! Im Modul std.math existieren mehrere Varianten für die genaue Rundung einer Fließkommazahl zu einer Integerzahl.
10 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Konstanten
Beispiele:
• const int MaxDay=31;
• const int MaxMonth=12;
• const char yes='Y';
• const double MaxD=123.456;
11 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Initialisierung
Die Initialisierung sind nicht kompatibel mit C oder C++.
Übersicht:
Ganzahlige Datentypen werden mit 0 initialisiert.
• Floating Point mit NAN.
• Charakter mit 0xFF, letztes Zeichen, sieht aus wie ein Leerzeichen
• Felder werden mit dem jeweiligen Datentyp initialisiert.
In C/C++ werden keine Datentypen mit Werten initialisiert.
Java und C# initialisieren jeweils mit der Zahl Null. Die Sprache D wählt diesen Weg auch für alle ganzzahligen Datentypen. Fließkommazahlen werden aber mit NAN initialisiert.
12 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Deklaration
int x; // x ist ein int
int* x; // x ist ein Pointer zu einem int
int** x; // x ist ein Pointer zu einem int-Pointer int[] x; // x ist ein Feld von ints
int*[] x; // x ist ein Feld mit Pointer auf ints int[]* x; // x ist ein Pointer zu einem Feld von ints
int x = void; // Keine Initialisierung
int[] x=void; // x ist ein Feld von ints, ohne Initialisierung
13 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
2. Beispiele für Datentypen
bool Boolean
byte sign 8 Bit
ubyte unsigned 8 Bit
short sign 16 Bit
ushort unsigned 16 Bit
int signed 32 Bit
uint unsigned 32 Bit
long signed 64 Bit
ulong unsigned 64 Bit
char 8 Bit
wchar 16 Bit
dchar 32 Bit
float single
double double
real Größter Typ
ifloat imaginär
idouble imaginär
ireal imaginär
cfloat komplexe Zahl
cdouble komplexe Zahl
creal komplexe Zahl
14 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
import std.stdio;
int main(char[][] args) { int a, b, c, min, max;
// init
… // calc
writefln("Minimum:",min);
writefln("Maximum: ",max);
return 0;
}
2. Aufgabe:
Bestimmen des Min- und Maximums dreier Zahlen mittels if-Anweisung (int, double)
• Speichern
• starten mit Taste F9 Formate
• %d Decimal
• %f Floating %11.4f
• %c Char
• %s String
15 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
import std.stdio;
int main(char[][] args) { int a, b, c;
// init
… // lokales calc writefln("Summe: ",c);
c = summe1(….);
writefln("Summe: ",c);
return 0;
}
3. Aufgabe: Bestimmen der Summe zweier Zahlen mittels Funktionen
• Speichern
• starten mit Taste F9
summe
16 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
import std.stdio;
int main(char[][] args) { int a, b, c;
// init
… // lokales calc writefln("Summe: ",c);
c = summe1(….);
writefln("Summe: ",c);
summe2(a,b,c);
writefln("Summe: ",c);
return 0;
}
3. Aufgabe: Bestimmen der Summe zweier Zahlen mittels Funktionen
• Speichern
• starten mit Taste F9
summe
17 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
For-Schleifen
for( Zähler=Anfangswert; Zähler<Endwert; Zähler = Zähler +1) Weitere Optionen:
• break // Ende der Schleife
• continue // Verzeigt zum nächsten Durchgang
18 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
While-Schleifen
while (Bedingung) Anw1;
while (Bedingung) { Anw1;
}
while (Bedingung) { Anw1;
Anw2;
}
19 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Do-While-Schleifen
do
Anw1;
while (Bedingung)
do {
Anw1;
} while (Bedingung) do {
Anw1;
Anw2;
} while (Bedingung)
20 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Funktion: 2x3– 0.5x2+ 4x -8;
Bereich: von 0 bis 10 Schrittweite 0,5
f(0) -8
f(1) -2,5
Lösung: Integral: 5459,125
4. Aufgabe: Erstellen einer Wertetabelle und berechnen eines Integralwerts
integral
21 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
5. Aufgabe: Welche Zahlen sind durch 2 oder 3 ganzzahlig teilbar
mwst1
Eine For-Schleife in main berechnet den Teiler und gibt alle gültigen Zahlen mittels writefln aus
22 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
import std.cstream; // fuer din.readLine() import std.stdio; // fuer writef()/writefln() void main() {
char[] sName;
writef("Guten Tag, bitte geben Sie Ihren Namen ein: ");
sName = din.readLine();
writefln("Danke, dass Sie D benutzen, %s", sName);
// Pause
din.readLine();
return 0;
}
6. Aufgabe: Konsoleneingabe / Dos-Box
23 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? mwst1
7. Aufgabe: MWSt berechnen
Funktion erhält zwei Parameter:
a) Ein Zeichen für den Artikel b) Preis
Aufgabe: Berechnen der MWSt Eingabe: Über Tastatur
Für Zeichen a,d,f gilt 19%
Für Zeichen b,c,h gilt 7%
sonst gilt 25% // Sondersteuer
Mit if-Anweisungen !
24 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
switch ( Ausdruck) { case Wert1: Anw1;
break;
case Wert2: Anw2;
Anw3;
break;
case Wert3:
case Wert4: Anw4;
Anw5;
Break;
case Wert5: Anw6;
case Wert6: Anw7;
Anw8;
Break;
default: Anw9;
} // switch
Switch Anweisung
25 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
switch ( Ausdruck) { case Wert1: Anw1;
break;
case Wert2: Anw2;
Anw3;
break;
case Wert3:
case Wert4: Anw4;
Anw5;
Break;
case Wert5: Anw6;
Anw7;
Anw8, BREAK case Wert6: Anw7;
Anw8;
Break;
default: Anw9;
} // switch
Switch Anweisung
26 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? mwst1
Felder / Arrays
Arrays sind Container für mehrere Elemente Man kann diese unter einem Namen ansprechen Felder werden als Referenz übergeben (Parameter) Methode dup kopiert
Methode length liefert die Länge Methode sort sortiert
Default Initialialisierung:
Pointers werden mit null initialisiert.
Statische Felder werden mit den Default-Wert ihres Datentyps initialisiert.
Dynamische Felder haben am Anfang keine Elemente.
Assoziative Felder haben am Anfang keine Elemente.
Dynamische Felder: int[]p; p.length=100;
27 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? mwst1
Felder / Arrays
Drei Arten eines Feldes existieren:
int* p; Pointer auf Daten, à la C int[3] s; Statisches Feld
int[] a; Dynamisches Feld
28 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Felder / Arrays
// dynamische Felder von ints
int[] a; int a[];
// Feld mit 3 Felder mit jeweils Felder von 4 ints int[4][3] b; int[4] b[3]; int b[3][4];
// Dynamisches Feld von Feldern mit 5 ints
int[][5] c; int[] c[5]; int c[5][];
// Feld mit 3 Pointern nach einem dynamischen Feld mit ints int*[]*[3] d; int*[]* d[3]; int* (*d[3])[];
// Pointer zu einem dynamischen Feld mit ints
int[]* e; int (*e)[];
29 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Foreach-Schleifen
int [10] a;
foreach (int value; a) { writefln(a);
writefln("'%d", value);
}
double [10] d;
foreach (int i, double value; d) { writefln("%d %f", i, value);
}
foreach_reverse (int i, double value; d) { writefln("%d %f", i, value);
}
30 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? array1
8. Aufgabe: Felder mit i+1 initialisieren
int main (char[][] args) {
int a[10]; // Feld mit 10 Elementen int b[];
int c[];
a) mit einfacher For-Schleife das Feld a initialisieren Methode .length
b) Ausgabe mit foreach
c) Referenz kopieren b=a // Kontrollausgabe d) setzen von b[3] =55; // Kontrollausgabe e) Kopieren und Einzelfeld setzen
31 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? array2
9. Aufgabe: Felder mit i+1 initialisieren
int main (char[][] args) {
int a[10]; // Feld mit 10 Elementen int b[];
int c[];
a) Initialisieren durch eine Methode setFeld / initFeld b) Kontrollausgabe
32 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? array3
10. Aufgabe: Felder a[i] mit 2.2*i+1 initialisieren
int main (char[][] args) {
double a[10]; // Feld mit 10 Elementen double xm;
a) Initialisieren durch eine Methode initFeld b) Kontrollausgabe
c) Berechnen des Mittelwerts in einer Methode (void / Länge)
33 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? array4
11. Aufgabe: 3 Felder
int main (char[][] args) {
int a[10]; // Feld mit 10 Elementen int b[10];
int c[10];
a) Initialisieren der Felder a und b b) Kontrollausgabe
c) Berechnen einer Funktion in einer Methode Addition / Subtraktion
Multiplikation / Division Berechnen der Hypothenuse
Auswahl mittels switch / case per Parameter d) Ausgabe des Ergebnisfeldes c
34 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Hashmap-Felder
• Das Suchen eines bestimmten Wertes in einem großen unsortiertem Feld ist sehr aufwändig
• Abhilfe schafft die Verwendung von assoziativen Feldern
double[ char[] ] myhashfeld;
myhashfeld[ "Mueller" ] = 34.56;
myhashfeld[ "Schmidt" ] = 14.56;
myhashfeld[ "Schmitt" ] = 64.56;
writefln("Feldlaenge: %d",myhashfeld.length);
// Ausgabe
writefln("%s %f","Mueller",myhashfeld["Mueller"]);
writefln("%s %f","Schmidt",myhashfeld["Schmidt"]);
35 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
void insert(double[ char[] ] myhashfeld,char[] hash,double d) { myhashfeld[ hash ] = d;
writefln("Feldlaenge: %d",myhashfeld.length); // 1 }
int main (char[][] args) { double[ char[] ] myhashfeld;
insert(myhashfeld,"Mueller",34.56);
insert(myhashfeld,"Schmidt",14.56);
insert(myhashfeld,"Meier",24.56);
insert(myhashfeld,"Meyer",25.56);
insert(myhashfeld,"Schmitt",64.56);
insert(myhashfeld,"Pundt",94.56);
writefln("Feldlaenge: %d",myhashfeld.length);
// Ausgabe
print(myhashfeld, "Mueller"); // Error: ArrayBoundsError hash2(23) print(myhashfeld, "Meier");
print(myhashfeld, "Pundt");
return 0;
}
36 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Problem der Hashmap-Felder
■ Wird das Hashfeld in einer Methode definiert und benutzt, so gibt es keine Probleme
■ Die Hashmap wird nicht als Referenz übergeben
■ 1. Abhilfe: globale Feld
■ 2. Abhilfe: Klasse class CHashDouble { // Definition des Felds
void insert(char[] hash, double d) {
… }
double get(char[] hash) { return …
}
void print(char[] hash) {
… } }
37 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Exception
Fehler werden mit der Try-Catch-Anweisung abgefangen try {
Anweisungen }
catch(Exception e) {
writefln("catch %.*s\n", e.msg);
}
Hinweis:
ThrowStatement:
throw new Exception("Fehler in Modul beta");
38 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? exception1
12. Aufgabe: Exception
Einbau einer Exception:
int main (char[][] args) { int i,j;
j=0;
i=i/j;
return 0;
}
39 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Plausibilität
■ Wenn man Parameter in einer Funktion überprüfen will, so kann man dieses mit if-Anweisungen programmieren
■ In der Release-Version ist das aber nicht sehr optimal (Performance)
■ Deshalb gibt es in C das assert-Makro. Die darin defnierte Überprüfung wird nur im Debug-Modus kompiliert.
real a = 3.40483L; L ist dann maximales Floatingpoint Format real b;
b = 3.40483; // kein L, trotzdem nicht zum double konvertiert assert(a == b);
assert(a == 3.40483); // float Typ assert(a == 3.40483L); // real-Typ assert(a == 3.40483F);
double d = 3.40483; // Cast zum double Format assert(d != a); // double <> real, meistens
const double x = 3.40483; // Konstante wird nicht umgewandelt assert(x == a); // Prüfung okay
40 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
double pythagoras(double a, double b) in
{
assert(a > 0);
assert(b > 0);
}
out (result) {
assert( (result>a) && (result>b) );
assert( result*result == a*a+b*b ); // Problem }
body {
return cast(double)std.math.sqrt(cast(real) a*a+b*b);
}
Plausibilität: Beispiel
41 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
uint fakultaet(uint n) in
{
assert(n > 0);
}
out (result) {
assert( result>0 );
} body {
uint i, p;
p=1;
for (i=2; i<=n; i++) p*=i;
return p;
}
int main (char[][] args) { uint f;
f = fakultaet(33);
writefln("fakultaet : %d",f);
return 0;
}
Absturz bei n=34
constraint1.d
Plausibilität: Beispiel Fakultät
42 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? constraint3
13. Aufgabe: Pythagoras
Einbau einer Überprüfung im Programm constraint3.d
■ Überprüfen der Eingangswerte
■ Berechnen des Ergebnisses mit std.math.sqrt
■ Überprüfen des Ergebnisses, Formel des Pythagoras
43 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Parameterübergabe an einem Programm
■ Wie in C, Jave ect. Existiert ein Mechanismus, um Daten an ein startendes programm zu übermitteln
int main(char[][] args) {
writefln("hello world\n");
writefln("args.length = %d\n", args.length);
for (int i = 0; i < args.length; i++)
writefln("args[%d] = '%s'\n", i, args[i]);
return 0;
}
44 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? param2
14. Aufgabe: Parameter
a) mit der Funktion atoi bzw. atof kann man einen String in eine Zahl umwandeln: k=atoi("123");
args[i] zeigt auf den i-ten Parameter
der 0.te Parameter ist der Pfad mit dem Programm
b) Schreiben Sie ein Programm, welches drei Parameter einliest c) Falls weniger Parameter eingegeben wurden, gibt das
Programm eine Fehlermeldung aus d) 1. Parameter umwandeln in eine Zahl: a e) 2. Parameter umwandeln in eine Zahl: b
f) 3. Parameter zeigt an, welche Operation durchgeführt werden soll
g) 12 33 + 2 5 /
45 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
V:\D\bspnew>param2 33 44+
Anzahl der Parameter 3
Zu wenig Parameter, Beispiel 44 33 + V:\D\bspnew>param2 33 44 +
Anzahl der Parameter 4 Ergebnis: 77
V:\D\bspnew>param2 33 44 / Anzahl der Parameter 4 Ergebnis: 0
V:\D\bspnew>param2 133 44 / Anzahl der Parameter 4
Ergebnis: 3
Beispielergebnis
46 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
struct
■ Wenn man mehrere Variablen pro Datensatz speichern möchte, so kann man mehrere einzelne Variable/Felder verwenden
■ ODER man verwendet eine Struktur
■ Eine Struktur wird verwendet, wenn man Variablen zusammenfügt, die logisch zusammen gehören
■ Die Methode offsetof liefert die Anfangsadresse im struct struct mystruct {
int k;
double d;
char c;
}
void main() { mystruct d;
d.k=44;
d.d=44.444;
d.c='p';
writefln("d: %d %f %c\n", d.k, d.d, d.c);
}
47 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? array4
15. Aufgabe: Point struct
a) Definition einer Struktur point mit den Variablen double x und y b) Deklaration in main
c) Initialisierung P1(3/4) und P2(5/6) d) Berechnen Sie die Summe der Punkte e) Ausgabe der einzelnen Werte
f) Bestimmen der Speicherung mittels "point.x.offsetof"
struct mystruct { int k;
double d;
char c;
}
void main() { mystruct d;
d.k=44;
d.d=44.444;
d.c='p';
writefln("d: %d %f %c\n", d.k, d.d, d.c);
}
48 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
struct mystruct {
int x=3; // Init
ubyte b=11;
double t=123.54;
char[9] sStr;
long d=33;
}
int main (char[][] args) { mystruct st;
writefln(mystruct.x.offsetof ); // 0 writefln(mystruct.b.offsetof ); // 4 writefln(mystruct.t.offsetof ); // 8 writefln(mystruct.sStr.offsetof ); // 16
writefln(mystruct.d.offsetof ); // 32(9) 24(5) 40(21) return 0;
}
Aligment in einer structure
49 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Eigenschaften einer structure
Eigenschaft eines Wertes in einer Struktur:
Offset in Bytes pro Feld (siehe Beispiel).
Wichtig dabei: Man muss den Strukturnamen und nicht die Variable benutzen.
.offsetof
Die Daten der aktuellen Variablen werden hintereinander ausgegeben, ohne Trennzeichen .tupleof
Ausrichtung der Struktur. Richtet sich nach dem größten datentyp (Charakter=1 bis4, byte=1;
int=4, long=8, float=4, double=8, real=10 ) .alignof
Anzahl der Bytes .sizeof
50 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Klassen
■ Klassen sind "Erweiterungen" von Strukturen und den dazu gehörigen Methoden
■ In einer Klasse werden Variablen definiert
■ Mittels Methoden, Funktionen, kann man auf diese zugreifen bzw. man kann Funktionen definieren, die den Zustand des Objektes verändert.
■ Zugriff für Variablen: private package public export
class Cbsp1 { int a;
}
int main(char[][] args) { Cbsp1 A;
A = new Cbsp1();
A.a = 33;
writefln("a: %d\n",A.a);
return 0;
}
class1
51 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class Cbsp2 { private
int a;
this() { a=22;
this(44); // demo }
this(int a) { this.a = a;
}
public int getA() { return a;
} }
52 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class CPoint { private
double x;
double y;
this() { this(1,1);
}
this(double x, double y) { this.x = x;
this.y = y;
}
public double getX() { return this.x;
}
public double getY() { return this.y;
}
} // CPoint
int main(char[][] args) {
CPoint p1 = new CPoint(3,4);
CPoint p2 = new CPoint(5,6);
writefln("P1: x %f y: %f", p1.getX() , p1.getY() );
writefln("P2: x %f y: %f", p2.getX() , p2.getY() );
return 0;
}
53 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Klassenvererbung
■ Existieren mehrere Klassen, die Gemeinsamkeiten haben, so könnte man diese in einen "Stammbaum" darstellen
■ In einer Klasse werden Variablen defniert
■ Mittels Methoden, Funktionen, kann man auf diese zugreifen bzw. man kann Funktionen definieren, die den Zustand des Objektes verändert.
■ Zugriff für Variablen: private package public export
class Cbsp1 { int a;
}
int main(char[][] args) { Cbsp1 A;
A = new Cbsp1();
A.a = 33;
writefln("a: %d\n",A.a);
return 0;
}
class1
54 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? class3
16. Aufgabe: Klasse CPoint
a) Definition einer Klasse CPoint mit den Variablen double x und y b) Definitionen von Konstruktoren
c) Definitionen Methoden (get/set, getHypo) d) Deklaration in main
e) Initialisierung P1(3/4) und P2(5/6) f) Testen der Methoden
g) Berechnen Sie der Hypothenuse h) Ausgabe der Hypothenuse
55 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class CFahrzeug { private
int _ps;
this() { this(0);
}
this(int ps) { _ps = ps;
}
public int getPS() { return _ps;
}
public void setPS(int ps) { _ps = ps;
}
} // Fahrzeug
// Abgeleitete Klasse class CPkw : CFahrzeug{
int _sitze;
this(int ps, int sitze) { _sitze = sitze;
super(ps);
}
public int getSitze () { return _sitze;
} // get_sitze
// set Methode fuer Variable _sitze public void setSitze (int sitze) {
_sitze=sitze;
} // set_sitze } // CPkw
class4
56 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
int main(char[][] args) {
CPkw p1 = new CPkw(123, 5);
writefln("PS: %d Sitze: %d\n", p1.getPS() , p1.getSitze() );
writefln("PS: %d Sitze: %d\n", p1._ps, p1._sitze );
return 0;
}
Datei "C:\Daten\D\bspnew\class4.d"
PS: 123 Sitze: 5 PS: 123 Sitze: 5 -- Fertig --
57 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Klassenvererbung
■ Plausibilitätskonstrollen werden üblicherweise in der set- Methode durchgeführt
■ D geht einen Schritt weiter. Es prüft bei jeder Änderung den Wert. Dazu gibt es den Abschnitt invariant
class Cbsp2 { private int a;
public void setA(int a) { this.a=a;
}
public void addN(int n) { this.a+=n;
}
public void calc() { a=−4; // negativ }
}
58 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class CDatum { private int day;
private int hour;
this(int day, int hour) { this.day = day;
this.hour=hour;
}
public void addDays(int days) { this.day = this.day - days;
}
invariant {
assert(1 <= day && day <= 31);
assert(0 <= hour && hour < 24);
} }
int main (char[][] args) {
CDatum datum= new CDatum(30,5);
datum.day=41;
datum.addDays(3);
return 0;
}
59 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? file5
Datei Ein- und Ausgabe
Dateien können zeilenweise eingelesen und geschrieben werden
Dateien können binär eingelesen und geschrieben werden
File myFile;
myFile = new File();
myFile.create("test.bin2);
myFile.write(123);
myFile.write(123.45);
myFile.close();
File myFile;
int i;
double d;
myFile = new File("test.bin");
myFile.read(i); // out Parameter writefln("i: %d\n",i);
myFile.read(d); // out Parameter writrefln("d: %f\n",d);
myFile.close();
60 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? student1
17. Aufgabe: Klasse CStudent
a) Definition einer Klasse CStudent mit den Attributen: MatrNr, Name b) Definitionen von Konstruktoren c) Definitionen Methoden (get/set)
d) Definitionen Methoden (saveToFile, loadFromFile) e) Deklaration in main
f) Initialisierung std1(…..), std2(..) g) Testen der Methoden
h) Speichern und laden in zwei verschiedene Dateien student1.bin student2.bin
61 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? Student1/2
18. Aufgabe: Klasse CStudent
a) Definition einer Klasse CStudent
mit den Attributen: MatrNr, Name, Geburtsjahr, Ort b) Definitionen von Konstruktoren
c) Definitionen Methoden (get/set)
d) Definitionen Methoden (saveToFile, loadFromFile) e) Deklaration in main
f) Initialisierung std1(…..), std2(..) g) Testen der Methoden
h) Speichern von student1.bin
i) Laden von student1.bin student2.bin
62 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? Student1/2
19. Aufgabe: Klasse CStudent
a) Definition einer Klasse CStudent
mit den Attributen: MatrNr, Name, Geburtsjahr, Ort b) Definitionen von Konstruktoren
c) Definitionen Methoden (get/set)
d) Definitionen Methoden (saveToFile, loadFromFile) e) Deklaration in main
f) Initialisierung std1(…..), std1(..) g) Testen der Methoden
h) Speichern und laden in zwei verschiedene Dateien student1.bin student2.bin
63 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? student2
20. Aufgabe: Das Sieb des Eratosthenes
Prizahlen
a) Definition einer Klasse CStudent
mit den Attributen: MatrNr, Name, Geburtsjahr, Ort b) Definitionen von Konstruktoren
c) Definitionen Methoden (get/set)
d) Definitionen Methoden (saveToFile, loadFromFile) e) Deklaration in main
f) Initialisierung Std(…..) g) Testen der Methoden h) Speichern und laden
64 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
20. Aufgabe: Das Sieb des Eratosthenes
Primzahlen können über verschiedene Methoden berechnet werden:
■Testen für jede Zahl x, ob die Zahlen 1 bis sqrt(x)+1 echte Teiler sind
■Sieb des Erastosthenes - Feld anlegen
- alle bekommen den Wert true = Primzahl
T T T T T T T T T T T T T T F
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
65 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
int main(){
bool flags[24];
int i, prime, k, count;
count = 0;
// init flags for (……){
if (flags[i]) { prime = i;
while ( Bedingung ){
….
}
count += 1;
} // if } // for
writefln ("\n%d Anzahl der Primzahlen\n", count);
return 0;
}
66 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Threads
■ Threads sind die Basis für Multithreaded-Programme. Diese sind heute bei Computern mit Dual-Core-CPU wichtiger denn je.
■ Jeder Thread muss eine Instanz der Klasse Thread oder einer abgeleiteten Klasse sein.
■ Die Klasse Thread orientiert sich sehr an der Implementation in Java.
■ Das Prinzip von Threads ist, das die Arbeit auf mehrere gleichzeitig laufende Methoden verlagert wird
■ Modulname: std.thread
67 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? Thread2
import std.stdio;
import std.thread;
import std.random;
// mit Umleitung class CThread :Thread {
int nr;
this (int nr) { super();
this.nr = nr;
}
int run() {
for (int i=0; i<100; i++) { writefln("%d",nr);
} return 0;
} }
68 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D? Thread2
int main (char[][] args) {
CThread t1 = new CThread(1);
CThread t2 = new CThread(2);
t1.start();
t2.start();
t1.wait(); // notwendig t2.wait();
writefln("ende");
return 0;
}
Threads
Ergebnis:
Ausgabe von 1 und 2 In beliebiger Reihenfolge
69 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Threads: Summenberechnung
int summe;
class CThread :Thread { int nr;
this (int nr) { super();
this.nr = nr;
}
int run() {
for (int i=0; i<1000; i++) { int k=summe;
k=k+nr;
summe=k;
} return 0;
} }
int main (char[][] args) { CThread t1 = new CThread(1);
CThread t2 = new CThread(2);
summe=0;
t1.start();
t2.start();
t1.wait();
t2.wait();
writef("\nSumme (3000): %d", summe);
return 0;
}
70 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Problem der Threads
■ Die Threads haben Zugriff auf eine ungeschützte Variable
■ Race-Condition, Parkplatzproblem zweier Autos
■ Je nach Konstellation werden unterschiedliche Summen errechnet
Zeit- punkt
Thread A
(Einzahlung 100 €)
Kontostand Thread B
(Einzahlung 50 €)
1 200 € i = Kontostand
2 Prozesswechsel
3 i = Kontostand
4 Kontostand = i+100 € 300 €
5 Prozesswechsel
6 250 € Kontostand = i+50 €
Problem: Verlust einer Buchung
71 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
// schlechter int run() {
for (int i=0; i<1000; i++) { int k=summe;
k=k+nr;
pause() summe=k;
}
return 0;
}
// besser int run() {
for (int i=0; i<1000; i++) { summe+=nr;
}
return 0;
}
Problem der Threads: run-Methoden
72 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class CSumme { int summe;
this() { summe=0;
}
void add(int nr) { summe+=nr;
} }
Problem der Threads
class CThread :Thread { int nr;
CSumme cs;
this (int nr, CSumme cs) { super();
this.nr = nr;
this.cs = cs;
}
int run() { // working cs.add(nr);
return 0;
} }
73 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class CSumme { int summe;
this() { summe=0;
}
synchronized void add(int nr) { summe+=nr;
} }
Lösung des Problems der Threads
Hinweis:
Mit synchronized wird sichergestellt, dass nur ein Thread in diesen Bereich eintreten kann
74 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Beispiel:
Procedure Tausche
void change( int & a, int &b) { int h = a;
a = b;
b = h;
} //
void change( double & a, double &b) { double h = a;
a = b;
b = h;
} //
75 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Templates
• Templates sind Algorithmen, die den Quellcode beschreiben, aber keinen dazugehörigen Datentyp benutzen.
• Erst bei der Benutzung muss man den Datentyp angeben.
• Der Vorteil liegt in der einmaligen Beschreibung des Algorithmus. Unterschieden wird zwischen Funktions- und Klassentemplates.
76 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
int getMax(int a, int b) { if (a>b)
return a;
else return b;
}
Funktionstemplate Beispiel: Deklaration
float getMax(float a, float b) { if (a>b)
return a;
else return b;
}
T getMaxTemp(T) (T a, T b) { if (a>b)
return a;
else return b;
}
77 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
int i;
float f;
i = getMax(3,5);
writefln("getMax i %d",i);
f = getMax(3.0,5.0);
writefln("getMax f %f",f);
alias getMaxTemp!(int) getMi;
i = getMi(3,5);
writefln("getMaxTemp i %d",i);
alias getMaxTemp!(float) getMf;
f = getMf(3.55,5);
writefln("getMaxTemp f %f",f);
Funktionstemplate Beispiel: Benutzung
78 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
class TempClass1(T) {
T a;
this(T a) { this.a = a;
}
public T getA() { return a;
} }
Klassentemplate Beispiel: Deklaration
79 FB Automatisierung und Informatik: Projektwoche SoSe 2010, Sprechen Sie D?
Klassentemplate Beispiel: Benutzung
int main (char[][] args) {
alias TempClass1!(int) CI; // Class Int CI ci = new CI(5);
writefln("a: %d", ci.getA() );
alias TempClass1!(double) CD; // Class Double
CD cd = new CD(5.45433);
writefln("a: %f", cd.getA() );
return 0;
}