Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Ähnliche Präsentationen


Präsentation zum Thema: "Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien."—  Präsentation transkript:

1 Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien

2 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

3 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 sagt dem Compiler, dass alle in der Unit "Math" dekla- rierten Prozeduren dem Programm zur Verfügung stehen sollen. 3/19

4 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. Überschaubarkeit durch Modularisierung (Programmieren im Grossen) 4/19

5 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; interface procedure p1; procedure p2; implementation var j: real; procedure p1; begin... end; procedure p2; var k: real; begin k := k*j;... end; end. 5/19

6 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; interface uses B; var j: real; procedure p2; implementation procedure p2; var k: real; begin k := k*j; q1;... end; end. unit B; interface procedure q1 procedure q2 procedure q3; implementation procedure q1; begin... end;... end. kann via Unit A auch die Bezeichner im Interface von Unit B verwenden 6/19

7 Strukturierung von Programmen: Units Datentypen: UnterbereichstypenDatentypen: Unterbereichstypen Übung 7: Bitmap-Dateien

8 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

9 Programmieren und Problemlösen © 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] 8/19

10 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

11 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..1001..10 mittel:= klein; klein:= mittel; 1..100..100 Prüfung nur während der Programmausführung möglich. (Mit Bereichsprüfung kompilieren). 10/19

12 Strukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-DateienÜbung 7: Bitmap-Dateien

13 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

14 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.

15 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.

16 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

17 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

18 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)

19 Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich Prinzip der Rasterdaten rot blau gelb türkis grün schwarz... 0 1 2 3 Farbe des Bild- punktes (Pixel): 1024 1025 1026 0 1 2 3 1024 1025 1026 blaugrünrot 25500 00 00 0 44172212 02550 0 0 000 rgb-Werte,die als Bilddaten gespeichert werden: 17/19 4 4 16'711'680 255 16'776'960 2'927'828 65'280 0... 0 1 2 3 Kombinierter rgb-Wert: 1024 1025 1026 4

20 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

21 Programmieren und Problemlösen © 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; 19/19


Herunterladen ppt "Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien."

Ähnliche Präsentationen


Google-Anzeigen