Referenční typy - pole
8. Předání pole jako parametru, nebo jako návratu metody
V C# lze definovat metody, které přijímají pole jako parametry, nebo je navrací zpět. Syntaxe pro předávání pole jako parametru je téměř totožná s deklarací pole.
Asi jste si všimli, že hlavní metoda aplikace přijímá jako argument (parametr) pole řetězců:
static void Main (string [] args){ … }Nezapomeňme, že hlavní metoda je volána při spuštění programu; je to tedy vstupní bod vaší aplikace. Pokud spustíme aplikaci z příkazového řádku, můžeme zadat argumenty této metody pomocí příkazového řádku. Operační systém Windows předá tyto argumenty do interpreteru (CLR - Common Language Runtime), který je předá jako argumenty hlavní metodě. Tento mechanismus nám poskytuje jednoduchý způsob, jak umožnit uživateli zadat informace při spuštění aplikace namísto interaktivního vyzývání uživatele. Tento přístup je užitečný, pokud chceme vytvářet nástroje, které lze spouštět z automatizovaných skriptů.
Příklad následujícího kódu, definuje metodu pojmenovanou ZpracujData, která přijímá jednorozměrné pole celých čísel (formální parametr) – viz Kód 1. V těle metody jsou procházeny prvky pole pomocí cyklu foreach a u každého prvku se provádí jeho nespecifikované zpracování. [6]
//Deklarace metody přijímací jednorozměrné pole public void ZpracujData(int[] data) { //Cyklus procházející jednotlivá data foreach (int i in data) { //...zpracování dat } }
Kód 1: Příklad metody přijímací jednorozměrné pole jako formální parametr
Je důležité si uvědomit, že pole jsou referenčního typu, takže pokud změníme uvnitř metody obsah pole předaného jako parametr, změna se promítne i vně této metody.
Pokud potřebujeme pole uvnitř metody vytvořit, případně naplnit atd., můžeme pole deklarovat jako návratový typ, nebo jako návrat metody.Ilustrativní příklad VytvorPole
Program VytvorPole
- Popis: Deklarace metody pro vytvoření jednorozměrného pole včetně naplnění obsahu prvků
- Zadání: Vytvořte metodu VytvorPole, která vytvoří instanci jednorozměrného pole nazvanou pole o načtené velikosti velikostPole definující počet celočíselných prvků pole. Instance pole bude deklarována jako návrat metody. Uživatel naplní obsah všech prvků pole pomocí klávesnice. Metodu zavolejte v metodě Main
- Řešení: Bude postupně probráno v následujícím textu
Jak vidíme, v deklaraci metody jsme uvedli, že metoda je statická (budeme jí volat v metodě Main) a veřejná – viz Kód 2. Návratový typ této metody je jednorozměrné pole celých čísel. V těle metody vybídneme uživatele k zadání velikosti pole, tedy počtu prvků pole. Po načtení a konverzi velikosti pole je vytvořena instance jednorozměrného pole o specifikované velikosti. Uvnitř těla jsme definovali cyklus s krokem, protože chceme uživatele informovat, o pořadí prvku, který zadává. K informaci o pořadí prvku jsme použili řídící proměnnou cyklu. Tuto hodnotu jsme zvýšili o 1, poněvadž by bylo nevhodné psát u prvního prvku pole "Zadejte hodnotu 0. prvku: ". Načtenou hodnotu od uživatele jsme uložili do prvku pole na aktuální pozici určenou pomocí indexu i. Výstupem metody je vytvořená a naplněná instance jednorozměrného pole.
//Deklarace metody navracející jednorozměrné pole public static int[] VytvorPole() { //Výpis textu pro zadání počtu prvků pole, tj. velikost pole Console.Write("Zadejte počet prvků pole: "); //Konverze zadaného textu na číslo int velikostPole = int.Parse(Console.ReadLine()); //Vytvoření instance jednorozměného pole o specifikované velikosti int[] pole = new int[velikostPole]; //Cyklus procházející jednotlivé prvky for (int i = 0; i < velikostPole; i++) { //Výpis textu pro zadání obsahu prvku pole Console.Write("Zadejte hodnotu {0}.prvku: ", i + 1); //Přiřazení načtené hodnoty prvku pole[i] = int.Parse(Console.ReadLine()); } //Výstup metody je jednorozměrné pole return pole; }
Kód 2: Deklarace metody VytvorPole pro vytvoření
jednorozměrného pole včetně naplnění obsahu prvků
V následujícím kódu těla statické metody Main vidíme volání metody VytvorPole – viz Kód 3.
static void Main(string[] args) { //Vytvoření instance jednorozměrného pole a naplnění prvků int[] pole = VytvorPole(); }
Kód 3: Volání metody pro vytvoření jednorozměrného pole včetně naplnění obsahu prvků ve statické metodě Main
Výpis v konzoli ukazuje zadání velikosti pole a následné zadání
hodnot jednorozměrného pole pomocí metody VytvorPole
– viz Výstup programu - Kód 3.
Zadejte počet prvků pole: 5
Zadejte hodnotu 1.prvku: 0
Zadejte hodnotu 2.prvku: 1
Zadejte hodnotu 3.prvku: 2
Zadejte hodnotu 4.prvku: 3
Zadejte hodnotu 5.prvku: 4
Výstup programu - Kód 3: Příklad vytvoření jednorozměrného pole včetně naplnění obsahu prvků
Využijme těla předchozího příkladu pro vytvoření instance jednorozměrného pole a zkusme si deklarovat pole jako výstupní parametr metody.
Ilustrativní příklad VytvorPolePretizeni
Program VytvorPolePretizeni
- Popis: Deklarace přetížené metody pro vytvoření jednorozměrného pole předaného jako výstupní parametr metody (včetně naplnění obsahu prvků)
- Zadání: Využijte předchozí tělo metody VytvorPole a vytvořte přetíženou metodu VytvorPole, s tím rozdílem, že instance jednorozměrného pole bude deklarována jako výstupní parametr metody. Metodu zavolejte v metodě Main
- Řešení: Bude postupně probráno v následujícím textu
Hlavním rozdílem oproti předchozí metodě je ve způsobu deklarace metody – viz Kód 4. Návratový typ této statické metody je void a předání instance jednorozměrného pole je realizováno pomocí deklarace výstupního parametru pomocí klíčového slova out. Za tímto klíčovým slovem následuje deklarace jednorozměrného pole celých čísel včetně specifikace názvu tohoto pole. Díky tomu nemusíme uvádět uvnitř těla metody deklarace jednorozměrného pole jako lokální proměnné a při vytváření instance pouze stačí použít název tohoto výstupní parametru, tedy pole. Dále není zapotřebí navracet výstup, tzn., že byla smazána řádka s klíčovým slovem return.
//Deklarace metody, kde jednorozměrné pole je deklarováno jako výstupní parametr metody public static void VytvorPole(out int[] pole) { //Výpis textu pro zadání počtu prvků pole, tj. velikost pole Console.Write("Zadejte počet prvků pole: "); //Konverze zadaného textu na číslo int velikostPole = int.Parse(Console.ReadLine()); //Vytvoření instance jednorozměrného pole o specifikované velikosti pole = new int[velikostPole]; //Cyklus procházející jednotlivé prvky for (int i = 0; i < velikostPole; i++) { //Výpis textu pro zadání obsahu prvku pole Console.Write("Zadejte hodnotu {0}.prvku: ", i + 1); //Přiřazení načtené hodnoty prvku pole[i] = int.Parse(Console.ReadLine()); } }
Kód 4: Deklarace přetížené
metody VytvorPole pro vytvoření jednorozměrného pole předaného jako výstupní parametr
metody
V následujícím kódu těla statické metody Main vidíme rozdíl ve volání přetížené metody VytvorPole (předchozí volání metody s návratem je okomentované - zelené). Ve volání metody jsme v závorce deklarovali typ jednorozměrného pole a instance bude vytvořena a naplněna v deklarované metodě – viz Kód 5.
static void Main(string[] args) { ////Vytvoření instance jednorozměrného pole a naplnění prvků pomocí metody s návratem //int[] pole = VytvorPole(); //Volání přetížené metody, kde jednorozměrné pole je výstupní parametr metody VytvorPole(out int[] pole); }
Kód 5: Volání přetížené metody VytvorPole pro vytvoření jednorozměrného pole předaného jako výstupní parametr metody ve statické metodě Main
Vzhledem k tomu, že jednorozměrné pole
již máme vytvořeno, měli bychom se pokusit jeho obsah.
Ilustrativní příklad VytvorVypisPole
Program VytvorVypisPole
- Popis: Metoda pro výpis obsahů všech celočíselných prvků jednorozměrného pole
- Zadání: Deklarujte metodu bez návratu VypisPole, která vypíše hodnoty všech celočíselných prvků instance jednorozměrného pole nazvané pole, která byla vytvořena pomocí metody VytvorPole. Vypište také pořadí jednotlivých prvků. Metodu zavolejte v metodě Main
- Řešení: VytvorVypisPole_Main
Deklarovaná metoda přijímá jednorozměrné pole celočíselných prvků a nemá žádný návrat (potřebujeme jen vypsat hodnoty v prvcích pole), proto v deklaraci uvedeme slovo jako návratový datový typ metody void – viz Kód 6. Uvnitř těla metody je použit cyklus for, vzhledem k tomu, že víme, kolik prvků obsahuje a také kvůli tomu, že u jednotlivých prvků chceme uvádět jejich pořadí v poli (proto jsme nevyužili cyklus foreach). Hodnotu pořadí zjišťujeme z hodnoty řídící proměnné cyklu, ke které přičítáme 1 (nechceme, aby pořadí prvního prvku bylo vypsáno jako nulté). Délku pole, kterou je nutné uvést uvnitř cyklu, zjistíme pomocí vlastnosti Length.
//Deklarace metody vypisující obsah všech prvků jednorozměrného pole public static void VypisPole(int[] pole) { //Cyklus procházející jednotlivé prvky for (int i = 0; i < pole.Length; i++) { //Výpis textu pro zadání obsahu prvku pole včetně pořadí prvku Console.WriteLine("Hodnota {0}.prvku: {1}", i+1, pole[i]); } }
Kód 6: Deklarace metody VypisPole pro výpis obsahů všech celočíselných prvků jednorozměrného pole
V následujícím kódu těla statické metody Main vidíme volání metody VypisPole. Ve volání metody jsme v závorce předali instanci jednorozměrného pole, která bude v deklarované metodě vypsána – viz Kód 7.
//Zavolání metody pro vypsání obsahů prvků pole VypisPole(pole);
Kód 7: Volání metody
pro výpis obsahů všech celočíselných prvků jednorozměrného pole ve statické
metodě Main
V konzoli vidíme hodnoty jednotlivých celočíselných prvků uvnitř instance
jednorozměrného pole s názvem pole
– viz Výstup programu - VytvorVypisPole_Main.
Zadejte počet prvků pole: 5 Zadejte hodnotu 1.prvku: 1 Zadejte hodnotu 2.prvku: 2 Zadejte hodnotu 3.prvku: 3 Zadejte hodnotu 4.prvku: 4 Zadejte hodnotu 5.prvku: 5 Hodnota 1.prvku: 1 Hodnota 2.prvku: 2 Hodnota 3.prvku: 3 Hodnota 4.prvku: 4 Hodnota 5.prvku: 5
Výstup programu - VytvorVypisPole_Main: Příklad výpisu obsahů všech vytvořených celočíselných prvků jednorozměrného pole