V programování je proměnná úložiště, které udržuje hodnotu. Tato hodnota se může v průběhu výpočtu měnit, od toho se také proměnná jmenuje proměnná.

Typickým příkladem použití proměnné je výpočet celkové ceny nákupu. Program v pokladně na začátku uloží do proměnné sum hodnotu 0. Při načtení každé položky nákupu, přičte její cenu do této proměnné.

Jiný příklad: V programu pro hraní piškvorek potřebujeme zjistit, jestli již jeden z hráčů vyhrál. Procházíme tedy jednotlivé směry na hracím plánu a v každém z nich počítáme, kolik křížků (či koleček) se vyskytuje v řadě za sebou. Tento počet si ukládáme v proměnné. Krom toho si do nějaké proměnné potřebujeme uložit i celý herní plán. V základních cvičeních však zůstaneme pouze u číselných proměnných, které vesměs budou fungovat jako jednoduché čítače.

Užitečná příprava na práci s proměnnými jsou úlohy, ve kterých programy mění stav zobrazený na plánku – napíklad barvu skřítka nebo přítomnost kámenů. Měněné atributy (barva skřítka, přítomnost kamenů) lze vnímat jako proměnné.

Základní práce s proměnnými zahrnuje přiřazování hodnot do proměnných, změnu hodnoty (zvýšení, snížení), využití proměnné ve výrazech a porovnávání proměnných. Užitečnost proměnných se však naplno projeví až v kombinaci s cykly a podmíněnými příkazy.

Proměnné: základní princip

Přejít ke cvičením na toto téma »

Proměnná je pojmenované úložiště, které udržuje hodnotu. Proměnná má jméno, pomocí kterého se na ni v programu odkazujeme, a hodnotu, kterou můžeme měnit (proto název „proměnná“).

Nastavení hodnoty proměnné

Hodnotu proměnné nastavíme pomocí přiřazovacího příkazu, který se často zapisuje jméno ← hodnota. V proměnné je pak uložená pouze poslední přiřazená hodnota (důležité je proto pořadí příkazů).

Použití hodnoty proměnné

Pokud chceme použít hodnotu proměnné, stačí v programu uvést její jméno. Například příkaz vypiš x vypisuje hodnotu, nikoliv jméno proměnné. Proměnná se může vyskytovat i na pravé straně přiřazovacího příkazu: x ← y. Hodnotu proměnné na levé straně (x) tím nastavujeme na hodnotu proměnné na pravé straně (y):

Po provedení přiřazovacího příkazu x ← y mají obě proměnné stejnou hodnotu, pořád jde však o dvě různé proměnné:

Mýty o proměnných

Mýtus Skutečnost
Proměnná se vždy označuje jménem x. Proměnné můžou mít různá jména (např. barva, součet).
V programu může být jediná proměnná. Program může pracovat s libovolným počtem proměnných.
Proměnnou lze použít jen jednou. Proměnnou lze v programu použít opakovaně.
Hodnotu proměnné nelze měnit. (Tj. proměnná je jako neznámá v matematice.) Hodnotu proměnné lze měnit.
Hodnota proměnné musí být číslo. Existují různé typy hodnot proměnných, kromě čísel např. text.
Proměnná, do které nebylo nic přiřazeno, má hodnotu 0. Počáteční hodnota proměnné není určená, je potřeba do ní nějakou hodnotu přiřadit.
Proměnná si pamatuje všechny hodnoty, které do ní byly v minulosti přiřazeny. V proměnné je uložená pouze poslední přiřazená hodnota.
Proměnná automaticky sčítá všechny přiřazené hodnoty. V proměnné je uložená pouze poslední přiřazená hodnota.
Přiřazovací příkaz x ← y přesouvá hodnotu, tj. y pak nemá hodnotu. Přiřazovací příkaz x ← y nastaví x, proměnnou y nemění.
Přiřazovací příkaz x ← y přiřadí do proměnné x text “y”. Přiřazovací příkaz x ← y přiřadí do proměnné x hodnotu proměnné y.
Použití proměnné (např. výpis) smaže aktuální uloženou hodnotu. Použití proměnné (např. výpis) nemění hodnotu proměnné.
Výpis proměnné (vypiš x) vypisuje její jméno. Výpis proměnné (vypiš x) vypisuje její hodnotu.

Metafory pro proměnné

Proměnné lze přirovnat třeba ke krabičkám, šuplíkům či obálkám, které mají uvnitř nějaký předmět (nebo třeba číslo napsané na papíře). Trochu přesněji odpovídají proměnným štítky nalepené na předmětech, nebo popsané kolíky držící předměty na prádelní šňůře. Takové metafory můžou přispet k základní intuici za proměnnými, je však potřeba vědět, že každá metafora má svoje omezení a neplatí dokonale.

Proměnné jako krabičky

Proměnná se často přirovnává ke krabičce, která je popsaná (jméno proměnné) a uvnitř má nějaký objekt (hodnota proměnné), třeba jablko. Můžeme se podívat, jaký objekt je uvnitř krabičky (zjištění hodnoty) a můžeme objekt v krabičce nahradit jiným, třeba hruškou (změna hodnoty). Tato metafora má však má svoje limity:

  • Do skutečné krabičky bychom nejspíš mohli přidat hrušku, aniž bychom z ní odebrali jablko. Proměnná si však pamatuje pouze poslední přiřazenou hodnotu. To by odpovídalo pravidlu, že kdykoliv do krabičky něco dáváme, nejprve ji vyprázdníme.

  • Ze skutečné krabičky bychom mohli objekt vzít a dát ho do jiné krabičky. To však neodpovídá chování přiřazovacího příkazu x ← y, po kterém je původní hodnota proměnné y v obou proměnných x i y. To by odpovídalo krabičkám vybaveným magickou kopírkou pro vytváření kopií objektů před jejich přiřazením či jiným použitím.

Proměnné jako nálepky

Proměnné si můžeme představit jako samolepící štítky (jméno proměnné) nalepené na objektu (hodnota proměnné). Přiřazovací příkaz x ← y odpovídá přelepení nálepky x na objekt označený nálepkou y. Jeden objekt tak může mít více nálepek (jmen), zatímco jedna nálepka se vždy odkazuje na jediný objekt.

Přiřazovací příkaz umožňuje nastavit novou hodnotu proměnné, nebo upravit hodnotu stávající. Příkaz x ← 3 nastaví hodnotu proměnné x na 3, příkaz x ← x + 1 zvýší hodnotu proměnné x o 1.

Různé zápisy přiřazovacího příkazu

Různé programovací jazyky využívají odlišné zápisy přiřazovacího příkazu, například nastav x na 3, x ← 3, nebo x = 3. Zápis s rovnítkem (x = 3) využívá většina dnešních programovacích jazyků, protože je krátký a snadno zapsatelný na klávesnici. K vyjádření rovnosti v podmínkách se pak v těchto jazycích používá většinou dvojité rovnítko (x == 3).

Nastavení nové hodnoty

Na levé straně přiřazovacího příkazu je proměnná, kterou měníme. Na pravé straně může být konkrétní hodnota, proměnná, nebo libovolný výraz – ten se nejprve vyhodnotí a výsledek se nastaví jako nová hodnota proměnné. Příkaz x ← 1 + 1 nastaví hodnotu proměnné x na 2. Výraz na pravé straně může obsahovat proměnné. Příkaz x ← y + 1 nastaví hodnotu proměnné x na hodnotu o 1 vyšší než je aktuální hodnota y.

Přiřazovací příkaz x ← y nastaví hodnotu proměnné x na hodnotu proměnné y. Hodnota proměnné y se přitom nemění. Po provedení přiřazovacího příkazu x ← y mají obě proměnné stejnou hodnotu, to však může být jen dočasný stav, který se změní po dalším přiřazení:

Mýty o přiřazovacím příkazu

Mýtus Skutečnost
Proměnná si pamatuje všechny hodnoty, které do ní byly v minulosti přiřazeny. V proměnné je uložená pouze poslední přiřazená hodnota.
Proměnná automaticky sčítá všechny přiřazené hodnoty. V proměnné je uložená pouze poslední přiřazená hodnota.
Přiřazovací příkaz x ← y přesouvá hodnotu, tj. y pak nemá hodnotu. Přiřazovací příkaz x ← y nastaví x, proměnnou y nemění.
Přiřazovací příkaz x ← y prohazuje hodnoty proměnných. Přiřazovací příkaz x ← y nastaví x, proměnnou y nemění.
Přiřazovací příkaz x ← y přiřadí do proměnné x text “y”. Přiřazovací příkaz x ← y přiřadí do proměnné x hodnotu proměnné y.

Zvýšení a snížení hodnoty

Pomocí přiřazovacího příkazu můžeme upravit aktuální hodnotu proměnné. Například x ← x + 1 zvýší hodnotu proměnné x o 1:

Nejprve se vyhodnocuje výraz na pravé straně (x + 1 = 3 + 1 = 4), výsledek se pak přiřadí do proměnné x. Podobně lze hodnotu proměnné snížit (x ← x − 1), zdvojnásobit ( x ← 2 * x), atp.

Posloupnost přiřazovacích příkazů

Následující příklady ilustrují posloupnosti příkazů s proměnnými, zejména důležitost pořadí příkazů.

Prohození hodnot proměnných

Po provedení příkazu x ← y mají obě proměnné stejnou hodnotu. K prohození hodnot dvou proměnných je proto potřeba pomocné proměnné. Hodnoty prohodí následující trojice příkazů (pro konkrétnější představu předpokládejme x = 1, y = 2):

  1. p ← x (uložíme si 1 do pomocné proměnné)
  2. x ← y (x přenastavíme na 2)
  3. y ← p (y přenastavíme na 1)

Hodnoty a proměnné lze kombinovat do výrazů pomocí operátorů. Například podmínka x + 5 ≥ y obsahuje operátory + a . Většina programovacích jazyků výrazy rovnou vyhodnocuje. Po provedení příkazu x ← 1 + 1 bude v proměnné x číslo 2, nikoliv nevyhodnocený výraz nebo dokonce text 1 + 1.

Aritmetické výrazy

S číselnými hodnotami a proměnnými můžeme počítat pomocí aritmetických operátorů + (sčítání), (odčítání), * (násobení) a / (dělení). Priorita operací je stejná jako v matematice (tj. násobení a dělení má přednost před sčítáním a odčítáním) a stejně jako v matematice můžeme ovlivnit pořadí vyhodnocení pomocí závorek (např. 1 + 2 * 3 = 7, zatímco (1 + 2) * 3 = 9).

Porovnávání

Číselné hodnoty a proměnné můžeme porovnávat pomocí relačních operátorů < (menší než), (menší rovno), > (větší než), (větší rovno), = (rovno), (nerovno). Výsledkem porovnávání je logická hodnota (pravda/nepravda), kterou můžeme vypsat, ale většinou ji využíváme v rámci podmínek. Relační operátory mají typicky nižší prioritu než aritmetické, tj. napřed se vyhodnotí výrazy na levé a pravé straně relačního operátoru a teprve poté se provede porovnání (např. 1 + 3 < 2 + 4 se nejprve částečně vyhodnotí na 4 < 6, což je pravda).

Relační operátory v programovacích jazycích

Různé programovací jazyky využívají odlišné zápisy některých operátorů, často proto, aby se daly snadno napsat na klávesnici. Běžné je například x >= 3 místo x ≥ 3 a x != 3 místo x ≠ 3. Pro rovnost se typicky využívají dvě rovnítka (x == 3), protože jedním rovnítkem (x = 3) se často zapisuje přiřazovací příkaz.

Operace s textem a logickými hodnotami

Programovací jazyky nabízí i operátory pro práci s dalšími datovými typy než jen s čísly. Například textové řetězce lze lexikograficky porovnávat (tj. znak po znaku abecedně, např. "ab" < "ac") a spojovat ("ab" + "ac" = "abac"). Logické hodnoty (zejména tedy výsledky porovnávání) lze kombinovat pomocí logických operátorů (spojek) a, nebo a neplatí, což se hodí pro vytváření složitějších podmínek. Logické operátory si můžete procvičit jako samostatné téma.

Použití výrazů s proměnnými

Výrazy s proměnnými se můžou vyskytovat např. na pravé straně přiřazovacího příkazu, v podmínkách a výpisech:

Během opakování příkazů se nám někdy hodí vědět, v kolikátém opakování (iteraci) právě jsme. K tomu lze využít následující konstrukci, v programovacích jazycích označovanou jako for cyklus:

Proměnnou, která se během cyklu automaticky mění (v tomto případě označenou k) nazýváme řídící proměnná cyklu. Řídící proměnné lze využít v libovolných výrazech uvnitř cyklu. For cykly lze do sebe vnořovat. Všimněte si pořadí, ve kterém se řídící proměnné mění:

Proměnné lze využít také v rámci podmínek cyklu opakuj dokud:

V tomto případě si musíme dávat obzvlášť pozor na zacyklení – situaci, kdy podmínka cyklu nikdy nepřestane platit a cyklus se tedy bude opakovat donekonečna. To se může stát například tehdy, když zapomeneme v těle cyklu měnit hodnotu proměnné, která figuruje v podmínce, když příkaz měnící proměnnou chybně odsadíme (takže nebude součástí cyklu), nebo když nevhodně formulujeme podmínku tak, že nepřestane platit navzdory změně proměnné:

Podmínky často obsahují proměnné:

To je užitečné například uvnitř cyklů nebo funkcí:

Při vyjadřování podmínek často využíváme logické spojky (a zároveň, nebo, negace):

Složitější podmínky, které využíváme opakovaně, je vhodné pojmenovat. K tomu lze využít logické proměnné, které mají hodnotu pravda nebo nepravda. V následujícím kódu zavádíme logickou proměnnou shoda, která má hodnotu pravda, pokud je x rovno některé z hodnot p nebo q:

Každá proměnná má svůj datový typ. Datový typ určuje, jaké hodnoty může proměnná obsahovat a které operace s ní lze provádět. Některé programovací jazyky požadují, aby byl typ proměnné uveden v programu, jiné odvozují typ automaticky podle přiřazené hodnoty. Programovací jazyky se liší také v tom, které datové typy nabízejí. Mezi nejběžnější datové typy patří:

  • celé číslo (123, −7) – s čísly lze provádět aritmetické operace (1 + 2) a porovnávat je (1 < 2)
  • desetinné číslo (1,23, –0,05) – typicky se používá tzv. „pohyblivá řádová čárka“, což umožňuje ukládat i velmi velká nebo malá čísla, ale s omezenou přesností (např. s 5 platnými číslicemi lze uložit 123 450 000 i 0,000 012 345, nikoliv však 123,456)
  • logická (pravdivostní) hodnota (pravda, nepravda) – reprezentuje informaci o pravdivosti, lze s nimi provádět logické operace (neplatí x, x nebo y, x a y). (Tento typ se často označuje jako „bool“ nebo „boolean“ podle George Boola, který popsal pravidla pro výpočty s logickými hodnotami.)
  • textový řetězec (“slovo”, “více slov”) – reprezentuje text libovolné délky. Pro odlišení od názvů proměnných se typicky vymezují pomocí “uvozovek” či ‘apostrofů’. Je potřeba rozlišovat mezi řetězcem obsahujícím číslo a číslem – “123” není 123. (Tento typ se často označuje jako „string“, z anglického slova pro řetězec.)
  • seznam (pole) ([1, 2, 3], [‘x’, ‘y’, ‘z’]) – umožňuje uložit více souvisejících hodnot do jedné proměnné. (Často jsou k dispozici i další typy pro ukládání různých kolekcí dat.)

Existují další typy pro specifické účely (např. čas, datum, soubor). Většinou je také možné definovat si vlastní typy. Výčtový typ umožňuje definovat proměnné, které můžou nabývat pouze několika předem určených hodnot (např. světový směr, den v týdnu). Záznamy umožňují definovat složené proměnné, které se skládají z několika pojmenovaných položek (např. záznam o zákazníkovi by mohl obsahovat jeho jméno, věk a datum posledního nákupu).

Pojmenování proměnných

Přejít ke cvičením na toto téma »

Jména proměnných neovlivňují chování počítače při vykonávání programu, jsou však důležitá pro čitelnost kódu. Pokud pojmenujeme proměnnou celková_cena, neznamená to, že v ní bude automaticky uložený součet cen položek (to musíme zajistit vhodnými příkazy), je ale jasnější, co má proměnná reprezentovat, než když ji pojmenujeme c.

Velikost písmen hraje roli

Většina programovacích jazyků rozlišuje velká a malá písmena ve jménech, např. Cena a cena jsou dvě různé proměnné.

Povolená jména

Proměnné nelze pojmenovat libovolně. Konkrétní omezení se mezi programovacími jazyky mírně liší. Typická omezení jsou následující:

  • Jména můžou obsahovat pouze písmena, číslice a podtržítka. Kdyby se proměnná jmenovala a+b, nešlo by ji odlišit od operace sčítání. Číslicí ale nesmí jméno začínat. Kdyby se proměnná jmenovala 12, nešlo by ji odlišit od hodnoty 12.
  • Jména nemůžou obsahovat mezery. Kdyby se proměnná jmenovala cena mrkve, nešlo by snadno poznat, zda nejde o dvě proměnné (cena a mrkve). Pokud chceme více slov, můžeme použít například podtržítko (cena_mrkve).
  • Jako jméno nelze použít tzv. „rezervovaná slova“, které už mají v programovacím jazyce určený význam (např. opakuj, nebo, pravda).

Povolená jména v blokových jazycích

V blokových programovacích jazycích, které mají samostatný blok pro proměnnou, tato omezení být nemusí (protože je jasné, že jde o jméno proměnné a kde toto jméno začíná a končí).

Konvence

Různé programovací jazyky mají navíc různé konvence, které podporují jednotnost kódu. Například v jazyce Python se jména proměnných píší malými písmeny, anglicky a více slov se odděluje podtržítkem (např. car_speed). Jde však pouze o doporučení – program se spustí, ať konvence dodržujeme, nebo nikoliv.

Konvence pro víceslovné proměnné

Různé programovací jazyky mají například různé konvence, jak psát jména proměnných obsahující více slov. Používané možnosti jsou následující:

  • vynechání mezer (cenamrkve)
  • nahrazení mezer podtržítky (cena_mrkve) – tzv. „hadí_notace“
  • nahrazení mezer spojovníky (cena-mrkve) – tzv. „špízová-notace“ (méně časté, protože spojovník se používá pro odčítání)
  • vynechání mezer a označení začátků slov velkým písmenem (cenaMrkve, příp. CenaMrkve) – tzv. „velbloudíNotace“ (velká písmena ve jméně připomínají hrby velblouda)

Popisnost

Popisná jména výrazně usnadňují čitelnost programu a snižují riziko chyb. Příkaz celková_cena ← cena_mrkev_1kg * kg_mrkve je jasnější než cena ← c * m a je také jasnější, že jsou správně jednotky. Volíme taková jména, která jednoznačně vyjadřují účel proměnné, i za cenu delšího názvu. Jednopísmenné názvy (např. x) jsou vhodné jen v omezených případech (řídící proměnná cyklu, souřadnice bodu, krátké ukázky kódu).

Další doporučení

  • Používat jména, která lze dobře vyslovit.
  • Nepoužívat zkratky (s výjimkou všeobecně známých).
  • Nemít v programu dvě jména, která se liší jen jedním znakem.
  • Nemít v programu dvě jména, která se podobně vyslovují.
  • V rámci jednoho kontextu nepoužívat jedno jméno pro více různých věcí (ani v případě, že se už na původní proměnnou odkazovat nepotřebujeme).

Proměnné se hodí k různým účelům. Většina proměnných má jednu z následujících rolí:

Fixní hodnota (pojmenovaná konstanta)

Proměnná, jejíž hodnota se po inicializaci (prvním přiřazení) už nemění.

Procházení hodnot (aktuální hodnota, počítadlo)

Proměnná drží poslední hodnotu během procházení nějaké předem dané posloupnosti hodnot (např. všech čísel od 1 do 10).

Poslední hodnota (načítání vstupu, generování čísel)

Proměnná drží poslední získanou hodnotu. Např. načítáme vstup od uživatele, dokud nezadá kladné číslo, nebo hážeme kostkou, dokud nepadne sudé číslo. Narozdíl od „procházení hodnot“ zde neznáme hodnoty dopředu.

Předchozí hodnota

Proměnná, která následuje hodnoty jiné proměnné – pamatuje si její předchozí hodnotu. V následujícím programu si proměnná p pamatuje předchozí hodnotu proměnné x, abychom mohli vypisovat rozdíly mezi načítanými čísly.

Nejlepší hodnota

Proměnná drží nejlepší hodnotu při procházení posloupnosti hodnot („nejlepší“ podle nějakého kritéria, např. nejmenší, největší). V následujícím programu si proměnná m pamatuje nejvyšší načtené číslo.

Příznak (jednocestný spínač)

Pojem „příznak“ se používá obecně pro proměnnou, která může nabývat jen dvou hodnot (typicky pravda / nepravda). O „jednocestný spínač“ jde v případě, kdy se proměnná už nikdy nevrátí do původního stavu, jakmile je jednou změněná. V následujícím programu si proměnná p pamatuje, zda některé načtené číslo přesáhlo 100. Jakmile se jednou p nastaví na pravda, už se nikdy nezmění.

Akumulátor (souhrn hodnot)

Proměnná akumuluje (shrnuje) procházené hodnoty do jedné (např. součet). V následujícím programu proměnná s akumuluje součet zadaných hodnot. („Nejlepší hodnotu“ i „jednocestný spínač“ lze vnímat jako speciální případy akumulátoru, kdy shrnutím posloupnosti hodnot je nejlepší hodnota, resp. příznak.)

Transformace (přímý výpočet)

Proměnná je přímou transformací jiné proměnné. V následujícím programu je proměnná m druhou mocninou proměnné x.

Pomocná proměnná (dočasná proměnná)

Jako „pomocné“ označujeme takové proměnné, které drží hodnotu jen na velmi krátký čas (a nemají žádnou z jiných konkrétnějších rolí popsaných výše). V následujícím programu si do pomocné proměnné p dočasně ukládáme původní hodnotu x, abychom mohli prohodit hodnoty proměnných x a y.

Jedna proměnná může svoji roli v průběhu programu změnit, většinou je však vhodnější pro nový účel použít novou proměnnou.

NAPIŠTE NÁM

Děkujeme za vaši zprávu, byla úspěšně odeslána.

Napište nám

Nevíte si rady?

Nejprve se prosím podívejte na časté dotazy:

Čeho se zpráva týká?

Vzkaz Obsah Ovládání Přihlášení Licence