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)