Ohjelmointi++ 2002/ 18.2

Demo 5


Tehtävät


1*.
Muuta edellisen demon tehtävän 7&8 vastaus olio-ohjelmaksi.
2*.
Ks. luentomoniste Tehtävä 9.78 Päivämäärätyyppi, mutta toteuta luokkana.
3-4.
Suunittele ja toteuta cVali-tyyppi, joka tallettaa suljetun reaalilukuvälin. Kirjoita metodit lue ja Osuuko(vali). lue kelpuuttaa seuraavat syötöt:
Anna väli (0-5) >[ret]       => 0-5
Anna väli (0-5) >3[ret}      => 3-3
Anna väli (0-5) >3-[ret]     => 3-5
Anna väli (0-5) >-3[ret]     => 0-3
Anna väli (0-5) >1-3[ret]    => 1-3
Testiohjelma kysyy kaksi väliä ja sitten Osuuko paluttaa tiedon siitä osuuko toinen väli itse olioon. Testiohjelma voisi olla esimerkiksi:
int main(void)
{
  cVali v1,v2; int osuma;
  v1.lue();        v2.lue();
  v1.tulosta();  v2.tulosta();
  osuma = v1.Osuuko(v2);
  if ( osuma == 0 )
    cout    << "v1 osuu v2:een!"   << endl;
  else if ( osuma == -1 )
    cout << "v1 välin arvot pienempiä kuin v2:en!" << endl;
  else if ( osuma == 1 )
    cout << "v1 välin arvot suurempia kuin v2:en!" << endl;
  return 0;
}
(vihje: Piirrä kuva, miten kaksi väliä käyttäytyy toisiinsa nähden).
5.
Suunnittele luokka cLinjaAuto, jossa on paikkojen lukumäärä ja vapaiden paikkojen lukumäärä. Tee metodit tulosta sekä lisaa ja vahenna muuttamaan matkustajien lukumäärää. Kirjoita testipääohjelma.
6.*
Modifioi edellistä ratkaisua siten, että luokaa cLinjaAuto voi käyttää seuraavassa testiohjelmassa:
...
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;
}

7.
Kirjoita luokka cTietokone, jossa on tietokoneelle tarpeellisia attribuutteja (muistin määrä, kovalevyn koko jne..). Kirjoita myös testipääohjelma.
8.
Lue itsenäisesti monisteesta luku 10.4. Mitä tapahtuu seuraavassa ohjelmanpätkässä (tutki pöytätestillä):
/* 01 */  int a=23,b=13,c=17;
/* 02 */  char m = 'b';
/* 03 */  if ( a = b ) c+=0x0f;
/* 04 */  if ( a & ~b ) c--;
/* 05 */  m ^= 1 << 5;
/* 06 */  if ( m == 'B' ) b &= c;
/* 07 */  printf("a=%d b=%d c=%d m=%c\n",a,b,c,m);
B1-2
Muuta Demo 3:n guru-tehtävän vastaus sellaiseksi, että siinä on luokka cOppilas ja attribuutteina luokassa on aliohjelman KasitteRivi tarvittavat lokaalit muuttujat. Varsinaisen muunnostyön hoitaa metodi setAsHTMLString ja tulos saadaan metodilla getAsListString. Muut metodit ja konstruktorit yms. saat määritellä itse.
B3.
Täydennä luennolla annettu n:\kurssit\cpp\moniste\esim\olioalk\astia.cpp niin että se toimii alkukommenteissa olevien määritysten mukaan. Vastaavan Windows-ohjelman löydät n:\kurssit\winohj\moniste\tentit\v00.
G1.
Muuta tehtävää 3-4 siten, että Osuuko palauttaa välien leikkauksen. Määrittele lisäksi mikä on tyhjä väli (tyhjä joukko) ja tee vielä muunnosoperaattori jolla cVali muuttuu int-tyypiseksi (ks. moniste Olio-ohjelmointi ja C++, 2.9.1 Operaattori-funktiot) siten, että tyhjästä välistä tulee 0 ja muista 1. Tällöin voidaan edelleen kysyä
if ( vali1.Osuuko(vali2) ) ...