Krmiljenje programa
WHILE ZANKA
Programski jezik C ima več struktur za tvorbo zank in pogojno razvejevanje programov. Vse si bomo gledali v tem poglavju, začeli pa bomo s stavkom while.
While zanka nadaljuje z izvajanjem, dokler je nek pogoj resničen. Ko postane pogoj neizpolnjen, se zanka prekine. Torej zanka počne ravno tisto, kar je razvidno že iz njenega imena.
Primer programa------> WHILE.C
Naložite program WHILE.C in si ga oglejte kot primer while zanke. Program začnemo s komentarjem in z vstopno točko main, nato pa definiramo celoštevilsko spremenljivko, imenovano count v samem telesu programa. Spremenljivki je dodeljena vrednost nič, nato pa pridemo do same while zanke. Zgradba while je natančno takšna, kot je tu prikazano. Rezervirani besedi while sledi stavek v oklepaju, temu pa sledi sestavljen stavek v zavitih oklepajih. Dokler je izraz v oklepaju izpolnjen, se bodo stavki v zavitih oklepajih izvajali. V tem primeru se spremenljivka count povečuje za 1, torej bo v nekem trenutku enaka 6. Takrat se zaporedje stavkov ne bo izvedlo, saj count ne bo več manjši od 6, in zanka bo zaključena. Kontrola programa se bo nadaljevala s stavkom, ki sledi stavkom v zavitem oklepaju.
Primerjalni izraz, to je izraz v oklepaju, bomo obdelali v naslednjem poglavju. Do takrat pa si zamislite, kaj naj bi ti izrazi počeli in vsaj v teh enostavnih primerih boste imeli prav.
Nekaj stvari je treba poudariti kar se tiče same while zanke.
Prvič, če bi bila spremenljivka count že na začetku večja od 5, se stavki
v zavitem oklepaju sploh ne bi izvedli, torej je možno imeti while
zanko, ki se
nikoli ne izvede. Drugič, če spremenljivke v zanki ne bi povečevali,
se zanka ne bi nikoli končala, torej se program ne bi nikoli zaključil.
In še kot zadnje, če naj se v zanki izvaja le en stavek, ni potrebno, da
ga obdamo z zavitimi oklepaji.
Prevedite in poženite ta program, ko ste ga preučili dovolj natančno,
da razumete točno, kako deluje. Bodite pozorni, da je rezultat izvajanja
programa podan za ta in za vse ostale programe v tem tečaju tako,
da vam ni
potrebno prevajati in poganjati vseh programov. Vseeno pa prevedite
in poženite vsaj nekaj programov, da boste dobili nekaj izkušenj z delom
z vašim prevajalnikom.
Programe, katere ne razumete popolnoma, poskusite nekoliko spremeniti in jih ponovno prevesti, tako, da boste točno vedeli kaj naredijo. Najboljši način učenja je namreč, da poskušate sami spreminjati te programe.
Stavka #include in return bomo do konca tega poglavja
še zmeraj zanemarili in ju podrobno definirali v poznejših poglavjih.
DO-WHILE ZANKA
Primer programa------> DOWHILE.C
Variacija while zanke je prikazana v programu DOWHILE.C, katerega bi morali sedaj naložiti in si ga prikazati na ekranu. Ta program je skoraj identičen prejšnjemu, razlika je le ta, da se zanka začne z rezervirano besedo do, kateri sledi sestavljen stavek v zavitem oklepaju, nato nastopi rezervirana beseda while, nazadnje pa še izraz v oklepaju. Stavki v zavitem oklepaju se izvajajo tako dolgo, dokler je izraz v oklepaju resničen. Ko postane izraz v oklepaju neresničen, se izvajanje prekine, kontrola programa pa se nadaljuje s stavkom, ki sledi do-while zanki.
Vseeno pa je potrebno poudariti nekaj stvari glede do-while zanke. Ker se testiranje pogoja izvaja na koncu zanke, se bodo stavki v zavitem oklepaju izvedli vsaj enkrat. In drugič, če spremenljivke i v zanki ne bi spreminjali, ne bi bilo zanke nikoli konec in program se ne bi nikoli zaključil.
Ne sme vas presenetiti, da lahko te zanke med seboj gnezdimo.To pomeni, da lahko eno zanko postavimo v zaviti oklepaj druge zanke, stopnja gnezdenja pa ni omejena. To bo prikazano kasneje.
Prevedite in poženite ta program, da bi videli, če res naredi, kar od njega pričakujete.
FOR ZANKA
Primer programa------> FORLOOP.C
Naložite in si oglejte program kot primer programa z for zanko.
For
zanka je sestavljena iz rezervirane besede for, ki ji sledi nekoliko
daljši
izraz v oklepaju. Ta izraz je v resnici sestavljen iz treh polj, locenih
s
podpicji. Prvo polje vsebuje izraz "index = 0" in je inicializacijsko
polje.
Vsak izraz v tem, prvem polju se izvede, preden se začne izvajati zanka.
Izrazi, ki jih lahko postavimo v to polje, praktično niso omejeni, vendar
pa dobra programerska praksa narekuje, da so ti izrazi čimbolj preprosti.
Lahko
zapišemo tudi več inicializacijskih stavkov, ločiti pa jih moramo z
vejicami.
Drugo polje, ki v našem primeru vsebuje izraz "index < 6", je test, ki se izvede ob vsakem prehodu skozi zanko. Lahko je kakršenkoli izraz, za katerega lahko ugotovimo ali je resničen ali neresničen. (o dejanskih vrednostih izrazov resničen in neresničen bomo spoznali v naslednjem poglavju).
Izraz, ki ga vsebuje tretje polje, se izvede ob vsakem prehodu skozi zanko, vendar šele po tem, ko se izvedejo stavki v telesu zanke. Tudi to polje, podobno kot prvo, lahko vsebuje več izrazov, med seboj ločenih z vejicami.
Izrazu for( ) sledi stavek oziroma stavki, ki se bodo izvajali kot telo zanke. Sestavljen stavek je katerakoli skupina veljavnih C stavkov, omejenih z zavitimi oklepaji. V skoraj vsakem kontekstu C-ja lahko enostaven stavek nadomestimo s setavljenim, ki ga bo programska kontrola smatrala kot enostaven stavek. Prevedite in poženite ta program.
While zanka je bolj primerna za uporabo takrat, ko ne veste,
kolikokrat se bo zanka izvedla, for zanko pa uporabljamo takrat,
ko delamo z nekim fiksnim številom iteracij. For zanka je zelo primerna
tudi zato, ker postavi vse kontrolne informacije na eno mesto, v oklepaj,
ne pa na dve mesti v kodi. Izbira, katero boste uporabili, pa je vaša.
Odvisno od tega, kako jih uporabimo, lahko z obema dosežemo, da se koda
v telesu zanke nikoli ne izvede. To je omogočeno s tem, da je sam test
postavljen na začetek zanke, ta pa je lahko neizpolnjen že pred začetkom
prve iteracije. Do-while zanka pa se bo zaradi tega, ker se telo
zanke izvede pred samim testom zanke, izvedla vsaj enkrat.
IF STAVEK
Primer programa------> IFELSE.C
Naložite in si oglejte program IFELSE.C kot primer našega prvega pogojnega stavka, to je stavka if. Najprej boste opazili, da program vsebuje for zanko, ki ima za svoje telo dva if stavka.To je primer gnezdenja stavkov. Moralo bi vam biti jasno, da se bo vsak izmed if stavkov izvedel desetkrat.
Oglejte si prvi if stavek. Začne se z rezervirano besedo if,
ki ji sledi izraz v oklepaju. Če je izraz ovrednoten in je resničen, se
bo izvedel enostaven stavek, ki sledi prvemu if stavku, če pa je
izraz neresničen, se naslednji stavek preskoči. Tudi v tem primeru lahko
enostaven stavek zamenjamo s sestavljenim, katerega moramo obdati z zavitim
oklepajem. Izraz "data == 2" enostavno preveri, če je vrednost data-e enaka
2. To bo podrobneje razloženo v naslednjem poglavju. (Zaenkrat se zadovoljite
z razlago, da če bi tu napisali izraz "data = 2" , bi to pomenilo nekaj
popolnoma drugega. Za primerjanje vrednosti morate uporabiti dvojni
enačaj.
SEDAJ PA ŠE IF-ELSE STAVEK
Drugi if stavek je podoben prvemu, ima pa dodano novo rezervirano
besedo else v vrstici 17. Ta pove programu, da če je izraz v oklepaju
resničen, se izvede prvi izraz, drugače pa se izvede izraz, ki sledi besedi
else. V vsakem primeru se bo izvedel eden od stavkov, medtem ko
se je v prejšnjem primeru stavek izvedel ali pa ga bomo preskočili. Oba
načina bosta zelo uporabna v vašem programiranju v C-ju. Prevedite in poženite
ta program
in se prepričajte, da res naredi tisto, kar ste od njega pričakovali.
BREAK IN CONTINUE
Primer programa------> BREAKCON.C
Naložite program BREAKCON.C s primerom dveh novih stavkov. Opazili boste,
da je v prvi for zanki if stavek, ki pokliče break
stavek, če je xx enak 8. Break stavek bo povzročil skok iz zanke,
v kateri se trenutno nahajate in bo
začel izvajati stavke, ki se nahajajo takoj za zanko in tako učinkovito
zaključil zanko. To je zelo koristen stavek, ko morate izstopiti iz
zanke na podlagi nekega razultata, ki se izračuna v tej zanki. V našem
primeru, ko bo xx dosegel vrednost 8, se bo zanka zaključila, torej bo
zadnja izpisana vrednost prejšnja, torej 7. Break stavek vedno skoči
iz zanke do zavitega oklepaja, ki to zanko zaključuje.
Naslednja for zanka, ki se začenja v vrstici 15, vsebuje continue stavek, ki ne povzroči zaključka zanke, pač pa skoči iz trenutne iteracije. Ko bo vrednost xx-a dosegla 8, bo program skočil na konec zanke, vendar bo nadaljeval z njenim izvajanjem in tako onemogočil printf() stavek, ki bi se izvedel ob prehodu skozi zanko, ko je xx enak 8. Continue stavek vedno skoči na konec zanke, vendar tik pred zaključni zaviti oklepaj. Takrat se zanka ali konča ali pa se nadaljuje, kar je odvisno od rezultata, ki ga da test zanke.
Prevedite in poženite ta program.
SWITCH STAVEK
Primer programa ------> SWITCH.C
Naložite in si oglejte program SWITCH.C za primer do sedaj največjega konstrukta v C-ju, to je switch stavka. Ta stavek ni težak, torej ne dovolite, da vas prestraši. Prične se z rezervirano besedo switch, ki ji sledi spremenljivka v oklepaju in je izbirna spremenljivka, v našem primeru truck. Kolikor izbir je potrebno, ji sledijo v zavitem oklepaju. Rezervirana beseda case je uporabljena za začetek vsake možnosti, sledi ji vrednost izbirne spremenljivke za vsak primer, nato je postavljeno dvopičje, temu pa sledijo stavki, ki naj se izvedejo..
V našem primeru, če bo imela spremenljivka truck vrednost 3 ob prehodu skozi switch stavek, bo printf() stavek v vrstici 13 povzročil izpis "The value is three\n" , break stavek pa bo povzročil izstop iz switch stavka. Break stavek v tem primeru deluje podobno kot pri zankah, skočimo tik za zaključni zaviti oklepaj.
Ko enkrat najdemo vstopno točko, se bodo stavki izvajali, dokler ne naletimo na break stavek ali pa pridemo do konca switch stavka. Če bo vrednost spremenljivke truck 5, se bodo stavki začeli izvajati v vrstici 17, kjer najdemo izraz "case 5 :", vendar se v našem primeru stavki pričnejo šele pri stavkih, kjer ima truck vrednost 8. Ti se nato izvedejo, break stavek v vrstici 21 pa bo povzročil izstop iz stavka switch tik za zaključnim zavitim oklepajem. Različne vrednosti case so lahko zapisane v kateremkoli vrstnem redu, če pa določene vrednosti ni moč najti, se izvede default del stavka switch.
Moralo bi biti jasno, da lahko zgornje konstrukte gnezdimo enega
v drugega ali pa jih uporabimo zaporedno, pač odvisno od programerske naloge,
ki jo v danem trenutku rešujemo. Switch ni uporabljan tako pogosto
kot zanke in if stavek. Pravzaprav je uporabljan zelo redko, vendar
bi ga moral resen C-jevski programer popolnoma razumeti. Prevedite in poženite
SWITCH.C in si oglejte rezultate.
ZLOBNI GOTO STAVEK
Primer programa ------> GOTOEX.C
Naložite in si oglejte program GOTOEX.C kot primer programa, ki vsebuje nekaj goto stavkov. Za uporabo goto stavka morate najprej uporabiti rezervirano besedo goto, ki ji sledi simbolično ime mesta, kamor želite skočiti. To ime postavite kamorkoli v program, za njim pa postavite dvopičje. Skočite lahko skoraj kamorkoli v isti funkciji, izjema je le skok v zanko, lahko pa skočite iz zanke.
Ta program je zelo nepregleden, vendar je dober primer, zakaj si programski razvijalci prizadevajo čimbolj izkoreniniti uporabo goto stavka. Edino mesto v programu, kjer je smiselno uporabiti goto stavek, je v vrstici 23, kjer skočimo iz treh vgnezdenih zank v enem skoku. V tem primeru bi bilo slabše uporabiti spremenljivko in skakati iz vsake zanke posebej, ko lahko z goto stavkom opravimo zelo učinkovito z enim skokom.
Nekateri mislijo, da se goto stavek sploh ne bi smel uporabljati, vendar pa je to velika lahkomiselnost. Če je v programu mesto, kjer bomo z goto stavkom dosegli lepšo kontrolo toka, ga brez pomislekov uporabite. Vseeno pa z njim ne smete pretiravati, kakor je v nadaljevanju tega primera.
Celotne knjige so napisane na temo "programiranja brez goto stavka", bolj znano kot strukturirano programiranje.
Prevedite in poženite GOTOEX.C in opazuje izpis. Dobra vaja bi bila,
če bi program napisali še enkrat in videli, kako bolj čitljiv je, če so
stavki napisani po vrsti.
KONČNO, SMISELN PROGRAM
Primer programa ------> TEMPCONV.C
Naložite program TEMPCONV.C kot primer uporabnega, čeprav nekoliko omejenega programa. To je program, ki naredi tabelo temperatur v stopinjah Celzija ter Fahrenheita in izpiše sporočilo ob točki zmrzovanja vode in drugega ob točki vrenja vode.
Posebno pomembno je formatiranje. Glavo sestavlja nekaj vrstic komentarja,
ki opišejo, kaj program naredi in je napisan na način, ki pritegne bralčevo
pozornost in je še zmeraj prijeten za oko. Sčasoma boste razvili svoj stil
formatiranja, vendar pa je ta dober za začetek. Tudi če si ogledate
for zanko, boste opazili, da je vsebina sestavljenega stavka pomaknjena
za tri mesta v desno od besede for, zavita oklepaj in zaklepaj pa
sta poravnana pod črko "f" v for. To naredi preverjanje programa
nekoliko lažje, saj postane konstrukt bolj očiten. (Naslednji primer bo
prikazal še dva načina formatiranja zavitih oklepajev.) Opazili boste tudi,
da so printf() stavki,
ki so del if stavkov v večji for zanki, pomaknjeni še
za tri mesta, saj so del drugega konstrukta.
To je prvi program, v katerem smo uporabili več kot eno spremenljivko.
Tri spremenljivke so enostavno definirane v treh različnih vrsticah in
so uporabljene kot je bila uporabljena posamezna spremenljivka v prejšnjih
programih. Ker smo jih definirali v treh različnih vrsticah, smo si
dali možnost, da vsako posebej komentiramo. Mož;no bi bilo tudi, da bi
vse definirali v eni vrstici, vendar pa bi to pomenilo, da ne bi mogli
komentirati vsake vrstice posebej. To bo prikazano v naslednjem programu.
Prevedite in poženite ta program.
ŠE EN PRIMER SLABEGA PROGRAMIRANJA
Primer programa------> DUMBCONV.C
Če se spomnite programa UGLYFORM.C iz prejšnjega poglavja, se boste
spomnili, da je bil to zelo slabo formatiran program. Če boste naložili
in si ogledali program DUMBCONV.C , boste videli primer slabega
formatiranja, ki je bližji tistim, ki jih srečate v praksi. Program
je enak kot TEMPCONV.C, le da so odstranjeni komentarji, spremenjena pa
so tudi imena spremenljivk tako, da nimajo več opisnih imen. Čeprav ta
program
deluje natanko tako kot prejšnji, pa je veliko težji za branje in razumevanje.
Morali bi začeti razvijati dobre programerske prijeme tako, da preučite
ta program in videli, kaj ne smete delati.
Koristilo bi vam tudi, če bi iz zadnjih dveh programov odstranili zamike
in tako videli, koliko težje je razumeti strukturo programa brez zamikov.
NAŠ PRVI STILNI PROGRAM
Primer programa ------> STYLE1.C
Ta program ne naredi nicesar praktičnega, razen, da prikaže različne
stile formatiranja in združi nekatere konstrukte, ki smo jih spoznali v
tem poglavju. V tem programu ni ničesar, kar še ne bi predelali v tem tečaju.
Program je zelo dobro komentiran, marljiv študent bi ga moral dobro preučiti
in se tako začel uciti pravilnega načina programiranja v C-ju. Kot vsi
primeri programov, bi moral biti tudi ta preveden in pognan.
NALOGE IZ PROGRAMIRANJA
2. Napišite program, ki šteje od ena do deset, izpiše vrednosti
vsako v
svojo vrstico in izpiše sporočilo po vaši
želji, ko je vrednost
count 3 in drugačno sporocilo, ko je vrednost
count 7.