Vergelijkende studie van imperatieve programmeertalen
Inhoud
Samenvattingen
Klik hier om de samenvattingen te bekijken
Informatie over het examen
Mondeling examen met schriftelijke voorbereiding. Het examen omvat twee vragen:
- In een eerste vraag moet een kleine hiërarchie van klassen in Java volledig worden omgezet in Eiffel of C++ [de taal wordt opgelegd in de vraag]. Daarenboven moet één klasse worden omgezet in C# of in Smalltalk. Deze vraag moet mondeling toegelicht worden.
Je krijgt 2 uur om de eerste vraag. De prof maakt er geen probleem van als je code nog niet af is. Hij overloopt vlot wat je al opgeschreven hebt van je code en stelt een paar bijvraagjes, meestal over taalspecifieke kenmerken. Als de prof oordeelt dat hij genoeg weet, kan het zijn dat je je code niet meer moet afwerken. Het kan ook zijn dat je nog een paar kleine vraagjes krijgt en naar je plaats mag teruggaan om die te beantwoorden. - Een tweede vraag omvat een reeks kleine stukken code in diverse programmeertalen waarover enkele vragen worden gesteld om na te gaan of daarin gehanteerde concepten gekend zijn. Deze vraag is louter schriftelijk.
Dit zijn enkele kleinere vraagjes ivm pointers en polymorphisme, vraagjes net zoals in het voorbeeldexamen. Verwaarloos die echter niet, want die staan op 40% van de punten (zo stond vermeld op het examen).
In theorie krijg je 4 uur voor het volledige examen, maar dat kan iets meer worden.
Op het examen mag (enkel) gebruik gemaakt worden van de cursustekst, van de slides die gebruikt werden tijdens de hoorcolleges en van de oplossingen van de oefeningen. De leerstof beperkt zich tot de definitie van alleenstaande klassen in Java, C++, Eiffel, Smalltalk en C#, en tot enkelvoudige en meervoudige overerving in Java, C++ en Eiffel.
Examenvragen
2010-2011
Dit jaar werd de cursus wat anders aangepakt (als dit zo blijft moet de introductietekst worden aangepast). De talen Scala, C++, Eiffel en D werden gezien, en een stuk rond generics en concurrency in Java. Het examen omvatte twee grote delen:
- Een deel dat op voorhand werd uitgewerkt als een soort practicum. Dit hield de vertaling van een Java-programma naar Scala in. Oorspronkelijk was het ook de bedoeling een deel van het practicum in D te doen (waarschijnlijk hetzelfde Java-programma naar D vertalen?) maar door omstandigheden is dit stuk weggevallen en vervangen door een uitbreiding van het Javaprogramma. Het Scala-deel werd mondeling ondervraagd, hierbij is het de bedoeling om aan te tonen dat je de typische concepten van die taal (closures, traits, generics, ...) beheerst.
- Een schriftelijk deel als examen. Dit waren vier oefeningen, 2 op Eiffel en 2 op C++.
24/01/2011
Oefening 1
class A { public: virtual void f1(int& v1) { v1 += 1; x = v1; f2(&v1); x += v1; } virtual void f2(int* v2) { *v2 += 2; x += *v2; f3(*v2); } void f3(int v3) { v3 += 3; x += v3; } protected: int x; }; class B: public A { public: void f1(int& v1) { v1 += 5; x = v1; f3(v1); x += v1; } void f3(int v3) { v3 += 15; x += v3; } }; A* a1 = new B; int* value = new int(7); a1->f1(*value); A a2 = *a1; value = new int(13); a2.f1(*value);
Wat zijn de waarden van a1->x en a2.x na het uitvoeren van bovenstaande code?
Oefening 2
Doorstreep de polymorphe catcalls in Eiffelcode.
Oefening 3
class A { public: A(int x=5): x_(x) {} void f1() { x_ += 1; f3(); } virtual void f2 () { x_ += 2; } virtual void f3() {x_ += 4; } int x_; }; class B: virtual public A { public: void f1() { x_ += 6; f3(); } void f3() { x_ += 8; f2(); } }; class C: virtual public A { public: void f1() {x_ += 12; } virtual void f2() { x_ += 14; f1(); } }; class D: public C, public B { public: void f1() { x_ += 16; f3(); } void f2(int y) { x_ += y; } }; A *a1 = new D; a1->f1(); A *a2 = new D; a2->f2();
Wat is de waarde van a1->x_ en a2->x_ na het uitvoeren van deze code?
Oefening 4
Een aantal klassen in Eiffel werd gegeven, een klasse A met kinderen B en C. Gevraagd was een klasse D te schrijven die overerft van zowel B als C en bepaalde functies te joinen, te herimplementeren, etc.
28/01/2011
Oefening 1
class A { public: virtual void f1(int* v1) { *v1 += 1; x = *v1; f2(*v1); x += *v1; } virtual void f2(int& v2){ v2 += 3; x += v2; f3(v2); } void f3(int v3) { v3 += 8; x += v3; } public: int x; }; class B: public A { public: void f1(int* v1) { *v1 += 21; x = *v1; f3(*v1); x+= *v1; } void f3(int v3) { v3 += 55; x += v3; } }; A *a1 = new B; int *value = new int(7); a1->f1(value); A a2 = *a1; value = new int(13); a2.f1(&value);
Merk op dat de regel a2.f1(&value); een compilatiefout veroorzaakt. Zonder de & compileert dit wel.
Oefening 2
doorstreep de polymorfe catcalls
Oefening 3
class A { public: A(int x=5) : x_(x) {} virtual void f1() { x_ += 1; f3(); } void f2() { x_ += 2; } virtual void f3() { x_ += 4; } int x_; }; class B: virtual public A { public: void f1() { x_ += 6; f3(); } void f3() { x_ += 8; f2(); } }; class C: virtual public A { public: void f1() { x_ += 12; } void f2() { x_ += 14; f1(); } }; class D: public C, public B { public: void f1() {x_ += 16; f3();} void f2(int y=17) {x_ += y; B::f1(); } }; A *a = new D; a->f1(); D *d = new D; d->f2();
Oefening 4
Gegeven de Eiffelcode van klassen A,B en C. B en C erven over van A. Opdracht is een klasse D te schrijven die functie f1 deelt en functie f2 repliceert.
2009-2010
In de academiejaar 2008-2009 werd dit opleidingsonderdeel niet gegeven door prof. Steegmans en was de examenvorm ook anders.
2008-2009
In de academiejaar 2008-2009 werd dit opleidingsonderdeel gedoceerd door Sven Verdoolaege en Tom Schrijvers. Het examen had hierdoor een andere vorm.
2007-2008
14/01/08 vm en nm en 24/01/08
Deel 1 (Mondeling)
Zet om naar C++ en Eiffel; een kleine (eenvoudige) hierarchie van verzamelingen, bags en ongeordende collecties en je moest wat features van de taal showen. UnorderedCollection is abstract een bevat 4 abstracte methodes,deze superclasse houd ook bij het capaciteit instance variable.Methodes:addElement(int el),getNbElements(),hasElement(int element) ,abstract unionWith(UnorderedCollection other), protected constructor,er is nog een methode die protected is en eentje privaat.Bij set en bag zijn allemal public(behalve instance variabelen uiteraard).Bij C++ moest ge trouwens ook ergens pointer arithmetic gebruiken om een rij te overlopen. bijvragen:
- c++:stel ge doet hier die & weg (bij een reference) wat gebeurt er dan?
- c++: stel dat ge daar een * zet, wat gebeurt er dan?
- eiffel: geeft een voorbeeld oproep voor die unionWith, dat was een poly catcall; hetgeen ge dan moet uitleggen.
- hij vroeg ook hoe het daar zat met het uitbreiden van precondities (kan niet in Eiffel natuurlijk) en hoe lost ge dat op.
Deel 2 (Schriftelijk)
Oefening 1:
int bla[] = {priemgetallen}; int *b = &(a+6); *b = 7; int &c = *b; c = *b + *(a+2); // en op a+2 staat 5 (das gewoon 12)
Oefening 2: fun met C#
Class public int prop { get { return x} set{ x = value * 2} } Class someMeth(Class s1, ref Class s2) s1.prop = s2.prop + 7; s2 = new Class(); s2.prop = s1.prop + 14; } en dan als oproepen: Class s = new Class(); s.prop = 20; s.someMeth(s, ref s); wat is s.prop? (216)
Oefening 3: Definieer de constructor voor Bag in Smalltalk (ook gevraagd om voor UnorderedCollection eentje te schrijven ,maar het is een abstract klasse en gaat dus niet met Smalltalk,in plaats ervan mag je wel een simple exception werpen -zie voorbeeld op slides).Je moet ook hoofdingen van de methodes schrijven(die je oproept in je constructor).
Oefening 4: single inheritance met C#,twee klassen.
Oefening 5: Multiple inheritance met C++. Zeer gelijkaardig aan de vraag op het voorbeeld examen.hier diamand structuur van klassen,gevraagd value van data member _x op het einde van uitvoer van twee methodes.Qualificator virtual staat soms met opzet niet vermeld,vergeet dus niet dat hij soms weg gelaten mag worden en toch is die methode wel virtual via inheritance.
Oef: 4&5 Zijn de klassieke dingen : statische binding, hiden van methodes, override vs new in C#.
Oefening 6: Java generics
gegeven dat ArrayList en List implementeren Serializable interface. ArrayList<String> list1 = new ArrayList<String>(); List<?> l=list1 ; ArrayList<?> l2 = list1 ; ArrayList<? extends Serializable> l3 = list1 ; ArrayList<? super Serializable> l4 = list1 ; ArrayList<Serializable> l5 = list1 ; ArrayList l6 = list1 ; wat mag niet (l4, l5); warning voor l6
2006-2007
15/01/07 8u
Zo goed als analoog aan het te verwachten patroon:
- Een paar klassen over een avonturenspelleke met een item, een rugzak dat een item is en waarin items kunnen zitten, een wapen dat een item is, ook nog ergens een interface die die rugzak implementeerde: alles samengevat: enkelvoudige overerving, bidirectionele bindingen (die in de java oplossing onveilig waren, Steegmans wil (maar vraag het niet expliciet op papier!) dat je dit toepaslijk kan corrigeren mbv. C++ en C# middelen). En dat alles dus, zoals je al las, in C++ en C#. Je hoeft niet elke letter code op te schrijven (dat laat de tijd ook niet echt toe), een "skelet" is voldoende. Zolang je maar kan vertellen welke "fancy mogelijkheden" je uit elke taal handig kan aanwenden (zeg dus nie da het in C# allemaal 't zelfde is ;-))
-
- Een methode uit de bovenstaande oefening die in de 3 klassen van de overerving voorkwam ("mergewith", er verstrengen wat types enzo) voor elk van die klassen in Eiffel omzetten: enkel hoofding/skelet van de methode én precondities moet je doen, implementatie niet.
- Een paar constructoren uit alweer de bovenstaande oefening omzetten in Smalltalk (eentje die o.a. een array initialiseert). Van elke "nieuwe" message waarvan je gebruikt maakt, moet je ook de hoofding geven
- Meerdere andere oefeningen: meervoudige overerving in C++, polymorfisme in C#, doorstrepen van polymorfe catcalls in Eiffel, iets met Arrays en een heel klein beetje pointer arithmetic in C++, ... (nog meer denk ik, maar ik weet het niet allemaal meer vanbuiten, niks gigantisch nieuw tov andere jaren).
19/01/07 8u en 12u
Zo goed als analoog aan het te verwachten patroon:
- Zelfde hiërarchie. Verwacht u aan enumeraties, rijen, abstracte klassen, interfaces, overriding... Dit alles inEiffel en Smalltalk. Indien gewenst mocht je een van de talen vervangen door C++, voor twee punten minder. Zelfs met amper wat code, kan je goed uit de hoek komen als je kan antwoorden op de bijvragen (waarde/referentie-semantiek, typed/untyped, CAT-calls... )
- dezelfde 'mergeWith' uit een abstracte klassen en twee subklassen ervan omzetten naar C++. Van alles de hoofding. Van een van de subklassen ook de implementatie.
- Bij de kleine oefeningetjes: bij de overerving in C++ een vraag waar methodes hun argumentenlijst veranderd of toegangsrechten verstrengen. Voor de rest analoog (geen CAT-calls welliswaar)
2005-2006
26-01-06 8u
- Zoals te verwachten. Deze keer UnorderedCollection met daaronder Bag en Set. Eiffel en C++ versie.
-
- Smalltalk klasse
- doorstrepen van foute overerving generische klassen
- de rest analoog met vbex
20-01-06 8u
- Een abstracte klasse van vluchten, met twee subklassen: indirecte en directe vlucht. Telkens de superklasse en 1subklasse vertalen in eiffel en c++ (hij vroeg op mondeling ongeveer bij iedereen een polymorphe catcall)
- Oefeninkskes zoals voorbeeldexamen
- schrijf klasse in smalltalk
- streep door wat niet klopt volgens generische klassen in java
- meervoudige overerving in eiffel (iets schrijven)
- dan nog 3 oefeninkskes waar ge getallen moet zoeken (referentie, value semantic) (opgelet hierbij, in een property durft hij bij setter zelfs value*2 zetten, de kapoen)
2004-2005
28-01-05 8u
Zeer analoog aan het voorbeeldexamen dat op toledo staat:
deel 1: klasses programmeren in Eiffel en C++ voor een email systeem. Ipv het voorbeeld ging het hier om Email, OriginalEmail, ReplyEmail klassen. Waarbij original en reply overerfden. Geen arrays, dus eigenlijk iets gemakkelijker dan voorbeeld.
deel 2: 7 opgaven zoals in het voorbeeld examen. Geen doorstreping van polymorphe catcalls. iets moeilijker dan de voorbeelden. TIP: teken de klassen op papier
Steegmans was heel vriendelijk, stelde nuttige bijvragen en legt je niet zo hard op de rooster.