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.
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.