Algorithmen u. Datenstrukturen

Sprache:
Pseudocode

Typ:
Beispiele

Stand:
k.a.

Stichworte:
Algorithmen, Datenstrukturen, Grundlagen
 
 
 
Beschreibung

Es werden einige einfache Algorithmen gezeigt die ich schon mal benötigt habe. Sie sind in einer Pseudo Programmiersprache verfaßt, die sich an BASIC orientiert: Floodfill, XOR "Verschlüsselung", RGB zu Graustufen Konvertierung, Dispatch Tabellen.


Floodfill

Beschreibung : Zwar ist diese Funktion in den meisten Programmiersprachen standardmäßig integriert, allerdings finde ich das Problem ganz interessant. Der folgende Quelltext ist eine einfache Version der Lösung. WARNUNG : Der Algorithmus ist hoch rekursiv ... Vorsicht mit der Ab- bruchbedingung ! Variablen: - x1,x2,y1,y2 als Integer - c1,c2 als Farben Aufruf: - x1,y2 Koordinaten des MausKlicks (Von hier ausgehend soll gefüllt werden) - c1 Füllfarbe die ausgewählt wurde => c2 := PixelFarbe an Position x1,x2 Funktion FloodFill(x1,x2,c1,c2) Funktion: => Funktion FloodFill(x1,x2,c1,c2) WENN x1 und y2 innerhalb der Zeichenfläche liegen UND WENN c1 ungleich (PixelFarbe an Position x1,x2) ist DANN PixelFarbe an Position x1,x2 := c2 Floodfill(x1, y-1, c1, c2) Floodfill(x1, y+1, c1, c2) Floodfill(x1-1, y, c1, c2) Floodfill(x1+1, y, c1, c2) ANSONSTEN mache nichts Funktion ENDE
XOR "Verschlüsselung"

Beschreibung : Wer seine streng geheimen "Anti-Microsoft" Akten ver- verschlüsseln möchte, der braucht schon einen guten Algorithmus a la GOST, RC5 oder DES. Leider brauchen diese relativ lange zum Ver/Entschlüsseln. Falls man aber nur einige private Texte vor neugierigen Blicken schützen möchte genügen oft schon die einfachsten Mittel. Der folgende Algorithmus ermöglicht dieses praktisch in Echtzeit. WARNUNG : Das ist natürlich keine echte Kodierung .. ;-) Variablen: - TextVerschlüsselt als String/Memo - TextEntschlüsselt als String/Memo Aufruf: => TextVerschlüsselt := XORText (TextEntschlüsselt) zum Verschlüsseln => TextEntschlüsselt := XORText (TextVerschlüsselt) zum Entschlüsseln Anmerkung: - CHR() -> Standardfunktion die eine Ordnungsnummer in ein ASCII Zeichen umwandelt (Anpassung gemäß Programmiersprache). - ORD() -> Standardfunktion die ein ASCII Zeichen in eine Ordnungsnummer umwandelt (Anpassung gemäß Programmiersprache). - Anstelle von "1 XOR" könnte man auch eine benutzerdefinierte Kodezahl verwenden (Ergebnis muß innerhalb von 256 liegen), sozusagen als Pass- zahl. :-) Funktion: => Funktion XORText(Text als String/Memo) als String/Memo SCHLEIFE: VON i=1 bis zur Anzahl der Zeichen in "Text" XORText = XORText + CHR( 1 XOR ORD(Zeichen i in "Text") ) Funktion ENDE
RGB zu Graustufen Konvertierung

Beschreibung : Als ich zum ersten mal eine solche Konvertierung mit einem Bild durchführen wollte, dachte ich "Kein Problem": Jeweils ein drittel pro Farbe nehmen. Leider sieht das Ergebnis nicht besonders aus, weil das menschliche Auge die Farben unterschiedlich gewichtet (Ca. 30%Rot, 59%Grün, 11%Blau) Variablen: - siehe Funktion Anmerkung: - RGB() -> Standard Funktion welche die drei RGB Werte in eine Farbe um- wandelt.(Anpassung gemäß Programmiersprache). Funktion: => Funktion RGB2GS(RGBFarbe als Farbe) als Farbe Variable: Mittelwert als Zahl Mittelwert := ((RGBFarbe.Rot * 0.3) + (RGBFarbe.Grün * 0.59) + (RGBFarbe.Blau * 0.11)) / 3 RGB2GS:= RGB(Mittelwert,Mittelwert,Mittelwert) Funktion ENDE
Dispatch Tabellen

Beschreibung : Eine elegante Möglichkeiten viele "IF-THEN" Anweisungen zu umgehen sind sogenannte Dispatch Tabellen. Dabei legt man eine Tabelle mit Funktionen an, wozu man z.B einen Hash verwenden kann. Auch eine 'richtige' Tabelle einer Datenbank ist möglich (aber nicht so schnell), falls es die Programmiersprache er- laubt die Werte der Tabelle später als Anweisung zu interpretie- ren (z.B. mit 'eval'). Annahme/Beispiel: Es existiert eine Benutzereingabe in Form einer Zeichenkette. Abhängig von deren Wert soll zu einer Routine im Programm gesprungen werden. Benutzereing. | Routine -----------------+----------------- "Textbear." | SubText(); "E-Mail" | SubMail(); ... | ... Dispatch Tabelle: Nun legen wir gemäß dem Beispiel eine Tabelle an, wobei wir die Benutzer- eingabe als Schlüssel und den Routinennamen als zugehörigen Wert angeben: => DispatchTabelle := ( 'Textbear.' -> 'SubText()', 'E-Mail' -> 'SubMail()', ... ); Benutzereingabe := Eingabe des Users Aufruf: Jetzt ist der Aufruf der Routinen in einer Zeile abgehandelt: AnweisungAusführen(Dispatchtabelle(Benutzereingabe)); [Die Funktion 'AnweisungAusführen' gemäß Programmiersprache]

Impressum
 


Copyright 2002,2003 M. Schmitz