700 likes | 955 Views
Olio-ohjelmointi. 1. osa: diat 1-70 (1. välikoe) Kymenlaakson ammattikorkeakoulu Jarkko Ansamäki, 2001. Sisältö ja tavoitteet. Tavoitelauseet opinto-oppaasta:
E N D
Olio-ohjelmointi 1. osa: diat 1-70 (1. välikoe) Kymenlaakson ammattikorkeakoulu Jarkko Ansamäki, 2001 KYAMK/J. Ansamäki/Olio-ohjelmointi
Sisältö ja tavoitteet • Tavoitelauseet opinto-oppaasta: • Kurssin jälkeen opiskelija osaa suunnitella annettuun yksinkertaiseen ongelmaan olio-pohjaisen ratkaisun ja toteuttaa tämän C++ -ohjelmointikielellä. • Uutena tavoitteena myös helpompi siirtyminen myöhemmin Microsoftin C++ sertifikaattikursseille. KYAMK/J. Ansamäki/Olio-ohjelmointi
Kurssin toteutus • Oppitunnit: • Luentoja - käydään asiat ensin läpi teoriatasolla. • Harjoituksia - opiskelijat ratkovat tehtäviä yksin/pienissä ryhmissä. Vaikeat asiat/malliratkaisut myöhemmin yhteistyöllä. • Harjoitustyö tunneilla tehtyjen tehtävien pohjalta (30% arvosanasta). • Tentti (70% arvosanasta). KYAMK/J. Ansamäki/Olio-ohjelmointi
Muut yleiset asiat • Kirjallisuus • Muu materiaali ja lähteet • Tuntien aikataulu • Vastaanotto • Yksi tentti vai kaksi tenttiä? • Kysymyksiä, toivomuksia? • Jatkokurssit... KYAMK/J. Ansamäki/Olio-ohjelmointi
Harjoitustyö palautettava kirjallisesti viimeistään kurssin viimeisellä oppitunnilla. Tämän jälkeen palautettavat harjoitustyöt kärsivät sakkoa yhden pisteen/päivä (maksimipisteet: 30). Harjoitustyönä tehdään C++ -kielellä puhelinmuistio/asiakas-kortisto. Pisteytys implementoitujen ominaisuuksien mukaan. Vinkkejä ja lisätietoja oppitunneilla. Harjoitustyö KYAMK/J. Ansamäki/Olio-ohjelmointi
C-kielen kertaus Yleistä main Tulostus Muuttujat Visual C++ 6.0 -ohjelmointiympäristö Syöttö Aritmetiikka if switch for while Muita komentoja Muita tietotyyppejä Funktiot Uudet piirteet Olio-ohjelmointi Perinteiset lähestymistavat Oliokeskeinen lähestymistapa Sisältö KYAMK/J. Ansamäki/Olio-ohjelmointi
Miksi olioita? Luokka ja olio Luokka vs. struct Luokan suunnittelu Luokan määritys Muodostimet Automaattinen olio Dynaaminen olio Olioiden välinen tiedonvälitys Julkinen perintä Tiedostojen käsittely Harjoitustyö Sisältö (2) KYAMK/J. Ansamäki/Olio-ohjelmointi
C-kielen kertaus • Kurssilla olio-ohjelmointia opiskellaan käyttäen C++ -kieltä, joka on C-kielen laajennus. • C-kielen perusasioiden pitäisi siis olla hallinnassa kurssin alussa. • Uuteen kehitysympäristöön tutustumisen jälkeen aloitammekin kurssin kevyellä C-kielen kertauksella... KYAMK/J. Ansamäki/Olio-ohjelmointi
Visual C++ 6.0 -ohjelmointiympäristö • Työympäristön osat. • Konsolisovelluksen koodaus, kääntäminen, suorittaminen. • Yhteensopivuus Borlandin kääntäjän kanssa. KYAMK/J. Ansamäki/Olio-ohjelmointi
C:n kertaus: Yleistä • Puolipiste ; päättää lauseen. • Useampi lause voidaan koota yhteen käyttämällä aaltosulkuja { } (koottu lause). • Koodin alussa voi olla esikääntäjälle tarkoitettuja direktiivejä. • Alkavat #-merkillä. • Esitellään kirjastoja, vakioita, tehdään makroja… KYAMK/J. Ansamäki/Olio-ohjelmointi
main • Jokaisessa ohjelmassa on main-funktio. • main aloittaa ohjelman. • Kun main pääsee loppuun, ohjelma päättyy. • Esimerkkejä: • void main(void){ /* ohjelman runko */ } • int main(){ /* koodia */ return 0; } • void main(int argc, char *argv){ /*koodi*/} KYAMK/J. Ansamäki/Olio-ohjelmointi
Tulostus • C-kielessä ei ole sisäänrakennettuja komentoja tulostusta varten vaan käytetään valmiita kirjastopalveluita: • stdio.h • ANSI C:n kirjasto • printf(”Kaksi plus kolme on %i!\n”,(2+3)); • iostream.h (ostream.h) • cout<<”Kaksi plus kolme on ”<<(2+3)<<”!\n”; • Kirjastot liitetään koodiin #include-direktiivillä. KYAMK/J. Ansamäki/Olio-ohjelmointi
Muuttujat täytyy määritellä ennen käyttöä. Määrittelyssä kerrotaan muuttujan tyyppi ja nimi. Samalla rivillä voidaan pilkuilla eroteltuna esitellä saman tyyppisiä muuttujia. Määrittelyn yhteydessä muuttuja voidaan myös alustaa. Eri tyyppejä: int, short, long, unsigned float, double char HUOM! * ja & Esim: int a, b=3, *c; Muuttujat KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 1. • Avaa Visual C++ ja uusi text edit. • Kirjoita ”Hello world!”-tyyppinen ohjelma. • Talleta ohjelmasi (päätteeksi .cpp). • Rakenna ja aja ohjelmasi: • build • workspace • punainen huutomerkki KYAMK/J. Ansamäki/Olio-ohjelmointi
Syöttö • Käytetään jälleen kirjastopalveluita: • stdio.h • scanf(”%i”,&a); • scanf-funktiolle välitetään siis muuttujan, johon tietoa halutaan lukea, muistiosoite. • iostream.h (istream.h) • cin>>a; • Esiteltyjen palveluiden lisäksi kirjastoista löytyy myös muita... KYAMK/J. Ansamäki/Olio-ohjelmointi
Aritmetiikka • Lauseke sellainen osa ohjelmaa, jolla on jokin arvo, esimerkiksi jokin muuttuja tai aritmeettinen lauseke: a+3 • Lauseke ei voi esiintyä koodissa yksinään, vaan se on aina osa jotain lausetta. • Esimerkiksi sijoituslause (aka asetuslause): • a=a+3; • +, -, *, /, %, ++, --, ==, <, >, <=, >=, !=, +=, -=, *=, /= KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 2 • Tee ohjelma, joka kysyy käyttäjältä kahta lukua. • Tämän jälkeen ohjelma tulostaa: • lukujen summan • lukujen erotuksen • lukujen tulon • lukujen osamäärän • ja lukujen jakojäännöksen KYAMK/J. Ansamäki/Olio-ohjelmointi
if • Valinta tekemisen ja tekemättä jättämisen välillä. • Rakenne: • if(lauseke) lause; • jos lauseke on tosi, lause suoritetaan, muutoin lausetta ei suoriteta. • if(lauseke) lause; else lause; • if(lauseke) { koottu lause } else if(lauseke2)… • muuttuja = lauseke ? lauseke2 : lauseke3; KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 3 • Muuta tehtävän 2 ohjelmaa siten, että annetuista luvuista aina suuremmasta vähennetään pienempi. • Myös osamäärää ja jakojäännöstä laskettaessa valitaan jakajaksi luvuista pienempi. • Mikäli jako menee tasan ei ohjelma ilmoita jakojäännökseksi nollaa, vaan että ”jako meni tasan.”. KYAMK/J. Ansamäki/Olio-ohjelmointi
switch • Valinta monesta eri vaihtoehdosta. • Rakenne: • switch(lauseke){ case vakio1: lauseita; break; case vakio2: lauseita; break; … case vakioN: lauseita; break; default: lauseita;} • Lausekkeen arvo selvitetään ja arvoa verrataan case-haaroissa oleviin vakioarvoihin. • Mikäli arvot ovat samat, suoritetaan kyseisen haaran lauseet ja break-komento poistaa kontrollin switch-rakenteesta. KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 4 • Muuta tehtävän 3 koodia niin, että käyttäjä antaa laskutoimituksen kokonaisuudessaan. Esim: • 3%2 • Tämän jälkeen suoritettava operaatio valitaan switch-rakenteessa. KYAMK/J. Ansamäki/Olio-ohjelmointi
for • Definiitti toisto. • Rakenne: • for(silmukkamuuttuja; ehto; päivitys) lause; • Suluissa ilmoitetaan ensin silmukkamuuttuja, joka saatetaan myös alustaa samalla. • Seuraavaksi tarkistetaan onko ehto voimassa. • Jos ei, niin kontrolli siirtyy silmukkarakennetta seuraavaan kohtaan. • Jos on, niin lause suoritetaan. Tämän jälkeen suoritetaan silmukkamuuttujan arvon päivitys ja tarkistetaan ehto seuraavaa toistoa varten. KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 5 • Lisää aiemmin toteutettuun laskin-ohjelmaan potenssiin korotus. • Toteuta potenssiin korotus käyttäen for-silmukkaa. • Lisää ohjelmaan myös lukujen listaaminen yhden askelin pienemmästä arvosta suurempaan arvoon. KYAMK/J. Ansamäki/Olio-ohjelmointi
while (ja do-while) • Indefiniitti toisto. • Rakenne: • while(lauseke) lause; • Lausetta toistetaan niin kauan kun lauseke on tosi. • Lausetta ei suoriteta välttämättä yhtään kertaa. • do lause; while(lauseke); • Toiminta muuten sama, kuin tavallisessa while-lauseessa, mutta nyt ehdon tarkistus on lopussa. • Lause suoritetaan vähintään kerran. KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 6 • Muuta laskin-ohjelmaa niin, että käyttäjä voi antaa erilaisia laskutoimituksia, kunnes päättää lopettaa. KYAMK/J. Ansamäki/Olio-ohjelmointi
continue; Siirrytään seuraavaan toistokierrokseen lauseen keskeltä. break; Siirretään kontrolli switch- tai toistolausetta seuraavaan lauseeseen. const Määritellään arvo vakioksi. auto Automaattinen muistinvarausluokka. extern Kerrotaan koodin ylläpitäjälle, että kyseessä on tämän koodin ulkopuolella toteutettu funktio. Muita sanoja KYAMK/J. Ansamäki/Olio-ohjelmointi
goto Hyppy haluttuun nimiöön: alku:; goto alku; register Nopeasti saatavilla oleva muuttuja. signed Etuliitteellä char-muuttujaan myös neg. arvot mukaan. sizeof Parametrin tilanvaraus tavuina. static Paikallinen muuttuja pysyväksi. typedef Tietotyypin nimeäminen synonyymillä Muita sanoja (2) KYAMK/J. Ansamäki/Olio-ohjelmointi
Muita sanoja (3) • volatile • Määrite kertoo, että kyseistä muuttujaa voidaan muuttaa myös lähdekoodin ulkopuolella. • union • Rakenne, jossa määritellään useampia muuttujia ”päällekkäin”. Varaa muistia pisimmän kenttänsä mukaan. • enum • struct • return KYAMK/J. Ansamäki/Olio-ohjelmointi
Muita tietotyyppejä • Taulu/lista (määritellään myös koko) esim: • int lista[10], matriisi[5][3], kuutio[3][3][3]; • char sana[10], nimilista[10][10]; • Lueteltu tyyppi esim: • enum {ma,ti,ke,to,pe,la,su} paivat; • Rakenteinen tietotyyppi struct • Esimerkki seuraavalla kalvolla. KYAMK/J. Ansamäki/Olio-ohjelmointi
struct #include <iostream.h> struct juttu{ int luku1, luku2; }; void main(){ struct juttu homma; homma.luku1=2; homma.luku2=3; cout<<homma.luku1<<"+” <<homma.luku2<<"=" <<(homma.luku1+homma.luku2); } KYAMK/J. Ansamäki/Olio-ohjelmointi
Funktiot • Funktio koostuu funktion tyypistä, nimestä, parametrien esittelystä ja funktion rungosta. Esim: • intfunktio(int a, int b, char c){ /*koodi*/} • Funktion tyyppi kertoo minkälaista tietoa funktio palauttaa return-lauseella. • Parametrit ovat funktiolle vietävää tietoa. • Funktion paluuarvo palaa kohtaan josta funktiota kutsuttiin. KYAMK/J. Ansamäki/Olio-ohjelmointi
Funktiot (kutsu) • Funktiota kutsutaan antamalla sen nimi ja mahdollisten parametrien arvot suluissa nimen perässä. • Mikäli funktio palauttaa arvon, on myös mietittävä käytetäänkö paluuarvoa ja miten. • Vastaus=Lasku(operandi1, operandi2); KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 7 • Muuta laskinohjelmaa niin, että kaikki laskutoimitukset suoritetaan erillisissä funktioissa. KYAMK/J. Ansamäki/Olio-ohjelmointi
Osoittimet • Osoitinmuuttuja on muuttuja, jolla on muistiosoite arvona. Osoitinmuuttujalla voidaan osoittaa toista muuttujaa ja käsitellä osoitetun muuttujan sisältöä. • Ensin osoitinmuuttuja määritellään int x=1, *p; /* luotiin int-muuttuja x, joka sai arvokseen luvun 1 ja osoitin p, jolla voidaan osoittaa int-tyyppisen muuttujan muistiosoitetta */ p x ? 1 KYAMK/J. Ansamäki/Olio-ohjelmointi
Osoittimet (2) • Sitten osoitinmuuttuja voidaan asettaa osoittamaan toista muuttujaa. Jos muuttujan nimen eteen laitetaan osoiteoperaattori (&-merkki), palautuu kyseisen muuttujan muistiosoite: p=&x; /* Nyt osoitinmuuttuja p on asetettu osoittamaan muuttujan x muistiosoitetta. */ p x 1 KYAMK/J. Ansamäki/Olio-ohjelmointi
Osoittimet (3) • Nyt osoitetun muuttujan sisältöön voidaan viitata sisältöoperaattorilla (*-merkki). Sisältöoperaattoria ei pidä sekoittaa osoitinmuuttujan määrittelyssä käytettävään tyyppimääritteeseen kuuluvaan tähtimerkkiin. *p=15; /* Asetetaan p:n osoittamaan muistiosoitteeseen arvo 15. Tällöin muuttujan x arvoksi (jota p siis osoittaa) muuttuu 15. */ p x 15 KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 8 • Korjaa seuraavaa koodia niin että funktion kutsu vaihtaa muuttujien arvot pääohjelmaan: • void vaihto(int a, int b){ • int apu; apu=a; a=b; b=apu; } • main(){ • int x=3, y=5; printf(”%i %i\n”,x,y); • vaihto(x,y); printf(”%i %i\n”,x,y); } KYAMK/J. Ansamäki/Olio-ohjelmointi
Uudet piirteet • Muuttujien esittely koodin keskellä. • Funktion parametrien oletusarvot. • Funktioiden ylikuormitus. • Referenssimuuttuja (&). • Rivinloppukommentti (//). • Ja oliopiirteet… KYAMK/J. Ansamäki/Olio-ohjelmointi
Funktion parametrien oletusarvot • Funktion parametreille voidaan antaa oletusarvoja: • summa(int a, int b=0, int c=0){ return(a+b+c); } • Mikäli funktion kutsussa ei anneta parametrejä, käytetään oletusarvoja: • int sum=summa(3,2); // a=3,b=2,c=0 => sum=5 • Oletusarvot aina parametrilistan lopussa oleville parametreille. (Mieti miksi...) KYAMK/J. Ansamäki/Olio-ohjelmointi
Funktioiden ylikuormitus • Ohjelmassa voi olla useita samannimisiä funktioita, jotka erotetaan toisistaan parametrien tyyppien ja määrien perusteella: • int Fun(int x){ return(x+3); } • void Fun(float x){ cout<<x; } • int Fun(char x){ return(int(x)); } KYAMK/J. Ansamäki/Olio-ohjelmointi
Referenssi- eli viittausmuuttuja • Muuttujasta saa viittausmuuttujan laittamalla &-merkin muuttujan nimen eteen. • Viittaustyyppiä olevan muuttujan arvo on viittaus johonkin muuttujaan. • Viittausmuuttuja on aina alustettava määrittelyn yhteydessä, jonka jälkeen muuttujaa, johon viitataan ei enää voi vaihtaa. • Sijoitus viittausmuuttujaan sijoittaa arvon itse asiassa viitattavaan muuttujaan. int i; int &ir = i; ir = 2; // i:n arvoksi saadaan kaksi KYAMK/J. Ansamäki/Olio-ohjelmointi
Tehtävä 9 • Muuta tehtävässä 8 tehtyä koodia niin että ohjelmassa käytetään viittausmuuttujia osoittimien sijasta. KYAMK/J. Ansamäki/Olio-ohjelmointi
Olio-ohjelmointi • Perinteiset lähestymistavat • Toimintokeskeinen • Tietokeskeinen • Oliokeskeinen lähestymistapa • Tiedot ja toiminnot yhdistetään yhdeksi kokonaisuudeksi, olioksi. • Keskeisessä asemassa ylläpidettävyys ja uudelleenkäytettävyys. KYAMK/J. Ansamäki/Olio-ohjelmointi
Olio • Aluksi määritellään jokin rakenne jota luotavat oliot noudattavat. Usein tätä rakennetta kutsutaan luokaksi (class). • Esimerkkejä luokista ja olioista: • Kissa - Karvinen • Asiakas - Matti_Meikäläinen • TYÖTK - Heikkinen_Kaija • Luku - Palkka KYAMK/J. Ansamäki/Olio-ohjelmointi
Olioajattelu • Kootaan yhteen liittyvistä tiedoista ja funktioista yhtenäisiä kokonaisuuksia, luokkia. • Luokkiin voi sitten luoda olioita, joilla on luokassa määritellyt tiedot ja funktiot. • Tiedot pyritään pitämään piilossa niin, että vain olio itse voi omilla funktioillaan (palveluillaan) vaikuttamaan niihin. KYAMK/J. Ansamäki/Olio-ohjelmointi
Tiedon piilotus • Kuvissa keltaisella merkityt tiedot ovat ikään kuin piilossa olioiden sisällä; niihin pääsee käsiksi vain olion tarjoamien palveluiden (funktioiden) kautta. • Information hiding KYAMK/J. Ansamäki/Olio-ohjelmointi
Olioiden käyttö • Tiedon piilotuksella pyritään estämään väärinkäytökset. • Oliosta täytyy tietää sen käyttötarkoitus ja ulkoinen rajapinta, jotta sitä voi käyttää. • Ulkoinen rajapinta = olion tarjoamat palvelut (+ mahdolliset julkiset tietojäsenet). KYAMK/J. Ansamäki/Olio-ohjelmointi
Perintä • Olioluokkia on myös mahdollista periyttää aiemmista luokista niin, että periytetty luokka saa perityn luokan ominaisuuksista osan tai kaikki. • Esimerkki MFC:n luokkahierarkiasta: • CObject • CCmdTarget • CWnd • CDialog • Katso ohjeista: hierarchy chart KYAMK/J. Ansamäki/Olio-ohjelmointi
Esimerkkejä perinnästä KYAMK/J. Ansamäki/Olio-ohjelmointi
Esimerkkinä Asiakas-luokka • Tarvittavia tietoja esimerkiksi: • asiakasnumero • nimi ja osoitetiedot, puhelinnumero • bonuskertymä? • Tarvittavia palveluja esimerkiksi: • Tietojen syöttö • Tietojen tulostus • Tietojen muutto, kopiointi, …? KYAMK/J. Ansamäki/Olio-ohjelmointi