1. PovrchObjemKoule

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. 

Ukázka výpisu hodnot v hlavní metodě programu PovrchObjemKoule

Výstup programu - Kód 1: Ukázka výpisu hodnot v hlavní metodě programu PovrchObjemKoule