= Vaje programiranja v jeziku C = Pravilnost vaših nalog lahko preverite z [http://lecad.si/cgi-bin/cclass.cgi Ocenjevalcem nalog] Prvi dve vaji, ki smo jih naredili v laboratoriju, je potrebno preveriti in morebiti popraviti, da delujeta pravilno. = Vprašanja za utrjevanje = 1. Zakaj je potrebno napisati vrstico {{{#include }}} 1. Kako uporabljamo komentarje? 1. Zakaj je zamikanje stavkov pomembno? Ali prevajalnik upošteva zamikanje? 1. Koliko decimalk hrani tip {{{int, float}}} in {{{double}}}? 1. Kakšna je razlika pri prireditvi konstante spremenljivkama '''c''' in '''d''' {{{ #!c float c = 3/2; float d = 3.0/2; }}} 1. Kaj je funkcija podpičja v stavku? Naštej kje vse ga je potrebno uporabiti. 1. Koliko je numerična vrednost naslednjega izraza {{{ #!c int i = 5 < 6; }}} 1. Pod katerimi pogoji naslednja koda izpiše '''voda'''? Kako bi jasneje napisali napisane pogojne stavke z uporabo zavitih oklepajev in primernejšega zamikanja? {{{ #!c if(temp < 0) printf("led\n"); else if (temp < 100) printf("voda\n"); else printf("para\n"); }}} 1. Kaj izpiše naslednja koda? {{{ #!c int x = 3; if (x) printf("da\n"); else printf("ne\n"); }}} 1. Kaj bo izpisala naslednja koda? {{{ #!c int i; for(i = 0; i < 3; i++) printf("a\n"); printf("b\n"); printf("c\n"); }}} 1. Koliko elementov vsebuje polje oz. vektor '''a'''? Kateri je prvi element? Kateri je zadnji? {{{ #!c int a[5]; }}} 1. Kaj je narobe v naslednjem izvlečku kode? {{{ #!c int a[5]; for(i = 1; i <= 5; i = i + 1) a[i] = 0; }}} 1. Kateri so štirje pomembni deli funkcije? Katere tri mora klicoči program poznati? 1. Kakšna je razlika med ''prefix'' in ''postfix'' operatorjem ++. Kakšna je razlika med naslednjima izrazoma: {{{ #!c i = i++; i = ++i; }}} 1. Kaj je narobe z naslednjim predprocesorskim izrazom? {{{ #!c #define N 10; }}} 1. Če smo na primer definirali makro {{{ #!rst .. code-block:: c #define SQR(x) x*x Zakaj nam potem izraz .. code-block:: c y = 1/SQR(x); ne deluje pravilno? Kako bi morali pravilno napisati makro SQR(x), da bi delal tudi za izraze .. code-block:: c y = 1/SQR(1-x); }}} 1. Kakšna je razlika v uporabnosti med '''i''' in '''J''', ki sta napisana kot {{{ #!rst .. code-block:: c int i = 10; #define J 10 Napotek: Poskusi napisati ``J = 2`` ali ``int a[i]``. }}} 1. Zakaj je potrebno v {{{scanf()}}} argumente za formatnim stavkom pisati z &, pri {{{printf()}}} pa tega ne smemo? 1. Koliko spomina klic {{{ #!rst .. code-block:: c malloc(10) alocira? Kaj moramo napisati če želimo alocirati spomin za 10 spremenljivk tipa float? }}} 1. Kaj mislimo z ''enakostjo med polji in kazalci'' v C-ju? 1. Če je {{{p}}} kazalec, kaj potem pomeni {{{p[i]}}}? 1. Kako odpiramo datoteko za branje podatkov iz nje? Kaj se spremeni, če bi datoteko želeli odpreti za pisanje? = Naloge = Naloge je potrebno shraniti z uporabo SVN ukazov in preveriti njihovo delovanje. == vaja1 == Napiši program, ki zahteva vnos dveh celih številk in nato izpiše njihovo vsoto. == vaja2 == Gaussovo kvadratura naj vpraša za meji integriranja funkcije f(x) = 2x^4^- x^3^ +1 in rezultat izpiše na zaslon. == vaja3 == Izdelaj program ki izpiše naslednje zanke: {{{ #!c for(i = 0; i < 10; i = i + 2) printf("%d\n", i); for(i = 100; i >= 0; i = i - 7) printf("%d\n", i); for(i = 1; i <= 10; i = i + 1) printf("%d\n", i); for(i = 2; i < 100; i = i * 2) printf("%d\n", i); }}} Razjasni si, kako te zanke delujejo in program popravi tako, da bodo v zanki uporabljeni operatorji +=, -=, *= == vaja4 == Napiši program ki izpiše ta trikotnik: {{{ * ** *** **** ***** ****** ******* ******** ********* ********** }}} Ne uporabi desetih printf() ampak uporabi zanko. {{{ #!c for(i = 0; i < 10; i = i + 1) { /* Več stavkov */ /* gre lahko tukaj */ } }}} == vaja5 == Izpiši v zanki cela števila od 1 do 10 in njihove kvadrate. {{{ 1 1 2 4 3 9 ... 10 100 }}} {{{ #!comment http://www.eskimo.com/~scs/cclass/asgn.beg/PS1.html }}} == vaja6 == Stavek '''for''' je prav zaprav, okrajšava za stavek '''while'''. Predelaj program, ki izpiše naslednjo zanko: {{{ #!c for(i = 0; i < 10; i = i + 1) printf("i je %d\n", i); }}} z uporabo stavka '''while''', ki ima naslednjo obliko {{{ #!c while(pogoj) { /* vpiši stavek za povečanje števca in izpis */ } }}} Napotek: V primeru da se nam program ''obesi'' v neskončni zanki, ga prekinemo s pritiskom na crtl-C == vaja7 == Pretipkaj in poženi naslednji program: {{{ #!c #include int main() { int i; printf("stavek 1\n"); printf("stavek 2\n"); for(i = 0; i < 10; i = i + 1) { printf("stavek 3\n"); printf("stavek 4\n"); } printf("stavek 5\n"); return 0; } }}} Program ne naredi nič posebnega. Z njim želimo le pojasniti vpliv zavitih oklepajev v zanki in dobiti željen ''potek programa''. == vaja8 == Pretipkaj in poženi naslednji program: {{{ #!c #include int main() { int i, j; printf("začetek programa\n"); for(i = 0; i < 3; ++i) { printf("i je %d\n", i); for(j = 0; j < 5; j++) printf("i je %d, j je %d\n", i, j); printf("konec v zanki i = %d\n", i); } printf("konec programa\n"); return 0; } }}} Tudi ta program ne naredi kaj dosti koristnega. Želi pokazati, kako zanke delujejo in kako jih ''gnezdimo''. V vaji 4 je potrebno uporabiti prikazani način dvojne zanke. == vaja9 == == vaja10 == Izračunaj faktor Učinkovite Rabe Energije, tako kot ga podaja [http://www.elektro-ljubljana.si/slo/Ceniki Elektro Ljubljana]. Dobavitelj v ceniku za vsak '''razred porabe''' določi '''faktor cene energije''', ki je osnova za izračun faktorja URE po naslednji enačbi: URE = ∑(E,,i,, F,,CE i,,)/E,,povprečna dnevna poraba,, Tabela razredov porabe in pripadajočimi faktorji cene električne energije] ima 5 razredov s progresivno stopnjo F,,CE,, ||Razred porabe||Povprečna dnevna poraba energije (E,,i,,)||Faktor cene energije (F,,CE,,)|| ||1.razred||do 6 kWh dnevne porabe||1.0|| ||2.razred||nad 6 do vključno 12 kWh dnevne porabe||1.1|| ||3.razred||nad 12 do vključno 18 kWh dnevne porabe||1.3|| ||4.razred||nad 18 do vključno 24 kWh dnevne porabe||1.5|| ||5.razred||nad 24 kWh dnevne porabe||2.0|| Na primer URE za 8kWh dnevne porabe izračunamo kot URE=(6*1.0-(8-6)*1.1)/8 Tabela[http://www.elektro-ljubljana.si/_services/document.php?name=ure__faktorji_uinkovite_rabe_energije_za_posamezno_povpreno_dnevno_porabo.pdf&langId=Slo&pageId=89 URE Faktorjev učinkovite rabe energije za posamezno povprečno dnevno porabo], se računajo samo za celoštevilčni del povprečne dnevne porabe. Izdelaj program, ki za vnešeno realno povprečno porabo izpiše faktor URE v formatu, kot je v pred izračunani tabeli. Napotek: Za izračun celega dela realnega števila uporabite funkcijo '''floor'''. == vaja11 == Ceno za uporabo omrežij določa Akt o določitvi metodologije za obračunavanje omrežnine in metodologije za določitev omrežnine in kriterijih za ugotavljanje upravičenih stroškov za elektroenergetska omrežja, (Ur.l. RS 121/2005) in je sestavljena iz: - stalnega mesečnega prispevka za moč, ki zanaša 0,66179 €/kW/mesec - cene za prenešeno delovno energijo, ki znaša: * v primeru dvotarifnega načina merjenja porabe električne energije: {{{ VT: 0,03731 €/kWh MT: 0,02924 €/kWh }}} * v primeru enotarifnega načina merjenja porabe električne energije: {{{ ET: 0,03462 €/kWh }}} Izdelaj program, ki uporabnik vpraša po predvidenem mesečnem številu kWh VT in NT in izpiše ceno za prenešeno delovno energijo v primeru dvotarifnega in v primeru enotarfnega načina merjenja porabe električne energije. Uporabniku naj glede na vnešena podatka program svetuje, kateri način je zanj najbolj primeren. == vaja12 == Če ste izdelali vajo 10 in 11, potem združite programa v vaji 12 tako, da izračunate kako bo z elektriko po novem sistemu z URE faktorjem. Obračun porabljene električne energije na podlagi izračunanega faktorja URE se izvede tako, da se pomnoži količina električne energije v posamezni tarifi, s ceno električne energije v tej tarifi in z izračunanim odjemalčefim faktorjem URE. Upoštevajte, da ima mesec 31 dni. Program pa naj tako kot v vaji 11 vpraša za število kWh v visoki in nizki tarifi, izpiše posamezne cene ter svetuje najprimernejši način tarifiranja.