## 3 Kuviosta periytyvä nelikulmio **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 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; } //** ---------- ---------- ---------- **// ```