Olio-ohjelmointi 2. välikoe 27.4.2007 HYV5SN 1. Tee ohjelma, joka sisältää laatikko-luokan. Luokan tietojäseninä ovat laatikon syvyys, leveys ja korkeus. Toteuta luokkaan muodostin, jonka avulla olio voidaan alustaa. Toteuta myös metodi, joka tulostaa laatikon tilavuuden. class laatikko double syvyys,leveys,korkeus; laatikko(double s,double l,double k) syvyys=s; leveys=l; korkeus=k; double tilavuus() return syvyys*leveys*korkeus; ; laatikko olio(2,3,4); cout << olio.tilavuus(); system("pause"); 2. Tee ohjelma, joka kysyy käyttäjältä 5 lukua STL:n vektoriin ja tulostaa ne käyttäen iteraattoria. //Kertaustehtävä 1 #include <vector>
vector <int> luvut; vector <int>::iterator it; int i,luku; for (i=0;i<5;i++) cout << "Luku?" << endl; cin >> luku; luvut.push_back(luku); for (it=luvut.begin();it!=luvut.end();it++) cout << *it << endl; system("pause"); 3. Luo yleinen luokka: Rakennus, joka ylläpitää tietoa rakennuksen kerrosten ja huoneiden lukumäärästä sekä kokonaispinta-alasta. a. Luo johdettu luokka: Talo, joka perii rakennuksen ja ylläpitää tietoja makuuhuoneiden ja kylpyhuoneiden lukumääristä. b. Luo johdettu luokka: Toimisto, joka perii rakennuksen ja ylläpitää tietoja varauloskäytävien ja puhelimien lukumääristä. Tee pääohjelma, jossa kokeilet luokkiesi toimivuutta. class Rakennus int kerrosten_lkm; int huoneiden_lkm; double pinta_ala; Rakennus(int k,int h,double a) kerrosten_lkm=k; huoneiden_lkm=h; pinta_ala=a; Rakennus() kerrosten_lkm=0; huoneiden_lkm=0; pinta_ala=0; void tulosta() cout << "Kerrosten lukumäärä " << kerrosten_lkm << endl; cout << "Huoneiden lukumäärä " << huoneiden_lkm << endl;
; cout << "Pinta-ala " << pinta_ala << endl; class Talo : public Rakennus int makuuhuoneiden_lkm; int kylpyhuoneiden_lkm; Talo(int m,int k) makuuhuoneiden_lkm=m; kylpyhuoneiden_lkm=k; void tulosta() cout << "Makuuhuoneiden lukumäärä " << makuuhuoneiden_lkm << endl; cout << "Kylpyhuoneiden lukumäärä " << kylpyhuoneiden_lkm << endl; ; class Toimisto : public Rakennus int varauloskaytavien_lkm; int puhelimien_lkm; Toimisto(int v,int p) varauloskaytavien_lkm=v; puhelimien_lkm=p; void tulosta() cout << "Varauloskäytävien lukumäärä " << varauloskaytavien_lkm << endl; cout << "Puhelimien lukumäärä " << puhelimien_lkm << endl; ; Rakennus rakennus_olio(3,18,6000); Talo talo_olio(3,2); Toimisto toimisto_olio(1,20); rakennus_olio.tulosta(); talo_olio.tulosta(); toimisto_olio.tulosta(); system("pause"); return 0;
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 z = a + Neliöjuuri löytyy C++-standardikirjastosta <cmath> ja sen prototyyppi on double sqrt(double); b 2 complex complex::operator + (const complex &z) complex foo; foo.real=this->real+z.real; foo.imag=this->imag+z.imag; return foo; complex complex::operator * (const complex &z) complex foo; double itseisarvo,kulma; itseisarvo=this->abs()*z.abs(); kulma=this->angle()+z.angle(); foo.real=itseisarvo*cos(kulma); foo.imag=itseisarvo*sin(kulma); return foo; bool complex::operator > (const complex &z) if (this->abs() > z.abs()) return true; else return false;
bool complex::operator < (const complex &z) if (this->abs() < z.abs()) return true; else return false; complex z1(-1.),z2(3.3,2.2); complex z3(0),z4(1,1); cout << (z1 > z2) << endl; cout << (z2 < z3) << endl; z1=z2+z3; z2=z1*z4; cout << z1 << z2 << z3 << z4 << endl; cout << "Anna z1 ja z2" << endl; cin >> z1 >> z2; cout << z1*z2 << endl; return 0; class complex double re,im; 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;