end if

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