23
Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: Records Strukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen: Unterbereichstypen

Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Embed Size (px)

Citation preview

Page 1: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Agenda für heute, 8. Juni, 2006

• Strukturierte Variablen: Records Strukturierte Variablen: Records

• Kombiniertes Strukturieren

• Bitmap-Dateien

• Datentypen: Unterbereichstypen

Page 2: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Strukturierung von Variablen: Records

Der Datentyp Record erlaubt Variablen, die aus mehreren Feldern bestehen. Die einzelnen Felder können von unterschiedlichem Typ sein.

var

R: recordTag: byte;Monat: string[9];Jahr: integer;Werktag: boolean

end;

FeldtypFeldbezeichner

Recordfeld

Variablebezeichner

2/20

Page 3: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Records: Datenzugriff

Für den Zugriff auf ein Recordfeld muss der Bezeichner der Record-Variablen zusammen mit dem Bezeichner des Feldes angegeben werden.

R

R.Monat = Feld mit Wert 'Juni'

12 'Juni' 2000 false

Recordbezeichner Feldbezeichner

Punkt

3/20

Page 4: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

• Strukturierte Variablen: Records

• Kombiniertes StrukturierenKombiniertes Strukturieren

• Bitmap-Dateien

• Datentypen: Unterbereichstypen

Page 5: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Arrays von Records

var

EinJahr: array[1..366]of Tag;Heute: Tag;

Type

Tag = recordDatum: byte;Wochentag: string[2];Monat: string[9];Jahr: integer;Werktag: boolean

end;

4/20

Heute 8 'MO' 'Juni' 2006 true

Page 6: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Arrays und Records kombiniert: Zuweisungsbeispiele

EinJahr[127].Datum:= 8;

EinJahr[127].Wochentag:= 'MO';

EinJahr[127].Monat:= 'Mai';

EinJahr[127].Jahr:= 2006;

EinJahr[127].Werktag:= true

Heute:= EinJahr[127];

Heute.Datum:= 9;

Heute.Wochentag:= 'DI';

EinJahr[128]:= Heute;

5/20

Page 7: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Records mit Arrays

var

Mai06, Jan07: WTage;Wochentag: string[2];

Type

WTage = recordJahr: byte;Monat: byte;Tage: array[1..31] of string[2];

end;

6/20

Mai06 2006 5 'MO' 'DI' 'MI' 'DO' 'FR' ... 'MI'

Page 8: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Records und Arrays kombiniert: Zuweisungsbeispiele

Mai06.Jahr:= 2006;

Mai06.Monat:= 5;

j:= 1;

for i:= 0 to 4 do

Mai06.Tage[j+i*7]:= 'MO';

Jan07:= Mai06;

Jan07.Jahr:= 2007;

Jan07.Monat:= 1;

Wochentag:= Mai06.Tage[22]; ('DO')

7/20

Page 9: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Records mit Records

var

Wochentag: Jahreszeit;Monat: M;

Type

M = recordName: string[9];Jzeit: char;

end;

8/20

Wochentag 23 'Januar' 'W'

Jahreszeit = recordTag: 1..366;Monat: M;

end;

Page 10: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Records mit Records: Zuweisungsbeispiele

9/20

Wochentag.Monat.Jzeit:= 'W'

Monat.Name:= 'Oktober';

Monat.Jzeit:= 'H';

Wochentag.Monat:= Monat;

Page 11: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

• Strukturierte Variablen: Records

• Kombiniertes Strukturieren

• Bitmap-DateienBitmap-Dateien

• Datentypen: Unterbereichstypen

Page 12: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien

BMP-Dateien bestehen aus drei Teilen: dem Dateikopf, dem Informationsblock und den Bilddaten.

Dateikopf

(BITMAPFILEHEADER)

Informationsblock

(BITMAPINFO):Bitmap-Eigenschaften

(BITMAPINFOHEADER)Eventuell: Farbmasken

Eventuell: Farbtabelle

Eventuell: Ungenutzter Platz

Bilddaten

Eventuell: Ungenutzter Platz

14 Byte

40 Byte

10/20

Die Bilddaten werden zeilenweise gespeichert. In der Regel beginnen die Bilddaten mit der letzten und enden mit der ersten Bildzeile.

Page 13: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien

11/20

bmpheader = packed record {----- fileinfo --------} bfType: word; bfSize: longint; bfReservde1: word; bfReserved2: word; bfOffBits: longint; {----- Bildinfo --------} biSize: longint; biWidth: longint; biHeight: longint; biPlanes: word; biBitCount: word; biCompress: longint; biSizeImage: longint; biXPPM: longint; biYPPM: longint; biClrUsed: longint; biClrImport: longint;end;

Typendeklaration für Filevariable um Dateikopf und Informationsblock einer Bitmap-Datei einzulesen.

Page 14: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien lesen

12/20

Delphi stellt eine Komponente "Image" zur Verfügung mit der Bilddaten bearbeitet werden können

Um ein Bild einzulesen wird

Image.Picture.LoadFromFile(Dateiname);

aufgerufen

Page 15: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien lesen

13/20

In den Feldern Image.Height und Image.Width werden anschliessend die Bildhöhe resp. die Bildbreite angegeben

Im Feld Image.Canvas wird das Bild gespeichert

Mit Image.Canvas.Pixel(x,y) wird auf den Pixel an der Position x,y im Bild zugegriffen

Page 16: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien lesen

14/20

Im Gegensatz zu Textdateien müssen bei Bilddateien zuerst Daten mit Informationen über die gespeicherten Daten (das Bild) gelesen werden

Der erste Zugriff geschieht auf eine typisierte Datei (Datentyp Record für Dateikopf und Informationsblock)

Die nächsten Zugriffe lesen die Bilddaten Byte um Byte (untypisierte Datei)

Delphi erledigt diese Operationen für uns, wir können sie aber auch selber ausprogrammieren (z.B. im TurboPascal)

Page 17: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-File von Übung 7 selber einlesen

var bildheader: file of bmpheader; bh: bmpheader; binfo: file of byte; i: integer; b:byte;

begin AssignFile(bildheader,'Bild1.bmp'); Reset(bildheader); read(bildheader,bh); CloseFile(bildheader); AssignFile(binfo,'Bild1.bmp'); Reset(binfo)end;

for i:= 1 to bh.bfOffBits do Read(binfo,b); {fileheader überspringen}

{ab hier Bilddaten verarbeiten}

15/20

Page 18: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-File von Übung 7 selber einlesen (Fortsetzung)

varbl, gr, rot: byte;x, y, i: cardinal;

for y:= bh.biHeight-1 downto 0 do

begin

for x:= 0 to bh.biWidth-1 do

begin

Read(binfo,bl); Read(binfo,gr); Read(fi1,rot);

Image1.Canvas.pixels[x,y]:= 65536*bl+256*gr+rot;

end; for i:= 1 to bh.biWidth mod 4 do Read(binfo,rot)

{die Null-Einträge am Ende der Zeile überspringen}end;

16/20

Page 19: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

• Strukturierte Variablen: Records

• Kombiniertes Strukturieren

• Bitmap-Dateien

• Datentypen: UnterbereichstypenDatentypen: Unterbereichstypen

Page 20: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen

Wird bei der Verwendung einer Variablen vorausgesetzt, dass sie nur Werte innerhalb eines zusammenhängenden Teilbereichs eines ordinalen Typs annehmen darf, dann kann dies durch das Deklarieren eines Unterbereichstyps überwacht werden.

const n = 1000;type Teilbereich = 1..n;var x: Teilbereich;

oder:var x: 1..1000;

Die Konstanten, welche die Bereichsgrenzen angeben, müssen vom gleichen ordinalen Typ, dem Host-Typ sein.

Alle Operationen, die über den Werten des Host-Typs zulässig sind, können auch über den Werten des Unterbereichstyps ausgeführt werden.

17/20

Page 21: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen

Beispieletype Kleinbuchstabe = 'a'..'z'; Ziffer = '0'..'9'; Index = 1..25; Werktag = Montag..Freitag;

Als Unterbereich des Aufzählungstyps Tag

varEingabezeichen: Kleinbuchstabe;

A: array[Index] of real;

Arbeitstag: Werktag;

Wtage: array[Werktag] of integer;

x: integer;

x:= Wtage[dienstag]

18/20

Page 22: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen: Eigenschaften

Verschiedene Unterbereiche eines bestimmten Typs können im gleichen Ausdruck vorkommen.

var klein: 1..10; mittel: 0..100; gross: integer;

Der folgende Ausdruck ist gültig:

klein * mittel + gross

19/20

Page 23: Agenda für heute, 8. Juni, 2006 Strukturierte Variablen: RecordsStrukturierte Variablen: Records Kombiniertes Strukturieren Bitmap-Dateien Datentypen:

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen: Eigenschaften

Unterbereichstypen können auf beiden Seiten einer Zuweisungs-anweisung stehen:

0..100 1..10

mittel:= klein;

klein:= mittel;

1..10 0..100

Prüfung nur während der Programmausführung möglich.

(Mit Bereichsprüfung kompilieren).

20/20