Programerske avditorne vaje 4 Primeri nalog za kolokvij Primeri nalog za kolokvij • Kaj je …? • Kaj označuje …? Kaj označuje …? • Kakšna je razlika med …? Navedite primer. Primeri nalog za kolokvij Primeri nalog za kolokvij • Napišite (implementirajte) podprogram v p g programskem jeziku C#, ki bo primerjal dve j p j celi števili. Če je vrednost prvega števila večja od drugega naj vrednosti obeh števil zamenja od drugega, naj vrednosti obeh števil zamenja in vrne njihove nove vrednosti. V nasprotnem primeru naj vrne nespremenjene vrednosti primeru naj vrne nespremenjene vrednosti. Primeri nalog za kolokvij Primeri nalog za kolokvij • Ker podprogram spreminja originalne podatke, potrebujemo izvedbo s prenosom po referenci. static void PrimerjajInZamenjaj(ref int prvoŠtevilo,ref int drugoŠtevilo) { // Če je prvo število večje od drugega if(prvoŠtevilo>drugoŠtevilo) { int začasni; // … ju med seboj zamenjamo začasni = prvoŠtevilo; č i Št il prvoŠtevilo = drugoŠtevilo; drugoŠtevilo = začasni; } } Primeri nalog za kolokvij – "domača naloga" • Izdelajte Izdelajte načrt za ustrezne podatkovne strukture bančnega načrt za ustrezne podatkovne strukture bančnega računa. Bančni račun ima svojo številko, priimek in ime lastnika, maksimalni limit pri dvigu denarja in trenutno stanje na računu. Podatke o računih bomo hranili v dinamično povezanem seznamu objektov. • Nato izdelajte implementacijo tega podatkovnega tipa v C#. Napišite še metodo, ki izpise podatke trenutnega bančnega računa na zaslon računa na zaslon. • Na koncu izdelajte analizo in načrt rešitve problema za podprogram ki bo med računi poiskal tistega ki je najbolj v podprogram, ki bo med računi poiskal tistega, ki je najbolj v minusu in ga izpisal na zaslon z uporabo zgoraj navedene metode. Vhodni parameter je referenca na zadnji podatek v dinamično povezanem seznamu objektov. Tega podprograma ni potrebno implementirati. • Podatki bančnega računa (BančniRačun): Podatek Tip Vidnost Opis Številka računa Niz znakov Javna Številka bančnega računa Priimek in ime Niz znakov Javna Priimek in ime lastnika računa Li i Limit R l š il Realno število J Javna M k i l i li i č Maksimalni limit računa Stanje Realno število Javna Znesek denarja na računu Prejšnji Referenca na Referenca na BančniRačun Javna Povezava v dinamičnem Povezava v dinamičnem seznamu objektov • Predstavitev v C#: ker gre za dinamične podatkovne strukture, bomo uporabili referenčni podatkovni tip razreda (class) class BančniRačun { public string številkaRačuna; public bl string priimekInIme; k public double limit; public double stanje; public BančniRačun prejšnji; … } • Metoda za izpis podatkov bančnega računa na (p j j j ) zaslon (pišemo jo znotraj deklaracije razreda): p public void Izpis() p () { Console.WriteLine("Številka računa: {0}", številkaRačuna); Console.WriteLine("Priimek in ime: {0}", priimekInIme); Console.WriteLine("Limit: {0}", limit); Console WriteLine("Stanje Console.WriteLine( Stanje na računu: {0} na računu: {0}", stanje); stanje); } • A Analiza in načrt rešitve problema za podprogram li i č t šit bl d NajboljVMinusu: V zanki bomo pregledali bomo seznam podatkov o p g p bančnih računih in poiskali tistega z največjim minusom. Račune, ki niso v minusu, bomo preskočili. Uporabili bomo pomožno referenco na trenutno Uporabili bomo pomožno referenco na trenutno najmanjši račun. Če bomo pri pregledu našli račun z manjšim stanjem, kot je trenutno najmanjši, bomo tega označili kot najmanjšega. Na koncu bomo tako najdeni račun še izpisali. Paziti moramo na primere ko trenutni račun še ni določen oz primer ko ne obstaja noben račun še ni določen oz. primer, ko ne obstaja noben bančni račun z negativnim zneskom. • Psevdo kod: // Procedura NajboljVMinusu izpiše račun z najbolj negativnim stanjem procedure NajboljVMinusu(zadnji) // Vhod: zadnji – j referenca na zadnji element dinamičnega seznama računov j g set račun=zadnji // Postavimo se na konec seznama računov set najmanjši=null // Označimo, da najmanjši račun še ni določen // Pomikamo se skozi elemente seznama računov // Pomikamo se skozi elemente seznama računov while račun<>null do if račun.stanje<0 then // Obdelujemo samo račune, ki so v minusu // Če najmanjši račun še ne obstaja ali pa ima tekoči račun manjše stanje // Če najmanjši račun še ne obstaja ali pa ima tekoči račun manjše stanje if (najmanjši=null) or (račun.stanje<najmanjši.stanje) then set najmanjši=račun // … označimo trenutni račun kot najmanjšega end d if end if set račun = račun.prejšnji end while if najmanjši<>null then // Če obstaja račun z najmanjšim negativnim stanjem call najmanjši.Izpis() // … ga izpišemo end if end procedure Switch stavek v psevdokodu stavek v psevdokodu • P Psevdokod nima standardiziranega zapisa switch d k d i d di i i i h stavka, ker se k k izvedba tega stavka od jezika do jezika zelo razlikuje. Logično gledano je switch stavek je samo eno od programerskih orodij, gledano je switch stavek je samo eno od programerskih orodij da napišete sestavljeni stavek if (if … then … elseif … elseif … else …end if), dejansko pa gre za posebno vrsto GOTO stavka. • Uporabite: switch … of select 1: … select 2: … default: … end switch Naloga 1 Naloga 1 • N Naloga: l Izdelajte podprogram, ki bo za podani niz znakov vrnil število besed v njem znakov vrnil število besed v njem. • Analiza problema: Kaj so besede? Besede so zaporedje črk in Kaj so besede? Besede so zaporedje črk in številk ločeni z ločili in presledki. Presledkov med besedami je lahko več možne so tudi med besedami je lahko več, možne so tudi kombinacije presledkov in ločil. V nizu znakov se izmenično menjavajo deli, ki so besede in se izmenično menjavajo deli, ki so besede in deli, ki to niso. Naloga 1 Naloga 1 • R Razgradnja in načrt rešitve: d j i č ši Problem obrnemo. Namesto, da bi iskali besede iščemo odseke med njimi Tisto kar ni odsek je iščemo odseke med njimi. Tisto kar ni odsek, je beseda. • Po nizu znakov se bomo pomikali znak po znak in Po nizu znakov se bomo pomikali znak po znak in preverjali ali obdelujemo znak med besedami ali ne. Ukrepati moramo samo ob prehodih med besedo in Ukrepati moramo samo ob prehodih med besedo in odsekom ter med odsekom in besedo. Pomagali si bomo s funkcijo ZnakNiDelBesede, ki • Pomagali si bomo s funkcijo ZnakNiDelBesede, ki vrne true, če se nahajamo v odseku med besedami. Pomožna logična spremenljivka smoVBesedi, bo • Pomožna logična spremenljivka smoVBesedi, bo povedala ali obdelujemo del niza, ki je beseda ali ne. Naloga 1 Naloga 1 • Psevdokod: // Fukcija ŠteviloBesed vrne število besed v podanem nizu znakov f ti ŠteviloBesed(niz) function Št il B d( i ) // Vhod: niz – niz v katere štejemo besede // Rezultat: celo število, ki predstavlja število besed v nizu // Število besed postavimo na 0, označimo, da nismo v besedi set številoBesed = 0 set smoVBesedi = false // Ponavljamo za vsak znak iz podanega niza for each znak in niz do … end do // Vrnemo število besed // Vrnemo število besed return številoBesed end function Naloga 1 Naloga 1 • Psevdokod – telo zanke: // Če tekoči znak ni del besede Č if ZnakNiDelBesede(znak) then if smoVBesedi then // Če smo bili v besedi set smoVBesedi = false // Označimo, da več nismo v besedi end if else e se // // Tekoči znak je del besede e oč a je de besede if not smoVBesedi then // Če nismo bili med besedami set smoVBesedi = true // Označimo, da smo v besedi set številoBesed = številoBesed+1 // Povečamo število besed = številoBesed+1 // Povečamo število besed end if end if Naloga 1 Naloga 1 • Analiza in načrt rešitve problema za funkcijo ZnakNiDelBesede Uporabimo kar funkcijo PozicijaZnaka, ki smo jo napravili pri prejšnjih vajah. Funkcija bo vrnila vrednost true, če je podani znak eden izmed znakov za presledke ali ločila. // Funkcija ZnakNiDelBesede vrne vrednost true, če je podani znak // eden izmed znakov za presledke in ločila f ti ZnakNiDelBesede(znak) function Z kNiD lB d ( k) // Pozicija znaka vrne vrednost >=0, če je znak del niza return PozicijaZnaka(" ,.?!;",znak)>=0 end function Naloga 1 Naloga 1 • Implementacija: ŠtetjeBesed.cs Š Naloga 2 Naloga 2 • Naloga: Razširite nalogo 1 tako, da boste posamezne besede izpisali na zaslon • Analiza in načrt rešitve: Med štetjem besed si bomo zapomnili kje se beseda začne in kje se konča. Na koncu vsake besede bomo izvedli izpis z uporabo podprograma IzpisBesede. Ker potrebujemo indekse znakov, bomo namesto foreach zanke uporabili zanko for. Ker ukrepamo na koncu besede, moramo poskrbeti še za besedo, ki sega do konca niza. Naloga 2 Naloga 2 • Psevdokod: … // P // Ponavljamo za vsak znak iz podanega niza lj k ki d i for indeks=0 to Length(niz)‐1 do set znak = niz[indeks] … end do // Če se je niz končal z besedo, jo moramo obdelati posebej if smoVBesedi then … end if … Naloga 2 Naloga 2 • Psevdokod – telo zanke: // Če tekoči znak ni del besede Č if ZnakNiDelBesede(znak) then if smoVBesedi then // Če smo bili v besedi set smoVBesedi = false // Označimo, da več nismo v besedi call IzpisBesede(niz,začetekBesede,indeks‐1) // besedo izpišemo end e d if else // Tekoči znak je del besede if not smoVBesedi then // Če nismo bili med besedami set smoVBesedi = true = true // Označimo, da smo v besedi // Označimo da smo v besedi set začetekBesede = indeks // Zapomnimo si začetek besede end if end if Naloga 2 Naloga 2 • Analiza in načrt rešitve problema za proceduro IzpisBesede Izpišemo del niza med začetnim in končnim indeksom procedure IzpisBesede(niz,inkdeksOd,indeksDo) for indeks = indeksOd indeks = indeksOd to indeksDo to indeksDo do print niz[indeks] // Izpis posameznega znaka end for print <nova vrsta> // Izpis skoka v novo vrsto <nova vrsta> // Izpis skoka v novo vrsto end procedure Naloga 2 Naloga 2 • Implementacija: IzpisBesed.cs Naloga 3 Naloga 3 • Naloga: l Razširite nalogo 2 (nalogo 1) tako, da bo namesto niza vhod vsebina tekstovne datoteke i h d bi t k t d t t k • Analiza in načrt rešitve: Na začetku bomo odprli tekstovno datoteko in jo vrstico po vrstico obdelali z obstoječimi podprogrami. d i Datoteko na koncu zapremo. Vi l V implementacijo bomo vključili tudi obravnavo t ij b klj čili t di b napak pri odpiranju datoteke. Naloga 3 Naloga 3 • Psevdokod: // Procedura IzpisBesedIzDatoteke izpiše besede tekstovne datoteke procedure IzpisBesedIzDatoteke d I i B dI D t t k (imeDatoteke) (i D t t k ) // Vhod: imeDatoteke – ime datoteke katere besede izpisujemo try call Open(datoteka ,imeDatoteke) // Datoteko odpremo read vrstica from datoteka // Prečitamo prvo vrstico while vrstica<>null do // Ponavljamo do konca IzpisBesed(vrstica) // Izpis posameznih besed v vrstici read vrstica from datoteka // Preberemo naslednjo vrstico end while call Close(datoteka) // Datoteko zapremo catch print "Pri Pri odpiranju datoteke je prišlo do napake odpiranju datoteke je prišlo do napake" end try end procedure Naloga 3 Naloga 3 • Implementacija: IzpisBesedIzDatoteke.cs
© Copyright 2024