Version 14 (modified by 16 years ago) (diff) | ,
---|
Vaje programiranja v jeziku C
Pravilnost vaših nalog lahko preverite z Ocenjevalcem nalog
Prvi dve vaji, ki smo jih naredili v laboratoriju, je potrebno preveriti in morebiti popraviti, da delujeta pravilno.
Vprašanja za utrjevanje
- Zakaj je potrebno napisati vrstico
#include <stdio.h>
- Kako uporabljamo komentarje?
- Zakaj je zamikanje stavkov pomembno? Ali prevajalnik upošteva zamikanje?
- Koliko decimalk hrani tip
int, float
indouble
? - Kakšna je razlika pri prireditvi konstante spremenljivkama c in d
float c = 3/2; float d = 3.0/2;
- Kaj je funkcija podpičja v stavku? Naštej kje vse ga je potrebno uporabiti.
- Koliko je numerična vrednost naslednjega izraza
int i = 5 < 6;
- Pod katerimi pogoji naslednja koda izpiše voda? Kako bi jasneje napisali napisane pogojne stavke z uporabo zavitih oklepajev in primernejšega zamikanja?
if(temp < 0) printf("led\n"); else if (temp < 100) printf("voda\n"); else printf("para\n");
- Kaj izpiše naslednja koda?
int x = 3; if (x) printf("da\n"); else printf("ne\n");
- Kaj bo izpisala naslednja koda?
int i; for(i = 0; i < 3; i++) printf("a\n"); printf("b\n"); printf("c\n");
- Koliko elementov vsebuje polje oz. vektor a? Kateri je prvi element? Kateri je zadnji?
int a[5];
- Kaj je narobe v naslednjem izvlečku kode?
int a[5]; for(i = 1; i <= 5; i = i + 1) a[i] = 0;
- Kateri so štirje pomembni deli funkcije? Katere tri mora klicoči program poznati?
- Kakšna je razlika med prefix in postfix operatorjem ++. Kakšna je razlika med naslednjima izrazoma:
i = i++; i = ++i;
- Kaj je narobe z naslednjim predprocesorskim izrazom?
#define N 10;
- Če smo na primer definirali makro
#define SQR(x) x*x
Zakaj nam potem izraz
y = 1/SQR(x);
ne deluje pravilno? Kako bi morali pravilno napisati makro SQR(x), da bi delal tudi za izraze
y = 1/SQR(1-x);
- Kakšna je razlika v uporabnosti med i in J, ki sta napisana kot
int i = 10; #define J 10
Napotek: Poskusi napisati J = 2 ali int a[i].
- Zakaj je potrebno v
scanf()
argumente za formatnim stavkom pisati z &, priprintf()
pa tega ne smemo? - Koliko spomina klic
malloc(10)
alocira?
Kaj moramo napisati če želimo alocirati spomin za 10 spremenljivk tipa float?
- Kaj mislimo z enakostjo med polji in kazalci v C-ju?
- Če je
p
kazalec, kaj potem pomenip[i]
? - 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) = 2x4- x3 +1 in rezultat izpiše na zaslon.
vaja3
Izdelaj program ki izpiše naslednje zanke:
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.
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
vaja6
Stavek for je prav zaprav, okrajšava za stavek while.
Predelaj program, ki izpiše naslednjo zanko:
for(i = 0; i < 10; i = i + 1) printf("i je %d\n", i);
z uporabo stavka while, ki ima naslednjo obliko
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:
#include <stdio.h> 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:
#include <stdio.h> 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
Napiši program, ki z zanko in pogojnim stavkom ugotovi, koliko števil od 1 do 10 je večjih od 3 in seveda izpiše rezultat 7.
vaja10
Program naj prebere štiri cele številke in izpiše povprečno vrednost kot realno številko.
vaja11
Program naj poleg številk od 1 do 20 izpiše še ali je liha ali soda v obliki
1 je liha 2 je soda 3 je liha ...
Napotek: Uporabi operator %
vaja12
Izdelaj program, ki izpiše v katero smer se je 2D točka največ premaknila, glede na koordinatno izhodišče. Možni odgovori so:
- levo
- desno
- gor
- dol
Za prebrano točko 2 1 bo program odgovoril desno.
vaja13
Tako kot v vaji 12 naj dodatno še izpiše v kater smer se je premaknila. S tem da
se najprej izpiše večji pomik in nato manjši. Za prebrano točko 2 1 bo program odgovoril desno gor
.
vaja14
Napiši program, ki izpiše prvih 7 pozitivnih števil in njihovo faktorielo. (Faktoriela 1 je 1, faktoriela 2 je 1*2=2, faktoriela 3 je 1 * 2 * 3 = 6, faktoriela 4 je 1 * 2 * 3 * 4 = 24, itd.)
vaja15
Program naj izračuna prvih 30 Fibonaccijevih števil. Vsaka Fibonaccijeva številka je vsota prejšnjih dveh števil F(n) = F(n-1) + F(n-2), F(0) = 0, F(1) = 1. Izpis naj bo v obliki:
0 + 1 = 1 1 + 2 = 3 2 + 3 = 5 ...
vaja16
Napiši program ji za podano število izpiše je praštevilo
ali ni praštevilo
.
Práštevílo je naravno število n > 1, če ima natanko dva pozitivna delitelja (faktorja), število 1 in samega sebe kot edini prafaktor.
vaja17
Pohitri vaja16
z dejstvom, da razen 2 nobeno sodo število ni praštevilo. Glej vajo 11.
vaja18
Napiši program, ki tabelira poštevanko od 1 do 10, tako da izpiše vse skupaj v 10 vrsticah v obliki:
1*1=1 1*2=2 1*3=3 ... 10*1=1 10*2=20 ...
vaja19
Program iz vaje 18 priredi tako, da bo se zmnožek najprej predizračunal v polje
int a[100];
in na to naj program vpraša za dve števili, ter izpiše rezultat, ki ga vzame iz polja a[].
vaja20
Napiši program ki bo v polje števil nadomesitil z njihovnimi kvadrati. Program naj vpraša kateri indeks iz polja želimo in naj izpiše vrednost v polju. S stavkom if mora tudi kontrolirati meje indeksov.
int a[] = {1, 2, 9, 33, 22, 11, 3, 4, 3, 55, 66, 33, 22, 22, 33, 54, 5, 6, 7, 8, 223, 34};
vaja21
Za podano kvadratno matriko a[16]
in vektor x[4]
float a[16] = {1, 2, 3, 4, 0, 1, 2, 3, 2, 3, 4, 5, 3, 2, 2, 1}; float x[4], b[4];
napiši program, ki prebere štiri vrednosti in izpiše zmnožek matrike in vektorja s stavkom
printf("%.1f %.1f %.1f %.1f\n", b[0], b[1], b[2], b[3]);
vaja22
Predelajte program za množenje matrike z vektorjem iz vaje 21, tako da boste pred izpisom uporabili klic podprograma s stavkom
mat_vec4(b, a, x); printf("%.1f %.1f %.1f %.1f\n", b[0], b[1], b[2], b[3]);
vaja23
Predelajte program vaje4 tako, da boste napisali podprogram, ki ga boste klicali v naslednji zanki
for(i = 0; i < 10; i++) print_stars(n);
vaja24
Napišite podprogram float celsius(float fahrenheit)
, ki pretvori Fahrenheitove stopinje v Celsiusove.
Formula za pretvorbo je °C = 5/9 * (°F - 32). Program naj naprej vpraša za
stopinje F in nato na decimalko natačno izpiše vrednost v Celzija. Zapomnite si, da
celoštevilčni izraz 5/9 da rezultat 0, zato ne smete uporabiti celoštevilčnega deljenja.
vaja25
Stavek r = rand()*N/RAND_MAX + 1
vrne naključno številko med 1 in N.
Izdelajte program, ki simulira metanje kocke. Izdelajte program, ki simulira zaporedno
metanje dveh kock in izriše histogram za 100 metov v (približno) taki obliki:
2: 2 ** 3: 5 ***** 4: 4 **** 5: 10 ********** 6: 15 *************** 7: 28 **************************** 8: 12 ************ 9: 9 ********* 10: 7 ******* 11: 5 ***** 12: 3 ***
Napotek: Pogled v navodila za funkcijo rand vam bo razkril, da je potrebno vklučiti header <stdlib.h> in povezovati z -lc.
vaja100
Izračunaj faktor Učinkovite Rabe Energije, tako kot ga podaja 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 = ∑(Ei FCE i)/Epovprečna dnevna poraba
Tabela razredov porabe in pripadajočimi faktorji cene električne energije] ima 5 razredov s progresivno stopnjo FCE
Razred porabe | Povprečna dnevna poraba energije (Ei) | Faktor cene energije (FCE) |
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
TabelaURE 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.
vaja101
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
- v primeru dvotarifnega načina merjenja porabe električne energije:
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.
vaja102
Če ste izdelali vajo 100 in 101, potem združite programa v vaji 102 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.