Kodused ülesanded
Kodutöö jaoks vajalik kood kirjuta failidesse kodu3.h
ja kodu3.cpp
.
Nimede valideerimiseks kasuta järgnevat main.cpp
malli. Uuri seda lähemalt.
#include "kodu3.h" template <typename T> concept fun_exists = requires() { { fun(1, 2) } -> std::integral; { fun(1.5) } -> std::integral; { fun(2, "C++") } -> std::same_as<std::string>; { fun(1, 2, 3) } -> std::same_as<bool>; }; static_assert(fun_exists<int>, "Kontrolli üle funktsioonide nimed ja tüübid!"); template <typename T> concept bmi_exists = requires(T a) { { kehamassiindeks(1.5, 2.5) } -> std::floating_point; { hinnang(1.6) } -> std::same_as<std::string>; { cli_kehamassiindeks(2, a) } -> std::same_as<std::string>; }; static_assert(bmi_exists<char **>, "Kontrolli üle funktsioonide nimed ja tüübid!"); template <typename T> concept file_exists = requires() { { andmed_failist("fail.txt") } -> std::same_as<void>; }; static_assert(file_exists<int>, "Kontrolli üle funktsioonide nimed ja tüübid!"); template <typename T> concept pattern_exists = requires(T a) { { otsi_mustrit(3, a) }; }; static_assert(pattern_exists<char **>, "Kontrolli üle funktsioonide nimed ja tüübid!"); int main() { return 0; }
1. Üledefineeritud funktsioonid
NB!
Kõikide funktsioonide deklaratsioonid paiguta faili kodu3.h
, funktsioonide definitsioonid faili kodu3.cpp
. Esita mõlemad failid.
Koosta programm, kus on neli samanimelist funktsiooni fun
, mis erinevad üksteisest signatuuri poolest. Funktsioonide deklaratsioonid peavad olema definitsioonidest eraldi.
- kui funktsiooni parameetriteks on kaks
int
-tüüpi arvu, siis tagastatakse nende summa; - kui funktsiooni parameetriteks on üks
double
-tüüpi arv, siis tagastatakse selle arvu ruut, mis on ümardatud täisarvuks; - kui funktsiooni parameetriteks on
unsigned int
-tüüpi arv ja sõne, siis tagastatakse sõne paljundatuna vastav arv kordi. - kui funktsiooni parameetriteks on kolm
int
tüüpi täisarvu, siis tagastatakse tõeväärtus, kas antud külgedega lõikudest saab moodustada kolmnurga.
Näide kolmandast funktsioonist. Funktsiooni poole pöördumisele main
funktsioonis
cout << fun(10, "C++");
vastav väljund on
C++C++C++C++C++C++C++C++C++C++
Näide neljandast funktsioonist. Funktsiooni poole pöördumisele main
funktsioonis
cout << boolalpha << "fun(3, 4, 5) = " << fun(3, 4, 5) << '\n';
vastav väljund on
fun(3, 4, 5) = true
2. Kehamassiindeks
A. Koosta funktsioon kehamassiindeks
, mis tagastab kehamassiindeksi. Funktsiooni parameetriteks on pikkus meetrites ja kaal kilogrammides, mõlemad ujukomaarvud.
B. Koosta teine funktsioon hinnang
, mille parameetriks on kehamassiindeks ja mis tagastab hinnangu sõnena.
Hinnanguks sobivad sõnad: rasvumine, ülekaal, normaalkaal, alakaal, vt lisaks
https://www.kehamassiindeks.com/.
Näide funktsiooni tööst:
Kui main
funktsioonis on käsud
double kmi{kehamassiindeks(1.94, 65)}; cout << "kmi: " << kmi << " hinnang: "<< hinnang(kmi) << '\n';
siis väljundiks on
kmi: 17.2707 hinnang: alakaal
C. Koosta kolmas funktsioon cli_kehamassiindeks
signatuuriga
std::string cli_kehamassiindeks(int argc, char* argv[]);
Funktsiooni parameetriteks on käsurea argumendid argc
ja argv
. Funktsioon tagastab sõnena kehamassiindeksi hinnangu. Argumentide teisenduseks uurida funktsiooni stod
. Juhul, kui on vale argumentide arv (argc
), siis tagastada "vale arv argumente".
Funktsiooni tulemus pseudokoodis:
cli_kehamassiindeks(3, {"main", "1.94", "65"}) = "alakaal"
Käsurea argumentide 1.94 65
ja main funktsiooni
int main(int argc, char* argv[]) { cout << "cli_kehamassiindeks(argv, argc) = " << cli_kehamassiindeks(argc, argv) << '\n'; return 0; }
tulemuseks on
cli_kehamassiindeks(argv, argc) = alakaal
Testimiseks keskkonnas CLion
saab käsurea argumente lisada Run->Run->Edit Configurations->Program Arguments
. Keskkonnas Visual Studio Code
saab käsurea argumente lisada kompileeritud programmi käivitamisel terminaliakna käsureal.
3. Failist lugemine ja faili kirjutamine
Antud on tekstifail, milles on igal real ujukomaarvud, eraldajaks ;;
. Ridade arv ei ole ette teada ja ujukomaarvude arv ridades on erinev.
Näide faili sisust
1.1;;2.3;;5;;9;;5.3 4.1;;2.2;;5.6;;9.2 3.1;;2.4;;5.2;;9.1;;3.2;;2.5 8.1;;5.2;;4.5;;3.9
Koosta funktsioon andmed_failist
, mis saab argumendiks sõnena faili nime ja mis loeb andmed failist ning leiab iga rea jaoks aritmeetilise keskmise ja kõikide arvude summa üle faili. Tulemused kirjuta faili tulemused.txt
järgmiselt: kõigepealt igale reale rea aritmeetiline keskmine ja viimasele reale kõigi elementide summa.
Näites toodud faili korral on faili tulemused.txt
sisu järgmine:
4.54 5.275 4.25 5.425 91.0
4. Mustri otsimine
Käsureal antakse mustrina ette sõne, mida tuleb käsurea argumentidest otsida, kujul
-otsi=otsitav sõne
.
Koosta funktsioon otsi_mustrit
, mille parameetriteks on käsurea argumendid ja mis teeb kindlaks, kas otsitav sõne on käsurea teiste argumentide hulgas.
Funktsiooni signatuur: string otsi_mustrit(int argc, char* argv[])
Siin argumentide arv edastatakse viitena (&
ja sõnemassiiv viidana *
)
Näited funktsiooni tööst.
- Kui käsureal on
kala -otsi=kana kass kana
, siis funktsioon tagastab"Otsitav 'kana' leiti."
- Kui käsureal on
kala -otsi=koer kass kana
, siis funktsioon tagastab"Otsitavat 'koer' ei leitud."
- Kui käsureal on
kala kass kana
, siis funktsioon tagastab"Mustrit ei ole olemas."
Vihje. Kasu on string
funktsioonidest find()
ja substr()
, vt lähemalt
http://www.cplusplus.com/reference/string/string/substr/
http://www.cplusplus.com/reference/string/string/find/
Mall: (kodu3.zip)