Tečaj C  - Poglavje 3

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

     
      1. Napišite program, ki desetkrat izpiše vaše ime na zaslon. Napišite ga
         na tri načine, vsakič z drugo vrsto zanke.

      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.

Povratek na kazalo

Prehod na poglavje 4


Copyright  1988-1997 Coronado Enterprises - Last update, March 15, 1997
Prevedel: Sašo Kuntarič