Martin Svoboda

Martin Svoboda - Blog

Uživatelský vstup: input()


Zatím jsme se zaměřovali na práci s proměnnými, které slouží jako úložiště pro data, jež jsou přímo zapsána do kódu (promenna="zadana v kodu"). Takový přístup funguje, ale naše programy nejsou příliš univerzální - vždy se spouštějí se stejnými daty a vykonávají stejný úkol. V této části se zaměříme na vytváření interaktivních programů, které mohou přijímat vstupy od uživatele během jejich běhu.

Když budeme o počítači přemýšlet ve zjednodušeném modelu vstupu, procesoru, paměti a výstupu, tak již umíme ukládat data do paměti, používat operátory pro jejich zpracování a také znáš funkci print() pro vypsáná výsledku. Pro úplnost chybý funkce pro uživatelský vstup, input()

Model počítače

Uživatelský vstup

Základní funkcí pro získání uživatelského vstupu je funkce input(). Tato funkce pozastaví provádění programu a čeká, až uživatel zadá text nebo stiskne klávesu. To, co uživatel zadá, se uloží do proměnné jako řetězec.

# Příklad: Práce s uživatelským vstupem

print("Ahoj")
print("Jak se máš?")
odpoved = input()
print("Mám se", odpoved, ".")

# Alternativní způsob:
print("Ahoj")
odpoved = input("Jak se máš?\n")
print("Mám se", odpoved, ".")

Tento kód pozdraví uživatele “Ahoj” a zeptá se, jak se má. Program se poté zastaví a čeká na odpověď, kterou následně uloží do proměnné odpoved a vypíše ji.

Příklad: Sčítačka

Nyní si vyzkoušíme vytvořit jednoduchou kalkulačku, která požádá uživatele o zadání dvou čísel a poté je sečte.


.
.
.
.
.
.

Zamysli se nad tím, jak by mohl program vypadat? Můžná si to zkus napsat sám/sama.


.
.
.
.
.
.

Možná vaše řešení vypadá nějak takto:

# Jednoduchá kalkulačka

print("Kalkulačka")
print("Zadej dvě čísla a já je sečtu :)")

cislo1 = input("Zadej první číslo: ")
cislo2 = input("Zadej druhé číslo: ")

print("Výsledek je:", cislo1 + cislo2)
Kvíz:

Bude tento kód fungovat správně? Pokuď ne, proč?

  1. Ano
  2. Ne


.
.
.
.
.
.

Tento kód nebude fungovat správně, pokud zadáme čísla, protože funkce input() vrací hodnoty jako řetězce. Když sečteme dva řetězce, dojde ke zřetězení (spojení dvou řetězců), nikoliv k aritmetickému sčítání. Musíme vstup převést na čísla, abychom mohli provést matematickou operaci.

# Správná verze kalkulačky

print("Kalkulačka")
print("Zadej dvě čísla a já je sečtu :)")
cislo1 = int(input("Zadej první číslo: "))
cislo2 = int(input("Zadej druhé číslo: "))
print("Výsledek je:", cislo1 + cislo2)

Nebo takto:

# Alternativní řešení

print("Kalkulačka")
print("Zadej dvě čísla a já je sečtu :)")
cislo1 = input("Zadej první číslo: ")
cislo2 = input("Zadej druhé číslo: ")
print("Výsledek je:", int(cislo1) + int(cislo2))

Nebo pro desetinná čísla:

# Kalkulačka pro desetinná čísla

print("Kalkulačka")
print("Zadej dvě čísla a já je sečtu :)")
cislo1 = float(input("Zadej první číslo: "))
cislo2 = float(input("Zadej druhé číslo: "))
print("Výsledek je:", cislo1 + cislo2)

Pozor na chyby

I když je tento program funkční, má stále jednu slabinu – pokud uživatel místo čísla zadá text, program skončí s chybou ValueError. Tuto problematiku vyřešíme později, ale prozatím se budeme spoléhat na to, že uživatelé budou dodržovat instrukce.

Kontrolní otázky

  1. Jaká je základní funkce v jazyce Python, která slouží k získání uživatelského vstupu?
  2. Jaký datový typ vrací funkce input() ve výchozím nastavení?
  3. Jak převedete řetězcový vstup na celé číslo?
  4. Proč může dojít k pádu programu při sčítání dvou čísel pomocí funkce input()?

Kvízy

Kvíz:

Co vrací funkce input()?

  1. Celé číslo
  2. Float
  3. String
  4. Seznam
Kvíz:

Jaký bude výstup následujícího kódu?

print("Ahoj, " + input("Jak se jmenuješ? ") + "!")
  1. Vypíše 'Ahoj, jak se jmenuješ?'. Poté čeká na vstup uživatele a vypíše 'Ahoj, [vstup]!'.
  2. Čeká na vstup uživatele a pak vypíše 'Ahoj, Jak se jmenuješ?!'
  3. Vypíše 'Jak se jmenuješ?' a čeká na vstup uživatele. Poté vypíše 'Ahoj, [vstup]!'.
  4. Vyhodí syntaktickou chybu.
Kvíz:

Uvažujte o kódu:

age = int(input("Zadejte svůj věk: "))

Co se stane, když uživatel místo čísla zadá “dvacet”?

  1. Program pokračuje bez problému.
  2. Vyvolá se `TypeError`.
  3. Je vyvolána chyba `ValueError`.
  4. Program čeká na správný vstup.
Kvíz:

Který z následujících způsobů NENÍ správný pro převod uživatelského vstupu na celé číslo?

  1. `číslo = int(input())`
  2. `num = input(); num = int(num)`
  3. `num = int(); num = input()`
  4. `num = input(); num = int(num + 1)`

Cvičení

Jednoduchý program Echo

Napište program, který přijímá vstup od uživatele a vrací jej zpět.

Kalkulátor délky řetězce

Napište program, který přečte řetězec od uživatele a zobrazí jeho délku.

Převodník řetězců

Získejte od uživatele řetězec a zobrazte jej v opačném pořadí.

Řešení:
text = input("Zadejte text: ")
print("Obrácený text:", text[::-1])

Program na výpočet plochy obdélníku

Vytvořte program, který vypočítá plochu obdélníku. Zeptejte se uživatele na délku a šířku a poté zobrazte výsledek.

Řešení:
delka = float(input("Zadejte délku obdélníku: "))
sirka = float(input("Zadejte šířku obdélníku: "))
plocha = delka * sirka
print("Plocha obdélníku je:", plocha)

Kalkulačka

Implementujte základní kalkulačku, která provede sčítání, odčítání, násobení a dělení. Poté ji vylepšete tak, aby zvládala i čísla s desetinnou čárkou.

Řešení:
# Základní kalkulačka

cislo1 = float(input("Zadejte první číslo: "))
cislo2 = float(input("Zadejte druhé číslo: "))

print("Výsledek sčítání je:", cislo1 + cislo2)
print("Výsledek odčítání je:", cislo1 - cislo2)
print("Výsledek násobení je:", cislo1 * cislo2)
print("Výsledek dělení je:", cislo1 / cislo2)