agenda für heute, 8. juni, 2006 strukturierte variablen: recordsstrukturierte variablen: records...
TRANSCRIPT
Agenda für heute, 8. Juni, 2006
• Strukturierte Variablen: Records Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: Unterbereichstypen
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
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
• Strukturierte Variablen: Records
• Kombiniertes StrukturierenKombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: Unterbereichstypen
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
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
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'
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
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;
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;
• Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-DateienBitmap-Dateien
• Datentypen: Unterbereichstypen
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.
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.
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
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
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)
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
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
• Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: UnterbereichstypenDatentypen: Unterbereichstypen
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
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
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
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