C++-ohjelmoinnin aloittaminen

Kontrollirakenteet ja operaattorit


Kuten Pythonissa, myös C++:ssa on kontrollirakenteita valintaa ja toistoa varten. Tässä kohdassa vertaillaan ensin kielten if- ja while-lauseita. Sen jälkeen tutustutaan yhteen tapaan käyttää C++:n for-silmukkaa ja esitellään lyhyesti C++:n operaattoreita.

Vertaile seuraavien esimerkkiohjelmien avulla C++:n valinta- ja silmukkarakenteita Pythonin vastaaviin:

Python

def main():
    salaluku = int(input("Syötä salainen luku: "))
    arvattu_luku = -1
    arvausten_maara = 0

    while salaluku != arvattu_luku:
        arvattu_luku = int(input("Anna arvaus: "))
        arvausten_maara += 1

        if arvattu_luku < salaluku:
            print("Arvaus on liian pieni!")
        elif arvattu_luku > salaluku:
            print("Arvaus on liian suuri!")
        else:
            print("Arvasit oikein!")

    print("Arvausten lukumäärä: ", arvausten_maara)

main()

C++

#include <iostream>

using namespace std;

int main() {
    int salaluku = 0;
    cout << "Syota salainen luku: ";
    cin >> salaluku;

    int arvattu_luku = -1;
    int arvausten_maara = 0;

    while (salaluku != arvattu_luku) {
        cout << "Anna arvaus: ";
        cin >> arvattu_luku;

        arvausten_maara += 1;

        if (arvattu_luku < salaluku) {
            cout << "Arvaus on liian pieni!" << endl;
        } else if (arvattu_luku > salaluku) {
            cout << "Arvaus on liian suuri!" << endl;
        } else {
            cout << "Arvasit oikein!" << endl;
        }
    }

    cout << "Arvausten lukumaara: "
         << arvausten_maara << endl;
}

Puolipisteitä, sulkeita ja muita syntaktisia eroja lukuun ottamatta esimerkit toimivat samalla tavalla. Tämä havainnollistaa, että ohjelmoinnin käsitteet, kuten toisto, säilyvät samoina ohjelmointikielestä toiseen.

Aaltosulkeet C++:ssa

C++:ssa lohkoa ympäröivät aaltosulkeet voidaan jättää pois, jos lohkossa on vain yksi käsky. Esimerkiksi:

int i = 0;
while (i < 10) {
    ++i;
}
cout << i << endl;

voidaan lyhentää muotoon:

int i = 0;
while (i < 10)
    ++i;
cout << i << endl;

Aaltosulkeet kannattaa yleensä säilyttää, sillä niiden unohtuminen voi aiheuttaa vaikeasti löydettäviä virheitä. Ilman aaltosulkeita vain seuraava käsky kuuluu silmukkaan, vaikka seuraavat rivit olisi sisennetty näyttämään lohkon osilta:

int i = 0;
while (i < 10)
    ++i;
    cout << i << endl;  // Suoritetaan vain kerran silmukan jälkeen
cout << "Hommat jatkuvat silmukan jälkeen" << endl;

Ensimmäinen cout-käsky ei kuulu silmukkaan. Aaltosulkeiden puuttuessa lohkoon kuuluu vain yksi käsky, tässä tapauksessa ++i;. Ensimmäinen tulostus suoritetaan kerran, kun silmukka päättyy ja suoritus jatkuu seuraavasta käskystä.

C++-kääntäjä ei päättele käskyjen ryhmittelyä rivinvaihdoista. Aaltosulkeet voidaan sijoittaa esimerkiksi näin:

if (x) {
    ...
}

Tai näin:

if (x)
{
    ...
}

Kumpikin tyyli käy. Ole johdonmukainen ja käytä samaa tyyliä koko ohjelmassa, erityisesti kontrollirakenteissa.

Varoitus: poikkeukset

Pythonissa olet ehkä käyttänyt poikkeusmekanismia eli try-rakennetta esimerkiksi ehtolauseen sijaan. Älä käytä C++:n poikkeusmekanismia tällä kurssilla, ellet varmasti osaa sitä. Sen käyttö opetetaan vasta seuraavalla ohjelmointikurssilla.

for-silmukka

C++:ssa on for-silmukka, jolla on useita käyttötapoja. Se sopii erityisesti tietorakenteiden alkioiden läpikäyntiin. Näitä käyttötapoja käsitellään myöhemmin, kun tietorakenteet ovat tuttuja.

Voit käyttää for-silmukkaa jo tämän kierroksen tehtävissä kokonaislukuvälin läpikäyntiin:

for (int luku = 5; luku < 10; ++luku) {
    cout << 9 * luku << endl;
}

Tämä vastaa seuraavaa Python-rakennetta:

for luku in range(5, 10):
    print(9 * luku)

Silmukan suorituksen ohjaaminen

Silmukan suoritus päättyy, kun sen ehto muuttuu epätodeksi. C++:ssa on myös muita käskyjä, joilla silmukan suoritusta voi ohjata:

  • break; lopettaa sisimmän silmukan ja siirtää suorituksen silmukan jälkeiseen käskyyn. Sisäkkäisissä silmukoissa ulompi silmukka jatkaa suoritustaan.
  • continue; ohittaa silmukan nykyisen kierroksen loput käskyt ja siirtyy seuraavalle kierrokselle, jos silmukan ehto on yhä voimassa.
  • return; lopettaa koko funktion suorituksen ja palaa kutsukohtaan. Jos se suoritetaan silmukan sisällä, myös silmukka päättyy. Paluuarvollisen funktion on palautettava arvo.

Vertailu- ja sijoitusoperaattorit

Esimerkkien ehdoissa käytetään vertailuoperaattoreita. C++:n operaattorit ==, !=, <, <=, > ja >= tarkoittavat samaa kuin Pythonin vastaavat operaattorit. C++:ssa on myös sijoitusoperaattorit +=, -=, *= ja /=.

Inkrementointi- ja aritmeettiset operaattorit

Inkrementointioperaattori ++ kasvattaa muuttujan arvoa yhdellä. Dekrementointioperaattori -- vähentää arvoa yhdellä. Käytä näitä operaattoreita mieluiten yksinään omassa käskyssään, sillä yhdistäminen muihin operaattoreihin voi johtaa yllättäviin tuloksiin.

C++:ssa ovat myös tavalliset yhteen-, vähennys-, kerto- ja jakolaskuoperaattorit. Operaattori % laskee kokonaislukujen jakojäännöksen. Kokonaisluvuilla operaattori / suorittaa kokonaislukujen jakolaskun: esimerkiksi 7 / 3 on 2 ja 1 / 5 on 0.

Loogiset operaattorit

C++:n loogiset operaattorit vastaavat Pythonin operaattoreita:

  • looginen negaatio: Pythonin not a vastaa C++:n !a
  • looginen ja: Pythonin a and b vastaa C++:n a && b
  • looginen tai: Pythonin a or b vastaa C++:n a || b

&& ja || ovat oikosulkuoperaattoreita. Jälkimmäistä operandia ei suoriteta, jos tulos tiedetään jo ensimmäisen perusteella. Esimerkiksi false && a on epätosi arvosta a riippumatta, ja true || a on tosi arvosta a riippumatta.

Loogisten operaattorien && ja || biteittäiset vastineet ovat & ja |. Ne vertailevat operandien bittejä. C++:ssa on myös biteittäinen ^-operaattori. Tällä kurssilla ei tarvitse käyttää bittioperaattoreita.

C++:ssa ei ole potenssiin korottavaa operaattoria.

Video: inkrementointioperaattori

C++:n inkrementointioperaattori (++) on kätevä, mutta sen käyttöön liittyy sudenkuoppia.

Linkki videoon