Institute of Computer Science
  1. Courses
  2. 2024/25 spring
  3. Programming in C++ (LTAT.03.025)
ET
Log in

Programming in C++ 2024/25 spring

  • Pealeht
  • 1. Muutujad ja andmetüübid
  • 2. Keele põhikonstruktsioonid I
  • 3. Keele põhikonstruktsioonid II
  • 4. Klass, struktuur, mallid
4 Klass, struktuur, mallid
4.1 Kodutöö
4.2 Harjutused
4.3 Videolingid
  • 5. Dünaamiline mäluhaldus I
  • 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

Kodutöö jaoks vajalik kood kirjuta failidesse kodu4.h ja kodu4.cpp. Esita need kaks faili. Nimede valideerimiseks kasuta järgnevat main.cpp malli. Uuri seda lähemalt.

#include <concepts>
#include <string>
#include "kodu4.h"

template <typename Kala_type, typename Veekogu_type>
concept KorrektneKalad = requires(Kala_type kala, Veekogu_type veekogu) {
    { kala.nimi } -> std::same_as<std::string &>;
    { kala.n } -> std::same_as<int &>;
    { kala.K } -> std::same_as<int &>;
    { kala.k } -> std::same_as<int &>;
    { lincoln_petersen(1, 2, 3) } -> std::same_as<int>;
    { populatsioon(veekogu) } -> std::same_as<std::string>;
};
static_assert(KorrektneKalad<Kala, Veekogu>, "Kuskil on viga");
template <typename T, typename Contained>
concept KorrektneMassiiv = requires(T &t) {
    { T{} };
    { T{43} };
    { t.at(3) } -> std::same_as<Contained>;
    { t.size() } -> std::same_as<int>;
    { t.min() } -> std::same_as<int>;
    { t.max() } -> std::same_as<int>;
    { t.sum() } -> std::same_as<int>;
    { t.avg() } -> std::same_as<int>;
    { t.set(3, Contained{}) };
    { t.find(Contained{}) } -> std::same_as<int>;
};
static_assert(KorrektneMassiiv<PositiivneMassiiv, int>, "Midagi on valesti");
template <typename Massiiv>
concept KorrektnePoldid = requires(Massiiv arr, std::string failinimi) {
    { dispersioon(arr) } -> std::integral;
    { loe_poldid(failinimi) } -> std::same_as<Massiiv>;
    { vigane_partii(arr) } -> std::same_as<bool>;
};
static_assert(KorrektnePoldid<PositiivneMassiiv>, "Midagi on valesti");

template <typename UusaastaIlm>
concept KorrektneSuurim = requires(UusaastaIlm ilm, std::string failinimi) {
    { loe_temperatuurid(failinimi) } -> std::same_as<std::vector<UusaastaIlm>>;
    { suurim(std::vector<UusaastaIlm>{}) } -> std::same_as<UusaastaIlm>;
    { ilm.linnanimi } -> std::same_as<std::string &>;
    { ilm.max_temp + 0 } -> std::floating_point;
};
static_assert(KorrektneSuurim<Ilm>, "Midagi on valesti");

int main() { return 0; }

1. Populatsiooni arvutamine

Markeerimine-püüdmine on ökoloogias kasutatav meetod populatsiooni suuruse hindamiseks. Üks võimalus populatsiooni suuruse hindamiseks on kasutada Lincoln-Peterseni valemit:

 

Joonis 1. Lincoln-Peterseni valem.

Valemis

  • N - populatsiooni suurus
  • n - püütud ja markeeritud isendite arv esimesel kontrollkäigul
  • K - püütud isendite arv teisel kontrollkäigul
  • k - teisel kontrollkäigul markeeritud isendite arv (kõiki kinnipüütuid ei pea markeerima).

Loo funktsioon lincoln_petersen, mis arvutab populatsiooni Lincoln-Peterseni valemi põhjal. Parameetriteks on:

  • püütud ja markeeritud isendite arv esimesel kontrollkäigul
  • püütud isendite arv teisel kontrollkäigul
  • markeeritud isendite arv teisel kontrollkäigul.

Funktsioon tagastab täisarvu.

2. Struktuurid

Zooloogid proovivad taastada Helevorni järve, mis on hiljuti ära puhastatud ja korda tehtud. Sinna viidi elama kolm kalaliiki:

  • haug
  • särg
  • linask.

Kalade kohta kogutakse Lincoln-Peterseni valemi jaoks vajalikud andmed. Neid andmeid on mõistlik hoida struktuuris. Struktuuri saab kasutada kui kogumikku omavahel seotud andmetest.

Loo struktuur Kala, kus on järgmised liikmed:

  • nimi - kala nimi
  • n - püütud ja markeeritud esimesel korral
  • K - püütud teisel korral
  • k - markeeritud teisel korral

Veekogu esitamiseks loo struktuur Veekogu, kus on järgmised liikmed:

  • nimi - veekogu nimi
  • kalad - vektor kaladest

Loo funktsioon populatsioon, mis leiab kõikide kalade hinnatava populatsiooni suuruse. Funktsiooni parameetriks on struktuur Veekogu. Funktsioon tagastab sõne järgmise formaadiga:

[järve nimi] järves on\n[kala 1 nimi]: [kala 1 arv],[kala 2 nimi]: [kala 2 arv],...

Näide funktsiooni populatsioon tagastusest

Helevorn järves on:
haug: 416,särg: 416,linask: 520,

3. PositiivneMassiiv

Struktuuris võiks tavaliselt hoida ainult andmeid. Keerukamate objektide ja loogika jaoks võiks luua klassi. Lihtne näide on standardteegi vektor. Selles salvestatakse andmeid (täisarvud, ujukomaarvud jne), aga on ka funktsioone (nimetatakse ka meetoditeks).

Loo lihtsustatud versioon standardteegi andmestruktuurist std::array . Tegu on fikseeritud suurusega massiiviga. Loo klass nimega PositiivneMassiiv, kus on massiiv 100 täisarvu jaoks. Massiiv pole positiivne ainult oma maailmavaate pärast, vaid siin ülesande kontekstis on piirang, et massiiv hoiustab ainult positiivseid arve, siin x >= 0.

Klassil on 2 konstruktorit:

  • Vaikekonstruktor, mis algväärtustab kõik elemendid nulliga.
  • Konstruktor, mis võtab argumendiks täisarvu. Selle täisarvuga väärtustatakse kõik elemendid. Kui täisarv ei ole sobiv, väärtustatakse massiiv nullidega.

Loo klassile järgmised avalikud funktsioonid:

  • int size()

Tagastab massiivi suuruse, st 100.

  • at(int i)

Tagastab elemendi indeksiga i. Tagastab -1, kui indeks on piiridest väljas (i<0 või i>=size()).

  • set(int i, int val)

Seab uue väärtuse kohale indeksiga i. Tagastab -1, kui indeks on piiridest väljas või argument on negatiivne.

  • int find(int a)

Tagastab esimese väärtusega a elemendi indeksi. Tagastab -1, kui sellist ei leitud.

  • avg()

Tagastab massiivi elementide aritmeetilise keskmise täisosa.

  • sum()

Tagastab massiivi elementide summa.

  • min()

Tagastab massiivi väikseima elemendi.

  • max()

Tagastab massiivi suurima elemendi.

4. Dispersioon

Dispersioon ehk keskmine ruuthälve näitab, kui palju uuritavad suurused varieeruvad. Arvumassiivi dispersiooni saab arvutada järgmise valemiga

 

Siin on aritmeetiline keskmine.

Loo funktsioon nimega dispersioon, mis leiab massiivi PositiivneMassiiv dispersiooni.

5. Poldid

Poltide mõõtmeid määrab standard ISO965-1. Poldi väliste keermete diameeter on tolerantsiklass 6g. M3 poldi jaoks tähendab see, et välise keerme miinimumväärtus on 2.874 mm ja maksimumväärtus on 2.980 mm. Polt ja Tont OÜ on kõrge kvaliteediga kinnitusvahendite tootja. Firma valmistab M3 polte 100 tükiste partiidena. Kvaliteet on tähtis, seega kontrollitakse igat tootepartiid. Vigast partiid tähistab:

  • tolerantsidest väljaspool oleva poldi olemasolu
  • dispersioon üle 30.

Mõõtmised on salvestatud 100-realisse tekstifaili, kus igal real on poldi läbimõõdud mikromeetrites. Loo funktsioon loe_poldid, mis loeb sisse faili andmed massiivi PositiivneMassiiv. Parameetriks on failinimi sõnena. Tagastusväärtuseks on PositiivneMassiiv. Loo funktsioon vigane_partii, mis teeb kindlaks, kas partii on vigane või mitte. Parameetriks on massiiv PositiivneMassiiv. Tagastusväärtuseks on true, kui partii on vigane ja false, kui mitte.

22_01_25_002.zip

6. Uusaasta

Failis uusaasta.txt on igal real tühikutega eraldatult linna nimi, kõrgeim ja madalaim temperatuur aasta esimesel päeval.

Loo iga rea info hoiustamiseks struktuur Ilm. Struktuuris on vähemalt 2 välja:

  • linnanimi - std::string tüüpi
  • max_temp - kõrgeim temperatuur ujukomaarvuna

Loo funktsioon loe_temperatuurid, mille parameetriks on faili nimi. Funktsioon tagastab vektori, mille elementideks on struktuuri Ilm isendid.

Struktuure Ilm võrreldakse kõrgeima temperatuuri alusel. Loo funktsioon suurim, mille parameetriks on vektor (elementideks struktuuri Ilm isendid) ja mis leiab sellest suurima elemendi ja tagastab selle.

uusaasta.txt

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment