Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia
Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko on hankalaa. Yksinkertaisiin muuttujiin pystytään tallettamaan ainoastaan yksi arvo Monissa algoritmeissa on tarpeellista tallettaa monta samantyyppistä arvoa saman tunnuksen alle Talletetaan esim. n. määrä int-tyyppisiä arvoja listaan.
Taulukko Taulukko on kokoelma yksinkertaisia muuttujia, jotka ovat samaa tyyppiä Taulukolle annetaan yksi nimi Taulukon yksittäisiin muuttujiin (alkioihin) viitataan indeksillä Indeksi on alkion järjestysnumero taulukon sisällä
Taulukko-esimerkki Haluamme tallentaa usemman opiskelijan tenttipisteet. Ohjelman teko mennee hankalaksi, jos joudumme jokaiselle opiskelijalle tekemään oman muuttujan: opiskelijaa_tenttipisteet = 12; opiskelijab_tenttipisteet = 18;... Tilanteessa on järkevää käyttää taulukkoa. Taulukon määritelyssä annetaan normaalin tapaan taulukon nimi ja tietotyyppi. Tietotyyppi määrittelee nyt minkätyyppisiä muuttujia taulukkoon tullaan asettamaan.
Tenttipisteet Taulukko-esimerkki [0] [1] [2] [3]... [n-1] 23 18 7 22... 23 Taulukon ensimmäinen alkio tenttipisteet[0] Kymmenes taulukon alkio on tenttipisteet[9] Jos taulukon koko on n, viimeinen alkio löytyy indeksistä n-1
tenttipisteet[] Taulukko esimerkki indeksi [0] [1] [2] [3] alkio 23 18 7 22 Indeksillä 3, arvo on 22 Indeksillä 1, arvo on 18 Taulukon alkiot tavallisia muuttujia
Taulukko ja muistinhallinta Taulukko on yksinkertaisesti joukko muistipaikkoja, joista jokaiseen voidaan tallentaa samantyyppinen muuttuja. Taulukon luonti: int tenttipisteet[50]; Nyt muistista on varattu 50 kappaleelle kokonaislukuja tilaa. Taulukon arvoja usein kutsutaan alkioiksi. Taulukon koko on 50
Taulukon alkioon viittaaminen Taulukon yksittäiseen alkioon viitataan käyttämällä kokonaislukua. Tätä kokonaislukua kutsutaan indeksiksi. Taulukon ensimmäinen indeksi on 0. indeksi [0] [1] [2] [3]... [n-1] alkio 23 18 7 22... 23
Taulukon käyttö int tenttipisteet[3]; tenttipisteet[0] = 12; tenttipisteet[1] = 18; tenttipisteet[2] = 24; cout << tenttipisteet[0] << endl; cout << tenttipisteet[1] << endl; cout << tenttipisteet[2] << endl;
Taulukon käyttö int tenttipisteet[3]; tenttipisteet[0] = 12; tenttipisteet[1] = 18; tenttipisteet[2] = 24; int i=0; while(i < 3) { cout << tenttipisteet[i] << endl; i++; }
Taulukon käyttö int tenttipisteet[3]; tenttipisteet[0] = 12; tenttipisteet[1] = 18; tenttipisteet[2] = 24; for(int i=0; i<3; i++) { cout << tenttipisteet[i] << endl; }
Yleisiä virheitä int tenttipisteet[3]; // mitä tulostaa? cout << tenttipisteet[0] << endl; // mitä tulostaa? cout << tenttipisteet[3] << endl; // mitä tulostaa? cout << tenttipisteet << endl;
Taulukon alustaminen int tenttipisteet[3] = {12, 24, 15}; int tenttipisteet[7] = {12, 24, 15}; int tenttipisteet[3] = {}; int tenttipisteet[] = {12, 24, 15};
Taulukkoanimaatio
Merkkijonot
C++ ja merkit Olemme käsitelleet perustietotyypit (int, char, double, float..) ja taulukon. char - muuttujaan tallennetaan yksi merkki (esim. 'a') Entä useammat merkit? C++ tarjoaa kaksi vaihtoehtoa: 1) C - tyyliset merkkijonot 2) string - luokka
C-tyyliset merkkijonot C-tyylinen merkkijono: taulukollinen merkkejä (char) + lopetusmerkki Lopetusmerkki on '\0' ja tätä kutsutaan usein nullmerkiksi
Kokonaislukutaulukko int luvut[5] = {1,2,3,4,5}; indeksi [0] [1] [2] [3] [4] alkio 1 2 3 4 5
Kokonaislukutaulukko int luvut[7] = {1,2,3,4,5}; [0] [1] [2] Koko suurempi kuin annettujen lukujen määrä [3] [4] [5] Huom! Loput menevät nolliksi! [6] 1 2 3 4 5 0 0
Merkkitaulukko char vokaalit[5] = {'a','e','i','o','u'}; vokaalit[] indeksi [0] [1] [2] [3] Lopetusmerkki [4] puuttuu alkio 'a' 'e' 'i' 'o' 'u'
Koko suurempi kuin annettujen merkkien Merkkitaulukko määrä char nimi[7] = {'p','e','k','k','a'}; Loput tilat täytetään null-merkeillä [0] [1] [2] [3] [5] [6] [7] 'p' 'e' 'k' 'k' 'a' '\0' '\0'
Merkkitaulukko char nimi[7] = "pekka"; [0] [1] [2] [3] [5] [6] [7] 'p' 'e' 'k' 'k' 'a' '\0' '\0'
char nimi[] = "pekka"; Merkkitaulukko [0] [1] [2] [3] [4] [5] 'p' 'e' 'k' 'k' 'a' '\0'
Tuloste char nimi[] = "Pekka"; cout << nimi << endl; // tulostaa "Pekka"!
Syöte const int MAXPITUUS = 100; char teksti[maxpituus] = {}; cout << "Anna nimesi" << endl; cin.getline(teksti, MAXPITUUS);
cin vs. cin.getline(..) cin >> teksti; Lukee käyttäjän syötettä ensimmäiseen tyhjään merkkiin asti (esim. välilyönti). cin.getline(teksti, MAXPITUUS) Lukee ja tallentaa kokonaisen rivin merkkejä, välilyönnit mukaanlukien.
Merkkijonojen vertailu? const int MAXPITUUS = 100; char teksti1[maxpituus] = {}; char teksti2[maxpituus] = {}; cout << "Anna mj1: " << endl; cin.getline(teksti1, MAXPITUUS); cout << "Anna mj2: " << endl; cin.getline(teksti2, MAXPITUUS); if(teksti1 == teksti2) // EI TOIMI! { cout << "samat ovat" << endl; }
Merkkijonojen vertailu ei näin: taulukko1 == taulukko2 vaan näin: taulukko1[0] == taulukko2[0] && taulukko1[1] == taulukko2[1] &&...
Merkkijonojen vertailu bool samat = true; int i = 0; while(teksti1[i]!= '\0') { if(teksti1[i]!= teksti2[i]) { samat = false; } i++; } if(teksti1[i]!= teksti2[i]) { samat = false; } if(samat) { cout << "samat ovat" << endl; }
Paremmat merkkijonot: string C++-kielessä parempi vaihtoehto C-tyyppisille merkkijonoille: string - luokka Emme ole käsitelleet kurssilla luokkatyyppejä (emmekä tulekaan käsittelemään). Tämä ei kuitenkaan haittaa, sillä string-luokan käyttö on samannäköistä kuin perustietotyyppien. string ei ole perustietotyyppi vaan luokka. string-luokan ilmentymiä sanotaan olioiksi (ei muuttujiksi) string-luokan käyttöön otto: #include <string>
string olioiden käsittely string merkkijono; // tyhjä merkkijono string mj1 = "merkkijononi"; string mj2("merkkijononi"); cout << mj2.length() << endl; string mj3(6, 'z'); // zzzzzz string mj4 = mj3;
string olioiden käsittely string a = "Kalle"; string b = "tervehtii"; string c = a + " " + b;
Yksittäisten merkkien käsittely string a = "Kalle"; for(int i=0; i<a.length(); i++) { cout << a[i] << endl; }
Syötteen ottaminen string a; // Huom! ei tarvitse huolehtia lukumäärästä getline(cin, a);
Merkkijonojen vertailu string-olioita voidaan vertaillu myös == ja!= vertailuoperaattoreiden avulla. string a = "Kalle"; string b = "Kalle"; if(a == b) {...}