tecaj c poglavje funkcije spremenljivke in prototipi nasa prva uporabnisko definirana funkcija primer programa sumsqres c nalozite in si oglejte program sumsqres c kot primer programa v c ju s funkcijami pravzaprav to ni prva funkcija ki smo jo do sedaj srecali saj je program ki smo ga do sedaj najvec uporabljali funkcija to je printf funkcija printf funkcija sodi v knjiznico funkcij ki je ze na voljo prevajalniku v tem poglavju bomo koncno definirali cemu sluzi vrstica vendar sele ko pridemo to cetrtega primera torej se malo pocakajte in za sedaj to vrstico ignorirajte pozorni bodite na izvajalni del tega programa ki se zacne v vrstici z vrstico kode ki pravi header to pa je nacin klicanja katerekoli funkcije oklepaj je potreben saj c z njegovo pomocjo ugotovi da je to funkcija ne pa narobe postavljena spremenljivka ko program pride do te vrstice kode poklice funkcijo header njeni stavki se izvedejo nato pa nas kontrola programa vrne na stavek ki sledi temu klicu ce nadaljujemo pridemo do for zanke ki se bo izvedel sedemkrat in ki ob vsakem prehodu skozi zanko klice novo funkcijo square nazadnje se bo poklicala in izvedla se funkcija ending za trenutek ignorirajte ime spremenljivke index v oklepaju klica funkcije square vidimo da ta program poklice header sedemkrat poklice square ter enkrat ending sedaj moramo te funkcije definirati definiranje funkcij glavnemu programu sledi funkcija ki se zacne v vrstici ki se drzi vseh pravil ki smo jih podali za glavni porgram le da se imenuje header to je funkcija ki jo klicemo iz vrstice v programu vsak od njenih stavkov se izvede ko pa je to koncano nas kontrola vrne v glavni program ali bolj natancno funkcijo main prvi stavek dodeli spremenljivki sum vrednost nic saj jo nameravamo uporabiti za sestevek vseh kvadratov ker spremenljivko sum definiramo pred glavnim programom je dosegljiva vsem funkcijam ki jih definiramo pozneje taki spremenljivki pravimo globalna spremenljivka velja pa cez celoten program tudi v novih funkcijah vcasih ji recemo tudi datotecna spremenljivka saj je dosegljiva po celotni datoteki vec o dosegljivosti spremenljivk bo povedano na koncu tega poglavja stavek v vrstici izpise glavo na zaslon programska kontrola nas potem vrne v main funkcijo saj tu ni vec stavkov ki bi se morali izvesti tako pademo skozi dno funkcije in se vrnemo na stavek ki se nahaja takoj za klicem te funkcije moralo bi biti jasno da bi lahko dva izvajalna stavka iz te funkcije premaknili v glavni program z njima nadomestili klic funkcije header pa bi program naredil natacno to kot sedaj to ne zmanjsuje vrednost funkcijam pac pa enostavno prikaze delovanje te preproste funkcije videli boste da so funkcije zelo dragocene v programiranju v c ju podajanje vrednosti funkcijam klasicna metoda ce se vrnemo na glavni program ali se bolj natancno na for zanko najdemo nov konstrukt s konca prejsnjega poglavja to je index v vrstici koristno bi bilo ce bi se dobro spoznali s tem konstruktom saj ga boste videli v vecini c programov v klicu funkcije square imamo dodano se eno zadevo spremenljivko index v oklepaju to je znak prevajalniku da zelite ob izvajanju te funkcije s seboj prenesti vrednost spremenljivke index za uporabo ob izvajanju te funkcije ce pogledamo naprej na funkcijo square v vrstici vidimo da je v oklepaju te funkcije zapisana druga spremenljivka number to je ime ki ga zelimo uporabljati za klic spremenljivke za uporabo ko izvajamo stavke znotraj te funkcije lahko jo imenujemo kakorkoli le da se drzimo pravil imenovanja identifikatorja in da ime ni rezervirana beseda ker mora funkcija vedeti katerega tipa je spremenljivka je ta definirana za imenom funkcije vendar pred zacetnim zavitim oklepajem torej stavek v vrstici int number pove funkciji da bo podana vrednost tipa integer celostevilska ko smo vse to opravili imamo vrednost index a iz glavnega programa podano funkciji square vendar preimenovano v number in tako dosegljivo za uporabo to je klasicni stil definiranja funkcijskih spremenljivk ki je v uporabi ze od prvih verzij jezika c novejsa in mnogo boljsa metoda pa pridobiva na popularnosti zaradi njenih mnogih prednosti obdelali pa jo bomo pozneje v tem poglavju za zacetnim zavitim oklepajem definiramo novo spremenljivko numsq za uporabo samo v tej funkciji vec o tem kasneje in pricnemo s potrebnimi izracuni spremenljivki numsq priredimo vrednost kvadrata spremenljivke number nato pa numsq pristejemo trenutni vsoti ki se nahaja v spremenljivki sum iz prejsnjega poglavja se spomnimo da izraz sum numsq pomeni isto kot sum sum numsq v vrstici izpisemo stevilo in njegov kvadrat nato pa se vrnemo v glavni program vec o podajanju vrednosti funkcijam ko smo vrednost spremenljivke index podali funkciji se je zgodilo nekoliko vec kot se zdi na prvi pogled funkciji nismo podali spremenljivke index pac pa smo ji podali kopijo njene vrednosti tako je izvirna vrednost zascitena pred nenamerno zlorabo funkcije spremenljivko number bi lahko v funkciji square spreminjali na katerikoli zeleni nacin ko pa bi se vrnili v glavni program se vrednost spremenljivke index ne bi spremenila tako lahko zascitimo spremenljivko pred zlorabo ne moremo pa vracati njene vrednosti klicajoci funkciji iz klicane funkcije videli bomo da obstaja dobro definirana metoda ko bomo prisli do polj in se ena ko bomo obdelali kazalce do takrat pa bo edini nacin komunikacije s klicoco funkcijo s pomocjo uporabe globalne spremenljivke nakazali smo ze nekaj stvari o globalnih spremenljivkah vec o njih pa bomo povedali pozneje v tem poglavju ce nadaljujemo v main funkciji pridemo do zadnjega funkcijskega klica klica funkcije ending v vrstici ta vrstica poklice funkcijo ki nima definiranih nobenih lokalnih spremenljivk izpise sporocilo in vrednost spremenljivke sum ki jo vsebuje in tako zakljuci program program se konca z vrnitvijo v main funkcijo in ker tam ne najde nicesar vec se program zakljuci prevedite in pozenite ta program in si oglejte izpis sedaj pa priznanje majhne lazi pred kratki sem dejal da je edini nacin prenosa vrednosti do klicoce funkcije z uporabo globalne spremenljivke vendar pa obstaja se en nacin katerega bomo obdelali ko boste nalozili in si ogledali program squares c v tem primeru bomo videli da je lahko vrniti posamezno vrednost iz klicane funkcije v klicoco funkcijo vendar se enkrat ce hocemo vrniti vec kot eno vrednost bomo morali spoznati polja ali pa kazalce primer programa squares c v main funkciji definiramo dve celostevilski spremenljivki in zacnemo s for zanko ki se bo izvedla osemkrat prvi stavek v for zanki je y squ x kar je nov in precej nenavaden konstrukt iz presnjih izkusenj vam verjetno ni tez ko sklepati da je del stavka squ x klic funkcije squ ki s seboj vzame vrednost x a kot parameter ce pogledamo naprej v vrstico vidimo da funkcija vhodno spremenljivko imenuje raje input in njegovo vrednost kvadrira rezultatu pa da ime square v vrstici pa se pojavi nova vrsta stavka return stavek vrednost v oklepaju je podana sami funkciji in se vrne kot vrednost ki jo lahko uporabimo v glavnem programu tako funkcijskemu klicu squ x priredimo vrednost kvadrata ki jo potem vrnemo v glavni program tako da dobi y vrednost kvadrata ce bi torej pred klicem x u dodelili vrednost bi y zaradi vrstice dobil vrednost oklepaj okrog vracajoce vrednosti v vrstici ni nujno potreben vendar ga vecina izkusenih programerjev vseeno zapise drug nacin kako si to lazje predstavljamo je da si mislimo da je izraz squ x samo se ena spremenljivka ki ima vrednost x in jo lahko postavimo kamorkoli lahko postavimo spremenljivko tega tipa vrednosti spremenljivk x in y nato se izpisemo da bi prikazali da lahko izraz squ x res uporabljamo kot navadno spremenljivko je v vrstici zapisana se ena for zanka kamor namesto imena spremenljivke v printf stavek postavimo kar klic funkcije se eno zadevo je treba omeniti tip vrednosti ki jo funkcija vraca moramo definirati da bi imeli smiselne podatke ce pa tega ne storimo prevajalnik definira vrednost kot tip int ce zelimo imeti katerega od drugih tipov moramo to izrecno definirati kako to storimo bo prikazano v naslednjem programu v tem programu uporabljamo kar vrednost ki nam jo definira prevajalnik prevedite in pozenite ta program ki prav tako uporablja klasicno metodo definiranja funkcijskih spremenljivk se enkrat zanemarite vsa opozorila funkcije ki vracajo stevila s plavajoco vejico primer programa floatsq c nalozite program floatsq c kot primer klasicno definirane funkcije ki vraca vrednost tipa float zacne se z definicijo globalne spremenljivke s plavajoco vejico z katero bomo uporabili kasneje nato v glavnem programu definiramo celostevilsko spremenljivko in nato se dve spremenljivki s plavajoco vejico sledita pa se dve nenavadni definiciji izraza sqr in glsqr izgledata kot klica funkcij to je pravilen nacin definicije da funkcija ne bo vracala vrednosti tipa int pac pa nekega drugega tipa v tem primeru float to pove prevajalniku da bo vrednost prenesena iz teh dveh funkcij tipa float to je se enkrat klasicna metoda definiranja in je ze zastarel bodite pozorni da iz vrstice ne klicemo nobene izmed teh dveh funkcij pac pa le deklariramo tip ki jih bosta vracali sedaj si oglejte funkcijo z imenom sqr ki se zacne v vrstici in videli boste da pred imenom funkcije stoji rezervirana beseda float to je znak prevajalniku da bo funkcija vracala vrednost tipa float vsakemu programu ki jo bo klical tip ki ga funkcija vraca je sedaj kompatibilen z njenim klicem vrstica ki sledi imenu funkcije vsebuje izraz float inval kar je znak prevajalniku da bo vrednost podana tej funkciji iz klicanega programa tipa float ker smo klicatelju povedali da bomo vracali tip float to v resnici storimo v vrstici tako da se vse ujema funkcija glsqr z zacetkom v vrstici bo prav tako vracala tip float vendar pa za vhod uporablja globalno spremenljivko kvadriranje izvaja v samem return stavku in zato ne rabi se ene spremenljivke kamor bi shranjevala rezultat podobno bi lahko delovala tudi funkcija sqr vendar smo to storili posebej da bi pokazali da se da to storiti tudi tako splosna oblika tega programa vam ne bi smela delati problemov in je zato ne bomo podrobneje obravnavali kot je priporocljivo z ostalimi primeri tudi tega prevedite in pozenite in zanemarite vsa opozorila ki jih boste dobili klasicni stil trije programi ki smo jih obdelali do sedaj v tem poglavju uporabljajo klasicni stil definiranja funkcij ceprav je bil to prvi stil definiran v c ju ga hitro zamenjuje modernejsa metoda definicij funkcije saj le ta veliko bolje odkriva in oznacuje napake ko boste brali clanke v c ju boste zasledili klasicno metodo zato jo morate znati prebrati to je razlog za vkljucitev tega stila v tecaj priporocil pa bi vam da se naucite in uporabljate novejso metodo katero bomo kmalu obdelali svetujem vam celo da v svojem programiranju ne uporabljate klasicnega stila knjiga avtorjev kernigan in ritchie a the c programming language second edition je najbolj primerno berilo o klasicnem stilu preostanek tega tecaja bo uporabljal modenro metodo kot je predlagana in definirana v ansi c standardu ce imate starejsi prevajalnik se vam lahko zgodi da kateri od primerov ne bodo delovali zato je na vas da jih spremenite v klasicni stil nazadnje je ansi c standard uporabljan tako splosno da bi bilo pametno da si nabavite prevajalnik kompatibilen z ansi c standardom ce tega se niste storili tip ki ga vraca funkcija main v izvirni k r definiciji c ja so vse funkcije standarno vracale tip int ce avtor ni zahteval cesa drugega ker je bilo ekspicitno definiranje vracajocega tipa izbirno je bila vecina c ja napisanega na ta nacin main ko pa so bili v jezik dodani prototipi katere bomo obdelali kmalu pa so nekateri programerji smatrali da main funkcija ne vraca nicesar zato so za tip vracanih vrednosti uporabili tip void zato je kmalu postala obicajna praksa pisati main funkcijo na naslednji nacin void main ko je bil ansi c standard koncan je bil edini dovoljeni tip vracanih vrednosti tip int dober prevajalnik bo preveril ce program v resnici vraca vrednost tako da bo zahteval da se iz vsake izstopne tocke vraca vrednost tipa int to je vodilo do naslednje oblike funkcije main int main return ocitno zaradi vztrajnosti uporabe tipa void je veliko piscev prevajalnikov vkljucilo void kot tip vracanih vrednosti kot razsiritev da bi lahko uporabljali kode brez sprememb nekateri prevajalniki zato podpirajo tip void vendar pa je tip int edini odobren s strani ansi c standarda da bi svojo kodo naredili kar se da prenosljivo uporabljajte kodo zadnjo omenjeno zgoraj koncno lahko vidite zakaj smo v programe dodajali vrstico ki vraca vrednost nic operacijskemu sistemu to je namrec znak operacijskemu sistemu da se je program izvrsil normalno obmocje veljavnosti spremenljivk primer programa scope c nalozite naslednji program scope c in si ga oglejte za razlago obmocja veljavnosti spremenljivke v programu vrstice od do lahko zenkrat zanemarite saj jih bomo obdelali pozneje za ta program bomo porabili kar nekaj casa in pokrili veliko novih tem mnoge od njih se vam ne bodo zdele uporabne vendar jih skusajte razumeti saj so zelo pomembne kaj je globalna spremenljivka spremenljivka definirana v vrstici je globalna spremenljivka imenovana count in je dostopna katerikoli funkciji saj je definirana pred vsemi funkcijami vedno je dostopna zato ker obstaja celoten izvajalni cas programa to bo razlozeno v kratkem nizje v programu je v vrstici definirana se ena globalna spermenljivka counter ki je prav tako globalna ni pa dostopna main funkciji saj je deklarirana za njo globalna spremenljivka je vsaka spremenljivka ki je deklarirana izven katerekoli funkcije vcasih se te spremenljivke omenja tudi kot zunanje spremenljivke saj so zunanje vsem funkcijam vcasih pa jim pravijo tudi datotecne spremenljivke globalnim spremenljivkam se avtomatsko dodeli vrednost nic ob deklaraciji zato bosta spremenljivki count in counter obe inicializira na vrednost nic vrnite se na main funkcijo in videli boste spremenljivko index definirano kot tip int za trenutek pozabite besedo register spremenljivka je dosegljiva le v main funkciji kjer je deklarirana dodatno je tudi avtomatska spremenljivka kar pomeni da zacne obstajati ko se izvrsuje funkcija v kateri je definirana in preneha obstajati ko je izvajanje funkcije koncano to v tem konkretnem primeru ne pomeni nicesar saj je funkcija main vedno aktivna tudi ko prepusti programsko kontrolo drugi funkciji v zavitem oklepaju ki oznacuje for zanko je definirana se ena celostevilska spremenljivka stuff vsak pa zavitih oklepajev lahko vsebuje deklaracije spremenljivk ki bodo dostopne le takrat ko bo program izvrseval stavke ki se nahajajo med tema dvema zavitima oklepajema te spremenljivke bodo avtomaticne in bodo prenehale obstajati ko se prenehajo izvajati stavki v zavitem oklepaju spremenljivka stuff se bo torej kreirala in unicila osemkrat enkrat ob vsakem prehodu skozi zanko vec o avtomatskih spremenljivkah oglejte si funkcijo head v vrstici ki izgleda nekoliko cudno saj je beseda void uporabljena dvakrat smisel uporabe te besede bo razlozen kasneje funkcija vsebuje spremenljivko index ki z spremenljivko index iz main funkcije nima nicesar skupnega razen tega da sta obe avtomtski spremenljivki ko program ne izvaja stavkov te funkcije spremenljivka index sploh ne obstaja ko poklicemo funkcijo head se spremenljivka generira ko pa funkcija izvede vse svoje stavke pa spremenljivka index iz funkcije head preneha obstajati avtomatske spremenljivke se shranijo na sklad kar bomo obdelali kasneje zapomnite pa si da to nima nobenega ucinka na spremenljivko index v funkciji main saj je ta cisto druga zadeva avtomatske spremenljivke so torej avtomaticno kreirane ko jih potrebujemo nato pa so tudi avtomatsko unicene pomembna stvar ki si jo je treba zapomniti je ta da moramo po nekem klicu funkcije ko jo klicemo se enkrat ponovno inicializirati avtomatske spremenljivke saj se njihove vrednosti ne ohranijo kaj so staticne spremenljivke sedaj moramo omeniti se en tip spremenljivk staticne spremenljivke s tem ko pred deklaracijo spremenljivke v funkciji postavimo rezervirano besedo static postane ta spremenljivka oziroma te spremenljivke staticne kar pomeni da bodo obstajale od enega klica do drugega staticna spremenljivka je inicializirana enkrat ob nalozitvi programa in se med inicializacijo programa nikoli ne reinicializira ce pa rezervirano besedo static postavimo pred zunanjo spremenljivko to je tisto ki nastopa izven vseh funkcij jo naredimo privatno in je ni mozno uporabljati v drugih datotekah to je popolnoma drugacna uporaba enake rezervirane besede to nakazuje da je mozno zunanje spremenljivke uporabljati v drugih posebej prevedenih datotekah kar je res mozno primeri take uporabe bodo podani v poglavju ne bodo pa prikazani tukaj ponovna uporaba istega imena preidite na funkcijo head vsebuje drugo definicijo spremenljivke count ceprav je bil count ze definiran kot globalna spremenljivka v vrstici ni nicesar narobe z uporabo enakega imena spremenljivke v tej funkciji to je popolnoma nova spremenljivka ki nima nobene zveze s tisto globalno povzroci pa pa globalna spremenljivka count ni dosegljiva v tej funkciji to omogoca pisanje programov kjer pri pisanju funkcij ni potrebno skrbeti ce je ime ze bilo uporabljeno za kaksno od globalnih spremenljivk saj ne more priti do imenskega konflikta morate le poskrbeti za spremenljivke ki potem s to funkcijo komunicirajo kaj je registrska spremenljivka da izpolnimo prej dano obljubo bomo sedaj definirali register tip spremenljivke racunalnik lahko podatke hrani v registrih ali pa v pomnilniku registri so veliko hitrejsi vendar pa je le nekaj registrov na voljo programerju ce v programu nastopajo spremenljivke ki se zelo intenzivno uporabljajo lahko racunalniku narocite da bo te spremenljivke shranil v registre in tako nekoliko pospesite delovanje programa kako to storite je prikazano v vrstici vas prevajalnik vam verjetno omogoca deklaracijo ene ali vec registrskih spremenljivk ce pa jih zahtevate vec pa bo nadaljne zahteve ignoriral v dokumentaciji za prevajalnik bi moralo pisati koliko registrskih spremenljivk omogoca prav tako bi moralo pisati katere tipe spremenljivk lahko shranite v register ce pa prevajalnik ne omogoca uporabe registrskih spremenljivk se bo zahteva po hranjenju v registru preprosto ignorirala kaj je uporaba prototipov prototip je nek model resnicne stvari in ko programirate v c ju imate moznost definirati model vsake funkcije za vas prevajalnik le ta lahko uporabi modele da preveri vse klice funkcij in tako ugotovi ce ste uporabili pravilno stevilo argumentov v klicu funkcije in ce so ti pravilnega tipa z uporabo prototipov dosezete da prevajalnik nekoliko bolj preverja ce so v programu kaksne napake ansi c standard vsebuje prototipe kot del priporocljivega standarda vsak ansi c prevajalnik ima moznost uporabe prototipov zato bi bilo dobro da bi se jih naucili uporabljati veliko vec o prototipih bomo spoznali kasneje ce se vrnem na vrstice in v scope c najdemo prototipe za vse tri funkcije ki jih program vsebuje prvi void v vsaki vrstici sporoca prevajalniku da te funkcije ne vracajo nobenih vrednosti tako da bi prevajalnik stavek index head oznacil kot napako saj funkcija ne vraca nicesar kar bi lahko priredili spremenljivki index beseda void v oklepaju pove prevajalniku da ta funkcija ne potrebuje nobenih parametrov in ce bi bila tu zapisana spremenljivka bi bila to napaka prevajalnik pa bi javil opozorilo ce bi torej napisali stavek head index bi to bila napaka to vam omogoca da izvajate preverjanje tipov podobno kot pri programiranju v pascalu moduli ali adi ceprav je preverjanje tipov v c ju relativno sibko ze zdaj bi morali zaceti uporabljati prototipe za preverjanje za vse funkcije ki jih definirate vas prevajalnik ima morda tudi moznost ki bo zahtevala prototip za vsako funkcijo preglejte vaso dokumentacijo kako to storite uporaba prototipov bo uporabljena skozi celoten tecaj ce prevajalnik ne podpira prototipov in moderne metode definiranja funkcij boste morali spremeniti preostale primere veliko boljsa resitev pa bi bila nabava novega prevajalnika vrstica programa scope c pove sistemu da naj gre v standardni direktorij kjer so shranjene vkljucitvene datoteke in vzame kopijo datoteke stdio h ki vsebuje prototipe za standardne vhodne in izhodne funkcije da jih boste lahko preverili ce vsebujejo pravilne tipe spremenljivk ne skrbite se prevec glede include stavka razlozen bo pozneje zagotovo prevedite in pozenite ta program standardne funkcijske knjiznice vsak prevajalnik dobite skupaj z nekaj standardnimi ze definiranimi funkcijami ki so pripravljene za uporabo to so vecinoma vhodno izhodne funkcije funkcije za znakovno manipulacijo ter manipulacijo z nizi in pa matematicne funkcije veliko od teh funkcij si bomo ogledali v poznejsih poglavjih prototipi so ze definirani s strani avtorja prevajalnika za vse funkcije ki ste jih dobili poleg prevajalnika vecina prevajalnikov ima ze definirane se neke dodatne funkcije ki omogocajo programerju da dobi od svojega racunalnika kar je najvec mogoce v primeru ibm pc in kompatibilnih racunalnikov so to funkcije ki omogocajo uporabo bios ovih servisov ali pisanje direktno na zaslon monitorja ali pa na katerokoli mesto v pomnilniku te funkcije tu ne bodo podrobneje predelane saj boste te edinstvene lastnosti lahko obdelali sami nekateri primeri teh funkcij pa so uporabljeni v primerih v poglavju kaj je rekurzija primer programa recurson c rekurzija je se ena izmed tistih programskih tehnik ki se vam na zacetku zdijo zelo nerazumljive na prvi pogled ce pa si ogledate program recurson c pa bomo to tehniko podrobno spoznali to je verjetno najbolj enostaven rekurzijski program kar se jih da napisati in je v resnicni praksi neuporaben program za namen prikaza pa je odlicen rekurzija ni nic drugega kot funkcija ki klice samo sebe zato je v zanki ki mora imeti nek nacin kako naj se konca v program ki ga trenutno gledate v vrstici spremenljivki index priredimo vrednost in jo uporabimo kot argument funkcije count dn funkcija enostavno dekrementira spremenljivko jo izpise skupaj z nekim sporocilom in ce je spremenljivka vecje od nic poklice samo sebe zopet dekrementira spremenljivko jo izpise itd nazadnje bo spremenljivka dosegla vrednost nic in funkcija bo prenehala s klicanjem same sebe namesto tega se bo vrnila na prejsnji klic nato se na prejsnjega dokler nas ne bo nazadnje vrnila v main funkcijo in od tam v operacijski sistem za namen razumevanja si lahko mislite da imate na voljo osem kopij funkcije count dn in klicete vsako posebej tako da vodite evidenco katera je trenutno na vrsti to ni cisto enako temu kar se je v resnici zgodilo je pa precej dobra ilustracija da bi razumeli kar se je zgodilo kaj je rekurzija naredila vseeno je potrebna boljsa razlaga kaj se je zgodilo ko ste poklicali funkcijo iz sebe je vse spremenljivke in vse notranje zaznamke ki jih potrebuje shranila nekam v nek sklop ko je naslednjic poklicala samo sebe je storila isto shranila naslednji sklop vsega kar potrebuje da konca klic funkcije nadaljevala je z kreiranjem in shranjevanjem teh sklopov dokler ni dosegla zadnjega klica ko je zacela te sklope dobivati nazaj in jih uporabljati za kompletiranje vseh funkcijskih klicev sklopi so se shranili v notranji del racunalnika ki se imenuje sklad to je del pomnilnika skrbno organiziranega za hranjenje tako opisanih podatkov izven dosega tega programa je podrobno opisovanje sklada bilo pa bi v dobro vasih programerskih izkusenj da si preberete nekaj ctiva o skladu sklad se v skoraj vseh modernih racunalnikih uporablja za notranja gospodinjska dela pri uporabi rekurzije boste morda zeleli napisati program ki uporablja posredno rekurzijo ki je nasprotje neposredne rekurzije uporabljene tukaj pri posredni rekurziji bi funkcija a poklicala funkcijo b ki bi spet poklicala funkcijo a itd to je popolnoma legalno sistem bo poskrbel da po postavil potrebne stvari na sklad in jih z njega spet jemal ko bodo potrebne ni razloga da ne bi imeli tri funkcije ki bi druga drugo klicala v krogu ali tri ali stiri c jevski prevajalnik bo namesto vas poskrbel za vse podrobnosti stvar ki si jo morate pri rekurziji zapomniti da mora nekaj v nekem trenutku postati nic ali doseci neko prej definirano tocko kjer se bo zanka koncala ce tega ne boste storili boste dobili neskoncno zanko sklad se bo napolnil povzrocil napako in ustavil program nekoliko burno se en primer rekurzije primer programa backward c program backward c vsebuje se en primer rekurzije zato ga nazite in si ga oglejte program je podoben zadnjemu le da uporablja znakovno polje vsak zaporedni klic funkcije forward and backwards povzroci izpis enega znaka prav tako se po en znak izpisuje vsakic ko se funkcija konca tokrat v obratnem vrstnem redu ko sledimo nizu rekurzivne funkcije ta program uporablja moderno metodo definiranja funkcij in vkljucuje vse definicije prototipov moderna metoda definiranja funkcij premakne tipe spremenljivk v oklepaj skupaj z samim imenom spremenljivke koncni rezultat je da izgleda taka vrstica podobno kot ustrezne vrstica v jezikih ki imajo mocnejse preverjanje tipov kot so pascal modula ali ada prototip v vrstici je enostavno kopija glave funkcije v vrstici sledi pa mu se podpicje razvijalci c ja so celo omogocili da v oklepaj prototipa postavite ime spremenljivke ki ga prevajalnik sicer ignorira vendar pa iz takega zapisa vidite kako spremenljivka deluje ter ima tako vlogo komentarja ne obremenjujte se z znakovnim poljem ali drugim novim gradivom predstavljenim tukaj ko boste predelali sedmo poglavje vam bo ta program popolnoma jasen bilo je namrec vazno da se prikaze se en primer rekurzije zato je ta primer vkljucen tu opazili boste da program naredi nekaj uporabnega z rekurzijo vendar pa bi program z lahkoto napisal brez rekurzije pozneje si bomo ogledali nekaj programov kjer je rekurzija nujno potrebna prevedite in pozenite ta program in opazujte rezultate program kvadriranja stevil s plavajoco vejico s prototipi primer programa floatsq c nalozite in si oglejte program floatsq c ki je natancna kopija programa floatsq c ki smo si ogledali prej le da ima dodane prototipe uporaba prototipov je zadeva ki je priporocljiva za ucenje vsem c jevskim programerjem nekaj stvari je pri tem programu treba poudariti prvic besede float na zacetku vrstic in so znak prevajalniku da so to funkcije ki vracajo vrednosti tipa float prav tako ker so prototipi funkcij zapisani pred main funkcijo jih v vrstici ni potrebno definirati kot smo to storili v vrstici v programu floatsq c na zacetku tega poglavja bodite pozorni da je tudi tip spremenljivke inval zapisan v oklepaju v vrsticah in ko boste prevedli in pognali ta program zanemarjujoc vsa opozorila zbrisite parameter iz vrstice in poglejte kaksno sporocilo napake boste dobili nejasen problem ki se vcasih pojavi recimo da bi v program floatsq c zapisali naslednjo vrstico kode printf sqr glsqr morda je presenetljivo vendar pa je vrstni red klicanja funkcij kar se tice ansi c standarda nedefiniran nek prevajalnik bo morda najprej poklical sqr funkcijo drugi pa funkcijo glsqr obe metodi sta namrec pravilni v tem primeru ni pomembno katera se poklice najprej v nekaterih primerih pa to je pomembno recimo da bi nekaj zeleli izpisati iz obeh funkcij rezultat vsakega klica bo uporabljen na pravi lokaciji vrstni red izvajanja pa je nedefiniran bodite prepricani da se bo to vprasanje prej ali slej pojavilo tudi v vasem programiranju zato se ga morate zavedati se vec stilskih predlogov primer programa style c primer imenovan style c je podan kot ilustracija razlicnih nacinov formatiranja funkcije opazili boste razlicne nacine definiranja vhodnega parametra primera tri in stiri oba uporabljata enak stil vendar cetrti primer prikazuje stil ko funkciji nicesar ne podajamo niti nam nicesar ne vraca slog pisanja zelo jasno nakazuje da funkcija nicesar ne potrebuje in nicesar ne vraca zato tega ne moremo razlagati kot to da smo nekaj izpustili porabite nekaj casa da preucite te primere nato pa zacnite razvijati slog ki ga boste uporabljali ce ste kot vecina programerjev boste razvili slog ki ga nameravate uporabljati vse svoje zivljenje nato pa ga boste zamenjali vsakih nekaj mesecev ali pa ob vsakem novem projektu naloge iz programiranja se enkrat napisite tempconv c iz enega prejsnjih poglavij in prestavite racunanje temperature v funkcijo napisite program ki desetkrat izpise vase ime na zaslon s klici funkcije ki ime izpisuje pomaknite klicano funkcijo pred main funkcijo da ugotovite ce vas prevajalnik to omogoca dodajte prototipe v programa sumsqres c and squares c in spremenite definicije funkcij v moderno metodo povratek na kazalo prehod na poglavje copyright coronado enterprises prevedel saso kuntaric