Zpět na seznam článků     Číst komentáře (12)     Verze pro tisk

C# - 8.díl - Pole

Autor: sukovanej   
23.2.2013

Lehký úvod do polí v jazyce C#.


Pole

Pole je struktura prvků se stejným datovým typem, na které můžeme pohlížet jako na jeden celek. Je velmi užitečné, když potřebujeme pracovat s více daty. Kdybychom například měli seznam spolužáků a chtěli nějak pracovat s jejich jmény, s proměnnými by se nám to uskutečňovalo dost těžko. Jména budou mít určitě stejný datový typ (string), takže si definujeme pole a jména si uložíme do něj. Každý prvek pole má potom svoje unikátní identifikační číslo (index), s pomocí něhož se můžeme ke každé hodnotě prvku dostat.

Jednorozměrné pole

Začněme u toho, jak se pole definuje. Základním východiskem pro definici pole je datový typ prvků, které budeme v poli uchovávat a počet prvků v poli. Jednorozměrné pole si z matematického hlediska tedy můžeme (s trochou shovívavosti) představit jako konečnou množinu prvků.

Samotná definice se skládá ze dvou částí. V první definujeme proměnnou typu pole. V dalším kroku je třeba tuto proměnnou inicializovat, tj. vytvořit instanci pole. To se provádí (stejně jako např. u definici třídy) klíčovým slovem new. Tyto dva kroky se většinou spojí do jednořádkové deklarace, která vypadá následovně.

  1. datový_typ[] pole = new datový_typ[počet_prvků];

Pokud chceme získávat, nebo upravovat hodnoty určitého prvku v poli, ukazujeme na pole s pomocí indexů. Prvky v poli se indexují od nuly, takže za předpokladu, že je v poli n prvků, tak poslední bude mít index (n – 1) a první samozřejmě 0. K prvku se dostaneme pomocí názvu pole a do hranatých závorek uvedeme index prvku. Indexem nemusí být pouze konkrétní číslo, ale může to být třeba proměnná (viz proměnná délka pole), nebo to může být početní operace. Nejlépe snad pochopíte na příkladu.

  1. int[] pole = new int[12];
  2. pole[0] = 963;
  3. pole[2 * 2] = 21;
  4. // Toto ale vyhodí chybu, protože jsme překročili celkový počet prvků
  5. pole[12] = 3124;

Povšimněte si posledního řádku, kde je index shodný s počtem prvků. Tento řádek je špatně právě kvůli tomu, že indexy se číslují od nuly. Nejvyšší možný index je roven číslo 11.

Pokud již při definici víme, jaké prvky bude pole obsahovat, můžeme využít zápis definice i s určením prvků.

  1. int[] pole = new int[5] { 20, 9, 195, 1, -569 };
  2. // nebo ještě kratší zápis
  3. int[] pole = { 20, 9, 195, 1, -569 };

V příkladu jsem uvedl ještě jeden, kratší zápis, jehož výhoda je, že není potřeba zadávat počet prvků. Pokud pole definujete prvním způsobem, je opravdu třeba vypsat tolik prvků, kolik jste uvedli.

Vícerozměrná pole

Vícerozměrné pole je takové pole, na jehož každém prvku je definované další pole. Budeme nyní uvažovat dvourozměrné pole. Na konkrétní prvek se potom odkazujeme s pomocí dvou indexů, ne jedním. Vzhledem k tomu, že je tento způsob získávání hodnoty prvku náramně podobný souřadnicím bodu v soustavě souřadnic (nebo obecně nějaké struktuře s dvěma rozměry), můžeme dvourozměrné pole využít například na reprezentaci matice.

U vícerozměrných polí dále rozlišujeme, jestli je pole pravoúhlé, tj. má pevně definovaný počet sloupců a pole, u něhož počet sloupců neznáme a jednotlivé prvky skutečně definujeme jako nová pole. Nejlépe vše uvidíte na příkladu.

  1. int[,] matice = new int[2, 2];
  2. matice[0, 0] = 1;
  3. matice[1, 1] = 1;

V příkladu je vytvořena matice 2x2 (určitě někteří poznávají Kroneckerovo deltu), jejíž prvky na diagonálách jsou rovny jedničce. Zápis s definicí vypadá analogicky.

  1. int[,] matice = { { 1, 0 }, { 0, 1 } };

Pole s neurčenými rozměry dimenzí se definují tak, že zdvojíme hranaté závorky při definici a jednotlivým prvkům musíme předávat opět pole stejného typu. Nyní máme příklad, kdy chceme uchovávat rodiny a k těmto rodinám přiřazovat jména jejich členů.

  1. string[][] rodina = new string[2][];
  2. rodina[0] = new string[3] {"Marek", "Petr", "Eva"};
  3. rodina[1] = new string[2] {"Tomáš", "Zuzana" };
  4. Console.Write("Člen rodiny: " + rodina[0][1]);

K hodnotě prvku zase přistupujeme s pomocí dvou indexů. V příkladu je pro jistotu uvedeno, jak se k hodnotě z pole dostat (poslední řádek), protože se zápis od pravoúhlého pole liší. Analogicky bychom mohli opět zápis zkrátit na jediný řádek, ale v tomto případě stojí za úvahu, jestli by to už nebylo na úkor přehlednosti kódu.

Proměnná délka pole

Délku pole nemusíme vždy udávat pevně, ale můžeme ji stanovit na základě získaných dat. Vybídneme kupříkladu uživatele, aby nám v souvislosti s vývojem programu zadal nějaké číslo. Toto číslo si uložíme do proměnné a při definici pole ji předáme jako počet prvků.

  1. Console.Write("Zadejte počet prvků pole: ");
  2. int pocet_prvku = Convert.ToInt32(Console.ReadLine());
  3. int[] moje_pole = new int[pocet_prvku];

Toho se v praxi využívá hodně, protože většinou celkoví počet prvků neznáme (např. průměr známek, celková cena produktů apod.).

Délka pole, continue

Pole má (díky tomu, že je potomkem třídy System.Array) svoje vlastnosti a metody. Důležitou vlastností pole je jeho délka - Length. U vícerozměrného pole potom počet sloupců a řádku získáváme pomocí metody GetLength(), přičemž jestli se jedná o řádek či sloupec stanovujeme argumentem funkce. Pokud jako argument uvedeme nulu, vrací počet řádků a pokud jedničky, počet sloupců.

Continue patří do kategorie tzv. jump statements. Pokud ji uvedeme někde v cyklu (většinou se používá zároveň s nějakou podmínkou, jinak by to nemělo moc smysl), právě prováděná iterace se v tomto bodě přeruší a pokračuje se na další. Toho využijeme v následujícím příkladu, kde máme zadanou matici a budeme chtít získat prvky na diagonále.

  1. int[,] matice = {{2,4,5,6},
  2.                 {9,6,8,12},
  3.                 {6,85,-1,-6},
  4.                 {0,63,4,96}};
  5.  
  6. for (int x = 0; x <= (matice.GetLength(0) - 1); x++)
  7.     for (int y = 0; y <= (matice.GetLength(1) - 1); y++)
  8.     {
  9.         if (x != y)
  10.             continue;
  11.        
  12.         Console.WriteLine(matice[x,y]);
  13.     }

V příkladu je použit vnořený cyklus. To je právě z toho důvodu, že procházíme přes dvourozměrné pole. Podmínky v cyklu jsou zadány obecně pro jakékoli rozměry matice, takže kdybychom přidali další sloupec a řádek v matici, funkčnost by byla zachována. Prvek leží na diagonále právě tehdy, když x je rovno y, takže pouze v takovém případě nás hodnota prvku zajímá. V každém dalším případě, kde x je různé od y prostě použijeme continue a pokračujeme dále.

Závěr

V dalším díle budeme pokračovat s poli. Podrobněji se podíváme na některé další metody, které lze na pole aplikovat, více se podíváme na foreach cyklus a pokusím se přidat více příkladů.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 3.5/16

1  2  3  4  5    
(známkování jako ve škole)