Povrch a objem koule
| Stránky: | Moodle ZČU |
| Kurz: | KPV/TI Technická informatika ve strojírenství - šablona |
| Kniha: | Povrch a objem koule |
| Vytiskl(a): | Nepřihlášený host |
| Datum: | pondělí, 9. listopadu 2026, 14.08 |
1. PovrchObjemKoule
Vytvořte aplikaci pro výpočet povrchu a objemu koule pomocí funkcí, procedur a bez využití podprogramu.
Účel příkladu
- Výpočet bez použití podprogramu
- Výpočet s použitím podprogramu – metoda s návratem (funkce), metoda bez návratu (procedura)
Typ aplikace
- Konzolová aplikace
Popis úkolu
- Vypočtení povrchu a objemu koule
Funkčnosti
- Po načtení poloměru koule (reálného čísla) se provede výpočet povrchu a objemu koule a to následujícími způsoby:
- Výpočet povrchu a objemu koule bez volání podprogramu
- Výpočet povrchu a objemu koule pomocí zavolané metody (funkce):
- S návratem
- Se dvěma návraty
- Metody orientované na výraz
- Výpočet povrchu a objemu koule pomocí zavolané metody bez návratu (procedura):
- Výpis vypočtených hodnot uvnitř metody
- Předání vypočtených hodnot pomocí parametrů předaných odkaze
- Předání vypočtených hodnot pomocí výstupních parametrů metody
- Vypočtené hodnoty vypište v hlavní metodě (kromě jedné metody bez návratu, kde hodnoty budou vypsány uvnitř této metody)
Výstup programu

Výstup programu: Ukázka výpisu v hlavní metodě programu PovrchObjemKoule
1.1. Analýza a návrh řešení
Příklad popisuje výpočet povrchu (
) a objemu (
) koule. V hlavním programu má být využit výpočet povrchu a objemu koule bez volání podprogramu a s voláním podprogramu - viz Obrázek 1. Jako první krok ve vývojovém diagramu je výpočet povrchu a objemu koule se zadaným reálným poloměrem bez volání jakéhokoliv podprogramu. Ve výpisu jsme od sebe záměrně oddělili jednotlivé sekce volání podprogramů. Další krokem je volání deklarovaných podprogramů ve formě funkcí. Nástroj Flowgorithm v současné době nedisponuje předávání parametrů odkazem, proto ve vývojovém diagramu využijeme pouze volání deklarovaného podprogramu bez návratu (procedury).

Obrázek 1: Vývojový diagram algoritmu PovrchObjemKoule
Na následujícím obrázku vidíme deklaraci podprogramu PovrchKoule, která obsahuje jeden formální parametr předávaný hodnotou, do kterého je uložena reálná hodnota poloměru koule - viz Obrázek 2. Návratem této funkce je reálná vypočtená hodnota povrchu koule. Ve výpočtu povrchu je použita konstanta Pi.

Obrázek 2: Podprogram PovrchKoule (funkce)
V další deklaraci podprogramu pro výpočet objemu koule je využit stejný princip podprogramu (funkce) - viz Obrázek 3.

Obrázek 3: Podprogram ObjemKoule (funkce)
Poslední deklarací algoritmu je podprogram bez návratu, v němž jsou vypsány obě vypočtené hodnoty - povrchu a objemu - viz Obrázek 4. Tyto hodnoty tedy nejsou, na rozdíl od předchozích funkcí, předány zpět do hlavního programu.

Obrázek 4: Podprogram PovrchObjemKoule (procedura)
1.2. C#
Následující zdrojový kód v C# pro konzolovou aplikaci je transformací algoritmu PovrchObjemKoule - viz Kód 1. Hlavní statická metoda v sobě zahrnuje výpočet povrchu a objemu koule ze zadaného poloměru koule bez použití volání jiné metody. Jednotlivé sekce volání statických metod (metody musí být uvedeny jako statické, protože jsou volány z hlavní metody, která je také statická) jsou od sebe odděleny výpisy, abychom věděli, která část zdrojového kódu byla pro výpočet použita.
static void Main(string[] args) { /* Deklarace: 'r' ... poloměr koule (parametr); 's' ... plocha * koule (proměnná); 'v' ... objem koule (proměnná) */ double r, s, v; //Výzva k zadání poloměru koule Console.Write("Zadejte poloměr koule: "); //Načtení poloměru koule (konverze načtených číslic na reálné číslo) r = int.Parse(Console.ReadLine()); //Sekce pro výpočet povrchu a objemu koule bez volání podprogramu Console.WriteLine("- Výpočet povrchu a objemu koule bez podprogramu -"); //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = (4.0 / 3.0) * Math.PI * r * r * r; //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metody s návratem Console.WriteLine("- Metody s návratem -"); //Volání metody s návratem pro výpočet povrchu koule s = PovrchKouleMetodaSNavratem(r); //Volání metody s návratem pro výpočet objemu koule v = ObjemKouleMetodaSNavratem(r); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metodu se dvěma návraty Console.WriteLine("- Metody s dvěma návraty -"); //Volání metody se dvěma návraty - návrat povrchu a objemu koule (s, v) = PovrchObjemKouleMetodaDvaNavraty(r); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metody orientované na výraz Console.WriteLine("- Metody orientované na výraz -"); //Volání metody orientované na výraz - povrch koule s = PovrchKouleMetodaVyraz(r); //Volání metody orientované na výraz - objem koule v = ObjemKouleMetodaVyraz(r); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metodu bez návratu - výpis uvnitř metody Console.WriteLine("- Metoda bez návratu -"); /* Volání metody bez návratu (výpis vypočteného povrchu a objemu * koule uvnitř metody */ PovrchObjemKouleMetodaBezNavratu(r); //Sekce pro metodu bez návratu - předání parametrů odkazem Console.WriteLine("- Metoda bez návratu - předání parametrů odkazem -"); //Volání metody bez návratu - předání vypočtených parametrů odkazem PovrchObjemKoulePredaniOdkazem(r, ref s, ref v); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metodu bez návratu - výstupní parametry Console.WriteLine("- Metoda bez návratu - výstupní parametry -"); /* Volání metody bez návratu - výstupní parametry - inicializace * parametrů (povrchu a objemu koule) je provedeno uvnitř metody */ PovrchObjemKouleVystupniParametry(r, out s, out v); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 1: Program PovrchObjemKoule - deklarace hlavní statické metody Main
Jako první si uveďme deklaraci statické metody s návratem s názvem PovrchKouleMetodaSNavratem, která přijímá jeden formální parametr r - viz Kód 2. Tento parametr je předán hodnotou, to tedy znamená, že do tohoto parametru je pouze zkopírována hodnota a tento parametr po provedení metody zanikne. V metodě je deklarována lokální proměnná s, do které je přiřazena vypočtená hodnota povrchu koule. Ve výpočtu (výrazu) je použita třída Math, která nám umožní použít reálnou konstantu PI (použití tečkové notace). Klíčové slovo return nám zajistí přiřazení vypočtené hodnoty do výstupu této deklarované metody.
//Statická metoda s návratem vypočteného povrchu koule //'r' ... poloměr koule (formální parametr předaný hodnotou) static double PovrchKouleMetodaSNavratem(double r) { //Deklarace proměnné: 's' ... povrch koule double s; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) s = 4 * Math.PI * r * r; //Návrat vypočteného povrchu return s; }
Kód 2: Deklarace statické metody s návratem s názvem PovrchKouleMetodaSNavratem
Předchozí zdrojový kód může být značně redukován - viz Kód 3. Lze vypustit deklaraci lokální proměnné a výraz lze přiřadit přímo do výstupu metody. Ve výpočtu je také použito násobení parametru r (umocnění na druhou). Tento výpočet bychom také mohli nahradit použitím metody Pow umožňující umocnění parametru na zadaný exponent (tuto metodu je vhodné použít zejména u vyšších mocnin). Tato metoda je implementována také ve třídě Math.
static double PovrchKouleMetodaSNavratem(double r) { //Návrat vypočteného povrchu return 4 * Math.PI * Math.Pow(r,2); }
Kód 3: Redukovaný zdrojový kód deklarace statické metody s návratem s názvem PovrchKouleMetodaSNavratem
Následující statické metoda s návratem pro výpočet objemu koule, je založena na stejném principu jako předchozí metoda - viz Kód 4. Musíme však dát pozor na podíl, kterým násobíme ve výrazu. Výsledek podílu 4.0 / 3.0, kde dělíme dvě reálná čísla, je reálná hodnota. Pokud bychom však použili v podílu např. obě celá čísla, tj. 4 / 3, znamenalo by to, že výsledek takové aritmetické operace bude celé číslo - jednalo by se o celočíselné dělení.
Pokud bychom chtěli ve výrazu použít podíl čísel 4 / 3 a požadovali bychom jako výsledek této aritmetické operace reálné číslo, museli bychom přetypovat výsledek tohoto podílu na odpovídající datový typ např. na typ double, tj. ((double) 4 / 3). Je také možné využít literál pro specifikaci datového typu reálného čísla, např. typ float, tj. (4f / 3).
//Statická metoda s návratem vypočteného objemu koule //'r' ... poloměr koule (formální parametr předaný hodnotou) static double ObjemKouleMetodaSNavratem(double r) { //Deklarace proměnné: 'v' ... objem koule double v; //Výpočet objemu koule (použití konstanty PI ve třídě Math) v = 4.0 / 3.0 * Math.PI * r * r * r; //Návrat vypočteného objemu return v; }
Kód 4: Deklarace statické metody s návratem s názvem ObjemKouleMetodaSNavratem
Další deklarovanou statickou metodou, tentokrát ale s dvěma návraty, je PovrchObjemKouleMetodaDvaNavraty - viz Kód 5. Tato metoda v posledním příkazu těla metody přiřazuje do výstupu metody obě vypočtené hodnoty povrchu a objemu koule. Tyto dva výstupy musí být deklarovány v závorce. Zároveň musí být uveden v závorce datový typ u obou těchto návratu v rámci hlavičky metody.
//Statická metoda s dvěma návraty - povrch a objem koule static (double, double) PovrchObjemKouleMetodaDvaNavraty(double r) { //Deklarace proměnných: 's' ... povrch koule, 'v' ... objem koule double s, v; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) s = 4 * Math.PI * r * r; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) v = (4.0 / 3.0) * Math.PI * r * r * r; //Návrat hodnot uložených ve dvou proměnných return (s, v); }
Kód 5: Deklarace statické metody s dvěma návraty s názvem PovrchObjemKouleMetodaDvaNavraty
Další možností, jak vypočítat povrch koule, je použít metodu orientovanou na výraz. Tato metoda používá pro operátor => za který umístíme návrat této metody - viz Kód 6. Zápis je tedy velmi strohý.
//Statická metoda orientovaná na výraz pro výpočet povrchu koule static double PovrchKouleMetodaVyraz(double r) => 4 * Math.PI * r * r;
Kód 6: Deklarace statické metody orientované na výraz s názvem PovrchKouleMetodaVyraz
Metodu orientovanou na výraz také použijeme pro výpočet objemu koule - viz Kód 7.//Statická metoda orientovaná na výraz pro výpočet objemu koule static double ObjemKouleMetodaVyraz(double r) => 4.0 / 3.0 * Math.PI * r * r * r;
Kód 7: Deklarace statické metody orientované na výraz s názvem ObjemKouleMetodaVyraz
V další části této kapitoly si nadeklarujeme metody bez návratu. V první takové metodě vypíšeme vypočtené hodnoty přímo ve volané metodě - viz Kód 8. V následujícím zdrojovém kódu je zachycena podstata takové metody, která po vypočtení hodnoty povrchu koule přiřadí tuto hodnotu do lokální proměnné. To samé provede i s vypočteným objemem koule. Posledním příkazem této metody je výpis obou vypočtených hodnot.
//Statická metoda bez návratu - vypočtení povrchu a objemu koule a výpis jejich hodnot //'r' ... poloměr koule (formální parametr předaný hodnotou) static void PovrchObjemKouleMetodaBezNavratu(double r) { //Deklarace proměnných: 's' ... povrch koule, 'v' ... objem koule double s, v; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) s = 4 * Math.PI * r * r; //Výpočet objemu koule (použití konstanty PI ve třídě Math) v = 4.0 / 3.0 * Math.PI * r * r * r; //Výpis vypočteného porvchu a objemu koule uložených v lokálních proměnných Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); }
Kód 8: Deklarace statické metody bez návratu s názvem PovrchObjemKouleMetodaBezNavratu
U metody bez návratu lze pro výstup některého z formálních parametrů použít předání parametru pomocí odkazu (pomocí klíčového slova ref umístěného před identifikátor parametru) - viz Kód 9. Jak vidíme, není zapotřebí specifikovat jakýkoliv návrat metody. Klíčové slovo ref musí být uvedeno i při volání této deklarované metody v hlavní metodě.
/* Statická metoda bez návratu - předání parametrů odkazem, tj. vypočteného povrchu * a objemu koule */ /* Deklarace parametrů: 'r' ... poloměr koule (formální parametr předaný hodnotou); * 's' ... povrch koule (formální parametr předaný odkazem); 'v' ... objem koule * (formální parametr předaný odkazem) */ static void PovrchObjemKoulePredaniOdkazem(double r, ref double s, ref double v) { //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = 4.0 / 3.0 * Math.PI * r * r * r; }
Kód 9: Deklarace statické metody bez návratu s názvem PovrchObjemKoulePredaniOdkazem (předání parametrů odkazem)
Poslední statickou metodou je metoda s výstupními parametru. Tato metoda využívá inicializace formálních parametrů v metodě a výstup těchto parametrů je zajištěn pomocí klíčového slova out umístěného před identifikátor parametru - viz Kód 10. Klíčové slovo out musí být uvedeno i při volání této deklarované metody v hlavní metodě.
/* Statická metoda bez návratu - výstupní parametry, tj. vypočtený povrch a objem * koule */ /* Deklarace parametrů: 'r' ... poloměr koule (formální parametr předaný hodnotou); * 's' ... povrch koule (výstupní formální parametr); 'v' ... objem koule (výstupní * formální parametr) */ static void PovrchObjemKouleVystupniParametry(double r, out double s, out double v) { //Výpočet povrchu koule - inicializace výstupního parametru s = 4 * Math.PI * r * r; //Výpočet objemu koule - inicializace výstupního parametru v = (4.0 / 3.0) * Math.PI * r * r * r; }
Kód 10: Deklarace statické metody bez návratu s výstupními parametry s názvem PovrchObjemKouleVystupniParametry
Výstup programu
Na následujícím výstupu programu vidíme výpis vypočtených hodnot povrchu a objemu koule pro zadaný poloměr - viz Výstup programu - Kód 1. Jednotlivé výpisy jsou rozděleny do různých sekcí, abychom věděli, která metoda byla pro výpočet použita. Po provedení výpisu konzolová aplikace čeká na stisk klávesy, aby se po stisku mohla následně ukončit.

Výstup programu - Kód 1: Ukázka výpisu hodnot v hlavní metodě programu PovrchObjemKoule
1.3. Výsledný kód
Výsledný kód
Následující zdrojový kód je kompletací předešlých zdrojových kódů programu PovrchObjemKoule, 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 PovrchObjemKoule { class Program { static void Main(string[] args) { /* Deklarace: 'r' ... poloměr koule (parametr); 's' ... plocha * koule (proměnná); 'v' ... objem koule (proměnná) */ double r, s, v; //Výzva k zadání poloměru koule Console.Write("Zadejte poloměr koule: "); //Načtení poloměru koule (konverze načtených číslic na reálné číslo) r = int.Parse(Console.ReadLine()); //Sekce pro výpočet povrchu a objemu koule bez volání podprogramu Console.WriteLine("- Výpočet povrchu a objemu koule bez podprogramu -"); //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = (4.0 / 3.0) * Math.PI * r * r * r; //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metody s návratem Console.WriteLine("- Metody s návratem -"); //Volání metody s návratem pro výpočet povrchu koule s = PovrchKouleMetodaSNavratem(r); //Volání metody s návratem pro výpočet objemu koule v = ObjemKouleMetodaSNavratem(r); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metodu se dvěma návraty Console.WriteLine("- Metody s dvěma návraty -"); //Volání metody se dvěma návraty - návrat povrchu a objemu koule (s, v) = PovrchObjemKouleMetodaDvaNavraty(r); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metody orientované na výraz Console.WriteLine("- Metody orientované na výraz -"); //Volání metody orientované na výraz - povrch koule s = PovrchKouleMetodaVyraz(r); //Volání metody orientované na výraz - objem koule v = ObjemKouleMetodaVyraz(r); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metodu bez návratu - výpis uvnitř metody Console.WriteLine("- Metoda bez návratu -"); /* Volání metody bez návratu (výpis vypočteného povrchu a objemu * koule uvnitř metody */ PovrchObjemKouleMetodaBezNavratu(r); //Sekce pro metodu bez návratu - předání parametrů odkazem Console.WriteLine("- Metoda bez návratu - předání parametrů odkazem -"); //Volání metody bez návratu - předání vypočtených parametrů odkazem PovrchObjemKoulePredaniOdkazem(r, ref s, ref v); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Sekce pro metodu bez návratu - výstupní parametry Console.WriteLine("- Metoda bez návratu - výstupní parametry -"); /* Volání metody bez návratu - výstupní parametry - inicializace * parametrů (povrchu a objemu koule) je provedeno uvnitř metody */ PovrchObjemKouleVystupniParametry(r, out s, out v); //Výpis vypočteného porvchu a objemu koule Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); } //Statická metoda s návratem vypočteného povrchu koule //'r' ... poloměr koule (formální parametr předaný hodnotou) static double PovrchKouleMetodaSNavratem(double r) { //Deklarace proměnné: 's' ... povrch koule double s; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) s = 4 * Math.PI * r * r; //Návrat vypočteného povrchu return s; } //Statická metoda s návratem vypočteného objemu koule //'r' ... poloměr koule (formální parametr předaný hodnotou) static double ObjemKouleMetodaSNavratem(double r) { //Deklarace proměnné: 'v' ... objem koule double v; //Výpočet objemu koule (použití konstanty PI ve třídě Math) v = 4.0 / 3.0 * Math.PI * r * r * r; //Návrat vypočteného objemu return v; } //Statická metoda s dvěma návraty - povrch a objem koule static (double, double) PovrchObjemKouleMetodaDvaNavraty(double r) { //Deklarace proměnných: 's' ... povrch koule, 'v' ... objem koule double s, v; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) s = 4 * Math.PI * r * r; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) v = (4.0 / 3.0) * Math.PI * r * r * r; //Návrat hodnot uložených ve dvou proměnných return (s, v); } //Statická metoda orientovaná na výraz pro výpočet povrchu koule static double PovrchKouleMetodaVyraz(double r) => 4 * Math.PI * r * r; //Statická metoda orientovaná na výraz pro výpočet objemu koule static double ObjemKouleMetodaVyraz(double r) => 4.0 / 3.0 * Math.PI * r * r * r; //Statická metoda bez návratu - vypočtení povrchu a objemu koule a výpis jejich hodnot //'r' ... poloměr koule (formální parametr předaný hodnotou) static void PovrchObjemKouleMetodaBezNavratu(double r) { //Deklarace proměnných: 's' ... povrch koule, 'v' ... objem koule double s, v; //Výpočet povrchu koule (použití konstanty PI ve třídě Math) s = 4 * Math.PI * r * r; //Výpočet objemu koule (použití konstanty PI ve třídě Math) v = 4.0 / 3.0 * Math.PI * r * r * r; //Výpis vypočteného porvchu a objemu koule uložených v lokálních proměnných Console.WriteLine("Povrch koule je: {0} a objem koule je: {1} ", s, v); } /* Statická metoda bez návratu - předání parametrů odkazem, tj. vypočteného povrchu * a objemu koule */ /* Deklarace parametrů: 'r' ... poloměr koule (formální parametr předaný hodnotou); * 's' ... povrch koule (formální parametr předaný odkazem); 'v' ... objem koule * (formální parametr předaný odkazem) */ static void PovrchObjemKoulePredaniOdkazem(double r, ref double s, ref double v) { //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = 4.0 / 3.0 * Math.PI * r * r * r; } /* Statická metoda bez návratu - výstupní parametry, tj. vypočtený povrch a objem * koule */ /* Deklarace parametrů: 'r' ... poloměr koule (formální parametr předaný hodnotou); * 's' ... povrch koule (výstupní formální parametr); 'v' ... objem koule (výstupní * formální parametr) */ static void PovrchObjemKouleVystupniParametry(double r, out double s, out double v) { //Výpočet povrchu koule - inicializace výstupního parametru s = 4 * Math.PI * r * r; //Výpočet objemu koule - inicializace výstupního parametru v = (4.0 / 3.0) * Math.PI * r * r * r; } } }
Kód 1: Program PovrchObjemKoule - deklarace hlavní statické metody Main včetně deklarací dalších metod
2. PovrchObjemKouleWPF
Vytvořte aplikaci pro výpočet povrchu a objemu koule pomocí funkcí, procedury a bez využití podprogramu.
Účel příkladu
- Výpočet bez použití podprogramu
- Výpočet s použitím podprogramu – využití různých typů metod a předáním výstupních parametrů odkazem
Typ aplikace
- WPF aplikace
Popis úkolu
- Vypočtení objemu a povrchu koule
Funkčnosti
- Při spuštění aplikace bude v objektu poloměru koule vypsán počáteční text "Zadejte poloměr"
- Při přepnutí se (zacílení objektu) na poloměr koule, bude vymazán počáteční text "Zadejte poloměr", pokud objekt tento text obsahuje
- Pokud při opuštění objektu poloměru nebude vyplněn poloměr, vypíše se do tohoto objektu text "Zadejte poloměr"
- Při stisku tlačítka Metoda se provede výpočet objemu a povrchu koule ze zadaného poloměru koule bez volání dalšího podprogramu (metody bez návratu)
- Při stisku tlačítka Metoda - návrat se provede výpočet objemu a povrchu koule ze zadaného poloměru koule pomocí zavolané funkce (metody s návratem)
- Při stisku tlačítka Metoda - výraz se provede výpočet objemu a povrchu koule ze zadaného poloměru koule pomocí zavolaného podprogramu (metody orientované na výraz)
- Při stisku tlačítka Metoda - výstupní parametry se provede výpočet objemu a povrchu koule ze zadaného poloměru koule pomocí zavolaného podprogramu (metoda s výstupními parametry)
- Při stisku tlačítka Metoda - 2 návraty se provede výpočet objemu a povrchu koule ze zadaného poloměru koule pomocí zavolaného podprogramu (metoda se dvěma návraty)
- Při stisku tlačítka Metoda - reference se provede výpočet objemu a povrchu koule ze zadaného poloměru koule pomocí podprogramu, kde budou parametry předány odkazem (metody s referencemi)
- Při stisku tlačítka Konec se provede zavření formuláře
Výstup programu



Výstup programu: Ukázka vypočteného povrchu a objemu koule pomocí programu PovrchObjemKouleWPF
Zadáváme poloměr koule, počítáme objem a povrch. Pro Ludolfovo číslo použijeme standardní hodnotu, která se volá jako funkce bez parametrů.
2.1. Analýza a návrh řešení
Příklad výpočtu povrchu a objemu koule o zadaném poloměru je založen na volání jednotlivých typů metod:
- Metody bez návratu
- Metody s návratem
- Metody orientované na výraz
- Metody s výstupními parametry
- Metody s návratem 2 výstupů
- Metody pomocí předání parametrů odkazem
Obrázek 1: Návrh GUI pro aplikaci PovrchObjemKouleWPF
Pro určení pozic jednotlivých vkládaných prvků využijeme rozdělení objektu Grid. První objekt typu Grid rozdělíme na 3 řádky. Do prvního řádku (s indexem 0) vložíme objekt typu GroupBox, který slouží pro vizuální seskupení jednotlivých vložených objektů. Do objektu typu GroupBox vložíme další objekt typu Grid, který rozdělíme na jednotlivé řádky a sloupce, kde šířka sloupců Grid obsahující jednotlivé popisky se přizpůsobí vloženému obsahu v těchto objektech, tj. délce textu. Šířky sloupců Grid obsahující TextBox pro zadaní poloměru a výpis plochy nebo objemu budou rozděleny v určitém poměru. Do posledního řádku umístíme objekt typu StackPanel, do nějž vložíme objekt WrapPanel, který využijeme pro umístění jednotlivých tlačítek za sebou. Pod tento WrapPanel umístíme další WrapPanel abychom zarovnali tlačítko Konec k pravé straně formuláře. Následující obrázek ukazuje rozmístění jednotlivých objektů v mřížce formuláře - viz Obrázek 2.
Obrázek 2: Návrh GUI - rozložení prvků v mřížce formuláře
Na následujícím obrázku je vidět GUI při počátečním spuštění programu - viz Obrázek 3.
Obrázek 3: GUI při počátečním spuštění programu
2.2. XAML
Vzhledem k tomu, že jsme již pomocí technologie WPF vytvořili základní aplikace, můžeme se nyní podívat na další vlastnost týkající se formuláře. U formuláře (okna) kontrolka typu Window lze nastavit následující vlastnosti:
- MinWidth - šířka okna, na kterou lze okno zmenšit
- MinHeight - výška okna, na kterou lze okno zmenšit
Novým prvkem, který použijeme je prvek typu GroupBox, který bude sloužit pro vizuální seskupení ovládacích prvků. U tohoto prvku lze nastavit vlastnost:
- Header - titulek v záhlaví prvku GroupBox
Pro vložení tlačítek za sebe použijeme ve formuláři prvek typu WrapPanel, kde nastavíme horizontální zarovnání tohoto prvku vůči okraji okna na střed - vlastnost HorizontalAlignment. Tím zajistíme, že pokud budeme roztahovat okno na šířku, skupina tlačítek zůstává vystředěná vůči oknu. Výhodou použití XAML je, že při zmenšování šířky okna (definovali jsme jeho minimální šířku) se tlačítka automaticky přesunou podle šířky okna, aniž bychom museli vytvářet složitý kód pro jejich umístění na formuláři při změně velikosti okna. Pokud u již zmenšeného okna na šířku, budeme zmenšovat ještě jeho výšku, některá tlačítka zmizí, proto je vhodné stanovit minimální rozměry okna.
Do dalšího WrapPanel umístíme tlačítko, které ukončí aplikaci. Tento panel bude zarovnán doprava.
U tlačítek jsme záměrně nedefinovali jejich šířku, tzn. že jejich šířka se přizpůsobí délce vloženého textu (popisku - vlastnost Content). Pokud chcete vložit do popisku tlačítka vložit novou řádku, můžete vložit do textu např. Možností, jak zařádkovat, je více.
<Window x:Class="PovrchObjemKouleWPF.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:PovrchObjemKouleWPF" mc:Ignorable="d" Title="Povrch a objem koule" Height="250" Width="700" MinWidth="500" MinHeight="200"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <GroupBox Header="Specifikace" Grid.Row="0" Margin="10,20"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="3*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="4*"/> </Grid.ColumnDefinitions> <Label Content="Poloměr koule:" Grid.Row="0" Grid.Column="0" Margin="5" /> <TextBox Name="TxtPolomer" Grid.Row="0" Grid.Column="1" VerticalContentAlignment="Center" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" /> <Label Content="Povrch koule:" Grid.Row="0" Grid.Column="4" Margin="5" /> <TextBox Name="TxtPovrch" Grid.Row="0" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> <Label Content="Objem koule:" Grid.Row="1" Grid.Column="4" Margin="5" /> <TextBox Name="TxtObjem" Grid.Row="1" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> </Grid> </GroupBox> <StackPanel Grid.Row="2"> <WrapPanel HorizontalAlignment="Center"> <Button Name="BtnMetoda" Content="Metoda" Margin="5" /> <Button Name="BtnMetodaNavrat" Content="Metoda - návrat" Margin="5" /> <Button Name="BtnMetodaVyraz" Content="Metoda - výraz" Margin="5" /> <Button Name="BtnMetodaParametry" Content="Metoda - výstupní parametr" Margin="5" /> <Button Name="BtnMetoda2Navraty" Content="Metoda - 2 návraty" Margin="5" /> <Button Name="BtnMetodaReference" Content="Metoda - reference" Margin="5" /> </WrapPanel> <WrapPanel HorizontalAlignment="Right" > <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" /> </WrapPanel> </StackPanel> </Grid> </Window>
Kód 1: Základní rozvržení prvků na formuláři
Zaměřme se nyní na prvek TxtPolomer. U tohoto prvku budeme specifikovat dvě události:
- GotFocus - událost, která nastane při zacílení objektu (přepnutí se na objekt pomocí kurzoru myši, nebo klávesnice)
- LostFocus - událost, která nastane při opuštění objektu
Obě obsluhy událostí vygenerujeme pomocí položky <New Event Handler> v nabízeném seznamu od IntelliSense (našeptávač Visual Studia). XAML kód prvku TxtPolomer bude vypadat následovně - viz Kód 2.
<TextBox Name="TxtPolomer" Grid.Row="0" Grid.Column="1" VerticalContentAlignment="Center" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" GotFocus="TxtPolomer_GotFocus" LostFocus="TxtPolomer_LostFocus"/>
Kód 2: Definice obsluhy událostí GotFocus a LostFocus u prvku TxtPolomer
Dále musíme vygenerovat obsluhu události Click u všech tlačítek ve třetím řádku Grid na formuláři - viz Kód 3. Po specifikaci události u tlačítka je rychlejší postup pro vygenerování obsluhy, mačkat klávesu Tab.
<Button Name="BtnMetoda" Content="Metoda" Margin="5" Click="BtnMetoda_Click"/> <Button Name="BtnMetodaNavrat" Content="Metoda - návrat" Margin="5" Click="BtnMetodaNavrat_Click"/> <Button Name="BtnMetodaVyraz" Content="Metoda - výraz" Margin="5" Click="BtnMetodaVyraz_Click" /> <Button Name="BtnMetodaParametry" Content="Metoda - výstupní parametr" Margin="5" Click="BtnMetodaParametry_Click"/> <Button Name="BtnMetoda2Navraty" Content="Metoda - 2 návraty" Margin="5" Click="BtnMetoda2Navraty_Click"/> <Button Name="BtnMetodaReference" Content="Metoda - reference" Margin="5" Click="BtnMetodaReference_Click"/>
Kód 3: Generování obsluhy události Click u tlačítek BtnMetoda, BtnMetodaNavrat, BtnMetodaVyraz, BtnMetodaParametry
Stejným postup vygenerujeme obsluhu události pro tlačítko BtnKonec - viz Kód 4.
<Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" Click="BtnKonec_Click"/>
Kód 4: Generování obsluhy události Click u tlačítka BtnKonec
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) - viz Obrázek 2:
- Grid
- Groupbox
- StackPanel
- WrapPanel
- Label
- TextBox
- TxtPolomer
- TxtObjem
- TxtPovrch
- Button
- BtnMetoda
- BtnMetodaNavrat
- BtnMetodaVyraz
- BtnMetodaParametry
- BtnMetoda2Navraty
- BtnKonec
Obrázek 2: VS - okno Document Outline - seznam objektů
2.3. XAML - prvky formuláře
Nastavení 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="Povrch a objem koule" Height="250" Width="700" MinWidth="500" MinHeight="200">
Kód 1: Nastavení vlastností formuláře
Grid
<Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <GroupBox Header="Specifikace" Grid.Row="0" Margin="10,20"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="3*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="4*"/> </Grid.ColumnDefinitions> <Label Content="Poloměr koule:" Grid.Row="0" Grid.Column="0" Margin="5" /> <TextBox Name="TxtPolomer" Grid.Row="0" Grid.Column="1" VerticalContentAlignment="Center" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" /> <Label Content="Povrch koule:" Grid.Row="0" Grid.Column="4" Margin="5" /> <TextBox Name="TxtPovrch" Grid.Row="0" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> <Label Content="Objem koule:" Grid.Row="1" Grid.Column="4" Margin="5" /> <TextBox Name="TxtObjem" Grid.Row="1" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> </Grid> </GroupBox> <StackPanel Grid.Row="2"> <WrapPanel HorizontalAlignment="Center"> <Button Name="BtnMetoda" Content="Metoda" Margin="5" /> <Button Name="BtnMetodaNavrat" Content="Metoda - návrat" Margin="5" /> <Button Name="BtnMetodaVyraz" Content="Metoda - výraz" Margin="5" /> <Button Name="BtnMetodaParametry" Content="Metoda - výstupní parametry" Margin="5" /> <Button Name="BtnMetoda2Navraty" Content="Metoda - 2 návraty" Margin="5" /> <Button Name="BtnMetodaReference" Content="Metoda - reference" Margin="5"/> </WrapPanel> <WrapPanel HorizontalAlignment="Right" > <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" /> </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# - viz Kód 1. Jako první si všimneme konstruktoru MainWindow této třídy (vnímejte ho jako speciální metodu pro vytvoření objektu - našeho formuláře, který obsahuje atributy třídy, tj. metody a datové složky), který má stejný název jako částečná třída MainWindow. Tělo konstruktoru obsahuje pouze metodu InitializeComponent(). Dále byly vygenerovány soukromé (private) metody bez návratu:
- TxtPolomer_GotFocus
- TxtPolomer_LostFocus
- BtnMetoda_Click
- BtnMetodaNavrat_Click
- BtnMetodaVyraz_Click
- BtnMetodaParametry_Click
- BtnMetoda2Navraty_Click
- BtnMetodaReference_Click
- BtnKonec_Click
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 PovrchObjemKouleWPF { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } ... } }
Kód 1: Základní kód částečné třídy MainWindow
Měli bychom také zmínit, že částečná třída využívá více odkazů na jmenné prostory, tj. více knihoven (uvozené klíčovým slovem using v začátku kódu), než je zapotřebí. Pro naše účely by postačili pouze dva odkazy - viz Kód 2. Odkazy však mazat nebudeme, abychom nedopatřením nesmazali nějaký potřebný odkaz.
using System; using System.Windows;
Kód 2: Odkazy na jmenné prostory .NET Framework
V analýze jsme uváděli, že v prvku pro zadání poloměru koule bude umístěn text "Zadejte poloměr". Tento text představuje konstantu (v průběhu programu se nemění). Abychom si zjednodušili přístup k této textové konstantě, nadefinujeme si vlastní statickou třídu (uvozenou klíčovým slovem static), která bude obsahovat tuto konstantu (nebo v případě potřeby i další). Tato třída bude deklarována ve jmenném prostoru PovrchObjemKouleWPF a bude v kódu umístěna nad již vygenerovaný konstruktor. Statická třída představuje třídu, která je převážně využívána pro uchování obecně použitelných atributů, které nejsou závislé na instanci třídy (vygenerovaného objektu třídy). Více se o statických třídách dozvíte později. Ve statické třídě si deklarujeme veřejně přístupnou (public) textovou konstantu (const), tj. datového typu string, kterou inicializujeme počáteční hodnotou "Zadejte poloměr" - viz Kód 3. Abychom zvýšili srozumitelnost našeho programu, můžeme ke třídě doplnit její popis pomocí třech lomítek (popisek bude zobrazovat Intellisense ve VS). Pokud nad statickou třídu umístíme tři zpětná lomítka, VS vám vygeneruje prázdné tělo popisku (komentáře), do kterého umístíme informace o této statické třídě - viz Kód 3.
/// <summary> /// Statická třída obsahující deklarace konstant /// </summary>
Kód 3: Popisek statické třídy (komentář)
V následujícím kódu vidíme popisek třídy, včetně samotné statické třídy obsahující datovou složku, jenž představuje konstantní textový řetězec s názvem ZadPolomer, ve kterém je uložena hodnota "Zadejte poloměr" - viz Kód 4.
/// <summary> /// Statická třída obsahující deklarace konstant /// </summary> static class Constants { //Deklarace a inicializace datové složky třídy public const string ZadPolomer = "Zadejte poloměr"; }
Kód 4: Deklarace statické třídy Constants s veřejně přístupnou datovou konstantní textovou složkou
Vzhledem k tomu, že již máme definovanou statickou třídu s konstantou, můžeme provést při spuštění aplikace vypsání textu "Zadejte poloměr" do prvku s poloměrem koule pomocí statické třídy - viz Kód 5. K datové složce statické třídy (v našem případě textové konstantě) přistoupíme pomocí tečkové notace.
public MainWindow() { InitializeComponent(); //Při spuštění aplikace je vypsán text v prvku s poloměrem koule this.TxtPolomer.Text = Constants.ZadPolomer; }
Kód 5: Deklarace konstruktoru třídy
První metodou, jejíž tělo musíme vyplnit, je zacílení objektu (přepnutí se na objekt) pro zadání poloměru koule. Pokud objektu (prvku na formuláři) pro zadání poloměru obsahuje počáteční text "Zadejte poloměr", bude tento text vymazán. Pro definici podmínky využijeme klíčové slovo if za nějž do závorky umístíme podmínku. Pokud tato podmínka bude splněna, přiřadíme prázdný text (string.Empty) vlastnosti Text objektu TxtPolomer .
//Vymazání počátečního textu v objektu pro poloměr private void TxtPolomer_GotFocus(object sender, RoutedEventArgs e) { //Pokud je umístěn počáteční text "Zadejte poloměr" v objektu pro poloměr if (this.TxtPolomer.Text == Constants.ZadPolomer) { //Vymazání textu v objektu pro poloměr this.TxtPolomer.Text = string.Empty; } }
Kód 6: Deklarace metody pro zacílení objektu poloměru koule (TxtPolomer_GotFocus)
Pokud bude opuštěn objekt poloměru koule a nebude obsahovat žádný údaj, bude objekt vyplněn textem "Zadejte poloměr". Uživatel také mohl již vypočítat povrch a objem koule dříve pomocí poloměru, který nyní smazal. Proto je nutné vymazat vypočtený povrch a objem koule, který se vztahuje k předchozímu poloměru koule - viz Kód 7.
//Vyplnění počátečního textu v objektu pro poloměr při opuštění objektu private void TxtPolomer_LostFocus(object sender, RoutedEventArgs e) { //Pokud je objekt poloměru prázdný (neobsahuje text) if (this.TxtPolomer.Text == string.Empty) { //Vyplnění poloměru textem "Zadejte poloměr" this.TxtPolomer.Text = Constants.ZadPolomer; //Vymazání předchozího povrchu koule this.TxtPovrch.Text = ""; //Vymazání předchozího objemu koule this.TxtObjem.Text = ""; } }
Kód 7: Deklarace metody pro opuštění objektu poloměru koule (TxtPolomer_LostFocus)
Pojďme se podívat na první výpočet povrchu a objemu koule pomocí metody bez návratu (void) pomocí stisku tlačítka BtnMetoda. Vypočtené hodnoty povrchu a objemu koule jsou uloženy v lokálních proměnných s a v, které budeme využívat pouze uvnitř metody. Hodnoty z těchto proměnných vypíšeme v objektech na formuláři po provedení konverze čísel na text (přistupujeme k vlastnosti Text u prvku na formuláři, proto musíme použít text). Popis jednotlivých kroků metody bude vysvětlen pomocí komentářů - viz Kód 8.
//Metoda bez návratu pro výpočet povrchu a objemu koule bez volání metod private void BtnMetoda_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu (stringu) na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Výpočet povrchu pomocí konstanty PI (třída Math) s = 4 * Math.PI * r * r; //Výpočet objemu - přetypování na datový typ double; Pow - metoda pro umocnění v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3); //Konverze reálného čísla (uloženého v lokální proměnné) na text(string) this.TxtPovrch.Text = s.ToString(); //Konverze reálného čísla na text this.TxtObjem.Text = v.ToString(); } //jinak... else { /* Zobrazení okna se zprávou (1. parametr - text v okně; 2. parametr - titulek okna; 3. parametr - s jedním * tlačítkem pro zavírání; 4. parametr - s ikonou varování) - minimálně 1 parametr povinný */ MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Příkaz pro špatné zadání poloměru - zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } }
Kód 8: Deklarace metody pro výpočet povrchu a objemu koule bez volání metod (BtnMetoda_Click)
Dalším tlačítkem, pro něhož musíme vytvořit tělo metody pro obsluhu události Click, je tlačítko BtnMetodaNavrat. Tato metoda obsluhy bez návratu, bude v sobě volat (spouštět) dvě metody s návratem - viz Kód 11.
Do C# kódu lze pro rychlejší orientaci a členění vložit značky regionů - viz Kód 9. Pokud vložíte metodu mezi počáteční (#region Výpočty) a koncovou značku regionu (#endregion), lze pak pomocí ikony - (nebo + po sbalení), umístěné vlevo od regionu, zdrojový kód skrýt. My budeme seskupovat metody do regionu Výpočty, který bude obsahovat metody, které budou volány v rámci metod pro obsluhu události Click u jednotlivých tlačítek.
Za účelem zpřehlednění struktury kódu vložte další region s názvem Události, který bude zahrnovat metody obsluhy události Click u jednotlivých tlačítek a událostí GotFocus a LostFocus u prvku TxtPolomer.
#region Výpočty #endregion
Kód 9: Deklarace regionu s názvem Výpočty
První volaná soukromá (private - je přístupná pouze v rámci příslušné třídy) metoda PovrchKouleMetodaSNavratem bude navracet vypočtený povrch koule z předané hodnoty poloměru - parametru (argumentu). Tento parametr uvedený v závorce je předaný hodnotou, tzn., že hodnota bude nakopírována do formálního parametru uvedeného ve volané metodě. Hodnota tohoto předaného parametru je načtena z prvku na formuláři (je tedy znovu zapotřebí provést konverzi textu na reálné číslo pomocí metody TryParse) v metodě BtnMetodaNavrat_Click - viz Kód 11. Metodu jsme obohatili komentářem, který se zobrazí při volání této metody v jiné metodě. Komentář by měl pouze popisovat podstatu metody, předaných parametrů a výstupu - viz Kód 10. My jsme jej doplnili z didaktického důvodu o další informace.
/// <summary> /// Metoda s návratem pro výpočet povrchu koule /// </summary> /// <param name="r"> poloměr koule - vstupní parametr metody (předán hodnotou) </param> /// <returns> výstup metody je povrch koule </returns> private double PovrchKouleMetodaSNavratem(double r) { //Návrat vypočteného povrchu return 4 * Math.PI * Math.Pow(r, 2); }
Kód 10: Deklarace metody s návratem pro výpočet povrchu koule (PovrchKouleMetodaSNavratem)
Druhá volaná metoda ObjemKouleMetodaSNavratem navrátí objem koule na základě předaného poloměru - viz Kód 11. Všimněte si, že abychom obdrželi desetinné číslo podělením 4 a 3, musíme definovat definovat tzv. literál, tj. písmeno o který datový typ se jedná, jinak bychom obdrželi hodnotu celočíselného podílu. V našem případě půjde o datový typ double, čili d.
/// <summary> /// Výpočet objemu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> objem koule </returns> private double ObjemKouleMetodaSNavratem(double r) { //Návrat vypočteného objemu return (4d / 3) * Math.PI * Math.Pow(r, 3); }
Kód 11: Deklarace metody s návratem pro výpočet objemu koule (ObjemKouleMetodaSNavratem)
V následujícím kódu metody bez návratu pro obsluhu pro stisknu tlačítka BtnMetodaNavrat vidíme volání obou deklarovaných metod s návratem - viz Kód 12. Reálná hodnota návratu je po konverzi (metoda ToString) vypsána v příslušném prvku na formuláři.
//Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s návratem private void BtnMetodaNavrat_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu(stringu) na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { /* Zavolání metody s návratem pro výpočet povrchu koule, která má 1 vstup(r) a 1 výstup - konverze * výstupního reálného čísla na text(string) */ this.TxtPovrch.Text = PovrchKouleMetodaSNavratem(r).ToString(); /* Zavolání metody s návratem pro výpočet objemu koule, která má 1 vstup(r) a 1 výstup - konverze * výstupního reálného čísla na text(string) */ this.TxtObjem.Text = ObjemKouleMetodaSNavratem(r).ToString(); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } }
Kód 12: Deklarace metody pro výpočet povrchu a objemu koule s voláním metod s návratem (BtnMetodaNavrat_Click)
Pro úsporu kódu při psaní metody je možné použít metodu orientovanou na výraz. My takový přístup použijeme jak pro výpočet povrchu - viz Kód 13, tak i pro výpočet objemu koule - viz Kód 14.
/// <summary> /// Metoda orientovaná na výraz pro výpočet povrchu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> povrch koule </returns> private double PovrchKouleMetodaVyraz(double r) => 4 * Math.PI * r * r;
Kód 13: Deklarace metody orientované na výraz pro výpočet povrchu koule (PovrchKouleMetodaVyraz)
/// <summary> /// Metoda orientovaná na výraz pro výpočet objemu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> objem koule </returns> private double ObjemKouleMetodaVyraz(double r) => (4d / 3) * Math.PI * Math.Pow(r, 3);
Kód 14: Deklarace metody orientované na výraz pro výpočet objemu koule (ObjemKouleMetodaVyraz)
Obě předchozí deklarované metody budou volány v metodě pro obsluhu události Click u tlačítka BtnMetodaVyraz - viz Kód 15. Všimněte si určení formátu, ve kterém mají být číslice vypisovány do prvku na formuláři pro případ povrchu a objemu koule. Dříve jsme používali metodu ToString vyvolanou pomocí tečkové notace u proměnné. Nyní však použijeme metodu Format vyvolanou též pomocí tečkové notace, nyní však přímo ze třídy datového typu string (samotný datový typ představuje také třídu). U této metody určíme numerický formát "{0:N2}", jenž představuje numerický formát zobrazení číslic na dvě pozice za desetinnou čárkou a s oddělovačem tisíců. Oddělovač je závislý na nastavení, jaké používá Váš systém (třída CultureInfo), např. v českém prostředí používáme pro oddělení tisíců mezeru, v americkém zase čárku.
//Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod orientovaných na výraz private void BtnMetodaVyraz_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { /* Volání metody orientované na výraz pro výpočet povrchu koule, která má 1 vstup(r) a * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */ this.TxtPovrch.Text = string.Format("{0:N2}", PovrchKouleMetodaVyraz(r)); /* Volání metody orientované na výraz pro výpočet objemu koule, která má 1 vstup(r) a * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */ this.TxtObjem.Text = string.Format("{0:N2}", ObjemKouleMetodaVyraz(r)); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } }
Kód 15: Deklarace metody pro výpočet povrchu a objemu koule s voláním metod orientovaných na výraz (BtnMetodaVyraz_Click)
Dalším možným přístupem pro výpočet povrchu a objemu koule na základě vstupního parametru r je použití metody s výstupnými parametry, kterými jsou vypočtený povrch a objem koule (u výstupního parametru je použito klíčové slovo out) - viz Kód 16. Nezapomeňte na to, že oba parametry musí být v metodě naplněny!
/// <summary> /// Metody s výstupními parametry pro výpočet povrchu a objemu koule /// </summary> /// <param name="r"> poloměr koule - vstupní parametr </param> /// <param name="s"> povrch koule - první výstupní parametr </param> /// <param name="v"> objem koule - druhý výstupní parametr </param> private void PovrchObjemKouleVystupniParametry(double r, out double s, out double v) { s = 4 * Math.PI * r * r; v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3); }
Kód 16: Deklarace metody s výstupními parametry pro výpočet povrchu a objemu koule (PovrchObjemKouleVystupniParametry)
Volání této metody se dvěma výstupy provedeme v metodě pro obsluhu událost Click u tlačítka BtnMetodaParametry. U volané metody též musíme použít klíčové slovo out u výstupních parametrů - viz Kód 17. Záleží též na pořadí předávaných a výstupních parametrů, tzn. abychom neprohodili pořadí parametrů s a v.
//Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s výstupními parametry private void BtnMetodaParametry_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Volání metody s výstupními parametry, která má 1 vstupní parametr (r) a 2 výstupní parametry (s,v) PovrchObjemKouleVystupniParametry(r, out double s, out double v); //Zobrazení vypočteného povrchu (konverze reálného čísla na text(string)) this.TxtPovrch.Text = s.ToString(); //Zobrazení vypočteného objemu this.TxtObjem.Text = v.ToString(); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); }
Kód 17: Deklarace metody pro výpočet povrchu a objemu koule s voláním metody s výstupními parametry (BtnMetodaParametry_Click)
Předposlední typem použité metody je metoda navracející 2 výstupy. V našem případě oba datového typu double. Návrat je uskutečněn pomocí příkazu return s tím rozdílem, že výstupy jsou uvedeny v závorce a odděleny čárkou - viz Kód 18.
/// <summary> /// Metoda navracející 2 výstupy - povrch a objem koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> povrch, objem - výstupy metody jsou typu double </returns> private (double, double) PovrchObjemKouleMetodaDvaNavraty(double r) { double s, v; s = 4 * Math.PI * r * r; v = (4d / 3) * Math.PI * Math.Pow(r, 3); return (s, v); }
Kód 18: Deklarace metody navracející 2 výstupy - povrch a objem koule (PovrchObjemKouleMetodaDvaNavraty)
V následujícím zdrojovém kódu metody pro obsluhu události Click tlačítka BtnMetoda2Navraty vidíme volání předchozí metody pro návrat dvou výstupů, které jsou uloženy do lokálních proměnných s a v. Pozor na pořadí těchto proměnných, abyste je neprohodili. Hodnoty v lokálních proměnných jsou vypsány v požadovaném formátu do příslušných prvků na formuláři.
//Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody navracející dva výstupy private void BtnMetoda2Navraty_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Volání metody navracející 2 výstupy (povrch, objem koule) (s, v) = PovrchObjemKouleMetodaDvaNavraty(r); //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string)) this.TxtPovrch.Text = string.Format("{0:N2}", s); //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string)) this.TxtObjem.Text = string.Format("{0:N2}", v); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } }
Kód 19: Deklarace metody pro výpočet povrchu a objemu koule s voláním metody navracející 2 výstupy (BtnMetoda2Navraty_Click)
Posledním přístupem, který si ukážeme, je předání parametru odkazem (referencí - klíčové slovo ref). Při uvedení klíčového slova ref říkáme, že má být vytvořena reference (propojení) tohoto parametru s parametrem uvedeným v metodě PovrchObjemKoulePredaniOdkazem, která tuto metodu volala (tj. metoda pro obsluhu události stisknutí tlačítka BntReference_Click).
/// <summary> /// Metoda bez návratu - předání parametrů odkazem (povrch a objem koule) /// </summary> /// <param name="r"> poloměr koule - parametr předaný hodnotou </param> /// <param name="s"> povrch koule - parametr předaný odkazem </param> /// <param name="v"> povrch koule - parametr předaný odkazem </param> private void PovrchObjemKoulePredaniOdkazem(double r, ref double s, ref double v) { //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = (4d / 3) * Math.PI * Math.Pow(r, 3); }
Kód 20: Deklarace metody s předáním parametrů (povrchu a objemu koule) odkazem (PovrchObjemKoulePredaniOdkazem)
Volání předchozí deklarované metody provedeme z metody pro obsluhu stisknutí tlačítka BtnMetodaReference - viz Kód 21. Před předáním parametru odkazem musí být daný parametr inicializován, tzn. musí být naplněn hodnotou! My jsme ve zdrojovém kódu oběma parametrům s a v přiřadili hodnotu 0 (inicializaci jsme mohli provést přímo v deklaraci lokální proměnné. Lokální proměnná zde zároveň představuje parametr). Všimněte si, že první parametr r je předán hodnotou, tzn. není uvedeno klíčové slovo ref. Hodnota z lokální proměnné r je nakopírována do parametru r ve volané metodě PovrchObjemKoulePredaniOdkazem (ve volané metodě můžete použít jiné pojmenování parametru např. rr, se kterým ve volané metodě budete pracovat. Záleží na pořadí předaného parametru). Další parametry s a v (říká se jim skutečné) deklarované v metodě BtnMetodaReference_Click jsou předány odkazem, tzn. je vytvořena reference (propojení) na formální parametry uvedené ve volané metodě PovrchObjemKoulePredaniOdkazem. Znamená to, že to co provedeme s formální parametrem ve volané metodě, se nám po ukončení volané metody odrazí na skutečném parametru.
//Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody, které jsou předány parametry odkazem private void BtnMetodaReference_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Inicializace proměnných, tj. počáteční přiřazení hodnoty s = v = 0; //Volání metody bez návratu - předání parametru 'r' hodnotou a předání parametrů 's' a 'v' odkazem PovrchObjemKoulePredaniOdkazem(r, ref s, ref v); //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string)) this.TxtPovrch.Text = string.Format("{0:N2}", s); //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string)) this.TxtObjem.Text = string.Format("{0:N2}", v); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } }
Kód 21: Deklarace metody pro výpočet povrchu a objemu koule s předaním parametrů odkazem (BtnMetodaReference_Click)
Finální 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 22.
//Metoda bez návratu pro zavření formuláře private void BtnKonec_Click(object sender, RoutedEventArgs e) { //zavření formuláře this.Close(); }
Kód 22: 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="PovrchObjemKouleWPF.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:PovrchObjemKouleWPF" mc:Ignorable="d" Title="Povrch a objem koule" Height="250" Width="700" MinWidth="500" MinHeight="200"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <GroupBox Header="Specifikace" Grid.Row="0" Margin="10,20"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="3*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="4*"/> </Grid.ColumnDefinitions> <Label Content="Poloměr koule:" Grid.Row="0" Grid.Column="0" Margin="5" /> <TextBox Name="TxtPolomer" Grid.Row="0" Grid.Column="1" VerticalContentAlignment="Center" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" GotFocus="TxtPolomer_GotFocus" LostFocus="TxtPolomer_LostFocus"/> <Label Content="Povrch koule:" Grid.Row="0" Grid.Column="4" Margin="5" /> <TextBox Name="TxtPovrch" Grid.Row="0" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> <Label Content="Objem koule:" Grid.Row="1" Grid.Column="4" Margin="5" /> <TextBox Name="TxtObjem" Grid.Row="1" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> </Grid> </GroupBox> <StackPanel Grid.Row="2"> <WrapPanel HorizontalAlignment="Center"> <Button Name="BtnMetoda" Content="Metoda" Margin="5" Click="BtnMetoda_Click"/> <Button Name="BtnMetodaNavrat" Content="Metoda - návrat" Margin="5" Click="BtnMetodaNavrat_Click"/> <Button Name="BtnMetodaVyraz" Content="Metoda - výraz" Margin="5" Click="BtnMetodaVyraz_Click" /> <Button Name="BtnMetodaParametry" Content="Metoda - výstupní parametry" Margin="5" Click="BtnMetodaParametry_Click"/> <Button Name="BtnMetoda2Navraty" Content="Metoda - 2 návraty" Margin="5" Click="BtnMetoda2Navraty_Click"/> <Button Name="BtnMetodaReference" Content="Metoda - reference" Margin="5" Click="BtnMetodaReference_Click"/> </WrapPanel> <WrapPanel HorizontalAlignment="Right" > <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" 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 PovrchObjemKouleWPF { /// <summary> /// Statická třída obsahující deklarace konstant /// </summary> static class Constants { //Deklarace a inicializace datové složky třídy public const string ZadPolomer = "Zadejte poloměr"; } /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //Při spuštění aplikace je vypsán text v prvku s poloměrem koule this.TxtPolomer.Text = Constants.ZadPolomer; } #region Výpočty /// <summary> /// Metoda s návratem pro výpočet povrchu koule /// </summary> /// <param name="r"> poloměr koule - vstupní parametr metody (předán hodnotou) </param> /// <returns> výstup metody je povrch koule </returns> private double PovrchKouleMetodaSNavratem(double r) { //Návrat vypočteného povrchu return 4 * Math.PI * Math.Pow(r, 2); } /// <summary> /// Výpočet objemu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> objem koule </returns> private double ObjemKouleMetodaSNavratem(double r) { //Návrat vypočteného objemu return (4d / 3) * Math.PI * Math.Pow(r, 3); } /// <summary> /// Metoda orientovaná na výraz pro výpočet povrchu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> povrch koule </returns> private double PovrchKouleMetodaVyraz(double r) => 4 * Math.PI * r * r; /// <summary> /// Metoda orientovaná na výraz pro výpočet objemu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> objem koule </returns> private double ObjemKouleMetodaVyraz(double r) => (4d / 3) * Math.PI * Math.Pow(r, 3); /// <summary> /// Metody s výstupními parametry pro výpočet povrchu a objemu koule /// </summary> /// <param name="r"> poloměr koule - vstupní parametr </param> /// <param name="s"> povrch koule - první výstupní parametr </param> /// <param name="v"> objem koule - druhý výstupní parametr </param> private void PovrchObjemKouleVystupniParametry(double r, out double s, out double v) { s = 4 * Math.PI * r * r; v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3); } /// <summary> /// Metoda navracející 2 výstupy - povrch a objem koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> povrch, objem - výstupy metody jsou typu double </returns> private (double, double) PovrchObjemKouleMetodaDvaNavraty(double r) { double s, v; s = 4 * Math.PI * r * r; v = (4d / 3) * Math.PI * Math.Pow(r, 3); return (s, v); } /// <summary> /// Metoda bez návratu - předání parametrů odkazem (povrch a objem koule) /// </summary> /// <param name="r"> poloměr koule - parametr předaný hodnotou </param> /// <param name="s"> povrch koule - parametr předaný odkazem </param> /// <param name="v"> povrch koule - parametr předaný odkazem </param> private void PovrchObjemKoulePredaniOdkazem(double r, ref double s, ref double v) { //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = (4d / 3) * Math.PI * Math.Pow(r, 3); } #endregion #region Události //Vymazání počátečního textu v objektu pro poloměr při zacílení objektu private void TxtPolomer_GotFocus(object sender, RoutedEventArgs e) { //Pokud je umístěn počáteční text "Zadejte poloměr" v objektu pro poloměr if (this.TxtPolomer.Text == Constants.ZadPolomer) { //Vymazání textu v objektu pro poloměr this.TxtPolomer.Text = string.Empty; } } //Vyplnění počátečního textu v objektu pro poloměr při opuštění objektu private void TxtPolomer_LostFocus(object sender, RoutedEventArgs e) { //Pokud je objekt poloměru prázdný (neobsahuje text) if (this.TxtPolomer.Text == string.Empty) { //Vyplnění poloměru textem "Zadejte poloměr" this.TxtPolomer.Text = Constants.ZadPolomer; //Vymazání předchozího povrchu koule this.TxtPovrch.Text = ""; //Vymazání předchozího objemu koule this.TxtObjem.Text = ""; } } //Metoda bez návratu pro výpočet povrchu a objemu koule bez volání metod private void BtnMetoda_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu (stringu) na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Výpočet povrchu pomocí konstanty PI (třída Math) s = 4 * Math.PI * r * r; //Výpočet objemu - přetypování na datový typ double; Pow - metoda pro umocnění v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3); //Konverze reálného čísla (uloženého v lokální proměnné) na text(string) this.TxtPovrch.Text = s.ToString(); //Konverze reálného čísla na text this.TxtObjem.Text = v.ToString(); } //jinak... else { /* Zobrazení okna se zprávou (1. parametr - text v okně; 2. parametr - titulek okna; 3. parametr - s jedním * tlačítkem pro zavírání; 4. parametr - s ikonou varování) - minimálně 1 parametr povinný */ MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Příkaz pro špatné zadání poloměru - zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s návratem private void BtnMetodaNavrat_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu(stringu) na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { /* Zavolání metody s návratem pro výpočet povrchu koule, která má 1 vstup(r) a 1 výstup - konverze * výstupního reálného čísla na text(string) */ this.TxtPovrch.Text = PovrchKouleMetodaSNavratem(r).ToString(); /* Zavolání metody s návratem pro výpočet objemu koule, která má 1 vstup(r) a 1 výstup - konverze * výstupního reálného čísla na text(string) */ this.TxtObjem.Text = ObjemKouleMetodaSNavratem(r).ToString(); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod orientovaných na výraz private void BtnMetodaVyraz_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { /* Volání metody orientované na výraz pro výpočet povrchu koule, která má 1 vstup(r) a * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */ this.TxtPovrch.Text = string.Format("{0:N2}", PovrchKouleMetodaVyraz(r)); /* Volání metody orientované na výraz pro výpočet objemu koule, která má 1 vstup(r) a * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */ this.TxtObjem.Text = string.Format("{0:N2}", ObjemKouleMetodaVyraz(r)); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s výstupními parametry private void BtnMetodaParametry_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Volání metody s výstupními parametry, která má 1 vstupní parametr (r) a 2 výstupní parametry (s,v) PovrchObjemKouleVystupniParametry(r, out double s, out double v); //Zobrazení vypočteného povrchu (konverze reálného čísla na text(string)) this.TxtPovrch.Text = s.ToString(); //Zobrazení vypočteného objemu this.TxtObjem.Text = v.ToString(); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody navracející dva výstupy private void BtnMetoda2Navraty_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Volání metody navracející 2 výstupy (povrch, objem koule) (s, v) = PovrchObjemKouleMetodaDvaNavraty(r); //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string)) this.TxtPovrch.Text = string.Format("{0:N2}", s); //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string)) this.TxtObjem.Text = string.Format("{0:N2}", v); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody, které jsou předány parametry odkazem private void BtnMetodaReference_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Inicializace proměnných, tj. počáteční přiřazení hodnoty s = v = 0; //Volání metody bez návratu - předání parametru 'r' hodnotou a předání parametrů 's' a 'v' odkazem PovrchObjemKoulePredaniOdkazem(r, ref s, ref v); //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string)) this.TxtPovrch.Text = string.Format("{0:N2}", s); //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string)) this.TxtObjem.Text = string.Format("{0:N2}", v); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro zavření formuláře 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ýpočet povrchu a objemu koule ze zadaného poloměru na formuláři - viz Výstup programu - Kód 1 a 2. Různé typy metod pro výpočet povrchu a objemu koule jsou spouštěny pomocí příslušných tlačítek. U metod jsou také použity různé typy formátování výsledků. 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 vypočteného povrchu a objemu koule ze zadaného poloměru