Tehtävä:
Luvun viimeisessä tehtävässä sinun tulee laatia funktio "TulostaKuviot", joka saa parametrina osoitintaulukon edellisistä tehtävistä tuttuun Kuvio-luokkaan. Taulukko sisältää Kuvio-luokasta periytettyjä oliota, jotka on muodostettu luokista Nelio ja Nelikulmio.
Funktion tulee tulostaa taulukon sisältämät oliot (yhteensä 3 oliota) esimerkkitulosteen mukaisesti hyödyntäen Nelio- ja Nelikulmio-luokkien yliluokassa (Kuvio) määriteltyä "Piirra" funktiota. Piirra-funktio ei saa parametreja, eikä se palauta arvoa.
Laatimasi funktion prototyyppi on kirjoitettu valmiiksi: void TulostaKuviot(Kuvio* kuviotaulukko[3]);
Huomaa, että ohjelman eri ajokerroilla taulukon sisältämät oliot ja niiden määrittelyluokat vaihtelevat. Polymorfismin ansiosta tällä ei ole kuitenkaan vaikutusta sinun funktiosi toteutuksessa.
Example output:
Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 2
Anna muodostettavan nelikulmion sivun korkeus: 3
Anna muodostettavan nelikulmion sivun leveys: 4
Syötä merkki, jota käytetään nelikulmion tekstuurina: %
Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 1
Anna muodostettavan neliön sivun pituus: 2
Syötä merkki, jota käytetään neliön tekstuurina: E
Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 1
Anna muodostettavan neliön sivun pituus: 6
Syötä merkki, jota käytetään neliön tekstuurina: &
Muodostetut kuviot piirrettynä:
%%%%
%%%%
%%%%
EE
EE
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
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)
{
}
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();
}
}
}
}
void TulostaKuviot(Kuvio* kuviotaulukko[3]);
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;
TulostaKuviot(kuviot);
return 0;
}
//** ---------- ---------- ---------- **//
void TulostaKuviot(Kuvio* kuviotaulukko[3]) {
for (int i = 0; i < 3; i++) {
kuviotaulukko[i]->Piirra();
cout << endl;
}
}