Prvočísla

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

1. Prvocisla

Vytvořte aplikaci pro výpis prvních n prvočísel (prvočíslo je přirozené číslo větší než 1, které je dělitelné jen jedničkou a samo sebou) pomocí cyklu s podmínkou na začátku. Celkový počet čísel je definován uživatelem.

Účel příkladu
  • Cyklus s podmínkou na začátku 
  • Podmínka 
  • Výpočet s použitím podprogramu – funkce
  • Konverze celého čísla na text 
  • Výpis textu v konzoli
              Typ aplikace
              • Konzolová aplikace
              Popis úkolu 
              • Výpis prvočísel 
              Funkčnosti
              • Po vypsání výzvy pro zadání počtu vypsaných prvočísel v konzoli bude tento počet načten do proměnné pocetCisel. Pokud počet čísel bude menší než 0, bude vypsána zpráva "Zadejte platnou kladnou celočíselnou hodnotu pro počet čísel." a program bude ukončen
              • Vypsaná řada prvočísel začíná číslem 2 (jednička není prvočíslo, neboť nemá dva dělitele). Čísla jsou testována pomocí podprogramu (funkce), který vrací informaci, zda testované číslo je prvočíslem, nebo nikoliv
              • Po výpisu všech čísel bude aplikace ukončena po stisku klávesy
              •  

              Výstup programu

              Ukázka výpisu řady prvočísel v hlavním programu Prvocisla

              Výstup programu: Ukázka výpisu řady prvočísel v hlavní metodě programu Prvocisla

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

              Z matematiky víme, že prvočíslo je přirozené číslo větší než 1, které je dělitelné beze zbytek jen jedničkou a samo sebou. Jednička tedy není prvočíslo, protože nemá dva dělitele. Prvním prvočíslem je číslo 2 (je jediným sudým prvočíslem). 

              V hlavním programu bude od uživatele načten počet prvočísel v řadě, která mají být v konzole vypsána - viz Obrázek 1. Pokud uživatel zadá záporný počet, vypíšeme varovnou hlášku a budeme simulovat ukončení tohoto programu pomocí značky Breakpoint (značka osmiúhelníku). Tím bude běh programu pozastaven a nebudou se vykonávat následující příkazy. 

              V cyklu s podmínkou na začátku budeme v řídící podmínce cyklu testovat, zda již byla vypsána všechna prvočísla v řadě. To znamená, jestli je počet vypsaných čísel menší než požadovaný počet, necháme probíhat cyklus, ve kterém budeme testovat pomocí podprogramu Prvocislo testovat (funkce s návratem typu boolean), zda předané číslo je prvočíslem. Tento podprogram předá zpět do hlavního programu informaci, zda předané číslo je prvočíslo (hodnota true), nebo nikoliv (hodnota false). Pokud je testované číslo prvočíslem, připojíme ho do řady čísel, která jsou od sebe oddělena čárkami. Tento textový řetězec číslic necháme vypsat v hlavním programu.

              Hlavní program Prvocisla pro výpis řady prvočísel

              Obrázek 1: Hlavní program Prvocisla pro výpis řady prvočísel

              V cyklu hlavního programu je volána funkce Prvocislo, která navrací informaci, zda předané číslo je prvočíslo, nebo nikoliv - viz Obrázek 2. V této funkci jsou deklarovány dvě lokální proměnné. První booleanovská proměnná b obsahuje informaci, zda předané číslo uložené ve formálním parametru n je prvočíslem. Ještě před proběhnutím cyklu testované číslo prohlásíme za prvočíslo (b = true) - inicializace. Do proměnné i budeme ukládat jednotlivé hodnoty, kterými budeme předané číslo dělit. Pro tento účel využijeme operaci pro zbytek po celočíselném dělení (pomocí operátoru %). Řídící podmínka cyklu se skládá ze dvou částí, které musí obě být zároveň splněny. První část podmínky b == true podmiňuje vstup do cyklu za předpokladu, že předané číslo je stále prvočíslem. Jak si můžeme všimnout, uvnitř těla cyklu je umístěn rozhodovací blok, ve kterém je testováno, zda zbytek po celočíselném dělení předaného čísla dělitelem (aktuálním číslem uloženém v čítači) je roven nule. Pokud je tato podmínka splněna, nejedná se o prvočíslo, protože předané číslo je beze zbytku dělitelné jedničkou, samo sebou, ale zároveň i dalším dělitelem uloženým v čítači i. Dělitel je před příchodem do další iterace inkrementován o hodnotu 1. 

              Druhá část řídící podmínky cyklu je, že cyklus bude probíhat, pokud aktuální číslo bude menší než předané číslo (chceme otestovat všechny dělitele v rozsahu od 2 do n-1). 

              Podprogram Prvocislo - funkce pro testování, zda předané číslo je prvočíslem

               Obrázek 2: Podprogram Prvocislo - funkce pro testování, zda předané číslo je prvočíslem

              V předchozím algoritmu jsme procházeli čísla od 2 do n-1. Tento algoritmus je vhodný pro malá čísla. Problém však nastává u větších čísel. Vypišme si například řadu čísel od 2 do 20:

              Řada: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

              Pokud se nad touto řadou zamyslíme, vidíme, že prvním prvočíslem je číslo 2. Všechny jeho násobky již tedy nemohou být prvočísly, jelikož jsou už dělitelné číslem 2. Můžeme tedy škrtnout čísla, která jsou násobky 2 a tudíž nejsou prvočísly:

              Prvočísla: 2

              Řada: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

              Vidíme, že řada čísel již byla významně redukována. Stejným způsobem budeme pokračovat dalším prvočíslem 3 a jeho násobky škrtneme:

              Prvočísla: 2, 3

              Řada: 5, 7, 9, 11, 13, 15, 17, 19

              A stejným postupem bychom pokračovali dalšími prvočísly, dokud nám zbývají další čísla v řadě. Jedná se o tzv. Eratosthenovo síto.

              Dalším urychlením je, že nepotřebujeme procházet členy do 2 do n-1, ale postačí procházet pouze členy číselné řady, které budou splňovat podmínku  i< \sqrt[]{n}  .


              1.2. C#

              Načtení počtu prvočísel v řadě do celočíselné proměnné pocetCisel ve statické hlavní metodě je realizováno pomocí příkazu (metody s výstupními parametry) TryParse - viz Kód 1. Pokud uživatel zadal počet menší než 0, je vypsána chybová hláška a hlavní metoda je ukončena pomocí příkazu return (tzn. ukončení programu). Je také zapotřebí inicializovat počet nalezených čísel n, který je na začátku nulový. Dále musí být inicializována hodnota v proměnné i (čítač), do které budeme ukládat testované číslo, které může být prvočíslem, nebo nikoliv. 

              V cyklu while probíhá testování, zda již byl vypsán požadovaný počet prvočísel. Testování, zda je aktuální číslo prvočíslem, probíhá pomocí volání metody s logickým návratem Prvocislo. Této metodě je předáno aktuální testované číslo uložené ve skutečném parametru i. Pokud návrat metody je true, je testované číslo prvočíslem a musí být zvýšen počet nalezených prvočísel o hodnotu 1 (inkrementace n++;). Toto číslo musí také být konvertováno na číslici a následně zapsáno do řady již nalezených čísel, která jsou zapsána v proměnné vystup. Jednotlivé číslice jsou od sebe odděleny čárkou, proto se uvnitř těla cyklu nalézá ještě další podmínka testující, zda se nenacházíme u posledního prvočísla v řadě, u kterého se již žádná čárka připojovat nebude. Na konci iterace je zvýšeno testované číslo o hodnotu 1 (inkrementace i++;)

              V hlavní statické metodě je na konci těla metody vypsána výsledná řada prvočísel včetně úvodního textu. 

              static void Main(string[] args)
              {
                  /* Deklarace: 'pocetCisel' ... počet prvočísel, která mají být vypsána; 
                   * 'n' ... počet nalezených prvočísel; 'i' ... testované číslo 
                   * na prvočíslo (čítač); 'vystup' ... textová proměnná, do které 
                   * budeme ukládat výsledek */
                  int pocetCisel, n, i;
                  string vystup;
               
                  // Inicializace - počet nalezených čísel
                  n = 0;
                  // Inicializace - číslo testované na prvočíslo
                  i = 2;
                  vystup = "";
               
                  Console.WriteLine("Výpis prvních n prvočísel");
               
                  Console.Write("Zadejte počet vypsaných prvočísel: ");
                  // Načtení počtu vypisovaných prvočísel
                  int.TryParse(Console.ReadLine(), out pocetCisel);
                  // Test na zadání záporného počtu vypísovaných prvočísel
                  if (pocetCisel < 0)
                  {
                      Console.WriteLine("Zadejte platnou kladnou celočíselnou hodnotu pro počet čísel.");
                      // Ukončení metody (programu)
                      return;
                  }
               
                  // Cyklus - pokud platí, že je vypsáno méně než specifikovaný počet prvočísel
                  while (n < pocetCisel)
                  {
               
                      // Pokud návrat zavolané funkce testu na prvočíslo u testovaného čísla je pravda
                      if (Prvocislo(i))
                      {
               
                          // Zvýšeni hodnoty poctu nalezených prvočísel o 1
                          n++;
               
                          // Připojení číslice (testovaného čísla konvertovaného na text) k předchozím
                          vystup += i.ToString();
               
                          // Pokud není vypsán požadovaný počet prvočísel
                          if (n < pocetCisel)
                          {
               
                              // Připoj za číslo čárku
                              vystup += ", ";
                          }
                      }
               
                      // Nové testované číslo, které je o 1 vyšší než předchozí
                      i++;
                  }
               
                  // Výpis požadovaného počtu prvočísel
                  Console.WriteLine("Prvočísla: " + vystup);
               
                  // Čekání na stisk klávesy -> ukončení programu
                  Console.ReadKey();
              }

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

              V deklaraci metody Prvocislo s logickým návratem (datový typ bool) vidíme, že ještě před testováním formálního parametru n je provedena inicializace u obou proměnných - na začátku prohlásíme testované číslo prvočíslem a prvním dělitelem je číslo 2 - viz Kód 2. V cyklu while je provedeno testování na dělení beze zbytku, které bylo popsáno již v předchozí kapitole. Pokud bylo číslo dělitelné beze zbytku alespoň nějakým dělitelem, toto číslo není prvočíslem (b = false;).

              // Metoda s návratem - návrat, zda je předané číslo prvočíslo (true), nebo nikoliv (false)
              static bool Prvocislo(int n)
              {
                  /* Deklarace (inicializace): 'b' ... informace, zda je testované (předané) číslo 
                   * prvočíslem (true - je prvočíslem); 'i' ... dělitel (čítač) */
                  bool b = true;
                  int i = 2;
               
                  // Cyklus - dokud platí, že testované číslo je prvočíslo a čítač je menší než testované číslo
                  while (b == true && i < n)
                  {
                      // Pokud testované číslo je dělitelné beze zbytku
                      if (n % i == 0)
                      {
                          // Testované číslo není prvočíslo
                          b = false;
                      }
               
                      // Inkrementace
                      i++;
                  }
               
                  // Výstupem metody je informace, která je uložena v logické proměnné
                  return b;
              }

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

              1.3. Výsledný kód

              Následující zdrojový kód je kompletací předešlých kódů programu Prvocisla, 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 Prvocisla
              {
                  class Program
                  {
                      static void Main(string[] args)
                      {
                          /* Deklarace: 'pocetCisel' ... počet prvočísel, která mají být vypsána; 
                           * 'n' ... počet nalezených prvočísel; 'i' ... testované číslo 
                           * na prvočíslo (čítač); 'vystup' ... textová proměnná, do které 
                           * budeme ukládat výsledek */
                          int pocetCisel, n, i;
                          string vystup;
               
                          // Inicializace - počet nalezených čísel
                          n = 0;
                          // Inicializace - číslo testované na prvočíslo
                          i = 2;
                          vystup = "";
               
                          Console.WriteLine("Výpis prvních n prvočísel");
               
                          Console.Write("Zadejte počet vypsaných prvočísel: ");
                          // Načtení počtu vypisovaných prvočísel
                          int.TryParse(Console.ReadLine(), out pocetCisel);
                          // Test na zadání záporného počtu vypísovaných prvočísel
                          if (pocetCisel < 0)
                          {
                              Console.WriteLine("Zadejte platnou kladnou celočíselnou hodnotu pro počet čísel.");
                              // Ukončení metody (programu)
                              return;
                          }
               
                          // Cyklus - pokud platí, že je vypsáno méně než specifikovaný počet prvočísel
                          while (n < pocetCisel)
                          {
               
                              // Pokud návrat zavolané funkce testu na prvočíslo u testovaného čísla je pravda
                              if (Prvocislo(i))
                              {
               
                                  // Zvýšeni hodnoty poctu nalezených prvočísel o 1
                                  n++;
               
                                  // Připojení číslice (testovaného čísla konvertovaného na text) k předchozím
                                  vystup += i.ToString();
               
                                  // Pokud není vypsán požadovaný počet prvočísel
                                  if (n < pocetCisel)
                                  {
               
                                      // Připoj za číslo čárku
                                      vystup += ", ";
                                  }
                              }
               
                              // Nové testované číslo, které je o 1 vyšší než předchozí
                              i++;
                          }
               
                          // Výpis požadovaného počtu prvočísel
                          Console.WriteLine("Prvočísla: " + vystup);
               
                          // Čekání na stisk klávesy -> ukončení programu
                          Console.ReadKey();
                      }
               
                      // Metoda s návratem - návrat, zda je předané číslo prvočíslo (true), nebo nikoliv (false)
                      static bool Prvocislo(int n)
                      {
                          /* Deklarace (inicializace): 'b' ... informace, zda je testované (předané) číslo 
                           * prvočíslem (true - je prvočíslem); 'i' ... dělitel (čítač) */
                          bool b = true;
                          int i = 2;
               
                          // Cyklus - dokud platí, že testované číslo je prvočíslo a čítač je menší než testované číslo
                          while (b == true && i < n)
                          {
                              // Pokud testované číslo je dělitelné beze zbytku
                              if (n % i == 0)
                              {
                                  // Testované číslo není prvočíslo
                                  b = false;
                              }
               
                              // Inkrementace
                              i++;
                          }
               
                          // Výstupem metody je informace, která je uložena v logické proměnné
                          return b;
                      }
                  }
              }

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

              Výstup programu

              Na následujícím výstupu programu vidíme výpis prvních 20 za sebou jdoucích prvočísel - viz Výstup programu - Kód 1.   

              Ukázka výpisu řady prvočísel v hlavní metodě programu Prvocisla

              Výstup programu - Kód 1: Ukázka výpisu řady prvočísel v hlavní metodě programu Prvocisla

              2. PrvocislaWPF

              Vytvořte aplikaci pro výpis prvních n prvočísel (prvočíslo je přirozené číslo větší než 1, které je dělitelné jen jedničkou a samo sebou) pomocí: 

              • Cyklu s podmínkou na začátku 

              Celkový počet čísel je definován uživatelem. 

              Účel příkladu
              • Změna ukazatele myši
              • Cyklus s podmínkou na začátku 
              • Podmínka 
              • Výpočet s použitím podprogramu – metoda s návratem
              • Konverze celého čísla na text 
              • Výpis textu do pole na formuláři 
              • Zavření formuláře 
              • Vlastnosti objektu 
              • Metody objektu 
                          Typ aplikace
                          • WPF aplikace
                          Popis úkolu 
                          • Výpis prvočísel 
                          Funkčnosti
                          • Při stisku tlačítka Vypiš prvočísla se provede vypsání do TextBoxu na formuláři prvních n prvočísel (celkový počet čísel vypsaných na formuláři je definován uživatelem). Řada prvočísel začíná číslem 2 (jednička není prvočíslo, neboť nemá dva dělitele). Čísla jsou testována pomocí metody s návratem, která vrací informaci, zda testované číslo je prvočíslem, nebo nikoliv. 
                          • 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 PrvocislaWPF 

                          Výsledek:


                          Výstup programu 2: Ukázka výpisu prvních 20-ti prvočísel v programu PrvocislaWPF 

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

                          V příkladu bude využit stejný princip výpočtu faktoriálu jako v příkladu Prvocisla, proto již není zapotřebí provádět detailní analýzu. 

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


                          Obrázek 1: Návrh GUI pro aplikaci PrvocislaWPF

                          Pro rozložení jednotlivých prvků použijeme Grid, který rozdělíme na 4 řádky a 2 sloupce. Do prvního řádku Grid  (s indexem 0) popisek (objekt typu Label). Ve druhém řádku se v prvním sloupci bude nacházet také popisek (Label). Do druhého sloupce umístíme TextBox, do kterého uživatel zadá počet prvočísel, která se mají na formuláři vypsat. Do třetího řádku umístíme TextBox, do kterého bude vypsána řada prvočísel o specifikovaném počtu. Do dolního řádku umístíme obě tlačítka. První tlačítko Vypiš prvočísla bude zarovnáno k levému okraji. Tlačítko však bude roztaženo do dvou sloupců (vlastnost Grid.ColumnSpan), kvůli tomu, aby se částečně nezakrývalo při zmenšení šířky formuláře na minimální rozměr (šířku sloupců Grid totiž rozdělíme poměrově). Druhé tlačítko Konec zarovnáme k pravému okraji.


                          Obrázek 2: Návrh GUI - rozložení prvků v mřížce formuláře

                          2.2. XAML

                          Na základě našich zkušeností s XAML bude již stručně popsán postup tvorby formuláře. Formulář rozdělíme na čtyřiřádky a dva sloupce. Výška prvního, druhého a čtvrtého řádku se bude přizpůsobovat obsahu vložených prvků. Třetí řádek se přizpůsobí roztažení okna - viz Kód 1. 

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

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

                          Šířka obou sloupců se budou poměrově přizpůsobovat roztažení okna - viz Kód 2. 

                          <Grid.ColumnDefinitions>
                              <ColumnDefinition Width="*"/>
                              <ColumnDefinition Width="3*"/>
                          </Grid.ColumnDefinitions>

                          Kód 2: Rozdělení Grid na sloupce

                          Do prvního řádku Grid  (s indexem 0) umístíme popisek (objekt typu Label). Popisek zarovnáme na střed prvního řádku formuláře jak v horizontální, tak i vertikální ose, tzn. že popisek roztáhneme do obou sloupců (vlastnost Grid.ColumnSpan). Písmo nastavíme na tučné a nastavíme velikost podle následujícího kódu - viz Kód 3.

                          <Label Content="Výpis prvních n prvočísel" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" FontWeight="Bold" Grid.ColumnSpan="2"/>
                          

                          Kód 3: Popisek (objekt typu Label)

                          Do druhého řádku Grid v prvním sloupci umístíme další popisek (Label). Do druhého sloupce ve stejném řádku umístíme TextBox, do kterého uživatel zadá počet prvočísel, která se mají na formuláři vypsat - viz Kód 4. Tento objekt vystředíme ve vertikální ose a doplníme ho textem "?", aby uživatel při spuštění aplikace tušil, že má do formuláře zadat počet vypisovaných prvočísel.

                          <Label Content="Zadejte n:" Grid.Row="1" HorizontalAlignment="Right" Margin="5"/>
                          <TextBox Name="TxtN" Text="?" Grid.Row="1" Grid.Column="1" Margin="5" VerticalAlignment="Center"/>

                          Kód 4: Druhý řádek Grid - popisek (Label) a vstupní pole pro zadání počtu prvočísel (TextBox)

                          Do dalšího řádku Grid umístíme TextBox, ve kterém budou po stisku tlačítka vypsána všechna prvočísla řady o specifikované délce.  Řada prvočísel může být delší, než šířka okna, proto umožníme v TextBox zalamování textu (vlastnost TextWrapping). Protože řada může být delší než výška okna, umožníme uživateli posouvat (scrolovat) obsah ve vertikálním směru (vlastnost VerticalScrollBarVisibility). Objekt TextBox roztáhneme do obou sloupců (Grid.ColumnSpan). Objekt nastavíme pouze pro výpis, podbarvíme pozadí a nastavíme další vlastnosti podle následujícího zdrojového kódu - viz Kód 5.

                          <TextBox Name="TxtPrvocisla" Grid.Row="2" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" FontSize="14" VerticalScrollBarVisibility="Auto" 
                                   IsReadOnly="True" Background="AliceBlue"/>

                          Kód 5: Třetí řádek Grid - výstupní pole pro výpis řady prvočísel (TextBox)

                          V posledním řádku se budou nacházet dvě tlačítka. První tlačítko bude po stisknutí zajišťovat testování a výpis řady nalezených prvočísel v definovém počtu. Tlačítko Vypiš prvočísla bude zarovnáno k levému okraji. Tlačítko však bude roztaženo do dvou sloupců (vlastnost Grid.ColumnSpan), kvůli tomu, aby se částečně nezakrývalo při zmenšení šířky formuláře na minimální rozměr (šířku sloupců Grid totiž rozdělíme poměrově). Druhé tlačítko Konec zarovnáme k pravému okraji a umístíme ho do druhého sloupce Grid. U obou tlačítek nastavíme vnitřní okraje (vlastnost Padding) a také vnější okraje (vlastnost Margin) u obou objektů.  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.

                          <Button Name="BtnVypis" Content="Vypiš prvočísla" Width="120" Grid.Row="3" Grid.ColumnSpan="2" Margin="10" Padding="5" HorizontalAlignment="Left" Click="BtnVypis_Click"/>
                          <Button Name="BtnKonec" Content="Konec" Width="120" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Right" Margin="10" Padding="5" Click="BtnKonec_Click"/>

                          Kód 6: Čtvrtý řádek Grid - tlačítko pro výpis řady prvočísel a tlačítko pro ukončení aplikace

                          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
                          • Label
                          • TextBox
                            • TxtN
                            • TxtPrvocisla
                          • Button
                            • BtnVypis
                            • 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="Výpis prvočísel" Height="450" Width="600" MinHeight="300" MinWidth="400">
                          

                          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="*"/>
                              <RowDefinition Height="Auto"/>
                          </Grid.RowDefinitions>
                           
                          <Grid.ColumnDefinitions>
                              <ColumnDefinition Width="*"/>
                              <ColumnDefinition Width="3*"/>
                          </Grid.ColumnDefinitions>
                           
                          <Label Content="Výpis prvních n prvočísel" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" FontWeight="Bold" Grid.ColumnSpan="2"/>
                          <Label Content="Zadejte n:" Grid.Row="1" HorizontalAlignment="Right" Margin="5"/>
                          <TextBox Name="TxtN" Text="?" Grid.Row="1" Grid.Column="1" Margin="5" VerticalAlignment="Center"/>
                          <TextBox Name="TxtPrvocisla" Grid.Row="2" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" FontSize="14" VerticalScrollBarVisibility="Auto" 
                                   IsReadOnly="True" Background="AliceBlue"/>
                           
                          <Button Name="BtnVypis" Content="Vypiš prvočísla" Width="120" Grid.Row="3" Grid.ColumnSpan="2" Margin="10" Padding="5" HorizontalAlignment="Left"/>
                          <Button Name="BtnKonec" Content="Konec" Width="120" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Right" Margin="10" Padding="5"/>

                          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:

                          • BtnVypis_Click
                          • BtnKonec_Click
                          Do regionu Výpočty umístíme metodu, která bude testovat, zda dané číslo je prvočíslo.

                          Načtení počtu prvočísel v řadě je provedeno pomocí vlastnosti Text objektu TxtN na formuláři. Pokud nelze provést konverzi, nebo platí druhá podmínka, že číslo bylo záporné (negace obou podmínek spojených pomocí logického operátoru a zároveň), je zobrazeno varovné dialogové okno s výzvou pro zadání validní hodnoty počtu čísel v řadě a je opuštěna obsluha události Click tlačítka BtnVypis. Hodnota z formuláře je pomocí výstupního parametru metody TryParse uložena do celočíselné proměnné pocetCisel - viz Kód 1. Inicializace proměnných počtu nalezených čísel n, byla provedena přímo v deklarace (počet je na začátku nulový). Dále musí být inicializována hodnota v proměnné i (čítač), do které budeme ukládat testované číslo, které může být prvočíslem, nebo nikoliv. 

                          Před prováděním testu v cyklu while (zda již byl vypsán požadovaný počet prvočísel) je provedeno vypnutí funkčnosti kurzoru myši, tzn. během provádění cyklu nelze klikat myší na tlačítka proto, dříve než cyklus proběhne (vlastnost OverrideCursor). Funkčnost kurzoru bude zapnuta až po proběhnutí cyklu a výpisu výsledné řady prvočísel na formulář. 

                          Testování, zda je aktuální číslo prvočíslem, probíhá pomocí volání metody s logickým návratem Prvocislo. Této metodě je předáno aktuální testované číslo uložené ve skutečném parametru i. Pokud návrat metody je true, je testované číslo prvočíslem a musí být zvýšen počet nalezených prvočísel o hodnotu 1 (inkrementace n++;). Toto číslo musí také být konvertováno na číslici a následně zapsáno do řady již nalezených čísel, která jsou zapsána v proměnné vystup. Jednotlivé číslice jsou od sebe odděleny čárkou, proto se uvnitř těla cyklu nalézá ještě další podmínka testující, zda se nenacházíme u posledního prvočísla v řadě, u kterého se již žádná čárka připojovat nebude. Na konci iterace je zvýšeno testované číslo o hodnotu 1 (inkrementace i++;)

                          private void BtnVypis_Click(object sender, RoutedEventArgs e)
                          {
                              /* Deklarace: 'pocetCisel' ... počet prvočísel, která mají být vypsána; 
                               * 'n' ... počet nalezených prvočísel - inicializace; 'i' ... testované číslo 
                               * na prvočíslo (čítač) - inicializace; 'vystup' ... textová proměnná, do které 
                               * budeme ukládat výsledek - inicializace */
                              int pocetCisel;
                              int n = 0;
                              int i = 2;
                              string vystup = "";
                           
                              if (!((Int32.TryParse(this.TxtN.Text, out pocetCisel)) && (pocetCisel > 0)))
                              {
                                  // Zobrazení varovného dialogového okna
                                  MessageBox.Show("Zadejte platnou kladnou celočíselnou hodnotu pro počet čísel.", "Varování", 
                                      MessageBoxButton.OK, MessageBoxImage.Warning);
                                  return;
                              }
                           
                              // Vypnutí funkčnosti kurzoru (nelze klikat)
                              Mouse.OverrideCursor = Cursors.Wait;
                           
                              // Vymazání předchozí vypsané řady
                              this.TxtPrvocisla.Text = "";
                           
                              // Cyklus - pokud platí, že je nalezeno méně než specifikovaný počet prvočísel
                              while (n < pocetCisel)
                              {
                                  // Pokud návrat zavolané funkce testu na prvočíslo u testovaného čísla je pravda
                                  if (Prvocislo(i))
                                  {
                                      // Zvýšeni hodnoty poctu nalezených prvočísel o 1
                                      n++;
                           
                                      // Připojení číslice (testovaného čísla konvertovaného na text) k předchozím
                                      vystup += i.ToString();
                           
                                      // Pokud není vypsán požadovaný počet prvočísel
                                      if (n < pocetCisel)
                                      {
                                          // Připoj za číslo čárku
                                          vystup += ", ";
                                      }
                                  }
                           
                                  // Nové testované číslo, které je o 1 vyšší než předchozí
                                  i++;
                              }

                          Kód 1: Deklarace metody pro výpis řady prvočísel o definované délce (BtnVypis_Click)

                          V regionu Výpočtu nalezneme deklaraci metody Prvocislo s logickým návratem (datový typ bool) vidíme, že ještě před testováním formálního parametru n předaného hodnotou je provedena inicializace u obou proměnných - na začátku prohlásíme testované číslo prvočíslem a prvním dělitelem je číslo 2 - viz Kód 2. V cyklu while je provedeno testování na dělení beze zbytku, které bylo popsáno již v předchozí kapitole. Pokud bylo číslo dělitelné beze zbytku alespoň nějakým dělitelem, toto číslo není prvočíslem (b = false;).

                          // Metoda s návratem - návrat, zda je předané číslo prvočíslo (true), nebo nikoliv (false)
                          private bool Prvocislo(int n)
                          {
                              /* Deklarace (inicializace): 'b' ... informace, zda je testované (předané) číslo 
                               * prvočíslem (true - je prvočíslem); 'i' ... dělitel (čítač) */
                              bool b = true;
                              int i = 2;
                           
                              // Cyklus - dokud platí, že testované číslo je prvočíslo a čítač je menší než testované číslo
                              while (b == true && i < n)
                              {
                                  // Pokud testované číslo je dělitelné beze zbytku
                                  if (n % i == 0)
                                  {
                                      // Testované číslo není prvočíslo
                                      b = false;
                                  }
                           
                                  // Inkrementace
                                  i++;
                              }
                           
                              // Výstupem metody je informace, která je uložena v logické proměnné
                              return b;
                          }

                          Kód 2: Deklarace soukromé metody s logickým návratem pro testování, zda je předané číslo prvočíslem (Prvocislo)

                          Poslední metodou, 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="PrvocislaWPF.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:PrvocislaWPF"
                                  mc:Ignorable="d"
                                  Title="Výpis prvočísel" Height="450" Width="600" MinHeight="300" MinWidth="400">
                              <Grid>
                                  <Grid.RowDefinitions>
                                      <RowDefinition Height="Auto"/>
                                      <RowDefinition Height="Auto"/>
                                      <RowDefinition Height="*"/>
                                      <RowDefinition Height="Auto"/>
                                  </Grid.RowDefinitions>
                           
                                  <Grid.ColumnDefinitions>
                                      <ColumnDefinition Width="*"/>
                                      <ColumnDefinition Width="3*"/>
                                  </Grid.ColumnDefinitions>
                           
                                  <Label Content="Výpis prvních n prvočísel" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" FontWeight="Bold" Grid.ColumnSpan="2"/>
                                  <Label Content="Zadejte n:" Grid.Row="1" HorizontalAlignment="Right" Margin="5"/>
                                  <TextBox Name="TxtN" Text="?" Grid.Row="1" Grid.Column="1" Margin="5" VerticalAlignment="Center"/>
                                  <TextBox Name="TxtPrvocisla" Grid.Row="2" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" FontSize="14" VerticalScrollBarVisibility="Auto" 
                                           IsReadOnly="True" Background="AliceBlue"/>
                           
                                  <Button Name="BtnVypis" Content="Vypiš prvočísla" Width="120" Grid.Row="3" Grid.ColumnSpan="2" Margin="10" Padding="5" HorizontalAlignment="Left" Click="BtnVypis_Click"/>
                                  <Button Name="BtnKonec" Content="Konec" Width="120" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Right" Margin="10" Padding="5" Click="BtnKonec_Click"/>
                              </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 PrvocislaWPF
                          {
                              /// <summary>
                              /// Interaction logic for MainWindow.xaml
                              /// </summary>
                              public partial class MainWindow : Window
                              {
                                  public MainWindow()
                                  {
                                      InitializeComponent();
                                  }
                           
                                  #region Výpočty
                           
                                  // Metoda s návratem - návrat, zda je předané číslo prvočíslo (true), nebo nikoliv (false)
                                  private bool Prvocislo(int n)
                                  {
                                      /* Deklarace (inicializace): 'b' ... informace, zda je testované (předané) číslo 
                                       * prvočíslem (true - je prvočíslem); 'i' ... dělitel (čítač) */
                                      bool b = true;
                                      int i = 2;
                           
                                      // Cyklus - dokud platí, že testované číslo je prvočíslo a čítač je menší než testované číslo
                                      while (b == true && i < n)
                                      {
                                          // Pokud testované číslo je dělitelné beze zbytku
                                          if (n % i == 0)
                                          {
                                              // Testované číslo není prvočíslo
                                              b = false;
                                          }
                           
                                          // Inkrementace
                                          i++;
                                      }
                           
                                      // Výstupem metody je informace, která je uložena v logické proměnné
                                      return b;
                                  }
                           
                                  #endregion
                           
                           
                                  #region Události
                           
                                  private void BtnVypis_Click(object sender, RoutedEventArgs e)
                                  {
                                      /* Deklarace: 'pocetCisel' ... počet prvočísel, která mají být vypsána; 
                                       * 'n' ... počet nalezených prvočísel - inicializace; 'i' ... testované číslo 
                                       * na prvočíslo (čítač) - inicializace; 'vystup' ... textová proměnná, do které 
                                       * budeme ukládat výsledek - inicializace */
                                      int pocetCisel;
                                      int n = 0;
                                      int i = 2;
                                      string vystup = "";
                           
                                      if (!((Int32.TryParse(this.TxtN.Text, out pocetCisel)) && (pocetCisel > 0)))
                                      {
                                          // Zobrazení varovného dialogového okna
                                          MessageBox.Show("Zadejte platnou kladnou celočíselnou hodnotu pro počet čísel.", "Varování", 
                                              MessageBoxButton.OK, MessageBoxImage.Warning);
                                          return;
                                      }
                           
                                      // Vypnutí funkčnosti kurzoru (nelze klikat)
                                      Mouse.OverrideCursor = Cursors.Wait;
                           
                                      // Vymazání předchozí vypsané řady
                                      this.TxtPrvocisla.Text = "";
                           
                                      // Cyklus - pokud platí, že je nalezeno méně než specifikovaný počet prvočísel
                                      while (n < pocetCisel)
                                      {
                                          // Pokud návrat zavolané funkce testu na prvočíslo u testovaného čísla je pravda
                                          if (Prvocislo(i))
                                          {
                                              // Zvýšeni hodnoty poctu nalezených prvočísel o 1
                                              n++;
                           
                                              // Připojení číslice (testovaného čísla konvertovaného na text) k předchozím
                                              vystup += i.ToString();
                           
                                              // Pokud není vypsán požadovaný počet prvočísel
                                              if (n < pocetCisel)
                                              {
                                                  // Připoj za číslo čárku
                                                  vystup += ", ";
                                              }
                                          }
                           
                                          // Nové testované číslo, které je o 1 vyšší než předchozí
                                          i++;
                                      }
                           
                                      // Výpis řady na formulář
                                      this.TxtPrvocisla.Text = vystup;
                           
                                      // Zapnutí funkčnosti kurzoru
                                      Mouse.OverrideCursor = null;
                                  }
                           
                                  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 obrázku vidíme výstup naší aplikace pro výpis řady prvočísel oddělených čárkami o zadaném počtu čísel, která má tato řada obsahovat - viz Výstup programu - Kód 1 a 2. Výpis je spuštěn pomocí stisknutí tlačítka Vypiš prvočísla umístěného v levém dolním rohu formuláře. Aplikaci lze ukončit pomocí tlačítka Konec, nebo pomocí zavíracího tlačítka umístěného v pravém rohu aplikace.

                          Výstup programu - Kód 1 a 2: Výpis řady prvočísel o specifikované délce