A&R TECH C++ Chess Challenge

Ähnliche Dokumente
Vererbung & Schnittstellen in C#

Objektorientierte Programmierung

Java Schulung (Java 2 Java Development Kit 5 / 6)

Objektorientierte Programmierung

3 Objektorientierte Konzepte in Java

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Javakurs für Anfänger

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Vorkurs C++ Programmierung

Universität Karlsruhe (TH) Framework for Integrated Tests (FIT)

5.5.8 Öffentliche und private Eigenschaften

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

3 Objektorientierte Konzepte in Java

Probeklausur: Programmierung WS04/05

Java Kurs für Anfänger Einheit 5 Methoden

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Abschnitt 9: Schnittstellen: Interfaces

Computeranwendung und Programmierung (CuP)

Programmieren in Java

1 Polymorphie (Vielgestaltigkeit)

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Javakurs 2013 Objektorientierung

3. Konzepte der objektorientierten Programmierung

GetName(), GetName(), GetGeschlecht() und AelterWerden().

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

C++-Zusammenfassung. H. Schaudt. August 18, 2005

SS Björn Berezowski B.Sc. Marco Münch B.Sc. Michael Roth B.Sc. Repetitorium PG 1. Übungsblatt. 1 Übung - Probeklausur SS 2010 Typ Prof.

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Programmieren Tutorium

Java Lab 2006/12/13 Client

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung

5.4 Klassen und Objekte

PIWIN 1 Übung Blatt 5

Fakultät Angewandte Informatik Programmierung verteilter Systeme Übungen zur Vorlesung Informatik II, Blatt 6

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Große Übung Praktische Informatik 1

Inhalt. Max Lini. ax. inie. Einleitung... VII

Übungen zu Computeranwendung und Programmierung WS 13/14

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Java Einführung Methoden in Klassen

5. Abstrakte Klassen

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

Informatik I Eprog HS10

Praktikum Betriebssysteme 1. Aufgabe (1)

Betreutes Programmieren Vorlesung Informatik II, Blatt 7 Musterlösung

Java Einführung Abstrakte Klassen und Interfaces

Deklarationen in C. Prof. Dr. Margarita Esponda

Projekt AGB-10 Fremdprojektanalyse

Arrays Fortgeschrittene Verwendung

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Objektorientierte Programmierung

Studentische Lösung zum Übungsblatt Nr. 7

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Neue Features in C# 2.0

Kapitel 6. Vererbung

Prof. Dr. Wilhelm Schäfer Paderborn, 12. Dezember 2011 Julian Suck Sebastian Goschin Moritz Schraut Besprechung der Aufgaben: 19.

Kapitel 6. Vererbung

Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 6

Kapitel 3 Das Projekt Bankkonto Seite 1

Graphic Coding. Klausur. 9. Februar Kurs A

Klassenbeziehungen & Vererbung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Objektorientierung: Klassen und Objekte

Kapitel 6. Vererbung

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Zusammengesetzte Datentypen -- Arrays und Strukturen

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Allgemein: Klassen testbar machen. 5. Mocking. Mocks programmieren. Zusammenspiel von Klassen testen

Aufgabe 1. »Programmieren«, WS 2006/2007. Nino Simunic M.A.

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

2 Entwurf eines einfachen Telefonbuchs

Datenbankanwendungsprogrammierung Crashkurs Java

Programmieren in Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Bearbeitungszeit: 120 Minuten. Kommentare kosten Zeit; kommentieren Sie ihr Programm nur da, wo der Code alleine nicht verständlich wäre.

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Software Engineering Klassendiagramme Einführung

Einführung in die. objektorientierte Programmierung

Java Projekt: Tic Tac Toe + GUI

Institut fu r Informatik

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

ProKu Sommersemester 2015 Aufgabenblatt 4

Propädeutikum zur Programmierung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Grundlagen von Python

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Dokumentation des Projektes Tic Tac Toe

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

Folge 18 - Vererbung

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

von Anja Austermann Drag and Drop

Transkript:

Willkommen zur A&R TECH C++ Chess Challenge! Wir freuen uns, dass du an dieser Herausforderung teilnimmst. Bevor es losgeht, möchten wir dich noch auf einige Dinge aufmerksam machen: Die Challenge besteht aus sieben Levels, die nacheinander gelöst werden müssen. Die Levels bauen aufeinander auf. Sobald du Level k korrekt gelöst hast, erhältst du von uns die Angabe zu Level k+1. Die Levels können mit Papier und Bleistift gelöst werden (z.b. auf den Rückseiten der Angaben). Du kannst die Lösungen natürlich auch auf deinem mitgebrachten Laptop präsentieren. In vielen Levels sind Implementierungen von Klassen oder Funktionen gefragt. Es geht uns nicht um syntaktisch einwandfreie, kompilierfähige Lösungen, sondern um die richtigen Ideen und Lösungsansätze. Solltest du die C++ Syntax nicht oder nur teilweise beherrschen, so kannst du Pseudocode verwenden. Es gibt keine Zeitlimits für die einzelnen Levels. Einige Levels setzen Grundkenntnisse des Schach-Regelwerks voraus. Falls du dir nicht sicher bist: www.google.at. Wir haben uns bemüht, die Aufgabenstellungen so klar wie möglich zu formulieren. Sollte es aber dennoch Unklarheiten zu den Angaben geben, so kannst du uns jederzeit am Messestand besuchen. Wir nehmen uns gerne Zeit um Klarheit zu schaffen. Du hast Ideen, Vorschläge oder Anregungen? Vielleicht hast du auch eine Idee, wie man Schach auf eine andere Art und Weise implementieren könnte? Lass uns daran teilhaben, wir diskutieren gerne mit dir! Warum solltest du dir überhaupt die Zeit nehmen und diese Challenge absolvieren? Nun ja, dafür kann es mehrere Gründe geben: o Dir macht Programmieren Spaß. o Du löst gerne komplexe Probleme. o Du hast Interesse an unserer Firma gewonnen. Wenn du uns fachlich überzeugen kannst, so bieten wir dir ein weiterführendes Gespräch mit uns an.

Level 1 Skizziere eine Klasse Square, die ein Feld eines Schachbretts darstellt. Ein Feld ist eindeutig durch seine x und y Koordinaten im Schachbrett bestimmt. Stelle Getter und Setter Methoden zur Verfügung. Implementiere außerdem eine public Funktion <return_type> Square::name() const, die den Namen des Feldes als String zurückgibt (Beispiel: A1, C3, ). Verwende als <return_type> einen gängigen String Datentyp.

Level 2 Skizziere eine Klasse ChessBoard, die ein Schachbrett darstellt. Die Klasse soll in ihrem Konstruktor 64 Square Objekte erzeugen und diese (genauer: Pointer auf diese) in einem privaten Feld/Container speichern. Füge der Klasse ChessBoard eine public Funktion Square *ChessBoard::getSquare(int x, int y) const hinzu, die zu einem Koordinatenpaar den Pointer auf das entsprechende Square Objekt zurückliefert. Zusatzfragen: Was bedeutet das const keyword in der Deklaration von getsquare()? Wie könnte die Klasse Square nun sinnvoll erweitert werden?

Level 3 An welcher Stelle in einem C++ Schachprogramm bietet sich der Einsatz von öffentlicher Vererbung und Polymorphismus an? Skizziere eine entsprechende Vererbungshierarchie.

Level 4 Gehe von folgender Vererbungshierarchie aus: ChessMan King (König) Queen (Dame) Rook (Turm) Knight (Springer) Bishop (Läufer) Pawn (Bauer) Skizziere die abstrakte Klasse ChessMan, die ein Interface für eine Schachfigur darstellt. Die Klasse soll zunächst folgende Elemente enthalten: Einen Pointer auf das Square, auf dem sich der ChessMan gerade befindet. Eine Farbe/Parteizugehörigkeit (Weiß = 0, Schwarz = 1) Die Initialisierung dieser beiden Variablen soll im Konstruktor stattfinden. Verwende an geeigneten Stellen das C++ keyword const. Mache Vorschläge für virtuelle Funktionen, die in ChessMan rein virtuell sind und in den abgeleiteten Klassen implementiert werden müssen. Welche anderen virtuellen Funktionen könnten eine Default-Implementierung in ChessMan definieren? (Hier sind nur Ideen und Vorschläge gesucht, nicht die konkreten Implementierungen).

Level 5 Sinnvolle rein-virtuelle Funktionen für die Klasse ChessMan sind virtual List<ChessDirection> movementdirections() const = 0; virtual int movementrange() const = 0; Überlege und skizziere sinnvolle Implementierungen dieser Funktionen für die abgeleiteten Klassen Queen (Dame) und Knight (Springer). Gehe dabei von folgenden Voraussetzungen aus: Es existiert bereits eine Klasse ChessDirection, die eine Richtung auf einem Schachbrett (ähnlich einem 2D-Richtungsvektor) darstellt. Eine ChessDirection besteht aus einem x- Wert und einem y-wert, die im Konstruktor übergeben werden. List<ChessDirection> bezeichnet eine geeignete Container Klasse, also eine Liste von ChessDirection Objekten. Die Funktion movementdirections() soll zurückliefern, in welche Richtungen sich ein ChessMan bewegen kann. Hinweis: Es geht hier nur um die Bewegungsrichtung, nicht um die Schlagrichtung. Beim Bauern (Klasse Pawn) würden sich diese unterscheiden. Die Funktion movementrange() soll zurückliefern, wie weit/oft sich ein ChessMan in jede dieser Richtungen pro Zug bewegen kann.

Level 6 Implementiere die öffentliche Funktion Set<Square*> ChessMan::possibleMovements() const, die eine Menge (im mathematischen Sinne) von Square Pointern zurückliefert, welche mögliche Zugziele dieses ChessMan darstellen. Gehe dabei von folgenden Voraussetzungen aus: Es sind nur jene Ziele gesucht, die frei sind. Es existiert bereits eine öffentliche Funktion bool Square::isFree() const, die du verwenden kannst. Diese Funktion liefert true zurück, wenn das Feld frei ist, sonst false. Set<Square*> bezeichnet eine geeignete Container Klasse, also eine Menge von Square Pointern. Es existiert bereits eine Funktion ChessBoard* ChessMan::board() const, die du verwenden kannst und die einen Pointer auf das ChessBoard zurückliefert, auf dem sich der ChessMan befindet. Hinweis: Du hast also indirekt auch Zugriff auf die Funktion Square *ChessBoard::getSquare(int x, int y) const aus Level 2. Es existiert bereits eine Funktion bool ChessMan::canJump() const, die du verwenden kannst. Die Funktion liefert polymorph zurück, ob eine Schachfigur springen kann oder nicht. Verwende außerdem die Funktionen List<ChessDirection> ChessMan::movementDirections() const, int ChessMan::movementRange() const, aus Level 5.

Level 7 Gratulation! Du hast den letzten Level erreicht. Jetzt wird es knifflig: Die fertig implementierte Funktion Set<Square*> ChessMan::possibleTargets() const liefert alle möglichen Ziele eines ChessMan zurück (also nicht nur Bewegungen, sondern auch Schläge ) und sieht folgendermaßen aus: Set<Square*> ChessMan::possibleTargets() const { Set<Square*> resultset; resultset.unite(possiblemovements()); resultset.unite(possiblestrikes()); resultset.subtract(forbiddentargets(resultset)); return resultset; } Implementiere die darin aufgerufene Funktion Set<Square*> ChessMan::forbiddenTargets(const Set<Square*> &targets), die aus einer gegebenen Menge an Pointern auf Square Objekte all jene zurückliefert, auf die der ChessMan nicht fahren darf, weil danach der eigene König im Schach stehen würde. Gehe dabei von folgenden Voraussetzungen aus: Set<Square*> bezeichnet eine geeignete Container Klasse, also eine Menge von Square Pointern. Es existiert bereits eine Funktion ChessBoard* ChessMan::board() const, die du verwenden kannst und die einen Pointer auf das ChessBoard zurückliefert, auf dem sich der ChessMan befindet. Es existiert bereits eine öffentliche Funktion bool ChessBoard::isCheck(int color) const, die du verwenden kannst. Die Funktion liefert true zurück, wenn die Partei mit Farbe color (Weiß = 0, Schwarz = 1) im Schach steht, sonst false.

Es existiert bereits eine öffentliche Funktion ChessMan* Square::chessman() const, die du verwenden kannst. Die Funktion liefert einen Pointer auf den ChessMan zurück, der gerade auf diesem Square steht, oder NULL, falls das Square leer ist. Es existiert bereits eine Funktion void ChessMan::moveTo(Square *pos), die den ChessMan auf Position pos bewegt (d.h. der Pointer auf sein aktuelles Square wird auf pos gesetzt). Achtung: Ist pos bereits von einer gegnerischen Figur besetzt, so wird diese durch moveto(pos) geschlagen (d.h. der Pointer auf deren aktuelles Square wird auf NULL gesetzt). Zusatzfrage: Die Funktionen possibletargets() und forbiddentargets() würden so wie sie in der Aufgabenstellung deklariert sind zu einem Kompilierfehler führen. Warum?