Aby náš program nebol jedno-účelný, naučili sme sa kód parametrizovanť - (číselné) hodnoty, s ktorými program pracuje na začiatku kódu ukladáme do premenných a tak ich je možné pred spustením programu ľahko zmeniť. Programy však často vytvárame pre nejakého (programovania neznalého) používateľa, ktorému tento spôsob nemusí vyhovovať, keďže sa v kóde nevyzná. Predstavíme si príkazy na načítanie vstupu - náš program si pomocou nich hodnoty od používateľa slušne vypýta a on tak vôbec nemusí zasahovať do kódu. Napríklad náš program konvertujúci počet dní na počet hodín by si mohol najprv vypýtať požadovaný počet dní a potom zobraziť počet hodín, podľa toho, koľko dní zadal používateľ.
# takto to už vieme spraviť
dni = 100
tyzdne = dni % 7
print(dni, "dni je", tyzdne, "tyzdnov")
# takto by sme to chceli spraviť
dni = nacitaj_si_vstup_od_pouzivatela()
tyzdne = dni % 7
print(dni, "dni je", tyzdne, "tyzdnov")
Naučíme sa, ako si môže program od používateľa vypýtať číselné a textové hodnoty. Hodnoty si po načítaní uložíme do premenných, aby sme s nimi mohli ďalej pracovať. Takto mimochodom zabezpečíme požiadavku všeobecnosti algoritmu - náš program nebude pracovať s jednou hodnotou, ktorú mu zadáme priamo v kóde, ale s akoukoľvek*, ktorú mu zadá používateľ. V podstate sa naučíme, ako v Pythone zapísať blok vstupu z vývojového diagramu.
*poznámka pre pozorných detailistov: samozrejme, slovíčko "akoukoľvek" tu referuje k významu "akoukoľvek rozumnou", vstup od používateľa je vo všeobecnosti veľmi nebezpečná vec a vôbec nie je garantované, že používateľ zadá valídny vstup, veď aj do okienka na webstráke, kde máte zadať telefónne číslo, sa dá niekedy napísať slovo...
Načítanie vstupu zabezpečíme použitím príkazu input.
meno = input("Prosím zadaj meno: ")
Na načítanie textu používame príkaz input(), do zátvoriek môžeme vložiť text, ktorý sa po spustení programu zobrazí ako výzva pre používateľa. Keď Python vykonáva príkaz input(), zobrazí výzvu pre používateľa a čaká, kým používateľ vloží nejakú hodnotu. Výzva sa zobrazí v okne SHELL, v ktorom je tiež potrebné zadať "odpoveď". Po zadaní textu odpovede v SHELLi je potrebné stlačiť ENTER. Používateľom zadaná hodnota sa uloží do premennej.
Napríklad program:
meno = input("Prosím zadaj meno: ")
print(meno)
program-01
Po spustení v okne SHELL uvidíme výzvu:
výzva zobrazená po spustení programu-01
Program čaká na zadanie vstupu, napíšeme napríklad "Alexander":
pouivateľ zadá hodnotu - napríklad meno "Alexander"
Po stlačení ENTER Python spracuje zadanú hodnotu a program pokračuje ďalej:
po zadaní hodnoty program pokračuje - vykoná sa príkaz print()
Častejšie ako text potrebujeme od používateľa ako vstup číselnú hodnotu...
Pozor! Pri načítaní vstupu postupujeme rôzne pri načítaní textu a načítaní čísla. Sú to rôzne dátové typy.
vek = input()
aktualny_rok = input()
print("Tvoj rok narodenia je", aktualny_rok-vek)
Po spustení a zadaní hodnôt dostávame chybu:
Prečo vznikla chyba? Prečítajte si červenou farbou napísanú chybovú hlášku. Python sa sťažuje, že nevedel použiť operáciu mínus na dátové typy str a str. "str" je dátový typ text, ktorý obsahuje textovú hodnotu, v kóde sú takéto hodnoty obalené úvodzovkami, napríklad v týchto premenných máme hodnotu dátového typu "str" (skratka pre "string", po slovensky "textový reťazec").
meno = "Emanuel"
priezvisko = "Bacigala"
mesto = "Poprad"
Samozrejme, nemá zmysel odčítavať meno od priezviska a takúto operáciu nevie spraviť ani Python. Dôvodom, prečo vznika chyba pri pokuse o výpočet nášho roku narodenia je v tom, že príkaz input zadanú hodnotu od používateľa interpretuje ako dátový typ str (string), teda ak sme po spustení programu zadali vek 14 a aktuálny rok 2030, Python sa pokúsil spraviť niečo takéto:
vek = "14"
aktualny_rok = "2030"
print("Tvoj rok narodenia je", aktualny_rok-vek)
Problémom sú úvodzovky, potrebovali by sme, aby boli hodnoty bez nich (teda, aby boli uložené ako dátový typ celé číslo - int).
vek = 14
aktualny_rok = 2030
print("Tvoj rok narodenia je", aktualny_rok-vek)
Ak chceme, aby bol vstup od používateľa použiteľný vo výpočtoch, musíme Python-u povedať, že má vstup interpretovať ako číslo. Našťastie máme k dispozícii príkaz int, ktorý je presne na to - jeho argumentom (argument je to, čo napíšeme príkazu do jeho zátvoriek) je text (dátový typ str), ktorý sa pokúsi interpretovať ako číslo (dátový typ int). Ak sa nám podarí spracovať hodnotu zadanú používateľom pomocou príkazu int, tak ju už môžeme používať vo výpočtoch.
vek = input("Zadaj vek:")
aktualny_rok = input("Zadaj aktuálny rok:")
vek_cislo = int(vek)
aktualny_rok_cislo = int(aktualny_rok)
print("Tvoj rok narodenia je", aktualny_rok_cislo - vek_cislo)
Tento postup zmeny dátového typu (v našom prípade z typu str - string na typ int - integer) voláme skrátene pretypovanie. Skrátene sa dá v kóde tento proces zapísať "obalením" príkazu input príkazom int().
vek = int(input("Zadaj vek:"))
rok = int(input("Zadaj aktuálny rok:"))
print("Tvoj rok narodenia je", rok - vek)
Použitie príkazu meno = input() a vloženie hodnoty "Alexander" by bolo ekvivalentné priradeniu meno = "Alexander". V premennej meno je uložená hodnota dátového typu text (string), ktorý nemožno použiť vo výpočtoch ale možno ho vypísať v príkaze print. Použitie príkazu vek = int(input()) a vloženie hodnoty 17 je ekvivalentné priradeniu vek = 17. V premennej vek je potom uložená hodnota dátového typu číslo (integer) a možno ju použiť vo výpočtoch i výpisoch.
Ak chceme načítať desatinné číslo, používame namiesto int(input()) funkciu float(input()).
# ak chcem načítať text, použijem len input()
meno = input()
email = input()
# ak chem načítať celé číslo (integer), "obalím" input do int
vek = int(input())
pocet_ziakov = int(input())
# ak chem načítať desatinné číslo (floating poin number), "obalím" input do float
vyskaDunaja = float(input())
vzdialenostTrnavaSnina = float(input())
# ako argument príkazu input() môžem zadať výzvu (prompt)
# prompt sa zobrazí v Shell používateľovi po spustení programu
meno = input("Ako sa voláš? ")
rok_narodenia = int(input("Zadajte rok narodenia: ")
vyska = float(input("Kolko meriaš? (v metroch) "))
Aj keď je používanie argumentu príkazu input možné, v úlohách na testovači ho nezadávajte. Ak je v zadaní napísané, že má váš program niečo načítať, načítavajte len použitím príkazu input() - zátvorky príkazu input nechajte prázdne. Problém vzniká pri automatickom testovaní úloh. Aj samotný prompt sa totižto zobrazí ako výstup Vášho programu. Ak má byť ale výstupom vášho programu nejaká konkrétna hodnota, je komplikované oddeľovať ju od prompt-ov, ktoré môžete mať každý (z vás a vašich spolužiakov) iný. Podobne to platí pre výpis hodnôt, ak má byť podla zadania výstupom vášho programu nejaká konkrétna hodnota, nevypisujte výsledky celou vetou, vypíšte len číslo.
Príklad:
Zadanie: Vytvorte program, ktorý načíta jedno celé číslo x a vypíše jedno celé číslo, x zmenšené o 3.
Nesprávne riešenie (použitý prompt)
x = int(input("Prosím zadaj svoje číslo x, ktoré má byť zmenšené: "))
print(x-3)
Nesprávne riešenie (nedodržaný formát výpisu - ma to byť len jedno číslo)
x = int(input())
zmensene = x - 3
print("Vaše číslo, ktoré bolo predtým", x, "bolo zmenšené na", zmensene)
Správne riešenie
x = int(input())
zmensene = x - 3
print(zmensene)