Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

Größe: px
Ab Seite anzeigen:

Download "Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net"

Transkript

1 Jürgen Bayer Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

2 Inhaltsverzeichnis 1 Einleitung 1 2 Anonyme Methoden 2 3 Lambda-Ausdrücke 4 4 Ausdrucksbäume Was sind Ausdrucksbäume? Der Sinn von Ausdrucksbäumen Ausdrucksbäume in.net Erstellung eines Ausdrucksbaums 8

3 1 Einleitung Das.NET-Framework enthält mit anonymen Methoden, Lambda-Ausdrücken und Ausdrucksbäumen wichtige Features der funktionalen Programmierung. Um dieses interessante Konzept (das ich hier nicht weiter ausführe) zu verstehen oder auch umsetzen zu können, und um mit modernen.net-features wie LINQ arbeiten zu können, sollten Sie sich mit diesen Themen auskennen. Da ich denke, dass das Verständnis besonders von Ausdrucksbäumen sehr wichtig ist, behandle ich diese zwar eher theoretisch, aber so umfangreich, dass Sie später wissen, wie z. B. LINQ to SQL einen Lambda-Ausdruck in eine SQL-Anweisung umsetzt. Einleitung 1

4 2 Anonyme Methoden Anonyme Methoden sind Methoden, die nur über einen Delegaten referenziert werden. Sie besitzen keinen Namen und können deswegen auch nicht über diesen aufgerufen werden. Eine Anonyme Methode kann (auf die alte Art) über das delagate-schlüsselwort erzeugt werden. Die Syntax dazu ist: delegate([argumentliste]) Anweisungsblock Das Ganze wird einfacher in einem Beispiel. Dieses Beispiel demonstriert auch gleich den wesentlichen Aspekt der funktionalen Programmierung. Lassen Sie es auf sich wirken. Angenommen, eine Methode erwartet ein Array aus Integerwerten und einen Delegaten auf eine Methode, die für alle Elemente des Arrays aufgerufen wird: private static void TestValuesForCondition(int[] values, Func<int, bool> testmethod) foreach (var value in values) if (testmethod(value) == true) Console.WriteLine("Der Wert " + value + " wurde bestätigt"); Listing 2.1: Methode, die Integer-Werte auf eine Bedingung testet, die in Form eines Delegaten übergeben wird Der Delegat für die Testmethode entspricht in diesem Beispiel dem generischen Delegaten System.Func mit einem int-argument und bool als Rückgabetyp. In der Anwendung könnten Sie nun die Testmethode mit einem Integer-Array und einer anonymen Methode aufrufen, die die Werte daraufhin überprüft, ob diese gerade sind: // Erzeugen des Beispiel-Arrays int[] testvalues = new int[10]; Random random = new Random(); for (int i = 0; i < 10; i++) testvalues[i] = random.next(1, 100); // Aufruf der Testmethode mit einer anonymen Methode, // die die Werte daraufhin überprüft, ob diese // gerade sind Console.WriteLine("Gerade Zahlen: "); TestValuesForCondition(testValues, delegate(int value) return value % 2 == 0; ); Console.WriteLine(); Listing 2.2: Verwendung einer anonymen Methode als Argument einer Methode Was Sie jetzt einsetzen, ist funktionale Programmierung. In diesem Beispiel wird die Bedingung, die dazu führt, dass ein Integer-Wert bestätigt wird, über eine Funktion (eigentlich ja Methode ) definiert, die beim Aufruf der Testmethode übergeben wird. Die Funktion bestimmt die Regeln. Das macht dieses Konzept sehr mächtig. Die übergebene (oder sonst wie verwendete) Funktion kann schließlich unendlich vielfältig programmiert werden. So ist z. B. auch eine Prüfung auf ungerade oder Primzahlen auf eine ziemlich direkte Weise möglich ohne die Testmethode umschreiben zu müssen: Anonyme Methoden 2

5 // Aufruf der Testmethode mit einer anonymen Methode, // die die Werte daraufhin überprüft, ob diese // ungerade sind Console.WriteLine("Ungerade Zahlen: "); TestValuesForCondition(testValues, delegate(int value) return value % 2!= 0; ); Console.WriteLine(); // Aufruf der Testmethode mit einer anonymen Methode, // die die Werte daraufhin überprüft, ob Primzahlen sind Console.WriteLine("Primzahlen: "); TestValuesForCondition(testValues, delegate(int value) if (value < 3) return false; for (int divisor = 2; divisor < value; divisor++) if (value % divisor == 0) return false; return true; ); Listing 2.3: Weiterer Einsatz anonymer Methoden in der funktionalen Programmierung Statt der anonymen Methoden könnten Sie natürlich auch»richtige«methoden übergeben. Diese müssten dann aber deklariert werden, was recht aufwändig wäre. Eine anonyme Methode ist, besonders in Form eines Lambda-Ausdrucks (der im nächsten Abschnitt behandelt wird) wesentlich einfacher zu erzeugen. Einfache anonyme Methoden besitzen zudem den Vorteil, dass an der Stelle des Aufrufs sehr schnell erkannt werden kann, was dort passiert. Ich würde anonyme Methoden auch nur dann einsetzen, wenn diese relativ einfach oder bei komplexen Methoden wenn die Programmlogik nicht an mehreren Stellen verwendet wird. Die im Beispiel verwendete anonyme Methode zur Ermittlung, ob eine Zahl eine Primzahl ist, ist ein Grenzfall, da der Programmcode auf jeden Fall noch verbessert werden könnte. Würde diese Methode mehrfach benötigt, würde ich dazu eher eine echte Methode schreiben, die dann am testmethod-argument der Testmethode (in Form einer Instanz von Func<int, bool>) übergeben wird. Anonyme Methoden 3

6 3 Lambda-Ausdrücke Lambda-Ausdrücke sind ein neues Feature von C# 3.0 bzw. des.net-framework 3.5. Lambda- Ausdrücke werden sehr intensiv mit LINQ eingesetzt, können aber (wie in dem Beispiel dieses Abschnitts) auch für eigene (funktionale) Programmierung verwendet werden. Ein Lambda-Ausdruck ist ein Ausdruck, der zum einen in einen in einen sogenannten Ausdrucksbaum konvertiert werden kann. Ausdrucksbäume werden in Kapitel 4 behandelt. Lambda-Ausdrücke können zum anderen aber auch in einen Delegaten konvertiert werden. Dieser Delegat referenziert eine anonyme Methode, die implizit über den Lambda-Ausdruck erzeugt wird, sobald dieser als Delegat verwendet wird. C# 3.0 bietet eine spezielle Syntax zur Erzeugung eines Lambda-Ausdrucks. Dazu werden eventuelle Argumente der Methode vor dem Operator => angegeben. Rechts davon stehen dann die Anweisungen, die die Methode ausmachen: [Argumentliste] => Ausdruck Anweisungsblock In der Argumentliste geben Sie alle Argumente an, die in der Methode verwendet werden. Besitzt die Methode keine Argumente, wird natürlich auch keine Argumentliste angegeben. Ist keines oder mehr als ein Argument vorhanden, muss die Argumentliste in Klammern angegeben werden. Ist nur ein Argument vorhanden, können Sie die Klammern weglassen. Sie können die Argumente ohne Typ angeben, dann entspricht der Typ des Arguments dem des entsprechenden Arguments des Delegaten, dem Sie den Lambda-Ausdruck zuweisen. In den wenigen Fällen, in denen Sie einen anderen Typ angeben müssen, können Sie den Typ wie bei Variablen vor das Argument schreiben. Rechts vom Lambda-Operator steht dann entweder ein Ausdruck oder ein Anweisungsblock. Ausdrücke werden direkt angegeben. Die Rückgabe des Lambda-Ausdrucks entspricht dann dem Ergebnis des Ausdrucks. Listing 3.1 zeigt einige Beispiele für Lambda-Ausdrücke, die mit Ausdrücken arbeiten. Um das Ganze kompilieren zu können, weist das Beispiel die erzeugten Lambda-Ausdrücke Variablen zu, deren Typ ein Delegat ist, der dem Lambda-Ausdruck entspricht. // Lambda-Ausdruck mit Ausdruck ohne Parameter Func<int> f1 = () => 1 + 1; // Lambda-Ausdruck mit Ausdruck mit einem implizit typisierten Parameter Func<int, int> f2 = x => x + 1; // Lambda-Ausdruck mit Ausdruck und zwei explizit typisierten Parametern Func<int, int, int> f3 = (int x, int y) => x + y; Listing 3.1: Beispiele für Lambda-Ausdrücke, die mit Ausdrücken arbeiten Lambda-Ausdrücke 4

7 Werden Anweisungsblöcke verwendet, müssen diese immer in geschweifte Klammern eingetragen werden, auch wenn es sich nur um eine Anweisung handelt. Soll (bzw. muss) der Lambda-Ausdruck einen Wert zurückgeben, muss dieser wie bei einer normalen Methode über return zurückgegeben werden. Func<int, int> f4 = (x) => if (x < 10) return 1; else if (x < 100) return 2; else return 3; ; Listing 3.2: Lambda-Ausdruck mit Anweisungsblock Mit diesem Wissen können wir die Testmethoden aus dem Beispiel des vorhergehenden Abschnitts einfacher darstellen als mit anonymen Methoden: // Aufruf der Testmethode mit einem Lambda-Ausdruck, // der die Werte daraufhin überprüft, ob diese gerade sind Console.WriteLine("Gerade Zahlen: "); TestValuesForCondition(testValues, value => value % 2 == 0); Console.WriteLine(); // Aufruf der Testmethode mit einem Lambda-Ausdruck, // der die Werte daraufhin überprüft, ob diese ungerade sind Console.WriteLine("Ungerade Zahlen: "); TestValuesForCondition(testValues, value => value % 2!= 0 ); Console.WriteLine(); // Aufruf der Testmethode mit einem Lambda-Ausdruck, // der die Werte daraufhin überprüft, ob Primzahlen sind Console.WriteLine("Primzahlen: "); TestValuesForCondition(testValues, value => if (value < 3) return false; for (int divisor = 2; divisor < value; divisor++) if (value % divisor == 0) return false; return true; ); Console.WriteLine(); Listing 3.3: Funktionale Programmierung mit Lambda-Ausdrücken Beachten Sie, dass die Lambda-Ausdrücke in den Beispielen einem Delegat-Argument zugewiesen werden. Deswegen werden die Lambda-Ausdrücke implizit in eine anonyme Methode konvertiert, die über den Delgat aufgerufen werden kann. Besonders die einfachen Ausdrücke zeigen, dass Lambda-Ausdrücke wesentlich einfacher zu implementieren sind als anonyme Methoden. Und wenn Sie sich einmal daran gewöhnt haben, sind diese auch einfacher zu lesen. Bald. Versprochen. Lambda-Ausdrücke 5

8 4 Ausdrucksbäume Ausdrucksbäume (Expression Trees) sind ein neues Feature im.net-framework 3.5, allerdings keine neues Feature in der allgemeinen Informatik. Das Prinzip von Ausdrucksbäumen ist in der Informatik (bzw. in der Mathematik) schon seit längerem bekannt. 4.1 Was sind Ausdrucksbäume? Über Ausdrucksbäume können Ausdrücke dargestellt bzw. gespeichert werden. Der folgende Ausdruck zur Berechnung eines Bruttowerts: net * (1 + (vat / 100)) kann z. B. wie in Abbildung 4.1 in einem Ausdrucksbaum dargestellt werden. Abbildung 4.1: Ein Ausdrucksbaum zur Berechnung eines Bruttobetrags Der Baum im Beispiel besteht aus drei Berechnungs-Ausdrücken (Multiplikation, Addition und Division), zwei konstanten Ausdrücken für die in der Berechnung verwendeten Konstanten 1 und 100 und zwei Parameterausdrücken für die Parameter net und vat. Bei der späteren Berechnung werden die Parameterausdrücke mit Werten versehen. Jeder Baum beginnt bei einem Wurzelausdruck. Im Beispiel ist das der Multiplikationsausdruck. Die Berechnungs-Ausdrücke im Beispiel besitzen einen linken und einen rechten Operanden. Der linke Operand des Multiplikationsausdrucks ist der Parameterausdruck für den Parameter net, der rechte der Additionssausdruck. Der linke Operand des Additionsausdrucks ist der Konstantenausdruck für den Wert 1, der rechte der Divisionsausdruck. Etc. Ein Ausdrucksbaums wird ausgehend vom Wurzelknoten ausgewertet. Dabei werden zuerst die Knoten an den Enden ausgerechnet, dann die darüberliegenden etc. Im Beispiel ergäbe das die folgenden (mathematisch korrekten) Einzelschritte: Zwischenergebnis1 = vat / 100 Ausdrucksbäume 6

9 Zwischenergebnis2 = 1 + Zwischenergebnis1 Endergebnis = net * Zwischenergebnis2 Die Parameter müssen für die Berechnung natürlich mit Werten versehen werden. 4.2 Der Sinn von Ausdrucksbäumen Mit Ausdrucksbäumen können beliebige Ausdrücke in einem Programm gespeichert und ausgewertet werden. Das ist noch nichts Besonderes, weil Sie Ausdrücke ja auch direkt in Programmen verwenden können. Ausdrucksbäume erlauben aber zum einen das dynamische Zusammensetzen eines Ausdrucks und zum anderen spezielle Auswertungen eines Ausdrucks. Das dynamische Zusammensetzen eines Ausdrucks wird z. B. in Ausdrucksparsern benötigt, die eine Benutzereingabe in einen auswertbaren Ausdruck umwandeln. Stellen Sie sich vor, Sie müssten eine einfache Anwendung schreiben, in die der Anwender einen mathematischen Ausdruck eingeben kann, der danach ausgewertet werden soll. Wenn Sie die Eingabe parsen, müssen Sie die einzelnen Teile des Gesamtausdrucks so speichern, dass Sie diese später auswerten können. Ein Ausdrucksbaum ist dafür ideal geeignet. Sie bräuchten lediglich Klassen, die die unterstützten atomaren Ausdrücke (Addition, Subtraktion, Multiplikation etc.) abbilden und die Referenzen auf ihre Operanden(ausdrücke) erlauben. Das.NET-Framework stellt dazu im Namensraum System.Linq.Expressions entsprechende Klassen zur Verfügung, gemeinsam mit der Möglichkeit, einen Ausdruck dynamisch auszuführen. Sie müssten»nur«noch den Parser schreiben (was allerdings nicht allzu einfach ist). Neben dem dynamischen Zusammensetzen und dem Ausführen eines Ausdrucks erlauben Ausdrucksbäume auch eine dynamische Auswertung. Dieses Feature wird z. B. in LINQ to SQL genutzt: LINQ erlaubt zunächst die Verwendung der Where-Methode auf allen Auflistungen, die IEnumerable implementieren. Dieser Methode wird eine Instanz des Delegate Func<TSource, bool> oder Func<TSource, int, bool> übergeben, wobei TSource der Typ der in der Auflistung verwalteten Objekte und bool der Rückgabetyp ist. Die übergebene Methode überprüft eine Bedingung über die Auswertung des übergebenen Objekts und gibt true zurück, wenn die Bedingung erfüllt ist. Dazu wird natürlich zur Vereinfachung ein Lambda-Ausdruck verwendet. Das folgende Beispiel sucht in einer Auflistung von Personen nach denen, die in Dublin wohnen: List<Person> persons = GetPersons(); foreach (Person personfromdublin in persons.where<person>( person => person.city == "Dublin")) Console.WriteLine(personFromDublin.FirstName + " " + personfromdublin.lastname); LINQ verwendet die übergebene Prüf-Methode zum Test, ob die einzelnen Objekte in der Auflistung der Bedingung entsprechen. Das hat noch nichts mit Ausdrucksbäumen zu tun. Wird aber LINQ to SQL verwendet, sieht das Ganze anders aus. Die Abfrage der Daten erfolgt dann gegen eine Auflistung, die in einem DataContext verwaltet wird. Ich will hier nicht näher auf dieses separate Thema eingehen. Der DataContext kümmert sich im Wesentlichen um die Abfrage und Aktualisierung der Daten. Eine zum vorhergehenden Beispiel äquivalente Abfrage würde in etwa folgendermaßen aussehen: foreach (Person personfromdublin in datacontext.persons.where<person>( person => person.city == "Dublin")) Console.WriteLine(personFromDublin.FirstName + " " + personfromdublin.lastname); Würden bei LINQ to SQL allerdings zunächst immer erst alle Objekte aus der Datenquelle abgefragt und dann erst gegen die Prüfmethode geprüft werden, wäre dies sehr ineffizient. Ausdrucksbäume 7

10 Deswegen geht LINQ to SQL anders vor: Die Where-Methode wertet den Ausdrucksbaum aus, den der übergebene Lambda-Ausdruck ergibt, und setzt diesen in eine entsprechende SQL- WHERE-Klausel um. Diese wird dann verwendet, um die Daten gezielt abzufragen. Damit werden nur die Daten abgefragt, die der übergebenen Bedingung entsprechen. Das ist effizient und damit ein guter Grund für den Einsatz von Ausdrucksbäumen. 4.3 Ausdrucksbäume in.net Das.NET-Framework unterstützt Ausdrucksbäume über Klassen im Namensraum System.Linq.Expressions. Der Namensraum deutet darauf hin, dass Ausdrucksbäume vorwiegend in LINQ verwendet werden, was auch richtig ist. Ausdrucksbäume können allerdings (natürlich) überall dort verwendet werden, wo sie sinnvoll erscheinen. Anwendungsbereiche zu finden ist allerdings nicht allzu einfach wenn Sie in der»normalen«( objektorientierten) Programmierung zuhause sind, um nicht in der funktionalen. LINQ to SQL nutzt Ausdrucksbäume sehr intensiv, indem die bei der Abfrage von Daten verwendeten Lambda-Ausdrücke in passende SQL-Anweisungen umgesetzt werden. Das Verständnis dieser Technik war der Hauptgrund dafür, Ausdrucksbäume in diesem Artikel zu behandeln. Aber vielleicht finden Sie auch weitere Verwendung dafür. 4.4 Erstellung eines Ausdrucksbaums Ein Lambda-Ausdruck, der einem Delegate D entspricht, entspricht immer einer Instanz der Klasse System.Linq.Expressions.Expression<D>. Ausdruckbäume können also implizit über einen Lambda-Ausdruck erzeugt werden (was ja z. B. bei LINQ to SQL genutzt wird). Die Bruttoberechnung kann z. B. folgendermaßen über einen Lambda-Ausdruck erzeugt werden: Expression<Func<double, double, double>> grosslambdaexpression = (net, vat) => net * (1 + (vat / 100)); Sie können Ausdrucksbäume aber auch explizit über die Klassen des Namensraums System.Linq.Expressions erzeugen. Das erscheint Ihnen vielleicht etwas komplex und u. U. unsinnig. Wie gesagt: Anwendungsbereiche dafür zu finden ist nicht so einfach. Aber ich denke, um die Möglichkeiten einschätzen zu können, sollten wir mit Ausdrucksbäumen umgehen können. Ausdrucksbäume 8

11 System.Linq.Expressions enthält einige Klassen zur Definition von Ausdrücken (Tabelle 4.1). Expression ist dabei die (abstrakte) Basisklasse aller Ausdrucksklassen. Die spezialisierten Ausdrucksklassen wie z. B. BinaryExpression können nicht direkt instanziert werden, sondern müssen über statische Methoden der Expression-Klasse erzeugt werden. Klasse Expression Expression<TDelegate> BinaryExpression ConditionalExpression ConstantExpression LambdaExpression MethodCallExpression Bedeutung Expression ist die abstrakte Basisklasse aller speziellen Ausdrucksklassen. Sie stellt die Eigenschaft NodeType zur Verfügung, die den Typ des Knotens definiert, den der jeweilige Ausdruck darstellt. Die Eigenschaft Type gibt den Typ des Ausdrucks an. Expression enthält außerdem eine Menge statischer Methoden zur Erzeugung spezialisierter Ausdruck-Objekte, wie z. B. Add zur Erzeugung eines BinaryExpression-Objekts für eine Addition. Diese generische Klasse erwartet eine Typangabe in Form eines Delegate. Sie verwaltet den Ausdrucksbaum eines Lambda-Ausdrucks. Ein Lambda-Ausdruck, der dem Delegate TDelegate entspricht, kann in eine Instanz von Expression<TDelegate> konvertiert werden, um den Ausdrucksbaum auswerten zu können, den der Lambda- Ausdruck ergibt. Expression<TDelegate> ist von LambdaExpression abgeleitet und kann deswegen kompiliert und ausgeführt werden. Diese Klasse steht für Ausdrücke mit zwei Operanden. Die Operanden werden in den Eigenschaften Left und Right verwaltet und referenzieren Expression-Instanzen, also wieder alle möglichen anderen Ausdrucks-Objekte. BinaryExpression-Instanzen werden über verschiedene statische Methoden der Expression-Klasse, wie z. B. Add, Divide, Modulo, Multiply, Power, Subtract, And und Or erzeugt. Diese Klasse ermöglicht die Definition einer Bedingung im Ausdrucksbaum. Die Bedingung wird in der Eigenschaft Test verwaltet. Ergibt die Bedingung true, wird der Baum an dem Ausdruck weiter ausgeführt, der in der Eigenschaft IfTrue referenziert wird, im anderen Fall an dem Ausdruck, den die Eigenschaft IfFalse referenziert. Conditional- Expression-Instanzen erzeugen Sie über die statische Condition-Methode der Expression-Klasse. Instanzen dieser Klasse verwalten in ihrer Eigenschaft Value konstante Werte, die in einem Ausdruck verwendet werden. LambdaExpression stellt einen Lambda-Ausdruck dar. Im Wesentlichen handelt es sich dabei um einen Ausdrucksbaum mit einer Auflistung der verwendeten Parameter. Der Ausdrucksbaum wird in der Eigenschaft Body verwaltet, die Parameter in der Eigenschaft Parameters. Lambda- Expression-Instanzen erlauben das Kompilieren und das Ausfüllen des Ausdrucksbaums. Diese Klasse steht für Ausdrücke, die einen Methodenaufruf darstellen. Die aufzurufende Methode wird in der Eigenschaft Method verwaltet. Die Eigenschaft Object referenziert das Ausdrucksbäume 9

12 ParameterExpression UnaryExpression Objekt, auf dem die Methode ausgeführt werden soll. Object ist null wenn es sich um eine statische Methode handelt. Die Eigenschaft Arguments verwaltet die Argumente, die der Methode übergeben werden sollen. MethodCallExpression-Instanzen werden über die statischen Methoden Call, ArrayIndex, oder ArrayIndex der Expression-Klasse erzeugt. ParameterExpression-Objekte verwalten die in einem Ausdruck verwendeten Parameter. Der Name des Parameters wird in der Eigenschaft Name verwaltet, der Typ in der (von Expression geerbten) Eigenschaft Type. Diese Klasse repräsentiert einen unären Ausdruck, also einen Ausdruck mit nur einem Operanden. Das kann z. B. ein Vorzeichenwechsel sein. Der Operand wird in der Eigenschaft Operand verwaltet. Tabelle 4.1: Die wichtigen Klassen zur Darstellung von Ausdrucksbäumen Neben den in Tabelle 4.1 angegebenen Klassen enthält der Namensraum System.Linq.Expressions noch die Klassen InvocationExpression, ListInit- Expression, MemberExpression, MemberInitExpression, NewArrayExpression, NewExpression und TypeBinaryExpression, die hier nicht weiter beschreiben kann. Um die Arbeit mit Ausdrucksbäumen zu demonstrieren, erzeugt das folgende Beispiel ein Ausdrucksbaum für die Brutto-Berechnung vom Anfang dieses Abschnitts. ParameterExpression netparameterexpression = Expression.Parameter(typeof(double), "net"); ParameterExpression vatparameterexpression = Expression.Parameter(typeof(double), "vat"); Expression grossexpression = Expression.Multiply( netparameterexpression, Expression.Add( Expression.Constant(1D), Expression.Divide( vatparameterexpression, Expression.Constant(100D)))); Kommentar [JB1]: Überprüfen Listing 4.1: Explizite Erzeugung eines Ausdrucksbaums für eine Bruttoberechnung Zu diesem Beispiel ist anzumerken, dass die verwendeten ParameterExpression-Instanzen deswegen separat erzeugt werden, weil diese später, beim Kompilieren und Ausführen des Ausdrucks, noch einmal benötigt werden. Den erzeugten Baum können Sie sich über einen Visual-Studio-Visualisierer anschauen. Halten Sie das Programm dazu an einer Anweisung hinter der Erzeugung des Expression-Objekts an, bewegen Sie den Cursor auf die Variable und wählen Sie den EXPRESSION TREE VISUALIZER. Dieser Visualisierer zeigt den Ausdrucksbaum in seiner grafischen Struktur an. Kommentar [JB2]: Ist der Expression Tree Visualizer Bestandteil von VS? Ansonsten Installation über die LINQ-Samples beschreiben Ausdrucksbäume 10

13 Abbildung 4.2: Anzeige des Bruttoberechnungs-Ausdrucksbaums über den Expression Tree Visualizer Kommentar [JB3]: Name checken Ausdrucksbäume können Sie nun ausführen oder auswerten. Zum Ausführen eines Ausdrucksbaums muss dieser allerdings in eine LambdaExpression-Instanz eingehüllt werden. Eine solche erlaubt das Kompilieren des Ausdrucks über die Compile-Methode. Compile erzeugt aus dem Ausdruck eine Methode und gibt eine Delegate- Referenz zurück. Über die DynamicInvoke-Methode des Delagate können Sie die Ausdrucks-Methode dann ausführen. Eine LambdaExpression-Instanz verwaltet denen auszuführenden Ausdrucksbaum in der Eigenschaft Body. Da Ausdrucksbäume auch Parameter enthalten können, die an beliebigen Stellen im Baum angelegt sein können, müssen diese auch übergeben werden können. Dazu erwartet eine LambdaExpression-Instanz zunächst eine Auflistung der verwendeten ParameterExpression-Objekte in der Eigenschaft Parameters. Diese Auflistung bestimmt lediglich die Reihenfolge der Parameter, in der deren Werte später der DynamicInvoke- Methode übergeben werden. Den Ausdrucksbaum und die Parameter übergeben Sie der statischen Lambda-Methode der Expression-Klasse um eine LambdaExpression-Instanz zu erzeugen. Ausdrucksbäume 11

14 Die an die LambdaExpression-Instanz übergebenen ParameterExpression- Instanzen müssen dieselben sein, die in dem Ausdrucksbaum verwendet werden. Laut einem Posting 1 von Anders Hejlsberg, dem Chef-Entwickler von C#, werden Parameterausdrücke nicht über deren Namen identifiziert, sondern über die Objekt- Referenz. Der Name hat laut Anders nur informativen Charakter. Wenn Sie stattdessen neue ParameterExpression-Instanzen (mit denselben Namen) übergeben, erhalten Sie beim Kompilieren des Ausdrucks u. U. 2 den Fehler»Lambda Parameter not in scope«. Das ist in meinen Augen sehr verwirrend und fehlerträchtig. Aber sei's drum... Kommentar [JB4]: Überprüfen Der Beispiel-Ausdrucksbaum kann also folgendermaßen ausgeführt werden: ParameterExpression[] parameters = new ParameterExpression[] netparameterexpression, vatparameterexpression ; LambdaExpression grosslambdaexpression = Expression.Lambda(grossExpression, parameters); double net = 1000; double vat = 19; object result = grosslambdaexpression.compile().dynamicinvoke(net, vat); Listing 4.2: Ausführen eines LambdaExpression-Objekts Wenn ein Ausdrucksbaum nicht ausgeführt, sondern so ausgewertet werden soll, dass es in eine spezielle Sprache übersetzt wird (z. B. in SQL), könne Sie dies erreichen, indem Sie die einzelnen Knoten des Baums vom Wurzel-Ausdruck aus durchgehen. Jeden Knoten müssen Sie dann auf die von Ihrem Konvertierer unterstützten Expression-Klassen überprüfen, in diese umwandeln und ggf. die weiteren Informationen der jeweiligen Instanz auswerten. Da dieser Vorgang recht komplex ist, zeige ich in Listing 4.3 nur beispielhaft, wie ein Ausdrucksbaum in sein SQL-Äquivalent umgesetzt werden könnte. Das Beispiel ist allerdings unvollständig und müsste für die Praxis noch wesentlich erweitert werden. private static string EvaluateExpressionAsSql(Expression expression) string result = null; // Überprüfen auf die unterstützten Typen if (expression is BinaryExpression) BinaryExpression binaryexpression = expression as BinaryExpression; // Ermittlung des Operators string op = null; switch (binaryexpression.nodetype) case ExpressionType.Add: op = "+"; case ExpressionType.And: op = "AND"; case ExpressionType.Divide: op = "/"; case ExpressionType.Equal: op = "="; 1 Auch wenn der Link nicht für ewig funktionieren wird: forums.microsoft.com/msdn/showpost.aspx?postid= &siteid=1 2 In meinen Tests trat der Fehler nur dann auf, wenn der Ausdrucksbaum mehr als einen Parameter enthielt Ausdrucksbäume 12

15 case ExpressionType.GreaterThan: op = ">"; case ExpressionType.GreaterThanOrEqual: op = ">="; case ExpressionType.LessThan: op = "<"; case ExpressionType.LessThanOrEqual: op = "<="; case ExpressionType.Modulo: op = "mod"; case ExpressionType.Multiply: op = "*"; case ExpressionType.Not: op = "NOT"; case ExpressionType.NotEqual: op = "<>"; case ExpressionType.Or: op = "OR"; case ExpressionType.Power: case ExpressionType.Subtract: op = "-"; default: throw new NotSupportedException( "Nicht unterstützer Operator '" + expression.nodetype + "'"); // Rekursiver Aufruf mit dem linken und dem rechten Operanden result = "(" + EvaluateExpressionAsSql(binaryExpression.Left) + ") " + op + " (" + EvaluateExpressionAsSql(binaryExpression.Right) + ")"; else if (expression is ConstantExpression) // Auslesen des Konstantenwerts ConstantExpression constantexpression = expression as ConstantExpression; if (constantexpression.type.name.startswith("int") constantexpression.type.name.startswith("uint") constantexpression.type == typeof(float) constantexpression.type == typeof(double) constantexpression.type == typeof(decimal)) result = String.Format(CultureInfo.CreateSpecificCulture("en"), "0", constantexpression.value); else if (constantexpression.type == typeof(string)) result = "'" + constantexpression.value.tostring() + "'"; else throw new NotSupportedException("Der Konstantentyp '" + constantexpression.type.name + "' wird nicht unterstützt"); else if (expression is ParameterExpression) // Auslesen des Namens Ausdrucksbäume 13

16 ParameterExpression parameterexpression = expression as ParameterExpression; result = "@" + parameterexpression.name; else throw new NotSupportedException("Der Ausdruckstyp '" + expression.gettype().name + "' wird nicht unterstützt"); return result; Listing 4.3: Beispiel für die Auswertung eines Ausdrucksbaums (als SQL-String) Ausdrucksbäume 14

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Erwin Grüner 09.02.2006

Erwin Grüner 09.02.2006 FB Psychologie Uni Marburg 09.02.2006 Themenübersicht Folgende Befehle stehen in R zur Verfügung: {}: Anweisungsblock if: Bedingte Anweisung switch: Fallunterscheidung repeat-schleife while-schleife for-schleife

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Erstellen der Barcode-Etiketten:

Erstellen der Barcode-Etiketten: Erstellen der Barcode-Etiketten: 1.) Zuerst muss die Schriftart Code-39-Logitogo installiert werden! Das ist eine einmalige Sache und muss nicht zu jeder Börse gemacht werden! Dazu speichert man zunächst

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken. In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access Die Grundlagen der Datenbanken kurspc15 Inhaltsverzeichnis Access... Fehler! Textmarke nicht

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Programmierung in C. Grundlagen. Stefan Kallerhoff

Programmierung in C. Grundlagen. Stefan Kallerhoff Programmierung in C Grundlagen Stefan Kallerhoff Vorstellungsrunde Name Hobby/Beruf Schon mal was programmiert? Erwartungen an den Kurs Lieblingstier Für zu Hause C-Buch online: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Mehr

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Vollständigkeit halber aufgeführt. Gehen wir einmal davon aus, dass die von uns angenommenen 70% im Beispiel exakt berechnet sind. Was würde

Mehr

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3 Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer Inhalt Erste Anmeldung. Schritt 1: Anmeldung..2 Schritt 2: Passwort setzen 3 Schritt 3: Nachträgliches Ändern des Passworts..4 Schreiben

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Druckerscriptsprache

Druckerscriptsprache Druckerscriptsprache Die Druckerscriptsprache stellt Ihnen ein mächtiges Werkzeug zur Erstellung und Automatisierung von komplexen Druckvorgängen zur Verfügung. Vom Folgedruck bis zum Archivfunktion ist

Mehr

Hilfedatei der Oden$-Börse Stand Juni 2014

Hilfedatei der Oden$-Börse Stand Juni 2014 Hilfedatei der Oden$-Börse Stand Juni 2014 Inhalt 1. Einleitung... 2 2. Die Anmeldung... 2 2.1 Die Erstregistrierung... 3 2.2 Die Mitgliedsnummer anfordern... 4 3. Die Funktionen für Nutzer... 5 3.1 Arbeiten

Mehr

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:

Mehr

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen 1. Einführung Über die Tabellen-Auswertungen können Sie eigene Auswertungen nach Ihren Wünschen erstellen. Diese Auswertungen werden immer anhand der aktuellen Daten aus orgamax ermittelt, Sie können also

Mehr

Wie halte ich Ordnung auf meiner Festplatte?

Wie halte ich Ordnung auf meiner Festplatte? Wie halte ich Ordnung auf meiner Festplatte? Was hältst du von folgender Ordnung? Du hast zu Hause einen Schrank. Alles was dir im Wege ist, Zeitungen, Briefe, schmutzige Wäsche, Essensreste, Küchenabfälle,

Mehr

Wir arbeiten mit Zufallszahlen

Wir arbeiten mit Zufallszahlen Abb. 1: Bei Kartenspielen müssen zu Beginn die Karten zufällig ausgeteilt werden. Wir arbeiten mit Zufallszahlen Jedesmal wenn ein neues Patience-Spiel gestartet wird, muss das Computerprogramm die Karten

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt 14.4.2016 Technische Hochschule Georg Agricola WORKSHOP TEIL 3 IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Morse-Tabelle...

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

Einführung in die C++ Programmierung für Ingenieure

Einführung in die C++ Programmierung für Ingenieure Einführung in die C++ Programmierung für Ingenieure MATTHIAS WALTER / JENS KLUNKER Universität Rostock, Lehrstuhl für Modellierung und Simulation 14. November 2012 c 2012 UNIVERSITÄT ROSTOCK FACULTY OF

Mehr

Einführung in die Algebra

Einführung in die Algebra Prof. Dr. H. Brenner Osnabrück SS 2009 Einführung in die Algebra Vorlesung 13 Einheiten Definition 13.1. Ein Element u in einem Ring R heißt Einheit, wenn es ein Element v R gibt mit uv = vu = 1. DasElementv

Mehr

Mind Mapping am PC. für Präsentationen, Vorträge, Selbstmanagement. von Isolde Kommer, Helmut Reinke. 1. Auflage. Hanser München 1999

Mind Mapping am PC. für Präsentationen, Vorträge, Selbstmanagement. von Isolde Kommer, Helmut Reinke. 1. Auflage. Hanser München 1999 Mind Mapping am PC für Präsentationen, Vorträge, Selbstmanagement von Isolde Kommer, Helmut Reinke 1. Auflage Hanser München 1999 Verlag C.H. Beck im Internet: www.beck.de ISBN 978 3 446 21222 0 schnell

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

5. Übung: PHP-Grundlagen

5. Übung: PHP-Grundlagen 5.1. Erstes PHP-Programm 1. Schreiben Sie PHP-Programm innerhalb einer Webseite, d.h. innerhalb eines HTML-Dokument. Ihr PHP-Programm soll einen kurzen Text ausgeben und Komentare enthalten. Speichern

Mehr

Zahlen auf einen Blick

Zahlen auf einen Blick Zahlen auf einen Blick Nicht ohne Grund heißt es: Ein Bild sagt mehr als 1000 Worte. Die meisten Menschen nehmen Informationen schneller auf und behalten diese eher, wenn sie als Schaubild dargeboten werden.

Mehr

So gehts Schritt-für-Schritt-Anleitung

So gehts Schritt-für-Schritt-Anleitung So gehts Schritt-für-Schritt-Anleitung Software WISO Mein Büro Thema Eigene Auswertungen, Tabellenauswertungen Version/Datum V 13.00.05.101 Über die Tabellen-Auswertungen ist es möglich eigene Auswertungen

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Zur drittletzten Zeile scrollen

Zur drittletzten Zeile scrollen 1 Fragen und Antworten zur Computerbedienung Thema : Zur drittletzten Zeile scrollen Thema Stichwort Programm Letzte Anpassung Zur drittletzten Zeile scrollen Scrollen VBA Excel 1.02.2014 Kurzbeschreibung:

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003 Nicht kopieren Der neue Report von: Stefan Ploberger 1. Ausgabe 2003 Herausgeber: Verlag Ploberger & Partner 2003 by: Stefan Ploberger Verlag Ploberger & Partner, Postfach 11 46, D-82065 Baierbrunn Tel.

Mehr

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Beamen in EEP Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Zuerst musst du dir 2 Programme besorgen und zwar: Albert, das

Mehr

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7 Java 7 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Dezember 2011 JAV7 5 Java 7 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...

Mehr

Diana Lange. Generative Gestaltung Operatoren

Diana Lange. Generative Gestaltung Operatoren Diana Lange Generative Gestaltung Operatoren Begriffserklärung Verknüpfungsvorschrift im Rahmen logischer Kalküle. Quelle: google Operatoren sind Zeichen, die mit einer bestimmten Bedeutung versehen sind.

Mehr

Enigmail Konfiguration

Enigmail Konfiguration Enigmail Konfiguration 11.06.2006 Steffen.Teubner@Arcor.de Enigmail ist in der Grundkonfiguration so eingestellt, dass alles funktioniert ohne weitere Einstellungen vornehmen zu müssen. Für alle, die es

Mehr

Universal Gleismauer Set von SB4 mit Tauschtextur u. integrierten Gleismauerabschlüssen!

Universal Gleismauer Set von SB4 mit Tauschtextur u. integrierten Gleismauerabschlüssen! Stefan Böttner (SB4) März 2013 Universal Gleismauer Set von SB4 mit Tauschtextur u. integrierten Gleismauerabschlüssen! Verwendbar ab EEP7.5(mitPlugin5) + EEP8 + EEP9 Abmessung: (B 12m x H 12m) Die Einsatzhöhe

Mehr

Rundung und Casting von Zahlen

Rundung und Casting von Zahlen W E R K S T A T T Rundung und Casting von Zahlen Intrexx 7.0 1. Einleitung In diesem Werkstattbeitrag erfahren Sie, wie Zahlenwerte speziell in Velocity, aber auch in Groovy, gerundet werden können. Für

Mehr

Informationsblatt Induktionsbeweis

Informationsblatt Induktionsbeweis Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Summenbildung in Bauteiltabellen mit If Then Abfrage

Summenbildung in Bauteiltabellen mit If Then Abfrage Summenbildung in Bauteiltabellen mit If Then Abfrage Die in Bauteiltabellen ausgelesenen Werte lassen sich in jeder Spalte als Summe berechnen. So können selbstverständlich die Flächen der in der Tabelle

Mehr

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten Berichte bieten die gleichen Möglichkeit zur Berechnung von Werten wie Formulare und noch einige mehr. Im Gegensatz zu Formularen bieten Berichte die Möglichkeit, eine laufende Summe zu bilden oder Berechnungen

Mehr

ecaros2 - Accountmanager

ecaros2 - Accountmanager ecaros2 - Accountmanager procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Aufruf des ecaros2-accountmanager...3 2 Bedienung Accountmanager...4 procar informatik AG 2 Stand: FS 09/2012 1 Aufruf

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Folge 18 - Vererbung

Folge 18 - Vererbung Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. Der Serienversand Was kann man mit der Maske Serienversand machen? 1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. 2. Adressen auswählen,

Mehr

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen.

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen. Bildergalerie einfügen Wenn Sie eine Vielzahl an Bildern zu einem Thema auf Ihre Homepage stellen möchten, steht Ihnen bei Schmetterling Quadra das Modul Bildergalerie zur Verfügung. Ihre Kunden können

Mehr

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4. Agenda für heute, 4. Mai, 2006 Programmierparadigmen Imperative Programmiersprachen In Prozeduren zusammengefasste, sequentiell ausgeführte Anweisungen Die Prozeduren werden ausgeführt, wenn sie als Teil

Mehr

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden. Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden. Nach den Änderungen die Facebook vorgenommen hat ist es einfacher und auch schwerer geworden eigene Seiten einzubinden und

Mehr

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:

Mehr

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut Von Susanne Göbel und Josef Ströbl Die Ideen der Persönlichen Zukunftsplanung stammen aus Nordamerika. Dort werden Zukunftsplanungen schon

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Wenn der Name nicht gerade www.buch.de oder www.bmw.de heißt, sind Internetadressen oft schwer zu merken Deshalb ist es sinnvoll, die Adressen

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

Stammdatenanlage über den Einrichtungsassistenten

Stammdatenanlage über den Einrichtungsassistenten Stammdatenanlage über den Einrichtungsassistenten Schritt für Schritt zur fertig eingerichteten Hotelverwaltung mit dem Einrichtungsassistenten Bitte bereiten Sie sich, bevor Sie starten, mit der Checkliste

Mehr

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen.

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen. Deeplink einfügen Zur Angebotserstellung über Ihre Buchungsmaschine können Sie mit Schmetterling Quadra Deeplinks durch einen speziellen Deeplink Generator auf Ihre Homepage einfügen. Abhängig von Ihrer

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Bereich METIS (Texte im Internet) Zählmarkenrecherche Bereich METIS (Texte im Internet) Zählmarkenrecherche Über die Zählmarkenrecherche kann man nach der Eingabe des Privaten Identifikationscodes einer bestimmten Zählmarke, 1. Informationen zu dieser Zählmarke

Mehr

104 WebUntis -Dokumentation

104 WebUntis -Dokumentation 104 WebUntis -Dokumentation 4.1.9.2 Das elektronische Klassenbuch im Betrieb Lehrer Aufruf Melden Sie sich mit Ihrem Benutzernamen und Ihrem Passwort am System an. Unter den aktuellen Tagesmeldungen erscheint

Mehr

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Klicken Sie auf Neu anlegen, um Ihre neue Angebotseite zu erstellen..

Mehr

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen Wir wollen, dass ihr einfach für eure Ideen und Vorschläge werben könnt. Egal ob in ausgedruckten Flyern, oder in sozialen Netzwerken und

Mehr

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel Sehr vielen Mitarbeitern fällt es schwer, Serienbriefe an Kunden zu verschicken, wenn sie die Serienbrieffunktion von Word nicht beherrschen. Wenn die Kunden mit Excel verwaltet werden, genügen nur ein

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

1. Was ihr in dieser Anleitung

1. Was ihr in dieser Anleitung Leseprobe 1. Was ihr in dieser Anleitung erfahren könnt 2 Liebe Musiker, in diesem PDF erhaltet ihr eine Anleitung, wie ihr eure Musik online kostenlos per Werbevideo bewerben könnt, ohne dabei Geld für

Mehr

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16 Fakultät für Informatik Lehrstuhl 14 Lars Hildebrand, Marcel Preuß, Iman Kamehkhosh, Marc Bury, Diana Howey Übungsblatt

Mehr

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN Karlsruhe, April 2015 Verwendung dichte-basierter Teilrouten Stellen Sie sich vor, in einem belebten Gebäude,

Mehr

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager email-rückläufer Script. combit GmbH Untere Laube 30 78462 Konstanz

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager email-rückläufer Script. combit GmbH Untere Laube 30 78462 Konstanz combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager 7 combit Relationship Manager email-rückläufer Script Inhalt Einleitung 3 Notwendige Anpassungen 3 crm Solution

Mehr

Lineare Differentialgleichungen erster Ordnung erkennen

Lineare Differentialgleichungen erster Ordnung erkennen Lineare Differentialgleichungen erster Ordnung In diesem Kapitel... Erkennen, wie Differentialgleichungen erster Ordnung aussehen en für Differentialgleichungen erster Ordnung und ohne -Terme finden Die

Mehr

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen Grundlagen der Programmierung Prof. H. Mössenböck 3. Verzweigungen If-Anweisung n > 0? j n if (n > 0) x = x / n; ohne else-zweig x x / n j max x x > y? n max y if (x > y) max = x; else max = y; mit else-zweig

Mehr

Aufklappelemente anlegen

Aufklappelemente anlegen Aufklappelemente anlegen Dieses Dokument beschreibt die grundsätzliche Erstellung der Aufklappelemente in der mittleren und rechten Spalte. Login Melden Sie sich an der jeweiligen Website an, in dem Sie

Mehr

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine PhotoLine S/W mit PhotoLine Erstellt mit Version 16.11 Ich liebe Schwarzweiß-Bilder und schaue mir neidisch die Meisterwerke an, die andere Fotografen zustande bringen. Schon lange versuche ich, auch so

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

ZAHLUNGSAVIS. Im Zahlungsprogrammteil automatisch erstellen

ZAHLUNGSAVIS. Im Zahlungsprogrammteil automatisch erstellen DIBU GS/XP Finanzbuchhaltung Erweiterung ZAHLUNGSAVIS Im Zahlungsprogrammteil automatisch erstellen Seite - 1 - von 8 Seite(n) Stand März 2005-03-28 Technische Hinweise: Geänderte Programme FIZAHL1, FIZAHL2,

Mehr

Biogena IMK. Individuelle Mikronährstoff Komponenten. Benutzerhandbuch. Natürlich so individuell wie Ihr Patient

Biogena IMK. Individuelle Mikronährstoff Komponenten. Benutzerhandbuch. Natürlich so individuell wie Ihr Patient Biogena IMK Individuelle Mikronährstoff Komponenten Benutzerhandbuch Natürlich so individuell wie Ihr Patient 1. Anmeldung 1.1. Einloggen bei Biogena IMK Geben Sie Ihre persönlichen Login Daten, die Sie

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

ASA Schnittstelle zu Endian Firewall Hotspot aktivieren. Konfiguration ASA jhotel

ASA Schnittstelle zu Endian Firewall Hotspot aktivieren. Konfiguration ASA jhotel ENDIAN DISTRIBUTOR ASA Schnittstelle zu Endian Firewall Hotspot aktivieren Konfiguration ASA jhotel ASA jhotel öffnen Unter den Menüpunkt Einrichtung System System Dort auf Betrieb Kommunikation Internet-Zugang

Mehr

Um die Patientenverwaltung von Sesam zu nutzen, muss man die Patienten natürlich zuerst in die Kartei eintragen.

Um die Patientenverwaltung von Sesam zu nutzen, muss man die Patienten natürlich zuerst in die Kartei eintragen. Kartei, Patient neu anlegen / 1. Kontaktbrief schreiben Um die Patientenverwaltung von Sesam zu nutzen, muss man die Patienten natürlich zuerst in die Kartei eintragen. -> Klick Button Kartei -> Klick

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

teamsync Kurzanleitung

teamsync Kurzanleitung 1 teamsync Kurzanleitung Version 4.0-19. November 2012 2 1 Einleitung Mit teamsync können Sie die Produkte teamspace und projectfacts mit Microsoft Outlook synchronisieren.laden Sie sich teamsync hier

Mehr

Erstellung von Reports mit Anwender-Dokumentation und System-Dokumentation in der ArtemiS SUITE (ab Version 5.0)

Erstellung von Reports mit Anwender-Dokumentation und System-Dokumentation in der ArtemiS SUITE (ab Version 5.0) Erstellung von und System-Dokumentation in der ArtemiS SUITE (ab Version 5.0) In der ArtemiS SUITE steht eine neue, sehr flexible Reporting-Funktion zur Verfügung, die mit der Version 5.0 noch einmal verbessert

Mehr