Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Samankaltaiset tiedostot
STL:n uudistukset. Seppo Koivisto TTY Ohjelmistotekniikka

Olio-ohjelmointi Syntaksikokoelma

TIETORAKENTEET JA ALGORITMIT

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Olio-ohjelmointi Geneerisyys. 1. Johdanto

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

1 C++:n standardikirjasto

18. Abstraktit tietotyypit 18.1

Olio-ohjelmointi 2. välikoe HYV5SN

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

12 Mallit (Templates)

13 Operaattoreiden ylimäärittelyjä

Ohjelmoinnin perusteet Y Python

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Tietorakenteet ja algoritmit

Listarakenne (ArrayList-luokka)

1. Mitä tehdään ensiksi?

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

3. Binääripuu, Java-toteutus

Standardi mallikirjasto

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Algoritmit 2. Luento 7 Ti Timo Männikkö

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

int puts(char *buff) Kirjoittaa puskurissa buff \0 :lla päätetyn merkkijonon standarditulostukseen. Formatoitu konsoli-i/o Tiedostot

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

1. C++:n STL-kirjasto

Tietorakenteet ja algoritmit

Muuttujien roolit Kiintoarvo cin >> r;

C++11 lambdat: [](){} Matti Rintala

Tietorakenteita 163. Yhteen suuntaan linkitetyn listan rakenne on siis seuraavan kuvan kaltainen:

Ohjelmoinnin peruskurssien laaja oppimäärä

Lyhyt kertaus osoittimista

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Luokan sisällä on lista

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Tietorakenteet ja algoritmit

Osoitin ja viittaus C++:ssa

Ohjelmoinnin perusteet Y Python

Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan

Tietorakenteet ja algoritmit

TIE Tietorakenteet ja algoritmit 25

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Tietorakenteet ja algoritmit

A TIETORAKENTEET JA ALGORITMIT

812336A C++ -kielen perusteet,

Tietorakenteet ja algoritmit

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Metodien tekeminen Javalla

Ohjelman virheet ja poikkeusten käsittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Algoritmit 1. Luento 11 Ti Timo Männikkö

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

2 Haku ja lajittelu. 2.1 Luvun hakeminen taulukosta X?? n-1. Haku ja lajittelu 35

Mallit standardi mallikirjasto parametroitu tyyppi

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Rajapinta (interface)

Kääntäjän virheilmoituksia

Mikä yhteyssuhde on?

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Tieto- ja tallennusrakenteet

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Metaohjelmointia ja muuta hauskaa

Algoritmit 1. Demot Timo Männikkö

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Ohjelmoinnin perusteet Y Python

OHJ-1150 Ohjelmointi II

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Olio-ohjelmointi Javalla

TIE Ohjelmistojen suunnittelu

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Vakiokokoiset kokonaislukutyypit

Algoritmit 2. Demot Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Algoritmit 2. Luento 2 Ke Timo Männikkö

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

Ohjelmoinnin perusteet Y Python

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

Algoritmit 1. Luento 12 Ti Timo Männikkö

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

Sisältö. 22. Taulukot. Yleistä. Yleistä

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Algoritmit 1. Luento 4 Ke Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Sisältö. 2. Taulukot. Yleistä. Yleistä

Luokan muodostimet (Constructors)

Rakenteiset tietotyypit Moniulotteiset taulukot

Virtuaalifunktiot ja polymorfismi

TTY Ohjelmointi I & II C++-kirjastoreferenssi versio 2.2

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Transkriptio:

Demo 6 vastauksia 1. tehtävä #ifndef #define D6T1 H D6T1 H #include <iostream> using std::ostream; using std::cout; using std::endl; #include <string> using std::string; 10 template <typename T> class Rationaaliluku { T osoittaja; T nimittaja; bool sievennettava; public: Rationaaliluku(T osoittajaksi, T nimittajaksi, bool sievennetaanko=false) 20 : osoittaja(osoittajaksi), nimittaja(nimittajaksi), sievennettava(sievennetaanko) { if (nimittaja==0) throw new Nollanimittaja(osoittajaksi, nimittajaksi); Rationaaliluku(const Rationaaliluku& toinen) : osoittaja(toinen.osoittaja), nimittaja(toinen.nimittaja) { Rationaaliluku& operator *=(const Rationaaliluku& toinen) { 30 osoittaja*=toinen.osoittaja; nimittaja*=toinen.nimittaja; return *this; Rationaaliluku& operator /=(const Rationaaliluku& toinen) { osoittaja*=toinen.nimittaja; nimittaja*=toinen.osoittaja; return *this; 40 Rationaaliluku& operator +=(const Rationaaliluku& toinen) { if (nimittaja==toinen.nimittaja) { osoittaja+=toinen.osoittaja; return *this; 1

else throw string("laiska ope ei jaksanu" "tehä kunnollista yhteenlaskua, hyi!"); void sievenna() { 50 ostream& tulosta(ostream& out) { out << osoittaja << "/" << nimittaja; return out; ; struct Nollanimittaja { Nollanimittaja(T o, T n) : osoittaja(o), nimittaja(n) {; T osoittaja; T nimittaja; 60 ; template <typename T> ostream& operator << (ostream& out, Rationaaliluku<T> r) { return r.tulosta(out); template <typename T> Rationaaliluku<T> operator *(const Rationaaliluku<T>& a, 70 const Rationaaliluku<T>& b) { Rationaaliluku<T> c(a); return c*=b; template <typename T> Rationaaliluku<T> operator /(const Rationaaliluku<T>& a, const Rationaaliluku<T>& b) { Rationaaliluku<T> c(a); return c/=b; 80 template <typename T> Rationaaliluku<T> operator +(const Rationaaliluku<T>& a, const Rationaaliluku<T>& b) { Rationaaliluku<T> c(a); return c+=b; template <> 90 Rationaaliluku<int>& Rationaaliluku<int>::operator *= (const Rationaaliluku<int>& toinen) { cout << " <\"tehostettu\" kertolasku> "; osoittaja*=toinen.osoittaja; 2

nimittaja*=toinen.nimittaja; return *this; #endif 100 2. tehtävä #ifndef #define D6T2 H D6T2 H template<typename T> class Sailio { public: Sailio(int maxiksi=3) : max(maxiksi), lkm(0) { data=new (T*)[max]; Sailio() { 10 delete[ ] data; void lisaa(t *t) { if (lkm>=max) { max=max*3/2; T **uusi data=new (T*)[max]; for (int i=0; i<lkm; ++i) uusi data[i]=data[i]; delete[ ] data; 20 data=uusi data; data[lkm++]=t; T* anna(int i) { return data[i]; void poista(int i) { 30 for (int j=i+1; j<lkm; ++j) data[j 1]=data[j]; lkm; int alkioita() const { return lkm; class Sailio iteraattori { Sailio<T>* sailo; 3

public: ; int indeksi; 40 Sailio iteraattori(sailio<t>* s) : sailo(s), indeksi(0) { bool jaljellako() { return indeksi<sailo >alkioita(); T* nykyinen() { return sailo >anna(indeksi); void seuraavaan() { indeksi++; Sailio iteraattori iteraattori() { return Sailio iteraattori(this); 50 private: ; T **data; int lkm; int max; #endif 60 #include <iostream> using std::cout; using std::endl; using std::ostream; #include <string> using std::string; #include "d6t1.h" #include "d6t2.h" 10 class Tieto { public: Tieto() : tieto(0) {; Tieto(int t) : tieto(t) { cout << " Tieto luotu osoitteeseen " << this << " arvolla " << tieto << "." << endl; ; // STL vaatii 20 Tieto(const Tieto& toinen) : tieto(toinen.tieto) { cout << " Kopioitu Tieto-olio osoitteeseen " << this << " arvolla " << tieto << " oliosta " << &toinen << "." << endl; 4

virtual Tieto() { cout << " Tietoalkio arvolla " << tieto << " tuhottu." << endl; // STL vaatii bool operator < (const Tieto& toinen) { return tieto<toinen.tieto; 30 // STL vaatii Tieto& operator = (const Tieto& toinen) { if (&toinen!=this) tieto=toinen.tieto; return *this; 40 virtual string tyyppi() { return "Tieto"; ; int tieto; int vector main(void); 50 int main(void) { cout << "\n===============================================" << endl; cout << " main" << endl; cout << "===============================================" << endl; cout << "\nluodaan Sailio ja kaksi alkiota:" << endl; typedef Sailio<Tieto> Tietosailio; typedef Tietosailio::Sailio iteraattori Tietoiteraattori; Tietosailio s(2); Tieto *t1=new Tieto(23); Tieto *t2=new Tieto(175); 60 cout << "\nlisätään kaksi alkiota:" << endl; s.lisaa(t1); s.lisaa(t2); Tietoiteraattori ti=s.iteraattori(); while (ti.jaljellako()) { 70 Tieto *t=ti.nykyinen(); cout << " Tieto: " << t >tieto ti.seuraavaan(); 5

cout << "\nlisätään alkio:" << endl; Tieto *t3=new Tieto(42); s.lisaa(t3); for (Tietoiteraattori i=s.iteraattori(); i.jaljellako(); i.seuraavaan()) { 80 Tieto *t=i.nykyinen(); cout << " Tieto: " << t >tieto cout << "\npoistetaan 2. alkio:" << endl; s.poista(1); for (int i=0; i<s.alkioita(); ++i) { Tieto *t=s.anna(i); cout << " Tieto: " << t >tieto 90 try { Rationaaliluku<int> a(2,5), b(3,4), c=a*b; cout << c << endl; catch (string& err) { cout << err << endl; 100 return vector main(); //return 0; #include <vector> #include <algorithm> 110 int vector main(void) { cout << "\n===============================================" << endl; cout << " vector_main" << endl; cout << "===============================================" << endl; using std::vector; using std::remove; cout << "\nluodaan Sailio ja kaksi alkiota:" << endl; typedef vector<tieto*> Tietosailio; 120 typedef Tietosailio::iterator Tietoiteraattori; Tietosailio s; 6

Tieto *t1=new Tieto(23); Tieto *t2=new Tieto(175); cout << "\nlisätään kaksi alkiota:" << endl; s.push back(t1); s.push back(t2); Tietoiteraattori ti=s.begin(); while (ti!=s.end()) { Tieto *t=*ti; cout << " Tieto: " << t >tieto ti++; 130 cout << "\nlisätään alkio:" << endl; Tieto *t3=new Tieto(42); 140 s.push back(t3); for (Tietoiteraattori i=s.begin(); i!=s.end(); i++) { Tieto *t=*i; cout << " Tieto: " << t >tieto cout << "\npoistetaan 2. alkio:" << endl; s.erase(s.begin()+1); 150 /* Tietoiteraattori uusi loppu= remove(s.begin(), s.end(), t2); // huomaa ero Sailo-toteutukseen : // t2, jonka tiedetään olevan toinen alkio // poistetaan, vaikka se olisi missä // kohti vektoria tahansa Kas, kas. Kun nyt sitten testasin tuon ohjelman vihdoin, kun se oli unohtunut ennen demoja :) sori!, niin huomasin, 160 että tuo remove() jättää jälkeensä niin monta kopiota viimeistä alkiota kuin on poistettuja alkioita, eli se ei muuta säiliön kokoa (no, mitenkäs se iteraattorin läpi onnistuisikaan?). Niinpä tuo s.erase(s.begin()+1) osoittautui sittenkin paremmaksi vaihtoehdoksi. */ for (Tietoiteraattori i=s.begin(); i!=s.end(); i++) { Tieto *t=*i; 170 cout << " Tieto: " << t >tieto 7

try { Rationaaliluku<int> a(2,5), b(3,4), c=a*b; cout << c << endl; catch (string& err) { cout << err << endl; 180 for (Tietoiteraattori i=s.begin(); i!=s.end(); i++) { delete *i; s.clear(); cout << "Valamista tulj!" << endl; return 0; 190 /* =============================================== main =============================================== Luodaan Sailio ja kaksi alkiota: 200 Tieto luotu osoitteeseen 0x804e188 arvolla 23. Tieto luotu osoitteeseen 0x804e198 arvolla 175. Lisätään kaksi alkiota: Tieto: 23 Tyyppi: Tieto Tieto: 175 Tyyppi: Tieto Lisätään alkio: Tieto luotu osoitteeseen 0x804e1a8 arvolla 42. Tieto: 23 Tyyppi: Tieto 210 Tieto: 175 Tyyppi: Tieto Tieto: 42 Tyyppi: Tieto Poistetaan 2. alkio: Tieto: 23 Tyyppi: Tieto Tieto: 42 Tyyppi: Tieto < tehostettu kertolasku> 6/20 =============================================== vector main 220 =============================================== 8

Luodaan Sailio ja kaksi alkiota: Tieto luotu osoitteeseen 0x804e178 arvolla 23. Tieto luotu osoitteeseen 0x804e1c8 arvolla 175. Lisätään kaksi alkiota: Tieto: 23 Tyyppi: Tieto Tieto: 175 Tyyppi: Tieto Lisätään alkio: Tieto luotu osoitteeseen 0x804e320 arvolla 42. Tieto: 23 Tyyppi: Tieto Tieto: 175 Tyyppi: Tieto Tieto: 42 Tyyppi: Tieto 230 Poistetaan 2. alkio: Tieto: 23 Tyyppi: Tieto Tieto: 42 Tyyppi: Tieto < tehostettu kertolasku> 6/20 240 Tietoalkio arvolla 23 tuhottu. Tietoalkio arvolla 42 tuhottu. Valamista tulj! */ 3. Iteraattorilla voidaan iteroida, eli käydä järjestyksessä läpi säliön alkiot. On tapana tehdä erilaisia iteraattoreita erilaisille järjestyksille, esimekiksi tavallisin iteraattori käy alkiot läpi jossain järjestyksessä yhteen suuntaan, kaksisuuntaisella iteraattorilla suuntaa voi vaihtaa. Monisteessa iteraattori oli tällainen tavallinen, sillä oli metodit jaljellako() joka palautti tiedon siitä, onko kaikki säilön alkiot jo käyty läpi, nykyinen() joka palautti iteraattorin nykyisen, kutsuhetkellä osoittaman alkion ja seuraavaan() joka siirsi iteraattorin osoittamaan seuraavaa alkiota. Iteraattorin muodostaa yleensä säilöluokka, jolta myös iteraattorin saa käyttöönsä. STL:n iteraattorikategoriat: input, output, forward, bidirectional ja random access. Iteraattorisovittimia: reverse, insert, stream. 9

4. vector metodeja: front, back, indeksointi ja at, push_back ja pop_back, insert, erase, size, empty, clean, reserve. iteraattori: begin, end ja ++ huomaa alkion poisto, list olisi parempi, kenties? 5. Eri säilöluokat soveltuvat eri tarpeisiin: vector vanha tuttu taulukko list kuten nimi sanoo, lista, vieläpä kahteen suuntaan linkitetty. Ei mielivaltaisen alkion indeksointia, lisääminen vakioaikaista. splice. deque on taulukko, jonka molempiin päihin tehtävät lisäykset ja poistot ovat vakioaikaisia, muualle lineaarisia. Korttipakka. Indeksointi hitaampaa kuin vektorilla, alkuun lisääminen vakioaikaista (vektorilla lineaarinen). set on assosiatiivinen säiliö. Joukko, yksi esiintymä alkiosta mahdollinen. Järjestys avaimen mukaan. Avain itse alkio. multiset mahdollistaa monta esiintymää alkiosta. map on kuten set, mutta avain ja alkio ovat eri oliot. Jos indeksointi ei löydä alkiota avaimelle, luodaan alkion oletusrakentimella avaimelle alkio map:iin. multimap mahdollistaa useita alkioita yhdelle avaimelle. vector<bool> totuusarvovektori bitset binaaristen bittisarjojen käsittelyyn, esimerkiksi bitset<64>. stack on säiliösovitin, säiliötä voidaan käyttää kuten pinoa. stack<int, list<int> > queue jonosovitin priority_queue kuten jonosovitin, mutta alkiot suuruusjärjestyksessä. 6. Algoritmeja: copy, find, sort, merge(alku1, loppu1, alku2, loppu2, kohde), for_each(alku, loppu, funktio), partition(alku, loppu, ehtofunktio), random_shuffle(alku, loppu). Algoritmeja voi iteraattoreiden avulla käyttää osalle säiliön alkioista tai kaikille. Iteraattoreiden avulla funktiot voivat käsitellä erilaisten säiliöiden alkioita säiliöistä riippumatta. Algoritmien toimintaa 10

voi muuttaa iteraattorisovittimien avulla (find ja backward_iterator). Myös omia iteraattoreita (ja algoritmeja) voi kirjoittaa. 7. tehtävä Periytyminen Delegointi, Koostuminen is-a has-a...... 11