Odstranění diakritiky

Stránky: Moodle ZČU
Kurz: KPV/TI Technická informatika ve strojírenství - cvičení
Kniha: Odstranění diakritiky
Vytiskl(a): Nepřihlášený host
Datum: neděle, 8. listopadu 2026, 19.18

1. OdstraneniDiakritiky

Vytvořte aplikaci pro odstranění háčků a čárek z uživatelem zadaného textu.  

Účel příkladu
  • Přístup k jednotlivým znakům v textu (datový typ string)
  • Dříve osvojené znalosti: 

    • Cyklus s pevným krokem 
    • Podmínka 
    • Výpočet s použitím podprogramu – funkce
    • Výpis textu do konzole

Typ aplikace
  • Konzolová aplikace
Popis úkolu 
  • Odstranění háčků a čárek ze zadaného textu
Funkčnosti

  • V hlavním programu se načte textový řetězec, který zadá uživatel
  • V hlavním programu zavolá podprogram (funkci) OdstranitDiakritiku, který provede odstranění háčků a čárek z předaného textového řetězce 
  • Po výpisu textového řetězce bez diakritiky bude aplikace ukončena po stisku klávesy

Výstup programu

Ukázka výpisu textového řetězce bez diakritických znamének v hlavní metodě programu OdstraneniDiakritiky

Výstup programu : Ukázka výpisu textového řetězce bez diakritických znamének v hlavní metodě programu OdstraneniDiakritiky

1.1. Analýza a návrh řešení

Jak asi všichni víme, český jazyk používá diakritická znaménka k pozměnění významu písmene (odlišná výslovnost). Některé softwary mají s českou diakritikou problémy. Proto vytvoříme algoritmus, který ve svém hlavním programu zavolá podprogram (funkci) OdstranitDiakritiku, kterému je předán zadaný vstupní textový řetězec a tento podprogram odstraní všechna diakritická znaménka, tj. čárky, háčky nebo kroužky nad písmeny v tomto řetězci. Výsledný změněný řetězec navrátí zpět do hlavního programu, kde je spolu s úvodním textem vypsán - viz Obrázek 1.

Hlavní program OdstraneniDiakritiky pro odstranění diakritických znamének ze vstupního textu

Obrázek 1: Hlavní program OdstraneniDiakritiky pro odstranění diakritických znamének ze vstupního textu

Podprogram OdstranitDiakritiku (viz Obrázek 3) využívá jednoduchého principu dvou textových řetězců, kde první textový řetězec sDiakritikou obsahuje jednotlivá písmena s diakritikou. Písmena bez diakritických znamének nejsou do textového řetězce sDiakritikou zahrnuta. Naproti tomu druhý textový řetězec bezDiakritiky obsahuje totožná písmena ve stejném pořadí, ale tentokrát bez diakritických znamének. 

Jak již sám název textový řetězec napovídá, řetězec je tvořen jednotlivými po sobě jdoucími znaky. Jednotlivé znaky lze číst pomocí indexu určujícího pozici znaku v řetězci. Na dalším obrázku je ilustrován princip našeho algoritmu - viz Obrázek 2. Pokud znak ve vstupním řetězci bude shodný s nějakým znakem v prvním textovém řetězci s diakritikou např. na druhé pozici na znak 'á', nahradíme tento znak znakem na druhé pozici v řetězci bez diakritiky tj. znakem 'a'.

Princip záměny znaku s diakritikou za znak bez diakritiky

Obrázek 2: Princip záměny znaku s diakritikou za znak bez diakritiky

V další deklaraci podprogramu OdstranitDiakritiku je uvedena proměnná pocetZnaku, který nám slouží pro uložení počtu jednotlivých znaků v zadaném textovém řetězci od uživatele. Pro zjištění počtu znaků v textovém řetězci ve Flowgorithm využijeme funkce Len, která nám navrátí celé číslo. Další deklarovanou proměnou bezDia budeme využívat jako výstupní textový řetězec, do kterého budeme ukládat jednotlivé znaky bez diakritiky.

Po inicializaci prvního textového řetězce sDiakritikou obsahující jednotlivá písmena s diakritikou, budeme inicializovat druhý textový řetězec bezDiakritiky stejnými písmeny ve stejném pořadí, tentokrát však bez diakritiky. Po přiřazení prázdného textového řetězce do výstupního textového řetězce je do proměnné pocetZnaku přiřazena hodnota počtu znaků. 

Tuto hodnotu následně využijeme v cyklu s krokem pro procházení jednotlivých znaků ve vstupním textovém řetězci s. Jak již bylo řečeno, ve Flowgorithm tak i v C# lze procházet jednotlivé znaky textového řetězce pomocí indexu (pozice znaku v textovém řetězci). Pro tento účel využijeme ve Flowgorithm funkci Char, která navrací znak na specifikované pozici. Tato funkce přijímá dva vstupy - textový řetězec a index znaku, který požadujeme navrátit. V cyklu pomocí řídící proměnné i budeme testovat, zda znak na i-té pozici ve vstupním textovém řetězci s je obsažen v textovém řetězci sDiakritikou. Pokud ano, budeme procházet pomocí řídící proměnné j jednotlivé znaky obsažené v textovém řetězci s diakritikou a budeme je testovat na shodu se znakem na i-té pozici ve vstupním textovém řetězci s. Pokud nastane shoda, připojíme znak z řetězce bezDiakritiky na stejné pozici j, na které byl znak vyhledán v řetězci sDiakritikou (prohození znaku s diakritikou za znak bez diakritiky). 

Pokud textový řetězec s diakritikou neobsahuje testovaný znak na i-té pozici ve vstupním textovém řetězci s, je do výstupního textového řetězce bezDia připojen znak ze vstupního řetězce s na pozici i. 

Posledním krokem je přiřazení výsledného textového řetězce bezDia návratu funkce OdstranitDiakritiku - viz Obrázek 3.

Podprogram OdstranitDiakritiku - funkce pro odstranění diakritických znamének

 Obrázek 3: Podprogram OdstranitDiakritiku - funkce pro odstranění diakritických znamének

Vzhledem k tomu, že C# obsahuje metodu Contains třídy string, nahradíme tuto funkčnost jazyka pomocí vlastní funkce, které předáme dva parametry:

  • znak - znak, který má být vyhledán v textovém řetězci text
  • text - text představující prohledávaný textový řetězec

V rámci deklarace budeme deklarovat následující proměnné: vyskyt logická proměnná představující informaci, zda se vyskytl znak v textovém řetězci text a další lokální proměnnou i, která představuje pozici znaku v textovém řetězci - viz Obrázek 4. Po inicializaci logické proměnné na hodnotu false (znak se nenachází v prohledávaném textovém řetězci), budeme procházet jednotlivé znaky umístěné v textovém řetězci text. Abychom zajistili, že bude pomocí cyklu vyhledáván pouze jeden znak (ve Flowgorithm není deklarován typ char jako v C#, ale pouze typ String), použijeme pouze první znak (index 0) v textovém řetězci znak. 

Pokud je znak shodný s nějaký znakem v textovém řetězci, přiřadíme do proměnné vyskyt hodnotu true, která představuje informaci (a také návrat funkce samé), že zadaný znak byl v textovém řetězci nalezen.

Podprogram Contains - funkce testování výskytu znaku v textovém řetězci

 Obrázek 4: Podprogram Contains - funkce testování výskytu znaku v textovém řetězci

1.2. C#

V hlavní metodě programu OdstraneniDiakritiky je nejprve načten textový řetězec do proměnné vstupniText. Pro odstranění diakritických znamének je použita metoda OdstranitDiakritiku, do níž je předán načtený vstupniText od uživatele. Návrat metody je ve formě textového řetězce, u něhož byla odstraněna všechna diakritická znaménka - viz Kód 1.   

static void Main(string[] args)
{
    /* Deklarace: 'vstupniText' ... textový řetězec zadaný uživatelem, u něhož 
     * má být odstraněna diakritika */
    string vstupniText;
 
    Console.WriteLine("Odstranění diakritiky");
 
    // Výzva pro zadání vstupního textu
    Console.Write("Zadejte vstupní text: ");
 
    // Načtení textového řetězce od uživatele
    vstupniText = Console.ReadLine();
 
    // Výpis textu spolu s návratem metody, která obsahuje textový řetězec bez diakritiky
    Console.WriteLine("Výstupní text: " + OdstranitDiakritiku(vstupniText));
 
    // Čekání na stisk klávesy -> ukončení programu
    Console.ReadKey();
}

 Kód 1: Program OdstraneniDiakritiky - deklarace hlavní statické metody Main 

Statická metoda s návratem OdstranitDiakritiku využívá dvou deklarovaných konstant ve formě textových řetězců (typu string) - první textový řetězec sDiakritikou obsahuje písmena s diakritikou a druhý textový řetězec bezDiakritiky obsahuje stejná písmena, ale však bez diakritiky - viz Kód 2. V počáteční deklaraci je uveden textový řetězec bezDia, do nějž budou postupně ukládány jednotlivé znaky bez diakritiky. Po počáteční inicializaci tohoto výstupního řetězce prázdným textem je další proměnné  s názvem pocetZnaku přiřazen počet znaků v řetězci načteném od uživatele. Pomocí cyklus s krokem budeme procházet jednotlivé znaky řetězce pomocí řídící i proměnné cyklu, jenž reprezentuje pozici znaku. Deklarace proměnné je provedena přímo v cyklu. Podmínka ukončení tohoto cyklu se řídí dosažením horní meze u této řídící proměnné i < pocetZnaku (podmínku jsme oproti kódu i <= pocetZnaku - 1 vygenerovaného z Flowgorithm mírně upravili bez změny své podstaty). V cyklu je testována existence jednotlivých znaků z předaného vstupního řetězce s v textovém řetězci s diakritikou. V analýze jsme využívali vlastní vytvořenou funkci Contains. To však není v C# není nutné. Využijeme metodu s návratem implementovanou ve třídě String, ke které přistoupíme pomocí tečkové notace. Této metodě předáme aktuální procházený znak na i-té pozici, tj. s[i] a otestujeme, zda se tento znak nachází v textovém řetězci s diakritikou - výstup metody Contains bude v tomto případě true. Pokud je podmínka splněna dojde k procházení jednotlivých znaků v řetězci s diakritikou, abychom zjistili na které pozici j se tento znak nachází a mohli jsme ho nahradit znakem na stejné pozici j, ale znakem z textového řetězce bez diakritiky (znaky jsou postupně přidávány do výstupního textového řetězce bezDia pomocí operátoru +=). Pokud aktuální znak nebyl v řetězci s diakritikou nalezen, je do výstupního řetězce připojen aktuální znak ze vstupního řetězce s. Finálním krokem je přiřazení hodnoty uložené ve výstupním řetězci do návratu metody. 

// Metoda s návratem textového řetězce bez diakritických znamének
static string OdstranitDiakritiku(string s)
{
    // Parametr: 's' ... vstupní řetězec, ve kterém má být odstraněna diakritika;
    /* Deklarace: 'bezDia' ... výstupní řetězec, tj. vstupní řetězec po odstranění 
     * diakritiky; 'pocetZnaku' ... počet znaků ve vstupním řetězci */
    string bezDia;
    int pocetZnaku;
 
    // Deklarace textového řetězce obsahujícího diakritiku včetně inicializace 
    const string sDiakritikou = "ÁáČčĎďÉéĚěÍíŇňÓóŘřŠšŤťúůÚÝýŽž";
 
    // Deklarace textového řetězce neobsahujícího diakritiku včetně inicializace 
    const string bezDiakritiky = "AaCcDdEeEeIiNnooRrSsTtuuUYyZz";
 
    // Vyprázdnění výstupního textového řetězce
    bezDia = "";
 
    // Počet znaků ve vstupním řetězci
    pocetZnaku = s.Length;
 
    /* Pro každý znak ve vstupním textovém řetězci - 'i' ... pozice znaku ve vstupním 
    textovém řetězci */
    for (int i = 0; i < pocetZnaku; i++)
    {
        /* Pokud textový řetězec s diakritikou obsahuje znak na 'i'-té pozici ve vstupním 
         * textovém řetězci */
        if (sDiakritikou.Contains(s[i]) == true)
        {
            /* Pro každý znak v řetězci 'sDiakritikou' - 'j' ... pozice znaku 
             * v řetězci s diakritikou */
            for (int j = 0; j <= sDiakritikou.Length - 1; j++)
            {
                /* Pokud se znak ve vstupním řetězci na pozici 'i' nachází také v textovém 
                 * řetězci 'sDiakritikou' (na pozici 'j'), tj. obsahuje diakritiku ... */
                if (s[i] == sDiakritikou[j])
                {
                    /* Připoj znak z řetězce 'bezDiakritiky' na stejné pozici 'j', na které 
                     * byl vyhledán v řetězci 'sDiakritikou' (prohození znaku s diakritikou 
                     * za znak bez diakritiky) */
                    bezDia += bezDiakritiky[j];
                }
            }
        }
        else
        {
            // Přidej znak ze vstupního řetězce do výstupního řetězce
            bezDia += s[i];
        }
    }
 
    // Přiřazení návratu metody
    return bezDia;
}

Kód 2: Deklarace statické metody s textovým návratem s názvem OdstranitDiakritiku

1.3. Výsledný kód

Následující zdrojový kód je kompletací předešlých kódů programu OdstraneniDiakritiky, který je umístěn v souboru Program.cs - viz Kód 1.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace OdstraneniDiakritiky
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Deklarace: 'vstupniText' ... textový řetězec zadaný uživatelem, u něhož 
             * má být odstraněna diakritika */
            string vstupniText;
 
            Console.WriteLine("Odstranění diakritiky");
 
            // Výzva pro zadání vstupního textu
            Console.Write("Zadejte vstupní text: ");
 
            // Načtení textového řetězce od uživatele
            vstupniText = Console.ReadLine();
 
            // Výpis textu spolu s návratem metody, která obsahuje textový řetězec bez diakritiky
            Console.WriteLine("Výstupní text: " + OdstranitDiakritiku(vstupniText));
 
            // Čekání na stisk klávesy -> ukončení programu
            Console.ReadKey();
        }
 
        // Metoda s návratem textového řetězce bez diakritických znamének
        static string OdstranitDiakritiku(string s)
        {
            // Parametr: 's' ... vstupní řetězec, ve kterém má být odstraněna diakritika;
            /* Deklarace: 'bezDia' ... výstupní řetězec, tj. vstupní řetězec po odstranění 
             * diakritiky; 'pocetZnaku' ... počet znaků ve vstupním řetězci */
            string bezDia;
            int pocetZnaku;
 
            // Deklarace textového řetězce obsahujícího diakritiku včetně inicializace 
            const string sDiakritikou = "ÁáČčĎďÉéĚěÍíŇňÓóŘřŠšŤťúůÚÝýŽž";
 
            // Deklarace textového řetězce neobsahujícího diakritiku včetně inicializace 
            const string bezDiakritiky = "AaCcDdEeEeIiNnooRrSsTtuuUYyZz";
 
            // Vyprázdnění výstupního textového řetězce
            bezDia = "";
 
            // Počet znaků ve vstupním řetězci
            pocetZnaku = s.Length;
 
            /* Pro každý znak ve vstupním textovém řetězci - 'i' ... pozice znaku ve vstupním 
            textovém řetězci */
            for (int i = 0; i < pocetZnaku; i++)
            {
                /* Pokud textový řetězec s diakritikou obsahuje znak na 'i'-té pozici ve vstupním 
                 * textovém řetězci */
                if (sDiakritikou.Contains(s[i]) == true)
                {
                    /* Pro každý znak v řetězci 'sDiakritikou' - 'j' ... pozice znaku 
                     * v řetězci s diakritikou */
                    for (int j = 0; j <= sDiakritikou.Length - 1; j++)
                    {
                        /* Pokud se znak ve vstupním řetězci na pozici 'i' nachází také v textovém 
                         * řetězci 'sDiakritikou' (na pozici 'j'), tj. obsahuje diakritiku ... */
                        if (s[i] == sDiakritikou[j])
                        {
                            /* Připoj znak z řetězce 'bezDiakritiky' na stejné pozici 'j', na které 
                             * byl vyhledán v řetězci 'sDiakritikou' (prohození znaku s diakritikou 
                             * za znak bez diakritiky) */
                            bezDia += bezDiakritiky[j];
                        }
                    }
                }
                else
                {
                    // Přidej znak ze vstupního řetězce do výstupního řetězce
                    bezDia += s[i];
                }
            }
 
            // Přiřazení návratu metody
            return bezDia;
        }
    }
}

Kód 1: Program OdstraneniDiakritiky - deklarace hlavní statické metody Main včetně deklarace další metody

Výstup programu

Na následujícím výstupu programu vidíme načtení vstupního textového řetězce od uživatele a jeho následný výpis po odstranění všech diakritických znamének - viz Výstup programu - Kód 1.   

Ukázka výpisu textového řetězce v hlavní metodě programu OdstraneniDiakritiky po odstranění diakritických znamének

Výstup programu - Kód 1: Ukázka výpisu textového řetězce v hlavní metodě programu OdstraneniDiakritiky po odstranění diakritických znamének 

2. OdstraneniDiakritikyWPF

Vytvořte aplikaci pro odstranění háčků a čárek z uživatelem zadaného textu.  

Účel příkladu
  • Přístup k jednotlivým znakům v textu (datový typ string)


  • Dříve osvojené znalosti: 

    • Cyklus s pevným krokem 
    • Podmínka 
    • Výpočet s použitím podprogramu – procedura 
    • Výpis textu do pole na formuláři 
    • Zavření formuláře 
    • Vlastnosti objektu 
    • Metody objektu 

Typ aplikace
  • WPF aplikace
Popis úkolu 
  • Odstranění háčků a čárek ze zadaného textu
Funkčnosti

  • Při stisku tlačítka Odstranit diakritiku se zavolá metoda, která provede odstranění háčků a čárek z uživatelem zadaného textu na formuláři 
  • Při stisku tlačítka Konec se provede zavření formuláře  

Výstup programu


Výstup programu 1: Ukázka GUI při počátečním spuštění programu OdstraneniDiakritikyWPF

Výsledek:


Výstup programu 2: Ukázka odstranění diakritiky ze zadaného textu v programu OdstraneniDiakritikyWPF


2.1. Analýza a návrh řešení

V příkladu bude využit stejný princip odstranění diakritiky ze vstupního textového řetězce jako v předchozím příkladu OdstraneníDakritiky, proto již není zapotřebí provádět detailní analýzu. 

Pro rozložení jednotlivých prvků na formuláři použijeme Grid vložený do formuláře, který rozdělíme na 5 řádků - viz Obrázek 1. Do prvního řádku Grid  (s indexem 0) umístíme objekt typu Label, do něhož umístíme nadpis, který horizontálně vystředíme. Do druhého řádku Grid umístíme objekt typu GroupBox s titulkem vstupní data, do něhož vložíme objekt typu StackPanel.  Do tohoto StackPanel vložíme popisek (Label) a objekt typu TextBox, ve kterém uživatel zadá vstupní text, u něhož chce odstranit diakritiku. V dalším řádku Grid bude umístěn objekt StackPanel, do kterého bude rovněž umístěn popisek (Label) a objekt typu TextBox, ve kterém bude uživateli po stisku tlačítka vypsán vstupní text, ale tentokrát bez diakritiky. Následující řádek Grid bude volný. Tento řádek bude vyplňovat prostor formuláře při roztažení. Do posledního řádku Grid formuláře umístíme StackPanel, do něhož umístíme dva objekty typu WrapPanel. Do prvního WrapPanel umístíme tlačítko pro odstranění diakritiky. Do druhého WrapPanel umístíme tlačítko pro ukončení aplikace.

Formulář bude obsahovat následující objekty (kontrolky), které budou vnořeny následujícím způsobem:

  • Grid
    • Label
    • GroupBox
      • StackPanel
        • Label
        • TextBox: TxtVstupniText
    • GroupBox
      • StackPanel
      • Label
      • TextBox: TxtVystupniText
    • StackPanel
      • WrapPanel
        • Button: BtnOdstranitDiakritiku
      • WrapPanel
        • Button: BtnKonec


Obrázek 1: Návrh GUI - rozložení prvků v mřížce formuláře (OdstraneníDakritikyWPF)


Formulář bude obsahovat následující prvky - viz Obrázek 2.


Obrázek 2: Návrh GUI a účel jednotlivých objektů (OdstraneníDakritikyWPF)

2.2. XAML

Na základě našich zkušeností s XAML bude již stručně popsán postup tvorby formuláře. Základní atributy (titulek, výšku a šířku) formuláře nastavíme následujícím způsobem - viz Kód 1.

Title="Odstranění diakritiky" Height="450" Width="800">

Kód 1: Nastavení atributů formuláře

Objekt typu Grid umístěného na formuláři rozdělíme na 5 řádků. Všechny řádky Grid (kromě čtvrtého), se přizpůsobí obsahu vložených prvků. Výška čtvrtého řádku se bude přizpůsobovat roztažení okna - viz Kód 2. 

<Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto"/>
</Grid.RowDefinitions>

Kód 2: Rozdělení Grid na řádky

Do prvního řádku Grid  (s indexem 0) umístíme objekt typu Label, do něhož umístíme větší tučný nadpis, který horizontálně vystředíme. 

<Label Content="Odstranění diakritiky" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Margin="0,10"/>

Kód 3: Label - nadpis formuláře

Do druhého řádku Grid umístíme objekt typu GroupBox s titulkem "Vstupní data", do něhož vložíme objekt typu StackPanel. Do tohoto StackPanel vložíme popisek (Label) a objekt typu TextBox, ve kterém uživatel zadá vstupní text, u něhož chce odstranit diakritiku. Tento objekt bude obsahovat text "?", abychom uživateli naznačili, že má zadat vstupní text. Dále nastavíme vnější a vnitřní okraje tohoto objektu TextBox. Písmo bude nastaveno na tučné a text bude zalamován, pokud dojde k překročení šířky tohoto objektu - viz Kód 4.

<GroupBox Header="Vstupní data" Grid.Row="1" Margin="5,10">
    <StackPanel Margin="5,10,5,5">
        <Label Content="Zadejte vstupní text:" />
        <TextBox Name="TxtVstupniText" Text="?" Margin="15,5,5,5" FontSize="14" FontWeight="Bold" Padding="5" TextWrapping="Wrap"/>
    </StackPanel>
</GroupBox>

Kód 4: GroupBox - vstupní data - popisek (Label) včetně objektu vstupního pole pro zadání textu s diakritikou (TextBox)

V dalším řádku Grid bude umístěn objekt StackPanel, do kterého bude rovněž umístěn popisek (Label) a objekt typu TextBox, ve kterém bude uživateli po stisku tlačítka vypsán vstupní text, ale tentokrát bez diakritiky - viz Kód 5.  Atributy objektu TextBox nastavíme stejně jako v případě minulého vstupního pole pro zadání textu s diakritikou, ale s tím rozdílem, že bude mít podbarveno pozadí a nepůjde do tohoto objektu vpisovat text (lze pouze kopírovat).

<GroupBox Header="Výstupní data" Grid.Row="2" Margin="5,10">
    <StackPanel Margin="5,10,5,5">
        <Label Content="Výstupní text bez diakritiky:" />
        <TextBox Name="TxtVystupniText" Margin="15,5,5,5" FontSize="14" FontWeight="Bold" Padding="5" IsReadOnly="True" 
                 TextWrapping="Wrap" Background="AliceBlue"/>
    </StackPanel>
</GroupBox>

Kód 5: GroupBox - vstupní data - popisek (Label) včetně objektu výstupního pole pro výpis textu bez diakritiky (TextBox)

V posledním řádku se bude nacházet StackPanel, který bude obsahovat dva objekty typu WrapPanel. Do každého objektu typu WrapPanel bude umístěno tlačítko. První WrapPanel, který je vycentrován v horizontální ose, bude obsahovat tlačítko s titulkem Odstranit diakritiku, které po stisknutí spustí metodu, která odstraní diakritiku ze vstupního textu zadaného uživatelem. 

Druhé tlačítko Konec, umístěné v druhém WrapPanel, (tento objekt je zarovnán k pravému okraji), bude sloužit pro zavření formuláře. 

U obou tlačítek nastavíme vnitřní okraje (vlastnost Padding) a také vnější okraje (vlastnost Margin). Pro obě tlačítka vygenerujeme obsluhu události stisknutí tlačítka (událost Click) pomocí nastavení vlastnosti Click a zvolení položky <New Event Handler> - viz Kód 6.

<StackPanel Grid.Row="4">
    <WrapPanel HorizontalAlignment="Center">
        <Button Name="BtnOdstranitDiakritiku" Content="Odstranit diakritiku" Margin="5" Padding="10,5" Click="BtnOdstranitDiakritiku_Click"/>
    </WrapPanel>
    <WrapPanel HorizontalAlignment="Right">
        <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5" Click="BtnKonec_Click"/>
    </WrapPanel>
</StackPanel>

Kód 6: StackPanel obsahující dva WrapPanel s tlačítkem pro odstranění diakritiky a tlačítkem pro zavření formuláře

Výsledný formulář

Navržené rozložení prvků na formuláři, včetně formuláře samotného, je vidět na následujícím obrázku - viz Obrázek 1.


Obrázek 1: Výsledný formulář WPF aplikace

Objekty na formuláři:

Formulář obsahuje následující objekty (kontrolky):

  • Grid
  • GroupBox
  • StackPanel
  • WrapPanel
  • Label
  • TextBox
    • TxtVstupniText
    • TxtVystupniText
  • Button
    • BtnOdstranitDiakritiku
    • BtnKonec
které jsou umístěny následujícím způsobem - viz Obrázek 2.


Obrázek 2: VS - okno Document Outline - seznam objektů


2.3. XAML - prvky formuláře

Následující XAML kód obsahuje nastavení formuláře - viz Kód 1. Pokud je zapotřebí zkopírujte XAML kód a vložte jej namísto řádky s nastavením vlastností okna (řádek začíná Title=....).

Title="Odstranění diakritiky" Height="450" Width="800">

Kód 1: Nastavení vlastností formuláře

Grid

Následující zdrojový kód XAML obsahuje potřebné prvky na formuláři pro řešení úlohy, bez nastavení událostí - viz Kód 2. Pokud je zapotřebí, zkopírujte XAML kód a vložte jej mezi počáteční a koncovou značku prvku Grid.

<Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Content="Odstranění diakritiky" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Margin="0,10"/>
<GroupBox Header="Vstupní data" Grid.Row="1" Margin="5,10">
    <StackPanel Margin="5,10,5,5">
        <Label Content="Zadejte vstupní text:" />
        <TextBox Name="TxtVstupniText" Text="?" Margin="15,5,5,5" FontSize="14" FontWeight="Bold" Padding="5" TextWrapping="Wrap"/>
     </StackPanel>
</GroupBox>
<GroupBox Header="Výstupní data" Grid.Row="2" Margin="5,10">
     <StackPanel Margin="5,10,5,5">
         <Label Content="Výstupní text bez diakritiky:" />
         <TextBox Name="TxtVystupniText" Margin="15,5,5,5" FontSize="14" FontWeight="Bold" Padding="5" IsReadOnly="True" 
TextWrapping
="Wrap" Background="AliceBlue"/>       </StackPanel> </GroupBox> <StackPanel Grid.Row="4">     <WrapPanel HorizontalAlignment="Center">         <Button Name="BtnOdstranitDiakritiku" Content="Odstranit diakritiku" Margin="5" Padding="10,5"/>     </WrapPanel>     <WrapPanel HorizontalAlignment="Right">         <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5"/>     </WrapPanel> </StackPanel>

Kód 2: Prvky v Grid

2.4. C#

V souboru MainWindow.xaml.cs obsahující kód na pozadí (Code Behind) byla vygenerována základní struktura našeho programu v C#. Vedle konstruktoru MainWindow této třídy byly také vygenerovány soukromé (private) metody bez návratu, které umístíme do oblasti Události:

  • BtnOdstranitDiakritiku_Click
  • BtnKonec_Click
Do regionu Události umístíme první metodu bez návratu pro obsluhu události tlačítka BtnOdstranitDiakritiku. V této metodě provedeme načtení zadaného textu (v objektu TxtVstupniText typu TextBox). Výstupní text nebude obsahovat žádnou diakritiku a bude vypsán na formuláři ve výstupním poli TxtVystupniText (TextBox) - viz Kód 1.

private void BtnOdstranitDiakritiku_Click(object sender, RoutedEventArgs e)
{
    /* Deklarace: 'vstupniText' ... textový řetězec zadaný uživatelem, u něhož 
     * má být odstraněna diakritika */
    string vstupniText;
 
    // Načtení textového řetězce zadaného na formuláři
    vstupniText = this.TxtVstupniText.Text;
 
    // Zavolání metody, která navrací textový řetězec bez diakritiky
    this.TxtVystupniText.Text = OdstranitDiakritiku(vstupniText);
}

Kód 1: Deklarace metody pro převod čísla do zvolené soustavy (BtnOdstranitDiakritiku_Click)

Do regionu Výpočty umístíme metodu, která bude z předaného textu (načteného z formuláře) odstraňovat diakritiku. 

Do deklarované metody OdstranitDiakritiku s textovým návratem je předán načtený text z formuláře - viz Kód 2. Tento parametr je předán hodnotou, tzn. jeho hodnota je nakopírována do formálního parametru s ve volané metodě. Na začátku těla metody jsou deklarovány následující proměnné. U některých z těchto proměnných je v deklaraci zároveň provedena inicializace:

  • bezDia ... výstupní textový řetězec, tj. vstupní řetězec po odstranění diakritiky - inicializace prázdným textem
  • poceZnaku ... celočíselný počet znaků ve vstupním řetězci - inicializace délkou (počtem znaků) vstupního řetězce
  • sDiakritikou ... textový řetězec obsahující diakritiku - inicializace znaky s diakritikou 
  • bezDiakritiky ... textový řetězec neobsahující diakritiku - inicializace stejnými znaky ale bez diakritiky 
  • i ... pozice znaku ve vstupním textovém řetězci 

V metodě je použit stejný princip jako v příkladu OdstraneniDiakritiky pro konzolovou aplikaci, proto již není nutné znovu popisovat prováděné příkazy uvnitř metody.

/// <summary>
/// Metoda s návratem textového řetězce bez diakritických znamének
/// </summary>
/// <param name="s"> vstupní řetězec s diakritikou </param>
/// <returns> výstupní řetězec bez diakritiky </returns>
private string OdstranitDiakritiku(string s)
{
    /* Deklarace: 'bezDia' ... výstupní řetězec, tj. vstupní řetězec po odstranění 
     * diakritiky - inicializace; 'pocetZnaku' ... počet znaků ve vstupním řetězci - 
     * inicializace */
    string bezDia = "";
    int pocetZnaku = s.Length; ;
 
    // Deklarace textového řetězce obsahujícího diakritiku včetně inicializace 
    const string sDiakritikou = "ÁáČčĎďÉéĚěÍíŇňÓóŘřŠšŤťúůÚÝýŽž";
 
    // Deklarace textového řetězce neobsahujícího diakritiku včetně inicializace 
    const string bezDiakritiky = "AaCcDdEeEeIiNnooRrSsTtuuUYyZz";
 
    /* Pro každý znak ve vstupním textovém řetězci - 'i' ... pozice znaku ve vstupním 
    textovém řetězci */
    for (int i = 0; i < pocetZnaku; i++)
    {
        /* Pokud textový řetězec s diakritikou obsahuje znak na 'i'-té pozici ve vstupním 
         * textovém řetězci */
        if (sDiakritikou.Contains(s[i]) == true)
        {
            /* Pro každý znak v řetězci 'sDiakritikou' - 'j' ... pozice znaku 
             * v řetězci s diakritikou */
            for (int j = 0; j <= sDiakritikou.Length - 1; j++)
            {
                /* Pokud se znak ve vstupním řetězci na pozici 'i' nachází také v textovém 
                 * řetězci 'sDiakritikou' (na pozici 'j'), tj. obsahuje diakritiku ... */
                if (s[i] == sDiakritikou[j])
                {
                    /* Připoj znak z řetězce 'bezDiakritiky' na stejné pozici 'j', na které 
                     * byl vyhledán v řetězci 'sDiakritikou' (prohození znaku s diakritikou 
                     * za znak bez diakritiky) */
                    bezDia += bezDiakritiky[j];
                }
            }
        }
        else
        {
            // Přidej znak ze vstupního řetězce do výstupního řetězce
            bezDia += s[i];
        }
    }
 
    // Přiřazení návratu metody
    return bezDia;
}

Kód 2: Deklarace soukromé metody s textovým návratem (OdstranitDiakritiku)

Poslední metodou v regionu Události, kterou musíme upravit je metoda pro obsluhu události Click tlačítka Konec. Tato metoda nám zavře formulář - viz Kód 3.

private void BtnKonec_Click(object sender, RoutedEventArgs e)
{
    // Zavření formuláře
    this.Close();
}

Kód 3: Deklarace metody bez návratu pro zavření formuláře (BtnKonec_Click)

2.5. Výsledný kód

XAML kód

Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.

<Window x:Class="OdstraneniDiakritikyWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OdstraneniDiakritikyWPF"
        mc:Ignorable="d"
        Title="Odstranění diakritiky" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Label Content="Odstranění diakritiky" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Margin="0,10"/>
        <GroupBox Header="Vstupní data" Grid.Row="1" Margin="5,10">
            <StackPanel Margin="5,10,5,5">
                <Label Content="Zadejte vstupní text:" />
                <TextBox Name="TxtVstupniText" Text="?" Margin="15,5,5,5" FontSize="14" FontWeight="Bold" Padding="5" TextWrapping="Wrap"/>
            </StackPanel>
        </GroupBox>
        <GroupBox Header="Výstupní data" Grid.Row="2" Margin="5,10">
            <StackPanel Margin="5,10,5,5">
                <Label Content="Výstupní text bez diakritiky:" />
                <TextBox Name="TxtVystupniText" Margin="15,5,5,5" FontSize="14" FontWeight="Bold" Padding="5" IsReadOnly="True" 
                         TextWrapping="Wrap" Background="AliceBlue"/>
            </StackPanel>
        </GroupBox>
        <StackPanel Grid.Row="4">
            <WrapPanel HorizontalAlignment="Center">
                <Button Name="BtnOdstranitDiakritiku" Content="Odstranit diakritiku" Margin="5" Padding="10,5" Click="BtnOdstranitDiakritiku_Click"/>
            </WrapPanel>
            <WrapPanel HorizontalAlignment="Right">
                <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5" Click="BtnKonec_Click"/>
            </WrapPanel>
        </StackPanel>
    </Grid>
</Window>

Kód 1: Výsledný XAML kód vytvořeného formuláře

C# kód

Code Behind - C# kód pro veškeré události vyvolané uživatelem při manipulaci s aplikací (MainWindow.xaml.cs) - viz Kód 2.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace OdstraneniDiakritikyWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        #region Výpočty
 
        /// <summary>
        /// Metoda s návratem textového řetězce bez diakritických znamének
        /// </summary>
        /// <param name="s"> vstupní řetězec s diakritikou </param>
        /// <returns> výstupní řetězec bez diakritiky </returns>
        private string OdstranitDiakritiku(string s)
        {
            /* Deklarace: 'bezDia' ... výstupní řetězec, tj. vstupní řetězec po odstranění 
             * diakritiky - inicializace; 'pocetZnaku' ... počet znaků ve vstupním řetězci - 
             * inicializace */
            string bezDia = "";
            int pocetZnaku = s.Length; ;
 
            // Deklarace textového řetězce obsahujícího diakritiku včetně inicializace 
            const string sDiakritikou = "ÁáČčĎďÉéĚěÍíŇňÓóŘřŠšŤťúůÚÝýŽž";
 
            // Deklarace textového řetězce neobsahujícího diakritiku včetně inicializace 
            const string bezDiakritiky = "AaCcDdEeEeIiNnooRrSsTtuuUYyZz";
 
            /* Pro každý znak ve vstupním textovém řetězci - 'i' ... pozice znaku ve vstupním 
            textovém řetězci */
            for (int i = 0; i < pocetZnaku; i++)
            {
                /* Pokud textový řetězec s diakritikou obsahuje znak na 'i'-té pozici ve vstupním 
                 * textovém řetězci */
                if (sDiakritikou.Contains(s[i]) == true)
                {
                    /* Pro každý znak v řetězci 'sDiakritikou' - 'j' ... pozice znaku 
                     * v řetězci s diakritikou */
                    for (int j = 0; j <= sDiakritikou.Length - 1; j++)
                    {
                        /* Pokud se znak ve vstupním řetězci na pozici 'i' nachází také v textovém 
                         * řetězci 'sDiakritikou' (na pozici 'j'), tj. obsahuje diakritiku ... */
                        if (s[i] == sDiakritikou[j])
                        {
                            /* Připoj znak z řetězce 'bezDiakritiky' na stejné pozici 'j', na které 
                             * byl vyhledán v řetězci 'sDiakritikou' (prohození znaku s diakritikou 
                             * za znak bez diakritiky) */
                            bezDia += bezDiakritiky[j];
                        }
                    }
                }
                else
                {
                    // Přidej znak ze vstupního řetězce do výstupního řetězce
                    bezDia += s[i];
                }
            }
 
            // Přiřazení návratu metody
            return bezDia;
        }
        #endregion
 
 
        #region Události
        private void BtnOdstranitDiakritiku_Click(object sender, RoutedEventArgs e)
        {
            /* Deklarace: 'vstupniText' ... textový řetězec zadaný uživatelem, u něhož 
             * má být odstraněna diakritika */
            string vstupniText;
 
            // Načtení textového řetězce zadaného na formuláři
            vstupniText = this.TxtVstupniText.Text;
 
            // Zavolání metody, která navrací textový řetězec bez diakritiky
            this.TxtVystupniText.Text = OdstranitDiakritiku(vstupniText);
        }
 
        private void BtnKonec_Click(object sender, RoutedEventArgs e)
        {
            // Zavření formuláře
            this.Close();
        }
        #endregion
    }
}

Kód 2: Výsledný C# kód vytvořeného formuláře a metod jeho prvků


Výstup programu

Na následujícím výstupu programu vidíme výpis textového řetězce, ze kterého byla odstraněna diakritika u všech písmen. Vstupní textový řetězec byl načten od uživatele na formuláři - viz Výstup programu - Kód 1 a 2.   


Výstup programu - Kód 1 a 2: Ukázka výpisu textu s odstraněnou diakritikou (OdstraneniDiakritikyWPF)