Harjutusülesanded
1. Väärtuste vahetamine
Koosta mallifunktsioonid:
template<typename T> void vaheta_ref (T& x, T& y); template<typename T> void vaheta_ptr (T* x, T* y);
Mõlema funktsiooni eesmärk on vahetada ära sisendina antud parameetrite väärtused.
Näide
int x = 5, y = 7; vaheta_ref<int> (x, y); // x = 7 ja y = 5 vaheta_ptr<int> (&x, &y); // x = 5 ja y = 7
2. Massiivi elementide liitmine
Koosta funktsioonid, mis leiavad ühedimensionaalse massiivi paarisarvuliste elementide, mille indeks on paarisarv, summa järgmiste signatuuride jaoks (teine parameeter on elementide arv):
int liida(int [], int);
int liidaP1(int*, int);
// kasuta indekseid
int liidaP2(int*, int);
// kasuta viitade aritmeetikat
int* liida(int*, int, int*);
// kasuta viitade aritmeetikat, kolmas parameeter on summa jaoks
int& liida(int*, int, int&);
// kasuta viitade aritmeetikat, kolmas parameeter on summa jaoks
Näiteks, koodijupi
int massiiv[]{0, 1, 2, 3, 4, 6}; cout << "liida = " << liida(massiiv, 6) << '\n';
tulemusena kuvatakse ekraanile 6
.
Katseta kõiki funktsioone main funktsioonis.
3. Suurte täisarvude liitmine
Keeles C++ on suurima int
tüüpi täisarvu väärtus 2147483647
. Kui täisarv on suurem, siis ei ole seda võimalik int tüüpi muutujasse korrektselt omistada ja temaga tehteid teostada. Analoogiliselt, kui kahe täisarvu int
summa on suurem kui 2147483647
, siis on tulemus ebakorrektne. Üks võimalus suurte täisarvudega manipuleerimiseks on paigutada täisarvu numbrid massiivi. Näiteks, täisarvu 123456789123456789
esitus massiivis oleks int m[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9}
.
Kirjuta programm, mis loeb failist kaks suurt täisarvu (koosnevad maksimaalselt 20 numbrist) ja kuvab ekraanile nende summa. Jagada programm sobivalt funktsioonideks. Kui summa ületab 20 numbrikohta, siis kuvatakse ekraanile selle kohta teade.
Näiteks, kui failis on kaks arvu
5442 18683
siis programmi väljund võiks olla
Lugesin failist arvu: 5442 Lugesin failist arvu: 18683 Arvude summa on 24125
Näide suurematest arvudest ka:
Lugesin failist arvu: 1234567899876543212 Lugesin failist arvu: 18683345686543221 Arvude summa on: 1253251245563086433
Vihje: Arvutuste lihtsustamiseks võib arvu paigutada massiivi vastupidises järjekorras ja tulemuse hiljem ringi pöörata.
4. Ruutvõrrandi lahendamine
Koosta funktsioonid ja katseta neid main
funktsioonis.
bool lahenda_1(double a, double b, double c, double& x1, double& x2); bool lahenda_2(double* a, double* b, double* c, double& x1, double& x2); bool lahenda_3(double& a, double& b, double& c, double* x1, double* x2); bool lahenda_4(double* a, double* b, double* c, double* x1, double* x2);
Parameetritega a, b ja c on määratud võrrand ax2 + bx + c = 0
. Funktsioon tagastab false
, kui võrrandil ei ole reaalarvulisi lahendeid. Kui võrrandil on reaalarvulised lahendid, siis funktsioon tagastab true
ning kirjutab parameetritesse x1
ja x2
võrrandi lahendid. Lahendite puudumisel x1
ja x2
väärtust ei muudeta.
NB! Funktsioonid peavad töötama ka siis, kui a = 0
.
Näide ühe funktsiooni rakendamisest
double a = 1.0, b = -2.0, c = 1.0; double x1, x2; // lahendid on 1 ja 1 if (lahenda_1(a, b, c, x1, x2)) cout << "Lahendid on: " << x1 << ", " << x2 << '\n'; else cout << "Reaalarvulisi lahendeid ei ole!" << '\n';