Harjutusülesanded
1. Liitmise piiramine
Loo funktsioonimall nimega liidaJaPiira
, millel on kaks malliparameetrit. Esimene neist on tüübiparameeter T
, teine täisarv N
vaikimisi väärtusega 10. Funktsioonil endal on kaks parameetrit tüübiga T
ja funktsioon tagastab antud parameetrite summa juhul, kui see on väiksem kui teine malli parameeter. Vastasel juhul tagastada malli argumendi väärtus.
Näide funktsiooni poole pöördumisest:
int main() { cout << liidaJaPiira(4, 1) << '\n'; cout << liidaJaPiira(10, 100) << '\n'; cout << liidaJaPiira<int, 0>(0, 1) << '\n'; return 0; }
Väljund:
5 10 0
2. Elementide salvestaja
Loo funktsioonimall tüübiparameetriga T
, mille signatuur on järgmine: void looFailJaKirjuta(filesystem::path asukoht, T elemendid[], size_t arv)
. Funktsioon peab avama väljundfaili antud asukohale ning kirjutama sinna teises parameetris antud elemendid. Kolmas parameeter määrab elementide arvu. Kui faili ei eksisteeri, peab funktsioon selle looma.
Näide:
int main() { auto asukoht = filesystem::path("elemendid.txt"); string elemendid[] = {"üks", "kaks", "kolm"}; looFailJaKirjuta<string>(asukoht, elemendid, 3); }
Faili elemendid.txt sisu:
üks kaks kolm
3. Funktsioonimallid
- Koosta mall funktsiooni
liida
jaoks, millel on kaks malliparameetrit ja mis tagastab nende summa. Katseta isemain
funktsioonis erinevaid tüübikombinatsioone (<int, int>, <string, string>, <int, double>, jne).
Uuri, kas on võimalik parameetrite tüübile piiranguid seada.
- Koosta mall funktsiooni
onVahemikus
jaoks, millel on üks<template>
parameeter ja kaksint
tüüpi parameetrit. Funktsioon tagastab tõeväärtuse, kas parameetrina antud arv asub etteantud vahemikus, otspunktid kaasa arvatud. Katsetamain
funktsioonis erinevaid argumentide väärtuseid ja vahemikke. Näide kasutuse kohta:onVahemikus<5>(1, 10)
.
4. Klassimall fikseeritud pikkusega listi jaoks
Koostada klassimall Massiiv
, mis hoiab endas fikseeritud pikkusega (nt 100 elementi) massiivi, mis käitub nagu fikseeritud pikkusega list. Massiivi elementide tüüp on määratud klassimalli tüübiparameetriga. Tüübiparameeter kitsendada päises <concepts>
vahenditega arvuliseks, st kas täisarvuks või ujukomaarvuks. Massiivi kõik elemendid on algselt nullid ja neid loetakse väärtustamata elementideks. Massiivi saab täita (väärtustada) järjest vasakult paremale ja elemendi kustutamisel kustutatakse viimane väärtustatud element. Klassimallis on järgmised funktsioonid (T
on klassimalli tüübiparameeter):
T getElement(int i)
Funktsioon tagastab i-ndal kohal oleva elemendi, kui see on väärtustatud. Vastasel juhul tagastab -1111.
bool kasTais()
Funktsioon tagastab tõeväärtuse, kas massiivi kõik elemendid on väärtustatud.
int getSuurus()
Funktsioon tagastab, mitu elementi massiivist on väärtustatud.
void print()
Funktsioon kuvab ekraanile massiivi kõik väärtustatud elemendid.
void lisaElement(T el)
Funktsioon lisab elemendi massiivi "lõppu", st esimesele vabale (väärtustamata) kohale.
void kustutaElement()
Funktsioon kustutab (nullib) viimase väärtustatud elemendi.
void asendaElement(T el1, T el2)
Funktsioon asendab väärtustatud alal kõik elemendid el1
elemendiga el2
.
int vabuKohti()
Funktsioon tagastab vabade (väärtustamata) elementide arvu.
bool kasSisaldub(T el)
Funktsioon tagastab tõeväärtuse, kas etteantud element sisaldub massiivis väärtustatud alal.
Lisada klassi vajalikud isendimuutujad massiivi hetkeseisundi hoidmiseks.
Klassimall vormistada päisefaili kodu4.h
, kus funktsioonide deklaratsioonid on eraldi nende definitsioonidest.
Näiteks, programmijupi
Massiiv<int> m{}; m.lisaElement(5); m.lisaElement(8); m.lisaElement(5); m.lisaElement(5); m.print(); m.kustutaElement(); m.print(); m.lisaElement(25); m.asendaElement(m.getElement(0), 9); m.print(); cout << m.getElement(8) << '\n'; cout << boolalpha << m.kasTais() << " " << m.kasTyhi() << '\n'; cout << m.vabuKohti() << " " << m.kasSisaldub(23) << " " << m.getSuurus() << '\n';
tulemuseks ekraanil on
5 8 5 5 5 8 5 9 8 9 25 -1111 false false 96 false 4