ALGORITM on täpne ja üheseltmõistetav eeskiri mingi ülesande
lahendamiseks. Algoritmi esitusviisid:
Pseudokoodis, kus kasutatakse programmeerimiskeele võtmesõnu,
lauseid.
Graafiliselt -
blokk- skeemid .
PROGRAMMEERIMISKEEL on tehiskeel algoritmide kirjapanekuks
arvutitele "arusaadaval" kujul. Programmeerimiskeeles kirja
pandud algoritmi nimetatakse PROGRAMMIKS või, kui veelgi täpsem
olla, PROGRAMMI TEKSTIKS. Programmeerimiskeele süntaks on range eeskiri, mis sätestab
väga üksikasjalikult, kuidas tohib programmi kirja panna nii, et
see oleks arvuti poolt vastuvõetav. Vastasel juhul on tekstis
süntaksivead.
Programmi süntaks võib olla õige, kuid sellegipoolest see
programm ei tööta arvutis nii, nagu soovisime. Siis on
programmis on
semantilised vead ehk
sisulised vead.
Kui süntaks määratleb ära sõnade ja sümbolite järjekorra
lauses, siis
lause semantika on lause
mõte, tema
tähendus.
Vigade otsimine programmist ehk
programmi
silumine on programmeerijalt suurt vaeva nõudev töö ja
seetõttu on
soovitav programme kirjutades vigadest hoiduda.
Nagu paljud teised keeled, koosnevad ka programmeerimiskeeled
lausetest.
Lause on imperatiivsetes keeltes käsk, algoritmi
üks samm.
Nagu
tavalises keeles on
lihtlaused , liitlaused, küsilaused jne, nii
on ka programmeerimiskeeles väga mitut liiki lauseid. Kui eesti
keeles koosneb lause sõnadest ja kirjavahemärkidest, siis
programmeerimiskeele lause koosneb
võtmesõnadest,
märkidest
ja
identifikaatoritest, mis on kirja pandud vastavalt keele
süntaksile.
VÕTMESÕNA on spetsiaalse tähendusega sõna, mille esinemise
järgi jagatakse lauseid erinevatesse liikidesse. Võtmesõnu ei
saa ja ei tohi kasutada teises tähenduses. Enamik võtmesõnu
pärineb inglise keelest.
Programmeerija saab programmeerimiskeeles lisaks keele enda
vahenditele defineerida
tegevusi ning
andmeobjekte, mis
on tegevuste teostamisel abiks.
ANDMEOBJEKTIKS nimetame me sellist objekti, mis on võimeline
kandma endas meie poolt kasutatavat informatsiooni. IDENTIFIKAATOR on keele reeglite järgi kirja pandud sõna, mis
võib tähistada mõnda olemasolevat või programmeerija poolt loodud
objekti selles keeles. Üldjuhul kasutatakse identifikaatoreid
andmeobjektide ja
andmetüüpide nimedena.
ANDMETÜÜP määrab andmeobjekti suuruse, omadused ning temaga
sooritatavad võimalikud tegevused. Arvutis on igal tüübil lõplik väärtuste hulk.
Programmeerimiskeeltes on algselt defineeritud mingisugune hulk
andmetüüpe, mida nimetatakse
LIHTTÜÜPIDEKS. Harilikult
kuuluvad sinna hulka sellised andmetüübid nagu TÄISARV,
REAALARV ja SÜMBOL. Lisaks lihttüüpidele on programmeerimiskeeltes
keerulisemaid andmetüüpe, mida nimetatakse
STRUKTUURSETEKS
TÜÜPIDEKS. Paljudes keeltes on algselt defineeritud
selliseks struktuurseks tüübiks sümbolite jada, mida nimetatakse ka
STRINGIKS.
VäärtusNagu ka eelnevalt sai
mainitud , võib iga arvutis olev andmeobjekt
sõltuvalt tema tüübist kanda mingisugust informatsiooni. Öeldakse,
et andmeobjekt võib omada mingisugust lõplikku hulka
VÄÄRTUSI.
Sõltuvalt programmeerimiskeelest võib see väärtuste hulk olla
erinev.
KonstantProgrammeerimiskeeltes jagatakse andmeobjekte teatud tunnuse järgi
kaheks -
konstantideks ja
muutujateks.
KONSTANT on andmeobjekt, mille väärtust programmi täitmise
käigus muuta ei saa. Muutuja MUUTUJA on andmeobjekt, mille väärtus võib programmi täitmise
käigus muutuda. AVALDIS on väärtuse leidmise eeskiri, mis moodustatakse
operandidest ja operaatoritest ning nende grupeerimiseks kasutatakse
sulgusid.Aritmeetiline avaldisAritmeetilises avaldises kasutatakse eeskätt arvutüüpi
andmeobjekte ja aritmeetilisi tehtemärke. Ka võib aritmeetilises
avaldises kasutada arvutüüpi funktsioone. Kõik eespool toodud
näited
avaldiste kohta on olnud aritmeetilised
avaldised .
Loogiline avaldisLoogiline avaldis sisaldab ühte või
enamat loogilist
operaatorit ja
võib tihti
sisaldada aritmeetilisi avaldisi. Matemaatikast tuntud
loogiline avaldis on võrratus, mille puhul on tulemuseks samuti
tõeväärtus.
PROGRAMMEERIMISKEELE LAUSED
OMISTAMISEKS nimetatakse väärtuse kirjutamist andmeobjekti poolt
hõivatud mälupesadesse ehk andmeobjekti väärtustamist. Konstandile
omistatakse väärtus programmi kirjutamise ajal ja seda
väärtust programmi töötamise ajal ainult loetakse. Muutujale
omistatakse väärtus üldjuhul programmi töötamise ajal ja seda
võib teha mitmeid kordi - tema väärtus programmi töö ajal võib
muutuda (sellest nimigi)
TINGIMUSLAUSE on programmi juhtkonstruktsioon, mis võimaldab
vastavalt etteantud loogilise avaldise väärtusele suunata programmi
täitma kas üht või teist programmiharu.MÄÄRATUD KORDUS on korduslause, mille korral kirjutatakse
programmi konkreetne arv, mitu kordust on vaja teha. Määratud
kordusega on harilikult seotud üks muutuja, mida nimetatakse KORDUSE
LOENDURIKS.
EELKONTROLLIGA KORDUS on korduslause, mille korral täidetakse
etteantud tegevust seni, kui esitatud tingimus on täidetud.
Tingimust kontrollitakse ENNE tegevuse täitmist.
JÄRELKONTROLLIGA KORDUS on korduslause, mille korral täidetakse
etteantud tegevust vastavalt PÄRAST tegevust esitatud tingimusele.Protseduur on keele konstruktsioon , mille abil võib sooritada programmi osadeks jaotamist ja korduvalt kasutatava tegevuse
defineerimist. Põhimõtteliselt võib protseduur sisaldada
mistahes ülesande lahendamiseks vajalikku programmiosa. Protseduuri
kasutamine toimub omaette lausega, mis siis nagu laiendaks keele
lausete hulka.
Funktsioon on mõnevõrra spetsiifilisem
alamprogramm. Olles oma
struktuurilt sarnane protseduuriga, on tema
ülesandeks mingisuguse väärtuse väljaarvutamine.
Globaalse muutuja tegevuspiirkond ulatub alates tema
deklareerimise kohast üle kogu ülejäänud programmi. See tähendab,
et kõik sellesse piirkonda jäävad
alamprogrammid ja põhiprogramm
saavad seda muutujat kasutada.
Lokaalse muutuja tegevuspiirkonnaks on see alamprogramm,
milles ta on
deklareeritud . Seda muutujat saab kasutada ainult selle
alamprogrammi sees ning teiste alamprogrammide ja põhiprogrammi
jaoks seda muutujat ei eksisteeri.
Programmeerimiskeele translaatoriga käivad harilikult kaasas
alamprogrammide teegid, milles sisalduvaid protseduure ja funktsioone
nimetatakse
standardprotseduurideks ja -
funktsioonideks.
Programmide
vormistamine.
1.
Milleks on vaja programme hästi
vormistada ?
Kas
Te olete kunagi proovinud lugeda teise inimese poolt kirjutatud
programmi või otsinud sellest vigu? Kui ei ole, siis kunagi
kindlasti tuleb esimene kord. Ja kui see on Teie enda kolm kuud või
enam aega tagasi kirjutatud programm, siis on see peaaegu samaväärne
võõra
tekstiga , sest pea pole prügikast ja kõik ununeb.
Sellisel
juhul sõltub programmist arusaamine otseselt programmi
vormistamisest. Hästi
vormistatud programm on
loetav ja ülevaatlik,
halva vormistuse korral kulub programmiga tutvumisele mitu korda
rohkem aega ja lugeja peab olema VÄGA kannatlik, et saada aru
programmi tööpõhimõttest. Puudulik
vormistus muidugi ei tähenda,
et programm töötaks halvasti, sest arvuti ei pööra programmi
sellele aspektile üldse tähelepanu (kui seda ei nõua keele
süntaks).
Toon
siinkohal ühe näite spetsiaalselt halvasti vormistatud programmist,
mis sellegipoolest on täiesti töökõlblik.
/*
P r o g r a m m N10.1 - World.c */
Sub
SisestaKuupaev()
Dim aasta, kuu, paev, vahe
As
Integer aasta =
InputBox("Sisesta aasta!")
paev = InputBox("Sisesta
paev!") kuu = InputBox
("Sisesta kuu!") synna
= DateSerial(aasta, kuu,
paev) vahe =
Date –
synna MsgBox (vahe)
End Sub
Mida
see programm küll teha võiks? ;-)
Korraliku
vormistamise eesmärgiks on keele enda vahenditega kirjutada hästi
loetav programm. Kui on vaja selgitada kasutatava algoritmi sisulisi
nüansse, siis selleks kasutatakse kommentaare. Paljusid lihtsaid
algoritme võib protseduuriks või funktsiooniks vormida ilma sõnagi
kommentaariks lisamata.
Mis
teeb ühe programmi hästi
loetavaks ? Selle kohta võib leida mitmeid
soovitusi:
1)
Kirjutage programm nii lihtsalt ja arusaadavalt kui võimalik,
hoiduge kavalatest nippidest. Seda nimetatakse
KISS -printsiibiks
(inglise keelest '
Keep It
Simple ,
Stupid ').
2)
Kasutage
iseennast selgitavaid identifikaatoreid.
3)
Struktrueerige oma programmi, kasutades tühje ridu, taandeid ja
tabulaatoreid.
4)
Kasutage mõistlikult kommentaare.
Igal
programmeerijal kujuneb aja jooksul välja oma 'käekiri', millest
suur osa
kajastub programmi vormistamise harjumustes - programmeerija
STIILIS. Hea vormistus on hea stiili tunnuseks.
2.
Identifikaatorite süstematiseerimine.
Iga
identifikaatori kohustuslikuks osaks peaks olema
string , mis
viitab identifikaatori SISULISELE tähendusele - see on ennastselgitavuse
aluseks. Kui meil on vaja valida nimi muutujale, milles hoitakse
väärtust pikkuse kohta, siis peaks
valima mõne järgmistest
nimedest : Pikkus,
Length , Pikk, Len, P, L. Esimesed on paremad,
viimaseid võib kasutada mõningate mööndustega. Võib kasutada ka
võõrkeelseid nimetusi ja nendest
tuletatud lühendeid. On hea, kui
sisuliselt erinevate muutujate nimed ei ole väga sarnased.
Suurte
programmide korral, kus kasutuses on sadu ja tuhandeid
identifikaatoreid, tahetakse neid lisaks sisule süstematiseerida ka
tegevuspiirkonna ja tüübi järgi.
Näiteks
tegevuspiirkonna määratlemiseks kasutatakse eesliiteid 'l', 'g' ja
'a' vastavalt sellele, kas tegemist on lokaalse või globaalse
muutujaga või parameetriga:
'lTabel'
-
lokaalne muutuja;
'gTabel'
- globaalne muutuja;
'aTabel'
-
parameeter .
Defineeritud
konstantide eesliitena on kasutatav täht 'k' või 'c':
'cMaxValue'
- konstant.
Kui
on tahtmine näidata muutuja nimega ka muutuja tüüpi, siis võib
kehtestada vastava 'kooditabeli'. Näiteks
Microsoft järgib oma
toodetes 'Ungari notatsiooni', mille koostas firma programmeerija
Charles Simonyi (kes on rahvuselt ungarlane). Mõned näited:
nPikkus
: Integer;
sNimi : String;
wMask : Word;
Pole
tähtis, kuidas Teie süstematiseerite oma identifikaatoreid, tähtis
on vaid see, et kogu programmi ulatuses on tähistus ühesugune.
3.
Taanete kasutamine.
Kui
vaadelda programmi üldises mõttes, siis see koosneb käskude
jadast, milles mõned käsud (nagu valikud ja kordused) võivad
sisaldada omakorda käsujadasid. Programmi
lugedes tunneme me
harilikult huvi selliste suuremate struktuuride algus- ja
lõpp-punktide vastu.
Kujutage nüüd endale ette sadu ridasid
programmi, mille kõik read algavad esimesest positsioonist. See on
siis midagi sellist:<
For
i := 1 To N-1
For
j := i To N
If
A(i)
V
:= A(i);
A(i)
:= A(j);
A(j):=
V
End
If
Next
j
Next
i
Sellisest
ühtlasest jadast on väga raske leida mingisuguse struktuuri algust
ja lõppu. Kui nüüd sellise programmi kompileerimisel ilmneb, et
kuskil on üks 'end' puudu, siis ei jäägi muud üle, kui
asuda kõiki võtmesõnu '
begin ' ja 'end' omavahel 'paari
panema '. Ja
selliseks struktuuri esiletõstmiseks kasutatakse TAANDEID.
Üldine
reegel seisneb selles, et STRUKTUURI SISSE JÄÄVATE LAUSETE ALGUSED
NIHUTATAKSE VÄHEMALT ÜHE KOHA VÕRRA PAREMALE. Tavaliselt on nihke
suuruseks 2 kuni 4 kohta.
Märksa
tähtsam on see, et üksteises sisalduvad
struktuurid on selgelt
eristatud : esimene määratud kordus sisaldab teist määratud
kordust ja see omakorda valikuliselt täidetavat käsujada.
Siinkohal
tahaksin
soovitada ühte programmi kirjutamise võtet, mis tagab
selle, et ükski 'end' ära ei unune. Nimelt, alati, kui
kirjutate 'begin', kirjutage kohe järgmisele reale temaga paaris olev 'end' ja
alles seejärel kirjutage nende kahe vahele vajaminevad laused.
Pisiasi, kuid oluline.
PROGRAMMI
DOKUMENTEERIMINE . KOMMENTAARID
PROGRAMMI
PROJEKTEERIMINE JA
TESTIMINE 1.
Kellele ja milleks on vaja dokumentatsiooni?
Iga
programmiga, mis on mõeldud laiemaks levitamiseks, peab kaasnema
dokumentatsioon selle programmi kohta. Veel mõned aastad tagasi oli
loomulik, et see dokumentatsioon oli trükitud kujul. Tänapäeval on
paljud programmipaketid varustatud ka elektroonilisel kujul oleva
dokumentatsiooniga - niinimetatud 'abifailidega'.
Dokumentatsioon
jaotub mitmesse ossa sõltuvalt sellest, kellele ja milleks see on
kokku pandud:
1)
Kasutajajuhendid. Siia hulka kuuluvad materjalid, mis tutvustavad
programmi omadusi ja aitavad läbi viia väikese proovi ning
põhjalikumad kasutajatele orienteeritud käsiraamatud, niinimetatud
'manuaalid'. Kasutajajuhendites on kõike püütud seletada kasutaja
vaatevinklist lähtudes ja üldiseks eesmärgiks on aidata kaasa
programmi efektiivsele kasutamisele.
2)
Administraatori juhendid. Siia kuulub programmi installeerimise
juhend ja käsiraamatud programmi hooldamiseks. Ühe kasutaja
programmidel on installeerimine tehtud sageli väga lihtsaks ja see
erilist probleemi ei tekita, kuid suurte süsteemide tööle
panemiseks on tihti vajalik spetsialisti
kohalolek ja siis on vaja
kuidagi edasi anda programmi koostaja näpunäited - selleks siis ka
installeerimise juhend. Programmi hooldamise juhendid sisaldavad
endas harilikult näpunäiteid mõningate tegevuste, nagu näiteks
andmete
arhiveerimine , läbiviimiseks ja lihtsamate veasituatsioonide
lahendamiseks.
3)
Programmi tehniline dokumentatsioon. See sisaldab endas kogu
projektdokumentatsiooni, testimiste protokolle ja võimaluse korral
ka programmi lähtetekste. Need kõik on vajalikud, kui tahetakse
olemasolevat programmi parandada või täiendada.
2.
Programmi lähteteksti dokumenteerimine
KOMMENTAAR
on programmis selgituse või täpsustusena kasutatav tekstilõik, mis
ei mõjuta programmi tööd. Kuigi ei ole
kindlaid reegleid selle
kohta, kuidas kasutada kommentaare, on siingi mõned
printsiibid ,
mida võiks järgida:
*
kommenteerida tuleb nii palju kui vajalik ja nii vähe kui võimalik;
*
kommenteerides püüdke ennetada lugeja küsimusi;
*
kirjeldada tuleb põhilisi funktsioone ja tegevusi;
*
andke piisav seletus kasutatavatele muutujatele;
*
ärge kommenteerige niigi arusaadavaid lauseid.
Jätke
endale meelde, et mõistlik kommenteerimine suurendab märgatavalt
programmi loetavust.
Lisaks
sisulisele kommenteerimisele kasutavad professionaalsed
programmeerijad ka programmi lähteteksti dokumenteerimist, mis
tähendab, et iga programmimooduli ja alamprogrammi
algusesse lisatakse spetsiaalselt vormistatud kommentaar, mis sisaldab:
1)
mooduli või funktsiooni täielikku
nimetust ;
2)
otstarve lühikest kirjeldust;
3)
sisendandmete kirjeldust;
4)
väljundandmete kirjeldust;
5)
autori(te) nime(sid) ja loomise kuupäeva;
6)
muudatuste põhjuseid ja kuupäevi koos muudatuse tegijate nimedega.
Selline
lähenemine võimaldab saada programmi teksti lugedes kirjapandust
parema ülevaate ning hiljem jälgida arendustööde käiku.
3.
Mis on programmi projekteerimine?
Suurte
programmide loomist on tihti võrreldud maja ehitamisega. Tõsi küll,
et mõned sellised tähelepanekud ei ole programmeerijatele auks.
Nagu näiteks üks Murphi seadustest võetu:
"Kui
ehitajad ehitaksid maju samamoodi nagu programmeerijad loovad
programme, siis esimene kohalelennanud rähn hävitaks
tsivilisatsiooni".
See
tähendab, et paljud
programmid kujutavad endast kaardimajakesi, mis
küll seisavad püsti, kuid ei pea vastu ühelegi juhuslikule
tuulepuhangule. Selliste programmide tunnuseks on see, et kasutajad
peavad käima mööda juba pikka aega sissetallatud
radu ja hoidku
jumal neid selle eest, et nad
sellelt rajalt kõrvale ei pööraks -
halvemal juhul võib see lõppeda totaalse kräshiga. Need on
niinimetatud 'mittelollikindlad programmid'. Mõni võib mõelda, et
'mis nad siin jamavad, parandagu vead ära ja asi korras', aga kui
minna neid vigu parandama, siis selgub, et ei eksisteeri mitte
mingisugust dokumentatsiooni, programmi tekst on halvasti vormistatud
jne. Parandades sellises programmis ühte viga, võid suure
tõenäosusega teha mitu uut - lihtsalt puudub ülevaade.
Eelneva
jutu moraaliks on see, et TULEB ÕPPIDA EHITAJATELT. Tänapäeval ei
ehitata enam niimoodi, et kõigepealt tuuakse kohale koormatäis
telliskive ja hakatakse laduma. Kõigepealt vaadatakse, kuhu ehitada
ja millist maja tulevane
elanik soovib. Seejärel tehakse majale
PROJEKT (see on juba arhitektide asi, kui nad uut projekti ei
joonista vaid võtavad kapist mõne vana). Kui kõik funktsionaalsus,
kasutatavad materjalid ja töömahud on läbi mõeldud, alles siis
hakatakse kive laduma. Ja suurem enamus majadest seisab püsti ja on
elanikke täis - ju siis sai ehitatud head majad. Seesama jutt käib
ka programmide loomise kohta.
Nii
nagu uut tüüpi majade puhul ehitatakse makette ehk väikeseid
mudeleid, nii
luuakse ka keeruliste programmide jaoks kõigepealt
mudelid ning nende peal 'mängitakse läbi' programmi kasutamine ja
üldine funktsionaalsus. Programmi projektdokumentatsioon koosnebki
harilikult mudeli kirjeldusest, milles on esitatud kasutatavad
andmestruktuurid, funktsioonid ja nende
omavahelised suhted, andmete
liikumise suund ja ajaline järjekord, kasutajaliides ja veel palju
muud. Selliste programmi mudelite loomiseks kasutatakse
CASE -vahendeid - programme, mis võimaldavad projekteerijal koostada
mitmeid spetsiaalseid
diagramme ning mis on suutelised kontrollima
koostatud mudeli korrektsust ja genereerima programmi tooriku, mida
siis programmeerija saab oma töös otseselt kasutada.
Kõik kommentaarid