Pozn. ke kódu: formulářové (GUI) aplikace se ve výuce typicky dělají v C# přes Windows Forms, proto jsou ukázky v C#/WinForms; u práce se soubory je pro srovnání i Python.
Grafické uživatelské rozhraní
- GUI (graphical user interface) = grafické uživatelské rozhraní, ovládané myší/dotykem a klávesnicí, na rozdíl od textového (konzolového) rozhraní
- intuitivní ovládání = uživatel má bez nutnosti návodu pochopit, jak prvek použít; zásady: přehledné rozmístění prvků, konzistence (podobné akce vypadají a chovají se podobně), okamžitá zpětná vazba na akci uživatele (např. změna vzhledu tlačítka po kliknutí, hlášení o úspěchu/chybě)
- základní prvky GUI:
- okno (window/form) = základní kontejner rozhraní
- tlačítko (button) = spouští akci po kliknutí
- popisek (label) = zobrazuje text, sám o sobě není interaktivní
- textové pole (textbox) = pro zadání/zobrazení textu
- zaškrtávací pole (checkbox) = pro volbu ano/ne, lze zaškrtnout víc najednou
- přepínač (radio button) = pro výběr právě jedné možnosti ze skupiny
- rozbalovací seznam (combo box / select) = výběr jedné hodnoty z předdefinovaného seznamu
- výstup lze kromě obrazovky směrovat i na tiskárnu (tisk formuláře, reportu, dokladu)
Komponenty pro práci s textem, časem a dalšími daty
- textové pole může být jednořádkové nebo víceřádkové (text area); u vstupu se často provádí validace (kontrola, že zadaná hodnota má očekávaný formát, např. jen číslice, e-mail, nesmí být prázdné)
- specializované komponenty pro konkrétní typ dat usnadňují zadávání a snižují chybovost:
- výběr data/času (date picker, time picker) místo ručního psaní data do textového pole
- číselník (numeric up/down) pro zadávání čísla v daném rozsahu
- posuvník (slider) pro výběr hodnoty z rozsahu tažením
- pro výstup dat se používá popisek, tabulka (grid), textové pole jen pro čtení, případně export/tisk
Formuláře a jejich prvky
- formulář = okno nebo jeho část, která seskupuje ovládací prvky pro zadání a odeslání/zpracování dat od uživatele
- typický formulář kombinuje textová pole, popisky, zaškrtávací pole, přepínače, rozbalovací seznamy a tlačítko pro odeslání
- před zpracováním zadaných dat se provádí validace formuláře – kontrola, že jsou vyplněná povinná pole a že mají platný formát; při chybě se uživateli zobrazí srozumitelná hláška u konkrétního pole
C# Windows Forms – jednoduchý formulář s textovým polem, tlačítkem a popiskem pro výsledek (prvky se běžně přidávají přetažením v grafickém Designeru, tady je stejný výsledek zapsaný jako kód):
public class HlavniFormular : Form
{
private TextBox textBoxJmeno = new TextBox();
private Button tlacitkoOdeslat = new Button();
private Label popisekVysledek = new Label();
public HlavniFormular()
{
textBoxJmeno.Location = new Point(10, 10);
tlacitkoOdeslat.Text = "Odeslat";
tlacitkoOdeslat.Location = new Point(10, 40);
popisekVysledek.Location = new Point(10, 70);
tlacitkoOdeslat.Click += TlacitkoOdeslat_Click; // přiřazení obslužné metody
Controls.Add(textBoxJmeno);
Controls.Add(tlacitkoOdeslat);
Controls.Add(popisekVysledek);
}
private void TlacitkoOdeslat_Click(object sender, EventArgs e)
{
if (textBoxJmeno.Text == "")
popisekVysledek.Text = "Vyplňte jméno";
else
popisekVysledek.Text = "Ahoj, " + textBoxJmeno.Text + "!";
}
}
Obslužné metody a události
- událost (event) = akce, která nastane během běhu programu – klik na tlačítko, změna hodnoty v poli, zavření okna, načtení formuláře
- obslužná metoda (event handler) = kus kódu, který se spustí, když daná událost nastane; k prvku formuláře se „přiřadí“ metoda, která se má při dané události zavolat
- typické události ve Windows Forms:
Click(kliknutí),TextChanged(změna textu),Load(načtení formuláře),FormClosing(zavírání okna) – v C# se k události připojí obslužná metoda operátorem+=, jak je vidět v příkladu formuláře výše (tlacitkoOdeslat.Click += TlacitkoOdeslat_Click;)
Aplikace s více formuláři
- složitější aplikace bývá tvořená víc okny/formuláři – hlavní okno a doplňkové formuláře/dialogy (např. okno pro editaci záznamu, okno „O aplikaci“)
- modální okno = blokuje práci s ostatními okny aplikace, dokud ho uživatel nezavře (typicky pro potvrzení, chybové hlášky) x nemodální okno = lze s ním pracovat souběžně s ostatními okny
- mezi formuláři je potřeba předávat data – parametrem při otevření okna, návratovou hodnotou po jeho zavření, nebo přes sdílený objekt/model, který obě okna vidí
Ověřování návrhu a testování
- návrh algoritmu i uživatelského rozhraní je vhodné ověřit ještě před (nebo souběžně s) plným naprogramováním – např. na jednoduchém prototypu, nebo tak, že si postup vyzkouší někdo jiný než autor
- testování integrity softwaru = ověření, že program se chová správně i pro různé druhy vstupu:
- platné (běžné, očekávané) hodnoty
- neplatné hodnoty (špatný formát, text místo čísla)
- hraniční hodnoty (prázdný vstup, nulová hodnota, maximální/minimální možná hodnota)
- záznam chyby (bug report) by měl obsahovat: kroky k zopakování chyby, očekávané chování, skutečné (chybné) chování a závažnost problému – usnadňuje to opravu i zpětnou kontrolu, že byla chyba skutečně odstraněna
Práce se soubory
- ukládání dat mimo operační paměť = data uložená jen v proměnných v paměti zmizí po ukončení programu; pro trvalé uchování (perzistenci) a přenositelnost mezi programy/počítači se ukládají do souborů
- základní typy souborů pro data: textový soubor (řádky textu), CSV (tabulková data oddělená čárkou/středníkem), binární soubor (data v „surové“ nečitelné podobě), strukturovaný formát jako JSON nebo XML
- základní operace nad souborem: otevřít, číst (načíst obsah do proměnných), zapsat (uložit data z proměnných do souboru), zavřít
Python:
# čtení souboru řádek po řádku
with open("data.csv", "r", encoding="utf-8") as soubor:
for radek in soubor:
print(radek.strip())
# zápis do souboru (přepíše obsah)
with open("vysledek.txt", "w", encoding="utf-8") as soubor:
soubor.write("Ahoj, soubore!\n")
with zajistí, že se soubor automaticky zavře i v případě chyby (není nutné volat close() ručně).
C#:
// čtení souboru řádek po řádku
foreach (string radek in File.ReadLines("data.csv"))
{
Console.WriteLine(radek);
}
// zápis do souboru (přepíše obsah)
File.WriteAllText("vysledek.txt", "Ahoj, soubore!\n");
Kolekce dat, řazení a vyhledávání
- kolekce dat = víc záznamů se stejnou strukturou uložených pohromadě (pole záznamů, seznam, tabulka) – např. seznam žáků, seznam objednávek
- řazení pole (sorting) = uspořádání záznamů vzestupně nebo sestupně podle zvoleného klíče (např. podle příjmení, podle data); většina jazyků má vestavěnou (knihovní) metodu pro řazení, není nutné si ji psát ručně
- vyhledávání v poli dat = nalezení záznamu podle zadané hodnoty; lineární vyhledávání funguje na libovolných datech, binární vyhledávání je rychlejší, ale vyžaduje předem seřazená data (viz předchozí téma o asymptotické složitosti)
Import, export a vizualizace dat
- import dat = načtení dat z externího zdroje (soubor CSV/JSON, databáze) do datových struktur aplikace ke zpracování
- export dat = uložení zpracovaných/vypočtených dat z aplikace do souboru pro další použití (např. výsledky vypočítané aplikací uložit jako CSV pro tabulkový procesor)
- vizualizace dat = grafické znázornění dat pro snazší pochopení výsledků – sloupcový graf (porovnání hodnot), spojnicový graf (vývoj v čase), koláčový graf (podíl částí na celku), případně přehledová tabulka
Aplikace zpracovávající data
- typický tok zpracování dat v aplikaci:
- import/načtení dat (ze souboru, od uživatele přes formulář, z databáze)
- zpracování – filtrace, výpočty, řazení, vyhledávání, agregace (součty, průměry)
- zobrazení výsledku uživateli (v tabulce, grafu) a/nebo export výsledku do souboru
- příklad: aplikace pro evidenci žáků a jejich známek – načte data ze souboru, umožní přidávat/upravovat záznamy přes formulář, spočítá průměry, seřadí žáky podle prospěchu a výsledek zobrazí v tabulce nebo grafu a umožní ho exportovat