TL5302 Olio-ohjelmointi (2 ov) Koe 19.4.2005
HYV3SN
Nimi:_________________________________
Luokka:_______________________________
Kokeen maksimipistemäärä on 20. Tehtävistä 1 ja 3 voi saada 4 p / tehtävä ja tehtävistä 2 ja 4 voi saada 6 p / tehtävä. Läpimenoon riittää varmasti 7 pistettä.
1. Oheisessa koodissa on esitetty aliohjelma vaihda. Täydennä tehtäväpaperiin:
a. Mitä aliohjelma tekee ? (1p) Vastauksesi:
b. Lisää ohjelmaan aliohjelman prototyyppi. (1p) c. Lisää pääohjelmaan vaihda-aliohjelman kutsu. (1p)
d. Tee pääohjelmaan tarvittavat lisäykset, joiden avulla voit testata, toimiiko aliohjelma oikein. (1p)
#include <iostream>
using namespace std;
int main() {
int a=1,b=2;
}
void vaihda(int *x, int *y) {
int temp=*x;
*x=*y;
*y=temp;
}
Vastaa seuraaviin tehtäviin erilliselle vastauspaperille. Elä panikoi.
2. Toteuta sylinteri-luokka, joka sisältää attribuutteina sylinterin korkeuden ja pohjan säteen.
a. Lisää luokkaan oletusmuodostin, joka alustaa korkeuden ja säteen nolliksi (1p)
b. Lisää luokkaan parametrillinen muodostin, jonka avulla tietojäsenet voidaan alustaa olion luonnin yhteydessä haluttuihin arvoihin. (1p) c. Lisää luokkaan metodi, joka laskee sylinterin tilavuuden. (1p) d. Lisää luokkaan metodi, joka tulostaa sylinterin korkeuden ja pohjan
säteen. (1p)
e. Lisää luokkan metodi, jonka avulla jo olemassaolevan olion korkeus ja pohjan säde kysytään käyttäjältä. (1p)
f. Tee pääohjelma, jonka avulla voit testata luokkasi toimintaa. (1p) Sylinterin tilavuus lasketaan kaavalla
h r V =π 2
3. Tehtävänäsi on laatia ohjelma, joka laskee eri muotoisten kappaleiden tilavuuksia.
Ohjelman tulee pystyä käsittelemään ainakin muodot ”sylinteri”, ”särmiö” ja
”ellipsoidi”. Lisäksi ”särmiön” erikoistapaus on ”kuutio” ja ”ellipsoidin”
erikoistapaus on ”pallo”.
a. Suunnittele ohjelmalle olio-ohjelmoinnin periaatteiden mukainen
luokkahierarkia. Voit piirtää käsitteiden välisistä yhteyksistä myös kuvan.
(2p)
b. Kirjoita luokkien määrittelyt C++-kielellä käyttäen palveluliittymän periytymistä eli public-periytymistä. Toteutuksessa ei tarvitse mennä yksityiskohtiin. (2p)
4. Tarkastellaan oheista kompleksilukuja käsittelevää luokkaa nimeltään complex.
a) Lisää luokkaan ylikuormatut operaattorit – ja *, jotka laskevat kahden kompleksiluvun erotuksen ja tulon. (1p / operaattori)
b) Lisää luokkaan ylikuormatut vertailuoperaattorit > ja <, joiden avulla vertaillaan kahden kompleksiluvun itseisarvojen suuruutta. (1p / operaattori) c) Tee pääohjelma, jonka avulla voit testata kirjottamiesi operaattorien toimintaa (2p).
Alla olevaa ohjelmakoodia ei tarvitse kopioida vastauspaperiin, mutta vastauksestasi on käytävä ilmi, mihin kohtaan koodia lisäämäsi ohjelmarivit tulevat.
Kompleksiluvun z=a+jb itseisarvo lasketaan kaavalla
2
2 b
a
z = +
Neliöjuuri löytyy C++-standardikirjastosta <cmath> ja sen prototyyppi on
double sqrt(double);
#include <iostream>
using namespace std;
class complex {
private:
double re,im;
public:
complex operator+(complex &);
bool operator==(complex &);
friend ostream &operator<<(ostream &,const complex &);
complex();
complex(const double &,const double &);
};
complex::complex() {
re=0;
im=0;
}
ostream &operator << (ostream &os, const complex &p) {
os << p.re << "+j" << p.im << endl;
return os;
}
bool complex::operator == (complex &p) {
if ((this->re == p.re) && (this->im == p.im)) return 1;
else
return 0;
}
complex::complex(const double &r,const double &i) {
re=r;
im=i;
}
complex complex::operator +(complex &x) {
complex tulos;
tulos.re=this->re+x.re;
tulos.im=this->im+x.im;
return tulos;
}