153 | | |
154 | | |
| 153 | = Vaje programiranja v jeziku Python = |
| 154 | |
| 155 | Znanje programskega jezika Python najlažje pridobimo z vajo. Namen domačih nalog |
| 156 | predstavljenih na tej strani je predvsem utrditi določene programske konstrukte, |
| 157 | ki se lahko rešijo v krajših programih, katere pravilnost delovanja ni težko |
| 158 | preveriti. Naloge se izdelujejo z orodji (Tortoise, Idle, PythonOcc), ki so predvidene za izdelavo projekta. |
| 159 | To pomeni, da je vsako vsako vajo, ki jo izdelujemo najprej preveriti na lokalnem |
| 160 | računalniku. Ko naloga št.??? deluje, jo shranimo na strežnik z Tortoise (Add, Checkin) ter preverimo |
| 161 | njeno delovanje. |
| 162 | |
| 163 | = Vprašanja za utrjevanje = |
| 164 | 1. Zakaj je potrebno napisati vrstico {{{import szs}}} |
| 165 | 2. Kako uporabljamo komentarje? |
| 166 | 3. Zakaj je zamikanje stavkov pomembno? Ali interpreter Pythona upošteva zamikanje? |
| 167 | 4. Koliko decimalk hrani tip {{{integer}}} in {{{float}}}? |
| 168 | 5. Kakšna je razlika pri prireditvi konstante spremenljivkama '''c''' in '''d''' |
| 169 | {{{ |
| 170 | #!python |
| 171 | c = 3/2; |
| 172 | d = 3.0/2; |
| 173 | }}} |
| 174 | 6. Kaj je funkcija dvopičja v kontrolnem stavku? Naštej kje vse ga je potrebno uporabiti. |
| 175 | 7. Koliko je numerična vrednost naslednjega izraza |
| 176 | {{{ |
| 177 | #!python |
| 178 | i = 7 / 3; |
| 179 | }}} |
| 180 | 8. Pod katerimi pogoji naslednja koda izpiše '''voda'''? Kako bi jasneje napisali |
| 181 | napisane pogojne stavke z uporabo zavitih oklepajev in primernejšega zamikanja? |
| 182 | {{{ |
| 183 | #!python |
| 184 | if(temp < 0): |
| 185 | print "led" |
| 186 | else if (temp < 100): |
| 187 | print "voda" |
| 188 | else: |
| 189 | print "para") |
| 190 | }}} |
| 191 | 9. Kaj izpiše naslednja koda? |
| 192 | {{{ |
| 193 | #!python |
| 194 | x = 3; |
| 195 | if(x): |
| 196 | print "da" |
| 197 | else: |
| 198 | print "ne" |
| 199 | }}} |
| 200 | 10. Kaj bo izpisala naslednja koda? |
| 201 | {{{ |
| 202 | #!python |
| 203 | int i; |
| 204 | for i in range(3): |
| 205 | print "a" |
| 206 | print "b" |
| 207 | |
| 208 | print "c" |
| 209 | }}} |
| 210 | 11. Koliko elementov vsebuje polje oz. vektor '''a'''? Kateri je prvi element? Kateri je zadnji? |
| 211 | {{{ |
| 212 | #!python |
| 213 | a = [1,2,3,4,5]; |
| 214 | }}} |
| 215 | 12. Kaj je narobe v naslednjem izvlečku kode? |
| 216 | {{{ |
| 217 | #!python |
| 218 | a = []; |
| 219 | for i in range(5): |
| 220 | a[i] = 0; |
| 221 | }}} |
| 222 | 13. Kateri so štirje pomembni deli funkcije? Katere tri mora klicoči program poznati? |
| 223 | |
| 224 | |
| 225 | |
| 226 | |
| 227 | |
| 228 | /// TODO |
| 229 | |
| 230 | 1. Kakšna je razlika med ''prefix'' in ''postfix'' operatorjem ++. Kakšna je razlika med naslednjima izrazoma: |
| 231 | {{{ |
| 232 | #!c |
| 233 | r = i++; |
| 234 | r = ++i; |
| 235 | }}} |
| 236 | 1. Kaj je narobe z naslednjim predprocesorskim izrazom? |
| 237 | {{{ |
| 238 | #!c |
| 239 | #define N 10; |
| 240 | }}} |
| 241 | 1. Če smo na primer definirali makro |
| 242 | {{{ |
| 243 | #!rst |
| 244 | .. code-block:: c |
| 245 | |
| 246 | #define SQR(x) x*x |
| 247 | |
| 248 | Zakaj nam potem izraz |
| 249 | |
| 250 | .. code-block:: c |
| 251 | |
| 252 | y = 1/SQR(x); |
| 253 | |
| 254 | ne deluje pravilno? Kako bi morali pravilno napisati makro SQR(x), da bi delal tudi za izraze |
| 255 | |
| 256 | .. code-block:: c |
| 257 | |
| 258 | y = 1/SQR(1-x); |
| 259 | |
| 260 | }}} |
| 261 | 1. Kakšna je razlika v uporabnosti med '''i''' in '''J''', ki sta napisana kot |
| 262 | {{{ |
| 263 | #!rst |
| 264 | .. code-block:: c |
| 265 | |
| 266 | int i = 10; |
| 267 | #define J 10 |
| 268 | |
| 269 | Napotek: Poskusi napisati ``J = 2`` ali ``int a[i]``. |
| 270 | |
| 271 | }}} |
| 272 | 1. Zakaj je potrebno v {{{scanf()}}} argumente za formatnim stavkom pisati z &, pri {{{printf()}}} pa tega ne smemo? |
| 273 | 1. Koliko spomina klic |
| 274 | {{{ |
| 275 | #!rst |
| 276 | .. code-block:: c |
| 277 | |
| 278 | malloc(10) |
| 279 | |
| 280 | alocira? |
| 281 | |
| 282 | Kaj moramo napisati če želimo alocirati spomin za 10 spremenljivk tipa float? |
| 283 | }}} |
| 284 | 1. Kaj mislimo z ''enakostjo med polji in kazalci'' v C-ju? |
| 285 | 1. Če je {{{p}}} kazalec, kaj potem pomeni {{{p[i]}}}? |
| 286 | 1. Kako odpiramo datoteko za branje podatkov iz nje? Kaj se spremeni, če bi datoteko želeli odpreti za pisanje? |
| 287 | |
| 288 | |
| 289 | = Uporaba zank in izpis = |
| 290 | {{{ |
| 291 | #!comment |
| 292 | http://www.eskimo.com/~scs/cclass/asgn.beg/PS1.html |
| 293 | }}} |
| 294 | |
| 295 | |
| 296 | == vaja1 == |
| 297 | Napiši program, ki zahteva vnos dveh celih številk in nato izpiše njihovo vsoto. |
| 298 | |
| 299 | == vaja2 == |
| 300 | Gaussovo kvadratura naj vpraša za meji integriranja funkcije f(x) = 2x^4^- x^3^ +1 |
| 301 | in rezultat izpiše na zaslon. |
| 302 | |
| 303 | |
| 304 | == vaja3 == |
| 305 | Izdelaj program ki izpiše naslednje zanke: |
| 306 | {{{ |
| 307 | #!c |
| 308 | for(i = 0; i < 10; i = i + 2) |
| 309 | printf("%d\n", i); |
| 310 | |
| 311 | for(i = 100; i >= 0; i = i - 7) |
| 312 | printf("%d\n", i); |
| 313 | |
| 314 | for(i = 1; i <= 10; i = i + 1) |
| 315 | printf("%d\n", i); |
| 316 | |
| 317 | for(i = 2; i < 100; i = i * 2) |
| 318 | printf("%d\n", i); |
| 319 | }}} |
| 320 | Razjasni si, kako te zanke delujejo in program popravi tako, da |
| 321 | bodo v zanki uporabljeni operatorji +=, -=, *= |
| 322 | |
| 323 | == vaja4 == |
| 324 | Napiši program ki izpiše ta trikotnik: |
| 325 | {{{ |
| 326 | * |
| 327 | ** |
| 328 | *** |
| 329 | **** |
| 330 | ***** |
| 331 | ****** |
| 332 | ******* |
| 333 | ******** |
| 334 | ********* |
| 335 | ********** |
| 336 | }}} |
| 337 | Ne uporabi desetih printf() ampak uporabi zanko. |
| 338 | {{{ |
| 339 | #!c |
| 340 | for(i = 0; i < 10; i = i + 1) |
| 341 | { |
| 342 | /* Več stavkov */ |
| 343 | /* gre lahko tukaj */ |
| 344 | } |
| 345 | }}} |
| 346 | |
| 347 | == vaja5 == |
| 348 | Izpiši v zanki cela števila od 1 do 10 in njihove kvadrate. |
| 349 | {{{ |
| 350 | 1 1 |
| 351 | 2 4 |
| 352 | 3 9 |
| 353 | ... |
| 354 | 10 100 |
| 355 | }}} |
| 356 | |
| 357 | == vaja6 == |
| 358 | Stavek '''for''' je prav zaprav, okrajšava za stavek '''while'''. |
| 359 | |
| 360 | Predelaj program, ki izpiše naslednjo zanko: |
| 361 | {{{ |
| 362 | #!c |
| 363 | for(i = 0; i < 10; i = i + 1) |
| 364 | printf("i je %d\n", i); |
| 365 | }}} |
| 366 | z uporabo stavka '''while''', ki ima naslednjo obliko |
| 367 | {{{ |
| 368 | #!c |
| 369 | while(pogoj) |
| 370 | { |
| 371 | /* vpiši stavek za povečanje števca in izpis */ |
| 372 | } |
| 373 | }}} |
| 374 | Napotek: V primeru da se nam program ''obesi'' v neskončni zanki, |
| 375 | ga prekinemo s pritiskom na crtl-C |
| 376 | |
| 377 | |
| 378 | == vaja7 == |
| 379 | Pretipkaj in poženi naslednji program: |
| 380 | {{{ |
| 381 | #!c |
| 382 | #include <stdio.h> |
| 383 | |
| 384 | int main() |
| 385 | { |
| 386 | int i; |
| 387 | |
| 388 | printf("stavek 1\n"); |
| 389 | printf("stavek 2\n"); |
| 390 | for(i = 0; i < 10; i = i + 1) |
| 391 | { |
| 392 | printf("stavek 3\n"); |
| 393 | printf("stavek 4\n"); |
| 394 | } |
| 395 | printf("stavek 5\n"); |
| 396 | |
| 397 | return 0; |
| 398 | } |
| 399 | }}} |
| 400 | Program ne naredi nič posebnega. Z njim želimo le pojasniti vpliv |
| 401 | zavitih oklepajev v zanki in dobiti željen ''potek programa''. |
| 402 | |
| 403 | |
| 404 | == vaja8 == |
| 405 | Pretipkaj in poženi naslednji program: |
| 406 | {{{ |
| 407 | #!c |
| 408 | #include <stdio.h> |
| 409 | |
| 410 | int main() |
| 411 | { |
| 412 | int i, j; |
| 413 | |
| 414 | printf("začetek programa\n"); |
| 415 | |
| 416 | for(i = 0; i < 3; ++i) |
| 417 | { |
| 418 | printf("i je %d\n", i); |
| 419 | for(j = 0; j < 5; j++) |
| 420 | printf("i je %d, j je %d\n", i, j); |
| 421 | printf("konec v zanki i = %d\n", i); |
| 422 | } |
| 423 | |
| 424 | printf("konec programa\n"); |
| 425 | |
| 426 | return 0; |
| 427 | } |
| 428 | }}} |
| 429 | Tudi ta program ne naredi kaj dosti koristnega. Želi pokazati, kako zanke |
| 430 | delujejo in kako jih ''gnezdimo''. V vaji 4 je potrebno uporabiti prikazani |
| 431 | način dvojne zanke. |
| 432 | |
| 433 | == vaja9 == |
| 434 | Program naj prebere štiri cele številke in izpiše povprečno vrednost kot realno številko. |
| 435 | |
| 436 | == vaja10 == |
| 437 | Program naj prebere vrednost x, izračuna kvadrat prebranega števila (x^2^) in ga izpiše na zaslon. |
| 438 | Izdelaj podprogram sqr(x). |
| 439 | |
| 440 | == vaja11 == |
| 441 | Program naj prebere vrednost x in n, kot celi števili. Izdelaj podprogram power(x, n), ki izračuna n to potenco |
| 442 | števila x in jo izpiše na zaslon. |
| 443 | |
| 444 | = Pogojni stavek in zahtevnejše zanke = |
| 445 | |
| 446 | == vaja20 == |
| 447 | Napiši program, ki z zanko in pogojnim stavkom ugotovi, koliko števil od 1 do 10 je večjih od 3 in seveda |
| 448 | izpiše rezultat 7. |
| 449 | |
| 450 | == vaja21 == |
| 451 | Program naj poleg številk od 1 do 20 izpiše še ali je liha ali soda v obliki |
| 452 | {{{ |
| 453 | #!rst |
| 454 | .. code-block:: c |
| 455 | |
| 456 | 1 je liha |
| 457 | 2 je soda |
| 458 | 3 je liha |
| 459 | ... |
| 460 | |
| 461 | Napotek: Uporabi operator ``%`` |
| 462 | }}} |
| 463 | |
| 464 | == vaja22 == |
| 465 | Izdelaj program, ki izpiše v katero smer se je 2D točka največ premaknila, glede na |
| 466 | koordinatno izhodišče. Možni odgovori so: |
| 467 | - levo |
| 468 | - desno |
| 469 | - gor |
| 470 | - dol |
| 471 | Za prebrano točko 2 1 bo program odgovoril ''desno''. |
| 472 | |
| 473 | == vaja23 == |
| 474 | Tako kot v vaji 22 naj dodatno še izpiše v kater smer se je premaknila. S tem da |
| 475 | se najprej izpiše večji pomik in nato manjši. Za prebrano točko 2 1 bo program odgovoril {{{desno gor}}}. |
| 476 | |
| 477 | == vaja24 == |
| 478 | Napiši program, ki izpiše prvih 7 pozitivnih števil in njihovo faktorielo (fakulteto). (Faktoriela 1 je 1, |
| 479 | faktoriela 2 je 1*2=2, faktoriela 3 je 1 * 2 * 3 = 6, faktoriela 4 je 1 * 2 * 3 * 4 = 24, itd.) |
| 480 | |
| 481 | == vaja25 == |
| 482 | Program naj izračuna prvih 30 [http://sl.wikipedia.org/wiki/Fibonaccijevo_%C5%A1tevilo Fibonaccijevih števil]. |
| 483 | Vsaka Fibonaccijeva številka je vsota prejšnjih dveh števil F(n) = F(n-1) + F(n-2), F(0) = 1, F(1) = 1. |
| 484 | Izpis naj bo v obliki: |
| 485 | {{{ |
| 486 | 1 + 1 = 2 |
| 487 | 1 + 2 = 3 |
| 488 | 2 + 3 = 5 |
| 489 | 3 + 5 = 8 |
| 490 | 5 + 8 = 13 |
| 491 | ... |
| 492 | }}} |
| 493 | |
| 494 | == vaja26 == |
| 495 | Napiši program ji za podano število izpiše {{{je praštevilo}}} ali {{{ni praštevilo}}}. |
| 496 | [http://sl.wikipedia.org/wiki/Pra%C5%A1tevilo Práštevílo] je naravno število n > 1, če ima natanko dva pozitivna delitelja (faktorja), število 1 in samega sebe kot edini prafaktor. |
| 497 | |
| 498 | == vaja27 == |
| 499 | Pohitri {{{vaja26}}} z dejstvom, da razen 2 nobeno sodo število ni praštevilo. Glej {{{vaja21}}}. |
| 500 | |
| 501 | == vaja28 == |
| 502 | Napiši program, ki tabelira poštevanko od 1 do 10, tako da izpiše vse skupaj v 10 vrsticah v |
| 503 | obliki: |
| 504 | {{{ |
| 505 | 1*1=1 1*2=2 1*3=3 |
| 506 | ... |
| 507 | 10*1=1 10*2=20 ... |
| 508 | }}} |
| 509 | |
| 510 | == vaja29 == |
| 511 | Za dan vektor {{{B[7]}}} uredi števila po velikosti od najmanjšega do največjega in jih zapiši v vekotor v |
| 512 | naslednji obliki -> {{{B[min]...B[max]}}}. S pomočjo for zanke izpiši vrednosti urejenega vektorja {{{B}}} |
| 513 | na zaslon po vrsticah od najmanjšega do največjega. |
| 514 | {{{ |
| 515 | float B[7] = {3.3, -23.2, -4.5, 56.0, 45.5, 69.9, 40.5}; |
| 516 | }}} |
| 517 | |
| 518 | == vaja30 == |
| 519 | Za matriko {{{A[25]}}} podano v vaja46 določi mesto maksimalnega števila in vrednost elementa izpiši na zaslon. |
| 520 | |
| 521 | == vaja31 == |
| 522 | Na zaslon izpiši [http://en.wikipedia.org/wiki/Pascal's_triangle Pascal-ov trikotnik] ([http://sl.wikipedia.org/wiki/Pascalov_trikotnik Pascal's triangle]) za 8 vrstic v spodaj prikazani obliki. |
| 523 | |
| 524 | 1 |
| 525 | |
| 526 | 1 1 |
| 527 | |
| 528 | 1 2 1 |
| 529 | |
| 530 | 1 3 3 1 |
| 531 | |
| 532 | 1 4 6 4 1 |
| 533 | |
| 534 | 1 5 10 10 5 1 |
| 535 | |
| 536 | 1 6 15 20 15 6 1 |
| 537 | |
| 538 | 1 7 21 35 35 21 7 1 |
| 539 | |
| 540 | |
| 541 | = Nizi, vektorji, matrike = |
| 542 | |
| 543 | == vaja40 == |
| 544 | Program iz vaje 28 priredi tako, da bo se zmnožek najprej predizračunal v polje |
| 545 | {{{ |
| 546 | #!rst |
| 547 | |
| 548 | .. code-block:: c |
| 549 | |
| 550 | int a[100]; |
| 551 | |
| 552 | in nato naj program vpraša za dve števili, ter izpiše rezultat, ki ga vzame iz polja ``a[]``. |
| 553 | }}} |
| 554 | |
| 555 | == vaja41 == |
| 556 | Napiši program ki bo v polje števil nadomesitil z njihovnimi kvadrati. Program naj vpraša |
| 557 | kateri indeks iz polja želimo in naj izpiše vrednost v polju. S stavkom if mora |
| 558 | tudi kontrolirati meje indeksov. |
| 559 | {{{ |
| 560 | #!c |
| 561 | int a[] = {1, 2, 9, 33, 22, 11, 3, 4, 3, 55, |
| 562 | 66, 33, 22, 22, 33, 54, 5, 6, 7, |
| 563 | 8, 223, 34}; |
| 564 | }}} |
| 565 | |
| 566 | |
| 567 | == vaja42 == |
| 568 | Za podano kvadratno matriko {{{a[16]}}} in vektor {{{x[4]}}} |
| 569 | {{{ |
| 570 | #!rst |
| 571 | .. code-block:: c |
| 572 | |
| 573 | float a[16] = {1, 2, 3, 4, |
| 574 | 0, 1, 2, 3, |
| 575 | 2, 3, 4, 5, |
| 576 | 3, 2, 2, 1}; |
| 577 | float x[4], b[4]; |
| 578 | |
| 579 | napiši program, ki prebere štiri vrednosti in izpiše zmnožek matrike |
| 580 | in vektorja s stavkom |
| 581 | |
| 582 | .. code-block:: c |
| 583 | |
| 584 | printf("%.1f %.1f %.1f %.1f\n", b[0], b[1], b[2], b[3]); |
| 585 | |
| 586 | }}} |
| 587 | |
| 588 | |
| 589 | == vaja43 == |
| 590 | Program naj prebere datoteko. Prvo število je n, drugo število je št. delitev div, nato pa |
| 591 | prva dva stolpca sta x in y točke p0, druga dva stolpca sta (x1, y1) točke p1, |
| 592 | ter zadnji stolpec je pretok q. |
| 593 | {{{ |
| 594 | 8 1 |
| 595 | 00 00 06 00 0 |
| 596 | 06 00 14 00 -1 |
| 597 | 14 00 20 00 0 |
| 598 | 20 00 20 10 0 |
| 599 | 20 10 14 10 0 |
| 600 | 14 10 06 10 1 |
| 601 | 06 10 00 10 0 |
| 602 | 00 10 00 00 0 |
| 603 | }}} |
| 604 | |
| 605 | Datoteko preberite v spremenljivke |
| 606 | {{{ |
| 607 | #!c |
| 608 | #define MAXN 100 |
| 609 | float p0[MAXN*2], p1[MAXN*2], q[MAXN]; |
| 610 | int n, div; |
| 611 | }}} |
| 612 | in vsako vrstico v zanki izpišite z naslednjim formatnim stavkom: |
| 613 | |
| 614 | {{{ |
| 615 | #!c |
| 616 | printf("%4.1f %4.1f %4.1f %4.1f %4.1f\n", ... |
| 617 | }}} |
| 618 | prve in druge točke elementa ter q. |
| 619 | |
| 620 | == vaja44 == |
| 621 | Za podano kvadratno matriko {{{A[]}}} zmanjšaj diagonalne elemente za vrednost 1 in |
| 622 | spremenjene diagonalne elemente matrike {{{A}}} s pomočjo for zanke izpiši na zaslon . |
| 623 | {{{ |
| 624 | #!c |
| 625 | float A[25] = {3, 5, 90, 2 ,1, |
| 626 | 1, 71, 59, 5, 5, |
| 627 | 1, 2, 3, 54, 2, |
| 628 | 12, 56, 32, 11, 1, |
| 629 | 34, 56, 78, 45, 12 |
| 630 | }; |
| 631 | }}} |
| 632 | == vaja45 == |
| 633 | Polje {{{a[]}}} iz vaje 41 prepišite v matriko {{{float b[]}}} |
| 634 | velikost 8x3. S tem sa so elementi, ki manjkajo postavljeni na 0. |
| 635 | Vrstice izpišite na eno decimalko natančno. |
| 636 | |
| 637 | == vaja46 == |
| 638 | Za podano kvadratno matriko {{{A[25]}}} zmanjšaj diagonalne elemente za vrednost 1.1, prepiši |
| 639 | enodimenzionalno polje A v dvodimenzionalno polje B, ki ga računamo kot matriko 5x5 |
| 640 | izpišemo z dvojno zanko na zaslon. |
| 641 | {{{ |
| 642 | float A[25] = {3.3, 5.2, 90.5, 2.3 ,1.1, |
| 643 | 1.9, 71.0, 59.5, 5.3, 5.5, |
| 644 | 1.0, 2.2, 3.5, 54.3, 2.2, |
| 645 | 12.4, 56.1, 32.2, 11.4, 1.6, |
| 646 | 34.8, 56.4, 78.9, 45.3, 12.3 |
| 647 | }; |
| 648 | }}} |
| 649 | |
| 650 | == vaja47 == |
| 651 | Za izračun Pascal-ovega trikotnika (glej vaja31) uporabi podprogram pascals_triangle(n), kjer je n=8. |
| 652 | Vsako vrstico Pascal-ovega trikotnika zapiši v vrstico matrike P[64]. Prazna mesta matrike postavi |
| 653 | na vrednost 0. Izpiši matriko na zaslon (Uporabi for zanko). |
| 654 | Primer izgleda izpisa ene vrstice: |
| 655 | {{{ |
| 656 | printf("%d %d %d %d %d %d %d %d\n", P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8]); |
| 657 | }}} |
| 658 | |
| 659 | |
| 660 | = Podprogrami = |
| 661 | == vaja60 == |
| 662 | Predelajte program za množenje matrike z vektorjem iz vaje 42, tako da boste |
| 663 | pred izpisom uporabili klic podprograma s stavkom |
| 664 | {{{ |
| 665 | #!c |
| 666 | mat_vec4(b, a, x); |
| 667 | printf("%.1f %.1f %.1f %.1f\n", b[0], b[1], b[2], b[3]); |
| 668 | }}} |
| 669 | |
| 670 | == vaja61 == |
| 671 | Predelajte program vaje4 tako, da boste napisali podprogram, ki ga boste klicali |
| 672 | v naslednji zanki |
| 673 | {{{ |
| 674 | #!c |
| 675 | for(i = 0; i < 10; i++) |
| 676 | print_stars(i); |
| 677 | }}} |
| 678 | |
| 679 | |
| 680 | == vaja62 == |
| 681 | Napišite podprogram {{{float celsius(float fahrenheit)}}}, ki pretvori Fahrenheitove stopinje v Celsiusove. |
| 682 | Formula za pretvorbo je °C = 5/9 * (°F - 32). Program naj naprej vpraša za |
| 683 | stopinje F in nato na decimalko natačno izpiše vrednost v Celzija. Zapomnite si, da |
| 684 | celoštevilčni izraz 5/9 da rezultat 0, zato ne smete uporabiti celoštevilčnega deljenja. |
| 685 | |
| 686 | == vaja63 == |
| 687 | Stavek {{{ r = rand()*N/RAND_MAX + 1 }}} vrne naključno številko med 1 in N. |
| 688 | Izdelajte program, ki simulira metanje kocke. Izdelajte program, ki simulira zaporedno |
| 689 | metanje dveh kock in izriše histogram za 100 metov v (približno) taki obliki: |
| 690 | {{{ |
| 691 | #!rst |
| 692 | :: |
| 693 | |
| 694 | 2: 2 ** |
| 695 | 3: 5 ***** |
| 696 | 4: 4 **** |
| 697 | 5: 10 ********** |
| 698 | 6: 15 *************** |
| 699 | 7: 28 **************************** |
| 700 | 8: 12 ************ |
| 701 | 9: 9 ********* |
| 702 | 10: 7 ******* |
| 703 | 11: 5 ***** |
| 704 | 12: 3 *** |
| 705 | |
| 706 | Prva številka pomeni vsoto pik na obeh kockah, druga številka pa pomeni koliko |
| 707 | krat se je dogodek zgodil, kar je tudi grafično narisano z podprogramom iz vaje 23. |
| 708 | |
| 709 | Napotek: Pogled v navodila za funkcijo rand vam bo razkril, da je |
| 710 | potrebno vklučiti header ``<stdlib.h>`` in povezovati z ``-lc``. |
| 711 | }}} |
| 712 | |
| 713 | == vaja64 == |
| 714 | |
| 715 | Izdelajte podprogram za linearno interpolacijo. Program naj vpraša za dve |
| 716 | točki (x,,0,,,y,,0,,) in (x,,1,,,y,,1,,) ter mesto na osi ''x'' za katero |
| 717 | želimo vrednost ''y''. Npr. za |
| 718 | {{{ |
| 719 | 0 0 |
| 720 | 1 1 |
| 721 | 0.5 |
| 722 | }}} |
| 723 | mora vrniti 0.5. |
| 724 | Podprogram naj ima naslednji prototip: |
| 725 | {{{ |
| 726 | #!c |
| 727 | float linear_interpolation(float x, float p0[2], float p1[2]) |
| 728 | }}} |
| 729 | |
| 730 | |
| 731 | == vaja65 == |
| 732 | Podprogram za parametrizacijo daljice naj izpiše koordinato glede na |
| 733 | parameter ''t'', ki je v mejah od 0 do 1. Podobno kot pri vaji 64 preberemo |
| 734 | točki (x,,0,,,y,,0,,) in (x,,1,,,y,,1,,) in parameter ''t''. Prototip |
| 735 | {{{ |
| 736 | #!c |
| 737 | void linear_interpolation(float t, float p0[2], float p1[2]) |
| 738 | }}} |
| 739 | naj izpiše točko s formatom "%.1f %.1f". Prednost parametrične interpolacije |
| 740 | je v tem, da deluje tudi za navpično daljico. Npr. |
| 741 | {{{ |
| 742 | 0 0 |
| 743 | 0 2 |
| 744 | 0.5 |
| 745 | }}} |
| 746 | vrne 0.0 1.0 |
| 747 | |
| 748 | Ko je parameter t=0 se izpiše začetna točka. Pri t=1 pa končna. |
| 749 | |
| 750 | |
| 751 | == vaja66 == |
| 752 | Podobno kot v vaji 65 izdelajte podprogram, ki za parameter t v mejah |
| 753 | od -1 do 1 izpiše točko med podanima točkama. |
| 754 | Ko je parameter t=-1 se izpiše začetna točka. Pri t=1 pa končna. Za t=0 se izpiše točka na sredini. |
| 755 | |
| 756 | == vaja67 == |
| 757 | Napiši podprogram decToBin(x), ki poljubno vrednost celega števila x prebranega iz zaslona pretvori |
| 758 | v binarni zapis in vrednost izpiše na zaslon. |
| 759 | Primer: |
| 760 | ||25||:2|| |
| 761 | ||12||1|| |
| 762 | ||6||0|| |
| 763 | ||3||0|| |
| 764 | ||1||1|| |
| 765 | ||0||1|| |
| 766 | |
| 767 | Ostanke deljenja decimalnega števila izračunanega po zgornjem primeru preberemo v nasprotnem vrstnem redu. |
| 768 | Za zgornji primer dec: 25 -> bin: 11001. |
| 769 | Uporabi operator %. (Primer: 25%2 = 1)! |
| 770 | |
| 771 | |
| 772 | = Dinamična alokacija spomina in delo z datotekami = |
| 773 | |
| 774 | == vaja80 == |
| 775 | Program naj prebere datoteko '''vaja80.dat''', ki vsebuje seznam celih številk in izpiše njihovo vsoto. |
| 776 | V prvi vrstici je število celih števil ki sledijo v naslednjih vrsticah. Primer: |
| 777 | {{{ |
| 778 | 4 |
| 779 | 13 |
| 780 | 23 |
| 781 | 21 |
| 782 | 11 |
| 783 | }}} |
| 784 | Za ta primer mora program izpisati 72. Število vrstic v datoteki {{{vaja80.dat}}} je lahko največ 100. |
| 785 | |
| 786 | |
| 787 | == vaja81 == |
| 788 | Podobno kot v vaji 80 preberite datoteko '''vaja81.dat''' s tem da števila niso več omejena |
| 789 | z velikostjo polja ampak ga dinamično alocirajte z {{{malloc()}}} po tem, ko bo prebrana prva vrstica. |
| 790 | |
| 791 | == vaja82 == |
| 792 | Preberi datoteko {{{vaja82.dat}}} v kateri sta zaporedno zapisani dve 4x4 matriki. Na primer: |
| 793 | {{{ |
| 794 | 1 2 3 4 |
| 795 | 5 6 7 8 |
| 796 | 9 0 1 1 |
| 797 | 1 2 2 2 |
| 798 | 1 1 1 1 |
| 799 | 1 1 1 1 |
| 800 | 1 2 5 6 |
| 801 | 3 4 5 2 |
| 802 | }}} |
| 803 | |
| 804 | Program naj prebere datoteko v dve matriki in nato sešteje obe matriki v novo matriko (matrike seštevamo |
| 805 | po elementih). Ko imamo novo matriko naj program vpraša kateri element matrike želimo izpisati in sicer i-to vrstico |
| 806 | in j-ti stolpec (npr. i=1 in j=3 -> 9) in element i,j izpiše na zaslon. |
| 807 | |
| 808 | |
| 809 | == vaja83 == |
| 810 | Program naj prebere iz datoteke '''vaja83.dat''' matriko velikosti ixj in izpiše element {2, 3}. Format datoteke je |
| 811 | {{{ |
| 812 | 4 5 |
| 813 | 1 2 3 4 5 |
| 814 | 4 5 5 6 6 |
| 815 | 4 4 4 99 4 |
| 816 | 6 7 7 8 1 |
| 817 | }}} |
| 818 | V prvi vrstici piše število vrstic in število kolon matrike. Izpisal pa bi 99. |
| 819 | |
| 820 | |
| 821 | == vaja84 == |
| 822 | Matriko iz tako kot pri vaji 83 preberemo iz datoteke '''vaja84.dat''' in |
| 823 | izpišemo v transponirani obliki kot cela števila. |
| 824 | Matriko celih števil dinamično alocirajte z malloc. |
| 825 | |
| 826 | == vaja85 == |
| 827 | Matriko iz tako kot pri vaji 83 preberemo iz datoteke '''vaja85.dat''' in |
| 828 | Vse elemente matrike kvadriramo in zapišemo v datoteko '''vaja85.rez''', v istem |
| 829 | formatu celih števil. |
| 830 | |
| 831 | = Aplikacije = |
| 832 | == vaja100 == |
| 833 | Izračunaj faktor Učinkovite Rabe Energije, tako kot ga podaja [http://www.elektro-ljubljana.si/slo/Ceniki Elektro Ljubljana]. |
| 834 | Dobavitelj v ceniku za vsak '''razred porabe''' določi '''faktor cene energije''', ki je osnova za izračun |
| 835 | faktorja URE po naslednji enačbi: |
| 836 | |
| 837 | URE = ∑(E,,i,, F,,CE i,,)/E,,povprečna dnevna poraba,, |
| 838 | |
| 839 | Tabela razredov porabe in pripadajočimi faktorji cene električne energije] ima 5 razredov s progresivno stopnjo F,,CE,, |
| 840 | |
| 841 | ||Razred porabe||Povprečna dnevna poraba energije (E,,i,,)||Faktor cene energije (F,,CE,,)|| |
| 842 | ||1.razred||do 6 kWh dnevne porabe||1.0|| |
| 843 | ||2.razred||nad 6 do vključno 12 kWh dnevne porabe||1.1|| |
| 844 | ||3.razred||nad 12 do vključno 18 kWh dnevne porabe||1.3|| |
| 845 | ||4.razred||nad 18 do vključno 24 kWh dnevne porabe||1.5|| |
| 846 | ||5.razred||nad 24 kWh dnevne porabe||2.0|| |
| 847 | |
| 848 | Na primer URE za 8kWh dnevne porabe izračunamo kot URE=(6*1.0-(8-6)*1.1)/8 |
| 849 | |
| 850 | 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 |
| 851 | celoštevilčni del povprečne dnevne porabe. Izdelaj program, ki za vnešeno realno povprečno porabo izpiše |
| 852 | faktor URE v formatu, kot je v pred izračunani tabeli. |
| 853 | |
| 854 | Napotek: Za izračun celega dela realnega števila uporabite funkcijo '''floor'''. |
| 855 | |
| 856 | == vaja101 == |
| 857 | |
| 858 | 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: |
| 859 | |
| 860 | - stalnega mesečnega prispevka za moč, ki zanaša 0,66179 €/kW/mesec |
| 861 | - cene za prenešeno delovno energijo, ki znaša: |
| 862 | * v primeru dvotarifnega načina merjenja porabe električne energije: |
| 863 | {{{ |
| 864 | VT: 0,03731 €/kWh |
| 865 | MT: 0,02924 €/kWh |
| 866 | }}} |
| 867 | * v primeru enotarifnega načina merjenja porabe električne energije: |
| 868 | {{{ |
| 869 | ET: 0,03462 €/kWh |
| 870 | }}} |
| 871 | |
| 872 | Izdelaj program, ki uporabnik vpraša po predvidenem mesečnem številu kWh VT in NT in izpiše ceno |
| 873 | za prenešeno delovno energijo v primeru dvotarifnega in v primeru enotarfnega načina merjenja porabe |
| 874 | električne energije. Uporabniku naj glede na vnešena podatka program svetuje, kateri način |
| 875 | je zanj najbolj primeren. |
| 876 | |
| 877 | |
| 878 | == vaja102 == |
| 879 | Če ste izdelali vajo 100 in 101, potem združite programa v vaji 102 tako, da izračunate kako bo z elektriko |
| 880 | po novem sistemu z URE faktorjem. |
| 881 | |
| 882 | Obračun porabljene električne energije na podlagi izračunanega faktorja URE se izvede tako, |
| 883 | da se pomnoži količina električne energije v posamezni tarifi, s ceno električne energije v |
| 884 | tej tarifi in z izračunanim odjemalčefim faktorjem URE. Upoštevajte, da ima mesec 31 dni. |
| 885 | Program pa naj tako kot v vaji 11 vpraša za število kWh v visoki in nizki tarifi, izpiše |
| 886 | posamezne cene ter svetuje najprimernejši način tarifiranja. |
| 887 | |