(H) Merkkijonon jakaminen osiin

Tavoite: Harjoittelen string- ja vector-tyyppien käyttämistä.

Ohjeita: Hae ohjelmakoodipohja: templates/04/split/ -> student/04/split/.

Toteuta funktio split, joka jakaa parametrina annetun merkkijonon erotinmerkkien kohdalta osiin ja palauttaa osat vector-muuttujaan tallennettuna. Funktion parametrit ovat:

  1. merkkijono, joka jaetaan
  2. erotinmerkki
  3. totuusarvo, joka kertoo, halutaanko tyhjät osat (tyhjät merkkijonot) ohittaa, oletusarvo on false. (Jos tyhjät osat halutaan ohittaa, funktiolle välitetään arvo true.)

Tyhjä osa syntyy, mikäli merkkijonossa on kaksi erotinmerkkiä peräkkäin, tai mikäli merkkijono alkaa tai päättyy erotinmerkillä. Esimerkiksi jos erotinmerkki on : ja jaettava merkkijono on A:B::C: niin erotellut osat ovat “A”, “B”, “”, “C” ja “”. Mikäli erotimerkkejä on useampi peräkkäin, niin jokaisesta välistä, jossa ei ole merkkejä syntyy uusi tyhjä osa. Mikäli tyhjiä osia ei haluta mukaan niin, käyttäjälle ei palauteta osia, joissa ei ole yhtään merkkiä.

Lisää ohjelmakoodipohjaan vain funktion toteutus. Älä muokkaa main-funktiota mitenkään. Kun funktio on toteutettu, pääohjelman pitää toimia seuraavasti:

Enter a string: a::bc:def::hijlkm
Enter the separator character: :
Splitted string including empty parts:
a

bc
def

hijlkm
Splitted string ignoring empty parts:
a
bc
def
hijlkm

Hiukan hankalammin tulkittava esimerkki, joka sisältää välilyöntejä eroteltavan merkkijonon alussa ja lopussa, ja lisäksi erotinmerkkinä:

Enter a string:    A B   C   D E
Enter the separator character:
Splitted string including empty parts:



A
B


C


D
E



Splitted string ignoring empty parts:
A
B
C
D
E

Vinkkejä tehtävän tekemiseen:

  • Oletusarvoisista parametreista (sekä kuormittamisesta) kerrottiin luvussa 2.5 Funktiot (Parametrien määrä ja tyypit).
  • Kannattaa kerrata materiaalista 2.6 Merkkijonot ja merkit ja erityisesti kohta “Hyödyllisiä C++-merkkijono-operaatioita”. Tehtävässä voi hyödyntää useita string-tyypin valmiiksi toteutettuja metodeja.
  • Ongelma kannattaa jakaa mielessään osiin, jotka toteuttaa yksi kerrallaan. Tässä tehtävässä osia voisivat olla muun muassa erotinmerkin löytäminen ja osan erottaminen.
  • Jos päädyt sellaiseen ratkaisuun, jossa käyt merkkijonon indeksejä läpi toistorakenteessa, käytä indeksimuuttujan tietotyyppinä string::size_type, älä int.
  • Olemme useammassakin yhteydessä välittäneet vector-muuttujan funktiolle viiteparametrina arvoparametrin sijaan, jotta ohjelmakoodi olisi tehokkaampaa. Tässä tehtävässä voi tulla mieleen välittää paluuarvona viite vector-muuttujaan. ÄLÄ TEE NÄIN! Muistele, mitä funktiossa määritellyille paikallisille muuttujille tapahtuu, kun funktion suoritus päättyy.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.