Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen:...
-
Upload
anneken-monheit -
Category
Documents
-
view
109 -
download
0
Transcript of Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen:...
Agenda für heute, 20. Juni, 2010
• Strukturieren von Programmen: Units Strukturieren von Programmen: Units
• Datentypen: Unterbereichstypen
• Übung 7: Bitmap-Dateien
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Strukturieren von Programmen
1. Schritt: Gliederung des Quellcodes
Einem Programm können wir Struktur verleihen, indem wir es in
Prozeduren gliedern, von denen jede eine spezielle Aufgabe
innerhalb des Progamms übernimmt.
2. Schritt: Import von Objektcode
Die Struktur eines Programms können wir ergänzen, indem wir
bereits kompilierte Prozeduren in den Objektcode des
Programms importieren.
2/19
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Import von Objektcode aus einer "Unit"
program xyz;
uses math;
var alpha: integer; sinalpha: real;
begin { main }. . .read(alpha);sinalpha:= sin(alpha);write('Sinus von ',alpha,': ';. . .
Diese Anweisung sagtdem Compiler, dass allein der Unit "Math" dekla-rierten Prozeduren demProgramm zur Verfügungstehen sollen.
3/19
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Getrennte Kompilation von Programmen und Units
Programm
Quellcode
Unit A
Quellcode
Compiler
Unit A
Objektcode
Programm
Objektcode
Muss neu kompiliert werden,wenn das Programm oder eine der Units geändert wird.
Unit B
Quellcode
Unit B
Objektcode
Muss neu kompiliert werden,wenn die Unit geändert wird.
Üb
ers
chau
bar
keit
dur
ch M
odu
lari
sie
rung
(Pro
gram
mie
ren
im G
ross
en)
4/19
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Sichtbarkeit bei Units
program X;uses A;
var R, S: integer;
begin R:= S + 1;
p1;
p2;
end.
unit A;
interfaceprocedure p1; procedure p2;
implementation
var j: real;
procedure p1;begin . . .end;
procedure p2;var k: real;begin k := k*j; . . .end;
end.5/19
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Sichtbarkeit bei Units
program X;uses A;
var R, S: integer;
begin R:= S + 1; j:= R - S; p2;
q3;
end.
unit A;
interfaceuses B; var j: real;procedure p2;
implementation
procedure p2;var k: real;begin
k := k*j; q1; . . .
end;end.
unit B;
interfaceprocedure q1procedure q2procedure q3;
implementation
procedure q1;begin
. . .end;
. . .
end.
kann via Unit A auch dieBezeichner im Interfacevon Unit B verwenden
6/19
• Strukturierung von Programmen: Units
• Datentypen: UnterbereichstypenDatentypen: Unterbereichstypen
• Übung 7: Bitmap-Dateien
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.
7/19
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]
8/19
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
9/19
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).
10/19
• Strukturieren von Programmen: Units
• Datentypen: Unterbereichstypen
• Übung 7: Bitmap-DateienÜbung 7: Bitmap-Dateien
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Praxismodul 7: Bildanalyse
Problemstellung: Anteil der Waldfläche auf der Luftaufnahme eines Geländeausschnittes
Programmiermethodik: Spiralmodell
Inkrementelles Vorgehen
1. Bild einlesen, anzeigen, manipulieren
2. Pixel, die Wald darstellen erkennen und zählen
3. Angenäherte Lösung entwickeln (MC Methode)
11/19
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
12/19
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
13/19
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
14/19
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
15/19
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
16/19
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
Prinzip der Rasterdaten
rot
rot
blau
gelb
türkis
grün
grün
schwarz
. . .
0
1
2
3
Farbe des Bild-punktes (Pixel):
1024
1025
1026
0
1
23
1024
1025
1026
blau grün rot
255 0 0
255 0 0
0 0 255
255 255 0
44 172 212
0 255 0
0 255 0
0 0 0
rgb-Werte,die als Bilddaten gespeichert werden:
17/19
4 4
16'711'680
16'711'680
255
16'776'960
2'927'828
65'280
65'280
0
. . .
0
1
2
3
Kombinierter rgb-Wert:
1024
1025
1026
4
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}
18/19
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;
19/19