Topic notes

Input and output

~15 min read19 runnable examples

These notes are written in Slovak. The examples run the same in any language.

You can run every example right here, then edit the code and see what changes. Your code runs only in this browser, in an isolated environment with no access to the internet or your account.

Väčšina programov dostáva údaje zvonka (vstup) a výsledok niekomu ukazuje (výstup). V tejto téme sa naučíš načítať údaje z klávesnice funkciou input, správne ich premeniť na čísla a pekne naformátovať výstup – napríklad na dve desatinné miesta alebo do zarovnanej tabuľky.

Čo sa naučíš

  • načítať text z klávesnice funkciou input,
  • načítať celé aj desatinné čísla a viac čísel na jednom riadku,
  • používať sep a end v príkaze print,
  • formátovať výstup pomocou f-reťazcov (desatinné miesta, zarovnanie).

V ukážkach je tučným písmom vyznačené to, čo sa zadá z klávesnice.

1Načítanie vstupu: input()

Funkcia input() zastaví program a čaká, kým niekto napíše riadok textu a stlačí Enter. Napísaný text potom vráti – zvyčajne ho hneď uložíme do premennej:

Python
meno = input()
print("Ahoj,", meno)

Výstup:

Ema
Ahoj, Ema

Do zátvoriek môžeš napísať výzvu – text, ktorý sa vypíše predtým, než program začne čakať. Vďaka nej človek pri počítači vie, čo má zadať:

Python
meno = input("Ako sa voláš? ")
print("Ahoj,", meno + "!")

Výstup:

Ako sa voláš? Ema
Ahoj, Ema!

Za výzvu sa oplatí dať medzeru, inak sa zadávaný text prilepí hneď za otáznik.

1.1input vždy vracia text

Nech napíšeš čokoľvek – aj číslo – input vráti reťazec (str):

Python
x = input("Zadaj číslo: ")
print(type(x))
print(x + x)

Výstup:

Zadaj číslo: 42
<class 'str'>
4242

Text "42" + "42" sa spojí na "4242". Ak chceme s hodnotou počítať, musíme ju previesť na číslo.

2Čítanie čísel

Na prevod slúžia funkcie int (celé číslo) a float (desatinné číslo). Zvyčajne ich „obalíme“ priamo okolo input:

Python
a = int(input("Prvé číslo: "))
b = int(input("Druhé číslo: "))
print("Súčet:", a + b)
print("Súčin:", a * b)

Výstup:

Prvé číslo: 12
Druhé číslo: 30
Súčet: 42
Súčin: 360

Postupnosť vykonania pri int(input()): najprv sa vykoná input() a vráti text, napríklad "12"; potom int("12") z neho urobí číslo 12.

Python
vyska = float(input("Výška v metroch: "))
print("V centimetroch:", vyska * 100)

Výstup:

Výška v metroch: 1.75
V centimetroch: 175.0

2.1Keď sa zadá niečo, čo nie je číslo

Ak niekto namiesto čísla napíše text, prevod zlyhá a program skončí chybou ValueError:

Python
a = int(input("Zadaj číslo: "))
print(a * 2)

Výstup (program skončí chybou):

Zadaj číslo: dva
Traceback (most recent call last):
  File "program.py", line 1, in <module>
    a = int(input("Zadaj číslo: "))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'dva'

Rovnako zlyhá int("3.5") – desatinné číslo nie je celé číslo. Ako takú chybu zachytiť a požiadať o nový vstup, sa naučíš v téme Výnimky.

2.2Viac čísel na jednom riadku

Niekedy sú na vstupe dve čísla na jednom riadku, napríklad 12 30. Metóda split() rozdelí text podľa medzier na časti (vznikne zoznam reťazcov – téma Zoznamy):

Python
riadok = input("Zadaj dve čísla: ")
casti = riadok.split()
print(casti)
a = int(casti[0])
b = int(casti[1])
print("Súčet:", a + b)

Výstup:

Zadaj dve čísla: 12 30
['12', '30']
Súčet: 42

Kratší zápis, s ktorým sa často stretneš:

Python
a, b = map(int, input().split())
print(a - b)

Výstup:

7 5
2

map(int, ...) použije funkciu int na každú časť a a, b = ... rozdelí dve výsledné čísla do dvoch premenných. Musia byť zadané presne dve hodnoty, inak vznikne chyba.

2.3Vstup pri automatických testoch

Keď sa program na Mente kontroluje testami, vstup sa „zadá“ automaticky a porovnáva sa iba to, čo vypíše print. Výzvy v input("…") sa pri testoch nevypisujú, takže na ich presnom znení nezáleží. Na znení výstupu z print však záleží – musí zodpovedať zadaniu do písmena.

3Výpis: sep a end

Príkaz print má dve užitočné nastavenia:

  • sep (separator) – čo sa vloží medzi vypisované hodnoty; predvolene medzera,
  • end – čo sa vypíše na konci; predvolene nový riadok "\n".
Python
print(2024, 10, 1, sep="-")
print("a", "b", "c", sep="")
print("Počítam", end="")
print("...", end="")
print(" hotovo!")

Výstup:

2024-10-1
abc
Počítam... hotovo!

Pomocou end vypíšeš viac výsledkov na jeden riadok, aj keď ich vypisujú rôzne príkazy (v téme Cykly to využiješ veľmi často):

Python
print(1, end=" ")
print(2, end=" ")
print(3)

Výstup:

1 2 3

4Formátovanie: f-reťazce

F-reťazec je text, pred ktorým stojí písmeno f. Do zložených zátvoriek {} v ňom môžeš vložiť premennú alebo celý výraz – Python ich nahradí hodnotou:

Python
meno = "Ján"
body = 47
maximum = 60
print(f"{meno} získal {body} z {maximum} bodov.")
print(f"To je {body / maximum * 100} %.")

Výstup:

Ján získal 47 z 60 bodov.
To je 78.33333333333333 %.

4.1Počet desatinných miest

Za výraz v zátvorkách môžeš napísať dvojbodku a formát. Najčastejší je .2f – desatinné číslo na 2 desatinné miesta:

Python
podiel = 47 / 60 * 100
print(f"{podiel:.2f} %")
print(f"{podiel:.1f} %")
print(f"{podiel:.0f} %")
print(f"{3:.2f}")

Výstup:

78.33 %
78.3 %
78 %
3.00

Na rozdiel od round formát .2f vždy vypíše presne dve desatinné miesta – aj 3 ukáže ako 3.00. To sa hodí pri peniazoch.

>>> round(2.5)
2
>>> round(3.5)
4
>>> round(2.675, 2)
2.67

Posledný príklad ukazuje nepresnosť desatinných čísel: 2,675 je v počítači uložené ako o chlp menšie číslo, preto vyjde 2,67.

4.2Zarovnanie do stĺpcov

Formát môže určiť aj šírku – koľko znakov má hodnota zabrať. Znak < zarovná doľava, > doprava, ^ na stred:

Python
print(f"{'Meno':<10}{'Body':>6}")
print(f"{'Ema':<10}{47:>6}")
print(f"{'Ján':<10}{8:>6}")
print(f"{'Sofia':<10}{120:>6}")
print(f"[{'stred':^11}]")

Výstup:

Meno        Body
Ema           47
Ján            8
Sofia        120
[   stred   ]

Šírku a desatinné miesta sa dajú kombinovať: {cena:>8.2f} zarovná cenu doprava na 8 znakov s 2 desatinnými miestami.

4.3Prehľad formátov

ZápisVýznamPríkladVýsledok
{x}hodnota tak, ako jef"{7/2}"3.5
{x:.2f}2 desatinné miestaf"{3.14159:.2f}"3.14
{x:5}šírka 5 znakovf"[{42:5}]"[ 42]
{x:<5}zarovnanie doľavaf"[{'ab':<5}]"[ab ]
{x:>5}zarovnanie dopravaf"[{'ab':>5}]"[ ab]
{x:^5}na stredf"[{'ab':^5}]"[ ab ]
{x:03}doplniť nulami na šírku 3f"{7:03}"007

Čísla sa pri zadanej šírke zarovnávajú doprava, text doľava.

5Riešené úlohy

5.1Obdĺžnik

Zadanie: Načítaj dĺžky strán obdĺžnika (môžu byť desatinné) a vypíš jeho obvod a obsah na 2 desatinné miesta.

Riešenie: Strany čítame cez float, lebo môžu byť desatinné. Výsledky formátujeme cez .2f.

Python
a = float(input("Strana a: "))
b = float(input("Strana b: "))
obvod = 2 * (a + b)
obsah = a * b
print(f"Obvod: {obvod:.2f}")
print(f"Obsah: {obsah:.2f}")

Výstup:

Strana a: 4.5
Strana b: 2
Obvod: 13.00
Obsah: 9.00

5.2Prevod teploty

Zadanie: Načítaj teplotu v stupňoch Celzia a vypíš ju v stupňoch Fahrenheita na jedno desatinné miesto. Platí F = C · 9/5 + 32.

Python
celzius = float(input("Teplota v °C: "))
fahrenheit = celzius * 9 / 5 + 32
print(f"{celzius} °C = {fahrenheit:.1f} °F")

Výstup:

Teplota v °C: 21.5
21.5 °C = 70.7 °F

5.3Účet v reštaurácii

Zadanie: Načítaj sumu na účte a počet ľudí. K sume sa pridá 10 % prepitné. Vypíš celkovú sumu a koľko zaplatí každý, na centy.

Riešenie: Prepitné je 10 % zo sumy, celková suma je teda suma * 1.10. Deliť budeme počtom ľudí (celé číslo, preto int).

Python
suma = float(input("Suma na účte: "))
ludia = int(input("Počet ľudí: "))
spolu = suma * 1.10
print(f"Spolu s prepitným: {spolu:.2f} €")
print(f"Na osobu: {spolu / ludia:.2f} €")

Výstup:

Suma na účte: 86.40
Počet ľudí: 4
Spolu s prepitným: 95.04 €
Na osobu: 23.76 €

5.4Rok narodenia

Zadanie: Načítaj meno a rok narodenia. Vypíš, koľko rokov bude mať človek na konci roka 2026.

Python
meno = input("Meno: ")
rok = int(input("Rok narodenia: "))
print(f"{meno} bude mať na konci roka 2026 {2026 - rok} rokov.")

Výstup:

Meno: Sofia
Rok narodenia: 2009
Sofia bude mať na konci roka 2026 17 rokov.

5.5Tabuľka s cenami

Zadanie: Vypíš zarovnanú tabuľku troch položiek s cenami a celkovú sumu.

Python
p1, c1 = "Chlieb", 1.89
p2, c2 = "Mlieko", 0.99
p3, c3 = "Jablká (1 kg)", 2.4
print(f"{'Položka':<15}{'Cena':>8}")
print("-" * 23)
print(f"{p1:<15}{c1:>8.2f}")
print(f"{p2:<15}{c2:>8.2f}")
print(f"{p3:<15}{c3:>8.2f}")
print("-" * 23)
print(f"{'Spolu':<15}{c1 + c2 + c3:>8.2f}")

Výstup:

Položka            Cena
-----------------------
Chlieb             1.89
Mlieko             0.99
Jablká (1 kg)      2.40
-----------------------
Spolu              5.28

6Časté chyby

  • Zabudnutý prevod na číslo. a = input() a potom a + 1 skončí chybou TypeError – text a číslo sa nedajú sčítať. Pri dvoch textoch chyba nevznikne, ale "2" + "3" je "23", nie 5.
  • Prevod na zlý typ. Ak môže byť vstup desatinný, použi float, nie int.
  • Chýbajúce f pred f-reťazcom. Bez neho sa zátvorky vypíšu doslova:
Python
body = 10
print("Mám {body} bodov.")
print(f"Mám {body} bodov.")

Výstup:

Mám {body} bodov.
Mám 10 bodov.
  • Výstup sa nezhoduje so zadaním. Pri automatickom testovaní záleží na každom znaku – na medzerách, interpunkcii aj na počte desatinných miest.

Zhrnutie

  • input("výzva") vypíše výzvu, počká na riadok textu a vráti ho ako reťazec.
  • Čísla čítaj ako int(input()) alebo float(input()); nečíselný vstup spôsobí ValueError.
  • Viac hodnôt na riadku: input().split(); dve celé čísla: a, b = map(int, input().split()).
  • print(..., sep="…", end="…") mení oddeľovač a koniec riadku.
  • F-reťazec: f"text {výraz}"; formát za dvojbodkou: .2f (desatinné miesta), <, >, ^ (zarovnanie), číslo (šírka).
  • round a .0f zaokrúhľujú presnú polovicu k párnemu číslu.

Úlohy na precvičenie

  1. Načítaj tri celé čísla (každé na samostatnom riadku) a vypíš ich súčet a priemer na 2 desatinné miesta.
  2. Načítaj cenu výrobku a zľavu v percentách; vypíš cenu po zľave na centy.
  3. Načítaj dve čísla na jednom riadku a vypíš ich v opačnom poradí oddelené čiarkou.
  4. Načítaj počet minút a vypíš ho v tvare „X h Y min“ (pomôže // a % z témy Operátory).
  5. Vypíš zarovnanú tabuľku troch mien a výšok v metroch na dve desatinné miesta.

Done reading?

Check what you remember with a few short tasks on the topic.