Records

Werbung
Agenda für heute, 8. Juni, 2006
• Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: Unterbereichstypen
Strukturierung von Variablen: Records
Der Datentyp Record erlaubt Variablen, die aus mehreren Feldern
bestehen. Die einzelnen Felder können von unterschiedlichem Typ
sein.
var
Variablebezeichner
Recordfeld
R: record
Tag: byte;
Monat: string[9];
Jahr: integer;
Werktag: boolean
end;
Feldbezeichner
Programmieren und Problemlösen
2/20
Feldtyp
© Institut für Computational Science, ETH Zürich
Records: Datenzugriff
Für den Zugriff auf ein Recordfeld muss der Bezeichner der RecordVariablen zusammen mit dem Bezeichner des Feldes angegeben
werden.
R
12 'Juni' 2000 false
R.Monat
Recordbezeichner
=
Feld mit Wert 'Juni'
Feldbezeichner
Punkt
Programmieren und Problemlösen
3/20
© Institut für Computational Science, ETH Zürich
• Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: Unterbereichstypen
Arrays von Records
Type
Tag = record
Datum: byte;
Wochentag: string[2];
Monat: string[9];
Jahr: integer;
Werktag: boolean
end;
var
EinJahr: array[1..366]of Tag;
Heute: Tag;
Heute
Programmieren und Problemlösen
8
'MO' 'Juni' 2006 true
4/20
© 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;
Programmieren und Problemlösen
5/20
© Institut für Computational Science, ETH Zürich
Records mit Arrays
Type
WTage = record
Jahr: byte;
Monat: byte;
Tage: array[1..31] of string[2];
end;
var
Mai06, Jan07: WTage;
Wochentag: string[2];
Mai06
2006
Programmieren und Problemlösen
5 'MO' 'DI'
6/20
'MI' 'DO' 'FR' ... 'MI'
© 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];
Programmieren und Problemlösen
7/20
('DO')
© Institut für Computational Science, ETH Zürich
Records mit Records
Type
M = record
Name: string[9];
Jzeit: char;
end;
Jahreszeit = record
Tag: 1..366;
Monat: M;
end;
var
Wochentag: Jahreszeit;
Monat: M;
Wochentag 23
Programmieren und Problemlösen
'Januar'
8/20
'W'
© Institut für Computational Science, ETH Zürich
Records mit Records: Zuweisungsbeispiele
Wochentag.Monat.Jzeit:= 'W'
Monat.Name:= 'Oktober';
Monat.Jzeit:= 'H';
Wochentag.Monat:= Monat;
Programmieren und Problemlösen
9/20
© Institut für Computational Science, ETH Zürich
• Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: Unterbereichstypen
Bitmap-Dateien
BMP-Dateien bestehen aus
drei Teilen: dem Dateikopf,
dem Informationsblock und
den Bilddaten.
Dateikopf
(BITMAPFILEHEADER)
Informationsblock
(BITMAPINFO):
Bitmap-Eigenschaften
Die Bilddaten werden
zeilenweise gespeichert.
In der Regel beginnen die
Bilddaten mit der letzten
und enden mit der ersten
Bildzeile.
14 Byte
40 Byte
(BITMAPINFOHEADER)
Eventuell: Farbmasken
Eventuell: Farbtabelle
Eventuell: Ungenutzter Platz
Bilddaten
Eventuell: Ungenutzter Platz
Programmieren und Problemlösen
10/20
© Institut für Computational Science, ETH Zürich
Bitmap-Dateien
Typendeklaration
für Filevariable um
Dateikopf und
Informationsblock
einer Bitmap-Datei
einzulesen.
Programmieren und Problemlösen
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;
11/20
© Institut für Computational Science, ETH Zürich
Bitmap-Dateien lesen
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
12/20
© Institut für Computational Science, ETH Zürich
Bitmap-Dateien lesen
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
13/20
© Institut für Computational Science, ETH Zürich
Bitmap-Dateien lesen
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
14/20
© 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}
Programmieren und Problemlösen
15/20
© Institut für Computational Science, ETH Zürich
Bitmap-File von Übung 7 selber einlesen (Fortsetzung)
var
bl, 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;
Programmieren und Problemlösen
16/20
© Institut für Computational Science, ETH Zürich
• Strukturierte Variablen: Records
• Kombiniertes Strukturieren
• Bitmap-Dateien
• Datentypen: Unterbereichstypen
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;
Programmieren und Problemlösen
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
© Institut für Computational Science, ETH Zürich
Unterbereichstypen
Beispiele
type
Kleinbuchstabe = 'a'..'z';
Ziffer = '0'..'9';
Index = 1..25;
Werktag = Montag..Freitag;
Als Unterbereich des
Aufzählungstyps Tag
var
Eingabezeichen: Kleinbuchstabe;
A: array[Index] of real;
Arbeitstag: Werktag;
Wtage: array[Werktag] of integer;
x: integer;
x:= Wtage[dienstag]
Programmieren und Problemlösen
18/20
© 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
Programmieren und Problemlösen
19/20
© Institut für Computational Science, ETH Zürich
Unterbereichstypen: Eigenschaften
Unterbereichstypen können auf beiden Seiten einer Zuweisungsanweisung 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).
Programmieren und Problemlösen
20/20
© Institut für Computational Science, ETH Zürich
Herunterladen