wiki:k2012/demot/demoC2
Last modified 6 years ago Last modified on 2012-04-12 16:42:06

Demot » Demo C2, ke 2.5.2012, klo 12-14

Palautus ke 2.5 klo 11 mennessä.

Demoista C1 ja C2 on tehtävä yhteensä 60%, min 40%/kerta, jotta saa 1 op merkinnän kurssista TIEP112 Ohjelmointi 2, C++. Kurssi arvostellaan Hyväksytty/Hylätty?. Demokertojen maksimina pidetään 10, eli käytännössä Hyväksyttyyn vaaditaan siis yhteensä 12 tehtyä tehtävää. Palautukset c2 (huom pieni c) ”nimellä” NettiDemoWWW:llä.

Vähintään kahteen vastaukseen ”automaattinen” testaus perinteisellä tai ComTest tavalla.

Tehtävä 1. Linja-auto

Suunnittele luokka cLinjaAuto, jossa on paikkojen lukumäärä ja vapaiden paikkojen lukumäärä. Tee metodit tulosta sekä lisaa ja vahenna muuttamaan matkustajien lukumäärää. Alla testipääohjelma:

...
int main(void)
{
  cLinjaAuto pikkubussi(10),isobussi(45);
  pikkubussi.lisaa(4); pikkubussi.tulosta();
  isobussi.lisaa(30);  isobussi.tulosta();
  int yli = pikkubussi.lisaa(15);
  isobussi.lisaa(yli);
  pikkubussi.tulosta(); isobussi.tulosta();
  if ( isobussi.tilaa() ) 
    cout << "Isoon bussiin mahtuu!" << endl;
  return 0;
}

Tehtävä 2. Kulkuneuvot

Kirjoita luokka cKulkuneuvo, jossa on ainakin nopeus ja matkustajien lukumäärä. Peri tästä luokat cLaiva ja cLentokone, joissa kummassakin on jokin oma erikoisominaisuus yleiseen kulkuneuvoon verrattuna. Kirjoita myös pieni testipääohjelma.

Tehtävä 3. Valuutat

Muuta valuutts.cpp:n luokka cValuutat sellaiseksi, että perinnän tilalla käytetään koostamista. Mihinkään muualle ei saa tehdä muutoksia kuin tähän luokkaan. Vinkkejä kääntämiseen.

Tehtävä 4*. Taulukon sijoittaminen

Kirjoita taul_d.cpp (ks. moniste 16.5) taulukolle metodi sijoita, jolla voidaan sijoittaa taulukkoon toinen taulukko:

...
int main(void)
{
  cTaulukko luvut(7);
  luvut.lisaa(0); luvut.lisaa(2);
  cout << luvut << endl;  // 0 2
  cTaulukko taul;
  taul.sijoita(luvut);   // tai jopa  taul = luvut;
  cout << taul << endl;  // tulostaa saman kuin edellä
  return 0;
}

Luokka voidaan testata vaikka seuraavasti ComTestC++:lla

#include <sstream>
using std::ostringstream;
...

/**
 * Luokka dynaamiselle int-taulukolle
 * @code
 * <pre name="test">
 *   ostringstream ss;
 *   cTaulukko luvut(10);
 *   ss << luvut; ss.str() === "";
 *   luvut.lisaa(0); luvut.lisaa(2); luvut.lisaa(2);
 *   luvut.lisaa(4); luvut.lisaa(2);
 *   ss << luvut; ss.str() === "0 2 2 4 2 ";       ss.str("");
 *   cTaulukko taul;
 *   taul.sijoita(luvut); 
 *   ss << taul;  ss.str() === "0 2 2 4 2 ";       ss.str("");
 *   taul.lisaa(99);
 *   luvut.lisaa(88);
 *   ss << taul;  ss.str() === "0 2 2 4 2 99 ";    ss.str("");
 *   ss << luvut; ss.str() === "0 2 2 4 2 88 ";    ss.str("");
 * </pre>
 * @endcode
 */

Tehtävä 5*. Lisäysoperaattori

Kirjoita edellisen tehtävän luokkaan + operaattori, niin että seuraava koodi toimii:

  cTaulukko t3 = luvut + taul;
  cout << t3 << endl;    // 0 2 0 2

Arvostele ratkaisusi tehokkuutta syntyvien olioiden näkökulmasta.

Tehtävä 6-7. Nimet ja lajittelu

Kirjoita ohjelma, joka kyselee nimiä kunnes annetaan tyhjä rivi ja tulostaa tämän jälkeen nimet aakkosjärjestyksessä. Nimet syötetään muodossa "Aku Ankka", mutta siitä huolimatta ne lajitellaan siten, että "Iines Ankka" < "Hannu Hanhi", eli sukunimen mukaan. Käytä ratkaisussa jotakin STL:n tietorakennetta sekä algoritmia ja ota pohjaksi esim: AakkostaHenkilot.java.

// Merkkijonon lukeminen päätteltä:
 string s;
 cout << "Anna jono";
 getline(cin,s);

Tehtävä 8. Hullunpasianssi

Muuta pasianssiohjelma (pasi.cpp) kunnolliseksi olio-ohjelmaksi, eli tietueet luokiksi ja aliohjelmat metodeiksi.

Tehtävä 9. Histogrammi

Muuta pasianssiohjelmaa siten, että ohjelma piirtää lopuksi histogrammin siitä, millä todennäköisyydellä peli päättyy i :teen korttiin (siis esimerkiksi seuraavasti):

1 ************************
2 *****************
3 *********
4 ****
5 **
6 *
7 *
...

Malliohjelmassa luokka näytti seuraavalta:

/*************************************************************************/
class cHisto {
  int lkm;
  long *esiintymat;
public:
  cHisto(int n);
  ~cHisto();
  int lisaa(int i);
  long etsi_max() const;
  int piirra() const;
};

Tehtävä 10*. Private sijoitus ja copy constructor

Lisää cHisto -luokkaan private sijoitusoperaattori ja CopyConstruktori. (Tämän voi tehdä vaikka ei tekisi 8-9 tehtäviä, kun tekee "dummy"-metodit noista muista).