Raalprojekteerimine
Euroopa struktuurfondide logo
Automatiseerimise viide Mehhatroonikaseadmete viide Pneumoautomaatika viide Siemens LOGO! viide Siemens S7-1200 viide
(osa 3)

PROGRAMMEERIMINE

Programmeerimiskeeltes kasutatavad elemendid

Muutujad (Variables)

Programmeerimiskeeled võivad koosneda väga erinevatest elementidest, mistõttu on neid üleüldiselt raske kirjeldada.

int muutuja1 = 33;
int muutuja2 = 20;
int muutuja3;
muutuja3 = muutuja1 + muutuja2;

Muutujad on nimelised viited vastavatele arvuti mälus olevatele mälupesadele ja seal olevale väärtusele. Kuigi arvuti pöördub mälupesade poole kasutades nende aadresse, siis inimese jaoks on nende aadresside meelde jätmine ja jälgimine raske. Seetõttu ongi loodud nimelised muutujad, mille nimed asendavad programmis mälupesade aadresse. Samuti on muutujatega seotud andmetüübid, mis määravad mitu mälupesa antud muutuja enda alla võtab ja kuidas seda muutujat käsitletakse. Programmi täitmisel asenuvad muutujad nende väärtustega. See omakorda võimaldab mitmes kohas sama väärtust kasutada ilma, et seda väärtust peaks kõigil kordadel eraldi koodi sisse kirjutama. Veelgi tähtsam on see, et muutujad võimaldavad väärtuste edasi andmist erinevate programmi osade vahel. Näiteks üks programmi osa teeb arvutuse ja paneb selle tulemuse muutujasse. Seejärel saab teine programmi osa sellest muutujast selle väärtuse välja lugeda, et sellega järgmisi operatsioone teha.

Muutujatega on enamasti võimalik:

  • Deklareerimine - nende nime kirjapanemine, andmetüübi ja/või pikkuse määramine, mälu eraldamine ja muutuja vastava mälupesaga sidumine
  • Lugemine - saab lugeda nende väärtust, nende pikkust, mäluaadressi, millele need viitavad või muid parameetreid
  • Väärtuste omistamine - neile võib omistada teiste muutujate väärtusi, operatsioonide tulemusi või konstante

Andmetüübid (Data Types)

int   muutuja1 = 211;
float muutuja2 = 2.6;
char  muutuja3 = 'g';

Andmetüübid on andmete klassifikatsioonid. Need võivad määrata andmete hulga, tähenduse ning selle, mis vormis andmeid hoitakse. Nende ülesanne on tekitada andmetele teatud reeglid, et erinevad programmi osad mõistaks neid andmeid ühte moodi. Andmetüübid ise andmeid ei hoia. Selleks deklareeritakse muutujad, millele määratakse mingi andmetüüp. Muutjale saab omistada sellele andmetüübile vastava väärtuse ehk muutuja defineerida. Samuti aitab andmetüüpide kasutamine leida vigu, kui mõne andmetüübiga muutujaga üritatakse sooritada operatsiooni, mis ei ole antud andmetüübiga võimalik.

See, kas andmetüüp esindab täisarvu, reaalarvu, tähemärke või veel midagi on sisuliselt vaid inimeste jaoks tähtis. Protsessori ja mälu jaoks on need kõik ühesugused numbrid, olgugi, et nende töötlemine võib erinevalt toimuda. Kõikides programmeerimiskeeltes ei ole andmetüüpe. Samuti varieerub andmetüüpide rohkus ja keerukus erinevates keeltes.

Avaldised (Expressions)

integer1 = (40 + muutuja2) * 2 ;
word1 |= 1 << 3 ;

Avaldised määravad, mis tehted ja millises järjekorras on vaja väärtuse leidmiseks täita. Avaldised koosnevad operandidest, operaatoritest ehk tehtemäkidest, olenevalt keelest ka sulgudest, mis määravad tehtejärjekorra. Avaldise tulemuseks on alati mingisugune väärtus.

Operaatorid (Operators)

Operaatorid ehk tehtemärgid on need, mis määravad ära, millist operatsiooni ehk tehet mingite väärtustega teha - olgu operandideks siis muutujad või konstandid. Operaatorid, õigemini erinevad tehted ja neile vastavad märgid võivad erinevates keeltes vähesel määral varieeruda, kuid enamasti saab operaatoritega teha lihtsamaid tehteid, mida arvutiprotsessorid otseselt ise teha suudavad, nagu aritmeetikatehted: liitmine (+), lahutamine (-), korrutamine (*), jagamine (/), jagamisjäägi leidmine (%) ja loogikatehted: AND (&), OR (|) ning nihutamine (<<, >>).

Üks tähtsamaid operaatoreid on omistamisoperaator (= või :=), mis võimaldab mingile muutujale uue väärtuse anda. Mõnes keeles on omistusoperaatorid kombineeritud ka aritmeetika ja loogikaoperaatoritega võimaldades sooritada tehteid muutujatega, millele ka tehte tulemus omistatakse. Näiteks omistamine liitmisega (+=) liidaks omistatavale muutujale mingi väärtuse.

Lisaks on kasutusel ka võrdlusoperaatorid, nagu võrdne (==), mittevõrdne (!= või ><), suurem kui (>), väiksem kui (<), suurem või võrdne (>=), väiksem või võrdne (<=).

Operaatorid ei pea olema tingimata ka märgilised vaid võivad olla ka sõnalised. Paljud keeled kasutavad mõlemaid.

Laused (Statements)

Laused jaotuvad üldjoones järgnevalt:

  • maasikate_kogus = 40;
    vaarikate_kogus = 60;
    marjade_kogus = maasikate_kogus + vaarikate_kogus;

    Omistamislaused (Assignment statement)
    Omistamislausega antakse mingile muutujale uus väärtus ehk see muutuja väärtustatakse.
    Olenevalt keelest saab muutujale omistada nii konstantseid kui mõne teise muutuja väärtusi ning avaldiste ja funktsioonide tulemusi.
    Üldine omistamislause struktuur on: <muutuja nimi> <omistamise märk> <avaldis, muutuja või konstant>

  • Tingimuslaused (Conditional statement)
    Tingimuslaused on juhtlaused, mis võimaldavad kirja panna, mis tingimustel mingeid järgnevaid operatsioone tehakse kasutades selleks võrdlusoperaatoreid.
    Tüüpilisemad tingimuslausete konstruktsioonid on:

    • if ( muutuja == 2 ){
          printf("Tingimus osutus tõeseks");
      }

      If-Then - Kui tingimus on täidetud, siis tehakse midagi.

      Näiteks kõrvalolevas näites kontrollitakse, kas muutuja nimega muutuja väärtus on võrdne kahega. Kui on, siis kutsutakse välja funktsioon printf, mis väljastab selle sisendisse antud teksti "Tingimus osutus tõeseks". Viimase asemel võib olla muidugi mistahes muu operatsioon.

    • if ( x > y ){
          printf("X on suurem, kui Y");
      }else{
          printf("X ei ole suurem kui Y");
      }

      If-Then-Else - Kui tingimus on täidetud, siis tehakse midagi, kui ei ole, siis tehakse midagi muud.

      Näiteks kõrvalolevas näites kontrollitakse, kas muutuja x väärtus on suurem, kui muutuja y väärtus. Kui on, siis kutsutakse välja funktsioon printf, mis väljastab teksti "X on suurem, kui Y". Kui aga x ei ole suurem, kui y, siis kutsutakse välja funktsion printf, mis sedakorda väljastab teksti "X ei ole suurem kui Y".

    • if inimeste_hulk < 40:
          print inimeste_hulk, " inimest ei ole piisav"
      elif inimeste_hulk > 300:
          print inimeste_hulk, " inimest on liiga palju"
      else:
          print inimeste_hulk, " inimest on sobiv"

      Else-if - Kui tingimus on täidetud, siis tehakse midagi, kui ei ole, siis kontrollitakse järgmist tingimust. Kui järgmine tingimus on täidetud, siis tehakse midagi, kui ka see ei ole täidetud, kontrollitakse järgmist tingimust jne. Enamus keeltes saab else-if konstruktsioonile isada ka else.

      Kõrvalolevas python keele näites kontrollib programm, kas inimeste hulk ürituse korraldamiseks on sobiv. Kui inimesi on vähem kui 40, näiteks 25, siis väljastatakse teade: "25 inimest ei ole piisav". Kui inimesi on üle 300, siis antakse teada, et inimesi on liiga palju. Kui inimeste arv on 40..300, siis väljastatakse teade, et inimeste arv on sobiv.

    • switch (paeva_nr) {
          case 1: printf("Esmaspäev"); break;
          case 2: printf("Teispäev"); break;
          case 3: printf("Kolmapäev"); break;
          case 4: printf("Neljapäev"); break;
          case 5: printf("Reede"); break;
          case 6: printf("Laupäev"); break;
          case 7: printf("Pühapev"); break;
          default: printf("Päeva nr %d pole olemas", paeva_nr);
      }

      Switch Case - Kui switch taha kirjutatud muutuja või avaldise väärtusele leidub allpool võtmesõna case taga sobiv vaste, siis täidetakse sellele järgnevad laused. Kui ette tuleb võtmesõna break, siis jätkatakse programmi täitmist pärast switch ploki lõppu. Kui ühelegi case võtmesõnale ei järgne muutuja või avaldise väärtusele vastavat väärtust, siis programmi täitmist jätkatakse switch plokis olevast default võtmesõnast. Kui ka see puudub, siis jätkatakse pärast switch ploki lõppu oleva programmikoodi täitmist.

      Kõrvalolevas näites väljastatakse päevanumbrile vastav päeva nimetus. Kui sisendiks on number, millele ei ole vastet, siis öeldakse, et sellist päeva numbrit pole olemas.

  • Korduslaused ehk tsüklilaused (Looping statements)
    Korduslaused on laused, kus mingit koodiplokki täidetakse senikaua, kuni mingi tingimus täidetud saab. Seejärel väljutakse korduslause plokist. Korduslausete kasutamisel on oht, et tekib lõputu tsükkel (eriti while puhul), mis tähendab, et mõne programmeerimisvea tõttu võib arvuti korduslause plokki lõputult täitma jääda, kuna tingimus, mis selle lõpetamiseks vajalik on ei täitu kunagi.
    Erinevates keeltes võivad alltoodud korduslausete võtmesõnad ja nende kasutus mingil määral erineda.

    • int i;
      for (i = 1; i <= 10; i++) {
          printf("%d", i);
      }

      For - Määratud kordus koos loenduriga toimiva muutujaga. Kordab koodiplokki loendades numbrist numbrini. Üldvorm on sellel umbes selline: FOR <initsialiseerimine> <avaldis> <tegevus> DO
          <tegevus>
      Esimeses osas määratakse lugevale muutujale algväärtus. Mõnes keeles on võimalik selle koha peal ka täiesti uus muutuja deklareerida. Teises osas on avaldis, mille tulemus peab olema tõene, et tsükkel jätkaks kordamist. Kolmandas osas määratakse, mida teha lugemiseks kasutatava muutujaga. Kas selle väärtust suurendada või vähendada ja kui palju. Viimaseks osaks jääb koodiplokk, mida korduvalt täidetakse.

      Kõrvalolevas näites deklareeritakse enne for kasutamist muutuja i. For tsükli jaoks on märgitud, et lugemine algab 1-st, koodiplokki täidetakse seni kui muutuja i väärtus on väiksem või võrdne 10-ga (niipea kui on suurem, enam ei täideta) ja viimaks on märgitud, et iga läbitud tsükliga suurendatakse muutujat i ühe võrra. Korratav kood väljastab iga kord muutuja i väärtuse. Seega selle tulemusena väljastatakse numbrijada: 12345678910.

    • nimekiri=["maasikas", "vaarikas", "mustikas"];
      for v in nimekiri:
          print "%s on mari." % v.title();

      For each - Kordus, mis täidab koodiploki iga nimekirjas või massiivis oleva liikme kohta. Sellega pole otseseid loendavaid muutujaid seotud.

      Kõrvalolevas python näites on on nimekiri marjadest. For each tsükkel (Pythonis tegelikult for in) kordab sellele järgnevat koodiplokki iga nimrkirja liikme (marja) kohta ja paneb iga liikme väärtuse üks haaval muutujasse v. Korratav lause teeb title() funktsiooniga iga liikme (marja) esitähe suureks ning seejärel väljastab selle print protseduuriga, lisades marja nimele lõppu "on mari.". Tulemuseks on:
      Maasikas on mari.
      Vaarikas on mari.
      Mustikas on mari.

    • int x = 1;
      while (x < 11) {
          printf ("%d", x);
          x++;
      }

      While - Eelkontrolliga kordus. Koodiplokki täidetakse senikaua uuesti ja uuesti kui whileile järgneva avaldise väärtus on tõene (1). Avaldise väärtust kontrollitakse vahetult enne järgmise tsükli täitmist. Kui avaldise väärtus osutub vääraks (0), siis whilei sisse jäävat koodiplokki enam järgmist korda täitma ei hakata ja programmi täitmist jätkatakse pärast while koodiploki lõppu.

      Kõrvalolevas näites deklareeritakse esmalt muutuja x andmetüübiga int ja omistatakse sellele väärtus 1. Seejärel tuleb while korduslause, mis on märgitud kestma senikaua kui x väärtus on väiksem kui 11. Printf protseduur väljastab iga kordustsükli ajal muutuja x väärtuse. Koodirida x++; suurendab iga kordustsükliga muutujat x ühe võrra. Selle kordustsükli tulemusena väljastatakse numbrijada: 12345678910.

    • do {
          printf("%d", x);
          x++;
      } while(x < 11);

      Do-While - Järelkontrolliga kordus. Sarnaselt while korduslausele kordab do-while koodiplokki senikaua kui selle kontrollavaldise väärtus on tõene. Mis seda aga whileist eristab on see, et avaldist kontrollitakse pärast igat kordustsüklit, seega esimene kord täidetakse do koodiplokk olenemata sellest, kas avaldise väärtus on tõene või ei.

  • Katkestuslaused
    goto, jump, label, break, continue

Alamprogrammid (Subroutines)

Alamprogrammid (siia kuuluvad ka protseduurid, funktsioonid, rutiinid või meetodid) on korduvaks kasutamiseks mõeldud kindla ülesandega programmilõgud, mida kasutavad suurema programmi teised osad. Neid kutsutakse programmi teistest osadest välja iga kord, kui on vaja taastäita mingit kindlat ülesannet. See vähendab programmeerimise ajakulu (sest ühte asja pole vaja mitu korda kirjutada), teeb programmi lühemaks, loetavamaks ja lihtsamalt hallatavamaks.

Alamprogrammidel võivad olla sisend- ja väljundmuutujad, mille kaudu võib anda neile töötlemiseks andmeid ja mille kaudu nad neid ka tagastavad. Samuti võivad need pärast välja kutsumist tagastada mingi väärtuse. See varieerub erinevates programmeerimiskeeltes, eriti tööstusautomaatikas.

Alamprogrammide siseselt on enamasti kasutusel lokaalsed muutujad, mida teised programmiosad kasutada ei saa ja mis hävivad pärast alamprogrammi töö lõppu. Alamprogrammides saab enamasti programmi globaalsete muutujate poole pöörduda.

Alamprogrammid liigituvad üldiselt järgmiselt (kuigi nende terminite tähendus võib erineda olenevalt programmeerimiskeelest):

  • Funktsioon (Function) on alamprogramm, mis tagastab oma töö tulemusena väärtuse, enamasti on sellega seotud andmetüüp.
  • Protseduur (Procedure) on alamprogramm, mis ei tagasta oma töö tulemusena väärtust.
  • Meetod (Method) on objektiorienteeritud programmeerimises funktsioon, mis on seotud kindla objektiga.
Creative Commons Licence
"Raalprojekteerimine" by Eduard Brindfeldt and Urmo Lepiksoo is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Estonia License .