Exam text content

TIE-02400 Ohjelmoinnin tekniikat - 21.05.2014

Exam text content

The text is generated with Optical Image Recognition from the original exam file and it can therefore contain erroneus or incomplete information. For example, mathematical symbols cannot be rendered correctly. The text is mainly used for generating search results.

Original exam
 

 

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

 


We use cookies

This website uses cookies, including third-party cookies, only for necessary purposes such as saving settings on the user's device, keeping track of user sessions and for providing the services included on the website. This website also collects other data, such as the IP address of the user and the type of web browser used. This information is collected to ensure the operation and security of the website. The collected information can also be used by third parties to enable the ordinary operation of the website.

FI / EN