Počítač si za mě pamatuje

Z Základy informatiky pro střední školy
Přejít na: navigace, hledání

sbalit
ikona boxu
Co se naučíš:

Používat proměnné k ukládání informací během práce programu.

sbalit
ikona boxu
Úloha: Obsah trojúhelníku

Trojuhelnikove pole osivo.svg

Farmář by rád poprvé osel své malé pole. Potřebné množství osiva záleží na ploše. Pole má tvar trojúhelníku. Farmář už pole oplotil, takže zná délky stran: 46, 78 a 86 metrů. Najdeš vhodný způsob, jak zjistit plochu k osetí?

Ukázat nápovědu
ikona boxu
Nápověda
Sbalit
ikona boxu
Výpočet na dva kroky s mezivýsledkem

Přehlednější je nejdřív spočítat polovinu obvodu ((46+78+86)/2), a tento mezivýsledek (103) pak dosadit do vzorce a do vzorce pak dosadit tu (math.sqrt( 105*(105-46)*(105-78)*(105-86) )). Je to celkově kratší, ale vyžaduje to dva kroky pokaždé, když budeme chtít takový výpočet provést.

Do interaktivní konzole tedy budeme chtít zadat dost ošklivý řetězec:

math.sqrt( ((46+78+86)/2)*((46+78+86)/2-46)*((46+78+86)/2-78)*((46+78+86)/2-86) )

To je sice pořád lepší, než výpočet s kapesní kalkulačkou či mobilem, ale v našem století bychom mohli očekávat něco víc. Jak vidno, při složitějších výpočtech nám dosavadní znalosti přestávají stačit. K výsledku dojdeme, ale velmi pracně. Přitom výpočet obsahu trojúhelníku ani není nějak zvlášť náročný úkol.

Možná tě napadlo, že při ručním počítání lze opakovaně využít hodnotu s (polovinu obvodu), a tím si trochu práce ušetřit. Umět si uložit nějaké mezivýsledky by se jistě hodilo i na počítači.

sbalit
Otazník
Zamysli se a odpověz:

Někteří z vás možná ještě používají kapesní kalkulačku. Nejspíš na ní mají tlačítka jako M+, M-, MR, MC (a leckterá kalkulačka na telefonu je má taky). K čemu jsou?

Proměnná

K dočasnému uchování informací v programování slouží proměnné. Jejich výhodou oproti M-tlačítkům na kalkulačce je, že jich můžeme používat víc zároveň, můžeme je smysluplně pojmenovat, a hodnoty nemusí být vždy jen číselné. Proměnnou v Pythonu „vyrobíme“ tak, že k nějakému jménu přiřadíme hodnotu operátorem = (znak „rovná se“).

sbalit

Příklad:

Replit promenna.png

Do proměnné a je uloženo celé číslo 46. Po zadání samotného názvu proměnné do konzole Python vytiskne její hodnotu. Proměnnou můžeme použít také přímo v nějakém výpočtu.

Nech konzoli provést příkaz a = 46. Stalo se něco? Nevypadá to tak (konzole nic nevypsala), ale stalo. Konzole si teď pod názvem a pamatuje délku strany a, tedy 46. Snadno se o tom přesvědčíš prostým zadáním a. Odteď kdykoliv, když použiješ a tam, kde by jinak byla hodnota, použije se hodnota proměnné.

Můžeš tedy pokračovat. Zadej délky zbylých stran do proměnných b a c. Díky tomu budeš moci dále postupovat stručněji. Také se už nebudeš muset soustředit na konkrétní hodnoty. Polovinu obvodu i obsah už můžeš počítat nezávisle na konkrétních hodnotách, pouze pomocí proměnných. Zkus to!

import math
a = 46
b = 78
c = 86
PulObvodu = (a+b+c)/2
Obsah = math.sqrt(PulObvodu * (PulObvodu - a) * (PulObvodu - b) * (PulObvodu - c))

Po provedení uvedeného kódu je v proměnné Obsah uložen vypočtený obsah trojúhelníkového pole. Hledaný obsah trojúhelníka, tedy plocha pole k osetí je přibližně 1783 m2. Výpočet pomocí proměnných je zjevně úspornější, přehlednější a srozumitelnější.

Sbalit
ikona boxu
Představa paměti počítače

Jestli si představujete paměť počítače jako obrovské množství zásuvek, v nichž jsou uložena data, proměnnou si můžete představit jako nálepku označující zásuvku jménem. Když si chci něco uložit, dám to do zásuvky. Abych se k datům mohl vrátit, musím vědět, ve které zásuvce jsou. Proto zásuvku označím jménem a místo dat si pamatuju to jméno, což bývá mnohem jednodušší. Navíc pak můžu pracovat způsobem „sečti hodnoty v těchto dvou zásuvkách a výsledek ulož do zásuvky označené tímto jménem“ a vytvářet tak obecnější postupy.

Pozor na omezení této představy. V zásuvkách jsou data, nikoliv nějaký materiál. Přečtením obsahu zásuvky a uložením téhož (zkopírovaného) obsahu do zásuvky s jiným jménem se původní zásuvka nevyprázdní. Ze stejného důvodu nelze srovnávat „krádež filmu“ (nebo jiných dat) s krádeží třeba automobilu. Ukradená data „původnímu majiteli“ nechybí.

Definice proměnné se v různých jazycích mírně liší, ale obecně jde o symbolické pojmenování hodnoty, abychom s tou hodnotou mohli dále nakládat. Podobně pracujete s adresami buněk v tabulkovém procesoru: do vzorce píšete adresu buňky, pro výpočet se pak použije hodnota v buňce. Víš, že buňky jdou i pojmenovávat, a jméno pak lze použít místo adresy?

S principem proměnné se pracuje např. i ve smlouvách. Na začátku jsou určeny a pojmenovány smluvní strany, předmět smlouvy apod. Dále už se pracuje pouze s těmi jmény: kupující, prodávající, objednatel, dodavatel, zboží, zaměstnavatel, zaměstnanec, atd. Výhoda je zřejmá: smlouvy jsou stručnější, srozumitelnější a znovu použitelné prostou výměnou údajů na začátku.

Sbalit
ikona boxu
Proměnné v informatice vs. v matematice

Proměnná v našem programování je něco jiného, než neznámá v matematice. Proměnná může v průběhu výpočtu měnit svou hodnotu. V matematice by nám takové chování nadělalo nepořádek. Navíc v matematice jsme zvyklí na jednopísmenná označení. Programátoři mají ovšem raději, když název proměnné jasně vyjadřuje její význam. Programům lze potom mnohem snáze rozumět, což za tu trochu psaní navíc rozhodně stojí. Srovnej třeba zápisy vs. Obsah = (Zakladna*Vyska) / 2. Na druhé straně se při pojmenování proměnných omezujeme na latinku, případná řecká či jiná písmena vypisujeme, např. Alfa = 180 - Beta - Gama.

sbalit
ikona boxu
Úloha: Hodinky nejsou holinky

Odhadni, co se vytiskne po spuštění tohoto kódu, a svůj odhad ověř:

DelkaHranyKrychle = 4
ObsahStenyKrychle = DelkaHranyKrychle * DelkaHranyKrychle
ObjemKrychle = ObsahStenyKrychle * DelkaHranyKrychle
print(ObjemKryhle)

Shoduje se tvůj odhad s výsledkem? Vysvětli, co se stalo.

Ukázat nápovědu
ikona boxu
Nápověda

Datový typ proměnné

Viděli jsme, že proměnná má název a hodnotu. Pro úplnost dodejme, že má také datový typ. O tom už jsme se zmínili v kapitole o informaci. Všechna data v počítači jsou sice nuly a jedničky, ale interpretovat je můžeme různým způsobem. Stejný princip je za „typy souborů“ (texty, obrázky, programy…) a za typem buňky v tabulkovém procesoru.

sbalit
ikona boxu
Úloha: Typ čísla v tabulkovém procesoru
  1. Zadej v tabulkovém procesoru datum 29. října 1969.
  2. Změň typ čísla v buňce na běžné číslo.
  3. Prozkoumej a vysvětli, co se stalo, a co znamená zobrazená hodnota.
  4. Odkdy tvůj tabulkový procesor počítá čas? Jak to nejrychleji zjistit?
  5. Jak tvůj tabulkový procesor počítá s hodinami, minutami a sekundami?
Ukázat nápovědu
ikona boxu
Nápověda

Scratch datove typy jsou tvary.png

Zkušení programátoři ve Scratchi vědí, že s hodnotami v odlišných tvarech lze provádět odlišné operace a nelze je míchat mezi sebou.

V Pythonu jsme se zatím setkali s celými a s desetinnými čísly. Ta jsou vnitřně reprezentována různým způsobem, takže jde o různé datové typy. Zjednodušeně lze říct, že kladná celá čísla jsou uložena přímočaře ve dvojkové soustavě, jak ji znáš. Drobná komplikace je se zápornými čísly — potřebujeme vyjádřit to „mínus“, jenže pomocí nul a jedniček a tak, aby zápis nebylo možné přečíst prostě jako kladné celé číslo ve dvojkové soustavě. Ještě víc přemýšlení vyžadují čísla desetinná. Je totiž potřeba nějak zaznamenat pozici té desetinné čárky. Protože to vyžaduje odlišnou reprezentace hodnot, jsou celá čísla a tzv. čísla s plovoucí řádovou čárkou odlišným datovým typem.

Další důležité datové typy jsou logické hodnoty (True a False) a textové řetězce (posloupnosti znaků). S odlišnými datovými typy lze provádět odlišné operace (to je další důvod, proč typy rozlišovat). Čísla chceme umět např. sčítat či porovnávat, v textech chceme častěji třeba hledat a nahrazovat slova.

sbalit

Příklad: Hwair

Podívejme se na následující čtyři bajty a různé způsoby, jak je číst:

data datový typ interpretovaná hodnota
11110000 10010000 10001101 10001000
(hexadecimálně: F0 90 8D 88)
Celé číslo bez znaménka (nezáporné) 4 036 005 256
Celé číslo se znaménkem -258 962 040
Číslo s plovoucí řádovou čárkou -3.57895537573448183054008844288E29,
tedy přibližně -3,58⋅1029 (mínus 358 kvadriliard)
znaky kódované jako ASCII - Latin 2 ­ÉŹł
(První ze čtyř znaků je tzv. rozdělovník, použil by se
při dělení slova na konci řádku. Tady se proto vůbec vůbec nezobrazí.)
znak kódovaný jako UTF-8 Gothic letter hwair.svg (U+10348)
barva kódovaná jako RGBA  

Tady vidíš, jak mohou stejná data vést ke zcela různým hodnotám.

Postupně se dostaneme i k mnohem složitějším datovým typům a možná si nějaké vlastní taky vytvoříme.

Příklad na závěr

sbalit

Příklad: Opakovaný výpočet

Náš farmář je trochu popleta. V rozměrech pole zaměnil desítky a jednotky. Správně je to tedy 64, 87 a 68 metrů. Jak teď co nejsnáze zjistit správný obsah pole k osetí? Většinu práce jsme už přece udělali, nechce se nám ji tedy opakovat. Teď se opět projeví výhoda použití proměnných. Náš zápis lze totiž využít znovu a nepotřebuje ani upravovat. Stačí za proměnné a, b a c dosadit opravené hodnoty, a potom už jen z historie vyvolat příkaz na výpočet poloviny obvodu (aby se nepoužila stará hodnota) a následně příkaz na výpočet obsahu. K výpočtu se použijí naposled zadané, tedy změněné hodnoty proměnných, a dostaneme tak odpovídající nový výsledek. Zkus to!

Můžeš také zkusit nějaké známé trojúhelníky, třeba se stranami 3, 4 a 5, nebo 1, 1 a math.sqrt(2), aby bylo možno výsledek snadno ověřit.

Jak opakované rutinní výpočty provádět ještě efektivněji zjistíš v následující kapitole.

Shrnutí

ikona boxu
  • Proměnné nám umožňují pracovat s hodnotami prostřednictvím jejich pojmenování. Díky tomu si konkrétní hodnoty netřeba pamatovat a stejné postupy lze opakovat pro různé hodnoty.
  • Proměnnou vytvoříme (nebo změníme její hodnotu) přiřazením hodnoty výstižnému jménu, např.: DenVMesici = 26.
  • Proměnnou použijeme kdekoliv, kde bychom jinak museli vypisovat její hodnotu, např.: ZbytekDnuVMesici = PocetDnuVMesici - DenVMesici .
  • Datový typ proměnné určuje, co lze s proměnnou provádět (počítat, logicky odvozovat, spojovat...).

Úlohy k procvičení

Cvičit můžeš s jakýmikoliv výpočty, dost složitými, aby se vyplatilo uložit mezivýsledky a další hodnoty do proměnných. Až budeš příště něco počítat, vzpomeň si na Python.

Sbalit
ikona boxu
Trable s desetinnými čísly

Jeden z důvodů, proč musí programátoři sledovat, jestli pracují s celými nebo necelými čísly, je přesnost. U celých čísel není problém. U ostatních je ovšem třeba počítat se zaokrouhlováním. Podívej se na následující výpočet a tipni si, jaký by měl být výsledek:

10*0.1 - (0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)

Připadne ti, že mezi desetinásobkem jedné desetiny a součtem deseti desetin není rozdíl, takže by měla vyjít nula? Vlož kód do konzole, uvidíš, co řekne... Cože?!

Zjisti a vysvětli, v čem je potíž. Nápověda: má to co dělat s tím, jak jsou čísla uložena v počítači (takže se asi vyplatí podívat na výpočet jeho očima).