übungsfragen - Übungsfragen PDF

Title übungsfragen - Übungsfragen
Course Einführung in die Programmierung (MCS)
Institution Julius-Maximilians-Universität Würzburg
Pages 12
File Size 347 KB
File Type PDF
Total Downloads 73
Total Views 125

Summary

Übungsfragen...


Description

1.1 Geben Sie Eigenschaften der Programmiersprache Scheme an! • Funktional, interpretiert • Wenige syntaktische Elemente • Dynamische Typisierung • Arithmetische Grundfunktionen • Auswertung einfacher Ausdrücke durch Ersetzung • Große Ausdrucksfähigkeit • Statisches Scoping mit lexikalischer Variablenbindung • Funktionen höherer Ordnung 1.2 Schreiben Sie eine Scheme Funktion, welche überprüft ob ein übergebenes Objekt eine Liste ist. (define (is-list? e) (cond ((empty? e) true) ((and (pair? e) (is-list? (rest e))) true) (else false))) 1.3 Schreiben Sie ein Scheme - Programm welches zwei gleichlange Listen miteinander addiert! (define (sum L) (cond ((emty?) L) (else (+ ( first L) (sum ( rest L) ? 1.4 Schreiben Sie ein Scheme - Programm, dass zwei Listen unbekannter Länge addiert.(schwieriger) ? 2.1 Nennen Sie Eigenschaften von C++? - Objektorientiert (Methoden, Attribute, Zustand, Verhalten) - Klassenbasiert (def. Der Objekte in der Klasse, Klassen sind in Vererbungshierachie organisiert) - statisch Typisiert (variablen haben einen festgelegten Typ, Überprüfung zur Compilerzeit, Typ mit Variable assoziert) - Vererbung (Klassenhierachie, Überschreiben, Überladen, Mehrfachvererbung, Polymorphismus, Liskov Prinzip) - Kapselung (Geheimnisprinzip)-> intern(was sich dahinter verbirgt) und extern(Interface) Sicht auf eine Klasse - Zeiger, Referenzen, Const- Correctness - generische Programmierung durch Templates (Container, Iteratoren, Algorithmen) 2.2 Was bedeutet „Objektorientiert“?

Vergleichen Sie dazu die Programmiersprachen Scheme, C++ und JavaScript. a) b) c) d) e)

Alles wird durch Objekte modelliert. Objekte führen Aktionen durch den Austausch von Botschaften aus. Jedes Objekt speichert seinen eigenen Zustand, der sich ggf. aus anderen Objekten zusammensetzt. Jedes Objekt ist die Instanz einer Klasse. Klassen abstrahieren den Informationsgehalt einzelner Objekte. Die Klasse definiert das Verhalten ihrer Objekte.

Scheme ist hingegen funktionsbasiert, also funktionale Programmierung Und der Unterschied zu Javascript ist es gibt kein Unterschied zwischen Objekt und Klassen; wichtige Sprachbestandteile werden als Objekt behandelt; Objekte besitzen Properties 2.3 Was ist der Unterschied zwischen Methoden, Botschaften und Objekten. Botschaften: Für jede Botschaft gibt es einen designierten Empfänger! Verschiedene Empfänger können die gleiche Botschaft unterschiedlich interpretieren! Methoden: Synonym zu Operation, mit welcher Objekte manipuliert werden Objekte: • Operationen in OOP werden durch Botschaften aktiviert • Das Verhalten (behavior) eines Objektes wird durch die Menge der verfügbaren Operationen beschrieben • Ändern oder Abfragen des Zustandes nur über Operationen möglich • Ein Objekt kann eine Botschaft akzeptieren und dann eine Operation gleichen Namens ausführen und Ausgabedaten zurückliefern 3.1 Was versteht man unter Kapselung? Was hat Kapselung mit Abstraktion zu tun? • Antwort: Definiert eine interne und eine externe Sicht auf eine Klasse. Das Interface definiert die externe Sicht auf die Klasse. Hinter dem Interface verbirgt sich die interne Sicht auf die Implementation der Klasse. • Kapselung ermöglicht Abstraktion durch Verbergen der Implementationskomplexität.

3.2 Wann ist eine Funktion virtual, wann sollte man sie pure virtuell setzen, was bedeutet das? (Wichtig!!!) Virtual ist eine Methode einer Klasse, deren Einsprungadresse erst zur Laufzeit ermittelt wird. Dieses sogenannte dynamische Binden ermöglicht es, Klassen von einer Oberklasse abzuleiten und dabei Funktionen zu überschreiben bzw. zu überlagern. Das Konzept der virtuellen Methoden wird von einem Übersetzer z. B. mittels virtueller Tabellen umgesetzt. Pure virtuelle Methode: Virtuelle Methoden können zusätzlich auch noch abstrakt sein. In der Klasse, in der die Methode deklariert wird, bleibt die Methode leer und kann daher auch nicht aufgerufen werden. Erst in einer abgeleiteten Klasse, wird die abstrakte Methode überschrieben und kann dann benutzt werden. Sonst könnte man keine Instanzen/Objekte anlegen. (Ein pure virtual Destruktor muss einen Körper haben (bzw. es wird automatisch einer generiert, wenn man keinen selber schreibt) da eine Klasse immer einen Destruktor haben muss.) 3.3 Erläutern Sie die Begriffe Überladen, Shadowing, Überschreiben. Überladen: Der Name einer Methode in der abgeleiteten und in der Basisklasse sind gleich, aber die Typsignaturen unterscheiden sich. • Basierend auf Gültigkeitsbereichen • Basierend auf Typsignaturen • Auflösung zur Übersetzungszeit Shadowing: die Typsignatur sind in der Basisklasse und in der abgeleiteten Klasse gleich. Die Methode wurde in keiner Basisklasse virtuell erklärt. Überschreiben: die Typsignatur sind in der Basisklasse und in der abgeleiteten Klasse gleich. Die Methode wurde in der Basisklasse als virtual erklärt. • Ersetzen oder Konkretisieren • Virtuelle Methoden, rein virtuelle Methoden • Auflösung zur Laufzeit • Methoden können nur im Kontext der Vererbung überschrieben werden, d.h. eine abgeleitete Klasse überschreibt die Methode der Basisklasse • Die Typsignaturen müssen beim Überschreiben bis auf eine Ausnahme übereinstimmen – während sie beim Überladen i. A. verschieden sind. 3.4 Was versteht man unter dem Liskov’schen Substitutionsprinzip? Objekte der abgeleiteten Klasse können stets an die Stelle von Objekten der Oberklasse treten Beispiel: Dies bedeutet, dass entgegen dem umgangssprachlichen Gebrauch ein Quadrat kein Rechteck ist, weshalb eine Klasse zur Modellierung von Quadraten nicht von einer Klasse zur Modellierung von Rechtecken abgeleitet werden darf. Während die Höhe und die Breite eines Rechteck unabhängig voneinander verändert werden können, ist dies bei einem Quadrat nicht möglich. Angenommen, ein Typ Quadrat wäre abgeleitet von einem Typ Rechteck, dann könnte auf

Grund der Polymorphie und der Generalisierung in jeder Methode, die ein Objekt vom Typ Rechteck als Parameter erwartet, auch ein Objekt vom Typ Quadrat übergeben werden. Diese Methode könnte eine Seite dieses Objektes verdoppeln, wodurch sich bei einem Objekt des Typs Rechteck der Flächeninhalt ebenfalls verdoppelt. Wird statt dessen ein Objekt vom Typ Quadrat übergeben, gilt dies nicht - hier würde sich der Flächeninhalt vervierfachen, da die beiden Seiten nicht unabhängig voneinander verändert werden können. Weil dabei das Liskovsche Prinzip verletzt wird, ist diese Ableitung fehlerhaft. 3.5 Was versteht man unter generischer Programmierung? Ist ein Verfahren zur Entwicklung wiederverwendbarer Software-Bibliotheken. Dabei werden Funktionen möglichst allgemein entworfen, um für unterschiedliche Datentypen und Datenstrukturen verwendet werden zu können. Die Implementierung erfolgt bei einigen Programmiersprachen durch das Konzept generischen Typen bzw. Templates —so gestalten sich dynamische Programmiersprachen, bei denen sich der Typ einer Variable zur Laufzeit ändern darf, durch ihre verallgemeinerte Polymorphie generisch. Von Sprachen, die solche Mechanismen bieten, sagt man auch, dass sie Generik erlauben. Wesentlich bei der generischen Programmierung ist, dass die Algorithmen nicht für einen bestimmten Datentyp geschrieben werden, sondern nur bestimmte Anforderungen an die Typen stellen. Das Prinzip wird auch parametrische Polymorphie genannt.

4.1 Erklären sie den Begriff Template, wo bzw. für was können Templates verwendet werden. sind „Programmgerüste“, die eine vom Datentyp unabhängige Programmierung ermöglichen. Templates unterstützen die generische Programmierung. Ein Funktionstemplate (auch Templatefunktion genannt) verhält sich wie eine Funktion, die in der Lage ist, Argumente verschiedener Typen entgegenzunehmen, und/oder verschiedene Rückgabetypen zu liefern 4.2 Wo werden Templates massiv eingesetzt? In C++ sind Schablonen von großem Nutzen, insbesondere wenn sie mit Vererbung und Überladen von Operatoren kombiniert werden. Auch die C++-Standardbibliothek stellt viele nützliche Komponenten in Form eines Template-Frameworkes, zur Verfügung.

4.3 Aus welchen Bestandteilen besteht die STL und in welchem Zusammenhang stehen sie? STL = Standard Temlate Libery • Container, Iteratoren, Algorithmen • Iterator Kategorien • Input, Output, Vorwärts, Bidirektional, Random Access • Sequentielle Container • vector, list, deque • Assoziative Container • set, multiset, map, multimap • Container Adapter • stack, queue • Algorithmen, Funktoren 4.4 Wie wird auf Elemente der STL- Container zugegriffen? oder Warum werden Iteratoren verwendet um auf Elemente von STL-Containern zuzugreifen. Iteratoren sind Abstraktionen von 'Pointer auf Array-Element' Algorithmen verwenden Iteratoren um auf die Elemente von Containern zuzugreifen Die Algorithmen-Bibliothek der STL enthält Funktionen, die den Bereich, auf dem sie arbeiten sollen, als Parameter übergeben bekommen. Die Bereichsgrenzen werden durch Iteratoren bestimmt. Dabei zeigt der Anfangsiterator auf das erste Element und der Enditerator auf das Element hinter dem Ende. Bei einem Array kann ein einfacher Zeiger als Iteratorersatz verwendet werden. Soll der Algorithmus auf dem ganzen Array arbeiten, wird als Anfangsiterator die Adresse des Arrays übergeben. Als Ende-Iterator wird zu dem Zeiger einfach die Anzahl der Elemente des Arrays hinzuaddiert. Damit zeigt der Ende-Iterator hinter das letzte Element.

5.1 Was ist der Unterschied zwischen assoziativen und sequentillen Containern. Assoziativ: • Variable Größe • Elemente haben einen Schlüssel (Key) und einen Wert • Effizientes Auffinden von Elementen anhand ihres Schlüssels O(log N) • Die Elemente eines assoziativen Containers sind bezüglich ihres Schlüssels geordnet • Die Sortierung der Elemente ist unabhängig von der Reihenfolge der Einfügungen • Die Schlüssel der Elemente sind nicht modifizierbar Paarweise assoziative Container • Elemente sind zweiwertig. Schlüssel und Wert bilden ein Wertepaar • Der Wert eines Elements kann verändert werden, nicht aber der Schlüssel • map und multimap • Einfache assoziative Container • Schlüssel und Wert sind identisch, jeder Wert ist sein eigener Schlüssel • set und multiset Sequenziell: • Sequentieller Container veränderlicher Größe • Ermöglicht wahlfreien Zugriff auf alle Elemente • Effizientes Einfügen von Elementen nur am Ende und am Anfang O(1) • Ineffizientes Einfügen überall möglich O(N) • Implementation ist besonders optimiert für Benutzung als Container mit first-in-first-out Semantik. Meistens in Verbindung mit queue Adapter • Das deque Interface ist dem vector Interface sehr ähnlich. Verwendung Sequenzieller Container • vector • Speichereffiziente Sequenz mit LIFO-Semantik • Wahlfreier Zugriff, Einfügen/Löschen eingeschränkt • deque • Relativ speichereffiziente Sequenz mit FIFO-Semantik • Wahlfreier Zugriff, Einfügen/Löschen eingeschränkt • list • Weniger speichereffiziente Sequenz • Kein wahlfreier Zugriff, Einfügen/Löschen überall 5.,2 Nennen Sie je 3 Container-Typen jeder Sorte. Assoziativ: map, multimap, multiset, set Sequenziell: vector, deque, list

5.3 Wann, wo und warum würden Sie die jeweiligen Container verwenden?

5.4 Wie ist ein/e Vector/List/Map/Set aufgebaut. Container Klasse -Vector: Er ähnelt dem Array, ist aber wesentlich flexibler. Wie bei einem Array befinden sich alle Elemente direkt nebeneinander im Speicher, und man kann jeweils über ihre Positionsnummer direkt auf sie zugreifen. Sogar die rechteckigen Klammern arbeiten, wie man es vom Array her kennt. Neu ist, dass die Größe des Vektors nicht zum Übersetzungszeitpunkt durch eine Konstante festgelegt werden muss. Sie kann nicht nur zur Laufzeit berechnet werden; die Größe kann sogar nachträglich verändert werden. Container Klasse -List: Dabei zeigt jedes Element mit einem Zeiger auf das nachfolgende Element. Die Elemente können vereinzelt an beliebiger Stelle im Speicher stehen. Darum muss dieser Container auch nicht umkopiert werden, wenn er wächst. Ein neues Element wird angefordert und in die Kette integriert. Um an das letzte Element zu gelangen, muss sich das Programm von Element zu Element durchhangeln. Eine doppelt verkettete Liste ist so aufgebaut, dass jedes Element zwei Zeiger besitzt. Der eine Zeiger zeigt auf den Nachfolger, der andere auf den Vorgänger in der Liste. Das führt zu einem gewissen Mehraufwand beim Einhängen neuer Elemente. Dafür ist es leichter möglich, an beiden Enden Elemente an- oder abzuhängen und in beiden Richtungen zu navigieren. Container Klasse -Set: Der Container set stellt die eingefügten Elemente sofort in einer sortierten Reihenfolge ab. In einem set darf jedes Element nur einmal auftreten. In einem multiset dürfen Elemente dagegen mehrfach auftreten. Der Container set ist ein assoziativer Container. Das heißt, dass er die Elemente nach einem Schlüsselwert in einem Binärbaum sortiert. 5.5 Nennen Sie dazu die Eigenschaften jedes einzelnen Containers (Vor-\Nachteile) Vector List

Vorteile Speichereffiziente Sequenz mit LIFO-Semantik. Wahlfreier Zugriff Einfügen/Löschen überall

Set ?

Nachteile Einfügen/Löschen eingeschränkt Weniger speichereffiziente Sequenz Kein wahlfreier Zugriff, Die effiziente Anwendung von Mengenoperationen auf die Containerelemente ist erforderlich Wert == Schlüssel

6.1 Schreiben Sie eine Stack-Template-Klasse, nutzen Sie dazu Standart-Container der STL und achten Sie auf const-correctness. Implementieren Sie die Funktion „T top()“. stack.h: #ifndef STACK_H #define STACK_H #include template class Stack { public: Stack(): top(0){} ~Stack(){} void push(int a); T pop(); private: static const int max_size = 17; T data[max_size]; int top; }; template void Stack::push(T d){ assert(top < max_size ); data[top] = T; top++; } template T Stack::pop(){ assert(top > 0 ); top--; return data[top]; } #endif

6.1.1 Welche Funktion würden Sie const setzen? Wann kann man generell eine Funktion const setzen.

? Generell: Wenn der Ausgangswert nicht verändert werden soll!

6.1.1.1 Was ist const- correctness? Idee: - Unveränderbarkeit (read- only) von Variablen, Rückgabewerten, … - Initialisierung muss bei der Deklaration erfolgen - Beispiel: double const PI = 3.14; - const gehört zur Signatur einer Funktion (Fkt.-name + Argumentliste + const) - Beispiel: std::vector const v1(1, 2, 0); std::vector v2(v1); v1[2] = 3 // nicht erlaubt!!! v2[2] = 3 // erlaubt Wertübergabe mit const: call- by- value / call- by- reference: - effiziente Übergabe ohne Copy- Konstruktor - Konstantheit der Werte (Versprechen / Zusicherung) - Funktionen mit mehreren Rückgabenwerten - Funktionsüberladung call- by- value: void fun(T const i) - const bei call- by- val eigentlich überflüssig, da sowieso eine Kopie erstellt wird call- by- reference: void fun(T const& i) 6.1.2 Was passiert wenn Sie einen const-Wert per Value übergeben? Es wird quasi eine Kopie gemacht 6.1.3 Was passiert wenn Sie einen Wert per const& übergeben? Der Wert ist nicht veränderbar 6.1.4 Was passiert wenn sie einen Wert const per Zeiger übergeben? Das innerhalb der Methode der Pointer nicht umgesetzt werden kann. 6.1.5 Was ist der Unterschied bei der Übergabe per reference/per value? • Übergabeparameter sollten Referenzen auf const Objekte sein • Rückgabewert sollte auch const sein. • Die Variable last ändert sich nie! 7.1.1 Stellen Sie eine Template-Funktion auf welche 3 Elemente eines beliebigen Datentypes reingibt und 2 Werte (maximum/minimum) wieder zurückgibt. Achten sie dabei auf const – Correctness.

7.1.2 Geben Sie 2 Möglichkeiten für die Rückgabe der 2 Elemente an.

7.1.3 Warum funktioniert die Funktion nicht für jeden Datentyp?

8.1 Was sind Pattern, nennen und erläutern Sie 3! Singelton Pattern: Das es von einer Klasse nur eine einzige Instanz gibt(bsp. Druckerspooler) Keine öffentlichen Konstruktoren Die Implementierung kann leicht geändert werden, so dass eine feste maximale Zahl von Instanzen zur Verfügung steht. Composite Pattern: Einheitliche Behandlung • Teile • Ganzes • einfache Clients • dynamic binding statt Fallunterscheidungen • leichte Erweiterbarkeit • neue Leaf-Klassen • neue Composite-Klassen • ohne Client-Änderung • evtl. zu allgemein • Einschränkung der erlaubten Komponenten-Typen schwer, zB • run-time type checks notwendig (instanceof) Decorator Pattern: vorhandene Objekten mit zusätzliche Fähigkeiten oder Verantwortlichkeiten ausstatten und diese ggf. wieder entfernen • vorhandene Fähigkeiten verändern (schwieriger) • zusätzlich objektspezifisches Overriding realisieren • Eine spezifische Methode des Decorator führt eigene Operationen aus und ruft dann die Methode des nächsten Objekts in der Kette auf. • modulare / unvorhergesehene Erweiterung • keine Änderung des "Hauptobjekts" erforderlich • wenn Vererbung nicht anwendbar ist • wenn die Identität des "Hauptobjekts" nicht wichtig ist

Schreiben Sie 2 Klassen welche dem Composite-Pattern entsprechen(Vererbung)!

Erläutern sie folgendes UML:

ImageProxy ist wie ein Stellvertreter für das eigentliche Bild in diesem Fall und läd dieses nur wenn es explizit gefordert wird (damit werden Kosten gespart) ähnlich wie Proxyserver im Internet, quasi eine Art Dealer:)

9.1 Nennen Sie Eigenschaften der Script-Sprache JavaScript. Vergleichen Sie mit C++ und Scheme. Ist auch Objektbasiert und besitzt eine Javaähnliche Syntax Interpretiert statt zu kompilieren Ist dynamisch Typisiert, ähnlich wie Scheme Entworfen für dynamische und interaktive Manipulation von html-Seiten Plattformunabhängig Im Gegensatz zu C++ wird hier nicht zwischen Klassen und Objekten unterscheiden Befehle bestehen aus einer Reihe von Anweisungen -> Anweisungsbasiert Funktionen können auch als Wert verwendet werden ()sqr= square; a=sqr(3) 9.2 Was bedeutet „Script Sprache“. Eine Scriptsprache ist eine Programmiersprache oder insbesondere auch eine webbasierte Programmiersprache, mit deren Hilfe Scripte programmiert werden können. Unter einem Script versteht man eine Aneinanderreihung von Programmierbefehlen in einer logischen, ausführbaren Reihenfolge. Scripte werden im Internet verwendet, um die gegebene Eingeengtheit, die durch HTML sowie durch andere Webprogrammiersprachen gegeben ist, aufzuheben. 9.3 Wie funktioniert die Vererbung in JavaScript. Prototype basiert Shared Properties Polymorphismus 9.4 Erläutern Sie das Prototyping-Prinzip, welches bei JavaScript Anwendung findet....


Similar Free PDFs