Tehtävä:
Luvun viimeisessä tehtäväsi sinun tulee kirjoittaa luokan määrittely ja jäsenfunktioiden toteutus luokalle Nelikulmio, joka on edellisessä tehtävässä laaditun abstraktin Kuvio-luokan aliluokka.
Luokan tulee sisältää seuraavat ominaisuudet:
Jäsenmuuttujat: korkeus_ ja leveys_
Parametrillinen muodostin, joka välittää Kuvio-luokan muodostimelle Nelikulmio-muodostimen saaman char-tyyppisen parametrin ja alustaa edellisessä mainitut jäsenmuuttujat muodostimelle välitetyin parametrein.
Funktion Piirra toteutus, joka piirtää nelikulmion sen jäsenmuuttujissa olevien korkeus ja leveys tietojen perusteella. Piirtämiseen käytetään yliluokan jäsenmuuttujassa olevaa tekstuurimerkkiä kuten esimerkkitulosteesta voidaan havaita. Piirtämiseen tarvittava tekstuuri saadaan käyttöön Kuvio-luokan PalautaTekstuuri() funktiolla.
Example output:
Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 2
Anna muodostettavan nelikulmion sivun korkeus: 4
Anna muodostettavan nelikulmion sivun leveys: 7
Syötä merkki, jota käytetään nelikulmion tekstuurina: O
Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 1
Anna muodostettavan neliön sivun pituus: 4
Syötä merkki, jota käytetään neliön tekstuurina: W
Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 2
Anna muodostettavan nelikulmion sivun korkeus: 5
Anna muodostettavan nelikulmion sivun leveys: 10
Syötä merkki, jota käytetään nelikulmion tekstuurina: @
Muodostetut kuviot piirrettynä:
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
WWWW
WWWW
WWWW
WWWW
@@@@@@@@@@
@@@@@@@@@@
@@@@@@@@@@
@@@@@@@@@@
@@@@@@@@@@
Vastaus:
//** Pre-defined code in the assignment **//
#include<iostream>
using namespace std;
class Kuvio
{
public:
Kuvio(char tekstuuri);
char PalautaTekstuuri();
virtual void Piirra() = 0;
private:
char tekstuuri_;
};
Kuvio::Kuvio(char tekstuuri) : tekstuuri_(tekstuuri)
{
}
char Kuvio::PalautaTekstuuri()
{
return tekstuuri_;
}
class Nelio : public Kuvio
{
public:
Nelio(char tekstuuri, int sivun_pituus);
void Piirra();
private:
int sivun_pituus_;
};
Nelio::Nelio(char tekstuuri, int sivun_pituus) : Kuvio(tekstuuri), sivun_pituus_(sivun_pituus)
{
}
void Nelio::Piirra()
{
int i, j;
for (i=0; i < sivun_pituus_; i++)
{
for (j=0; j < sivun_pituus_; j++)
{
if (j == sivun_pituus_ - 1)
{
cout << PalautaTekstuuri() << endl;
}
else
{
cout << PalautaTekstuuri();
}
}
}
}
//** ---------- ---------- ---------- **//
class Nelikulmio: public Kuvio
{
public:
Nelikulmio(char tekstuuri, int korkeus, int leveys);
void Piirra();
private:
int korkeus_;
int leveys_;
};
Nelikulmio::Nelikulmio(char tekstuuri, int korkeus, int leveys)
: Kuvio(tekstuuri), korkeus_(korkeus), leveys_(leveys)
{
}
// TODO Remove duplicate functionality
void Nelikulmio::Piirra()
{
int i, j;
for (i=0; i < korkeus_; i++)
{
for (j=0; j < leveys_; j++)
{
if (j == leveys_ - 1)
{
cout << PalautaTekstuuri() << endl;
}
else
{
cout << PalautaTekstuuri();
}
}
}
}
//** Pre-defined code in the assignment **//
int main()
{
int sivun_leveys, sivun_korkeus, i, valinta;
char tekstuuri;
Kuvio* kuviot[3];
for(i=0; i<3; i++)
{
cout << "Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): ";
cin >> valinta;
if (valinta == 1)
{
cout << "Anna muodostettavan neliön sivun pituus: ";
cin >> sivun_leveys;
cout << "Syötä merkki, jota käytetään neliön tekstuurina: ";
cin >> tekstuuri;
kuviot[i] = new Nelio(tekstuuri, sivun_leveys);
}
else
{
cout << "Anna muodostettavan nelikulmion sivun korkeus: ";
cin >> sivun_korkeus;
cout << "Anna muodostettavan nelikulmion sivun leveys: ";
cin >> sivun_leveys;
cout << "Syötä merkki, jota käytetään nelikulmion tekstuurina: ";
cin >> tekstuuri;
kuviot[i] = new Nelikulmio(tekstuuri, sivun_korkeus, sivun_leveys);
}
}
cout << endl << "Muodostetut kuviot piirrettynä:" << endl << endl;
for (i=0; i<3; i++)
{
kuviot[i]->Piirra();
cout << endl;
}
return 0;
}
//** ---------- ---------- ---------- **//