Vaje - napake in izjeme
Dopolni program I
Dan je program, ki uporabnika vpraša po celih številih a, b in c ter izpiše vrednost izraza (a+b)/c. Med izvajanjem programa lahko gre marsikaj narobe, zato je koda, ki bere števila in izračuna vrednost izraza v try bloku.
Console.WriteLine("Program izpiše vrednost izraza (a+b)/c, za cela števila a,b,c");
try
{
Console.Write("Vnesi a: ");
int a = int.Parse(Console.ReadLine());
Console.Write("Vnesi b: ");
int b = int.Parse(Console.ReadLine());
Console.Write("Vnesi c: ");
int c = int.Parse(Console.ReadLine());
Console.WriteLine("(a+b)/c = " + ((a + b) / c));
}
catch (Exception e)
{
Console.WriteLine("Nekaj je šlo narobe:");
Console.WriteLine(e.ToString());
Console.WriteLine("Popravi program, da bo to izjemo obravnaval posebej.");
}
Dopolni program tako, da bo posamezne tipe izjem obravnaval ločeno (deljenje z 0, ...). Če se zgodi znana izjema, naj program samo izpiše, kaj je šlo narobe.
Dopolni program II
Sedaj pa program iz prejšnje naloge dopolni tako, da bo ob vseh konkretnih izjemah ponovno vprašal uporabnika po številih a, b, c, dokler se vrednost izraza ne bo uspešno izpisala. Pri tem naj še vedno velja, da se program zaključi, če se zgodi neznana izjema, saj ga je potrebno v tem primeru dopolniti.
Lovljenje napak
-
Sestavi metodo tabeliraj, ki vrne tabelo celih vrednosti [f(0), f(1), f(2), ..., f(n-1)], pri čemer je f neka vnaprej definirana funkcija. Če izračun f(i) sproži izjemo, naj se f(i) nadomesti z 0.
>>> public static int f(int i) { return 100 // (i % 3);}
>>> tabeliraj(10)[0, 100, 50, 0, 100, 50, 0, 100, 50, 0] -
Sestavi funkcijo preberiInt(sporocilo), ki "gnjavi" uporabnika toliko časa, dokler res ne vnese podatka, ki ga zna funkcija int pretvoriti v celo število in potem to vrne kot rezultat. Osnovni namen te funkcije je torej, da vrne celo število!
>>> preberiInt("Vnesi celo število: ")Vnesi celo število: triNAPAKA: tri ni celo število.Vnesi celo število: 3.2NAPAKA: 3.2 ni celo število.Vnesi celo število: 33 - Dopolni prejšnjo funkcijo tako, da bo prebrani podatek nujno v danih mejah, ki ju funkcija dobi za dodatna parametra. Pomagaj si s klicem preberiInt! Osnovni namen te funkcije je torej, da vrne celo število v danih mejah!
>>> preberiIntMeje("Vnesi celo število med", 1, 5)Vnesi celo število med 1 in 5: triNAPAKA: tri ni celo število.Vnesi celo število med 1 in 5: 3.2NAPAKA: 3.2 ni celo število.Vnesi celo število med 1 in 5: 0NAPAKA: 0 ni celo število med 1 in 5.Vnesi celo število med 1 in 5: 6NAPAKA: 6 ni celo število med 1 in 5.Vnesi celo število med 1 in 5: 33
-
Spremeni prejšnjo funkcijo tako, da pri klicu funkcije meji za podatek ne bosta obvezni (uporabi privzeti vrednosti -100 in 100). Pomagaj si s klicem preberiIntMeje. Osnovni namen te funkcije je torej, da vrne celo število v danih mejah!
>>> preberiIntMeje2("Vnesi celo število: ")Vnesi celo število: triNAPAKA: tri ni celo število.Vnesi celo število: 33>>> preberiIntMeje2("Vnesi celo število ", 1)Vnesi celo število med 1 in 100: 0NAPAKA: 0 ni celo število med 1 in 100.Vnesi celo število med 1 in 100: 33>>> preberiIntMeje2("Vnesi celo število ", zgMeja = 5)Vnesi celo število med -100 in 5: 7NAPAKA: 7 ni celo število med -100 in 5.Vnesi celo število med -100 in 5: 33>>> preberiIntMeje2("Vnesi celo število", 1, 5)Vnesi celo število med 1 in 5: 6NAPAKA: 6 ni celo število med 1 in 5.Vnesi celo število med 1 in 5: 0NAPAKA: 0 ni celo število med 1 in 5.Vnesi celo število med 1 in 5: 33 -
Sestavi funkcijo za vnos tabele celih števil. Funkcija naj zahteva vnos nenegativnega celega števila (dolžina tabele), potem pa še toliko celih števil. Uporabi prejšnje funkcije.
>>> vnosTabele()Vnesi število elementov: triNAPAKA: tri ni celo število.Vnesi število elementov: 3Vnesi 1. element: 3.2NAPAKA: 3.2 ni celo število.Vnesi 1. element: 3Vnesi 2. element: 1Vnesi 3. element: 2.87NAPAKA: 2.87 ni celo število.Vnesi 3. element: 287[3, 1, 287]
Proženje napak
- Sestavi funkcijo, ki bo preverjala tvoje znanje računanja do 100. Pozna naj operacije +, -, *. Funkcija naj si po vrsti (v zanki) izmišljuje posamezne račune in pri vsakem počaka, da vpišeš rezultat. Pri vsakem računu naj funkcija zahteva tvoj odgovor tako dolgo, da odgovoriš pravilno. Zanka naj se konča, ko pravilno rešiš n računov. Za vnos odgovorov uporabi ustrezno funkcijo preberiInt, preberiIntMeje ali preberiIntMeje2 s prejšnje naloge.
>>> racunanje(10)27 + 3 = 306 * 4 = 236 * 4 = 249 * 3 = 2790 - 22 = 686 * 1 = 62 - 1 = 160 - 10 = 5010 * 2 = 2210 * 2 = 2110 * 2 = 2010 + 38 = 487 - 7 = ničNAPAKA: nič ni celo število.7 - 7 = 0 -
Dana je funkcija v Pythonu, ki vrne tabelo indeksov vseh najmanjših elementov v dani tabeli. Če je vhodna tabela prazna, funkcija sproži napako s sporočilom "Tabela je prazna", če se najmanjšega elementa ne da izračunati, pa napako s sporočilom "Najmanjšega elementa se ne da izračunati". priložen je testni program. Zadevo smiselno prestavi v C#!
def indeksiNajmansih(seznam):
""" Vrne seznam indeksov najmanjših elementov
"""
# obravnava morebitnih problemov
try:
minimum = min(seznam)
except:
raise Exception('Najmanjšega elementa se ne da izračunati!')
if seznam == []:
raise Exception('Tabela je prazna')
# ni težav
indNajm = []
for ind, el in enumerate(seznam):
if el == minimum:
indNajm.append(ind) # če gre za najmanjši element, dodamo indeks
return indNajm
# testiranje
if __name__ == '__main__':
# če damo prazen seznam
try:
pod = []
t = indeksiNajmansih(pod)
except Exception as e:
print('Za podatek ', str(pod), '-- Sprožena je bila izjema', e)
# če damo nekaj, kar ni tabela
try:
pod = 12
t = indeksiNajmansih(pod)
except Exception as e:
print('Za podatek ', str(pod), '-- Sprožena je bila izjema', e)
# damo niz - dobimli bomo indekse najmanjših zankov!
try:
pod = 'abrakadabra'
indNaj = indeksiNajmansih(pod)
print('Indeksi najmanjših v ', pod, 'so: ', indNaj)
except Exception as e:
print('Za podatek ', str(pod), '-- Sprožena je bila izjema', e)
# "normalno"
try:
pod = [11, 2, 3, 2, 10, 2, 11]
indNaj = indeksiNajmansih(pod)
print('Indeksi najmanjših v ', pod, 'so: ', indNaj)
except Exception as e:
print('Za podatek ', str(pod), '-- Sprožena je bila izjema', e)
# "mešani" podatki
try:
pod = [11, 2, '3', 2, '10', 2, 11]
indNaj = indeksiNajmansih(pod)
print('Indeksi najmanjših v ', pod, 'so: ', indNaj)
except Exception as e:
print('Za podatek ', str(pod), '-- Sprožena je bila izjema', e) -
Sestavi funkcijo ničleKvEnačbe(a, b, c), ki vrne obe ničli (kot par) kvadratne enačbe a x2 + bx + c = 0! V primeru, da enačba nima dveh realnih rešitev, sproži izjemo z ustreznim obvestilom. Pri proženju napak loči matematično različne situacije (ni rešitve, neskončno rešitev, kompleksne ...)
-
Dana je funkcija
def odstraniNajmanjse(sez): novSez = [] najmanjsi = min(sez) for i in range(len(sez): if i != najmansi: novSez = novSez + [i] return novSezKaj naj bi funkcija počela, je razvidno iz njenega imena. Preveri, če deluje pravilno. Če ne, poišči in odpravi napake. Nato jo spremeni v ustrezno v C# tako, da v primeru, če v tabeli niso sama števila, sproži napako, ki pa v opisu pove, kakšen bi bil rezultat, če "napačne" elemente enostavno spustimo. Pomisli!
-
Sestavi funkcijo, ki bo izvajala osnovne računske operacije. Funkcija naj od uporabnika prebere dve števili ter operacijo (ki naj bo ena izmed +, -, *, /), izvede operacijo ter celoten račun pregledno izpiše. Če se uporabnik zmoti pri vnosu števil, naj sproži izjemo ValueError, če se zmoti pri vnosu operatorja, pa izjemo TypeError. Sestavi tudi testno funkcijo, ki te morebitne izjeme ulovi in izpiše smiselna opozorila. Testno funkcijo dopolni tako, da bo smiselno opozorilo izpisala tudi v primeru, ko uporabnik poskuša izvesti operacijo deljenja s številom 0.
-
Sestavi funkcijo, ki uporabnika gnjavi tako dolgo, da vnese permutacijo števil od 1 do n (vse elemente v isti vrstici, ločeni naj bodo s presledkom). Na koncu naj vrne prebrano permutacijo.
-
Sestavi program, ki bere cela števila toliko časa, dokler uporabnik ne vnese nič (le pritisne Enter), in na koncu izpiše število prebranih števil, vsoto teh števil ter njihovo povprečje. Če uporabnik ne vnese celega števila (vnese npr. 12x ali 3.5), le izpiši obvestilo o napaki, kot ga da Python, in nadaljuj (tega vnosa pri računanju povprečja seveda ne upoštevaš). Poskrbi za to, da programa ni mogoče "sesuti".
-
Sestavi še "samopopravljajočo" funkcijo inverz2, ki poskuša "odpraviti" napake, ki se jih da (premajhen indeks nastavi na najmanjšo možno vrednost, prevelik indeks nastavi na največjo možno vrednost, ...). Če se napake ne da odpraviti, naj funkcija vrne 0.