Tentin tekstisisältö

TIE-02400 Ohjelmoinnin tekniikat - 21.05.2014

Tentin tekstisisältö

Teksti on luotu tekstintunnistuksella alkuperäisestä tenttitiedostosta, joten se voi sisältää virheellistä tai puutteellista tietoa. Esimerkiksi matemaattisia merkkejä ei voida esitää oikein. Tekstiä käytetään pääasiassa hakutulosten luomiseen.

Alkuperäinen tentti
 

 

TIE-02400 Ohjelmoinnin tekniikat Tentti 21.5.2014

TIE-02400 Ohjelmoinnin tekniikat

(Matti Rintala)

Tentti 21.5.2014

Tentissä ei saa käyttää ylimääräistä kirjallista materiaalia, laskimia, tietokoneita tai muita lunttausvälineitä.
Muutama sana tenttivastauksen kirjoittamisesta:

1. Mieti etukäteen esim. ranskalaisilla viivoilla vastauksesi pääkohdat ja lajittele ne johdonmukaiseen järjestykseen — älä
kirjoita yhteen pötköön kaikkea mieleen tulevaa, se on varma tapa unohtaa olennaista.

2. Muista vastata kaikkiin tehtävän kysymyksiin, täysiä pisteitä ei voi saada jos kaikkiin kysyttyihin asioihin ei ole vastattu.

3. Jos vastaus vaatii ohjelmakoodin kirjoittamista, sen ei tarvitse olla pilkulleen syntaksiltaan oikein.

1. Termit

Selitä (max. 7 riviä/kohta) seuraavat käsitteet ja mitä hyötyä/haittaa niistä on.
Älä selitä niistä pelkkää syntaksia tms, vaan kerro etupäässä, mitä ko. käsitteet

tarkoittavat.
a) Poikkeushierarkia (exception d) Ot:n "signaalit"ja "slotit"
hierarchy) 1 3 :
b) Yksikkötestaus (unit testing) e) Syväkopiointi (deep copying)
E c) Tapahtumapohjainen ohjelmointi f£) Cit:n älykkäät osoittimet (smart
(event driven programming) pointers)

2. Sopimussuunnittelu (Contract Programming).

a) Mistä sopimussuunnittelussa on kyse, ts. miten se helpottaa ohjelmointia?

b) Mitkä ovat sopimussuunnittelun keskeiset käsitteet ja mitä ne tarkoittavat?

c) C:n vector-luokan indeksointi-operaattorin [] esiehtona on, että käytetty
indeksi on pienempi kuin alkioiden lukumäärä. Miten operaation jälkiehtoa
pitäisi muuttaa, jos esiehtoa lievennetään niin, että indeksiksi käy mikä tahansa
kokonaisluku?

d) Kirjoita (sanallisesti tai kaavalla, kuitenkin mahdollisimman täsmällisesti)
seuraavien funktioiden esi- ja jälkiehdot. Tehtävässä v on globaali muuttuja
(hyi) tyyppiä std: :vector<int>.

i. double f1(double x) ( return x/x; )

ii. unsigned int f2(string s) ( return s.length(); )
iii. int f3(int i) ( return v[i+11; )

iv. void f4() ( v.push back(v[0]); )

v. int f5(int i) ( return v.push back(v.at(i)); )
vi. int f6() ( return v[0]/v[1]; )

< KÄÄNNÄ annet.

 
 

TIE-02400 Ohjelmoinnin tekniikat Tentti 21.5.2014

3. Periytyminen

a) Mitä ovat periytyminen ja luokkahierarkiat? Miten periytyminen vaikuttaa
luokkiin (ts. miten periytyminen näkyy ohjelmakoodin tasolla)?

b) Mitä ovat dynaaminen sitominen ja virtuaalifunktiot? Millaisissa tilanteissa ja
miten ne helpottavat ohjelmointia?

c) Mitä ovat abstraktit kantaluokat? Mitä hyötyä sellaisista on?

4. Poikkeukset ja vähän muutakin

a) Alla oleva listaus esittelee "yksinumeroisen murtolukuluokan", jonka olioiden
on tarkoitus esittää murtolukuja a/b, jossa a ja b ovat molemmat yksinumeroisia
kokonaislukuja. Kirjoita luokalle luokkainvariantti (sanallinen tai kaavoina,
kunhan asia käy selväksi.)

b) Lisää luokan jäsenfunkitioihin tarvittava virhekäsittely. Koko listausta ei tarvitse
kopioida, vaan ainoastaan uudet tai muuttuneet rivit (ilmoita rivinumerot niin,
että riveistä näkee minne ne kuuluvat).

c) Ohjelmaan haluttaisiin myös normaali murtolukuluokka, jonka osoittajan
ja nimittäjän arvoja ei ole rajoitettu yksinumeroisiksi. Voisiko tämän uuden
luokan periyttää YksMurto-luokasta? Perustele!

1 // class YksMurto nim *= m.oso ;
f 27 supista(); // Supistetaan

3 —// Alustus kokonaisluvusta

YksMurto(int i) 29 — // Muutetaan kaanteisluvukseen
5 : oso (i), nim (1) void kaanna()

1 31 ( // Vaihdetaan osoittaja ja nimittaja
7) int vanha oso = oso ;

// Alust. osoittaja & nimittajaaa oso = nim ;
9 — YksMurto(int o, int n) nim = vanha oso;

: oso (0), nim (n) 353)

1. // Palautetaan arvo liukulukuna

] 37 — double annaliukulukuna() const
13 —// Purkaja (

-YksMurto() 39 return static cast<double>(oso ) /
ad static cast<double>(nim );

J a -)
17 — // Lisataan kokonaisluku private:

void lisaa(int i) 43 = // Supistaa osoittajan ja nimittajan
19 ( // Lisataan i lavennettuna // niin, etta ne ovat mahd. pienia

oso +=1i * nim ; 45 — void supista(); // Toteutus ohitetaan

2 4 // Luvun arvo on oso / nim.

/| Jaetaan murtoluvulla 47 = int oso ; // Osoittaja
23 — void jaa(YksMurto const& m) int nim ; // Wimittaja

| // Jaetaan kertomalla ristiin4s );
25 0507 tma nim

 


Käytämme evästeitä

Tämä sivusto käyttää evästeitä, mukaanlukien kolmansien puolten evästeitä, vain sivuston toiminnan kannalta välttämättömiin tarkoituksiin, kuten asetusten tallentamiseen käyttäjän laitteelle, käyttäjäistuntojen ylläpitoon ja palvelujen toiminnan mahdollistamiseen. Sivusto kerää käyttäjästä myös muuta tietoa, kuten käyttäjän IP-osoitteen ja selaimen tyypin. Tätä tietoa käytetään sivuston toiminnan ja tietoturvallisuuden varmistamiseen. Kerättyä tietoa voi päätyä myös kolmansien osapuolten käsiteltäväksi sivuston palvelujen tavanomaisen toiminnan seurauksena.

FI / EN