Top Banner
Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005
88

Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

Apr 06, 2015

Download

Documents

Gertrúd Aigner
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

Einführung in dieSoftware-Entwicklung mit

Delphi Teil 2

Klaus Becker

2005

Page 2: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

2 Miniprojekt „Chiffrierung“

PYLZFOWBNQCYBUVNCBLGYCHY AYBYCGMWBLCZNYHNTCZZYLN

VDOYHFDHVDU

Datenmodelle entwickeln Zeichen und Zeichenketten verarbeiten Schnittstellenbeschreibungen lesen Vordefinierte Komponenten benutzen Module testen und Fehler suchen

Page 3: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

3 Teil 1

Ein einfaches Chiffriersystem

Page 4: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

4 Chiffrierung nach Caesar

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

Schlüssel: 3Quelltext:

SALVECAESAR

Geheimtext:VDOYHFDHVDU

PYLZFOWBNQCYBUVNCBLGYCHY AYBYCGMWBLCZNYHNTCZZYLN

VDOYHFDHVDU

Page 5: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

5 Chiffriersystem

3

VDOYHFDHVDU

Geheimtext

Schlüssel

Verschlüsselung

Quelltext

Schlüssel

Entschlüsselung

Quelltext

SALVECAESAR

3

SALVECAESAR

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

Page 6: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

6 Zielsetzung

Ziel ist es, ein System zu entwickeln, mit dem der Benutzer Texte nach der Caesar-Methode verschlüsseln und wieder entschlüsseln kann.

Page 7: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

7 Anforderungen

/1/ Der Benutzer kann Texte selbst eingeben.

/2/ Der Benutzer kann den Schlüssel (0..25) vorgeben.

/3/ Der verschlüsselte Text wird angezeigt und kann auch wieder entschlüsselt werden.

/4/ Erweiterung: Das Programm bereitet den Text geeignet vor: entfernt Leerzeichen; wandelt Umlaute um etc.

...

Page 8: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

8 Erweitertes Datenmodell

quelltext: string;geheimtext: string;schluessel: integer;

3

SALVECAESAR VDOYHFDHVDU

Geheimtext

Schlüssel

Verschlüsselung

Quelltext

Schlüssel

Entschlüsselung

Quelltext

SALVECAESAR

3

Daten

Operationen auf den Datenprocedure verschluesseln;procedure entschluesseln;

Page 9: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

9

unit Unit1;interfaceuses Windows, ...;type TForm1 = class(TForm) ... BVerschluesseln: TButton; BEntschluesseln: TButton; procedure BVerschluesselnClick(Sender: TObject); procedure BEntschluesselnClick(Sender: TObject); private { Private-Deklarationen } quelltext: string; geheimtext: string; schluessel: integer; procedure verschluesseln; procedure entschluesseln; public { Public-Deklarationen } end;var Form1: TForm1;

Implementierung

Erweitertes Datenmodell

Page 10: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

10 Implementierung

implementation

{$R *.DFM}

procedure TForm1.verschluesseln;begin// ...end;

procedure TForm1.BVerschluesselnClick(Sender: TObject);begin// Daten aktualisierenschluessel := StrToInt(ESchluessel.Text);quelltext := EQuelltext.Text;// Daten verarbeitenverschluesseln;// Benutzungsoberfläche aktualisierenEGeheimtext.Text := geheimtext;end;

...

end.

Algorithmus zur Operation

Ausführung der Operation

Page 11: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

11 Exkurs: Datentyp „char“

Code Zeichen

... ...10 LF... ...13 CR... ...65 'A'66 'B'... ...90 'Z'... ...97 'a'98 'b'... ...122 'z'... ...

Mit Hilfe des Datentyps „char“ werden in Delphi / Pascal Zeichen beschrieben. Die zulässigen Zeichen und ihre Nummerierung werden durch den ASCII-Code festgelegt.

http://de.selfhtml.org/inter/zeichensaetze.htm

Zulässige Zeichen

ASCII-Zeichensatz

Beachte:Darstellung mit Hochkommata

Page 12: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

12 Exkurs: Datentyp „char“

Code Zeichen

... ...10 LF... ...13 CR... ...65 'A'66 'B'... ...90 'Z'... ...97 'a'98 'b'... ...122 'z'... ...

Mit Hilfe der Operationen „ord“ und „chr“ kann man die Zuordnung zwischen Code und Zeichen wechselseitig bestimmen.

ord: char {0 ... 255}

ord('A') 65

chr: {0 ... 255} char

chr(65) 'A'

Operation „Kodieren“

Operation „Dekodieren“

Page 13: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

13 Exkurs: Datentyp „string“

'Hallo'

'SALVE CAESAR!'

'Delphi 8.0'

''

'unit Unit1;[LF][CR]interface[LF][CR]uses [LF][CR]Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Spin;'

Mit Hilfe des Datentyps „string“ werden in Delphi / Pascal Zeichenketten beschrieben.

Beachte:Darstellung mit Hochkommata

Im voreingestellten Status kann eine Zeichenkette vom Datentyp „string“ bis etwa 231 Zeichen lang sein.

Leere Zeichenkette

Zeichenkette mit Steuerzeichen für Zeilenumbrüche

Page 14: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

14 Exkurs: Datentyp „string“

var quelltext: string; c: char; n: integer;

quelltext := 'Hallo!'; // quelltext: 'Hallo!'

n := length(quelltext); // n: 6

c := quelltext[1]; // c: 'H'

quelltext[1] := 'h'; // quelltext: 'hallo '

quelltext := quelltext + ' Caesar' // quelltext: 'hallo Caesar'

n := length(quelltext); // n: 12

Der Zugriff auf die einzelnen Zeichen einer Zeichenkette erfolgt über einen Index. Die Länge einer Zeichenkette bestimmt man mit der vordefinierten Operation „length“:Zeichenketten kann man mit dem Konkatenationsoperator „+“ aneinander hängen.

Zugriff auf Zeichen

Konkatenation

Längenbestimmung

Page 15: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

15 Verschlüsselungsalgorithmus

Code Zeichen

... ...65 'A'66 'B'67 'C' 68 'D' 69 'E'70 'F'... ...

ord: char {0; ...; 255}

ord('B') 66

chr: {0; ...; 255} char

chr(69) 'E'

Wir gehen zunächst davon aus, dass der Quelltext nur aus Großbuchstaben besteht.

verschluesseln

geheimtext := ''

FÜR i VON 1 BIS length(quelltext)

c := quelltext[i]

n := ord(c)

n := n + schluessel

n > 90ja nein

n := n - 26

d := chr(n)

geheimtext := geheimtext + d

Page 16: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

16

Implementierung als Unterprogramm

procedure TForm1.verschluesseln; var i, n: integer;begingeheimtext := '';for i := 1 to length(quelltext) do begin n := ord(quelltext[i]); n := n + Schluessel; if n > 90 then n := n-26; geheimtext := geheimtext + chr(n); endend;

...begin...verschluesseln;...end;

Ein Unterprogramm ist eine Programmeinheit, die Anweisungen zur Lösung eines Teilproblems zu einer neuen Einheit zusammenfasst.

Deklaration des Unterprogramms

Aufruf des Unterprogramms

verschluesseln

geheimtext := ''

FÜR i VON 1 BIS length(quelltext)

c := quelltext[i]

n := ord(c)

n := n + schluessel

n > 90ja nein

n := n - 26

d := chr(n)

geheimtext := geheimtext + d

Page 17: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

17 Aufgabe

Code Zeichen

... ...65 'A'66 'B'67 'C' 68 'D' 69 'E'70 'F'... ...

ord: char {0; ...; 255}

ord('B') 66

chr: {0; ...; 255} char

chr(69) 'E'

Ergänzen Sie den Algorithmus zum Entschlüsseln.

Page 18: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

18 Aufgabe

Implementieren Sie die Algorithmen. Ergänzen Sie hierzu das bereits erstellte Programmfragment im Verzeichnis „Caesar1-Grundprogramm-Aufgabe“.

Page 19: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

19 Aufgabe

Das Programm soll anschließend wie folgt verbessert werden:- Im Quelltext sollen alle Kleinbuchstaben in Großbuchstaben umgewandelt werden.- Im Quelltext sollen alle Umlaute durch Vokalkombinationen ersetzt werden.- Im Quelltext sollen alle Sonderzeichen (wie Leerzeichen, Satzzeichen etc.) gelöscht werden.Beispiel: Ich würde gerne dösen. ICHWUERDEGERNEDOESENHierzu soll ein zusätzlicher Button eingeführt werden (vgl. nächste Folie).

Page 20: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

20 Aufgabe

Page 21: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

21 Teil 2

Schnittstelle eines Unterprogramms

Page 22: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

22 Zielsetzung

Die Vorbereitung des Quelltextes lässt sich auch mit Hilfe vordefinierter String-Operationen (Length, Pos, Delete, Insert) implementieren. Hierzu muss man genau wissen, wie diese String-Operationen benutzt werden können. Alle Informationen, die man zur Benutzung einer Operation benötigt, werden in einer sog. Schnittstellenbeschreibung festgelegt. Ziel ist es hier, den Umgang mit Schnittstellenbeschreibungen kennen zu lernen.

Page 23: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

23 Schnittstellenbeschreibungen

function Length(S: string): integer;

Beschreibung:Length gibt die Anzahl der im angegebenen String vorhandenen Zeichen zurück.

Beispiel:Anzahl := Length('Delphi'); {Anzahl: 6}

function Pos(Substr: string; S: string): integer;

Beschreibung:Pos sucht in dem String S nach dem Teilstring Substr. Wird der Teilstring gefunden, gibt Pos den Integer-Index des ersten Zeichens von Substr in S zurück. Die Groß/Kleinschreibung wird von Pos nicht berücksichtigt. Ist Substr nicht vorhanden, wird der Wert 0 zurückgegeben.

Beispiele:Position := Pos('hi', 'Delphibuch'); {Position: 5}Position := Pos('Hi', 'Delphibuch'); {Position: 5}Position := Pos('hihi', 'Delphibuch'); {Position: 0}

Delphi-Hilfe

Delphi-Hilfe

Page 24: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

24 Schnittstellenbeschreibungen

procedure Delete(var S: string; Index, Count: integer);

Beschreibung:Delete entfernt, beginnend mit S[Index], Count Zeichen aus dem String S. Ist der Wert von Index größer als die Länge von S, werden keine Zeichen gelöscht. Werden mit Count mehr Zeichen angegeben, als beginnend bei S[Index] im String vorhanden sind, wird der Rest des Strings gelöscht.

Beispiel:{Wort: 'Delphibuch'}Delete(Wort, 4, 3);{Wort: 'Delbuch'}

procedure Insert(Source: string; var S: string; i: integer);

Beschreibung:Insert fügt Source in S an der Position S[i] ein.

Beispiel:{Wort: 'Delbuch'}Insert('phi', Wort, 4);{Wort: 'Delphibuch'}

Delphi-Hilfe

Delphi-Hilfe

Page 25: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

25 Schnittstellenbeschreibungen

function Copy(S: string; Index, Count: Integer): string;

Beschreibung:S ist ein Ausdruck des Typs String. Index und Count sind Integer-Ausdrücke. Copy gibt einen Substring zurück, das Count Zeichen oder Elemente ab S[Index] enthält. Ist Index größer als die Länge von S, gibt Copy einen leeren String zurück. Gibt Count mehr Zeichen oder Array-Elemente an, als verfügbar sind, werden nur die Zeichen oder Elemente von S[Index] bis zum Ende von S zurückgegeben.

Beispiel:{Wort: 'Delphibuch'}Teilwort := Copy(Wort, 7, 4);{Wort: 'Delphibuch'; Teilwort: 'buch'} Delphi-Hilfe

Page 26: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

26 Funktionen / Prozeduren

procedure Insert(Source: string; var S: string; i: integer);

Beispiel:{Wort: 'Delbuch'}Insert('phi', Wort, 4);{Wort: 'Delphibuch'}

function Length(S: string): integer;

Beschreibung:Length gibt die Anzahl der im angegebenen String vorhandenen Zeichen zurück.

Beispiel:Anzahl := Length('Delphi'); {Anzahl: 6}

Typ des Rückgabewerts

Aufruf als eigenständige

Anweisung

Eine Prozedur ist ein Unterprogramm ohne Rückgabewert, eine Funktion ein Unterprogramm mit Rückgabewert.

Aufruf nur mit Weiterverarbeitung des

Rückgabewerts

Page 27: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

27 Parameter

Mit Hilfe von Parametern kann man Daten zur Laufzeit an das betreffende Unterprogramm übergeben. Bei der Deklaration werden für die zu übergebenden Daten Platzhalter (formale Parameter) eingeführt, denen zur Laufzeit dann bestimmte Werte (aktuelle Parameter) übergeben werden.

procedure Delete(var S: string; Index, Count: integer);

Beispiel:

{Z: ['Baumschule']}

Delete(Z, 5, 6)

{Z: ['Baum']}

Formale Parameter(Platzhalter)

Aktuelle Parameter(übergebene Daten)

Page 28: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

28 Parameter

procedure Delete(var S: string; Index, Count: integer);

Beispiel:

{Z: ['Baumschule']}

Delete(Z, 5, 6)

{Z: ['Baum']}

Aktuelle Parameter(übergebene Daten)

Delete

var S: string

Index: integer

Count: integer

Z

5

6

Import/Export-Situation

Import-Situation

Import-Situation

Formale Parameter(Platzhalter)

Page 29: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

29 Parameterübergabemechanismen

{Z: ['Baumschule']}

Delete

[ ]:S

[5]:Index

[6]:Count

5

6

Referenzbildung

Wertübergabe

Wertübergabe

Delete(Z, 5, 6)

{Z: ['Baum']}

Z: ['Baumschule']AdresseWert

Wert

Delete

[ ]:S

[ ]:Index

[ ]:Count

5

6

Z: ['Baum']

Page 30: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

30 Parameterübergabemechanismen

Delete

[ ]:S

[5]:Index

[6]:Count

5

6

Referenzbildung

Wertübergabe

Wertübergabe

Z: ['Baumschule']AdresseWert

Wert

Referenzparameter

Werteparameter

Delete(Z, 5, 6)Prozeduraufruf:

aktuelle Parameter

Übergabesituation:

Übergabemechanismen:call-by-value: Der Wert des aktuellen Parameters wird an den Werteparameter übergeben.call-by-reference: Es wird eine Referenz zwischen dem aktuellen Parameter und dem Referenzparameter erzeugt.

Page 31: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

31 Datenaustauschsituationen

P

xt

Daten-Import: Der aktuelle Parameter kann ein Term sein. Der Wert des Terms wird durch call-by-value an den Werteparameter übergeben.

P

var xy

Daten-Export: Der aktuelle Parameter muss eine Variable sein. Der Referenzparameter wird durch call-by-reference an den aktuellen Parameter gebunden.

P

var xy

Daten-Transport: Der aktuelle Parameter muss eine Variable sein. Der Referenzparameter wird durch call-by-reference an den aktuellen Parameter gebunden.

Page 32: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

32 Aufgabe

Ziel ist es, eine Prozedur zu entwickeln, mit der man innerhalb einer Zeichenkette eine Zeichenkette durch eine neue Zeichenkette ersetzen kann.

Bsp.: Ersetze `Hans` durch `Peter` innerhalb von `Hans im Glück‘

Spezifizieren Sie zunächst den Datenaustausch / die Parameter der Prozedur.

Page 33: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

33 Lösungsvorschlag

Ersetze

alt: string

neu: string

var text: string

'ß'

'SS'

hilf

Datenaustausch:

Verhaltensbeschreibung:

Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „text“ die Zeichenkette „alt“ durch die neue Zeichenkette „neu“.

Beispiel:{hilf: ['Hans im Glück']}Ersetze('Hans', 'Peter', hilf);{hilf: ['Peter im Glück']}

procedure Ersetze(alt: string; neu: string; var text: string);

Deklaration:

Page 34: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

34 Aufgabe

Sie finden unten einen Implementierungsvorschlag für die Prozedur „ersetze“. Analysieren Sie den zu Grunde liegenden Algorithmus und beschreiben Sie ihn möglichst verständlich.

procedure ersetze(alt: string; neu: string; var text: string); var stelle: integer; hilfstext: string;beginhilfstext := '';stelle := pos(alt, text);while stelle > 0 do begin hilfstext := hilfstext + Copy(text, 1, stelle-1) + neu; Delete(text, 1, stelle+length(alt)-1); stelle := pos(alt, text); end;hilfstext := hilfstext + text;text := hilfstext;end;

Page 35: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

35 Lösungsvorschlag

Page 36: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

36 Modultest

Mit einem Modultest überprüft man, ob eine Programmeinheit (z. B. eine Prozedur) das gewünschte Verhalten zeigt.

Tipps:

Modultests auf jeden Fall durchführen.

Mit Modultests so früh wie möglich beginnen.

Modultests möglichst isoliert durchführen.

Möglichst alle relevanten Testfälle prüfen.

Auch Sonderfälle prüfen.

Page 37: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

37 Testumgebung

program Project1;{$APPTYPE CONSOLE}uses sysutils;

var meinText: string; ersetzeText: string; durchText: string;

procedure ersetze(alt: string; neu: string; var text: string);...

begin {Hauptprogramm}write('alter Text: '); readln(meinText);write('ersetze: '); readln(ersetzeText);write('durch: '); readln(durchText);ersetze(ersetzeText, durchText, meinText);write('neuer Text: '); writeln(meinText);readln;end.

Delphi-Konsolenanwendung

Page 38: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

38 Aufgabe

Starten Sie das Testprogramm im Verzeichnis „KonsolenanwendungErsetzen“

Testen Sie, ob die Prozedur „ersetze“ das gewünschte Verhalten zeigt. Testen Sie insbesondere auch extreme Testfälle (z. B.: das zu ersetzende Zeichen kommt auch in der neuen Zeichenkette vor).

Fertigen Sie ein Testprotokoll an (vgl. nächste Folie).

Page 39: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

39 Testprotokoll

{vorher: meinText: 'Hans im Glück' ersetzeText: 'Hans' durchText: 'Peter' }

ersetze(ersetzeText, durchText, meinText);

{nachher: meinText: 'Peter im Glück'}

Page 40: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

40

Schnittstelle eines Unterprogramms

Für die Benutzung eines Unterprogramms muss man nur die Signatur und das Verhalten des Unterprogramms kennen. Diese legen die sog. Schnittstelle des Unterprogramms fest.

ersetze

alt: string

neu: string

var text: string

Signatur:

procedure Ersetze ( string; string; string)

Verhaltensbeschreibung:

Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „text“ die Zeichenkette „alt“ durch die neue Zeichenkette „neu“.

Page 41: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

41 Teil 3

Vordefinierte Komponenten

Page 42: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

42 Zielsetzung

Die Programmoberfläche soll benutzerfreundlicher gestaltet werden:

/1/ Bei der Auswahl des Schlüssels sollen die zur Verfügung stehenden Möglichkeiten voreingestellt sein.

/2/ Für die Eingabe des Quelltextes soll ein mehrzeiliges Eingabefeld zur Verfügung stehen.

/3/ Texte sollen auch geladen und gespeichert werden können.

Page 43: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

43 Sichere Eingabe des Schlüssels

TSpinEdit-Komponente

Page 44: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

44 Sichere Eingabe des Schlüssels

SpEdSchluessel: TSpinEditAttribute

MinValue = 0

MaxValue = 25

Value = 3

...Ereignisse

OnChange: SpEdSchluesselChange

...Methoden

...

procedure TForm1.SpEdSchluesselChange(Sender: TObject);beginschluessel := SpEdSchluessel.Value;end;

Page 45: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

45 Mehrzeilige Eingabe von Texten

TMemo-Komponente

Page 46: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

46 Mehrzeilige Eingabe von Texten

MQuelltext: TMemoAttribute

Text = 'DASHANDELN... '

ScrollBars = ssVertical

Lines = ...

...Ereignisse

...Methoden

...

Hinweis:Der Gesamttext wird mit dem (nicht vom Objektinspektor angezeigten) Attribut „Text“ verwaltet. Dieser Gesamttext enthält dann aber auch Zeichen zur Darstellung von Zeilenumbrüchen.

procedure TForm1.BVerschluesselnClick (Sender: TObject);begin// Daten aktualisierenquelltext := MQuelltext.Text;// Daten verarbeitenverschluesseln;// Benutzungsoberfläche aktualis.MGeheimtext.Text := geheimtext;end;

Page 47: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

47 Mehrzeiliges Eingabefeld

TMemoAttribute

Text : string

ScrollBars : TScrollStyle

Lines : TStrings

...Ereignisse

...Methoden

...

TStringsAttribute

Strings[Index: Integer]: string

Count: Integer

...Ereignisse

...Methoden

procedure Add(S: string)

procedure Clear

procedure Delete(Index: Integer)

procedure Insert(Index: Integer; S: string)

procedure LoadFromFile(FileName: string)

procedure SaveToFile(FileName: string)

...

Erweiterung:Mit einem zusätzlichen Button soll der Inhalt des TMemo-Feldes gelöscht werden.

Page 48: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

48 Mehrzeilige Eingabe von Texten

TStringsAttribute

Strings[Index: Integer]: string

Count: Integer

...Ereignisse

...Methoden

procedure Add(S: string)

procedure Clear

procedure Delete(Index: Integer)

procedure Insert(Index: Integer; S: string)

procedure LoadFromFile(FileName: string)

procedure SaveToFile(FileName: string)

...

MQuelltext.Lines.Clear;

MQuelltext.Lines.Add('Hallo ..');

MQuelltext.Lines.Add('wie ...');

zeilen := MQuelltext.Lines.Count;

MQuelltext.Lines.Delete(0);

MQuelltext.Lines.Insert(0, '..');

MQuelltext: TMemoAttribute

Text = 'Hallo Caesar[LF][CR]wie ...'

ScrollBars = ssVertical

Lines.Strings = 0: 'Hallo Caesar' 1: 'wie geht’s?'

Lines.Count = 2

...

Page 49: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

49 Laden und Speichern

TOpenDialog-Komponente

TOpenDialogAttribute

FileName: TFileName;

...Ereignisse

...Methoden

function Execute: Boolean;...

Page 50: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

50 Laden und speichern

TOpenDialogAttribute

FileName: TFileName;

FileName dient zur Speicherung des Dateinamens

....Ereignisse

...Methoden

function Execute: Boolean;...

procedure TForm1.BLadenQClick(Sender: TObject);beginif OpenDialog1.Execute then MQuelltext.Lines.LoadFromFile(OpenDialog1.Filename);end;

MQuelltext: TMemo

BLadenQ: TButton

OpenDialog1:

TOpenDialog

Execute öffnet das Dialogfeld zur Auswahl von Dateien und gibt True zurück, wenn der Benutzer eine Datei ausgewählt und auf OK geklickt hat. Klickt der Benutzer auf Abbrechen, liefert Execute False zurück.

Page 51: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

51 Aufgabe

Kopieren Sie das bisher entwickelte Delphi-Projekt in einen neuen Ordner. Verändern Sie das Programm anschließend so, dass es die angesprochenen benutzerfreundlichen Eigenschaften hat. Gehen Sie dabei schrittweise vor:

Schritt 1: Sichere Eingabe des Schlüssels mit einer „Spin-Edit-Komponente“

Schritt 2: Mehrzeiliges Textfeld mit Hilfe einer „Memo-Komponente“

Schritt 3: Laden und Speichern von Texten mit „Dialog-Komponenten“

Page 52: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

52 Aufgabe

Analysieren Sie die Veränderungen, die man vornehmen muss. Ändert sich das (erweiterte) Datenmodell? Was muss im Gesamtprogramm geändert werden?

Page 53: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

53 Trennung: Datenmodell – GUI

... private { Private-Deklarationen } quelltext: string; geheimtext: string; schluessel: integer; procedure verschluesseln; procedure entschluesseln; procedure vorbereiten;

...

procedure TForm1.verschluesseln; var i, n: integer;begingeheimtext := '';for i := 1 to length(quelltext) do begin n := ord(quelltext[i]); n := n + Schluessel; if n > 90 then n := n-26; geheimtext := geheimtext + chr(n); endend;

Keine Veränderung des Datenmodells erforderlich

Veränderung und Erweiterung der

Benutzungsoberfläche

Page 54: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

54 Trennung: Datenmodell – GUI

Ein grundlegendes Prinzip beim Entwurf von Software-Systemen besteht heute in der klaren Trennung zwischen Benutzungsoberfläche und Fachkonzept / Datenmodell. (H. Balzert: Lehrbuch Grundlagen der Informatik. S. 123)

Die Benutzungsoberfläche ist für die Kontrolle (control) und Ansicht (view) der Eingabe-/Ausgabe-Daten zuständig, während das Datenmodell (model) zur internen Speicherung der Daten dient. Eine Trennung dieser Bereiche erleichtert es, Programme zu warten und verändern.

Page 55: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

55 Teil 4

Datenstruktur „Reihung“

Page 56: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

56 Zielsetzung

Die Kodierung soll mit einer beliebigen Chiffriertabelle erfolgen. Der Benutzer hat die Möglichkeit, eine beliebige Chiffriertabelle selbst einzugeben.

Page 57: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

57 Beliebige Chiffriertabelle

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

K L Q D T I G A Y U O H B W R F S X E N M Z V J P C

Schlüssel: KLQDTIGAY...Quelltext:

SALVECAESAR

Geheimtext:EKHZTQKTEKX

Schlüssel: K L Q D T I ...Quelltext:

SALVECAESAR

Geheimtext:EKHZTQKTEKX

Reihung von Zeichen

Zeichenkette

Page 58: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

58 Reihung von Zeichen

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

K L Q D T I G A Y U O H B W R F S X E N M Z V J P C

QcodeC:

LcodeB:

TcodeE:

DcodeD:

...

IcodeF:

Lkodierung: Q D T I ...

2 3 4 5 6 ...

ReihungIndex

CcodeZ:

KcodeA:

K

1

... ... C

... ... 26

Element

Lkodierung: Q D T I ...

B C D E F ...

ReihungIndex

K

A

... ... C

... ... Z

Element

Mit Hilfe der Datenstruktur Reihung werden gleichartige Daten (die also vom gleichen Typ sind) zu einer Einheit zusammengefasst.

Ungünstig!

Page 59: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

59 Deklaration einer Reihung

Lkodierung: Q D T I ...

2 3 4 5 6 ...

K

1

... ... C

... ... 26

Lkodierung: Q D T I ...

B C D E F ...

K

A

... ... C

... ... Z

type tKodierung = array [1..26] of char;

... kodierung: tKodierung;

type tKodierung = array ['A'..'Z'] of char;

... kodierung: tKodierung;

Indexbereich

Elementtyp

Indexbereich

Elementtyp

Page 60: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

60 Deklaration einer Reihung

type tKodierung = array [1..26] of char;

type tBuchstabe = 'A'..'Z'; tKodierung = array [tBuchstabe] of char;

Eine Reihung des hier vorgestellten Typs hat eine feste Anzahl von Elementen. Der Indexbereich wird dabei über eine Aufzählung festgelegt.

type tKodierung = array ['A'..'Z'] of char;

Page 61: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

61 Zugriff auf Elemente

type tKodierung = array [1..26] of char;var kodierung: tKodierung;

Auf die Datenelemente einer Reihung kann man über den Index zugreifen.

type tKodierung = array ['A'..'Z'] of char;var kodierung: tKodierung;

kodierung[1] := '*';kodierung[2] := '*';kodierung[3] := '*';...

var i: integer;

for i := 1 to 26 do kodierung[i] := '*';

kodierung['A'] := '*';kodierung['B'] := '*';kodierung['C'] := '*';...

var c: char;

for c := 'A' to 'Z' do kodierung[c] := '*';

Page 62: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

62 Zugriff auf Elemente

Der Index kann innerhalb einer Anweisung auch zur Laufzeit berechnet werden.

type tKodierung = array ['A'..'Z'] of char;var kodierung: tKodierung;

kodierung['A'] := 'B';kodierung['B'] := 'C';kodierung['C'] := 'D';...kodierung['Z'] := 'A';

var i: integer;

for i := 65 to 89 do kodierung[chr(i)] := chr(i+1);kodierung[chr(90)] := chr(65);

Page 63: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

63

verschluesseln

geheimtext := ''

FÜR i VON 1 BIS length(quelltext)

c := quelltext[i]

n := ord(c)

n := n + schluessel

n > 90ja nein

n := n - 26

d := chr(n)

geheimtext := geheimtext + d

AufgabePassen Sie den Algorithmus an die neue Datenstruktur an.quelltext: string;geheimtext: string;schluessel: integer;

type tKodierung = array ['A'..'Z'] of char;quelltext: string;geheimtext: string;kodierung: tKodierung;

bisher

Page 64: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

64 Aufgabe

Ändern Sie das Chiffriersystem so ab, dass man beliebige Kodierungen vornehmen kann. Benutzen Sie das Programmgerüst aus dem Verzeichnis „Chiffrierung1 – Programmgeruest“.

Page 65: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

65 Teil 5

Fehlersuche und Fehlervermeidung

Page 66: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

66 Ein merkwürdiges Ergebnis

Das Programm liefert ein (auf den ersten Blick) merkwürdiges Ergebnis, wenn der Quelltext nicht vorbereitet ist.

Obelix

N0

Page 67: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

67 Debugger

Wir untersuchen das Laufzeitverhalten des Programms mit dem Delphi-Debugger.

Einzelne Anweisung

Gesamte Routine

Aktuell bearbeitete Anweisung

Page 68: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

68 Bereichsüberschreitung

Beim Verschlüsseln von Zeichenketten kann es zu Bereichsüberschreitungen beim Zugriff auf die Elemente der Reihung „kodierung“ kommen.type tKodierung = array ['A'..'Z'] of char;

... kodierung: tKodierung;

...

procedure TForm1.verschluesseln; var i: integer; quelle, geheim: char;begingeheimtext := '';for i := 1 to length(quelltext) do begin quelle := quelltext[i]; geheim := kodierung[quelle]; geheimtext := geheimtext + geheim; end;end;

{quelltext: 'Obelix'}

i := 2;

quelle := quelltext[2];

{quelle: 'b'}

geheim := kodierung[quelle];

{geheim: ?}

Bereichsüberschreitung

Page 69: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

69 Bereichsüberprüfung

Mit der Direktive $R kann die Generierung von Bereichsprüfungscode aktiviert und deaktiviert werden. Im Status {$R+} werden alle Ausdrücke, die Arrays und Strings indizieren, dahingehend überprüft, ob sie sich innerhalb der festgelegten Grenzen befinden. Der gleichen Prüfung werden alle Zuweisungen an skalare Variablen und Teilbereichsvariablen unterzogen. Das Fehlschlagen der Bereichsprüfung führt zu einer ERangeError-Exception (bzw. zum Programmabbruch, wenn die Exception-Behandlung nicht aktiviert ist).

Die Aktivierung der Bereichsprüfung vergrößert und verlangsamt ein Programm. Setzen Sie den Schalter {$R+} deshalb nur zum Testen mit dem Debugger ein.{$R+}

procedure TForm1.verschluesseln; var i: integer; quelle, geheim: char;begingeheimtext := '';for i := 1 to length(quelltext) do begin quelle := quelltext[i]; geheim := kodierung[quelle]; geheimtext := geheimtext + geheim; end;end;

Delphi-Hilfe

Page 70: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

70 Fehlerbehandlung

<Tools> <Debugger-Optionen> <Sprach-Exceptions> Bei Delphi-Exceptions stoppen []

{$R+}

procedure TForm1.verschluesseln; var i: integer; quelle, geheim: char;begingeheimtext := '';for i := 1 to length(quelltext) do begin quelle := quelltext[i]; try geheim := kodierung[quelle]; except geheim := ' '; showmessage('Quelltext nicht vorbereitet!'); end; geheimtext := geheimtext + geheim; end;end;

Vorbereitung

Page 71: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

71 Teil 5

Zusammenfassung

Page 72: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

72 Erweiterte Datenmodelle

Ein Datenmodell sollte nicht nur die Daten der Miniwelt, sondern auch die hiermit durchzuführenden Operationen erfassen.

Daten

Operationen auf den Daten

3

VDOYHFDHVDU

Geheimtext

Schlüssel

Verschlüsselung

Quelltext

Schlüssel

Entschlüsselung

Quelltext

SALVECAESAR

3

quelltext: string;geheimtext: string;schluessel: integer;

procedure verschluesseln;procedure entschluesseln;

Page 73: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

73 Trennung: Datenmodell – GUI

Der Vorteil der Trennung zwischen Datenmodell und GUI zeigt sich, wenn ein Programm verändert werden soll.

Datenmodell bleibt unverändert

GUI verändern

quelltext: string;geheimtext: string;schluessel: integer;

procedure verschluesseln;procedure entschluesseln;

Page 74: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

74

Schnittstelle eines Unterprogramms

Für die Benutzung eines Unterprogramms muss man nur die Signatur und das Verhalten des Unterprogramms kennen. Diese legen die sog. Schnittstelle des Unterprogramms fest.

ersetze

alt: string

neu: string

var text: string

Signatur:

procedure Ersetze ( string; string; string)

Verhaltensbeschreibung:

Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „text“ die Zeichenkette „alt“ durch die neue Zeichenkette „neu“.

Page 75: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

75 Schnittstelle einer Komponente

Für die Benutzung einer Komponente benötigt man eine genaue Beschreibung der Attribute, Methoden und Ereignisse. Eine Übersicht über die zur Verfügung stehende Attribute, Methoden und Ereignisse erhält man mittels eines Klassendiagramms.

SpEdSchluessel: TSpinEditAttribute

MinValue = 0

MaxValue = 25

Value = 3

...Ereignisse

OnChange: SpEdSchluesselChange

...Methoden

...

Page 76: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

76 Teil 6

Vertiefende Übungen

Page 77: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

77 Aufgabe

Entwickeln Sie ein System, mit dem man eine Zahlenfolge erzeugen und auswerten kann.

/1/ Der Benutzer kann eine Folge von 20 Zufallszahlen aus einem vorgegeben Bereich erzeugen lassen.

/2/ Auf Wunsch wird die kleinste und größte vorkommende Zahl der Folge bestimmt.

/3/ Auf Wunsch wird die Position der kleinsten und größten vorkommenden Zahl der Folge bestimmt und angezeigt.

Page 78: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

78 Aufgabe

Hilfen:

Ergänzen Sie zunächst das Datenmodell.

Entwickeln Sie anschließend Algorithmen für die benutzten Operationen.

Implementieren Sie abschließend das entwickelte System.

type tZahlenreihe = array zahlenreihe: tZahlenreihe;min, max: integer;minPos, maxPos: integer;

erzeugen;auswerten;

Page 79: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

79 Aufgabe

Entwickeln Sie ein System, mit dem man Würfelserien erzeugen und statistisch auswerten kann.

/1/ Der Benutzer kann eine Würfelserien mit einer vorgegeben Länge erzeugen.

/2/ Der Benutzer kann die Würfelserie auswerten lassen. Für jede Augenzahl wird die absolute (relative) Häufigkeit innerhalb der Würfelserie bestimmt.

/3/ Die Würfelserie wird angezeigt.

/4/Die Häufigkeiten werden angezeigt.

Page 80: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

80 Aufgabe

Hilfen:

Ergänzen Sie zunächst das Datenmodell.

Entwickeln Sie anschließend Algorithmen für die benutzten Operationen.

Implementieren Sie abschließend das entwickelte System.

type tAugen = 1..6;type tWuerfelserie = array type tHaeufigkeiten = arraywuerfelserie:haeufigkeiten:

erzeugen;auswerten;

Page 81: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

81 Aufgabe

Informieren Sie sich, wie das Verschlüsselungsverfahren nach Vigenère funktioniert. Ändern Sie das Chiffriersystem nach Caesar entsprechend ab.

Page 82: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

82 Aufgabe

Bei einer beliebig eingegeben Chiffriertabelle kann es leicht vorkommen, dass ein Geheimtextbuchstabe mehrfach benutzt wird. Das Chiffriersystem soll so erweitert werden, dass dieser Fall erkannt / verhindert wird.

B kommt mehrfach vor!

Page 83: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

83 Aufgabe

Bei einer beliebig gewählten Chiffrierung fällt es schwer, sich den Schlüssel (d. h. die Chiffriertabelle) zu merken. Man könnte sich die Sache etwas erleichtern, wenn man wie folgt verfährt: Man wählt ein (langes) Schlüsselwort, z. B. SCHOKOLADENOSTERHASE. Dann streicht man alle mehrfach vorkommenden Buchstaben: SCHOKLADENTR. Diese Buchstaben bilden den Anfang des Geheimtextalphabets. Abschließend füllt man ab der letzten Stelle mit den noch zur Verfügung stehenden Buchstaben des Alphabets auf.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

S C H O K L A D E N T R U V W X Y Z B F G I J M P Q

Klartextalphabet

Geheimtextalphabet

Entwickeln Sie ein Programm, bei dem man nur das Schlüsselwort eingeben muss. Die Erzeugung der zugehörigen Chiffriertabelle wird vom Programm selbst übernommen.

Page 84: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

84 Aufgabe

Das Chiffriersystem soll um einen Statistikbaustein erweitert werden. Mit Hilfe dieses Bausteins kann man eine Häufigkeitsanalyse durchführen.

Page 85: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

85 Aufgabe

Entwickeln Sie ein System, mit dem eine Art Stilanalyse bei Texten vorgenommen werden kann. Das System soll die durchschnittliche Länge eines Satzes und die durchschnittliche Anzahl der Nebensätze eines eingegebenen Textes bestimmen.

Page 86: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

86 Aufgabe

Entwickeln Sie ein System, mit dem man eine Lotto-Ziehung simulieren kann.

Page 87: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

87 Literaturhinweise

E. Modrow: Informatik mit Delphi, Band 1/2, Dümmler-Stam 1998-2000.

P. Damann, J. Wemßen: Objektorientierte Programmierung mit Delphi, Band 1. Klett-Verlag 2001.

U. Bänisch: Praktische Informatik mit Delphi, Band 1/2. Cornelsen 2001.

Frischalowski: Delphi 5.0, Band 1/2, Herdt-Verlag 1999.

Pohl: Schülerübungen / Klausuren in Delphi, Heft 1/2, Verlag J. Pohl 1997-2001.

Noll, Mayr, Paulus, Selinger: http://informatikag.bildung-rp.de/html/delphi_teil_1.html

K. Merkert:http://hsg.region-kaiserslautern.de/faecher/inf/material/delphi/index.php

R. Mechling:http://www.gk-informatik.de/

K. Heidler:http://www.friedrich.fr.schule-bw.de/delphi/delphi.htm

Hessischer Bildungsserver:http://www.bildung.hessen.de/abereich/inform/skii/material/delphi/index.htm

Page 88: Einführung in die Software-Entwicklung mit Delphi Teil 2 Klaus Becker 2005.

88 Literaturhinweise

S. Spolwig: http://oszhdl.be.schule.de/gymnasium/faecher/informatik/delphi/index.htm

Weitere Hinweise unter:

http://www.delphi-source.de

Einsteiger-Tutorial

http://www.delphi-treff.de/content/tutorials/einsteigerkurs/

...