﻿<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/examples.screen.xsl" media="screen"?>
<examples chapter="Procvičování – hustota obyvatelstva" directory="procvicovani">

    <theory>
        <p>
            Úkolem tohoto cvičení je naučit se zpracovat související data, která jsou ale roztroušena po vícero souborech. Konkrétně bude naším úkolem spočítat hustotu obyvatel států světa, přičemž na vstupu budeme mít soubor s počty obyvatel u konkrétních zemí a soubor s rozlohou zemí. Aby to nebylo tak jednoduché, oba soubory nebudou obsahovat stejné země.
        </p>
        <p>
            Navíc se naučíme spočítané výsledky uložit pro pozdější použití pomocí modulu <em>pickle</em>. To je poměrně typický scénář – nějaká data budeme používat pro více pozdějších výpočtů, ale přitom je nejdříve musíme také nějakým (a „nejlépe“ časově náročným) způsobem získat. V tomto případě to sice není pravda, složení dat z obou souborů do výsledného slovníku je záležitost okamžiku, ale i tak není důvod uvedený výpočet provádět pořád znovu.
        </p>
        <p>
            Když už budeme mít připravenou „tabulku“ údajů o zemích světa, procvičíme si na ní ještě řazení podle různých způsobů, tedy použití parametru <em>key</em>.
        </p>
    </theory>

<!--
    <example>
        <text>
        </text>
        <hint>
        </hint>
        <solution src="procvicovani/staty/.py" lang="python" />
    </example>
-->


    <example>
        <text>
            Mějme k dispozici data o <a href="_txt/staty/staty_lidi.log">počtu obyvatel</a> a <a href="_txt/staty/staty_plochy.log">rozloze</a> několika světových států. Víme, že pokud se nějaký stát vyskytuje v obou souborech, má stejné jméno, ale jelikož jsou oba soubory seřazeny podle velikosti (od největšího čísla k nejmenšímu) podle svého zaměření, je pořadí států nepřekvapivě zcela rozdílné, takže bez bližšího prozkoumání toho moc dalšího nevíme.
            <br/>
            Naším úkolem je oba uvedené soubory prozkoumat a získat o nich co nejvíce informací užitečných pro další zpracování. Především se pokusíme zjistit, kolik států je ve kterém souboru a kde který stát případně chybí (či naopak přebývá).
        </text>
        <hint>
            S výhodou můžete při řešení použít pythoního typu <em>množina</em>.
        </hint>
    </example>

    <example>
        <text>
            Díky analýze z předchozího cvičení již nyní víme, že soubor počtu obyvatel neobsahuje žádný stát navíc oproti souboru s rozlohami. Naopak u rozloh je 24 států, ke kterým nemáme žádnou informaci o počtu obyvatel. To představuje drobný problém, jak uvedenou skutečnost zaznamenat do požadovaného výstupu o hustotách. Udání nuly totiž nemusí býti pravdivé – uvedená informace nám chybí, ale to neznamená, že na daných územích nikdo nežije.
            <br/>
            Zaznamenejte proto na výstup všech 261 států, přičemž pro státy s chybějícím údajem o počtu obyvatel (těch je 24) zaznamenejte pro něj i hustotu otazníček. Výsledek zapište do CSV-souboru <em>data.csv</em> (jako oddělovač použijte středník) a také – pro snadné pozdější zpracování – zapiklete do souboru <em>data.pickle</em>.
        </text>
        <hint>
            Vzhledem ke struktuře údajů se celkem logicky logicky nabízí uchovávat data ve slovníku (což ostatně děláme s plochami a lidmi už od prvního cvičení). Uvedený slovník pak také zapiklete na disk.
        </hint>
    </example>

    <example>
        <text>
            Data o státech již máme zpracovaná. Načtěte je nyní ze zapikleného souboru a nechte je vypisovat seřazené podle různých kritérií:
            <ul>
                <li>podle názvu státu;</li>
                <li>podle rozlohy;</li>
                <li>podle počtu obyvatel;</li>
                <li>podle hustoty.</li>
            </ul>
        </text>
        <hint>
            Kromě pochopení práce s piklením je toto cvičení především o řazení složitějších datových struktur v Python'u pomocí vhodně zvoleného parametru <em>key</em>. Jelikož některé případy jsou již slušně zamotané, obsahuje řešení i explicitní rozepsání lambda-funkce do externí pomocné funkce s (snad) názorným rozborem.
        </hint>
    </example>


</examples>
