# vstup sa konvertuje na celé číslo a uloží do premennej

Podobné dokumenty
VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Základy algoritmizácie a programovania

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

Strojový kód, assembler, emulátor počítača

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

15. Príkazy vetvenia

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Ak stlačíme OK, prebehne výpočet a v bunke B1 je výsledok.

Vytvorenie používateľov a nastavenie prístupov

Import Excel Univerzál

Príklad ponuky: Riešenie: vrch. hodnota 3 hodnota 2 hodnota 1

Programovanie v jazyku C - pole treba poorat...

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

P R O L U C. POZNÁMKY individuálnej účtovnej závierky pre rok 2014

Ďalší spôsob, akým je možné vygenerovať maticu je použitie zabudovaných funkcií na generovanie elementárnych matíc.

Import cenových akcií FRESH

KEO - Register obyvateľov Prevod údajov

Práca s elektronickou prihláškou SOČ

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

KOMISNÝ PREDAJ. Obr. 1

PLASTOVÉ KARTY ZÁKAZNÍKOV

Manuál na prácu s databázou zmlúv, faktúr a objednávok Mesta Martin.

To bolo ľahké. Dokážete nakresliť kúsok od prvého stromčeka rovnaký? Asi áno, veď môžete použiť tie isté príkazy.

DOBROPISY. Dobropisy je potrebné rozlišovať podľa základného rozlíšenia: 1. dodavateľské 2. odberateľské

Imagine. Popis prostredia:

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

Spracovanie informácií

Obsah. Reprezentácia údajov v počítači. Digitalizácia číselnej informácie. Digitalizácia znakov a textovej informácie.

Ako započítať daňovú licenciu

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

POSTUP GENEROVANIA ŽIADOSTI O KVALIFIKOVANÝ CERTIFIKÁT POMOCOU PROGRAMU COMFORTCHIP.

Pracovné prostredie MS EXCEL 2003.

TomTom Referenčná príručka

Operačný systém Úvodná prednáška

Task, async, await METÓ DY VÝPOČTOVEJ INTELIGENCIE A C# FA K ULTA E L E K T ROTECHNIKY A INFORMATIKY S LOVENSKÁ T E CHNICKÁ U NIVERZITA

Kvadratické funkcie, rovnice, 1

Príručka Mobility Tool + pre príjemcov grantu

Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

Elektronické odosielanie výplatných pások

Zápis predmetov do AiSu na aktuálny akademický rok

Neplatené voľno / absencia zadanie v programe, oznamovacia povinnosť

AIS2 Hodnotenie študentov po skúške POMÔCKA PRE VYUČUJÚCICH

Postup a podmienky spracovania výkazov INTRASTAT. Evidencia dod. faktúry podklady pre výkaz PRIJATIE TOVARU

8. Relácia usporiadania

7.1 Návrhové zobrazenie dotazu

Total Commander. Základné nastavenia

Modul PROLUC Podvojné účtovníctvo

Návod na používanie súboru na vyhodnotenie testov všeobecnej pohybovej výkonnosti

NA POUŽITIE ŠABLÓNY PRE PÍSANIE ZÁVEREČNEJ PRÁCE

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

Organizačné štruktúry.

Dealer Extranet 3. Cenové ponuky

Optimik Exporter Inštalácia 1. Otvoriť stránku nabytok.com, v záložke POREZ DTD kliknúť na Stiahnuť Optimik Exporter

P R O L E M FAKTURA Z VYDAJA OBSAH. Vystavenie faktúry z výdaja postup, podmienky... 2

MOCNINY A ODMOCNINY Eva Zummerová

Programovanie I. Úvod do programovania Mgr. Stanislav Horal, Katedra informatiky, FPV, UCM

Začínam so zadaním z NEPOUŽÍVAME ROZSAH POKIAĽ HO MUSÍME PRESKOČIŤ

Ťahák - Základy jazyka Python

ČÍSELNÉ RADY. a n (1) n=1

Externé zariadenia Používateľská príručka

Navýšenie (brutácia) nepeňažného príjmu v programe Mzdy a personalistika

Úvodná strana IS ZASIELKY Prvky úvodnej stránky:

Diplomový projekt. Detská univerzita Žilinská univerzita v Žiline Matilda Drozdová

AKO PRIPRAVIŤ MONEY S4 / S5 NA NOVÝ ÚČTOVNÝ ROK

Beáta Stehlíková Časové rady, FMFI UK, 2013/2014. CvičenievR-kuI.:ARIMAmodely p.1/15

Pripojenie na internet cez WiFi pre zamestnancov a študentov

Studentove t-testy. Metódy riešenia matematických úloh

Kombinatorická pravdepodobnosť (opakovanie)

Prevody z pointfree tvaru na pointwise tvar

THESES VYSOKOŠKOLSKÉ KVALIFIKAČNÉ PRÁCE POMÔCKA PRE VYUČUJÚCICH

Tlač do PDF a odosielanie dokladov cez . OBSAH

Bezdrôtová sieť s názvom EDU po novom

Virtuálna Registračná Pokladnica. Modul OPD pre ios

Na aute vyfarbi celé predné koleso na zeleno a pneumatiku zadného kolesa vyfarbi na červeno.

R11 extremo. Odolný mobilní telefon pro dvě SIM karty. Návod k funkci SOS locator Návod na použitie SOS locator

AR, MA a ARMA procesy

Kontrola väzieb výkazu Súvaha a Výkaz ziskov a strát Príručka používateľa

ROVNOMERNÉ DAŇOVÉ ODPISY od ROK

DLHODOBÝ MAJETOK (OBSTARANIE, ODPISY, VYRADENIE)

Príručka pre prostredie Digitálnej autoškoly pre inštruktorov časť elearning

Aktualizácia firmvéru a aplikácie USB modemu Huawei E220 pre operačný systém Windows Vista

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

STRUČNÝ NÁVOD KU IP-COACHU

NÁVOD NA INŠTALÁCIU A OBSLUHU SAMOOBSLUŽNÉHO AKTIVAČNÉHO PORTÁLU

Návod k servisnému programu pre fiskálny modul FM2000. manuál. (c)varos

Metóda vetiev a hraníc (Branch and Bound Method)

Používateľská príručka: MOODLE

Matematika test. Cesta trvala hodín a minút.

Polia a matice v jazyku C. Michal Kvasnica

Obsah Úvod... 3 Zapnutie makra... 4 Vyplnenie formulára... 6 Naplnenie hlavnej knihy... 7 Naplnenie stavu zamestnancov... 7 Mapa modulov...

Školská sieť EDU. Rozdelenie škôl. Obsah: Deleba škôl podľa času zaradenia do projektu: Delba škôl podľa rýchlosti pripojenia:

Používateľská príručka k aplikácii na SOČ

Multiplexor a demultiplexor

Elektronická značka je k dispozícii na stránke etax v záložke Úvod, položka menu Správa Certifikátov.

Automobil poskytnutý zamestnancovi. Ing. Mgr. Martin Tužinský, PhD.

Konfigurácia IP Bell 02C Dverný vrátnik a FIBARO Home Center 2

Matematika test. Mesačne zaplatí. Obvod obdĺžnikovej záhrady je. Jedna kniha stojí Súčet

Transkript:

Výnimky Určite sa vám už stalo, že vám program havaroval (neočakávane sa ukončil a vypísal nejaký oznam - chybové hlásenie). Napríklad ak ste pri zadávaní reálneho čísla namiesto desatinnej bodky použili desatinnú čiarku. Počas vykonávania programu môže dôjsť k situácii, keď počítač z nejakého dôvodu nevie ukončiť vykonanie u. Napríklad ak program očakáva zadanie čísla a užívateľ zadá vstupnú hodnotu, ktorú počítač nevie konvertovať (zmeniť) na číslo; pri delení zistí, že menovateľ má hodnotu nula, alebo sa od neho požaduje otvorenie súboru, ktorý nenájde na predpokladanom mieste na disku a pod. Hovoríme, že nastala výnimka. Je na programátorovi, aby y, pri vykonaní ktorých môže nastať výnimka, pri písaní programu ošetril. Robí sa tak programovou konštrukciou try-except, používanie ktorej si ozrejmíme na príkladoch. Pohrajme sa najprv s požiadavkou zadať z klávesnice celé číslo a vypísať jeho dvojnásobok. Jednoduchá sekvencia (postupnosť ov): vstup = input("zadaj celé číslo: ") # do premennej vstup sa uloží reťazec zadaný z klávesnice cele_cislo = int(vstup) # vstup sa konvertuje na celé číslo a uloží do premennej print("dvakrát celé číslo:", 2*cele_cislo) # obsah premennej cele_cislo sa vynásobí dvoma a zobrazí Ak zadáme korektne (správne) celé číslo, dostaneme správny výsledok. Ak však stlačíme Enter, t.j. vložili sme prázdny reťazec, program havaruje a vypíše chybové hlásenie (posledný riadok hlásenia Chyba hodnoty: nedovolený znak v int(): 'prázdny reťazec' ): Ako vidieť z hlásení nižšie, podobne program zareaguje aj na vloženie reťazcov 2 a O (písmeno O) alebo na vloženie reálneho čísla 20.0. ValueError: invalid literal for int() with base 10: '2O' ValueError: invalid literal for int() with base 10: '20.0' Hovoríme, že nastali výnimky a zadanie celého čísla užívateľom by sme mali ošetriť. Predbežne predpokladajme tú najjednoduchšiu situáciu, t.j. program po vzniku výnimky ukončíme. Ukončiť program možno zavolaním funkcie sys.exit(), ktorá je v knižnici sys, preto ju musíme na začiatku programu importovať (pridať) do programu. K výnimke môže dôjsť pri pokuse konvertovať zadaný reťazec na celé číslo, preto tento zapíšeme do bloku try. Ošetrenie výnimky sa deje v bloku except a keďže všetky tri výnimky uvedené vyššie sú toho istého charakteru - ValueError, ošetrenie môže mať tvar: import sys vstup = input("zadaj celé číslo: ") # nemôže nastať problém # začiatok bloku try cele_cislo = int(vstup) # problémový # začiatok bloku except s názvom chyby print("zadaný prázdny reťazec alebo nedovolený znak, ukončím program!") # naše chybové hlásenie sys.exit() # ukončenie behu programu print("dvakrát celé číslo:", 2*cele_cislo) # vykoná sa, len ak nenastane výnimka! Takéto ošetrenie výnimky môžeme uplatniť aj na zadanie reálneho čísla: import sys vstup = input("zadaj reálne číslo: ") realne_cislo = float(vstup) 1

print("zle zadané reálne číslo, ukončím program!") sys.exit() print("dvakrát reálne číslo:", 2*realne_cislo) Použitie: Zadaj reálne číslo: 10,5 Zle zadané reálne číslo, končím! Zadaj reálne číslo: 1e3 e (exponent) čítame 10 na, t.j. 1e3 znamená 1.10 3 čo je 1000 Dvakrát reálne číslo: 2000.0 Skúsme teraz trochu sofistikovanejšie (prepracovanejšie) ošetrenie zadania celého čísla. Ukončenie programu pri zle zadanom vstupe zrejme nie je vhodným ošetrením. Nech sa program pri vzniku výnimky neukončí ale znova vráti na začiatok, t.j. na výzvu Zadaj celé číslo. Použijeme nekonečný cyklus while, z ktorého sa vystúpi, ak pri konverzii reťazca na int nedošlo k výnimke, t.j. bolo korektne zadaná celé číslo - nie je dôvod znova opakovať zadanie vstupu. Program po vystúpení z cyklu následne pokračuje mi za blokom except. Ujasnite si, ktoré riadky sú v cykle (podľa odsadenia), ktoré mimo cyklu! vstup = input("zadaj celé číslo: ") cele_cislo = int(vstup) # v e vyššie sa neodišlo do bloku except, tzn. má sa pokračovať za cyklom! print("zadaný prázdny reťazec alebo nedovolený znak!") print("dvakrát celé číslo:", 2*cele_cislo) V bloku try, ak je v cykle, musí byť vždy nejakým spôsobom (v našom prípade om ) zabezpečené vystúpenie z cyklu, ak nenastane výnimka. Ak požadujeme zadanie nezáporného celého čísla, potrebujeme vyvolať výnimku aj keď bolo celé číslo zadané korektne, ale záporné. Možné ošetrenie: raise ValueError print("zlý vstup!") print("dvakrát celé číslo:", 2* nezaporne_cele_cislo) # vyvolanie výnimky ValueError 2

Alebo sofistikovanejšie: # na if sa dostane, ak konverzia na celé číslo nevyvolala výnimku raise ValueError # číslo je záporné, ošetri výnimku ValueError continue # pokračuj na začiatku cyklu # číslo nebolo záporné, resp. je nezáporné, vystúp z cyklu if len(vstup) == 0: print("zadal si prázdny reťazec!") elif vstup[0] == '-': print("zadal si záporné číslo!") print("zadal si nedovolený znak!") print("dvakrát celé číslo:", 2*nezaporne_cele_cislo) Zrejme vetva else by mohla celkom chýbať, stačí na úrovni if (prečo?). Otestujte tiež pre vstupné reťazce medzera alebo tabulátor a kladná alebo záporná celočíselná hodnota. Keďže predchádzajúce ošetrenie je dosť rozsiahle, je vhodné ho umiestniť do samostatnej funkcie. def vratnezapornecelecislo(): raise ValueError continue return nezaporne_cele_cislo # vyvez z funkcie hodnotu premennej nezaporne_cele_cislo if len(vstup) == 0: print("zadal si prázdny reťazec!") elif vstup[0] == '-': print("zadal si záporné číslo!") print("zadal si nedovolený znak!") ''' KONIEC FUNKCIE ''' # použitie - volanie funkcie v programe: print("dvakrát celé číslo:", 2*vratNezaporneCeleCislo()) 3

Predchádzajúce ošetrenie bez raise ValueError: def vratnezapornecelecislo(): print("zadal si záporné číslo!") continue if len(vstup) == 0: print("zadal si prázdny reťazec!") print("zadal si nedovolený znak!") return nezaporne_cele_cislo Ukážme si ošetrenie výnimiek s viacerými názvami chýb. Majme zoznam napríklad s hodnotami 1, 2, 3, 4 a 5. Pri úlohe vypísať hodnotu zoznamu na zadanom indexe môžu nastať dva problémy a teda dve rôzne výnimky. Jeden problém už poznáme - nepodarilo sa konvertovať vstupný reťazec na celé číslo - názov chyby: ValueError. Iným problémom môže byť fakt, že zadané celé číslo nemusí byť vhodným indexom zoznamu, t.j. hodnota zoznamu so zadaným indexom neexistuje - názov chyby: IndexError. Príklad ošetrenia: zoz = [1, 2, 3, 4, 5] vstup = input("vypísať hodnotu zoznamu na indexe: ") index = int(vstup) hodnota = zoz[index] print("nebolo zadané celé číslo!") except IndexError: print("zadal si nedovolenú hodnotu indexu!") print("hodnota zoznamu na indexe {0} je {1}".format(index, hodnota)) Odporúčanie Pri problémových och je dobré, keď si programátor pri písaní programu vyvolaním všetkých možných výnimiek ujasní názvy chýb, ktoré môžu nastať a ošetrí ich v konštrukcii try-except, ktorá má tvar: 4

except názov_chyby1: except názov_chyby2: except problémové y, pri ich vykonávaní môže nastať výnimka, a súvisiace y y, ktoré sa majú vykonať, ak nastane chyba1 y, ktoré sa majú vykonať, ak nastane chyba2 pokračovanie programu (ak nedošlo k výnimke, bloky except sa preskočia) Konštrukcia try-except má ešte veľa rôznych variant, ktorými sa nebudeme zaoberať. Na ilustráciu niekoľko ďalších situácií a možných ošetrení výnimiek. 5

Ukážka: Jednoduché ošetrenie vstupu, nevypíše chybové hlásenie (except bez názvu konkrétnej chyby), len zopakuje výzvu "Koľko máš rokov: "; vek môže byť akékoľvek celé číslo, aj záporné. # opakuj do nekonečna (alebo kým nenarazíš na ) vek = input("koľko máš rokov: ") # vek je typu str # pokús sa vykonať blok try vek = int(vek) # pokús sa vykonať problémový, ak nastane # výnimka, pokračuj blokom except # vek je OK, vyskoč z nekonečného cyklu while except: # blok except bez názvu chyby pass # nič nesprav # koniec bloku while, znova na podmienku True print (vek) # vykonaj po vystúpení z cyklu while Ukážka: Výpočet podielu dvoch reálnych čísel zadaných z klávesnice v jednom riadku oddelených medzerou; využitie funkcie split (pozri reťazce). Pri analýze si treba uvedomiť, že treba ošetriť 1. nedovolený index, 2. zle zadané reálne číslo a 3. delenie nulou. Pri delení nulou nastáva chyba, ktorej názov ešte nepoznáme, ale ľahko ho získame napríklad pomocou u print(5/0). Ako vidieť nižšie, názov chyby je ZeroDivisionError. vstup = input("zadaj dve čísla: ").split() podiel = float(vstup[0]) / float(vstup[1]) except IndexError: print("treba zadať dve čísla!") print("použitý nedovolený znak") except ZeroDivisionError: print("nulou sa nedá deliť!") # split vytvorí dva reťazce, vstup[0] a vstup[1]! print("podiel = {}".format(podiel)) 6

Ukážka: Program počíta aritmetický priemer vopred neznámeho počtu reálnych čísel. def vratrealnecislo(vstup): # funkcia s parametrom vstup typu str vracajúca reálne číslo while vstup!= '': realne_cislo = float(vstup) return realne_cislo print("chyba - opakuj zadanie reálneho čísla!") vstup = input("zadaj reálne číslo: ") if len(vstup)!= 0: # =============================== PROGRAM =============================== pocet_cisel, sucet_cisel = 0, 0 vstup = input("zadaj reálne číslo (ukončenie -> Enter): ") if vstup == '': realne_cislo = vratrealnecislo(vstup) pocet_cisel += 1 sucet_cisel += realne_cislo # Programátorské ošetrenie delenia print("priemer = {0:.2f}".format(sucet_cisel/pocet_cisel)) except ZeroDivisionError: print("nebolo zadané ani jedno reálne číslo!") ''' Matematické ošetrenie delenia if pocet_cisel > 0: print("priemer = {0:.2f}".format(sucet_cisel/pocet_cisel)) print("nebolo zadané ani jedno reálne číslo!") ''' 7