Sissejuhatus programmeerimisse

Allikas: Hinnavaatlus.ee Wiki
Redaktsioon seisuga 18. august 2007, kell 18:29 kasutajalt Ho Ho (arutelu | kaastööd) (→‎Päisefailid)
(erin) ←Older revision | Current revision (erin) | Newer revision→ (erin)
Mine navigeerimisribaleMine otsikasti


Programmeerimine

Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.

Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.

Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.

Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.

Mõisted

Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.

  • Muutuja – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub.
  • Konstant – muutumatu muutuja. Näiteks on konstant matemaatiline tähis pii, ehk 3,1415926535897932384626433832795. See ei muutu. Või arv "e" 2.71828. Üldiselt on konstant mistahes arv-, sõne- (string) või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta.
    Süsteemsed konstandid on eeldefineeritud konstandid, mida pole vaja eraldi defineerida.
    Tambovi konstant on arv mis liidetakse või lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus. Tambovi konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.
  • Massiiv (array) – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv.
  • Kommentaar/kommenteerima – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.

Programmeerimiskeeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni, ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).

C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.

Muutuja

Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi, ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.

Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.

Int (ehk täisarv):

Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.

16bitised süsteemid – vahemikus -32 768 kuni 32 767
32bitised süsteemid – vahemikus -2 147 483 648 kuni 2 147 483 648
64bitised süsteemid – vahemikus -9 223 372 036 854 775 808 kuni 9 223 372 036 854 775 807

Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65536 kohta, siis 32bitised protsessorid (Intel 386 alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.

Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades __int8, __int16, __int32 ja __int64 või siis C99 standardile vastavalt int8_t, int16_t, int32_t ja int64_t

Mis nende vahe on? Mälukohtade tarbimise vahe. Väikseim mäluühik millega protsessorid ühes tükis opereerivad on bait. 8 bitti moodustavad ühe baidi. Seega 8 bitine muutuja võtab ühe baidi, 16 bitine kaks, 32 bitine 4 ning 64 bitine 8 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Selles, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine. Samuti võtab suuremate arvudega opereerimine kohati rohkem ressursse. Kuigi ka väiksemate arvudega võib olla keerukam arvutada, kui mõnede suurematega. Näiteks 16bit protsessoril on 16bit muutujad kiiremad kui 32bit ning 8bit. 32bit prosede peal on 32bit kiireimad kui 8, 16 ja 64bit. Samas enamasti on kiirusevahed üsnagi tühised ning nende pärast pole mõtet muretseda enne, kui on näha et programm töötab liiga aeglaselt ning midagi on vaja optimeerida.

Veel on olemas muutujatüübid nagu short ja long. Short ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus -32 768 kuni 32 767 ning long on 32bitine täisarv vahemikus -2 147 483 648 kuni 2 147 483 648.

Lisaks saab eelpool mainitud short’ile ja long’ile lisada eesliited unsigned. Unsigned short (kui muidu on signed short) võib olla vahemikus 0 kuni 65 535 ning unsigned long vahemikus 0 kuni 4 294 967 295. Samuti võib ka kõigile teistele täisarvu tüüpidele ette lisada nood signed’ ja unsigned’ täpsustused. Näiteks lisades 8 bitisele char tüüpi muutujale ette unsigned’ siis on tulemuseks 8 bitine märgita täisarv mis võib omada väärtusi 0 kuni 255.

Seejärel ujukomaarvud float, double ja long double. Float on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on 3,4*10+/-38. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks 1,7*10+/-308. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: 1,2*10+/-4932.

Kuna ujukomasid ei saa hoida mälus täpselt (pole piisavalt bitte) siis on nende poolt esitatavate väärtuste vahe teatud valemi järgi osadeks ning vastupidiselt matemaatika tunnis õpitule ei saa kahe reaalarvu vahele panna lõpmatut hulka reaalarve. Lisaks veel tasub meeles pidada, et ujukoma arvud esitatakse selliselt, et kõige suurem täpsus (kõige tihedamalt väärtusi) on nulli ümbruses. Mida suuremaks lähevad reaalarvude väärtused seda suuremaks lähevad kahe järjestikuse arvu vahed. Ehk siis kui võtta koordinaatide keskpunktiks Päike siis planeetide asukohti saab üsna täpselt esitada. Samuti pole ka Merkuuri pinnal olevate asjade esitamisega erilisi probleeme. Samas kääbusplaneet Pluto peal on juba ujukoma arvude ümardusvigadest põhjustatud muutused jupp maad suuremad.

Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on char. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi. Enamus keeltes on olemas ka spetsiaalsed tekstimuutuja tüübid ning otse märgimassiivide peal tavaliselt tööd ei tehta kuna see võib üsna kergelt põhjustada kõikvõimalikke vigu.

Päisefailid

Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujate, struktuuride ja klasside definitsioone. See on vajalik selleks, et siis ei peaks ühtesid ja samu asju mitmel pool defineerima vaid saaks kasutada üht headerit mitmes kohas. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks ".h".

Osad keeled ei vaja päisefaile. Näiteks Javas on igas failis tüüpiliselt üks kuid vahel ka mitu klassi ning kõik klassi muutujad ja tüübid defineeritakse tolle sama klassi sees. Kuna Java koodi kompileerimine on veidi teistsugune kui C/C++ oma siis seal ei pea neid erinevaid klasse igas failis uuesti defineerima, piisab kui iga faili alguses öelda millistes failides olevaid asju kasutada soovitakse.