Komplettering för Junitentan
- Inlämningsdatum Inget inlämningsdatum
- Poäng 0
- Lämnar in en textimatningsruta eller en filuppladdning
Många studenter klarade delar av tentan men inte hela och erbjuds nu möjlighet att komplettera. Kompletteringen sker online och det går bara att komplettera till godkänt. Om du vill ha högre betyg så behöver du ändå skriva omtentan i augusti.
Kompletteringen består av upp till 4 uppgifter
Uppgift 1
Rätta de första 5 uppgifterna på din tenta (inte betygshöjande uppgiften, även om du har gjort den) och kommentera alla fel och småfel som du hittar. Skriv varför det var fel och vad som är rätt. Den här behöver vara bra för att få godkänd komplettering. Bifoga din rättade tenta när du skickar in.
Uppgift 2
Om du har fått komplettering på uppgift 2 så behöver du lösa denna uppgift:
Om du kör den här koden...
#include <iostream> using namespace std; struct base { int all_your_base; base(): all_your_base(0) {} base(int rhs): all_your_base(rhs) {} void operator=(const base& rhs) { cout << "base::operator=" << endl; } }; struct derived: public base { int are_belong_to_us; derived(): base(1), are_belong_to_us(2) {} }; int main() { base b; derived d; b = b; d = d; b = d; cout << b.all_your_base << endl; cout << d.all_your_base << endl; cout << d.are_belong_to_us << endl; return 0; }
...så skriver den ut detta...
base::operator= base::operator= base::operator= 0 1 2
Förklara i detalj varför. Vilka metoder har anropats?
Uppgift 3
Om du har fått komplettering på uppgift 3 så behöver du lösa denna uppgift.
Denna C++-kod...
#include <iostream> using namespace std; struct base { virtual void whatever() {cout << "base::whatever" << endl;} void foo() {cout << "base::foo" << endl;} }; struct derived: public base { void whatever() {cout << "derived::whatever" << endl;} virtual void foo() {cout << "derived::foo" << endl;} }; int main() { base b; derived d; derived* d_ptr = new derived(); base* b_ptr = d_ptr; b.whatever(); b.foo(); d.whatever(); d.foo(); b_ptr->whatever(); b_ptr->foo(); d_ptr->whatever(); d_ptr->foo(); delete d_ptr; }
...kan kompileras och köras. Den skriver då ut:
base::whatever base::foo derived::whatever derived::foo derived::whatever base::foo derived::whatever derived::foo
Förklara i detalj varför det blir dessa utskrifter.
Uppgift 4
Om du har fått komplettering på uppgift 5 så behöver du lösa denna uppgift.
Följande kod...
#include <iostream> #include <vector> using std::vector; using std::cout; using std::endl; template<typename T, typename S> vector<S> in_between(T* start, T* end, const S & min, const S & max) { vector<S> vec; for ( ; start != end; ++start) { if (min < *start && *start < max) vec.push_back(* start); } return vec; } int main() { double v1[] = {3.14, 2.72, 1.41, -1, 4}; vector<double> res = in_between(v1, v1 + 3, 0.1, 3.0); for (auto x : res) cout << x << " "; cout << endl; }
Skriver ut:
2.72 1.41
Frågor:
a) Vad är typparametrisering (generics)?
b) Vad är poängen med att typparametrisera S ? Ge exempel.
c) Vad är poängen med att typparametrisera T ? Ge exempel.
d) Finns det någon nackdel att använda T* istället för T ?
e) Skriv en klass KonstigKlass som kan skickas in som S. Programmet ska kompilera.