Arvutiteaduse instituut
  1. Kursused
  2. 2024/25 kevad
  3. Programmeerimine keeles C++ (LTAT.03.025)
EN
Logi sisse

Programmeerimine keeles C++ 2024/25 kevad

  • Pealeht
  • 1. Muutujad ja andmetüübid
  • 2. Keele põhikonstruktsioonid I
  • 3. Keele põhikonstruktsioonid II
  • 4. Klass, struktuur, mallid
  • 5. Dünaamiline mäluhaldus I
5 Dünaamiline mäluhaldus I
5.1 Kodutöö
5.2 Harjutused
5.3 Videolingid
  • 6. Dünaamiline mäluhaldus II
  • 7. Kontrolltöö 1

Seitsmendal nädalal toimub 1. kontrolltöö

1. kontrolltöö näidis on Moodles

  • 8. Dünaamiline mäluhaldus III
  • 9. STL andmestruktuurid I
  • 10. STL andmestruktuurid II
  • 11. OOP I Klassid
  • 12. OOP II Pärilus ja polümorfism
  • 13. Erindite töötlemine
  • 14. Täiendavad teemad
  • 15. Kontrolltöö 2

Viieteistkümnendal nädalal toimub 2. kontrolltöö

2. kontrolltöö näidis on Moodles

  • 16. Projekti esitlus
  • Mõned viited - vajalikud kaaslased
  • Vanad materjalid
  • Juhendid
  • Viited

Kodused ülesanded

Selle kodutöö jaoks vajalikud lipud: -std=c++20 -Wall -Werror -Wpedantic

Esitada on vaja järgmised failid:

arvutused.h arvutused.cpp punkt2.h punkt2.cpp joon2.h joon2.cpp ring2.h ring2.cpp.

Nimede valideerimiseks kasuta järgmist main.cpp faili.

#include <concepts>
#include <string>
#include "arvutused.h"
#include "punkt2.h"
#include "joon2.h"
#include "ring2.h"

template <typename T, typename Float_T, typename Pointer_type>
concept KorrektnePunkt2 = requires(T &punkt, std::ostream &out) {
  { punkt.x };
  { punkt.y };
  { T{} };
  { T{Float_T{}, Float_T{}} };
  { punkt.kaugus(Pointer_type{}) } -> std::same_as<float>;
  { out << punkt } -> std::same_as<std::ostream &>;
};

static_assert(KorrektnePunkt2<Punkt2, float, Punkt2 *>, "Point2 klass on katki");

static_assert(std::is_default_constructible_v<Punkt2>,
              "Punkt2 klassis peab olema vaikekonstruktor");

template <typename T, typename Point_T>
concept KorrektneJoon2 = requires(T &line2, std::ostream &out) {
  { line2.p1 };
  { line2.p2 };
  { T{Point_T{}, Point_T{}} };
  { line2.pikkus() } -> std::same_as<float>;
  { out << line2 } -> std::same_as<std::ostream &>;
};

static_assert(KorrektneJoon2<Joon2, Punkt2 *>, "Joon2 klass katki");

static_assert(std::is_default_constructible_v<Joon2> == false,
              "Joon2 klassis ei tohi olla vaikekonstruktorit");

template <typename T, typename Float_T, typename Bool_T, typename Punkt2_T,
          typename Joon2_T>
concept KorrektneRing2 = requires(T &circle2, std::ostream &out) {
  { circle2.p1 };
  { circle2.r };
  { T{Punkt2_T{}, Float_T{}} };
  { circle2.ymberm66t() } -> std::same_as<float>;
  { circle2.pindala() } -> std::same_as<float>;
  { circle2.onAlas(Punkt2_T{}) } -> std::same_as<bool>;
  { circle2.onAlas(Joon2_T{}) } -> std::same_as<bool>;
  { circle2.skaleeri(Float_T{}) };
  { out << circle2 } -> std::same_as<std::ostream &>;
};

static_assert(
    KorrektneRing2<Ring2, float, bool, Punkt2 *, Joon2 *>,
    "Ring2 klassi definitsioon on vigane. Vaata üle funktsiooninimed, "
    "argumentide ja tagastusväärtuste tüüp");

static_assert(std::is_default_constructible_v<Ring2> == false,
              "Ring2 klassis ei tohi olla vaikekonstruktorit");

template <typename T1>
concept suurim_funktsioonid =
    requires(T1 *a_ptr, T1 *b_ptr, T1 *c_ptr, T1 *ret_ptr, T1 &a_ref, T1 &b_ref,
             T1 &c_ref, T1 &ret_ref) {
      { suurim(a_ptr, b_ptr, c_ptr) } -> std::same_as<int>;
      { suurim(a_ref, b_ref, c_ref) } -> std::same_as<int>;
      { suurim(a_ref, b_ptr, c_ptr) } -> std::same_as<int>;
      { suurim(a_ptr, b_ptr, c_ptr, ret_ptr) } -> std::same_as<void>;
      { suurim(a_ref, b_ref, c_ref, ret_ref) } -> std::same_as<void>;
    };

template <typename T1, typename T2>
concept suurim_mallifunktsioonid =
    requires(T1 *a_ptr, T1 *b_ptr, T1 *c_ptr, T1 *ret_ptr, T1 &a_ref, T1 &b_ref,
             T1 &c_ref, T1 &ret_ref, T2 *a_ptr2, T2 *b_ptr2, T2 *c_ptr2,
             T2 *ret_ptr2, T2 &a_ref2, T2 &b_ref2, T2 &c_ref2, T2 &ret_ref2) {
      { tSuurimP(a_ptr, b_ptr, c_ptr) } -> std::same_as<T1>;
      { tSuurimR(a_ref, b_ref, c_ref) } -> std::same_as<T1>;
      { tSuurimP(a_ptr2, b_ptr2, c_ptr2) } -> std::same_as<T2>;
      { tSuurimR(a_ref2, b_ref2, c_ref2) } -> std::same_as<T2>;
    };

static_assert(suurim_funktsioonid<int>, "suurim funktsioonid katki");

template <typename Vigane>
concept suurim_mallifunktsioonid_vigane =
    requires(Vigane *a_ptr, Vigane *b_ptr, Vigane *c_ptr, Vigane *ret_ptr,
             Vigane &a_ref, Vigane &b_ref, Vigane &c_ref, Vigane &ret_ref) {
      { tSuurimP(a_ptr, b_ptr, c_ptr) } -> std::same_as<Vigane>;
      { tSuurimR(a_ref, b_ref, c_ref) } -> std::same_as<Vigane>;
    };

static_assert(suurim_mallifunktsioonid<int, float>,
              "suurim funktsioonid katki");

static_assert(suurim_mallifunktsioonid_vigane<std::string> == false,
              "Mallifunktsioonid võtavad argumentideks sõne. Vigane.");

int main(int argc, char *argv[]) { return 0; }

1. Üledefineeritud funktsioonid

Selle ülesande funktsioonide deklaratsioonid ja definitsioonid pane vastavalt failidesse faili arvutused.h ja arvutused.cpp. Koosta funktsioonid kolmest täisarvust suurima leidmiseks järgmiste signatuuride jaoks:

int suurim(int*, int*, int*);

int suurim(int&, int&, int&);

int suurim(int&, int*, int*);

void suurim(int*, int*, int*, int*); //neljas parameeter on suurima jaoks

void suurim(int&, int&, int&, int&); //neljas parameeter on suurima jaoks

Võib kasutada päist <cmath>. Katseta kõiki funktsioone main funktsioonis.

Näiteks, koodijupi

int a{2}, b{8}, c{5};
cout << "suurim = " << suurim(&a, &b, &c) << '\n';

tulemusena kuvatakse ekraanile suurim = 8.

Koosta funktsioonimallid kahe esimese funktsiooni jaoks (nimed vastavalt tSuurimP, tSuurimR), mis töötaksid arvulise tüübi korral (funktsiooni kõik parameetrid on sama tüüpi).

NB! Funktsioonimall peab tervenisti olema päisefaili sees!

2. Geomeetria

Selles ülesandes palun ära muuda klassi liikmete nimesid ja hoia nad avalikud.

2.1. Punkt

Failides punkt2.h ja punkt2.cpp on klassi Punkt2 definitsioon. Klass Punkt2 määrab kahemõõtmelises ruumis punkti, millel on kaks float tüüpi koordinaati x ja y.

MeetodEesmärk
Punkt2 ()algväärtustab koordinaadid nullidega
Punkt2 (float nx, float ny)parameetritega konstruktor – väärtustab koordinaadid
float kaugus (Punkt2* p)tagastab punkti kauguse etteantud punktist tasandil
operator <<kuvab ekraanile punkti koordinaadid kujul (x, y)

Kahe punkti vahelise kauguse valemit vt

https://opiobjektid.tptlive.ee/joonevorrandid/kahe_punkti_vaheline_kaugus.html.

2.2. Sirglõik

Failides joon2.h ja joon2.cpp on klassi Joon2 definitsioon. Klass Joon2 kirjeldab sirglõiku kahe otspunkti *p1 ja *p2 abil. Klassis Joon2 ei tohi olla vaikekonstruktorit.

MeetodEesmärk
Joon2 (Punkt2* np1, Punkt2* np2)parameetritega konstruktor – väärtustab klassi elemendid
float pikkus ()tagastab sirglõigu pikkuse (kasuta punkti meetodit kaugus)
operator <<kuvab ekraanile sirglõigu andmed kujul (p1 - p2)

2.3. Ring

Failides ring2.h ja ring2.cpp on klassi Ring2 definitsioon. Klass Ring2 esitab tasandil asuvat ringi keskpunktiga *p1 ja mittenegatiivse raadiusega r. Raadiuse mittenegatiivsust tuleb jälgida kõikides funktsioonides (konstruktor, skaleerimine). Kui kasutaja annab ette negatiivse raadiuse konstruktoris, siis asenda see nulliga. Kui kasutaja soovib skaleerida negatiivse väärtusega, siis ei tee midagi. Klassis Ring2 ei tohi olla vaikekonstruktorit.

MeetodEesmärk
Ring2 (Punkt2* np1, float nr)parameetritega konstruktor – väärtustab klassi elemendid
float ymberm66t()tagastab ringi ümbermõõdu
float pindala()tagastab ringi pindala
bool onAlas(Punkt2* p)tagastab true, kui punkt on ringjoone peal või sees, vastasel juhul false (kasuta punkti meetodit kaugus)
bool onAlas(Joon2* l)tagastab true, kui lõik on ringjoone sees (sh tipud joone peal või ringi sees), vastasel juhul false (kasuta meetodit kaugus)
void skaleeri (float factor)korrutab ringi raadiuse antud väärtusega
operator <<kuvab ekraanile ringi andmed kujul (p1, r)
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused