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.
#include <iostream>
using namespace std;
class laatikko {
private:
double syvyys,leveys,korkeus;
public:
laatikko(double s,double l,double k) {
syvyys=s;
leveys=l;
korkeus=k;
}
double tilavuus() {
return syvyys*leveys*korkeus;
} };
int main() {
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 <iostream>
#include <vector>
using namespace std;
int main() {
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.
#include <iostream>
using namespace std;
class Rakennus {
private:
int kerrosten_lkm;
int huoneiden_lkm;
double pinta_ala;
public:
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 {
private:
int makuuhuoneiden_lkm;
int kylpyhuoneiden_lkm;
public:
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 {
private:
int varauloskaytavien_lkm;
int puhelimien_lkm;
public:
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;
} };
int main() {
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
2
b
a
z = +
Neliöjuuri löytyy C++-standardikirjastosta <cmath> ja sen prototyyppi on double sqrt(double);
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;
}
int main() {
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;
}
#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;
}